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

1""" 

2AgentOS v0.30 FastAPI REST服务 — 暴露Agent能力。 

3""" 

4 

5from fastapi import FastAPI 

6from fastapi.middleware.cors import CORSMiddleware 

7from pydantic import BaseModel 

8import uuid 

9 

10from agentos.core.loop import AgentLoop 

11 

12 

13class RunRequest(BaseModel): 

14 """Agent 运行请求体。""" 

15 

16 task: str 

17 session_id: str = "" 

18 stream: bool = False 

19 max_iterations: int = 100 

20 model: str = "auto" 

21 

22 

23class RunResponse(BaseModel): 

24 """Agent 运行响应体。""" 

25 

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 

34 

35 

36class AgentAPI: 

37 """AgentOS REST API 服务。""" 

38 

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() 

44 

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 ) 

53 

54 def _setup_routes(self): 

55 @self.app.get("/health") 

56 async def health(): 

57 return {"status": "ok", "version": "0.30.0"} 

58 

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 ) 

73 

74 @self.app.post("/cancel/{session_id}") 

75 async def cancel(session_id: str): 

76 self.loop.cancel() 

77 return {"cancelled": True} 

78 

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 } 

88 

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 } 

97 

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 } 

107 

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)