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

1""" 

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

3""" 

4 

5import uuid 

6 

7from fastapi import FastAPI 

8from fastapi.middleware.cors import CORSMiddleware 

9from pydantic import BaseModel 

10 

11from agentos.core.loop import AgentLoop 

12 

13 

14class RunRequest(BaseModel): 

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

16 

17 task: str 

18 session_id: str = "" 

19 stream: bool = False 

20 max_iterations: int = 100 

21 model: str = "auto" 

22 

23 

24class RunResponse(BaseModel): 

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

26 

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 

35 

36 

37class AgentAPI: 

38 """AgentOS REST API 服务。""" 

39 

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

45 

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 ) 

54 

55 def _setup_routes(self): 

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

57 async def health(): 

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

59 

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 ) 

74 

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

76 async def cancel(session_id: str): 

77 self.loop.cancel() 

78 return {"cancelled": True} 

79 

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 } 

89 

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 } 

98 

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 } 

113 

114 def serve(self, host: str = "0.0.0.0", port: int = 8080): 

115 import uvicorn 

116 

117 uvicorn.run(self.app, host=host, port=port)