api_server.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. """
  2. API Server - FastAPI 应用入口
  3. 聚合所有模块的 API 路由:
  4. - GET /api/traces — 查询(trace/api.py)
  5. - POST /api/traces — 执行控制(trace/run_api.py,需配置 Runner)
  6. - WS /api/traces/{id}/watch — 实时推送(trace/websocket.py)
  7. - GET /api/experiences — 经验查询(trace/run_api.py,需配置 Runner)
  8. """
  9. import logging
  10. import json
  11. import os
  12. from fastapi import FastAPI, Request, WebSocket
  13. from fastapi.middleware.cors import CORSMiddleware
  14. import uvicorn
  15. from agent.trace import FileSystemTraceStore
  16. from agent.trace.api import router as api_router, set_trace_store as set_api_trace_store
  17. from agent.trace.run_api import router as run_router, experiences_router, set_runner
  18. from agent.trace.websocket import router as ws_router, set_trace_store as set_ws_trace_store
  19. # ===== 日志配置 =====
  20. logging.basicConfig(
  21. level=logging.INFO,
  22. format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
  23. )
  24. logger = logging.getLogger(__name__)
  25. # ===== FastAPI 应用 =====
  26. app = FastAPI(
  27. title="Agent API",
  28. description="Agent 查询 + 执行 API",
  29. version="1.0.0"
  30. )
  31. # CORS 配置(允许前端跨域访问)
  32. app.add_middleware(
  33. CORSMiddleware,
  34. allow_origins=["*"], # 生产环境应限制具体域名
  35. allow_credentials=True,
  36. allow_methods=["*"],
  37. allow_headers=["*"],
  38. )
  39. # ===== 初始化存储 =====
  40. # 使用文件系统存储(支持跨进程和持久化)
  41. trace_store = FileSystemTraceStore(base_path=".trace")
  42. # 注入到 step_tree 模块
  43. set_api_trace_store(trace_store)
  44. set_ws_trace_store(trace_store)
  45. # ===== 可选:配置 Runner(启用执行 API)=====
  46. # 如需启用 POST /api/traces(新建/运行/停止/反思),取消以下注释并配置 LLM:
  47. from agent.core.runner import AgentRunner
  48. from agent.llm import create_openrouter_llm_call
  49. runner = AgentRunner(
  50. trace_store=trace_store,
  51. llm_call=create_openrouter_llm_call(model="anthropic/claude-sonnet-4.5"),
  52. experiences_path="./.cache/experiences.md", # 经验文件路径
  53. )
  54. set_runner(runner)
  55. # ===== 注册路由 =====
  56. # Trace 执行 API(POST + GET /running,需配置 Runner)
  57. # 注意:run_router 必须在 api_router 之前注册,否则 GET /running 会被 /{trace_id} 捕获
  58. app.include_router(run_router)
  59. # 经验 API(GET /api/experiences,需配置 Runner)
  60. app.include_router(experiences_router)
  61. # Trace 查询 API(GET)
  62. app.include_router(api_router)
  63. # Trace WebSocket(实时推送)
  64. app.include_router(ws_router)
  65. @app.websocket("/ws_ping")
  66. async def ws_ping(websocket: WebSocket):
  67. await websocket.accept()
  68. await websocket.send_text("pong")
  69. await websocket.close()
  70. # ===== 健康检查 =====
  71. @app.get("/health")
  72. async def health_check():
  73. """健康检查"""
  74. return {
  75. "status": "ok",
  76. "service": "Agent Step Tree API",
  77. "version": "1.0.0"
  78. }
  79. # ===== 启动服务 =====
  80. if __name__ == "__main__":
  81. logger.info("Starting API server...")
  82. uvicorn.run(
  83. "api_server:app",
  84. host="0.0.0.0",
  85. port=8000,
  86. reload=True, # 开发模式
  87. log_level="info"
  88. )