File size: 4,361 Bytes
83efdfc 4488b44 83efdfc 4488b44 83efdfc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | import os
import json
# βββββββββββββββββββββββββββββββββββββββββββββ
# β‘ Tool Router
# βββββββββββββββββββββββββββββββββββββββββββββ
# λΆμ μ νλ³ νμ λꡬ λ§€ν
TOOLS_BY_ANALYSIS = {
"swot": ["fundamentals", "news", "price", "web_search"],
"technical": ["price", "technicals"],
"fundamental": ["fundamentals", "price"],
"news_summary": ["news", "web_search"],
"screener": ["fundamentals"],
"comparison": ["fundamentals", "price"],
"watchlist": ["price", "technicals"],
"earnings": ["earnings", "fundamentals", "news", "web_search"],
"general": ["fundamentals", "price", "news", "web_search"],
}
def route_tools(intent):
# λΆμ μ νμ λ°λΌ λ°μ΄ν° μμ§ λꡬ λͺ©λ‘ κ²°μ
analysis_type = intent.get("analysis_type", "general")
selected = TOOLS_BY_ANALYSIS.get(
analysis_type,
["fundamentals", "price", "news", "web_search"]
)
print(f"[β‘] Tool Router β μ νλ λꡬ: {selected}")
return selected
def parse_intent(client, user_query):
LLM_MODEL_NAME = os.environ.get('LLM_MODEL_NAME')
INTENT_TOOL = {
"type": "function",
"function": {
"name": "parse_investment_intent",
"description": "μ¬μ©μμ ν¬μ κ΄λ ¨ μ§μμμ μΈν
νΈμ μν°ν°λ₯Ό μΆμΆν©λλ€.",
"parameters": {
"type": "object",
"properties": {
"ticker": {"type": "string", "description": "μ£Όμ ν°μ»€ μ¬λ³Ό (μ: AAPL, TSLA, 005930.KS). μμΌλ©΄ null."},
"analysis_type": {"type": "string", "enum": ["swot", "technical", "fundamental", "news_summary", "screener", "comparison", "watchlist", "earnings", "general"], "description": "μμ²λ λΆμ μ ν. μ€μ /μ΄λμ€/λΆκΈ°μ€μ /μ°κ°μ€μ /λ§€μΆ/μμ
μ΄μ΅ κ΄λ ¨ μ§μλ λ°λμ 'earnings'λ‘ λΆλ₯."},
"time_range": {"type": "string", "enum": ["1d", "5d", "1mo", "3mo", "6mo", "1y", "2y", "5y"], "description": "λΆμ κΈ°κ°. κΈ°λ³Έκ°: 1y"},
"language": {"type": "string", "description": "μλ΅ μΈμ΄ (ko, en, ja λ±)"},
"extra_tickers": {"type": "array", "items": {"type": "string"}, "description": "λΉκ΅ λΆμ μ μΆκ° ν°μ»€ λͺ©λ‘"},
"target_year": {"type": "integer", "description": "μ€μ μ‘°ν λμ μ°λ (μ: 2025). '25λ
' β 2025 λ³ν."},
"target_quarter": {"type": "integer", "enum": [1, 2, 3, 4], "description": "μ€μ μ‘°ν λμ λΆκΈ° (1~4). μ°κ° μ€μ μμ²μ΄λ©΄ null."}
},
"required": ["analysis_type"]
}
}
}
response = client.chat.completions.create(
model=LLM_MODEL_NAME,
messages=[
{
"role": "system",
"content": (
"λΉμ μ ν¬μ λΆμ μμ€ν
μ μΈν
νΈ νμμ
λλ€. "
"μ¬μ©μμ μ§μμμ λΆμμ νμν μ 보λ₯Ό μ νν μΆμΆνμΈμ. "
"νκ΅ μ£Όμμ '.KS'(μ½μ€νΌ) λλ '.KQ'(μ½μ€λ₯) μ λ―Έμ¬λ₯Ό λΆμ΄μΈμ. "
"μΌμ±μ μ β 005930.KS, SKνμ΄λμ€ β 000660.KS, LGμλμ§μ루μ
β 373220.KS, "
"νλμ°¨ β 005380.KS, μΉ΄μΉ΄μ€ β 035720.KS, λ€μ΄λ² β 035420.KS. "
"μ€μ /μ΄λμ€/λΆκΈ°μ€μ /μ°κ°μ€μ /λ§€μΆ/μμ
μ΄μ΅/EPS κ΄λ ¨ μ§μλ "
"'earnings'λ‘ λΆλ₯νκ³ μΈκΈλ μ°λΒ·λΆκΈ°λ₯Ό μ±μ°μΈμ."
)
},
{"role": "user", "content": user_query}
],
tools=[INTENT_TOOL],
tool_choice={"type": "function", "function": {"name": "parse_investment_intent"}}
)
args = json.loads(
response.choices[0].message.tool_calls[0].function.arguments
)
args.setdefault("time_range", "1y")
args.setdefault("language", "ko")
args.setdefault("extra_tickers", [])
args.setdefault("target_year", None)
args.setdefault("target_quarter", None)
return args
|