DuMate Python SDK
面向 DuMate 老版 /api/v1 的 Python 客户端。Python 3.10+,提供同步 DuMate 和异步 AsyncDuMate。当前版本 0.3.0,为独立开发的 SDK。
应用层快速接入与前端数据协议见 APPLICATIONS.md。提供 skills.ensure、conversations.create/history/stream 和 notebook.stream。
安装
pip install ./dmt_agent_api-0.3.0-py3-none-any.whl
源码安装:pip install .。配置环境变量 DUMATE_API_KEY;可选 DUMATE_BASE_URL,默认 https://api.dumate.cn/api/v1。Key 仅放在后端。
一次调用,等待最终结果
from dumate import DuMate
with DuMate() as client:
agent = client.agents.create(name="我的助手")
session = client.sessions.create(agent_id=agent["id"])
result = client.runs.run_and_wait(
session_id=session["id"],
message="介绍你能完成的工作",
timeout=180,
)
print(result.output_text)
runs.run_and_wait 在客户端发送一次消息并轮询历史,关联本次用户消息与最终回答;没有对应的服务端 /runs 接口。适合网页的一键任务按钮:后端执行调用,完成后返回 output_text,前端展示结果即可。较长任务应由应用队列执行并提供任务状态查询。
同一会话串行发送,不同会话可以并发。超时仅停止本地等待,服务端任务可能仍在执行;可查询历史或显式 sessions.interrupt。timeout 限制轮询等待,单次网络请求还受客户端 timeout 约束。默认等待时间无限,建议显式设置。
流式事件
with client.sessions.stream(session_id, message="帮我分析这个问题") as events:
for event in events:
if event.type == "message.part.updated":
part = event.properties.get("part", {})
print(part.get("type"), part.get("text", ""))
elif event.type == "session.idle" or (
event.type == "session.status"
and event.properties.get("status", {}).get("type") == "idle"
):
break
流建立后才发送消息。事件保留原始 type、properties 和 raw,未知事件也会返回;SSE id、event 字段独立保留。应用处理规则:
| 数据 | 处理方式 |
|---|---|
| message.updated 的 info | 按消息 ID 更新角色、完成状态和错误 |
| message.part.updated 的 part | 按 part ID 替换快照;text 展示文字,reasoning 折叠展示,tool 按真实状态展示 |
| 增量事件 | 仅对明确增量字段追加;快照和增量同时出现时避免重复拼接 |
| 工具调用 | 保留调用 ID、输入、状态和输出;只展示真实事件 |
| session.status / session.idle | 更新运行状态;idle 还需核对历史中的最终答案或错误 |
| 未知事件 | 保留原始对象供兼容处理 |
SDK 提供事件解析,不包含网页组件。断流抛出 StreamInterruptedError;应用先恢复 sessions.history,再重新订阅,不能自动重发原 query。SDK 不承诺事件重放或 Last-Event-ID 恢复。完整事件字段以服务端实际返回为准。
Skill
ZIP 中包含技能目录和 SKILL.md,文件带 YAML name、description。
skill = client.skills.upload("my-skill.zip")
mount = client.skills.mount(skill["id"])
session = client.sessions.create(agent_id=agent_id, skills=[mount])
updated = client.skills.update_zip(skill["id"], "my-skill-v2.zip")
new_mount = client.skills.mount(skill["id"])
client.sessions.update(session["id"], skills=[new_mount])
挂载使用 skillID、releaseID、type;mount() 从详情取得 releaseId,不能把展示版本号当作发布 ID。URL 导入用 skills.create(url=...),URL 更新用 skills.update(skill_id, url=...)。
Vault、凭据和 MCP
import os
vault = client.vaults.create(name="业务系统")
credentials = client.vaults.credentials(vault["id"])
credential = credentials.create(
name="业务访问令牌",
auth={
"type": "environment_variable",
"secretName": "BUSINESS_TOKEN",
"secretValue": os.environ["BUSINESS_TOKEN"],
"networking": {
"type": "limited",
"allowedHosts": ["api.your-company.com"],
},
},
)
session = client.sessions.create(agent_id=agent_id, vault_ids=[vault["id"]])
auth 原样传递平台的 environment_variable、static_bearer 或 mcp_oauth 结构,敏感值不要记录到日志。MCP 配置通过 mcp_servers 传入 Agent 或 Session,例如 [{"type":"url","name":"business","url":"https://your-company.com/mcp"}];会话配置 MCP 时同时提供对应 vault_ids。各 MCP 的认证字段须按官方文档及服务商要求填写;SDK 不代办 OAuth 授权。平台未提供凭据更新接口,轮换需创建新凭据并迁移使用后删除旧凭据。
文件与产物
uploaded = client.files.upload("input.pdf", session_id=session_id)
result = client.runs.run_and_wait(
session_id=session_id, message="总结附件", file_ids=[uploaded["fileID"]], timeout=300,
)
client.files.download(uploaded["fileID"], "downloaded.pdf")
mapping = client.artifacts.path_map(session_id)
for path, artifact in mapping.items():
if artifact.get("uploadStatus") == "ready":
client.artifacts.download(session_id, artifact["artifactID"], "output.bin")
break
path-map 是整个会话的产物集合,不能全部当作本轮产物。按本轮回答中的文件路径、工具结果或执行前后的映射差异关联。output.bin 应由业务层按选中的文件设置名称;不要直接信任远端路径。
下载返回落盘信息,默认禁止覆盖,支持 max_bytes。文件先写临时文件,成功后提交;校验响应长度并计算 SHA-256。产物必须 ready;存储返回 403 时刷新一次 URL。存储下载不携带 DuMate Key。URL 校验阻止明显私网地址及不安全跳转;生产环境仍需网络出口策略防止 DNS 重绑定。
预览由应用后端代理文件,前端按 MIME 展示图片、音视频、PDF;HTML 应隔离在 sandbox iframe 中,未知类型提供下载。签名 URL 有时效,不应长期保存为产物身份。
异步
import asyncio
from dumate import AsyncDuMate
async def main():
async with AsyncDuMate() as client:
session = await client.sessions.create(agent_id="你的 Agent ID")
result = await client.runs.run_and_wait(
session_id=session["id"], message="你好", timeout=180,
)
print(result.output_text)
asyncio.run(main())
异步资源方法使用 await;列表迭代用 async for item in client.agents.iter();流用 async with client.sessions.stream(...) as events 和 async for。文件落盘及 DNS 检查仍包含短同步操作,大文件应用可用专门下载工作进程。
错误与运行边界
- GET 对网络错误、429 和部分 5xx 做有限重试,默认 2 次;写操作不自动重试。
- 写请求连接失败时
ConnectionError.outcome_unknown=True,先核对服务端状态,避免重复创建或执行。 APIError包含状态码及请求 ID;异常文本不包含响应正文或 Key。应用不要直接打印凭据查询返回值。RunTimeoutError、RunFailedError、ProtocolError区分等待超时、运行失败和协议异常。- 会话与租户归属校验、鉴权、队列持久化、限流和登录恢复由业务后端负责。
- 删除 Agent 会级联删除其会话;只清理自己创建且确认不再使用的资源。
完整方法见 API.md,验证范围见 TESTING.md。
Metadata
Release files for dmt-agent-api 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dmt_agent_api-0.3.0.tar.gz | 33.6 kB | Without provenance | Details for dmt_agent_api-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dmt_agent_api-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for dmt_agent_api-0.3.0-py3-none-any.whl |
Total release size: 59.4 kB
Release files / dmt_agent_api-0.3.0.tar.gz
| Download URL | dmt_agent_api-0.3.0.tar.gz |
|---|---|
| Size | 33.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
734a035da3f3e992ddf6635ef6fe3d54e233f3e2c2bf61f238118abefc185242
|
|
BLAKE2b-256 checksum How to use checksums |
50a8d1f749bb4339f3c5e9e800dd69a78ec6f9e008fbe8ce11b5345018ea8e8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / dmt_agent_api-0.3.0-py3-none-any.whl
| Download URL | dmt_agent_api-0.3.0-py3-none-any.whl |
|---|---|
| Size | 25.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3c6b1435904d37b685e49f23c0697582589eeec94e80b6b315f27bd355ab8106
|
|
BLAKE2b-256 checksum How to use checksums |
aff921ff6de188eac00d8c856023a9ceaf0f43a8f043d3b80d7f791521f8f972
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Security for dmt-agent-api 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.