作为国内表现上比较agentic的开发工具之一,trae项目开源了自家trae-agent开发工具,整体也有一段时间了。借着日常闲暇的机会,笔者计划研究下trae-agent的代码实现,看下这个本地AI开发辅助工具是如何运作的。
从开源项目的角度,trae-agent给的文档信息是比较充足的,但代码实现上只能说是MVP版本,只有一些基础功能。当然这个也可以理解,相信实际生产用的trae-agent会远比这个实现更加复杂,以及不可能所有人力都投入到开源项目的建设中。所以今天就简单看看这个项目的主流程。
主流程的话在agent.py当中,可以参考最深处BaseAgent中execute_task和_run_llm_step的实现,此处展示下基础流程部分:
1 | class BaseAgent(ABC): |
在设置里头我们可以设置每个问题的最大step次数,execute_task中就通过loop去要求LLM不断迭代问题解决方案。_run_llm_step中则传递历史消息和tools给到LLM,_llm_client支持了多个provider,给回结果后,通过匹配硬编码的关键字判断是否完成task,否则继续迭代,当然如果识别出需要tool-call的话,就由代码逻辑主动调用对应tool。
针对messages,在execute_task的caller的new_task过程中,已经注入了硬编码的system-prompt,以及带模板的user-prompt,可以在agent_prompt.py中看到。
1 | TRAE_AGENT_SYSTEM_PROMPT = """You are an expert AI software engineering agent. |
由于每次message只传递当次问答的message,所以针对单个问题,每个LLMClient需要实现对历史问答的记录。比如OllamaClient的实现:
1 | class OllamaClient(BaseLLMClient): |
主流程大概是这些,代码架构上来看实现也不算太复杂,用专有Agent框架复刻也是可以的,然后硬编码注入的内容比较多,所以整体上来看trae-agent开源版离实际投产的标准还有一些距离。如果自己的项目要复用这套框架开发内容,最好保证以下事情,一是有一个足够可靠确定性高的模型,二是需要单独一套prompt管理模块把硬编码注入的prompt等文本做统一管理,三是有一套执行稳定性跟评测机制让整个agent过程能够针对自己项目的问题给出解决方案,至少得有面子上过得去的output才行。