Coverage for agentos/api/server_old_backup.py: 0%
54 statements
« prev ^ index » next coverage.py v7.14.3, created at 2026-07-06 10:59 +0800
« prev ^ index » next coverage.py v7.14.3, created at 2026-07-06 10:59 +0800
1"""
2AgentOS v0.30 FastAPI REST服务 — 暴露Agent能力。
3"""
5from fastapi import FastAPI
6from fastapi.middleware.cors import CORSMiddleware
7from pydantic import BaseModel
8import uuid
10from agentos.core.loop import AgentLoop
13class RunRequest(BaseModel):
14 """Agent 运行请求体。"""
16 task: str
17 session_id: str = ""
18 stream: bool = False
19 max_iterations: int = 100
20 model: str = "auto"
23class RunResponse(BaseModel):
24 """Agent 运行响应体。"""
26 session_id: str
27 output: str
28 iterations: int
29 cost_usd: float
30 tokens_used: dict
31 duration_ms: float
32 state: str
33 error: str | None = None
36class AgentAPI:
37 """AgentOS REST API 服务。"""
39 def __init__(self, loop: AgentLoop):
40 self.loop = loop
41 self.app = FastAPI(title="AgentOS v0.30", version="0.30.0")
42 self._setup_middleware()
43 self._setup_routes()
45 def _setup_middleware(self):
46 self.app.add_middleware(
47 CORSMiddleware,
48 allow_origins=["*"],
49 allow_credentials=True,
50 allow_methods=["*"],
51 allow_headers=["*"],
52 )
54 def _setup_routes(self):
55 @self.app.get("/health")
56 async def health():
57 return {"status": "ok", "version": "0.30.0"}
59 @self.app.post("/run", response_model=RunResponse)
60 async def run_task(req: RunRequest):
61 sid = req.session_id or str(uuid.uuid4())[:8]
62 result = await self.loop.run(task=req.task, session_id=sid)
63 return RunResponse(
64 session_id=sid,
65 output=result.output,
66 iterations=result.iterations,
67 cost_usd=result.cost_usd,
68 tokens_used=result.tokens_used,
69 duration_ms=result.duration_ms,
70 state=result.final_state.value,
71 error=result.error,
72 )
74 @self.app.post("/cancel/{session_id}")
75 async def cancel(session_id: str):
76 self.loop.cancel()
77 return {"cancelled": True}
79 @self.app.get("/sessions/{session_id}")
80 async def get_session(session_id: str):
81 ctx = self.loop.context_manager
82 return {
83 "session_id": session_id,
84 "task": ctx.current_task,
85 "step_count": ctx.step_count,
86 "messages": len(ctx._messages),
87 }
89 @self.app.get("/costs")
90 async def get_costs():
91 return {
92 "total_cost": self.loop.cost_tracker.total_cost,
93 "total_tokens": self.loop.cost_tracker.total_tokens,
94 "by_model": self.loop.cost_tracker.cost_by_model(),
95 "records_count": len(self.loop.cost_tracker.records),
96 }
98 @self.app.get("/tools")
99 async def list_tools():
100 return {
101 "count": len(self.loop.tool_registry._tools),
102 "tools": [
103 {"name": t.name, "description": t.description, "is_read": t.is_read, "category": t.category}
104 for t in self.loop.tool_registry._tools.values()
105 ],
106 }
108 def serve(self, host: str = "0.0.0.0", port: int = 8080):
109 import uvicorn
110 uvicorn.run(self.app, host=host, port=port)