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