main.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. """
  2. HelloClaw Backend - FastAPI 入口
  3. """
  4. import os
  5. # 禁用 PYTHONSTARTUP 以避免 I/O 问题
  6. os.environ.pop("PYTHONSTARTUP", None)
  7. from contextlib import asynccontextmanager
  8. from dotenv import load_dotenv
  9. from fastapi import FastAPI
  10. from fastapi.middleware.cors import CORSMiddleware
  11. from .api import chat, session, config, memory
  12. from .workspace.manager import WorkspaceManager
  13. from .agent.helloclaw_agent import HelloClawAgent
  14. # 加载环境变量
  15. load_dotenv()
  16. # 全局 Agent 实例
  17. _agent: HelloClawAgent = None
  18. def get_agent() -> HelloClawAgent:
  19. """获取全局 Agent 实例"""
  20. global _agent
  21. return _agent
  22. @asynccontextmanager
  23. async def lifespan(app: FastAPI):
  24. """应用生命周期管理"""
  25. global _agent
  26. # 启动时初始化
  27. print("HelloClaw Backend starting...")
  28. # 初始化工作空间
  29. workspace_path = os.getenv("WORKSPACE_PATH", "~/.helloclaw/workspace")
  30. workspace = WorkspaceManager(workspace_path)
  31. workspace.ensure_workspace_exists()
  32. print(f"Workspace initialized at: {workspace.workspace_path}")
  33. # 设置全局 workspace 实例
  34. config.set_workspace(workspace)
  35. memory.set_workspace(workspace)
  36. # 初始化全局 Agent 实例
  37. _agent = HelloClawAgent(workspace_path=workspace_path)
  38. print("HelloClawAgent initialized")
  39. yield
  40. # 关闭时清理
  41. print("HelloClaw Backend shutting down...")
  42. app = FastAPI(
  43. title="HelloClaw API",
  44. description="AI Agent powered by HelloAgents",
  45. version="0.1.0",
  46. lifespan=lifespan,
  47. )
  48. # CORS 配置
  49. app.add_middleware(
  50. CORSMiddleware,
  51. allow_origins=os.getenv("CORS_ORIGINS", "http://localhost:5173").split(","),
  52. allow_credentials=True,
  53. allow_methods=["*"],
  54. allow_headers=["*"],
  55. )
  56. # 健康检查
  57. @app.get("/health")
  58. async def health_check():
  59. return {"status": "ok", "service": "helloclaw-backend"}
  60. # 注册 API 路由
  61. app.include_router(chat.router, prefix="/api")
  62. app.include_router(session.router, prefix="/api")
  63. app.include_router(config.router, prefix="/api")
  64. app.include_router(memory.router, prefix="/api")
  65. @app.get("/api")
  66. async def api_root():
  67. return {"message": "HelloClaw API v0.1.0"}
  68. if __name__ == "__main__":
  69. import uvicorn
  70. uvicorn.run(
  71. "src.main:app",
  72. host="0.0.0.0",
  73. port=int(os.getenv("PORT", 8000)),
  74. reload=True,
  75. )