@diagrid/ 代理服务器
长期执行 马斯特拉 探员在 Dapr 工作流程。 。 。 .
代理控制回路是仿照Dapr Workflow和每个模型调用和 工具执行作为一种持久的活性,所以一个代理在进程崩溃中存活, 侧行车重新启动, 供应商停用, 而无需重新运行它的工作 已完成.
状态
工作,通过运行核查,而不是通过检查——针对当地
dapr run 与奥拉马公司对峙qwen2.5:7b作为
型号.
| 区域 | 状态 |
|---|---|
| 运行周期和工作流程命名 | ✅ |
持久代理循环( R)agentWorkflow(中文(简体) ) | * 模式调用 * 工具活动 * 重复 |
| 模型桥 | – 通过每次重复的一步 clientTools |
| 工具桥 | 每个工具呼叫一个检查站活动 |
| 崩溃恢复 | xq 工具在中转后不重运行( 见下文- 至少一次) |
| 活动重试(模型和工具) | 3次尝试,有耐用后退 |
书记官处元数据getMetadata()(中文(简体) ) | 记录是正确的,但没有任何出版物——见下文 |
| 检查站的持久性 | 执行和测试,但跑者从来不叫它——见下文 |
土著达普活动 RetryPolicy | 而不是在JS SDK; 管弦乐团重唱 |
| 登记册元数据的组成部分发现 | ❌ TODO(mastra-adapter) |
需要的工具 RequestContext / 工作空间 | ❌ TODO(mastra-adapter) |
两行
两者都是建造和单位测试的,但没有呼叫者——工作部分不是 与工作特征相同:
- 检查站的持久性.
DaprMastraCheckpointer.save()/load()/list()有过 测试之外没有电话 跑步者建造一个并暴露为 公共领域;没有写,所以load()总是返回undefined内 实践。 今天继续线程意味着通过前messages输入invoke()你自己来. - 登记册元数据.
getMetadata()返回 a 多数 正确记录—— 实例打印它, 但是没有向国家商店或代理发布它 注册,并且其三个字段不是配置.memory.shortTerm报告{ type: 'DaprMastraCheckpointer' },准确的意向和前面 电线.agent.maxIterations硬代码为1财务报告和审定财务报表pubsub实值{ resourceName: '', broadcastTopic: null, agentTopic: null }两者TODO(mastra-adapter)内mapper.ts。将这三种读作未定而非 作为设置 :inspect-agent.ts以maxIterations: 10财务报告和审定财务报表 将仍然打印1。 。 。 .
grep -rn 'TODO(mastra-adapter)' . 从 repo 根列表中列出剩下的内容 — 6
标记。 将它定义为 src 从此目录中只找到三个;另一个
三个搬进来了 packages/core 与持久的循环. tests/e2e/ 运行
以CI中真正的侧车为例 所以这些说法是诚实的.
安装
pnpm add @diagrid/agent-mastra @mastra/core zod
@mastra/core 财务报告和审定财务报表 zod 为: 端点 依赖性:您的应用程序拥有它们
版本,并安装此适配器 永远不会将另一个框架的 SDK 拖入
你的树。 两者都必须在安装线上命名——对等依赖不是
为您安装.
- 节点.js 22.13
@mastra/core≥ 1.50 < 2zod^ 4
使用量
import { Agent } from '@mastra/core/agent';
import { openai } from '@ai-sdk/openai';
import { DaprWorkflowAgentRunner } from '@diagrid/agent-mastra';
const agent = new Agent({
id: 'support-agent',
name: 'support-agent',
instructions: 'You help customers with billing questions.',
model: openai('gpt-4o-mini'),
});
const runner = new DaprWorkflowAgentRunner({
agent,
name: 'support-agent',
maxIterations: 10,
});
// Shut down cleanly on SIGINT/SIGTERM (opt-in: a library must not install
// process-wide handlers behind your back).
const disposeHandlers = runner.registerShutdownHandlers();
await runner.start();
const result = await runner.invoke({
prompt: 'Why was I charged twice?',
threadId: 'thread-123',
});
console.log(result.text, result.status, result.iterations);
disposeHandlers();
await runner.shutdown();
偏爱 runner.schedule(...) 当呼叫者不应阻挡时——代理转弯
超过HTTP请求是正常情况,而不是例外。 它还原
工作流程实例 id, 您可以通过它进行投票 runner.getWorkflowStatus(id)。 。 。 .
模块布局
此 repo 中的每个适配器的形状如下 :
| 文件 | 作用 |
|---|---|
bridge.ts | 驱动 Mastra 一步一步——唯一知道 Mastra API 的文件 |
mapper.ts | MastraAgentMapper - 那个 BaseAgentMapper 执行 |
runner.ts | 公共入境点 - DaprWorkflowAgentRunner、生命周期和援引 |
state.ts | DaprMastraCheckpointer - 核心的检查器与 mastra 前缀 |
version.ts | 版本标记,由发布工作流程所印出 |
耐用剂循环是 没有 在这里。 管弦乐团,它的活动
重试行为和I/O计划 @diagrid/agent-core 下级
src/agent/,这个软件包再导出它们,所以导入适配器仍然
足够转弯了 他们搬到那里是因为他们都没有提到
Mastra: 把它们放在适配器中意味着适配器 #2 会复制耐用循环
以及跨语言的检查站密钥布局,包括微妙的变数
两个会漂流.
关于元数据提取的说明
MastraAgentMapper 读取 Mastra Agent 结构 而不是说
导入 @mastra/core。这是有意的:在此输入框架
把它放在任何安装适配器的运行时间图中
tests/guards/cross-framework-imports.test.ts 禁止进入.
四个后果值得了解:
- 通过类访问者读取配置,而不是平地属性。 A 类
真实
Agent保留instructions财务报告和审定财务报表tools私下和揭露他们通过getInstructions()财务报告和审定财务报表listTools()读取agent.tools返回时undefined。 。 。 .listTools()是async, 这就是为什么mapper.mapAgentMetadata()财务报告和审定财务报表runner.getMetadata()也一样. - Mastra的三种模式表格都得到了支持:模型路由魔法
字符串( r)
'openai/gpt-4o-mini'),一个 OpenAI 兼容配置 (单位:千美元){ id, url }或者说{ providerId, modelId, url }- 你如何指向奥拉马, 和AI SDK模型实例。 错误的路由器 ID 被反射回原声 类型在登记册中可见,而不是崩溃为unknown。 。 。 . - 马斯特拉也接受
instructions, (中文(简体) ),model财务报告和审定财务报表tools作为 工厂A级 工厂需要RuntimeContext登记时不存在的,因此 动态配置是 跳过 ——登记册显示静态配置. 这个 不猜测. - 工具参数计划通过 Zod 4 演示为 JSON Schema
z.toJSONSchema(). Zod 3 含有变换的分型和分型不是 可代表,并降解为空字符串而不是[object Object]。 。 。 .
见 examples/mastra/ —— 说 pnpm inspect 指纹
整个记录 一个真正的经纪人.
许可证
业务来源许可证1.1 2026年 — Present Diagrid Inc.
至少一次,没有完全一次
工作流程引擎保证每个活动运行 至少一次任意 因此,具有副作用的活动必须能够安全地进行两次.
活动边界使完成的呼叫具有持久性:一旦其结果是
检查,重放 读检查,而不是再次呼喊。 不过
活动函数返回和引擎持续返回之间有一个窗口
记录完成, 和一个坠入窗口 重新运行的活动.
对于 invokeModel 这意味着这个模型被叫做——并且记了两次帐。 作为工具
它意味着不管工具做了什么 发生两次.
所以,一个工具 收费卡,发送电子邮件, 或写一个非意识形态记录 需要自己的一能键或有条件的写入。 引擎会缩小窗口 无法关闭它.
失事恢复实例显示,在工具所在的地方,一个特定的死亡时间 不重运行。 它没有,在结构上也无法证明没有这一点 窗口.