DeepSeek Harness: Python SDK

最后更新:2026-08-31

Web UI 和 CLI 适合人类交互,但当你需要将 Agent 集成到自动化管线、CI/CD 流程或自定义应用中时,Python SDK 就是你的入口——几行代码即可启动 Agent 会话,获取结构化响应。

💡 提示:Python SDK 适合需要程序化控制 Agent 的场景——批量处理、自动化测试、数据管线。如果你只是日常使用,Web UI 和 CLI 更方便。

📋 前置知识:已完成 06-tools.md,了解工具系统;有 Python 基础

1. 你将学到


2. 安装与初始化

SDK 调用流程

(1) 安装 SDK

BASH
pip install deepseek-dsh

验证安装:

PYTHON
import dsh

print(dsh.__version__)
# 0.x.x

(2) 前置条件

Python SDK 需要 DSH 服务端运行中:

BASH
# 先启动 DSH 服务端(Headless 模式)
npx @deepseek-ai/dsh headless --port 3080

或者指定自定义端口:

BASH
npx @deepseek-ai/dsh headless --port 8080

(3) 初始化客户端

▶ 示例 1创建 SDK 客户端

PYTHON
from dsh import DSHClient

client = DSHClient(
    base_url="http://127.0.0.1:3080",
    api_key="your-api-key"  # 可选,如果 DSH 配置了认证
)

输出:

TEXT 📖 仅展示
✅ DSHClient initialized
🔗 Base URL: http://127.0.0.1:3080
🔑 API Key: configured

▶ 示例 2使用环境变量初始化

PYTHON
import os
from dsh import DSHClient

client = DSHClient.from_env()
# 读取 DSH_BASE_URL 和 DSH_API_KEY 环境变量

输出:

TEXT 📖 仅展示
✅ DSHClient initialized from environment
🔗 DSH_BASE_URL: http://127.0.0.1:3080
🔑 DSH_API_KEY: (set)

3. 创建会话

(1) 创建新会话

▶ 示例 3创建会话

PYTHON
session = client.create_session(
    workspace="/home/alice/my-project",
    model="deepseek-chat",
    mode="standard"
)

print(f"Session ID: {session.id}")
print(f"Workspace: {session.workspace}")
print(f"Model: {session.model}")

输出:

TEXT 📖 仅展示
Session ID: sess_abc123
Workspace: /home/alice/my-project
Model: deepseek-chat

(2) 会话配置

PYTHON
session = client.create_session(
    workspace="/home/alice/my-project",
    model="deepseek-chat",
    mode="ptc",
    sandbox="permissive",
    settings={
        "temperature": 0.7,
        "max_tokens": 4096
    }
)

(3) 恢复已有会话

▶ 示例 4通过 Session ID 恢复

PYTHON
session = client.get_session("sess_abc123")
print(f"Restored session: {session.id}")
print(f"Messages: {len(session.messages)}")

输出:

TEXT 📖 仅展示
Restored session: sess_abc123
Messages: 12

4. 发送消息与获取响应

(1) 基本消息发送

▶ 示例 5发送消息并获取完整响应

PYTHON
response = session.send("帮我查看项目的 package.json")

print(response.content)
# 这个项目的 package.json 显示...

print(f"Tools used: {len(response.tool_calls)}")
for tool in response.tool_calls:
    print(f"  - {tool.name}: {tool.status}")

交互流程:

🤖 Agent: 正在查看 package.json...
🔧 Using tool: file_edit (read)
  → Path: package.json
🤖 Agent: 这个项目的 package.json 显示...
📊 Tools used: 1
  - file_edit: success

⚠️ 你的实际输出取决于项目内容和模型,但工具调用流程应相似。

(2) 响应结构

PYTHON
class AgentResponse:
    content: str               # Agent 的文本回复
    tool_calls: list[ToolCall] # 工具调用记录
    model: str                 # 使用的模型
    tokens_used: int           # 消耗的 token 数
    duration_ms: int           # 响应耗时

class ToolCall:
    name: str                  # 工具名称
    params: dict               # 调用参数
    status: str                # 执行状态
    result: Any                # 执行结果
    duration_ms: int           # 执行耗时

(3) 带上下文的多轮对话

▶ 示例 6多轮对话

PYTHON
# 第一轮
resp1 = session.send("查看 src/app.ts 的内容")
print(resp1.content)

# 第二轮(自动带上下文)
resp2 = session.send("给这个文件添加错误处理中间件")
print(resp2.content)

# 第三轮
resp3 = session.send("运行测试确保没有破坏现有功能")
print(resp3.content)

交互流程:

[第1轮] 🤖 Agent: 正在读取 src/app.ts...
🔧 Using tool: file_edit (read) → src/app.ts
[第2轮] 🤖 Agent: 正在添加错误处理中间件...
🔧 Using tool: file_edit (edit) → src/app.ts
⚠️ Approval: edit src/app.ts → ✅ Allowed
[第3轮] 🤖 Agent: 正在运行测试...
🔧 Using tool: shell → npm test
✅ 所有测试通过

⚠️ 多轮对话中每轮的工具调用和输出都因模型而异,但上下文会自动累积。


5. 工具调用

(1) 自动工具调用

标准模式下,Agent 自动决定何时调用工具:

PYTHON
response = session.send("创建 src/utils/helpers.ts,写一个 debounce 函数")

for tool in response.tool_calls:
    print(f"Tool: {tool.name}")
    print(f"Params: {tool.params}")
    print(f"Result: {tool.result}")

(2) 工具审批处理

当 Agent 的操作需要审批时,SDK 提供回调机制:

▶ 示例 7审批回调

PYTHON
def on_approval(tool_name: str, params: dict) -> bool:
    print(f"Approval requested: {tool_name}")
    print(f"Params: {params}")
    
    # 自动允许安全操作
    if tool_name == "file_edit" and params.get("action") == "read":
        return True
    
    # 其他操作需要人工确认
    confirm = input(f"Allow {tool_name}? (y/n): ")
    return confirm.lower() == "y"

session = client.create_session(
    workspace="/home/alice/project",
    approval_callback=on_approval
)

交互流程:

🤖 Agent: 正在读取配置文件...
⚠️ Approval requested: file_edit
  Params: {action: "read", path: "src/config.ts"}
→ auto-approved (read action)
🤖 Agent: 配置文件内容如下...

⚠️ 审批回调的触发取决于 Agent 的工具选择,实际操作会不同。

(3) 禁用特定工具

PYTHON
session = client.create_session(
    workspace="/home/alice/project",
    disabled_tools=["shell", "sandbox"]
)

(4) 工具调用结果处理

▶ 示例 8详细处理工具结果

PYTHON
response = session.send("分析项目的测试覆盖率")

for tool in response.tool_calls:
    if tool.name == "shell":
        output = tool.result.get("stdout", "")
        if "Coverage" in output:
            print(f"Test coverage: {output}")
    elif tool.name == "search":
        files = tool.result.get("files", [])
        print(f"Found {len(files)} test files")
    elif tool.name == "file_edit":
        action = tool.params.get("action")
        path = tool.params.get("path")
        print(f"File {action}: {path}")

交互流程:

🤖 Agent: 正在分析测试覆盖率...
🔧 Using tool: shell → npm run test:coverage
📊 Test coverage: 78% statements, 65% branches
🔧 Using tool: search → 查找测试文件
📊 Found 12 test files
🔧 Using tool: file_edit (read) → 读取未覆盖模块
🤖 Agent: 覆盖率分析完成...

⚠️ 你的实际工具调用序列和输出取决于项目,但结果处理流程应相似。


6. 流式输出处理

(1) 启用流式输出

对于长时间响应,使用流式输出实时获取结果:

▶ 示例 9流式输出

PYTHON
for chunk in session.send_stream("详细解释这个项目的架构设计"):
    if chunk.type == "content":
        print(chunk.text, end="", flush=True)
    elif chunk.type == "tool_call":
        print(f"\n[Tool: {chunk.tool_name}]")
    elif chunk.type == "tool_result":
        print(f"[Tool result received]")

交互流程:

[content] 这个项目采用了分层架构...
[content] 主要分为三个模块...
[tool_call] Tool: search
[tool_result] Found 8 files
[content] 根据分析,架构设计如下...
[done] Tokens: 2450, Duration: 3200ms

⚠️ 流式输出的具体文本和工具调用完全取决于模型,但事件类型序列固定。

(2) 流式输出的事件类型

事件类型 说明 数据字段
content 文本内容片段 text
tool_call 工具调用开始 tool_name, params
tool_result 工具执行结果 tool_name, result
approval 审批请求 tool_name, params
done 响应完成 tokens_used, duration_ms
error 错误发生 code, message

(3) 流式 + 审批结合

▶ 示例 10流式输出中处理审批

PYTHON
def auto_approve(tool_name: str, params: dict) -> bool:
    safe_actions = ["read", "search"]
    if params.get("action") in safe_actions:
        return True
    return False

for chunk in session.send_stream(
    "重构所有控制器,添加错误处理",
    approval_callback=auto_approve
):
    if chunk.type == "content":
        print(chunk.text, end="")
    elif chunk.type == "approval":
        print(f"\n[Auto-approved: {chunk.tool_name}]")

交互流程:

[content] 正在重构所有控制器...
[tool_call] Tool: file_edit (read)
[Auto-approved: file_edit]
[tool_call] Tool: file_edit (edit)
[content] 已完成 3/8 个控制器...
[tool_call] Tool: file_edit (edit)
[content] 重构完成,共修改 8 个文件

⚠️ 自动审批只允许安全操作(read/search),edit 仍需人工确认(若未配置)。


7. 高级功能

(1) Headless 模式集成

SDK 最常见的场景是与 Headless 模式配合,实现无人值守的 Agent 执行:

▶ 示例 11完整的 Headless 工作流

PYTHON
from dsh import DSHClient

client = DSHClient(base_url="http://127.0.0.1:3080")

def auto_approve(tool_name: str, params: dict) -> bool:
    safe_tools = ["search", "file_edit", "plan"]
    if tool_name in safe_tools:
        action = params.get("action", "")
        if action in ["read", "create"]:
            return True
    return False

session = client.create_session(
    workspace="/home/alice/project",
    model="deepseek-coder",
    mode="ptc",
    approval_callback=auto_approve
)

response = session.send(
    "为所有路由添加输入验证中间件,确保请求参数符合预期类型"
)

print(f"Plan: {response.content}")
print(f"Tools used: {len(response.tool_calls)}")
print(f"Tokens: {response.tokens_used}")

交互流程:

🤖 Agent: [PTC 模式] 正在制定计划...
📋 Plan: 为所有路由添加输入验证中间件
  1. 搜索路由文件 → search
  2. 读取路由文件 → file_edit (read)
  3. 创建中间件 → file_edit (create)
  4. 修改路由 → file_edit (edit)
🔧 Executing plan...
✅ Plan completed: 4 steps, 6 tool calls
📊 Tokens used: 8450

⚠️ Headless 工作流的计划内容和工具调用完全取决于任务,但 PTC 流程固定。

(2) 并发会话

▶ 示例 12多会话并行

PYTHON
import concurrent.futures

def process_file(filepath: str):
    client = DSHClient(base_url="http://127.0.0.1:3080")
    session = client.create_session(workspace="/home/alice/project")
    response = session.send(f"为 {filepath} 添加单元测试")
    return {"file": filepath, "tests_added": len(response.tool_calls)}

files = [
    "src/utils/format.ts",
    "src/utils/validate.ts",
    "src/routes/users.ts"
]

with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
    results = list(executor.map(process_file, files))

for r in results:
    print(f"{r['file']}: {r['tests_added']} tool calls")

交互流程:

[Session 1] 🤖 正在为 src/utils/format.ts 添加测试...
[Session 2] 🤖 正在为 src/utils/validate.ts 添加测试...
[Session 3] 🤖 正在为 src/routes/users.ts 添加测试...
[Session 1] ✅ 完成, 3 tool calls
[Session 2] ✅ 完成, 2 tool calls
[Session 3] ✅ 完成, 4 tool calls
📊 src/utils/format.ts: 3 tool calls
📊 src/utils/validate.ts: 2 tool calls
📊 src/routes/users.ts: 4 tool calls

⚠️ 并发会话的执行顺序不确定,每个 Agent 的工具调用也不同。

(3) 错误处理

▶ 示例 13错误处理

PYTHON
from dsh import DSHClient, DSHTimeoutError, DSHConnectionError

client = DSHClient(base_url="http://127.0.0.1:3080")

try:
    session = client.create_session(workspace="/home/alice/project")
    response = session.send("帮我修复所有 TypeScript 错误", timeout=300)
except DSHTimeoutError:
    print("Agent 响应超时,请简化任务或增加超时时间")
except DSHConnectionError:
    print("无法连接 DSH 服务端,请检查是否已启动")
except Exception as e:
    print(f"未知错误: {e}")

输出:

TEXT 📖 仅展示
# 正常情况:
✅ Agent 响应完成

# 超时情况:
Agent 响应超时,请简化任务或增加超时时间

# 连接失败:
无法连接 DSH 服务端,请检查是否已启动

8. SDK 与 Web UI/CLI 对比

维度 Web UI CLI Python SDK
交互方式 浏览器 终端 代码
适合用户 所有人 开发者 自动化工程师
审批机制 弹窗交互 命令行确认 回调函数
流式输出 实时渲染 终端输出 事件流
并发 单会话 单会话 多会话
集成能力
学习曲线 最低 中等

❓ 常见问题

Q SDK 需要单独安装 DSH 吗?
A 需要。SDK 是客户端,DSH 服务端仍需通过 npx 或源码启动。SDK 通过 HTTP API 与服务端通信。
Q Python SDK 支持 Python 2 吗?
A 不支持。Python SDK 需要 Python 3.8+。
Q SDK 调用是否加密?
A 本地通信默认不加密(http://)。生产环境建议配置 HTTPS 或通过 SSH 隧道访问。
Q 可以用 SDK 控制 CLI 模式的 Agent 吗?
A 不可以。SDK 对接的是 DSH 的 HTTP API(Headless 模式)。CLI 模式是独立的终端交互。
Q 流式输出和普通输出的结果一样吗?
A 是的,最终结果完全一致。流式只是实时返回内容片段,普通模式等待完整响应后一次性返回。
Q 如何调试 SDK 调用?
A 启用 debug 日志:client = DSHClient(base_url="...", debug=True)。所有 HTTP 请求和响应会打印到控制台。 ---

📖 小节


📝 作业

1. ⭐ 基础题:安装 Python SDK,启动 DSH Headless 模式,用 SDK 创建一个会话并发送"Hello"消息,打印 Agent 的回复内容。

2. ⭐⭐ 进阶题:编写一个 Python 脚本,用 SDK 让 Agent 读取项目的 README.md 并生成一份项目概要报告,保存到 project-summary.txt

3. ⭐⭐⭐ 挑战题:编写一个批量处理脚本,用并发会话同时让 3 个 Agent 分析项目中不同目录的代码质量,汇总输出一份完整的代码质量报告。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏