Flask κΈ°λ°μ λ°±μλ API μλ²μ λλ€. PostgreSQL λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ©°, SQLAlchemyλ₯Ό ORMμΌλ‘ μ¬μ©ν©λλ€.
- μ¬μ©μ κ΄λ¦¬ (User CRUD)
- μΈμ κ΄λ¦¬ (Session CRUD)
- λ©μμ§ κ΄λ¦¬ (Message CRUD)
- MCP μλ² κ΄λ¦¬ (MCPServer CRUD)
- MCP μλ² νμ±ν κ΄λ¦¬ (ActiveMCPServer CRUD)
- μΌμ κ΄λ¦¬ (Schedule CRUD)
- 리ν¬νΈ κ΄λ¦¬ (Report CRUD)
- μΈμ¬μ΄νΈ μν°ν΄ κ΄λ¦¬ (InsightArticle CRUD)
- μλ μμ κ΄λ¦¬ (AutoTask CRUD)
- λΈλ¦¬ν κ΄λ¦¬ (Briefing CRUD)
- PostgreSQLμ μ¬μ©νμ¬ λ°μ΄ν° μ μ₯ λ° κ΄λ¦¬
- SQLAlchemyλ₯Ό ORMμΌλ‘ νμ©νμ¬ λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈ μ μ λ° μΏΌλ¦¬ μ²λ¦¬
- Alembicμ μ¬μ©ν λ°μ΄ν°λ² μ΄μ€ λ§μ΄κ·Έλ μ΄μ κ΄λ¦¬
- Flaskλ₯Ό κΈ°λ°μΌλ‘ API μλ² κ΅¬ν
- Pydanticμ μ¬μ©νμ¬ λ°μ΄ν° κ²μ¦ λ° μ€ν€λ§ μ μ
- LangGraphλ₯Ό νμ©ν AI/λꡬ νΈμΆ μν¬νλ‘μ° κ΄λ¦¬
- OpenAI API μ°λμ ν΅ν AI κΈ°λ₯ μ 곡
μμ±ν AI λͺ¨λΈμ΄ μΈλΆ μμ€ν κ³Ό μ°λνκ±°λ νΉμ 컨ν μ€νΈ(λ§₯λ½)λ₯Ό μ΄ν΄νκ³ νμ©ν μ μλλ‘ λλ Anthropicμμ λ°νν νλ‘ν μ½λ‘ μ£Όμ κΈ°λ₯μ λ€μκ³Ό κ°μ΅λλ€:
- λꡬ κ΄λ¦¬:
- μ£Όμ λꡬ:
search_web: μΉ κ²μμ μνgoogle_news: λ΄μ€ κ²μ λ° νν°λ§google_search_expansion: κ²μ ν€μλ νμ₯
- λꡬ νΈμΆμ
call_toolλ°run_toolλ Έλλ₯Ό ν΅ν΄ μ²λ¦¬λ©λλ€.
- μ£Όμ λꡬ:
LangGraphλ AI κΈ°λ°μ λꡬ νΈμΆ λ° μν¬νλ‘μ° κ΄λ¦¬λ₯Ό μν ν΅μ¬ λͺ¨λμ λλ€. μ£Όμ κΈ°λ₯κ³Ό ꡬνμ λ€μκ³Ό κ°μ΅λλ€:
-
μμ΄μ νΈ μν€ν μ²
AgentState: μμ΄μ νΈμ μν κ΄λ¦¬- λ¨κΈ° κΈ°μ΅: λ©μμ§ νμ€ν 리 κ΄λ¦¬
- μ₯κΈ° κΈ°μ΅: μ¬μ©μλ³ μ€μ μ 보 μ μ₯
- λꡬ μν: νμ¬ μ€ν μ€μΈ λꡬ μ 보 μΆμ
AgentExecutor: μμ΄μ νΈ μ€ν κ΄λ¦¬- λΉλκΈ° μ€ν μ§μ
- μ€λ₯ μ²λ¦¬ λ° λ³΅κ΅¬
- MCP λꡬ ν΅ν©
-
λ Έλ ꡬ쑰
ModelNode: LLM νΈμΆ λ° μλ΅ μμ±- 컨ν μ€νΈ κ΄λ¦¬
- λꡬ νΈμΆ κ²°μ
- μλ΅ ν¬λ§·ν
ToolNode: λꡬ μ€ν- λκΈ°/λΉλκΈ° λꡬ μ§μ
- κ²°κ³Ό κ²μ¦
- μ€λ₯ μ²λ¦¬
SummarizeNode: λν μμ½- μ£ΌκΈ°μ μμ½ μμ±
- 컨ν μ€νΈ μμΆ
CleanupNode: νμ²λ¦¬- λ©λͺ¨λ¦¬ μ 리
- μν μ΅μ ν
-
κ·Έλν ꡬ쑰
- μ‘°κ±΄λΆ λΆκΈ° μ²λ¦¬:
workflow.add_conditional_edges( "agent", state_conditional, { "tool": "tool", "cleanup": "cleanup", } )
- μν λ° λ°λ³΅ μ²λ¦¬:
- λꡬ νΈμΆ β κ²°κ³Ό νκ° β λ€μ λ¨κ³ κ²°μ
- μ’ λ£ μ‘°κ±΄ κ΄λ¦¬
- μ‘°κ±΄λΆ λΆκΈ° μ²λ¦¬:
-
νμ± μμ΄μ νΈ
- μμ°μ΄ μ λ ₯ λΆμ
- μ 보 μΆμΆ λ° κ²μ¦
- νμμ LLM νΈλμ€ν
- μ΅λ 5ν μ¬μλ λ‘μ§
-
λ°±κ·ΈλΌμ΄λ μ²λ¦¬
- μμ
λ¨κ³λ³ μ€ν:
- μμ ν κ΄λ¦¬
- κ³ν μ΄κΈ°ν
- λ¨κ³ μ€ν
- κ²°κ³Ό νκ°
- μμ μλ£ μ²λ¦¬
- μ€ν¨/μ¬μλ μ²λ¦¬
- κ²°κ³Ό λ°μ΄ν°λ² μ΄μ€ μ μ₯
- μμ
λ¨κ³λ³ μ€ν:
seobi-backend/
β
βββ app/
β βββ __init__.py
β βββ dao/ # λ°μ΄ν° μ κ·Ό κ°μ²΄(DAO) λͺ¨μ
β β βββ auto_task_dao.py
β β βββ briefing_dao.py
β β βββ insight_article_dao.py
β β βββ interest_dao.py
β β βββ message_dao.py
β β βββ report_dao.py
β β βββ schedule_dao.py
β β βββ session_dao.py
β β βββ user_dao.py
β βββ langgraph/ # LangGraph μ°λ λ° λꡬ κ΄λ ¨ μ½λ
β β βββ agent/
β β βββ background/
β β βββ cleanup/
β β βββ general_agent/
β β βββ insight/
β β βββ parsing_agent/
β β βββ tools/
β βββ models/ # λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈ μ μ
β β βββ __init__.py
β β βββ auto_task.py
β β βββ auto_task_step.py
β β βββ briefing.py
β β βββ db.py
β β βββ insight_article.py
β β βββ interest.py
β β βββ message.py
β β βββ mcp_server.py
β β βββ mcp_server_activation.py
β β βββ report.py
β β βββ schedule.py
β β βββ session.py
β β βββ user.py
β βββ routes/ # API μλν¬μΈνΈ
β β βββ __init__.py
β β βββ auth.py
β β βββ auto_task.py
β β βββ briefing.py
β β βββ insight.py
β β βββ message.py
β β βββ mcp_server.py # MCP μλ² κ΄λ ¨ μλν¬μΈνΈ
β β βββ mcp_server_activation.py # MCP μλ² νμ±ν μλν¬μΈνΈ
β β βββ report.py
β β βββ schedule.py
β β βββ session.py
β βββ schemas/ # Pydantic λ± μ€ν€λ§ μ μ
β β βββ auto_task_schema.py
β β βββ background_schema.py
β β βββ briefing_schema.py
β β βββ insight_schema.py
β β βββ message_schema.py
β β βββ session_schema.py
β β βββ user_schema.py
β βββ services/ # λΉμ¦λμ€ λ‘μ§
β β βββ auto_task_service.py
β β βββ background_service.py
β β βββ briefing_service.py
β β βββ cleanup_service.py
β β βββ insight_article_service.py
β β βββ interest_service.py
β β βββ message_service.py
β β βββ schedule_service.py
β β βββ session_service.py
β β βββ user_service.py
β βββ utils/ # μ νΈλ¦¬ν° ν¨μ λ° μΈλΆ μ°λ
β βββ agent_state_store.py
β βββ app_config.py
β βββ auth_middleware.py
β βββ auto_task_utils.py
β βββ json_utils.py
β βββ map.py
β βββ openai_client.py
β βββ summarize_output.py
β βββ text_cleaner.py
β βββ time.py
β βββ time_utils.py
β
βββ certs/ # μΈμ¦μ λ± λ³΄μ κ΄λ ¨ νμΌ
β βββ certificate.pem
βββ logs/ # λ‘κ·Έ νμΌ
β βββ app.log
βββ migrations/ # Alembic λ§μ΄κ·Έλ μ΄μ
β βββ alembic.ini
β βββ env.py
β βββ README
β βββ script.py.mako
β βββ versions/
βββ tests/ # ν
μ€νΈ μ½λ
β βββ conftest.py
β βββ db_setup.py
β βββ test_db_cleanup.py
β βββ test_db_setup.py
β βββ test_dao/
β βββ test_services/
βββ config.py # νκ²½ μ€μ
βββ main.py # μ ν리μΌμ΄μ
μ§μ
μ
βββ requirements.txt # μμ‘΄μ± λͺ©λ‘
βββ pyproject.toml # νλ‘μ νΈ λ©νλ°μ΄ν°
βββ uv.lock # uv ν¨ν€μ§ λ§€λμ lock νμΌ
- Python 3.12 μ€μΉ
- uv μ€μΉ
pip install uv
- νκ²½ λ³μ μ€μ
.envνμΌμ root directoryμ μμ± λ° μ€μ (μ€μ κ°μ νμμκ² νμΈ).certificate.pemνμΌμ root directoryμ μ μ₯(νμΌ μμ²μ νμμκ² λ¬Έμ)
# κ°μνκ²½ μμ±
uv venv
# κ°μνκ²½ νμ±ν
source .venv/bin/activateuv syncflask db history
flask db migrate -m "μ κ³ μΆμ λ©μΈμ§(μμ κ΄λ ¨ λ΄μ©)"
flask db upgradepython main.py- κ°λ°νλ©΄μ μΆκ°λ ν¨ν€μ§κ° μλ€λ©΄ μλ λͺ λ Ήμ΄λ‘ ν¨ν€μ§ μ 리 μ§ν νμ
uv export -o requirements.txtDEV_MODE=True
κ°λ°λͺ¨λ μ, JWT ν ν° νμ μμ. λ°°ν¬ μ, Falseλ‘ μμ νμ¬ JWT ν ν° κ²μ¦ μ΄νμ λ°±μλ API νΈμΆ κ°λ₯ν©λλ€.