一、核心交互鏈路架構
二、詳細流程分解
- 前端交互層
React組件通過React Query發起API請求:
// OpenHands/frontend/src/components/ChatInput.tsx
const { trigger } = useSWRMutation('/api/chat', sendMessage);async function sendMessage(url: string, { arg }: { arg: string }) {return axios.post(url, {session_id: sessionId,message: arg});
}
- API路由層
FastAPI處理請求并創建會話:
# OpenHands/openhands/server/routes/chat.py
@app.post("/chat")
async def chat_endpoint(request: ChatRequest):session = AgentSessionManager.get_session(request.session_id)await session.start()await session.process_event(MessageAction(content=request.message))return EventStreamResponse(session.event_stream)
- Agent控制層
AgentController主循環處理事件:
# OpenHands/openhands/controller/agent_controller.py
async def _execute_step(self):messages = self.conversation_memory.process_events(...)llm_response = await self.llm.acompletion(messages)actions = self.agent.response_to_actions(llm_response)for action in actions:await self._handle_action(action)
- LLM交互層
通過LiteLLM集成多模型:
# OpenHands/openhands/llm/llm.pyasync def acompletion(self, messages: list[Message]) -> ModelResponse:return await litellm.acompletion(model=self.config.model_name,messages=convert_to_oa_messages(messages),tools=self.tool_schema)
- 工具執行層
文件編輯工具示例:
# OpenHands/openhands/tools/file_edit.py
class FileEditTool(BaseTool):async def execute(self, params: dict) -> FileEditObservation:with open(params['filepath'], 'w') as f:f.write(params['content'])return FileEditObservation(content=f"Updated {params['filepath']}")
三、典型交互示例
-
用戶請求
前端發送:POST /chat {"message": "修改README.md第5行"}
-
鏈路處理
- 結果反饋
前端接收SSE事件:
{"type": "observation","data": {"content": "Successfully updated README.md","type": "file_edit"}
}
四、關鍵技術特性
- 實時事件流:通過Server-Sent Events實現低延遲更新
- 上下文管理:ConversationMemory維護500輪對話上下文
- 錯誤恢復:_react_to_exception方法實現異常自動處理
- 多模型支持:LLM配置支持30+商業/開源模型接入
五、參考
- OpenHands document
- OpenHands on Github