fourmis-agents-sdk 0.3.1 → 0.4.1
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/README.md +126 -198
- package/dist/agent-loop.d.ts +21 -3
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +279 -90
- package/dist/agents/index.js +1079 -124
- package/dist/agents/tools.d.ts.map +1 -1
- package/dist/agents/tools.js +1079 -124
- package/dist/agents/types.d.ts +4 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/api.d.ts +8 -5
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +1663 -430
- package/dist/hooks.d.ts +19 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +27 -2
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1671 -431
- package/dist/mcp/client.d.ts +8 -1
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +134 -13
- package/dist/mcp/index.js +134 -13
- package/dist/mcp/types.d.ts +21 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +7 -3
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +41 -2
- package/dist/providers/openai.d.ts +6 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +36 -6
- package/dist/providers/registry.js +76 -8
- package/dist/providers/types.d.ts +4 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/query.d.ts +21 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +69 -1
- package/dist/skills/index.js +23 -1
- package/dist/skills/skills.d.ts +16 -0
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +23 -1
- package/dist/tools/ask-user-question.d.ts +7 -0
- package/dist/tools/ask-user-question.d.ts.map +1 -0
- package/dist/tools/ask-user-question.js +48 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +47 -2
- package/dist/tools/config.d.ts +7 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +114 -0
- package/dist/tools/exit-plan-mode.d.ts +7 -0
- package/dist/tools/exit-plan-mode.d.ts.map +1 -0
- package/dist/tools/exit-plan-mode.js +34 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +506 -9
- package/dist/tools/notebook-edit.d.ts +7 -0
- package/dist/tools/notebook-edit.d.ts.map +1 -0
- package/dist/tools/notebook-edit.js +83 -0
- package/dist/tools/presets.d.ts +2 -1
- package/dist/tools/presets.d.ts.map +1 -1
- package/dist/tools/presets.js +22 -4
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +12 -1
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +10 -0
- package/dist/tools/todo-write.d.ts +7 -0
- package/dist/tools/todo-write.d.ts.map +1 -0
- package/dist/tools/todo-write.js +69 -0
- package/dist/tools/web-fetch.d.ts +6 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +85 -0
- package/dist/tools/web-search.d.ts +7 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +78 -0
- package/dist/types.d.ts +344 -42
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/session-store.d.ts +1 -1
- package/dist/utils/session-store.d.ts.map +1 -1
- package/dist/utils/session-store.js +49 -2
- package/dist/utils/system-prompt.d.ts +2 -0
- package/dist/utils/system-prompt.d.ts.map +1 -1
- package/dist/utils/system-prompt.js +33 -4
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -2,22 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Multi-provider AI agent SDK with direct API access and in-process tool execution.
|
|
4
4
|
|
|
5
|
-
>
|
|
5
|
+
> Requires [Bun](https://bun.sh) v1.0+. This SDK uses Bun-native APIs (`Bun.spawn`, `Bun.Glob`, `Bun.build`) and is not Node runtime-compatible for host execution.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## What It Is
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
`fourmis-agents-sdk` provides a single `query()` API that works across providers while keeping the agent loop transparent and controllable.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
`fourmis-agents-sdk` provides:
|
|
17
|
-
- **Multi-provider** — Anthropic, OpenAI, and Gemini out of the box, extensible via `registerProvider()`
|
|
18
|
-
- **Transparent agent loop** — you control the execution cycle
|
|
19
|
-
- **No subprocess overhead** — direct API calls, <100ms startup
|
|
20
|
-
- **In-process tool execution** — 6 built-in coding tools
|
|
11
|
+
- Multi-provider: Anthropic, OpenAI, Gemini (plus custom providers via registry)
|
|
12
|
+
- Claude-style message envelopes (`system`, `assistant`, `user`, `stream_event`, `result`)
|
|
13
|
+
- In-process tool execution (file/system/web/notebook/config/todo)
|
|
14
|
+
- Hooks, permissions, MCP servers, subagents, skills, and memory
|
|
21
15
|
|
|
22
16
|
## Quick Start
|
|
23
17
|
|
|
@@ -25,289 +19,223 @@ The [Anthropic Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescr
|
|
|
25
19
|
import { query } from "fourmis-agents-sdk";
|
|
26
20
|
|
|
27
21
|
const conversation = query({
|
|
28
|
-
prompt: "Read package.json and tell me the project name",
|
|
22
|
+
prompt: "Read package.json and tell me the project name.",
|
|
29
23
|
options: {
|
|
30
24
|
provider: "anthropic",
|
|
31
25
|
model: "claude-sonnet-4-5-20250929",
|
|
32
|
-
cwd:
|
|
33
|
-
tools: "
|
|
26
|
+
cwd: process.cwd(),
|
|
27
|
+
tools: { type: "preset", preset: "claude_code" },
|
|
34
28
|
maxTurns: 5,
|
|
35
29
|
},
|
|
36
30
|
});
|
|
37
31
|
|
|
38
32
|
for await (const msg of conversation) {
|
|
39
|
-
if (msg.type === "
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
if (msg.type === "assistant") {
|
|
34
|
+
for (const block of msg.message.content) {
|
|
35
|
+
if (block.type === "text") process.stdout.write(block.text);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (msg.type === "result") {
|
|
40
|
+
console.log(`\nstop=${msg.subtype} cost=$${msg.total_cost_usd.toFixed(4)}`);
|
|
41
|
+
}
|
|
42
42
|
}
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
##
|
|
46
|
-
|
|
47
|
-
### Providers
|
|
45
|
+
## Providers
|
|
48
46
|
|
|
49
|
-
|
|
47
|
+
Built-in providers:
|
|
50
48
|
|
|
51
|
-
| Provider | Auth |
|
|
52
|
-
|
|
53
|
-
| `anthropic` | `ANTHROPIC_API_KEY`
|
|
54
|
-
| `openai` | `OPENAI_API_KEY` or Codex OAuth |
|
|
55
|
-
| `gemini` | `GEMINI_API_KEY` or Gemini CLI OAuth |
|
|
49
|
+
| Provider | Auth |
|
|
50
|
+
| --- | --- |
|
|
51
|
+
| `anthropic` | `ANTHROPIC_API_KEY` or Claude OAuth token |
|
|
52
|
+
| `openai` | `OPENAI_API_KEY` or OpenAI/Codex OAuth |
|
|
53
|
+
| `gemini` | `GEMINI_API_KEY` or Gemini CLI OAuth |
|
|
56
54
|
|
|
57
55
|
```ts
|
|
58
|
-
|
|
59
|
-
query({ prompt: "...", options: { provider: "openai", model: "gpt-4o" } });
|
|
56
|
+
import { query, registerProvider } from "fourmis-agents-sdk";
|
|
60
57
|
|
|
61
|
-
|
|
58
|
+
query({ prompt: "...", options: { provider: "openai", model: "gpt-4.1-mini" } });
|
|
62
59
|
query({ prompt: "...", options: { provider: "gemini", model: "gemini-2.5-flash" } });
|
|
63
60
|
|
|
64
|
-
// Register a custom provider
|
|
65
|
-
import { registerProvider } from "fourmis-agents-sdk";
|
|
66
61
|
registerProvider("my-provider", myAdapter);
|
|
67
62
|
```
|
|
68
63
|
|
|
69
|
-
|
|
64
|
+
## Tools
|
|
70
65
|
|
|
71
|
-
|
|
66
|
+
Current built-in tools:
|
|
72
67
|
|
|
73
|
-
| Tool |
|
|
74
|
-
|
|
75
|
-
| `Bash` | Shell command execution
|
|
76
|
-
| `Read` |
|
|
77
|
-
| `Write` |
|
|
78
|
-
| `Edit` |
|
|
68
|
+
| Tool | Purpose |
|
|
69
|
+
| --- | --- |
|
|
70
|
+
| `Bash` | Shell command execution |
|
|
71
|
+
| `Read` | Read files with line numbers |
|
|
72
|
+
| `Write` | Write/overwrite files |
|
|
73
|
+
| `Edit` | Exact string replacement |
|
|
79
74
|
| `Glob` | File pattern matching |
|
|
80
75
|
| `Grep` | Regex content search |
|
|
76
|
+
| `NotebookEdit` | Edit Jupyter notebook cells |
|
|
77
|
+
| `WebFetch` | Fetch URL content |
|
|
78
|
+
| `WebSearch` | Lightweight web search |
|
|
79
|
+
| `TodoWrite` | Persist todo state |
|
|
80
|
+
| `Config` | Read/write `.claude/settings*.json` |
|
|
81
|
+
| `AskUserQuestion` | Ask user (returns runtime-unavailable error in this host mode) |
|
|
82
|
+
| `ExitPlanMode` | Request exit from plan mode |
|
|
83
|
+
|
|
84
|
+
Tool configuration:
|
|
81
85
|
|
|
82
86
|
```ts
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
query({
|
|
88
|
+
prompt: "...",
|
|
89
|
+
options: {
|
|
90
|
+
// Exposed preset
|
|
91
|
+
tools: { type: "preset", preset: "claude_code" },
|
|
87
92
|
|
|
88
|
-
//
|
|
89
|
-
tools: ["Read", "Glob", "Grep"]
|
|
93
|
+
// Or explicit list
|
|
94
|
+
// tools: ["Read", "Glob", "Grep"],
|
|
90
95
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
96
|
+
allowedTools: ["Read", "Glob", "Grep"],
|
|
97
|
+
disallowedTools: ["Bash"],
|
|
98
|
+
},
|
|
99
|
+
});
|
|
94
100
|
```
|
|
95
101
|
|
|
96
|
-
|
|
102
|
+
## Hooks
|
|
97
103
|
|
|
98
|
-
Lifecycle
|
|
104
|
+
Lifecycle hooks can observe and influence execution:
|
|
99
105
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
| `PostToolUseFailure` | After a tool fails or is denied |
|
|
105
|
-
| `SessionStart` / `SessionEnd` | Session lifecycle |
|
|
106
|
-
| `Stop` | Before the agent returns its final result |
|
|
107
|
-
| `Notification` | Informational events |
|
|
108
|
-
| `SubagentStart` / `SubagentStop` | Subagent lifecycle |
|
|
109
|
-
| `PreCompact` | Before context compaction |
|
|
110
|
-
| `PermissionRequest` | When a permission decision is needed |
|
|
111
|
-
| `UserPromptSubmit` | When a user prompt is submitted |
|
|
106
|
+
- `PreToolUse`, `PostToolUse`, `PostToolUseFailure`
|
|
107
|
+
- `SessionStart`, `SessionEnd`, `Stop`, `Notification`
|
|
108
|
+
- `SubagentStart`, `SubagentStop`, `PreCompact`, `PermissionRequest`
|
|
109
|
+
- `UserPromptSubmit`, `Setup`, `TeammateIdle`, `TaskCompleted`
|
|
112
110
|
|
|
113
111
|
```ts
|
|
114
112
|
query({
|
|
115
113
|
prompt: "...",
|
|
116
114
|
options: {
|
|
117
115
|
hooks: {
|
|
118
|
-
PreToolUse: [
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
116
|
+
PreToolUse: [
|
|
117
|
+
{
|
|
118
|
+
matcher: "^Bash$",
|
|
119
|
+
hooks: [
|
|
120
|
+
async () => ({
|
|
121
|
+
decision: { behavior: "deny", message: "Blocked by policy." },
|
|
122
|
+
}),
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
],
|
|
125
126
|
},
|
|
126
127
|
},
|
|
127
128
|
});
|
|
128
129
|
```
|
|
129
130
|
|
|
130
|
-
|
|
131
|
+
## MCP (Model Context Protocol)
|
|
131
132
|
|
|
132
|
-
|
|
133
|
+
Supports `stdio`, `sse`, `http`, and in-process `sdk` MCP servers.
|
|
133
134
|
|
|
134
135
|
```ts
|
|
135
136
|
query({
|
|
136
137
|
prompt: "...",
|
|
137
138
|
options: {
|
|
138
139
|
mcpServers: {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
// HTTP
|
|
144
|
-
httpServer: { type: "http", url: "http://localhost:3000" },
|
|
145
|
-
// In-process SDK server
|
|
146
|
-
inProc: { type: "sdk", name: "myTools", instance: myMcpServer },
|
|
140
|
+
stdioServer: { command: "node", args: ["server.js"] },
|
|
141
|
+
remoteSse: { type: "sse", url: "http://localhost:3000/sse" },
|
|
142
|
+
remoteHttp: { type: "http", url: "http://localhost:3000" },
|
|
143
|
+
inProc: { type: "sdk", name: "my-tools", instance: myMcpServer },
|
|
147
144
|
},
|
|
148
145
|
},
|
|
149
146
|
});
|
|
150
147
|
```
|
|
151
148
|
|
|
152
|
-
Create in-process MCP
|
|
149
|
+
Create in-process MCP server configs:
|
|
153
150
|
|
|
154
151
|
```ts
|
|
155
152
|
import { createMcpServer, mcpTool } from "fourmis-agents-sdk";
|
|
156
153
|
import { z } from "zod";
|
|
157
154
|
|
|
158
|
-
const
|
|
155
|
+
const mcpConfig = createMcpServer({
|
|
159
156
|
name: "my-tools",
|
|
160
157
|
tools: [
|
|
161
|
-
mcpTool("greet", "Say hello",
|
|
162
|
-
|
|
163
|
-
})
|
|
158
|
+
mcpTool("greet", "Say hello", { name: z.string() }, async ({ name }) => {
|
|
159
|
+
return `Hello, ${name}!`;
|
|
160
|
+
}),
|
|
164
161
|
],
|
|
165
162
|
});
|
|
166
163
|
```
|
|
167
164
|
|
|
168
|
-
|
|
165
|
+
## Subagents
|
|
169
166
|
|
|
170
|
-
Define
|
|
167
|
+
Define agent roles and let the parent invoke them with `Task`:
|
|
171
168
|
|
|
172
169
|
```ts
|
|
173
170
|
query({
|
|
174
|
-
prompt: "
|
|
171
|
+
prompt: "Delegate to researcher and report package name.",
|
|
175
172
|
options: {
|
|
176
173
|
agents: {
|
|
177
174
|
researcher: {
|
|
178
|
-
description: "Reads code and
|
|
179
|
-
prompt: "
|
|
175
|
+
description: "Reads code and reports facts.",
|
|
176
|
+
prompt: "Be concise and factual.",
|
|
180
177
|
tools: ["Read", "Glob", "Grep"],
|
|
181
|
-
|
|
182
|
-
},
|
|
183
|
-
coder: {
|
|
184
|
-
description: "Writes and edits code",
|
|
185
|
-
prompt: "You are a code editor.",
|
|
186
|
-
tools: ["Read", "Write", "Edit", "Glob", "Grep"],
|
|
187
|
-
provider: "openai", // can use a different provider per agent
|
|
178
|
+
maxTurns: 3,
|
|
188
179
|
},
|
|
189
180
|
},
|
|
190
181
|
},
|
|
191
182
|
});
|
|
192
183
|
```
|
|
193
184
|
|
|
194
|
-
|
|
185
|
+
## Permissions and Settings
|
|
195
186
|
|
|
196
|
-
|
|
187
|
+
Permission modes:
|
|
188
|
+
- `default`
|
|
189
|
+
- `acceptEdits`
|
|
190
|
+
- `bypassPermissions` (requires `allowDangerouslySkipPermissions: true`)
|
|
191
|
+
- `plan`
|
|
192
|
+
- `delegate`
|
|
193
|
+
- `dontAsk`
|
|
197
194
|
|
|
198
|
-
|
|
195
|
+
You can combine:
|
|
196
|
+
- explicit `permissions` allow/deny rules
|
|
197
|
+
- dynamic `canUseTool` callback
|
|
198
|
+
- settings-file loading via `settingSources: ["user", "project", "local"]`
|
|
199
199
|
|
|
200
|
-
|
|
201
|
-
|------|----------|
|
|
202
|
-
| `default` | Allow all (host app handles permissions) |
|
|
203
|
-
| `bypassPermissions` | Allow everything unconditionally |
|
|
204
|
-
| `acceptEdits` | Auto-approve read + file edit tools |
|
|
205
|
-
| `plan` | Read-only tools only |
|
|
206
|
-
| `delegate` | Team coordination tools only |
|
|
207
|
-
| `dontAsk` | Deny anything not in the allow list |
|
|
200
|
+
## Compatibility Harness
|
|
208
201
|
|
|
209
|
-
|
|
210
|
-
query({
|
|
211
|
-
prompt: "...",
|
|
212
|
-
options: {
|
|
213
|
-
permissionMode: "acceptEdits",
|
|
214
|
-
permissions: {
|
|
215
|
-
allow: ["Read", "Glob", "Grep", { toolName: "Bash", ruleContent: "npm test" }],
|
|
216
|
-
deny: ["Bash"],
|
|
217
|
-
},
|
|
218
|
-
// Or provide a custom callback
|
|
219
|
-
canUseTool: async (toolName, input, options) => {
|
|
220
|
-
return { behavior: "allow" };
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### Settings Files
|
|
202
|
+
A strict side-by-side harness compares Fourmis vs `@anthropic-ai/claude-agent-sdk`.
|
|
227
203
|
|
|
228
|
-
|
|
204
|
+
Run:
|
|
229
205
|
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
prompt: "...",
|
|
233
|
-
options: {
|
|
234
|
-
settingSources: ["user", "project", "local"],
|
|
235
|
-
// Loads from:
|
|
236
|
-
// ~/.claude/settings.json (user-wide)
|
|
237
|
-
// <cwd>/.claude/settings.json (project, shared)
|
|
238
|
-
// <cwd>/.claude/settings.local.json (personal, gitignored)
|
|
239
|
-
},
|
|
240
|
-
});
|
|
206
|
+
```bash
|
|
207
|
+
bun run test:compat
|
|
241
208
|
```
|
|
242
209
|
|
|
243
|
-
|
|
210
|
+
Useful env vars:
|
|
244
211
|
|
|
245
|
-
|
|
212
|
+
- `COMPAT_REPEATS=3`
|
|
213
|
+
- `COMPAT_SCENARIOS=01-simple-text,02-read-package`
|
|
214
|
+
- `COMPAT_OUTPUT_DIR=/absolute/path`
|
|
246
215
|
|
|
247
|
-
|
|
248
|
-
query({
|
|
249
|
-
prompt: "...",
|
|
250
|
-
options: {
|
|
251
|
-
// Provider
|
|
252
|
-
provider: "anthropic", // "anthropic" | "openai" | "gemini" | custom
|
|
253
|
-
apiKey: "sk-...", // Override env var
|
|
254
|
-
baseUrl: "https://...", // Custom endpoint
|
|
216
|
+
Artifacts per run:
|
|
255
217
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
systemPrompt: "You are...",
|
|
260
|
-
maxTurns: 10, // Default: 10
|
|
261
|
-
maxBudgetUsd: 5, // Default: $5
|
|
262
|
-
maxThinkingTokens: 10000,
|
|
263
|
-
|
|
264
|
-
// Tools
|
|
265
|
-
tools: "coding", // Preset name or string[]
|
|
266
|
-
allowedTools: ["Read"], // Whitelist
|
|
267
|
-
disallowedTools: ["Bash"], // Blacklist
|
|
268
|
-
|
|
269
|
-
// Permissions
|
|
270
|
-
permissionMode: "default",
|
|
271
|
-
canUseTool: async () => ({ behavior: "allow" }),
|
|
272
|
-
permissions: { allow: [...], deny: [...] },
|
|
273
|
-
settingSources: ["user", "project", "local"],
|
|
274
|
-
|
|
275
|
-
// Streaming
|
|
276
|
-
includeStreamEvents: false, // Emit text_delta/thinking_delta events
|
|
277
|
-
|
|
278
|
-
// Hooks, MCP, Subagents (see sections above)
|
|
279
|
-
hooks: { ... },
|
|
280
|
-
mcpServers: { ... },
|
|
281
|
-
agents: { ... },
|
|
282
|
-
|
|
283
|
-
// Debug
|
|
284
|
-
debug: false,
|
|
285
|
-
signal: abortController.signal,
|
|
286
|
-
env: { PATH: "..." },
|
|
287
|
-
},
|
|
288
|
-
});
|
|
289
|
-
```
|
|
218
|
+
- `tests/compat/output/<timestamp>/summary.json`
|
|
219
|
+
- `tests/compat/output/<timestamp>/report.md`
|
|
220
|
+
- `tests/compat/output/<timestamp>/traces/*.json`
|
|
290
221
|
|
|
291
|
-
|
|
222
|
+
Current baseline (2026-02-17): 11/12 scenarios passing, with a known hook-deny mismatch in `08-hooks-deny-bash` on the Anthropic side.
|
|
292
223
|
|
|
293
|
-
|
|
224
|
+
## Message Model
|
|
294
225
|
|
|
295
|
-
|
|
296
|
-
|------|-------------|
|
|
297
|
-
| `init` | Session started — includes model, provider, tools, cwd |
|
|
298
|
-
| `text` | Assistant text output |
|
|
299
|
-
| `tool_use` | Tool invocation (name, input) |
|
|
300
|
-
| `tool_result` | Tool result (content, isError) |
|
|
301
|
-
| `stream` | Streaming delta (text or thinking) — only with `includeStreamEvents: true` |
|
|
302
|
-
| `result` (success) | Final result with cost, duration, usage stats |
|
|
303
|
-
| `result` (error) | Error result (execution error, max turns, max budget) |
|
|
304
|
-
| `status` | Status update |
|
|
226
|
+
`query()` yields `AgentMessage` envelopes, primarily:
|
|
305
227
|
|
|
306
|
-
|
|
228
|
+
- `system` (`init`, `status`, hook/task events)
|
|
229
|
+
- `assistant` (text and `tool_use` blocks)
|
|
230
|
+
- `user` (tool results)
|
|
231
|
+
- `stream_event` (partial deltas)
|
|
232
|
+
- `tool_progress`, `tool_use_summary`
|
|
233
|
+
- `result` (`success` or error subtype)
|
|
307
234
|
|
|
308
|
-
|
|
235
|
+
## Install and Test
|
|
309
236
|
|
|
310
|
-
```
|
|
237
|
+
```bash
|
|
311
238
|
bun add fourmis-agents-sdk
|
|
312
239
|
bun test
|
|
240
|
+
bun run test:compat
|
|
313
241
|
```
|
package/dist/agent-loop.d.ts
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* AsyncGenerator that orchestrates:
|
|
5
5
|
* 1. Call LLM via provider adapter
|
|
6
|
-
* 2. Stream
|
|
6
|
+
* 2. Stream partial assistant deltas (optional)
|
|
7
7
|
* 3. Collect tool calls
|
|
8
8
|
* 4. Execute tools with permission checks
|
|
9
9
|
* 5. Feed results back to LLM
|
|
10
10
|
* 6. Repeat until done or limits reached
|
|
11
11
|
*/
|
|
12
|
-
import type { AgentMessage } from "./types.js";
|
|
12
|
+
import type { AgentMessage, OutputFormat, ThinkingConfig, Effort, SdkBeta, SdkPluginConfig } from "./types.js";
|
|
13
13
|
import type { ProviderAdapter, NormalizedMessage, NormalizedContent } from "./providers/types.js";
|
|
14
14
|
import type { ToolRegistry } from "./tools/registry.js";
|
|
15
15
|
import type { PermissionManager } from "./permissions.js";
|
|
@@ -20,6 +20,16 @@ export type SessionLogger = (role: "user" | "assistant", content: NormalizedCont
|
|
|
20
20
|
export type AgentLoopOptions = {
|
|
21
21
|
provider: ProviderAdapter;
|
|
22
22
|
model: string;
|
|
23
|
+
fallbackModel?: string;
|
|
24
|
+
modelState?: {
|
|
25
|
+
current: string;
|
|
26
|
+
};
|
|
27
|
+
maxThinkingTokensState?: {
|
|
28
|
+
current: number | undefined;
|
|
29
|
+
};
|
|
30
|
+
thinking?: ThinkingConfig;
|
|
31
|
+
effort?: Effort;
|
|
32
|
+
outputFormat?: OutputFormat;
|
|
23
33
|
systemPrompt: string;
|
|
24
34
|
tools: ToolRegistry;
|
|
25
35
|
permissions: PermissionManager;
|
|
@@ -27,7 +37,7 @@ export type AgentLoopOptions = {
|
|
|
27
37
|
sessionId: string;
|
|
28
38
|
maxTurns: number;
|
|
29
39
|
maxBudgetUsd: number;
|
|
30
|
-
|
|
40
|
+
includePartialMessages: boolean;
|
|
31
41
|
signal: AbortSignal;
|
|
32
42
|
env?: Record<string, string>;
|
|
33
43
|
debug?: boolean;
|
|
@@ -37,6 +47,14 @@ export type AgentLoopOptions = {
|
|
|
37
47
|
sessionLogger?: SessionLogger;
|
|
38
48
|
/** Native memory tool for Anthropic provider (handled specially) */
|
|
39
49
|
nativeMemoryTool?: NativeMemoryTool;
|
|
50
|
+
initMeta?: {
|
|
51
|
+
agents?: string[];
|
|
52
|
+
betas?: SdkBeta[];
|
|
53
|
+
slashCommands?: string[];
|
|
54
|
+
outputStyle?: string;
|
|
55
|
+
skills?: string[];
|
|
56
|
+
plugins?: SdkPluginConfig[];
|
|
57
|
+
};
|
|
40
58
|
};
|
|
41
59
|
export declare function agentLoop(prompt: string, options: AgentLoopOptions): AsyncGenerator<AgentMessage>;
|
|
42
60
|
//# sourceMappingURL=agent-loop.d.ts.map
|
package/dist/agent-loop.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,YAAY,EAMZ,YAAY,EACZ,cAAc,EACd,MAAM,EAEN,OAAO,EACP,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG,CAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,EAC1B,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,EACrC,UAAU,EAAE,MAAM,GAAG,IAAI,KACtB,MAAM,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,sBAAsB,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACzD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,OAAO,CAAC;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;KAC7B,CAAC;CACH,CAAC;AA+DF,wBAAuB,SAAS,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,GACxB,cAAc,CAAC,YAAY,CAAC,CAwjB9B"}
|