๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ”„ ๋ฐธ๋ธŒ

๋ฐธ๋ธŒโ€‹

๋ฐธ๋ธŒ์™€ ์‚ฌ์šฉ์ž ๋ฐธ๋ธŒ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ API ํ‚ค๋‚˜ ๊ตฌ์„ฑ ์˜ต์…˜๊ณผ ๊ฐ™์€ ๋™์  ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” GUI ๋ฉ”๋‰ด์—์„œ ์ง€์ •๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž‘์„ฑ ๊ฐ€๋Šฅํ•œ ํ•„๋“œ ๋˜๋Š” bool ์Šค์œ„์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ํ•ญ์ƒ ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ๋งค์šฐ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐธ๋ธŒ์™€ ์‚ฌ์šฉ์ž ๋ฐธ๋ธŒ ํด๋ž˜์Šค๋Š” Pipe, Pipeline, Filter ๋˜๋Š” Tools ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์— ์ •์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐธ๋ธŒ๋Š” ๊ด€๋ฆฌ์ž๋งŒ Tools ๋˜๋Š” Functions ๋ฉ”๋‰ด๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์‚ฌ์šฉ์ž ๋ฐธ๋ธŒ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ฑ„ํŒ… ์„ธ์…˜์—์„œ ์ง์ ‘ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฐ ์˜ˆ์ œ

from pydantic import BaseModel, Field
from typing import Literal

# ๋ฐธ๋ธŒ์™€ ์ •์˜
class Filter:
# ํ˜„์žฌ ๋“ค์—ฌ์“ฐ๊ธฐ์— ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค: ๋ฐธ๋ธŒ์™€ ์‚ฌ์šฉ์ž ๋ฐธ๋ธŒ๋Š” ๋ฐ˜๋“œ์‹œ Tools, Filter ๋˜๋Š” Pipe ํด๋ž˜์Šค์˜
# ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Filter์˜ ์˜ˆ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
class Valves(BaseModel):
# ๋ฐธ๋ธŒ์™€ ์‚ฌ์šฉ์ž ๋ฐธ๋ธŒ๋Š” pydantic์˜ BaseModel์„ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋Š”
# ๋ชจ๋ธ ๊ฒ€์ฆ์ž์™€ ๊ฐ™์ด ๋ณต์žกํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
test_valve: int = Field( # ํ˜•์‹ ํžŒํŠธ์— ์ฃผ์˜ํ•˜์„ธ์š”: ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” UI ์š”์†Œ์˜ ์ข…๋ฅ˜๋ฅผ
# ์„ ํƒํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (๋ฒ„ํŠผ, ํ…์ŠคํŠธ ๋“ฑ).
default=4,
description="์ˆซ์ž ๊ฐ’์„ ์กฐ์ ˆํ•˜๋Š” ๋ฐธ๋ธŒ"
# required=False, # ํ•„๋“œ๋ฅผ ๊ฐ•์ œํ•  ๊ฒฝ์šฐ True๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
)
# ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒฝ์šฐ, typing์˜ Literal์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
choice_option: Literal["choiceA", "choiceB"] = Field(
default="choiceA",
description="๋‹ค์ค‘ ์„ ํƒ ๋ฐธ๋ธŒ์˜ ์˜ˆ",
)
priority: int = Field(
default=0,
description="ํ•„ํ„ฐ ์ž‘์—…์˜ ์šฐ์„  ์ˆœ์œ„ ์ˆ˜์ค€. ๋‚ฎ์€ ๊ฐ’์ด ๋จผ์ € ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค."
)
# priority ํ•„๋“œ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ, ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ•„ํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
pass
# 'pass'๋Š” ํŒŒ์‹ฑ์„ ๋•๊ณ  ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

# ์‚ฌ์šฉ์ž ๋ฐธ๋ธŒ๋Š” ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
class UserValves(BaseModel):
test_user_valve: bool = Field(
default=False, description="True/False (์ผœ์ง/๊บผ์ง) ์Šค์œ„์น˜๋ฅผ ์กฐ์ ˆํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ฐธ๋ธŒ"
)
pass

def __init__(self):
self.valves = self.Valves()
# ๊ด€๋ฆฌ์ž๊ฐ€ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์‹คํ–‰ ์‹œ ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
pass

# inlet ๋ฉ”์„œ๋“œ๋Š” ํ•„ํ„ฐ์—๋งŒ ์‚ฌ์šฉ๋˜์ง€๋งŒ __user__ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
def inlet(self, body: dict, __user__: dict):
# ์‚ฌ์šฉ์ž ๋ฐธ๋ธŒ๋Š” ์‚ฌ์šฉ์ž๋ณ„๋กœ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ์‹œ์—๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
# __user__๋Š” dict์ด์ง€๋งŒ, __user__["valves"]๋Š” UserValves ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
# ๋”ฐ๋ผ์„œ ๊ฐ’์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
test_user_valve = __user__["valves"].test_user_valve
# ๋˜๋Š”:
test_user_valve = dict(__user__["valves"])["test_user_valve"]
# ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์‹ค์ œ ๊ฐ’ ๋Œ€์‹  ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:
# test_user_valve = __user__["valves"]["test_user_valve"] # ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค!