Deep Agents Code 源码阅读(二):main.py 启动流程与 CLI 配置系统

本文是 Deep Agents Code 源码阅读系列第二篇,深入 deepagents_code/main.py,从 dcode 的 CLI 入口 cli_main() 开始,梳理参数解析、配置初始化、Credentials 加载、运行模式分流以及最终进入 TUI 的完整启动流程。

上一篇文章建立了 Deep Agents Code 的整体源码地图。

我们知道,整个运行链路可以概括为:

scss 复制代码
dcode
  ↓
cli_main()
  ↓
run_textual_cli_async()
  ↓
Textual TUI
  ↓
RemoteAgent
  ↓
LangGraph Server
  ↓
server_graph.make_graph()
  ↓
create_cli_agent()
  ↓
create_deep_agent()
  ↓
LangGraph Runtime

这一篇正式进入第一层:

css 复制代码
main.py

main.py 是 Deep Agents Code 的应用启动层,也是理解整个项目运行机制的第一站。


一、main.py 到底负责什么?

打开:

css 复制代码
libs/code/deepagents_code/main.py

你会发现它并不是一个简单的几十行启动脚本。

当前版本的 main.py 已经包含大量启动逻辑,包括:

  • CLI 参数解析
  • 配置初始化
  • Credentials(凭证)加载
  • Model(模型)配置
  • MCP 配置
  • Sandbox 配置
  • Workspace Trust(工作区信任)
  • Hook Trust
  • Extension Trust(扩展信任)
  • ACP 模式
  • Headless 模式
  • Interactive TUI 模式
  • Session / Thread
  • 自动更新
  • 错误处理
  • 进程信号处理
  • 退出时的 Session 恢复提示

当前源码中,cli_main() 从约第 4804 行开始,而文件底部最终通过:

ini 复制代码
if __name__ == "__main__":
    cli_main()

进入整个程序的启动流程。

因此可以把 main.py 定义为:

Deep Agents Code 的应用级 Bootstrap(启动引导)与 Runtime 编排入口。

需要特别注意:

main.py 负责"启动和编排",并不负责真正执行 Agent 推理。

真正的 Agent Graph 会在后面的 server_graph.py 和 agent.py 中构建。


二、从 dcode 到 cli_main()

上一篇文章已经介绍过,dcode 是 Deep Agents Code 暴露出来的 CLI(Command Line Interface,命令行接口)。

因此用户执行:

复制代码
dcode

最终进入:

scss 复制代码
cli_main()

如果直接运行 Python 模块,则底部代码:

ini 复制代码
if __name__ == "__main__":
    cli_main()

同样会进入这里。

因此第一条源码调用链非常简单:

scss 复制代码
dcode
  ↓
deepagents_code
  ↓
cli_main()

接下来所有启动逻辑,基本都围绕 cli_main() 展开。


三、cli_main():整个应用的启动总控

当前源码中的定义:

scss 复制代码
def cli_main() -> None:
    ...

官方 Threat Model(威胁模型)也把:

css 复制代码
main.cli_main
main.parse_args

明确列为 CLI Entry Point(命令行入口)的核心入口。

可以把 cli_main() 抽象成:

scss 复制代码
                cli_main()
                    │
                    ▼
             启动环境初始化
                    │
                    ▼
               parse_args()
                    │
                    ▼
             CLI Provider 初始化
                    │
                    ▼
             快速命令处理
                    │
                    ▼
             配置 / Credentials
                    │
                    ▼
             Model / Profile
                    │
                    ▼
              模式判断
          ┌────────┼────────┐
          │        │        │
          ▼        ▼        ▼
         ACP    Headless  Interactive
                              │
                              ▼
                  run_textual_cli_async()

这张图就是本文最重要的源码地图。


四、第一阶段:启动前的轻量初始化

cli_main() 并不是一进来就加载所有模块。

当前源码非常强调一个设计:

尽可能延迟加载重量级依赖。

例如 --version 就有专门的 Fast Path(快速路径):

scss 复制代码
if len(sys.argv) == 2 and sys.argv[1] in {"-v", "--version"}:
    print(build_version_text())
    sys.exit(0)

也就是说:

css 复制代码
dcode --version

不会走完整的 Agent 启动流程,而是直接返回版本信息。

这种设计的意义很明显:

markdown 复制代码
普通启动
    ↓
大量配置、UI、模型、工具初始化

而:

css 复制代码
dcode --version
    ↓
快速读取版本
    ↓
立即退出

可以避免用户为了查看一个版本号而付出完整启动成本。


五、为什么 main.py 有这么多延迟 import?

继续观察源码,会发现一个明显特点:

javascript 复制代码
from xxx import xxx

并没有全部放在文件顶部。

很多依赖都是在函数内部才 import:

python 复制代码
def parse_args():
    from deepagents_code.client.commands.auth import setup_auth_parser
    ...

或者:

ini 复制代码
if command == "doctor":
    from deepagents_code.doctor import run_doctor_command

这是典型的 Lazy Import(延迟导入)。

原因主要有两个。

1. 降低启动时间

不是所有用户都会使用:

复制代码
ACP
MCP
Doctor
Plugins
Skills
TUI
Sandbox

没必要在启动时把所有模块全部加载。

2. 支持 Fast Path

例如:

css 复制代码
dcode --version
bash 复制代码
dcode help

这些命令应该尽可能快速返回。

因此 main.py 的整体设计并不是:

arduino 复制代码
启动
 ↓
import 所有东西
 ↓
执行

而更接近:

复制代码
启动
 ↓
判断用户到底要做什么
 ↓
只加载当前路径需要的模块

这是一个值得注意的工程设计。


六、第二阶段:解析命令行参数

完成基础初始化之后,核心调用出现:

ini 复制代码
args = parse_args()

当前 parse_args() 从约第 1981 行开始。

这是整个 CLI 系统的第一大核心函数。


七、parse_args() 使用什么实现?

Deep Agents Code 使用 Python 标准库:

复制代码
argparse

创建参数解析器:

ini 复制代码
parser = argparse.ArgumentParser(
    description=("Deep Agents - AI Coding Assistant"),
    formatter_class=argparse.RawDescriptionHelpFormatter,
    add_help=False,
)

然后创建子命令:

ini 复制代码
subparsers = parser.add_subparsers(
    dest="command",
    help="Command to run",
)

因此 dcode 实际上并不只是一个:

css 复制代码
dcode [options]

而是已经发展成了一个完整的 CLI Command System(命令系统)。

源码中已经包含:

arduino 复制代码
help
agents
skills
mcp
plugin
config
auth
tools
threads
...

等多个命令组。


八、CLI 的两层结构

可以把当前 CLI 理解成:

arduino 复制代码
dcode
 │
 ├── help
 │
 ├── agents
 │    ├── list
 │    └── reset
 │
 ├── skills
 │
 ├── mcp
 │    ├── login
 │    └── config
 │
 ├── plugin
 │
 ├── config
 │
 ├── auth
 │
 ├── tools
 │
 ├── threads
 │
 └── 默认启动
       │
       └── Coding Agent

所以:

复制代码
dcode

只是默认启动 Agent。

而:

bash 复制代码
dcode --help

实际上进入的是 CLI 的帮助路径。

这也是为什么 main.py 不能简单理解为:

csharp 复制代码
def main():
    start_agent()

它实际上已经承担了一套完整 CLI 应用的职责。


九、为什么 parse_args() 自己实现了 Help Action?

源码中有一个很值得注意的设计。

它没有完全使用 argparse 默认的:

diff 复制代码
-h
--help

而是创建了自己的 _ShowHelp Action。

核心思路是:

scss 复制代码
class _ShowHelp(argparse.Action):
    ...
    def __call__(...):
        help_fn()
        parser.exit()

然后:

less 复制代码
parent.add_argument(
    "-h",
    "--help",
    action=_make_help_action(help_fn),
)

这样不同命令可以使用自己的 Rich(终端富文本)帮助页面。

因此:

bash 复制代码
dcode agents --help

并不是简单输出 argparse 默认格式,而可以进入 Deep Agents Code 自己的 UI Help。

这说明 main.py 已经不是单纯的参数转发器,而是一个完整的 CLI Presentation(命令行呈现)层。


十、第三阶段:CLI Provider

解析参数之后,cli_main() 紧接着执行:

scss 复制代码
_install_cli_provider(args)

也就是说:

scss 复制代码
sys.argv
   ↓
parse_args()
   ↓
args
   ↓
_install_cli_provider(args)

这里开始建立 CLI 参数与后续配置系统之间的联系。

可以把它理解为:

objectivec 复制代码
CLI 参数
   ↓
CLI Provider
   ↓
Configuration Resolver
   ↓
最终运行配置

这也是后面理解 Deep Agents Code 配置系统的重要入口。


十一、Deep Agents Code 的配置不是简单读取环境变量

很多 Python Agent 项目会采用:

lua 复制代码
os.getenv("OPENAI_API_KEY")

这种简单模式。

Deep Agents Code 的配置系统明显复杂得多。

官方架构文档说明,配置是分层的,可以覆盖:

sql 复制代码
user
project
session
runtime

不同配置来源经过统一的 Resolver(解析器)合并。

可以把它抽象为:

markdown 复制代码
                 Configuration
                      │
       ┌──────────────┼──────────────┐
       │              │              │
       ▼              ▼              ▼
     User          Project        Runtime
       │              │              │
       └──────────────┼──────────────┘
                      ▼
               Config Resolver
                      │
                      ▼
                 Effective Config

也就是说,Agent 最终使用的并不是某一个配置文件中的原始值,而是:

经过多层配置解析后得到的 Effective Configuration(最终生效配置)。


十二、Credentials 什么时候加载?

这是 main.py 中一个很值得注意的设计。

源码并不是一开始就加载 Credentials。

而是在完成:

scss 复制代码
parse_args()
↓
Fast Path
↓
轻量命令处理

之后才:

javascript 复制代码
from deepagents_code.config import _get_credentials, console

_get_credentials()

当前源码明确说明,这一步会触发配置 Bootstrap(启动初始化),包括 .env 的加载。

因此可以理解为:

scss 复制代码
启动
 ↓
parse_args()
 ↓
帮助/轻量命令快速返回
 ↓
Credentials Bootstrap
 ↓
.env / Environment
 ↓
真正进入运行阶段

这样设计的一个重要好处是:

bash 复制代码
dcode --help

不需要为了展示帮助信息而加载完整 Credentials 环境。


十三、为什么 Credentials 加载必须放在这里?

因为后面的很多组件依赖环境变量。

例如:

复制代码
Model Provider
LangSmith
MCP
Sandbox
Authentication

都可能需要读取环境变量或者 .env。

因此:

scss 复制代码
_get_credentials()

实际上是把:

diff 复制代码
操作系统环境
+
.env
+
用户配置

转换成后续 Agent Runtime 可以使用的运行环境。

所以可以把这一阶段理解为:

从"CLI 配置"进入"运行时配置"的边界。


十四、第四阶段:处理 Model 参数

完成 Credentials 初始化以后,main.py 开始处理模型相关配置。

例如:

csharp 复制代码
--model-params

实际上是一个 JSON 字符串。

源码会:

ini 复制代码
model_params = json.loads(raw_kwargs)

并且要求最终结果必须是:

python 复制代码
dict

否则直接退出。

例如:

csharp 复制代码
dcode \
  --model-params '{"temperature":0.2}'

最终会变成:

json 复制代码
{
    "temperature": 0.2
}

再传给后面的模型创建流程。


十五、Summarization Model 也是在这里确定的

Deep Agents Code 不只存在一个 Model。

还有:

css 复制代码
Main Model
Summarization Model

源码通过:

scss 复制代码
_resolve_summarization_model(...)

确定上下文压缩(Context Compaction)使用的模型。

值得注意的是,它并不会在启动阶段真正创建模型对象。

源码明确采用了延迟构造策略:

markdown 复制代码
resolve model spec
       ↓
不立即创建 Model
       ↓
第一次真正需要压缩上下文时
       ↓
再创建 Model

这样可以避免启动阶段提前加载 Provider 依赖。

这是另一个非常典型的 Lazy Initialization(延迟初始化)设计。


十六、第五阶段:运行模式分流

完成基础配置之后,cli_main() 开始决定:

这一次 dcode 到底要怎么运行?

主要分成:

复制代码
ACP
Headless
Interactive

十七、ACP 模式

如果:

复制代码
args.acp

为 True,进入 ACP(Agent Client Protocol)模式。

这一模式主要用于让外部编辑器或 Agent Client 通过协议连接 Deep Agents。

例如官方文档展示了让 Zed 通过:

json 复制代码
{
  "command": "dcode",
  "args": ["--acp"]
}

启动 Deep Agents Code。

因此:

scss 复制代码
dcode --acp
       ↓
cli_main()
       ↓
ACP Server
       ↓
Deep Agent

这条分支与普通终端 TUI 不同。


十八、Headless 模式

第二条是 Headless(无交互)模式。

例如:

arduino 复制代码
dcode -n "分析当前项目结构"

或者通过管道输入任务。

这个模式不会启动完整的交互式 TUI。

而是进入:

scss 复制代码
run_non_interactive()

其核心思想是:

arduino 复制代码
机器输入
   ↓
Agent Server
   ↓
Agent Runtime
   ↓
机器可消费的输出

一个很重要的设计是:

Headless 模式并没有重新实现一套 Agent。

它仍然使用 Deep Agents Code 的 Agent Runtime,只是把交互层替换掉。

官方架构文档也明确说明,Interactive 和 Headless 使用相同的 Agent Runtime,只是客户端输入输出形式不同。


十九、Interactive 模式

普通情况下:

复制代码
dcode

进入的是 Interactive(交互式)模式。

这也是我们阅读源码时最重要的一条主线。

最终会执行:

scss 复制代码
run_textual_cli_async(...)

当前源码在约第 5961 行真正调用它。

所以:

scss 复制代码
dcode
  ↓
cli_main()
  ↓
parse_args()
  ↓
配置初始化
  ↓
Interactive
  ↓
run_textual_cli_async()

至此,main.py 的核心任务已经完成了一大半。


二十、进入 TUI 之前,main.py 还做了什么?

这里非常值得注意。

它不是解析完参数以后马上:

scss 复制代码
run_textual_cli_async()

中间还有大量 Runtime Safety(运行时安全)和环境检查。

包括:

scss 复制代码
Session / Thread
Sandbox
Interpreter
MCP Trust
Project Hooks Trust
Project Extensions Trust
Auto Update

二十一、Session / Thread 初始化

Interactive 模式需要支持会话恢复。

因此源码会处理:

复制代码
resume_thread

如果是普通新会话,则:

ini 复制代码
thread_id = generate_thread_id()

如果是恢复:

diff 复制代码
-r

或者:

diff 复制代码
-r <thread_id>

则把原始恢复意图交给 TUI,在异步启动过程中解析。

这意味着:

vbscript 复制代码
一次 dcode 启动
       ↓
一个 Thread
       ↓
多个 Agent Request
       ↓
Checkpoint
       ↓
后续 Resume

这也是 Deep Agents Code 能够支持跨会话恢复的重要基础。


二十二、Sandbox 检查

如果用户指定:

css 复制代码
dcode --sandbox ...

启动 TUI 之前还需要验证对应 Sandbox Provider 的依赖。

源码会调用:

scss 复制代码
verify_sandbox_deps(args.sandbox)

如果依赖不存在,会在启动 Server 之前直接退出。

这说明:

Sandbox 并不是 Agent 运行以后才临时决定的,而是在 Agent Runtime 创建之前就已经进入启动配置。


二十三、MCP Trust 检查

接下来是 MCP(Model Context Protocol)相关的项目级信任检查:

ini 复制代码
mcp_trust_decision = _check_mcp_project_trust(...)

如果用户没有明确允许项目 MCP Server,程序可能进入交互式确认流程。

这背后的安全思想是:

arduino 复制代码
项目中的 .mcp.json
        ↓
发现 MCP Server
        ↓
判断是否信任
        ↓
允许 / 拒绝
        ↓
再进入 Agent

官方 Threat Model 也把 MCP Loader & Trust 单独列为 Deep Agents Code 的安全边界之一。


二十四、Project Hooks 和 Extensions 也有独立 Trust

当前版本还会分别检查:

复制代码
Project Hooks
Project Extensions

对应:

scss 复制代码
_check_project_hooks_trust(...)
_check_project_extensions_trust(...)

也就是说,Deep Agents Code 对项目级可执行扩展并不是默认全部信任。

整体启动前的安全检查可以理解为:

markdown 复制代码
Project
  │
  ├── MCP
  │
  ├── Hooks
  │
  └── Extensions
        │
        ▼
      Trust
        │
   ┌────┴────┐
   ▼         ▼
 Allow      Deny(拒绝)
   │
   ▼
 Agent Runtime

这已经体现出一个 Coding Agent 与普通 Chat Agent 的重要区别:

Coding Agent 会执行代码、访问文件、调用外部服务,因此"项目是否可信"本身就是 Runtime 的重要组成部分。


二十五、最终进入 run_textual_cli_async()

所有启动条件满足之后:

ini 复制代码
result = asyncio.run(
    run_textual_cli_async(
        assistant_id=assistant_id,
        ...
    )
)

这一行就是 main.py 最重要的"出口"。

到这里:

css 复制代码
main.py

的职责开始交给:

scss 复制代码
run_textual_cli_async()

而这个函数已经属于 TUI / Client 层。


二十六、run_textual_cli_async() 才是真正的 Client 启动入口

函数定义位于当前 main.py 约第 2893 行:

python 复制代码
async def run_textual_cli_async(...):

源码注释直接说明了它的职责:

csharp 复制代码
Run the Textual TUI interface

并且非常关键的一句话是:

Starts a LangGraph server in a subprocess and connects the TUI to it via the langgraph-sdk client.(在子进程中启动一个LangGraph服务器,并通过langgraph-sdk客户端将TUI连接到该服务器。)

也就是说,这个函数同时完成两件事:

markdown 复制代码
1. 启动 Textual TUI
2. 启动 / 连接 LangGraph Server

所以我们上一篇文章中的:

arduino 复制代码
Textual TUI
        │
        ▼
LangGraph Server

在这里正式连接起来。


二十七、到这里,main.py 的使命完成

把整个 main.py 的核心启动链重新整理:

scss 复制代码
                         dcode
                           │
                           ▼
                      cli_main()
                           │
                           ▼
                 基础环境初始化
                           │
                           ▼
                     parse_args()
                           │
                           ▼
                CLI Provider 初始化
                           │
                           ▼
                 Fast Path / 子命令
                           │
                           ▼
               Credentials / Config
                           │
                           ▼
                Model / Profile 配置
                           │
                           ▼
                  运行模式判断
              ┌────────────┼────────────┐
              │            │            │
              ▼            ▼            ▼
             ACP       Headless    Interactive
                                        │
                                        ▼
                              Session / Sandbox
                                        │
                                        ▼
                               MCP / Hook Trust
                                        │
                                        ▼
                           run_textual_cli_async()

而下一层:

scss 复制代码
run_textual_cli_async()

会正式进入:

arduino 复制代码
TUI + LangGraph Client

二十八、从源码角度重新认识 main.py

到这里可以发现:

main.py 并不是:

arduino 复制代码
def main():
    agent = create_agent(...)
    agent.invoke(...)

而是一个典型的 Application Bootstrap Layer(应用启动引导层)。

它负责解决的是:

复制代码
"这次 Agent 运行应该以什么方式启动?"

而不是:

复制代码
"Agent 应该如何思考?"

可以把两者明确区分:

层次 主要职责 代表代码
CLI 用户如何启动 parse_args()
Config 使用什么配置 Config Resolver
Bootstrap 如何准备运行环境 cli_main()
Client 用户如何交互 run_textual_cli_async() / TUI
Server Agent 在哪里运行 LangGraph Server
Agent Assembly Agent 如何组装 create_cli_agent()
Harness Agent 有哪些能力 create_deep_agent()
Runtime Agent 如何执行 LangGraph

Deep Agents Code 官方架构文档也明确把系统分成 Terminal Client 和 Agent Server 两个 Runtime Half(运行时部分):Client 负责输入、输出和审批,Server 负责 Agent Graph、Model、Tools、Memory、Skills 和 Backend。


二十九、一个非常值得注意的设计:启动层和 Agent 层解耦

整个项目实际上形成了一个很清晰的分层:

css 复制代码
                    Deep Agents Code
                           │
              ┌────────────┴────────────┐
              │                         │
          Application                Agent
              │                         │
        ┌─────┴─────┐             ┌─────┴─────┐
        │           │             │           │
       CLI         TUI          Harness     Runtime
        │           │             │           │
    main.py      app.py       deepagents   LangGraph

这意味着:

Terminal UI 可以变化,而 Agent Harness 不需要跟着变化。

例如未来完全可以:

arduino 复制代码
Web UI
   ↓
Remote Agent
   ↓
同一个 Agent Server

也可以:

复制代码
IDE
 ↓
ACP
 ↓
同一个 Agent Runtime

甚至:

复制代码
CI/CD
 ↓
Headless
 ↓
同一个 Agent Runtime

这也是为什么当前 Deep Agents Code 同时支持 Interactive、Headless 和 ACP 等运行方式。


三十、为什么这一层值得重点研究?

如果你正在研究 AI Agent,可能会觉得:

"CLI 参数解析有什么好看的?"

其实恰恰相反。

传统 Agent Demo 往往只有:

复制代码
用户
 ↓
LLM
 ↓
Tool
 ↓
LLM

而真正产品化的 Coding Agent,需要先解决:

arduino 复制代码
用户
 ↓
CLI
 ↓
Config
 ↓
Credentials
 ↓
Session
 ↓
Trust
 ↓
Sandbox
 ↓
Client
 ↓
Server
 ↓
Agent

因此:

Agent 产品化之后,Agent 本身反而只是整个系统的一部分。

Deep Agents Code 的 main.py 很好地展示了这一点。


三十一、源码阅读中的一个重要方法

阅读大型 Agent 项目时,不建议按照文件顺序:

css 复制代码
main.py
第 1 行
第 2 行
第 3 行
...
第 6085 行

全部读完。

更有效的方法是:

只追踪一条真实运行链路。

对于 main.py,这条链路就是:

scss 复制代码
dcode
 ↓
cli_main()
 ↓
parse_args()
 ↓
Config / Credentials
 ↓
模式判断
 ↓
Interactive
 ↓
run_textual_cli_async()

至于:

sql 复制代码
doctor
agents
skills
plugins
mcp
auth
threads
update

等功能,第一次阅读时只需要知道它们在哪里分叉即可。

等主链路跑通之后,再回来研究这些支线。


三十二、本文源码地图

如果把本文浓缩成一张源码地图,可以得到:

scss 复制代码
libs/code/deepagents_code/main.py
│
├── parse_args()
│     │
│     ├── help
│     ├── agents
│     ├── skills
│     ├── mcp
│     ├── plugins
│     ├── config
│     ├── auth
│     ├── threads
│     └── Agent launch arguments
│
├── cli_main()
│     │
│     ├── Fast Path
│     ├── CLI Provider
│     ├── Config / Credentials
│     ├── Model / Profile
│     ├── ACP
│     ├── Headless
│     └── Interactive
│             │
│             ├── Session
│             ├── Sandbox
│             ├── MCP Trust
│             ├── Hook Trust
│             └── Extension Trust
│
└── run_textual_cli_async()
        │
        ├── Textual TUI
        ├── LangGraph Server
        └── LangGraph SDK Client

三十三、下一篇:进入 TUI 和 Client

到这里,我们终于走出了 main.py。

下一篇就可以进入:

bash 复制代码
deepagents_code/app.py

重点研究:

scss 复制代码
run_textual_cli_async()
        ↓
DeepAgentsApp
        ↓
用户输入
        ↓
RemoteAgent
        ↓
LangGraph Server

也就是回答一个非常关键的问题:

用户在终端里输入的一句话,究竟是如何从 Textual TUI 传递到 Agent Server 的?

到这里,源码阅读才会真正从"启动流程"进入"Agent 请求执行流程"。


三十四、总结

这一篇主要解决了一个问题:

dcode 启动以后,Deep Agents Code 在真正进入 Agent 之前到底做了什么?

核心调用链可以浓缩成:

scss 复制代码
dcode
  ↓
cli_main()
  ↓
parse_args()
  ↓
CLI Provider
  ↓
Config / Credentials
  ↓
Model / Profile
  ↓
运行模式分流
  │
  ├── ACP
  ├── Headless
  └── Interactive
          ↓
      Session
          ↓
      Sandbox
          ↓
      Trust
          ↓
run_textual_cli_async()

其中最值得记住的三个入口:

scss 复制代码
parse_args()

负责:

把用户的 CLI 命令转换成程序参数。

scss 复制代码
cli_main()

负责:

完成整个应用启动阶段的环境准备和运行模式编排。

scss 复制代码
run_textual_cli_async()

负责:

从应用启动层进入 Textual Client,并建立与 LangGraph Agent Server 的运行链路。

因此,main.py 可以看成 Deep Agents Code 的第一道"总闸门"。

它把:

复制代码
用户命令

转换成:

复制代码
一次完整的 Agent Runtime 启动上下文

而真正的 Agent,则要从下一层开始寻找。

下一站:

scss 复制代码
main.py
   ↓
run_textual_cli_async()
   ↓
app.py
   ↓
RemoteAgent
   ↓
LangGraph Server

从这里开始,我们才真正进入 Deep Agents Code 的 Client/Server 运行时。

相关推荐
10年前端老司机3 小时前
LangChain Agent 切面钩子实战:解耦业务,一键复用通用能力
人工智能·langchain·agent
ai大模型-探索者5 小时前
LangChain框架完全指南(介绍与使用)
langchain
GISer_Jing9 小时前
前端Agent架构师指南:从零搭建智能前端Agent
前端·ai·langchain
小此方11 小时前
LangChain/LangGraph(一)提示词篇一:Prompt工程实战:从CO-STAR、Few-Shot到思维链与自我迭代,系统掌握提示词设计方法
ai·langchain·prompt
梦想不只是梦与想13 小时前
LangGraph控制流:条件边、循环与并行(二)
langchain·大模型·边
Maiko Star20 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
染指11101 天前
128.Agent-LangChain核心组件-中间件-调用模型的时候
人工智能·windows·中间件·langchain·agent
不好听6131 天前
LangSmith 入门:让你的Agent链路可追踪
langchain
似梦的苏烟1 天前
Langchain实战3-Model和Prompt
langchain·agent