| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- """
- HelloClaw Backend - FastAPI 入口
- """
- import os
- # 禁用 PYTHONSTARTUP 以避免 I/O 问题
- os.environ.pop("PYTHONSTARTUP", None)
- from contextlib import asynccontextmanager
- from dotenv import load_dotenv
- from fastapi import FastAPI
- from fastapi.middleware.cors import CORSMiddleware
- from .api import chat, session, config, memory
- from .workspace.manager import WorkspaceManager
- from .agent.helloclaw_agent import HelloClawAgent
- # 加载环境变量
- load_dotenv()
- # 全局 Agent 实例
- _agent: HelloClawAgent = None
- def get_agent() -> HelloClawAgent:
- """获取全局 Agent 实例"""
- global _agent
- return _agent
- @asynccontextmanager
- async def lifespan(app: FastAPI):
- """应用生命周期管理"""
- global _agent
- # 启动时初始化
- print("HelloClaw Backend starting...")
- # 初始化工作空间
- workspace_path = os.getenv("WORKSPACE_PATH", "~/.helloclaw/workspace")
- workspace = WorkspaceManager(workspace_path)
- workspace.ensure_workspace_exists()
- print(f"Workspace initialized at: {workspace.workspace_path}")
- # 设置全局 workspace 实例
- config.set_workspace(workspace)
- memory.set_workspace(workspace)
- # 初始化全局 Agent 实例
- _agent = HelloClawAgent(workspace_path=workspace_path)
- print("HelloClawAgent initialized")
- yield
- # 关闭时清理
- print("HelloClaw Backend shutting down...")
- app = FastAPI(
- title="HelloClaw API",
- description="AI Agent powered by HelloAgents",
- version="0.1.0",
- lifespan=lifespan,
- )
- # CORS 配置
- app.add_middleware(
- CORSMiddleware,
- allow_origins=os.getenv("CORS_ORIGINS", "http://localhost:5173").split(","),
- allow_credentials=True,
- allow_methods=["*"],
- allow_headers=["*"],
- )
- # 健康检查
- @app.get("/health")
- async def health_check():
- return {"status": "ok", "service": "helloclaw-backend"}
- # 注册 API 路由
- app.include_router(chat.router, prefix="/api")
- app.include_router(session.router, prefix="/api")
- app.include_router(config.router, prefix="/api")
- app.include_router(memory.router, prefix="/api")
- @app.get("/api")
- async def api_root():
- return {"message": "HelloClaw API v0.1.0"}
- if __name__ == "__main__":
- import uvicorn
- uvicorn.run(
- "src.main:app",
- host="0.0.0.0",
- port=int(os.getenv("PORT", 8000)),
- reload=True,
- )
|