Agent 快速开始
查看 Markdown把你所用框架的 Agent 作为持久化 Dex Session 运行,然后在对话中途停止它,看它继续运行。整个过程大约 10 分钟。
1. 获取示例并运行
在一个终端中运行 dexcli dev(安装 dexcli)。在第二个终端中下载示例,并向 Agent 询问一个订单:
- Claude Agent SDK
- Google ADK
- LangChain and LangGraph
- Mastra
- OpenAI Agents SDK
- Pydantic AI
- Vercel AI SDK
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=3 dex-main/examples/python/agent-harnesses
cd agent-harnesses
uv sync --locked
uv run --frozen python -m agent_harness_examples.quick_start claude-agent-sdk "Look up order 1001"
需要 Python 3.11 或更高版本以及 uv。它会调用 Claude,所以先设置 ANTHROPIC_API_KEY。
它会打印 Session ID 和 Agent 的回复:
Session claude-agent-sdk-quick-start-<8 hex digits>
Agent: <the model's reply about order 1001>
例子: examples/python/agent-harnesses/agent_harness_examples/quick_start/__main__.py
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=2 dex-main/examples/typescript
cd typescript
npm install
npm run agent-quick-start -- claude-agent-sdk "Look up order 1001"
需要 Node.js 22 或更高版本。它会调用真实模型,所以先设置你的 provider key,例如 ANTHROPIC_API_KEY 或 OPENAI_API_KEY。
它会打印 Session ID 和 Agent 的回复:
Session claude-agent-sdk-quick-start-<8 hex digits>
Agent: <the model's reply about order 1001>
例子: examples/typescript/src/products/agent-harnesses/quick-start/quick-start-main.ts
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=3 dex-main/examples/python/agent-harnesses
cd agent-harnesses
uv sync --locked
uv run --frozen python -m agent_harness_examples.quick_start google-adk "Look up order 1001"
需要 Python 3.11 或更高版本以及 uv。它使用本地 demo 模型运行,因此不需要 API key。
它会打印 Session ID 和 Agent 的回复:
Session google-adk-quick-start-6dd3466c
Skipping missing token usage metadata for agent order_support and model mock/order-support
Skipping missing token usage metadata for agent order_support and model mock/order-support
Agent: Local demo response: Order 1001: 2 notebooks, shipped.
以 Skipping 开头的两行是 Google ADK 关于 demo 模型 token 计数的日志,可以忽略。
例子: examples/python/agent-harnesses/agent_harness_examples/quick_start/__main__.py
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=3 dex-main/examples/python/agent-harnesses
cd agent-harnesses
uv sync --locked
uv run --frozen python -m agent_harness_examples.quick_start langchain "Look up order 1001"
需要 Python 3.11 或更高版本以及 uv。它使用本地 demo 模型运行,因此不需要 API key。
它会打印 Session ID 和 Agent 的回复:
Session langchain-quick-start-5fdf8e3b
Agent: Local demo response: Order 1001: 2 notebooks, shipped.
例子: examples/python/agent-harnesses/agent_harness_examples/quick_start/__main__.py
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=2 dex-main/examples/typescript
cd typescript
npm install
npm run agent-quick-start -- mastra "Look up order 1001"
需要 Node.js 22 或更高版本。它会调用真实模型,所以先设置你的 provider key,例如 ANTHROPIC_API_KEY 或 OPENAI_API_KEY。
它会打印 Session ID 和 Agent 的回复:
Session mastra-quick-start-<8 hex digits>
Agent: <the model's reply about order 1001>
例子: examples/typescript/src/products/agent-harnesses/quick-start/quick-start-main.ts
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=3 dex-main/examples/python/agent-harnesses
cd agent-harnesses
uv sync --locked
uv run --frozen python -m agent_harness_examples.quick_start openai-agents "Look up order 1001"
需要 Python 3.11 或更高版本以及 uv。它使用本地 demo 模型运行,因此不需要 API key。
它会打印 Session ID 和 Agent 的回复:
Session openai-agents-quick-start-3980a512
Agent: Local demo response: Order 1001: 2 notebooks, shipped.
OPENAI_API_KEY is not set, skipping trace export
最后一行是 OpenAI Agents SDK 提示它只有在设置了 key 时才导出 trace,可以忽略。
例子: examples/python/agent-harnesses/agent_harness_examples/quick_start/__main__.py
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=2 dex-main/examples/typescript
cd typescript
npm install
npm run agent-quick-start -- openai-agents "Look up order 1001"
需要 Node.js 22 或更高版本。它会调用真实模型,所以先设置你的 provider key,例如 ANTHROPIC_API_KEY 或 OPENAI_API_KEY。
它会打印 Session ID 和 Agent 的回复:
Session openai-agents-quick-start-<8 hex digits>
Agent: <the model's reply about order 1001>
例子: examples/typescript/src/products/agent-harnesses/quick-start/quick-start-main.ts
如果想从单个文件开始,并且只使用已发布的 package,可以用单文件 starter:同一个 Agent,连同它的 Worker 和 Client 都在一个 Python 文件中。它会调用真实模型,所以要设置 OPENAI_API_KEY。在 dexcli dev 运行时执行:
mkdir order-agent && cd order-agent
python3 -m venv .venv && source .venv/bin/activate
pip install dex-agents-openai-agents==0.5.0 dex-python-sdk==1.45.0
curl -fsSLO https://raw.githubusercontent.com/superdurable/dex/main/examples/python/agent-starter/agent.py
python agent.py "Cancel order 1002, it was a mistake"
写操作运行前,程序会询问 Approve cancel_order? [y/N]。agent.py 就是整个程序。
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=3 dex-main/examples/python/agent-harnesses
cd agent-harnesses
uv sync --locked
uv run --frozen python -m agent_harness_examples.quick_start pydantic-ai "Look up order 1001"
需要 Python 3.11 或更高版本以及 uv。它使用本地 demo 模型运行,因此不需要 API key。
它会打印 Session ID 和 Agent 的回复:
Session pydantic-ai-quick-start-9b54d0be
Agent: Local demo response: Order 1001: 2 notebooks, shipped.
例子: examples/python/agent-harnesses/agent_harness_examples/quick_start/__main__.py
curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=2 dex-main/examples/typescript
cd typescript
npm install
npm run agent-quick-start -- vercel-ai "Look up order 1001"
需要 Node.js 22 或更高版本。它会调用真实模型,所以先设置你的 provider key,例如 ANTHROPIC_API_KEY 或 OPENAI_API_KEY。
它会打印 Session ID 和 Agent 的回复:
Session vercel-ai-quick-start-<8 hex digits>
Agent: <the model's reply about order 1001>
例子: examples/typescript/src/products/agent-harnesses/quick-start/quick-start-main.ts
这个 Agent 是一个小型订单客服 Agent,有两个 tool。look_up_order 读取订单,因此 Dex 可以重试它。cancel_order 取消尚未发货的订单;它是写操作,所以最多运行一次,并且要等人批准后才运行。
2. 批准一次写操作
用消息 Cancel order 1002 运行同一条命令。程序会停下来询问:
cancel_order wants to run with {"order_id":"1002","reason":"requested by the customer"}. Approve? [y/N]
Session 在 AwaitToolApproval 中等待。输入 y,Agent 就会取消订单并回复。审批 介绍应用如何读取并答复正在等待的调用,以及人如何在 Dex Web 中批准它。
3. 在 Agent 等待时停止程序
再次要求取消订单 1002;每次不带 --session-id 运行都会启动一个新 Session。程序请你批准时,按 Ctrl+C。程序、它的 Worker 和 Client 都会停止,而 Session 仍在 Dex 中等待。
在同一个文件夹中再次运行第 1 步的命令,用 --session-id SESSION_ID 替换消息。新的 Worker 启动,程序会询问同一个 cancel_order 调用。输入 y。订单只取消一次,重启之前的模型调用仍然是已完成状态。
- WorkerRunModel 调用模型。模型请求调用 cancel_order。
- Dex Servercancel_order 在 AwaitToolApproval 中等待。这个等待由 Dex Server 保管。
- WorkerWorker 停止。
- Dex Server审批继续在 Dex Server 上等待,不需要 Worker。
- 重启后的 WorkerWorker 重新启动并连接 Dex。
- Dex Server你在程序的提示符处批准 cancel_order,Dex Server 记录这个答复。
- 重启后的 Workercancel_order 只运行一次。模型写出回复。
- Dex Server这一轮完成。
4. 在 tool 运行时停止
在 Tool Call 中途崩溃是更难处理的情况。示例可以放慢每次 Tool Call,让你有时间停止它。
- 在第 1 步的命令前加上
DEX_ORDER_DESK_TOOL_DELAY_SECONDS=20,询问订单 1001。 - 在 20 秒内像崩溃那样杀掉程序。崩溃相当于 kill 信号;Ctrl+C 会先让正在运行的调用完成。
pkill -9 -f agent_harness_examples.quick_start
例子: examples/python/agent-harnesses/agent_harness_examples/quick_start/__main__.py
pkill -9 -f quick-start-main.js
例子: examples/typescript/src/products/agent-harnesses/quick-start/quick-start-main.ts
- 带上
--session-id、不带消息,再次运行程序。Agent 会回复订单信息。 - 查看这次 Tool Call 是如何运行的:
dexcli flow history --all SESSION_ID | jq '.events[]
| select(.payload.context.stepType == "CallTool")
| .payload.context | {finalAttempt, failure: .lastFailureInfo.details.detail}'
finalAttempt 是 2。第一次尝试在 Worker 断开时失败;因为 look_up_order 是读操作,Dex 在新的 Worker 上再次运行了它。它之前的模型调用只运行了一次。
现在对写操作做同样的事:设置延迟后要求取消订单 1002,批准它,在 20 秒内杀掉程序,再带上 --session-id 运行。Dex 把 cancel_order 记录为 outcome_unknown,并且不会再运行第二次,因为它是非幂等写操作。Agent 会告诉用户结果未知,由你的应用在任何人重试之前先检查订单系统。核对 outcome_unknown 介绍具体做法。
是什么让它变得持久
这个示例先按框架本身的写法写好 Agent,再把它包装进 Dex Agent Session,并为每个 tool 指定策略。你的代码有哪些变化给出了每个框架的两个版本。
下一步
- 把 Dex 加入你的 Agent 把这个 Agent 移到你自己的应用中,提供完整文件和一个 web app。
- Session 解释哪些内容在重启后保留了下来,以及你所用框架的 turn 如何对应到 Step。
- Tool Call 解释为什么
cancel_order最多运行一次,以及写操作可能运行两次的那一种少见情况。 - 内置 Agent Loop 不用框架构建 Agent。
- 订单客服 Agent 是完整的示例,包含它的 HTTP route。