-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
145 lines (121 loc) Β· 5.85 KB
/
main.py
File metadata and controls
145 lines (121 loc) Β· 5.85 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
from dotenv import load_dotenv
from dependency_injector.wiring import Provide, inject
import uvicorn
# from apscheduler.schedulers.background import BackgroundScheduler
from api.server import APIBuilder
# from src.graph.nodes.us_financial_fmg import StockInfoNode
from src.graph.nodes import (
NaverNewsSearcherNode,
ReportAssistantNode,
ChosunRSSFeederNode,
RetrieveESGNode,
# WeeklyReporterNode,
WSJEconomyRSSFeederNode,
WSJMarketRSSFeederNode,
USFinancialAnalyzerNode,
# GoogleSearchAPINode, # μμ λ¨ - google_searcherλ‘ λ체
GoogleSearcherNode,
CompanyFactsAnalyzerNode,
# StockInfoNode,
)
from src.utils.logger import setup_logger
from src.graph.builder import SupervisorGraphBuilder
# from src.tasks.weekly_recap_scraper import scrape_jp_weekly_recap
from startup import Container
from rich.console import Console
# import os
console = Console()
load_dotenv(override=True)
logger = setup_logger("market_agent")
logo = """
[cyan]
==============================================================================================
βββββββ ββ βββ ββ βββββ ββββββ βββββββ βββ ββ ββββββββ ββ βββββ ββββββ
ββ ββ ββββ ββ ββ ββ ββ ββ ββββ ββ ββ ββ ββ ββ ββ ββ
βββββ ββ ββ ββ ββ βββββββ ββ βββ βββββ ββ ββ ββ ββ βββββ ββ βββββββ ββββββ
ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ
ββ ββ ββ ββββ ββ ββ ββββββ βββββββ ββ ββββ ββ βββββββ ββ ββ ββββββ
----------------------------------------------------------------------------------------------
__ __ _ _ _ _
| \/ |__ _ _ _| |_____| |_ __ _ _ _ __ _| |_ _ __(_)___
| |\/| / _` | '_| / / -_) _| / _` | ' \/ _` | | || (_-< (_-<
|_| |_\__,_|_| |_\_\___|\__| \__,_|_||_\__,_|_|\_, /__/_/__/
|__/
----------------------------------------------------------------------------------------------
# MEMBER(κ°λλ€ μ)
- μ λ³ν (νμ₯)
- κ°λμ
- λ°±μΈκ±Έ
- μμ°½μ© https://github.com/e7217
- μμμ°
- μ₯νμ
----------------------------------------------------------------------------------------------
Since 2025.03.04, Let's study together!
==============================================================================================
"""
@inject
def main(
graph_builder: SupervisorGraphBuilder = Provide[Container.supervisor_graph],
):
console.print(logo)
logger.info("Starting Market Analysis Agent service...")
## κ·Έλν λΉλ
"""
μμ΄μ νΈ λ
Έλλ₯Ό μ΄κ³³μ μΆκ°ν΄μ£ΌμΈμ.
λ
Έλ μΆκ° μ, λ€μμ κΈ°λ₯μ λμ μΌλ‘ μ μ©νκ²λ©λλ€.
- supervisor λ
Έλμ λ©€λ²λ‘ λ±λ‘
- λ
Έλ μ΄λ¦μ κΈ°λ°μΌλ‘ API μλν¬μΈνΈ μμ±(μ: SampleNode -> /api/sample)
Example:
graph_builder.add_node(NewNode())
"""
graph_builder.add_node(NaverNewsSearcherNode())
graph_builder.add_node(GoogleSearcherNode()) # κ²μ κΈ°λ° (μΉ μ€ν¬λν)
# graph_builder.add_node(GoogleSearchAPINode()) # μμ λ¨ - API κΈ°λ°, google_searcherλ‘ λ체
graph_builder.add_node(RetrieveESGNode())
graph_builder.add_node(ReportAssistantNode())
# graph_builder.add_node(WeeklyReporterNode())
graph_builder.add_node(ChosunRSSFeederNode())
graph_builder.add_node(WSJEconomyRSSFeederNode())
graph_builder.add_node(WSJMarketRSSFeederNode())
# graph_builder.add_node(StockInfoNode()) # TODO: μ’
ν© μ²λ¦¬ κΈ°λ₯ μ μ© μ μ£Όμ ν΄μ
graph_builder.add_node(CompanyFactsAnalyzerNode())
# νν¬ API λΆμ μμ΄μ νΈ λ
Έλ μ£Όμ μ²λ¦¬ (λ―Έκ΅ μ£Όμ λ
Έλλ‘ λ체)
# graph_builder.add_node(HantooFinancialAnalyzerNode())
# λ―Έκ΅ μ£Όμ λΆμ μμ΄μ νΈ λ
Έλ μΆκ° (Alpha Vantage API μ¬μ©)
graph_builder.add_node(USFinancialAnalyzerNode()) # TODO: μ’
ν© μ²λ¦¬ κΈ°λ₯ μ μ© μ μ£Όμ ν΄μ
# # μ£Όκ° λ¦¬ν¬νΈ μ€ν¬λν μ€μΌμ₯΄λ¬
# if os.getenv("PRODUCTION", "false").lower() == "true":
# # μ£Όκ° λ¦¬μΊ‘ μ€ν¬λν λ
Έλ μΆκ°
# vector_store = Container.vector_store_recap()
# graph_builder.add_node(WeeklyReporterNode(vector_store))
# # μ£Όκ° λ¦¬μΊ‘ μ€ν¬λν μμ
μμ½
# scheduler = BackgroundScheduler(daemon=True)
# scheduler.add_job(
# scrape_jp_weekly_recap,
# "cron",
# hour="6,9,12,15,18",
# minute=0,
# args=[vector_store],
# )
# scheduler.start()
graph_builder.build()
## API μλ² λΉλ
api_builder = APIBuilder()
app = api_builder.create_app()
for node in graph_builder.get_nodes():
app.add_api_route(
f"/api/{node.__class__.__name__.lower().replace('node', '')}",
methods=["POST"],
endpoint=node.invoke,
)
uvicorn.run(app, host="0.0.0.0", port=8000)
if __name__ == "__main__":
container = Container()
container.wire(
modules=[
__name__,
"api.route",
# "src.tasks.weekly_recap_scraper"
]
)
main()