@jackchen_me/open-multi-agent 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- package/.github/pull_request_template.md +14 -0
- package/.github/workflows/ci.yml +23 -0
- package/CLAUDE.md +72 -0
- package/CODE_OF_CONDUCT.md +48 -0
- package/CONTRIBUTING.md +72 -0
- package/DECISIONS.md +43 -0
- package/README.md +73 -140
- package/README_zh.md +217 -0
- package/SECURITY.md +17 -0
- package/dist/agent/agent.d.ts +5 -0
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +90 -3
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/structured-output.d.ts +33 -0
- package/dist/agent/structured-output.d.ts.map +1 -0
- package/dist/agent/structured-output.js +116 -0
- package/dist/agent/structured-output.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/adapter.d.ts +9 -4
- package/dist/llm/adapter.d.ts.map +1 -1
- package/dist/llm/adapter.js +17 -5
- package/dist/llm/adapter.js.map +1 -1
- package/dist/llm/anthropic.d.ts +1 -1
- package/dist/llm/anthropic.d.ts.map +1 -1
- package/dist/llm/anthropic.js +2 -1
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/copilot.d.ts +92 -0
- package/dist/llm/copilot.d.ts.map +1 -0
- package/dist/llm/copilot.js +426 -0
- package/dist/llm/copilot.js.map +1 -0
- package/dist/llm/openai-common.d.ts +47 -0
- package/dist/llm/openai-common.d.ts.map +1 -0
- package/dist/llm/openai-common.js +209 -0
- package/dist/llm/openai-common.js.map +1 -0
- package/dist/llm/openai.d.ts +1 -1
- package/dist/llm/openai.d.ts.map +1 -1
- package/dist/llm/openai.js +3 -224
- package/dist/llm/openai.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +25 -1
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +130 -37
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/task/queue.js +1 -1
- package/dist/task/queue.js.map +1 -1
- package/dist/task/task.d.ts +3 -0
- package/dist/task/task.d.ts.map +1 -1
- package/dist/task/task.js +5 -1
- package/dist/task/task.js.map +1 -1
- package/dist/team/messaging.d.ts.map +1 -1
- package/dist/team/messaging.js +2 -1
- package/dist/team/messaging.js.map +1 -1
- package/dist/types.d.ts +31 -3
- package/dist/types.d.ts.map +1 -1
- package/examples/05-copilot-test.ts +49 -0
- package/examples/06-local-model.ts +199 -0
- package/examples/07-fan-out-aggregate.ts +209 -0
- package/examples/08-gemma4-local.ts +203 -0
- package/examples/09-gemma4-auto-orchestration.ts +162 -0
- package/package.json +4 -3
- package/src/agent/agent.ts +115 -6
- package/src/agent/structured-output.ts +126 -0
- package/src/index.ts +2 -1
- package/src/llm/adapter.ts +18 -5
- package/src/llm/anthropic.ts +2 -1
- package/src/llm/copilot.ts +551 -0
- package/src/llm/openai-common.ts +255 -0
- package/src/llm/openai.ts +8 -258
- package/src/orchestrator/orchestrator.ts +164 -38
- package/src/task/queue.ts +1 -1
- package/src/task/task.ts +8 -1
- package/src/team/messaging.ts +3 -1
- package/src/types.ts +31 -2
- package/tests/semaphore.test.ts +57 -0
- package/tests/shared-memory.test.ts +122 -0
- package/tests/structured-output.test.ts +331 -0
- package/tests/task-queue.test.ts +244 -0
- package/tests/task-retry.test.ts +368 -0
- package/tests/task-utils.test.ts +155 -0
- package/tests/tool-executor.test.ts +193 -0
package/README_zh.md
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Open Multi-Agent
|
|
2
|
+
|
|
3
|
+
构建能自动拆解目标的 AI 智能体团队。定义智能体的角色和工具,描述一个目标——框架自动规划任务图、调度依赖、并行执行。
|
|
4
|
+
|
|
5
|
+
3 个运行时依赖,27 个源文件,一次 `runTeam()` 调用从目标到结果。
|
|
6
|
+
|
|
7
|
+
[](https://github.com/JackChen-me/open-multi-agent/stargazers)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](https://www.typescriptlang.org/)
|
|
10
|
+
|
|
11
|
+
[English](./README.md) | **中文**
|
|
12
|
+
|
|
13
|
+
## 为什么选择 Open Multi-Agent?
|
|
14
|
+
|
|
15
|
+
- **自动任务拆解** — 用自然语言描述目标,内置的协调者智能体自动将其拆解为带依赖关系和分配的任务图——无需手动编排。
|
|
16
|
+
- **多智能体团队** — 定义不同角色、工具甚至不同模型的智能体。它们通过消息总线和共享内存协作。
|
|
17
|
+
- **任务 DAG 调度** — 任务之间存在依赖关系。框架进行拓扑排序——有依赖的任务等待,无依赖的任务并行执行。
|
|
18
|
+
- **模型无关** — Claude、GPT、Gemma 4 和本地模型(Ollama、vLLM、LM Studio)可以在同一个团队中使用。通过 `baseURL` 即可接入任何 OpenAI 兼容服务。
|
|
19
|
+
- **结构化输出** — 为任意智能体添加 `outputSchema`(Zod),输出自动解析为 JSON 并校验,校验失败自动重试一次。通过 `result.structured` 获取类型化结果。
|
|
20
|
+
- **任务重试** — 为任务设置 `maxRetries`,失败时自动指数退避重试。所有尝试的 token 用量累计,确保计费准确。
|
|
21
|
+
- **进程内执行** — 没有子进程开销。所有内容在一个 Node.js 进程中运行。可部署到 Serverless、Docker、CI/CD。
|
|
22
|
+
|
|
23
|
+
## 快速开始
|
|
24
|
+
|
|
25
|
+
需要 Node.js >= 18。
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install @jackchen_me/open-multi-agent
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
在环境变量中设置 `ANTHROPIC_API_KEY`(以及可选的 `OPENAI_API_KEY` 或用于 Copilot 的 `GITHUB_TOKEN`)。通过 Ollama 使用本地模型无需 API key — 参见 [example 06](examples/06-local-model.ts)。
|
|
32
|
+
|
|
33
|
+
三个智能体,一个目标——框架处理剩下的一切:
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { OpenMultiAgent } from '@jackchen_me/open-multi-agent'
|
|
37
|
+
import type { AgentConfig } from '@jackchen_me/open-multi-agent'
|
|
38
|
+
|
|
39
|
+
const architect: AgentConfig = {
|
|
40
|
+
name: 'architect',
|
|
41
|
+
model: 'claude-sonnet-4-6',
|
|
42
|
+
systemPrompt: 'You design clean API contracts and file structures.',
|
|
43
|
+
tools: ['file_write'],
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const developer: AgentConfig = {
|
|
47
|
+
name: 'developer',
|
|
48
|
+
model: 'claude-sonnet-4-6',
|
|
49
|
+
systemPrompt: 'You implement what the architect designs.',
|
|
50
|
+
tools: ['bash', 'file_read', 'file_write', 'file_edit'],
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const reviewer: AgentConfig = {
|
|
54
|
+
name: 'reviewer',
|
|
55
|
+
model: 'claude-sonnet-4-6',
|
|
56
|
+
systemPrompt: 'You review code for correctness and clarity.',
|
|
57
|
+
tools: ['file_read', 'grep'],
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const orchestrator = new OpenMultiAgent({
|
|
61
|
+
defaultModel: 'claude-sonnet-4-6',
|
|
62
|
+
onProgress: (event) => console.log(event.type, event.agent ?? event.task ?? ''),
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
const team = orchestrator.createTeam('api-team', {
|
|
66
|
+
name: 'api-team',
|
|
67
|
+
agents: [architect, developer, reviewer],
|
|
68
|
+
sharedMemory: true,
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
// 描述一个目标——框架将其拆解为任务并编排执行
|
|
72
|
+
const result = await orchestrator.runTeam(team, 'Create a REST API for a todo list in /tmp/todo-api/')
|
|
73
|
+
|
|
74
|
+
console.log(`成功: ${result.success}`)
|
|
75
|
+
console.log(`Token 用量: ${result.totalTokenUsage.output_tokens} output tokens`)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
执行过程:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
agent_start coordinator
|
|
82
|
+
task_start architect
|
|
83
|
+
task_complete architect
|
|
84
|
+
task_start developer
|
|
85
|
+
task_start developer // 无依赖的任务并行执行
|
|
86
|
+
task_complete developer
|
|
87
|
+
task_start reviewer // 实现完成后自动解锁
|
|
88
|
+
task_complete developer
|
|
89
|
+
task_complete reviewer
|
|
90
|
+
agent_complete coordinator // 综合所有结果
|
|
91
|
+
Success: true
|
|
92
|
+
Tokens: 12847 output tokens
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 作者
|
|
96
|
+
|
|
97
|
+
> JackChen — 前 WPS 产品经理,现独立创业者。关注小红书[「杰克西|硅基杠杆」](https://www.xiaohongshu.com/user/profile/5a1bdc1e4eacab4aa39ea6d6),持续获取我的 AI Agent 观点和思考。
|
|
98
|
+
|
|
99
|
+
## 三种运行模式
|
|
100
|
+
|
|
101
|
+
| 模式 | 方法 | 适用场景 |
|
|
102
|
+
|------|------|----------|
|
|
103
|
+
| 单智能体 | `runAgent()` | 一个智能体,一个提示词——最简入口 |
|
|
104
|
+
| 自动编排团队 | `runTeam()` | 给一个目标,框架自动规划和执行 |
|
|
105
|
+
| 显式任务管线 | `runTasks()` | 你自己定义任务图和分配 |
|
|
106
|
+
|
|
107
|
+
## 贡献者
|
|
108
|
+
|
|
109
|
+
<a href="https://github.com/JackChen-me/open-multi-agent/graphs/contributors">
|
|
110
|
+
<img src="https://contrib.rocks/image?repo=JackChen-me/open-multi-agent" />
|
|
111
|
+
</a>
|
|
112
|
+
|
|
113
|
+
## 示例
|
|
114
|
+
|
|
115
|
+
所有示例都是可运行脚本,位于 [`examples/`](./examples/) 目录。使用 `npx tsx` 运行:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx tsx examples/01-single-agent.ts
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
| 示例 | 展示内容 |
|
|
122
|
+
|------|----------|
|
|
123
|
+
| [01 — 单智能体](examples/01-single-agent.ts) | `runAgent()` 单次调用、`stream()` 流式输出、`prompt()` 多轮对话 |
|
|
124
|
+
| [02 — 团队协作](examples/02-team-collaboration.ts) | `runTeam()` 自动编排 + 协调者模式 |
|
|
125
|
+
| [03 — 任务流水线](examples/03-task-pipeline.ts) | `runTasks()` 显式依赖图(设计 → 实现 → 测试 + 评审) |
|
|
126
|
+
| [04 — 多模型团队](examples/04-multi-model-team.ts) | `defineTool()` 自定义工具、Anthropic + OpenAI 混合、`AgentPool` |
|
|
127
|
+
| [05 — Copilot](examples/05-copilot-test.ts) | GitHub Copilot 作为 LLM 提供者 |
|
|
128
|
+
| [06 — 本地模型](examples/06-local-model.ts) | Ollama + Claude 混合流水线,通过 `baseURL` 接入(兼容 vLLM、LM Studio 等) |
|
|
129
|
+
| [07 — 扇出聚合](examples/07-fan-out-aggregate.ts) | `runParallel()` MapReduce — 3 个分析师并行,然后综合 |
|
|
130
|
+
| [08 — Gemma 4 本地](examples/08-gemma4-local.ts) | 纯本地 Gemma 4 智能体团队 + tool-calling — 零 API 费用 |
|
|
131
|
+
| [09 — Gemma 4 自动编排](examples/09-gemma4-auto-orchestration.ts) | `runTeam()` 用 Gemma 4 当 coordinator — 自动任务拆解,完全本地 |
|
|
132
|
+
|
|
133
|
+
## 架构
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
137
|
+
│ OpenMultiAgent (Orchestrator) │
|
|
138
|
+
│ │
|
|
139
|
+
│ createTeam() runTeam() runTasks() runAgent() getStatus() │
|
|
140
|
+
└──────────────────────┬──────────────────────────────────────────┘
|
|
141
|
+
│
|
|
142
|
+
┌──────────▼──────────┐
|
|
143
|
+
│ Team │
|
|
144
|
+
│ - AgentConfig[] │
|
|
145
|
+
│ - MessageBus │
|
|
146
|
+
│ - TaskQueue │
|
|
147
|
+
│ - SharedMemory │
|
|
148
|
+
└──────────┬──────────┘
|
|
149
|
+
│
|
|
150
|
+
┌─────────────┴─────────────┐
|
|
151
|
+
│ │
|
|
152
|
+
┌────────▼──────────┐ ┌───────────▼───────────┐
|
|
153
|
+
│ AgentPool │ │ TaskQueue │
|
|
154
|
+
│ - Semaphore │ │ - dependency graph │
|
|
155
|
+
│ - runParallel() │ │ - auto unblock │
|
|
156
|
+
└────────┬──────────┘ │ - cascade failure │
|
|
157
|
+
│ └───────────────────────┘
|
|
158
|
+
┌────────▼──────────┐
|
|
159
|
+
│ Agent │
|
|
160
|
+
│ - run() │ ┌──────────────────────┐
|
|
161
|
+
│ - prompt() │───►│ LLMAdapter │
|
|
162
|
+
│ - stream() │ │ - AnthropicAdapter │
|
|
163
|
+
└────────┬──────────┘ │ - OpenAIAdapter │
|
|
164
|
+
│ │ - CopilotAdapter │
|
|
165
|
+
│ └──────────────────────┘
|
|
166
|
+
┌────────▼──────────┐
|
|
167
|
+
│ AgentRunner │ ┌──────────────────────┐
|
|
168
|
+
│ - conversation │───►│ ToolRegistry │
|
|
169
|
+
│ loop │ │ - defineTool() │
|
|
170
|
+
│ - tool dispatch │ │ - 5 built-in tools │
|
|
171
|
+
└───────────────────┘ └──────────────────────┘
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## 内置工具
|
|
175
|
+
|
|
176
|
+
| 工具 | 说明 |
|
|
177
|
+
|------|------|
|
|
178
|
+
| `bash` | 执行 Shell 命令。返回 stdout + stderr。支持超时和工作目录设置。 |
|
|
179
|
+
| `file_read` | 读取指定绝对路径的文件内容。支持偏移量和行数限制以处理大文件。 |
|
|
180
|
+
| `file_write` | 写入或创建文件。自动创建父目录。 |
|
|
181
|
+
| `file_edit` | 通过精确字符串匹配编辑文件。 |
|
|
182
|
+
| `grep` | 使用正则表达式搜索文件内容。优先使用 ripgrep,回退到 Node.js 实现。 |
|
|
183
|
+
|
|
184
|
+
## 支持的 Provider
|
|
185
|
+
|
|
186
|
+
| Provider | 配置 | 环境变量 | 状态 |
|
|
187
|
+
|----------|------|----------|------|
|
|
188
|
+
| Anthropic (Claude) | `provider: 'anthropic'` | `ANTHROPIC_API_KEY` | 已验证 |
|
|
189
|
+
| OpenAI (GPT) | `provider: 'openai'` | `OPENAI_API_KEY` | 已验证 |
|
|
190
|
+
| GitHub Copilot | `provider: 'copilot'` | `GITHUB_TOKEN` | 已验证 |
|
|
191
|
+
| Ollama / vLLM / LM Studio | `provider: 'openai'` + `baseURL` | — | 已验证 |
|
|
192
|
+
|
|
193
|
+
已验证支持 tool-calling 的本地模型:**Gemma 4**(见[示例 08](examples/08-gemma4-local.ts))。
|
|
194
|
+
|
|
195
|
+
任何 OpenAI 兼容 API 均可通过 `provider: 'openai'` + `baseURL` 接入(DeepSeek、Groq、Mistral、Qwen、MiniMax 等)。这些 Provider 尚未完整验证——欢迎通过 [#25](https://github.com/JackChen-me/open-multi-agent/issues/25) 贡献验证。
|
|
196
|
+
|
|
197
|
+
## 参与贡献
|
|
198
|
+
|
|
199
|
+
欢迎提 Issue、功能需求和 PR。以下方向的贡献尤其有价值:
|
|
200
|
+
|
|
201
|
+
- **Provider 集成** — 验证并文档化 OpenAI 兼容 Provider(DeepSeek、Groq、Qwen、MiniMax 等)通过 `baseURL` 接入。详见 [#25](https://github.com/JackChen-me/open-multi-agent/issues/25)。对于非 OpenAI 兼容的 Provider(如 Gemini),欢迎贡献新的 `LLMAdapter` 实现——接口只需两个方法:`chat()` 和 `stream()`。
|
|
202
|
+
- **示例** — 真实场景的工作流和用例。
|
|
203
|
+
- **文档** — 指南、教程和 API 文档。
|
|
204
|
+
|
|
205
|
+
## Star 趋势
|
|
206
|
+
|
|
207
|
+
<a href="https://star-history.com/#JackChen-me/open-multi-agent&Date">
|
|
208
|
+
<picture>
|
|
209
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=JackChen-me/open-multi-agent&type=Date&theme=dark&v=20260403" />
|
|
210
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=JackChen-me/open-multi-agent&type=Date&v=20260403" />
|
|
211
|
+
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=JackChen-me/open-multi-agent&type=Date&v=20260403" />
|
|
212
|
+
</picture>
|
|
213
|
+
</a>
|
|
214
|
+
|
|
215
|
+
## 许可证
|
|
216
|
+
|
|
217
|
+
MIT
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
| Version | Supported |
|
|
6
|
+
|---------|-----------|
|
|
7
|
+
| latest | Yes |
|
|
8
|
+
|
|
9
|
+
## Reporting a Vulnerability
|
|
10
|
+
|
|
11
|
+
If you discover a security vulnerability, please report it responsibly via email:
|
|
12
|
+
|
|
13
|
+
**jack@yuanasi.com**
|
|
14
|
+
|
|
15
|
+
Please do **not** open a public GitHub issue for security vulnerabilities.
|
|
16
|
+
|
|
17
|
+
We will acknowledge receipt within 48 hours and aim to provide a fix or mitigation plan within 7 days.
|
package/dist/agent/agent.d.ts
CHANGED
|
@@ -104,6 +104,11 @@ export declare class Agent {
|
|
|
104
104
|
* Handles state transitions and error wrapping.
|
|
105
105
|
*/
|
|
106
106
|
private executeRun;
|
|
107
|
+
/**
|
|
108
|
+
* Validate agent output against the configured `outputSchema`.
|
|
109
|
+
* On first validation failure, retry once with error feedback.
|
|
110
|
+
*/
|
|
111
|
+
private validateStructuredOutput;
|
|
107
112
|
/**
|
|
108
113
|
* Shared streaming path used by `stream`.
|
|
109
114
|
* Handles state transitions and error wrapping.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,UAAU,EACV,WAAW,EAEX,cAAc,EACf,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,cAAc,IAAI,uBAAuB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,UAAU,EACV,WAAW,EAEX,cAAc,EACf,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,cAAc,IAAI,uBAAuB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA0BvD;;;GAGG;AACH,qBAAa,KAAK;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAE5B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;IAC5C,OAAO,CAAC,cAAc,CAAmB;IAEzC;;;;;;;OAOG;gBAED,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY;IAkB5B;;;;;OAKG;YACW,SAAS;IA0CvB;;;;;;;OAOG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQlD;;;;;;;OAOG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkBtD;;;;OAIG;IACI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC;IAY1D,oFAAoF;IACpF,QAAQ,IAAI,UAAU;IAItB,uDAAuD;IACvD,UAAU,IAAI,UAAU,EAAE;IAI1B;;;OAGG;IACH,KAAK,IAAI,IAAI;IAab;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI;IAI5C;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,0DAA0D;IAC1D,QAAQ,IAAI,MAAM,EAAE;IAQpB;;;OAGG;YACW,UAAU;IAyCxB;;;OAGG;YACW,wBAAwB;IA+EtC;;;OAGG;YACY,aAAa;IA+B5B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,gBAAgB;IAmBxB;;;OAGG;IACH,gBAAgB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,cAAc;CAU5D"}
|
package/dist/agent/agent.js
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
*/
|
|
25
25
|
import { createAdapter } from '../llm/adapter.js';
|
|
26
26
|
import { AgentRunner } from './runner.js';
|
|
27
|
+
import { buildStructuredOutputInstruction, extractJSON, validateOutput, } from './structured-output.js';
|
|
27
28
|
// ---------------------------------------------------------------------------
|
|
28
29
|
// Internal helpers
|
|
29
30
|
// ---------------------------------------------------------------------------
|
|
@@ -82,10 +83,18 @@ export class Agent {
|
|
|
82
83
|
return this.runner;
|
|
83
84
|
}
|
|
84
85
|
const provider = this.config.provider ?? 'anthropic';
|
|
85
|
-
const adapter = await createAdapter(provider);
|
|
86
|
+
const adapter = await createAdapter(provider, this.config.apiKey, this.config.baseURL);
|
|
87
|
+
// Append structured-output instructions when an outputSchema is configured.
|
|
88
|
+
let effectiveSystemPrompt = this.config.systemPrompt;
|
|
89
|
+
if (this.config.outputSchema) {
|
|
90
|
+
const instruction = buildStructuredOutputInstruction(this.config.outputSchema);
|
|
91
|
+
effectiveSystemPrompt = effectiveSystemPrompt
|
|
92
|
+
? effectiveSystemPrompt + '\n' + instruction
|
|
93
|
+
: instruction;
|
|
94
|
+
}
|
|
86
95
|
const runnerOptions = {
|
|
87
96
|
model: this.config.model,
|
|
88
|
-
systemPrompt:
|
|
97
|
+
systemPrompt: effectiveSystemPrompt,
|
|
89
98
|
maxTurns: this.config.maxTurns,
|
|
90
99
|
maxTokens: this.config.maxTokens,
|
|
91
100
|
temperature: this.config.temperature,
|
|
@@ -208,6 +217,10 @@ export class Agent {
|
|
|
208
217
|
};
|
|
209
218
|
const result = await runner.run(messages, runOptions);
|
|
210
219
|
this.state.tokenUsage = addUsage(this.state.tokenUsage, result.tokenUsage);
|
|
220
|
+
// --- Structured output validation ---
|
|
221
|
+
if (this.config.outputSchema) {
|
|
222
|
+
return this.validateStructuredOutput(messages, result, runner, runOptions);
|
|
223
|
+
}
|
|
211
224
|
this.transitionTo('completed');
|
|
212
225
|
return this.toAgentRunResult(result, true);
|
|
213
226
|
}
|
|
@@ -220,6 +233,79 @@ export class Agent {
|
|
|
220
233
|
messages: [],
|
|
221
234
|
tokenUsage: ZERO_USAGE,
|
|
222
235
|
toolCalls: [],
|
|
236
|
+
structured: undefined,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Validate agent output against the configured `outputSchema`.
|
|
242
|
+
* On first validation failure, retry once with error feedback.
|
|
243
|
+
*/
|
|
244
|
+
async validateStructuredOutput(originalMessages, result, runner, runOptions) {
|
|
245
|
+
const schema = this.config.outputSchema;
|
|
246
|
+
// First attempt
|
|
247
|
+
let firstAttemptError;
|
|
248
|
+
try {
|
|
249
|
+
const parsed = extractJSON(result.output);
|
|
250
|
+
const validated = validateOutput(schema, parsed);
|
|
251
|
+
this.transitionTo('completed');
|
|
252
|
+
return this.toAgentRunResult(result, true, validated);
|
|
253
|
+
}
|
|
254
|
+
catch (e) {
|
|
255
|
+
firstAttemptError = e;
|
|
256
|
+
}
|
|
257
|
+
// Retry: send full context + error feedback
|
|
258
|
+
const errorMsg = firstAttemptError instanceof Error
|
|
259
|
+
? firstAttemptError.message
|
|
260
|
+
: String(firstAttemptError);
|
|
261
|
+
const errorFeedbackMessage = {
|
|
262
|
+
role: 'user',
|
|
263
|
+
content: [{
|
|
264
|
+
type: 'text',
|
|
265
|
+
text: [
|
|
266
|
+
'Your previous response did not produce valid JSON matching the required schema.',
|
|
267
|
+
'',
|
|
268
|
+
`Error: ${errorMsg}`,
|
|
269
|
+
'',
|
|
270
|
+
'Please try again. Respond with ONLY valid JSON, no other text.',
|
|
271
|
+
].join('\n'),
|
|
272
|
+
}],
|
|
273
|
+
};
|
|
274
|
+
const retryMessages = [
|
|
275
|
+
...originalMessages,
|
|
276
|
+
...result.messages,
|
|
277
|
+
errorFeedbackMessage,
|
|
278
|
+
];
|
|
279
|
+
const retryResult = await runner.run(retryMessages, runOptions);
|
|
280
|
+
this.state.tokenUsage = addUsage(this.state.tokenUsage, retryResult.tokenUsage);
|
|
281
|
+
const mergedTokenUsage = addUsage(result.tokenUsage, retryResult.tokenUsage);
|
|
282
|
+
// Include the error feedback turn to maintain alternating user/assistant roles,
|
|
283
|
+
// which is required by Anthropic's API for subsequent prompt() calls.
|
|
284
|
+
const mergedMessages = [...result.messages, errorFeedbackMessage, ...retryResult.messages];
|
|
285
|
+
const mergedToolCalls = [...result.toolCalls, ...retryResult.toolCalls];
|
|
286
|
+
try {
|
|
287
|
+
const parsed = extractJSON(retryResult.output);
|
|
288
|
+
const validated = validateOutput(schema, parsed);
|
|
289
|
+
this.transitionTo('completed');
|
|
290
|
+
return {
|
|
291
|
+
success: true,
|
|
292
|
+
output: retryResult.output,
|
|
293
|
+
messages: mergedMessages,
|
|
294
|
+
tokenUsage: mergedTokenUsage,
|
|
295
|
+
toolCalls: mergedToolCalls,
|
|
296
|
+
structured: validated,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// Retry also failed
|
|
301
|
+
this.transitionTo('completed');
|
|
302
|
+
return {
|
|
303
|
+
success: false,
|
|
304
|
+
output: retryResult.output,
|
|
305
|
+
messages: mergedMessages,
|
|
306
|
+
tokenUsage: mergedTokenUsage,
|
|
307
|
+
toolCalls: mergedToolCalls,
|
|
308
|
+
structured: undefined,
|
|
223
309
|
};
|
|
224
310
|
}
|
|
225
311
|
}
|
|
@@ -264,13 +350,14 @@ export class Agent {
|
|
|
264
350
|
// -------------------------------------------------------------------------
|
|
265
351
|
// Result mapping
|
|
266
352
|
// -------------------------------------------------------------------------
|
|
267
|
-
toAgentRunResult(result, success) {
|
|
353
|
+
toAgentRunResult(result, success, structured) {
|
|
268
354
|
return {
|
|
269
355
|
success,
|
|
270
356
|
output: result.output,
|
|
271
357
|
messages: result.messages,
|
|
272
358
|
tokenUsage: result.tokenUsage,
|
|
273
359
|
toolCalls: result.toolCalls,
|
|
360
|
+
structured,
|
|
274
361
|
};
|
|
275
362
|
}
|
|
276
363
|
// -------------------------------------------------------------------------
|
package/dist/agent/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAaH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Structured output utilities for agent responses.
|
|
3
|
+
*
|
|
4
|
+
* Provides JSON extraction, Zod validation, and system-prompt injection so
|
|
5
|
+
* that agents can return typed, schema-validated output.
|
|
6
|
+
*/
|
|
7
|
+
import { type ZodSchema } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* Build a JSON-mode instruction block to append to the agent's system prompt.
|
|
10
|
+
*
|
|
11
|
+
* Converts the Zod schema to JSON Schema and formats it as a clear directive
|
|
12
|
+
* for the LLM to respond with valid JSON matching the schema.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildStructuredOutputInstruction(schema: ZodSchema): string;
|
|
15
|
+
/**
|
|
16
|
+
* Attempt to extract and parse JSON from the agent's raw text output.
|
|
17
|
+
*
|
|
18
|
+
* Handles three cases in order:
|
|
19
|
+
* 1. The output is already valid JSON (ideal case)
|
|
20
|
+
* 2. The output contains a ` ```json ` fenced block
|
|
21
|
+
* 3. The output contains a bare JSON object/array (first `{`/`[` to last `}`/`]`)
|
|
22
|
+
*
|
|
23
|
+
* @throws {Error} when no valid JSON can be extracted
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractJSON(raw: string): unknown;
|
|
26
|
+
/**
|
|
27
|
+
* Validate a parsed JSON value against a Zod schema.
|
|
28
|
+
*
|
|
29
|
+
* @returns The validated (and potentially transformed) value on success.
|
|
30
|
+
* @throws {Error} with a human-readable Zod error message on failure.
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateOutput(schema: ZodSchema, data: unknown): unknown;
|
|
33
|
+
//# sourceMappingURL=structured-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../../src/agent/structured-output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,KAAK,CAAA;AAOpC;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAa1E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAuDhD;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CASxE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Structured output utilities for agent responses.
|
|
3
|
+
*
|
|
4
|
+
* Provides JSON extraction, Zod validation, and system-prompt injection so
|
|
5
|
+
* that agents can return typed, schema-validated output.
|
|
6
|
+
*/
|
|
7
|
+
import { zodToJsonSchema } from '../tool/framework.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// System-prompt instruction builder
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* Build a JSON-mode instruction block to append to the agent's system prompt.
|
|
13
|
+
*
|
|
14
|
+
* Converts the Zod schema to JSON Schema and formats it as a clear directive
|
|
15
|
+
* for the LLM to respond with valid JSON matching the schema.
|
|
16
|
+
*/
|
|
17
|
+
export function buildStructuredOutputInstruction(schema) {
|
|
18
|
+
const jsonSchema = zodToJsonSchema(schema);
|
|
19
|
+
return [
|
|
20
|
+
'',
|
|
21
|
+
'## Output Format (REQUIRED)',
|
|
22
|
+
'You MUST respond with ONLY valid JSON that conforms to the following JSON Schema.',
|
|
23
|
+
'Do NOT include any text, markdown fences, or explanation outside the JSON object.',
|
|
24
|
+
'Do NOT wrap the JSON in ```json code fences.',
|
|
25
|
+
'',
|
|
26
|
+
'```',
|
|
27
|
+
JSON.stringify(jsonSchema, null, 2),
|
|
28
|
+
'```',
|
|
29
|
+
].join('\n');
|
|
30
|
+
}
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// JSON extraction
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
/**
|
|
35
|
+
* Attempt to extract and parse JSON from the agent's raw text output.
|
|
36
|
+
*
|
|
37
|
+
* Handles three cases in order:
|
|
38
|
+
* 1. The output is already valid JSON (ideal case)
|
|
39
|
+
* 2. The output contains a ` ```json ` fenced block
|
|
40
|
+
* 3. The output contains a bare JSON object/array (first `{`/`[` to last `}`/`]`)
|
|
41
|
+
*
|
|
42
|
+
* @throws {Error} when no valid JSON can be extracted
|
|
43
|
+
*/
|
|
44
|
+
export function extractJSON(raw) {
|
|
45
|
+
const trimmed = raw.trim();
|
|
46
|
+
// Case 1: Direct parse
|
|
47
|
+
try {
|
|
48
|
+
return JSON.parse(trimmed);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Continue to fallback strategies
|
|
52
|
+
}
|
|
53
|
+
// Case 2a: Prefer ```json tagged fence
|
|
54
|
+
const jsonFenceMatch = trimmed.match(/```json\s*([\s\S]*?)```/);
|
|
55
|
+
if (jsonFenceMatch?.[1]) {
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(jsonFenceMatch[1].trim());
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Continue
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Case 2b: Fall back to bare ``` fence
|
|
64
|
+
const bareFenceMatch = trimmed.match(/```\s*([\s\S]*?)```/);
|
|
65
|
+
if (bareFenceMatch?.[1]) {
|
|
66
|
+
try {
|
|
67
|
+
return JSON.parse(bareFenceMatch[1].trim());
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Continue
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Case 3: Find first { to last } (object)
|
|
74
|
+
const objStart = trimmed.indexOf('{');
|
|
75
|
+
const objEnd = trimmed.lastIndexOf('}');
|
|
76
|
+
if (objStart !== -1 && objEnd > objStart) {
|
|
77
|
+
try {
|
|
78
|
+
return JSON.parse(trimmed.slice(objStart, objEnd + 1));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Fall through
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Case 3b: Find first [ to last ] (array)
|
|
85
|
+
const arrStart = trimmed.indexOf('[');
|
|
86
|
+
const arrEnd = trimmed.lastIndexOf(']');
|
|
87
|
+
if (arrStart !== -1 && arrEnd > arrStart) {
|
|
88
|
+
try {
|
|
89
|
+
return JSON.parse(trimmed.slice(arrStart, arrEnd + 1));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Fall through
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw new Error(`Failed to extract JSON from output. Raw output begins with: "${trimmed.slice(0, 100)}"`);
|
|
96
|
+
}
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Zod validation
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
/**
|
|
101
|
+
* Validate a parsed JSON value against a Zod schema.
|
|
102
|
+
*
|
|
103
|
+
* @returns The validated (and potentially transformed) value on success.
|
|
104
|
+
* @throws {Error} with a human-readable Zod error message on failure.
|
|
105
|
+
*/
|
|
106
|
+
export function validateOutput(schema, data) {
|
|
107
|
+
const result = schema.safeParse(data);
|
|
108
|
+
if (result.success) {
|
|
109
|
+
return result.data;
|
|
110
|
+
}
|
|
111
|
+
const issues = result.error.issues
|
|
112
|
+
.map(issue => ` - ${issue.path.length > 0 ? issue.path.join('.') : '(root)'}: ${issue.message}`)
|
|
113
|
+
.join('\n');
|
|
114
|
+
throw new Error(`Output validation failed:\n${issues}`);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=structured-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../../src/agent/structured-output.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -49,10 +49,11 @@
|
|
|
49
49
|
* })
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
export { OpenMultiAgent } from './orchestrator/orchestrator.js';
|
|
52
|
+
export { OpenMultiAgent, executeWithRetry, computeRetryDelay } from './orchestrator/orchestrator.js';
|
|
53
53
|
export { Scheduler } from './orchestrator/scheduler.js';
|
|
54
54
|
export type { SchedulingStrategy } from './orchestrator/scheduler.js';
|
|
55
55
|
export { Agent } from './agent/agent.js';
|
|
56
|
+
export { buildStructuredOutputInstruction, extractJSON, validateOutput } from './agent/structured-output.js';
|
|
56
57
|
export { AgentPool, Semaphore } from './agent/pool.js';
|
|
57
58
|
export type { PoolStatus } from './agent/pool.js';
|
|
58
59
|
export { Team } from './team/team.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAMH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AACpG,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAMrE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,gCAAgC,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC5G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAMjD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAC1G,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAMrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,QAAQ,GACT,MAAM,0BAA0B,CAAA;AAMjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAMzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAMjD,YAAY,EAEV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,UAAU,EACV,YAAY,EAGZ,UAAU,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,WAAW,EAGX,cAAc,EACd,UAAU,EACV,cAAc,EACd,SAAS,EACT,QAAQ,EAGR,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EAGd,UAAU,EACV,aAAa,EAGb,IAAI,EACJ,UAAU,EAGV,kBAAkB,EAClB,iBAAiB,EAGjB,WAAW,EACX,WAAW,GACZ,MAAM,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -52,12 +52,13 @@
|
|
|
52
52
|
// ---------------------------------------------------------------------------
|
|
53
53
|
// Orchestrator (primary entry point)
|
|
54
54
|
// ---------------------------------------------------------------------------
|
|
55
|
-
export { OpenMultiAgent } from './orchestrator/orchestrator.js';
|
|
55
|
+
export { OpenMultiAgent, executeWithRetry, computeRetryDelay } from './orchestrator/orchestrator.js';
|
|
56
56
|
export { Scheduler } from './orchestrator/scheduler.js';
|
|
57
57
|
// ---------------------------------------------------------------------------
|
|
58
58
|
// Agent layer
|
|
59
59
|
// ---------------------------------------------------------------------------
|
|
60
60
|
export { Agent } from './agent/agent.js';
|
|
61
|
+
export { buildStructuredOutputInstruction, extractJSON, validateOutput } from './agent/structured-output.js';
|
|
61
62
|
export { AgentPool, Semaphore } from './agent/pool.js';
|
|
62
63
|
// ---------------------------------------------------------------------------
|
|
63
64
|
// Team layer
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AACpG,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAGvD,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,gCAAgC,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC5G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGtD,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGhD,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAG1G,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,QAAQ,GACT,MAAM,0BAA0B,CAAA;AAEjC,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGhD,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
|