api_server.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. """
  2. API Server - FastAPI 应用入口
  3. 聚合所有模块的 API 路由(step_tree、未来的 memory 等)
  4. """
  5. import logging
  6. import json
  7. import os
  8. from fastapi import FastAPI, Request, WebSocket
  9. from fastapi.middleware.cors import CORSMiddleware
  10. import uvicorn
  11. from agent.trace import FileSystemTraceStore
  12. from agent.trace.api import router as api_router, set_trace_store as set_api_trace_store
  13. from agent.trace.websocket import router as ws_router, set_trace_store as set_ws_trace_store
  14. # ===== 日志配置 =====
  15. logging.basicConfig(
  16. level=logging.INFO,
  17. format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
  18. )
  19. logger = logging.getLogger(__name__)
  20. # ===== FastAPI 应用 =====
  21. app = FastAPI(
  22. title="Agent Step Tree API",
  23. description="Step 树可视化 API",
  24. version="1.0.0"
  25. )
  26. # CORS 配置(允许前端跨域访问)
  27. app.add_middleware(
  28. CORSMiddleware,
  29. allow_origins=["*"], # 生产环境应限制具体域名
  30. allow_credentials=True,
  31. allow_methods=["*"],
  32. allow_headers=["*"],
  33. )
  34. # ===== 初始化存储 =====
  35. # 使用文件系统存储(支持跨进程和持久化)
  36. trace_store = FileSystemTraceStore(base_path=".trace")
  37. # 注入到 step_tree 模块
  38. set_api_trace_store(trace_store)
  39. set_ws_trace_store(trace_store)
  40. # ===== 注册路由 =====
  41. # Step 树 RESTful API
  42. app.include_router(api_router)
  43. # Step 树 WebSocket
  44. app.include_router(ws_router)
  45. @app.websocket("/ws_ping")
  46. async def ws_ping(websocket: WebSocket):
  47. await websocket.accept()
  48. await websocket.send_text("pong")
  49. await websocket.close()
  50. # ===== 健康检查 =====
  51. @app.get("/health")
  52. async def health_check():
  53. """健康检查"""
  54. return {
  55. "status": "ok",
  56. "service": "Agent Step Tree API",
  57. "version": "1.0.0"
  58. }
  59. # ===== 启动服务 =====
  60. if __name__ == "__main__":
  61. logger.info("Starting API server...")
  62. uvicorn.run(
  63. "api_server:app",
  64. host="0.0.0.0",
  65. port=8000,
  66. reload=True, # 开发模式
  67. log_level="info"
  68. )