FEATURED · 精选文章

Devika 架构深度解析:开源 Agentic 软件工程师的系统设计与实现

发布时间 / 2026/9/13 2:52:17
来源 / 创域科博编辑部
栏目 / 资讯中心
Devika 架构深度解析:开源 Agentic 软件工程师的系统设计与实现 Devika 架构深度解析开源 Agentic 软件工程师的系统设计与实现【免费下载链接】devikaDevika is the first open-source implementation of an Agentic Software Engineer. Initially started as an open-source alternative to Devin.项目地址: https://gitcode.com/GitHub_Trending/de/devika本篇文章以 ARCHITECTURE.md 为核心骨架结合 src/ 源码逐模块展开系统讲解 Devika —— 一个开源的 Agentic 软件工程师最初定位为 Devin 的开源替代方案—— 如何理解高层级人类指令、拆解步骤、检索信息并编写代码。读完本文你将掌握 Devika 的 Agent Core 编排循环、九大专业子 Agent 的职责划分、多 LLM 统一抽象层、浏览器交互闭环、项目与状态持久化机制以及 GitHub/Netlify 服务集成等完整架构脉络并知道每一层对应仓库中的哪些实现文件可直接据此阅读源码、二次开发或扩展自己的 Agent 系统。1. 系统概览八大核心组件从宏观视角看Devika 由以下关键组件协同构成组件职责仓库对应位置Agent Core编排整体的 AI 规划、推理与执行过程与各子 Agent 通信src/agents/agent.pyAgents处理规划、研究、编码、补丁、报告等具体任务的专职子 Agentsrc/agents/Language Models基于 Claude、GPT-4、GPT-3 等大语言模型实现自然语言理解与生成src/llm/Browser Interaction支持网页浏览、信息收集与网页元素交互src/browser/Project Management组织并持久化项目相关数据src/project.pyAgent State Management跨交互追踪并持久化 AI Agent 的动态状态src/state.pyServices集成 GitHub、Netlify 等外部服务以增强能力src/services/Utilities配置、日志、向量检索、PDF 生成等支撑模块src/config.py、src/logger.py 等下文将逐层深入每一层都给出实现级的代码证据。2. Agent Core中央规划与执行引擎Agent类src/agents/agent.py是整个系统的中央引擎。构造时它会一次性实例化所有子 Agent、ProjectManager、AgentState并通过tiktoken加载cl100k_base编码器用于 token 统计self.planner Planner(base_modelbase_model) self.researcher Researcher(base_modelbase_model) self.formatter Formatter(base_modelbase_model) self.coder Coder(base_modelbase_model) self.action Action(base_modelbase_model) self.internal_monologue InternalMonologue(base_modelbase_model) self.answer Answer(base_modelbase_model) self.runner Runner(base_modelbase_model) self.feature Feature(base_modelbase_model) self.patcher Patcher(base_modelbase_model) self.reporter Reporter(base_modelbase_model) self.decision Decision(base_modelbase_model)2.1execute首次任务的完整链路当用户给出一个高层级 prompt 时execute(prompt, project_name)被调用其执行链如下记录用户消息将 prompt 通过project_manager.add_message_from_user写入项目会话。创建 Agent 状态调用agent_state.create_state(projectproject_name)初始化状态栈。Planner 规划self.planner.execute(prompt, project_name)生成逐步计划随后parse_response解析出reply、focus、plans、summary四段结构化结果reply与plans会被追加为 Devika 的消息。上下文关键词累积update_contextual_keywords(focus)使用SentenceBert从焦点描述中抽取关键词存入self.collected_context_keywords供后续 Researcher 与 Coder 使用。内部独白self.internal_monologue.execute(...)模拟 Agent 的思考过程写入新的 agent state。Researcher 检索self.researcher.execute(plan, keywords, project_name)提取搜索 queries若 Researcher 需要用户补充上下文ask_user非空Agent 会挂起等待用户输入每 5 秒轮询一次get_latest_message_from_user直到收到用户回复。联网搜索search_queries(queries, project_name)根据配置的搜索引擎bing/google 等逐条执行搜索抓取首个结果链接用Browser打开页面并提取文本再交给 Formatter 清洗。Coder 编码将逐步计划、用户补充上下文与搜索结果一并交给self.coder.execute(...)生成代码后由self.coder.save_code_to_project(code, project_name)落盘。收尾标记 agent 为 inactive 与 completed并向用户发送完成消息。2.2subsequent_execute后续交互的分流当用户继续对话跟随指令时subsequent_execute(prompt, project_name)被调用。它首先获取完整会话上下文get_all_messages_formatted与当前项目代码的 Markdown 表示ReadCode(project_name).code_set_to_markdown()然后交给 Action agent 判定动作类型再按动作分流answer调用 Answer agent 直接回答run调用 Runner 在沙箱中执行代码传入os_system与project_pathdeploy调用Netlify().deploy(project_name)部署并返回部署 URLfeature调用 Feature agent 实现新功能并保存代码bug调用 Patcher agent 根据错误信息修复代码report调用 Reporter agent 生成 Markdown 报告并用PDF().markdown_to_pdf导出为 PDF通过http://127.0.0.1:1337/api/download-project-pdf?project_name...提供下载。2.3 Agent Core 的横切职责从源码可以看出Agent Core 还承担以下横切职责管理会话历史与项目级上下文更新 agent state 与内部独白如浏览器访问时写入Browsing the web right now...跨 Agent prompt 累积上下文关键词collected_context_keywords通过定时 agent state 更新模拟 AI 的思考过程通过 Decision agent 处理特殊命令git clone、浏览器交互会话、生成 PDF 文档、编码项目等见make_decision中function的四种分支。3. Agents九大专职子 AgentDevika 的认知能力由一组专职子 Agent 提供每个 Agent 是独立的 Python 类通过 Jinja2 格式的 prompt 模板与底层 LLM 通信。九大 Agent 及其职责如下Agent职责实现文件Planner根据用户 prompt 生成高层级逐步计划提取焦点并给出摘要使用 few-shot 提示提供期望的响应格式示例src/agents/planner/Researcher从计划中提取搜索查询按相关性与特异性排序过滤必要时向用户索取额外上下文目标是以最少搜索次数获取最大信息增益src/agents/researcher/Coder基于逐步计划与研究上下文生成代码将代码切分到合适的文件与目录包含注释与文档支持多种语言与框架src/agents/coder/Action根据用户的后续 prompt 判定动作将用户意图映射为具体动作关键词run/test/deploy/fix/implement/reportsrc/agents/action/Runner在沙箱环境中执行代码适配不同 OSMac/Linux/Windows实时流式输出命令结果优雅处理错误src/agents/runner/Feature按用户规格实现新功能在保持代码结构与风格的前提下修改现有文件并进行增量测试src/agents/feature/Patcher根据用户描述或错误信息调试与修复问题分析现有代码定位根因给出修复建议与改动说明src/agents/patcher/Reporter生成项目综合报告包含高层级概述、技术设计、安装说明、API 文档等输出带目录的整洁结构并导出为 PDFsrc/agents/reporter/Decision处理不适合其他 Agent 的命令式指令将命令映射到具体函数git clone、浏览器交互等并执行src/agents/decision/3.1 Agent 的通用执行模式从源码看每个 Agent 都遵循同一模式以 Planner 为最典型示例渲染 prompt用 Jinja2Environment(loaderBaseLoader())加载prompt.jinja2模板将当前上下文如prompt、conversation渲染成完整提示词查询 LLM调用self.llm.inference(prompt, project_name)获得响应校验并解析如 Planner 的parse_response按Project Name:、Your Reply to the Human Prompter:、Current Focus:、Plan:、Summary:等标记逐行解析Action 则使用validate_responses装饰器校验响应中必须同时包含response与action字段附加处理/副作用如 Coder 的save_code_to_project将代码写盘返回结果交回 Agent Core 做进一步动作。# src/agents/planner/planner.py —— 渲染与推理 def render(self, prompt: str) - str: env Environment(loaderBaseLoader()) template env.from_string(PROMPT) return template.render(promptprompt) def execute(self, prompt: str, project_name: str) - str: prompt self.render(prompt) response self.llm.inference(prompt, project_name) return response其中 Action agent 还额外使用了src/services/utils.py提供的retry_wrapper与validate_responses装饰器体现了对 LLM 输出不可靠性的工程化容错。3.2 无状态与幂等设计Agents 尽可能保持无状态与幂等状态和历史由 Agent Core 统一管理并按需传入这使得系统具备模块化、可组合的特性——每个 Agent 只关心输入 prompt → 输出结构化结果不持有跨调用状态。4. Language Models统一的 LLM 抽象层Devika 的自然语言能力由LLM类src/llm/llm.py统一驱动。它屏蔽了各厂商 API 的差异为 Agents 提供一致的交互接口支持三大能力列出可用模型、基于 prompt 生成补全、随时间累积追踪 token 用量。4.1 多厂商模型注册表LLM.__init__中内置了按厂商分组的模型注册表目前支持CLAUDEAnthropicClaude 3 Opus / Sonnet / HaikuOPENAIGPT-4o-mini、GPT-4o、GPT-4 Turbo、GPT-3.5 TurboGOOGLEGeminiGemini 1.0 Pro、Gemini 1.5 Flash、Gemini 1.5 ProMISTRALMistral 7b、Mixtral 8x7b、Mistral Medium/Small/LargeGROQLLAMA3 8B/70B、LLAMA2 70B、Mixtral、GEMMA 7BOLLAMA运行时动态探测若本机 Ollama 服务可用则自动填充已拉取的模型列表LM_STUDIO本地模型local-model。# src/llm/llm.py —— 模型枚举与路由 model_mapping { OLLAMA: ollama, CLAUDE: Claude(), OPENAI: OpenAi(), GOOGLE: Gemini(), MISTRAL: MistralAi(), GROQ: Groq(), LM_STUDIO: LMStudio() }每个厂商对应一个独立客户端实现src/llm/claude_client.py、src/llm/openai_client.py、src/llm/gemini_client.py、src/llm/mistral_client.py、src/llm/groq_client.py、src/llm/ollama_client.py、src/llm/lm_studio_client.py。4.2 推理与超时控制inference(prompt, project_name)的实现要点先通过update_global_token_usage统计 prompt 的 token 数tiktokencl100k_base编码并实时推送到前端emit_agent(tokens, ...)使用concurrent.futures.ThreadPoolExecutor在线程池中执行模型推理主循环每 0.5 秒上报一次耗时推理超过 5 秒时发出告警超过配置的timeout_inference时抛出超时并终止响应返回后同样累计 token 用量。这种带超时护栏 实时进度反馈的设计避免了大模型推理长时间挂起导致 Agent 循环卡死也是 UI 中推理耗时可视化的数据来源。4.3 模型选型建议选择模型需权衡质量、速度与成本追求高质量复杂任务可选 Claude 3 Opus / GPT-4o追求速度与低成本可用 Gemini 1.5 Flash、LLAMA3 8B 或自托管 Ollama 模型。模块化设计使得模型可以随时替换无需改动上层 Agent 逻辑。5. Browser Interaction网页交互闭环Devika 可以自动化地与网页交互来收集信息或执行操作由Browser与Crawler交互 Agent两类组件驱动。5.1 Browser基于 Playwright 的高层原语Browser类src/browser/browser.py基于 Playwright 提供高层 Web 自动化原语启动 Chromium 实例async_playwright().start()chromium.launch(headlessTrue)导航到 URLgo_to(url)带 20 秒超时保护超时返回False而不是抛异常查询 DOM 元素通过page.evaluate获取页面元数据URL、标题等提取页面内容支持文本extract_text、Markdownmarkdownify转换、PDFpage.pdf页面截图screenshot将整页截图保存到配置的 screenshots 目录同时把 URL 与截图路径写入新的 agent stateinternal_monologue置为Browsing the web right now...并向前端实时推送截图 base64 数据。5.2 Crawler 与start_interactionLLM 驱动的交互循环Crawler类定义了一个能根据自然语言指令与网页交互的 Agent它依赖三类要素预定义的浏览器动作scroll、click、type 等提供动作使用示例的 prompt 模板src/browser/interaction.pyLLM 根据当前页面内容与目标判定最优动作。start_interaction函数建立的循环为将当前页面内容与目标传给 LLMLLM 返回下一个最佳动作例如CLICK 12或TYPE 7 machine learningCrawler 在真实页面上执行该动作基于更新后的页面状态重复上述过程。由此可以完成一系列动作以达成更高层目标研究主题、填写表单、与应用交互等。在 Agent.make_decision 中browser_interaction分支即调用start_interaction(self.base_model, user_prompt, project_name)进入该循环。5.3 搜索引擎适配search_queries中通过self.engine选择搜索引擎实现src/browser/search.pybing使用BingSearch、google使用GoogleSearch其余默认DuckDuckGoSearch。每次搜索先取首个结果链接再用open_page打开并提取文本交由 Formatter 清洗。搜索引擎的接入配置可参考 docs/Installation/search_engine.md。6. Project Management项目与会话持久化ProjectManager类src/project.py负责创建、更新、查询项目及其元数据。核心能力创建/删除项目create_project/delete_project追加用户/Devika 消息add_message_from_user/add_message_from_devika两者都通过emit_agent(server-message, ...)实时推送到前端读取项目消息get_messages、获取最新用户/Devika 消息get_latest_message_from_user/get_latest_message_from_devika、校验最后一条消息是否来自用户validate_last_message_is_from_user供 Agent 挂起等待用户输入时使用列出所有项目get_project_list导出项目为 zipproject_to_zip读取项目文件内容get_project_files带路径穿越防护校验目录必须在data/projects基础路径之内。6.1 SQLite SQLModel 数据模型项目元数据通过 SQLModel 持久化在 SQLite 数据库中。Projects表结构如下class Projects(SQLModel, tableTrue): id: Optional[int] Field(defaultNone, primary_keyTrue) project: str message_stack_json: str # JSON 序列化的会话历史表仅存项目名 JSON 序列化的会话历史两个业务字段。每条消息的结构为{from_devika: bool, message: str, timestamp: YYYY-MM-DD HH:MM:SS}见new_message。这种设计让 Agent 可以同时处理多个项目并跨会话保留对话历史。数据库路径由Config().get_sqlite_db()提供项目目录由get_projects_dir()提供项目目录名由项目名小写化并把空格替换为-见get_project_path。7. Agent State Management动态状态追踪随着 Agent 执行任务系统需要向用户展示其内部状态。AgentState类src/state.py提供接口初始化新状态create_state首个状态internal_monologue为Im starting the work...step为 1向当前状态序列追加状态add_to_current_state更新项目最新状态update_latest_state查询最新状态或完整状态历史get_latest_state/get_current_state标记 agent 活跃/完成set_agent_active/set_agent_completed累计与查询 token 用量update_token_usage/get_latest_token_usage。7.1 状态的数据结构new_state定义了一个状态快照的完整字段{ internal_monologue: , # Agent 当前的内心想法 browser_session: {url: None, screenshot: None}, # 浏览器交互 terminal_session: {command: None, output: None, title: None}, # 终端交互 step: int(), # 当前步骤 message: None, completed: False, agent_is_active: True, token_usage: 0, timestamp: YYYY-MM-DD HH:MM:SS }7.2 持久化模型与项目一致agent state 也通过 SQLModel 持久化在 SQLite 中表名为agent_stateclass AgentStateModel(SQLModel, tableTrue): __tablename__ agent_state id: Optional[int] Field(defaultNone, primary_keyTrue) project: str state_stack_json: str # JSON 序列化的状态列表所有状态变更新增、更新、活跃标记、完成标记都会通过emit_agent(agent-state, state_stack)实时推送到 UI。持久化的状态日志带来三个核心收益实时可见性用户可以随时看到 Agent 当前在做什么、在想什么、访问了哪个页面、执行了什么命令审计与调试完整保留 Agent 行为轨迹便于排查问题中断恢复即使交互中断状态历史仍可回溯为断点续跑提供基础。8. Services外部服务集成Devika 通过集成外部服务增强能力目前主要有两个GitHubsrc/services/github.py 与 src/services/git.py执行 git 操作clone/pull、列出仓库/提交/文件等Netlifysrc/services/netlify.py无缝部署 Web 应用与站点。GitHub与Netlify类是对各自服务 API 的轻量封装负责认证、发起 HTTP 请求与解析响应。由此 Devika 可以给定 GitHub URL 克隆仓库列出用户的 GitHub 仓库创建新的 Netlify 站点将目录部署到 Netlify向用户返回部署后的站点 URL。集成采用模块化方式新增服务只需遵循同样的封装模式如subsequent_execute的deploy分支中直接Netlify().deploy(project_name)并取出deploy_url。9. Utilities支撑工具模块Devika 还依赖若干工具模块支撑整体运行Configsrc/config.py加载并提供配置项API 密钥、文件夹路径等是各模块获取sqlite_db、projects_dir、screenshots_dir、pdfs_dir、timeout_inference、log_prompts等配置的统一入口Loggersrc/logger.py配置控制台与文件日志支持日志级别与颜色输出ReadCodesrc/filesystem/read_code.py递归读取目录中的代码文件并转换为 Markdown 格式code_set_to_markdown是 Runner/Feature/Patcher/Reporter 获取项目全貌的输入来源SentenceBERTsrc/bert/sentence.py基于 SentenceBERT 嵌入从文本中提取关键词与语义信息用于 Agent Core 的update_contextual_keywordsExpertssrc/experts/面向特定领域的知识库集合web-design、physics、chemistry、math、medical、game-dev 等在相关领域提供辅助其中__UNIMPLEMENTED__标记了尚未实现的专家模块从源码结构看该能力仍在建设中PDF 生成src/documenter/pdf.py将 Markdown 报告转换为 PDF供 Reporter 使用。工具模块追求可复用性被系统不同部分共享。10. 设计原则与架构总结综合文档与源码Devika 的设计遵循四条核心原则模块化Modularity将功能拆分为专职 Agent 与独立服务。每个 Agent 只做一件事规划、研究、编码、修补……通过统一的渲染 prompt → LLM 推理 → 解析结果 → 副作用处理 → 返回模式组合便于替换与扩展。灵活性FlexibilityLLM、搜索引擎、外部服务都以可插拔方式接入。模型注册表覆盖 7 个厂商搜索支持 Bing/Google/DuckDuckGo服务可轻松新增。持久化Persistence项目会话与 Agent 状态均落在 SQLiteSQLModel支持暂停/恢复与行为审计。透明性Transparency通过 Socket.IOsrc/socket_instance.py将 Agent 的内部独白、浏览器截图、终端输出、token 用量等实时推送到前端ui/用户全程可见AI 在想什么、在做什么。从执行链路看execute完成规划 → 研究 → 编码的首次任务闭环subsequent_execute则通过 Action 分流实现运行/部署/加功能/修 bug/写报告的迭代闭环配合 Decision 处理 git clone、浏览器交互、PDF 生成等特殊命令共同构成了一个可连续迭代的 Agentic 软件开发循环。理解这些组件如何协同工作是扩展、优化与规模化 Devika 以承担更复杂软件工程任务的基础Agent 化架构也为未来更高级的 AI 能力提供了坚实的地基。【免费下载链接】devikaDevika is the first open-source implementation of an Agentic Software Engineer. Initially started as an open-source alternative to Devin.项目地址: https://gitcode.com/GitHub_Trending/de/devika创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻