open-agent-sdk 0.1.0-alpha.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.
Files changed (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +284 -0
  3. package/README.zh.md +285 -0
  4. package/dist/agent/agent-definition.d.ts +107 -0
  5. package/dist/agent/agent-definition.d.ts.map +1 -0
  6. package/dist/agent/agent-definition.js +90 -0
  7. package/dist/agent/agent-definition.js.map +1 -0
  8. package/dist/agent/react-loop.d.ts +117 -0
  9. package/dist/agent/react-loop.d.ts.map +1 -0
  10. package/dist/agent/react-loop.js +674 -0
  11. package/dist/agent/react-loop.js.map +1 -0
  12. package/dist/agent/subagent-runner.d.ts +67 -0
  13. package/dist/agent/subagent-runner.d.ts.map +1 -0
  14. package/dist/agent/subagent-runner.js +168 -0
  15. package/dist/agent/subagent-runner.js.map +1 -0
  16. package/dist/hooks/index.d.ts +8 -0
  17. package/dist/hooks/index.d.ts.map +1 -0
  18. package/dist/hooks/index.js +9 -0
  19. package/dist/hooks/index.js.map +1 -0
  20. package/dist/hooks/inputs.d.ts +56 -0
  21. package/dist/hooks/inputs.d.ts.map +1 -0
  22. package/dist/hooks/inputs.js +150 -0
  23. package/dist/hooks/inputs.js.map +1 -0
  24. package/dist/hooks/manager.d.ts +63 -0
  25. package/dist/hooks/manager.d.ts.map +1 -0
  26. package/dist/hooks/manager.js +137 -0
  27. package/dist/hooks/manager.js.map +1 -0
  28. package/dist/hooks/types.d.ts +191 -0
  29. package/dist/hooks/types.d.ts.map +1 -0
  30. package/dist/hooks/types.js +6 -0
  31. package/dist/hooks/types.js.map +1 -0
  32. package/dist/index.d.ts +109 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +218 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/mcp/errors.d.ts +26 -0
  37. package/dist/mcp/errors.d.ts.map +1 -0
  38. package/dist/mcp/errors.js +43 -0
  39. package/dist/mcp/errors.js.map +1 -0
  40. package/dist/mcp/index.d.ts +11 -0
  41. package/dist/mcp/index.d.ts.map +1 -0
  42. package/dist/mcp/index.js +13 -0
  43. package/dist/mcp/index.js.map +1 -0
  44. package/dist/mcp/manager.d.ts +50 -0
  45. package/dist/mcp/manager.d.ts.map +1 -0
  46. package/dist/mcp/manager.js +170 -0
  47. package/dist/mcp/manager.js.map +1 -0
  48. package/dist/mcp/server-registry.d.ts +48 -0
  49. package/dist/mcp/server-registry.d.ts.map +1 -0
  50. package/dist/mcp/server-registry.js +121 -0
  51. package/dist/mcp/server-registry.js.map +1 -0
  52. package/dist/mcp/tool-adapter.d.ts +42 -0
  53. package/dist/mcp/tool-adapter.d.ts.map +1 -0
  54. package/dist/mcp/tool-adapter.js +89 -0
  55. package/dist/mcp/tool-adapter.js.map +1 -0
  56. package/dist/mcp/types.d.ts +74 -0
  57. package/dist/mcp/types.d.ts.map +1 -0
  58. package/dist/mcp/types.js +21 -0
  59. package/dist/mcp/types.js.map +1 -0
  60. package/dist/permissions/index.d.ts +3 -0
  61. package/dist/permissions/index.d.ts.map +1 -0
  62. package/dist/permissions/index.js +4 -0
  63. package/dist/permissions/index.js.map +1 -0
  64. package/dist/permissions/manager.d.ts +40 -0
  65. package/dist/permissions/manager.d.ts.map +1 -0
  66. package/dist/permissions/manager.js +115 -0
  67. package/dist/permissions/manager.js.map +1 -0
  68. package/dist/permissions/types.d.ts +124 -0
  69. package/dist/permissions/types.d.ts.map +1 -0
  70. package/dist/permissions/types.js +25 -0
  71. package/dist/permissions/types.js.map +1 -0
  72. package/dist/providers/anthropic.d.ts +18 -0
  73. package/dist/providers/anthropic.d.ts.map +1 -0
  74. package/dist/providers/anthropic.js +126 -0
  75. package/dist/providers/anthropic.js.map +1 -0
  76. package/dist/providers/base.d.ts +85 -0
  77. package/dist/providers/base.d.ts.map +1 -0
  78. package/dist/providers/base.js +36 -0
  79. package/dist/providers/base.js.map +1 -0
  80. package/dist/providers/google.d.ts +12 -0
  81. package/dist/providers/google.d.ts.map +1 -0
  82. package/dist/providers/google.js +123 -0
  83. package/dist/providers/google.js.map +1 -0
  84. package/dist/providers/openai.d.ts +12 -0
  85. package/dist/providers/openai.d.ts.map +1 -0
  86. package/dist/providers/openai.js +110 -0
  87. package/dist/providers/openai.js.map +1 -0
  88. package/dist/session/factory.d.ts +156 -0
  89. package/dist/session/factory.d.ts.map +1 -0
  90. package/dist/session/factory.js +311 -0
  91. package/dist/session/factory.js.map +1 -0
  92. package/dist/session/index.d.ts +8 -0
  93. package/dist/session/index.d.ts.map +1 -0
  94. package/dist/session/index.js +7 -0
  95. package/dist/session/index.js.map +1 -0
  96. package/dist/session/session.d.ts +144 -0
  97. package/dist/session/session.d.ts.map +1 -0
  98. package/dist/session/session.js +319 -0
  99. package/dist/session/session.js.map +1 -0
  100. package/dist/session/storage.d.ts +105 -0
  101. package/dist/session/storage.d.ts.map +1 -0
  102. package/dist/session/storage.js +148 -0
  103. package/dist/session/storage.js.map +1 -0
  104. package/dist/tools/ask-user-question.d.ts +31 -0
  105. package/dist/tools/ask-user-question.d.ts.map +1 -0
  106. package/dist/tools/ask-user-question.js +66 -0
  107. package/dist/tools/ask-user-question.js.map +1 -0
  108. package/dist/tools/bash-output.d.ts +22 -0
  109. package/dist/tools/bash-output.d.ts.map +1 -0
  110. package/dist/tools/bash-output.js +43 -0
  111. package/dist/tools/bash-output.js.map +1 -0
  112. package/dist/tools/bash.d.ts +36 -0
  113. package/dist/tools/bash.d.ts.map +1 -0
  114. package/dist/tools/bash.js +161 -0
  115. package/dist/tools/bash.js.map +1 -0
  116. package/dist/tools/edit.d.ts +24 -0
  117. package/dist/tools/edit.d.ts.map +1 -0
  118. package/dist/tools/edit.js +83 -0
  119. package/dist/tools/edit.js.map +1 -0
  120. package/dist/tools/glob.d.ts +22 -0
  121. package/dist/tools/glob.d.ts.map +1 -0
  122. package/dist/tools/glob.js +248 -0
  123. package/dist/tools/glob.js.map +1 -0
  124. package/dist/tools/grep.d.ts +39 -0
  125. package/dist/tools/grep.d.ts.map +1 -0
  126. package/dist/tools/grep.js +312 -0
  127. package/dist/tools/grep.js.map +1 -0
  128. package/dist/tools/kill-bash.d.ts +19 -0
  129. package/dist/tools/kill-bash.d.ts.map +1 -0
  130. package/dist/tools/kill-bash.js +64 -0
  131. package/dist/tools/kill-bash.js.map +1 -0
  132. package/dist/tools/read.d.ts +26 -0
  133. package/dist/tools/read.d.ts.map +1 -0
  134. package/dist/tools/read.js +87 -0
  135. package/dist/tools/read.js.map +1 -0
  136. package/dist/tools/registry.d.ts +32 -0
  137. package/dist/tools/registry.d.ts.map +1 -0
  138. package/dist/tools/registry.js +91 -0
  139. package/dist/tools/registry.js.map +1 -0
  140. package/dist/tools/task-create.d.ts +22 -0
  141. package/dist/tools/task-create.d.ts.map +1 -0
  142. package/dist/tools/task-create.js +42 -0
  143. package/dist/tools/task-create.js.map +1 -0
  144. package/dist/tools/task-get.d.ts +19 -0
  145. package/dist/tools/task-get.d.ts.map +1 -0
  146. package/dist/tools/task-get.js +38 -0
  147. package/dist/tools/task-get.js.map +1 -0
  148. package/dist/tools/task-list.d.ts +18 -0
  149. package/dist/tools/task-list.d.ts.map +1 -0
  150. package/dist/tools/task-list.js +27 -0
  151. package/dist/tools/task-list.js.map +1 -0
  152. package/dist/tools/task-storage.d.ts +6 -0
  153. package/dist/tools/task-storage.d.ts.map +1 -0
  154. package/dist/tools/task-storage.js +83 -0
  155. package/dist/tools/task-storage.js.map +1 -0
  156. package/dist/tools/task-update.d.ts +28 -0
  157. package/dist/tools/task-update.d.ts.map +1 -0
  158. package/dist/tools/task-update.js +118 -0
  159. package/dist/tools/task-update.js.map +1 -0
  160. package/dist/tools/task.d.ts +80 -0
  161. package/dist/tools/task.d.ts.map +1 -0
  162. package/dist/tools/task.js +99 -0
  163. package/dist/tools/task.js.map +1 -0
  164. package/dist/tools/web-fetch.d.ts +21 -0
  165. package/dist/tools/web-fetch.d.ts.map +1 -0
  166. package/dist/tools/web-fetch.js +124 -0
  167. package/dist/tools/web-fetch.js.map +1 -0
  168. package/dist/tools/web-search.d.ts +20 -0
  169. package/dist/tools/web-search.d.ts.map +1 -0
  170. package/dist/tools/web-search.js +127 -0
  171. package/dist/tools/web-search.js.map +1 -0
  172. package/dist/tools/write.d.ts +22 -0
  173. package/dist/tools/write.d.ts.map +1 -0
  174. package/dist/tools/write.js +46 -0
  175. package/dist/tools/write.js.map +1 -0
  176. package/dist/types/messages.d.ts +138 -0
  177. package/dist/types/messages.d.ts.map +1 -0
  178. package/dist/types/messages.js +88 -0
  179. package/dist/types/messages.js.map +1 -0
  180. package/dist/types/task.d.ts +29 -0
  181. package/dist/types/task.d.ts.map +1 -0
  182. package/dist/types/task.js +5 -0
  183. package/dist/types/task.js.map +1 -0
  184. package/dist/types/tools.d.ts +56 -0
  185. package/dist/types/tools.d.ts.map +1 -0
  186. package/dist/types/tools.js +25 -0
  187. package/dist/types/tools.js.map +1 -0
  188. package/dist/utils/logger.d.ts +19 -0
  189. package/dist/utils/logger.d.ts.map +1 -0
  190. package/dist/utils/logger.js +46 -0
  191. package/dist/utils/logger.js.map +1 -0
  192. package/dist/utils/uuid.d.ts +3 -0
  193. package/dist/utils/uuid.d.ts.map +1 -0
  194. package/dist/utils/uuid.js +5 -0
  195. package/dist/utils/uuid.js.map +1 -0
  196. package/package.json +38 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Octane
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,284 @@
1
+ # Open Agent SDK
2
+
3
+ [![Build in Public](https://img.shields.io/badge/Build%20in%20Public-blue)](https://twitter.com/octane0411)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue)](https://www.typescriptlang.org/)
6
+
7
+ An open-source alternative to Claude Agent SDK — lightweight, customizable, and provider-agnostic.
8
+
9
+ [中文文档](./README.zh.md)
10
+
11
+ ---
12
+
13
+ ## What is this?
14
+
15
+ Open Agent SDK is a TypeScript framework for building AI agents. It provides a developer experience similar to Claude Agent SDK but with full transparency and no vendor lock-in.
16
+
17
+ **Key features:**
18
+ - **ReAct Loop** — Observation-thought-action cycle for autonomous agents
19
+ - **Built-in Tools** — File operations (read/write/edit), shell execution, code search (glob/grep), web search
20
+ - **Streaming Support** — Real-time response streaming with token usage tracking
21
+ - **Multi-Provider** — Works with OpenAI and Google Gemini
22
+ - **Session Management** — Persistent conversations with InMemory and File storage
23
+ - **Permission System** — 4 permission modes (default/acceptEdits/bypassPermissions/plan)
24
+ - **Hooks Framework** — Event-driven extensibility (9 hook events)
25
+ - **Subagent System** — Delegate tasks to specialized agents
26
+ - **Type Safety** — Full TypeScript support with strict type constraints
27
+ - **Cancellation** — AbortController support for interrupting long-running operations
28
+
29
+ ## Installation
30
+
31
+ ```bash
32
+ npm install open-agent-sdk
33
+ ```
34
+
35
+ Or with specific package manager:
36
+
37
+ ```bash
38
+ # npm
39
+ npm install open-agent-sdk
40
+
41
+ # yarn
42
+ yarn add open-agent-sdk
43
+
44
+ # pnpm
45
+ pnpm add open-agent-sdk
46
+
47
+ # bun
48
+ bun add open-agent-sdk
49
+ ```
50
+
51
+ **Requirements:**
52
+ - Bun >= 1.0.0 (primary runtime)
53
+ - Node.js >= 20 (with peer dependencies)
54
+ - TypeScript >= 5.0
55
+
56
+ ## Quick Start
57
+
58
+ ### Basic Usage
59
+
60
+ ```typescript
61
+ import { prompt } from 'open-agent-sdk';
62
+
63
+ const result = await prompt("What files are in the current directory?", {
64
+ model: 'gpt-4o',
65
+ apiKey: process.env.OPENAI_API_KEY,
66
+ });
67
+
68
+ console.log(result.result);
69
+ console.log(`Duration: ${result.duration_ms}ms`);
70
+ console.log(`Tokens: ${result.usage.input_tokens} in / ${result.usage.output_tokens} out`);
71
+ ```
72
+
73
+ ### Using Gemini
74
+
75
+ ```typescript
76
+ const result = await prompt("Explain quantum computing", {
77
+ model: 'gemini-2.0-flash',
78
+ provider: 'google',
79
+ apiKey: process.env.GEMINI_API_KEY,
80
+ });
81
+ ```
82
+
83
+ ### Session-Based Conversations
84
+
85
+ ```typescript
86
+ import { createSession } from 'open-agent-sdk';
87
+
88
+ const session = createSession({
89
+ model: 'gpt-4o',
90
+ apiKey: process.env.OPENAI_API_KEY,
91
+ });
92
+
93
+ // Send message
94
+ await session.send("What is 5 + 3?");
95
+
96
+ // Stream the response
97
+ for await (const message of session.stream()) {
98
+ if (message.type === 'assistant') {
99
+ console.log(message.content);
100
+ }
101
+ }
102
+
103
+ // Continue conversation (context preserved)
104
+ await session.send("Multiply that by 2");
105
+ for await (const message of session.stream()) {
106
+ console.log(message.content);
107
+ }
108
+
109
+ session.close();
110
+ ```
111
+
112
+ ### Advanced Options
113
+
114
+ ```typescript
115
+ const result = await prompt("Analyze the codebase", {
116
+ model: 'gpt-4o',
117
+ apiKey: process.env.OPENAI_API_KEY,
118
+ systemPrompt: "You are a code review assistant.",
119
+ maxTurns: 15,
120
+ allowedTools: ['Read', 'Glob', 'Grep'],
121
+ cwd: './src',
122
+ env: { NODE_ENV: 'development' },
123
+ permissionMode: 'default', // 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan'
124
+ });
125
+ ```
126
+
127
+ ### With Cancellation
128
+
129
+ ```typescript
130
+ const abortController = new AbortController();
131
+
132
+ setTimeout(() => abortController.abort(), 30000);
133
+
134
+ const result = await prompt("Long running analysis...", {
135
+ model: 'gpt-4o',
136
+ apiKey: process.env.OPENAI_API_KEY,
137
+ abortController,
138
+ });
139
+ ```
140
+
141
+ ## API Reference
142
+
143
+ ### `prompt(prompt, options)`
144
+
145
+ Execute a single prompt with the agent using the ReAct loop.
146
+
147
+ **Parameters:**
148
+ - `prompt` (`string`): User's question or task
149
+ - `options` (`PromptOptions`): Configuration object
150
+ - `model` (`string`, **required**): Model identifier
151
+ - `apiKey` (`string`): API key (defaults to env var)
152
+ - `provider` (`'openai' | 'google'`): Provider (auto-detected if not specified)
153
+ - `baseURL` (`string`): Base URL for API (OpenAI-compatible)
154
+ - `maxTurns` (`number`): Maximum conversation turns (default: 10)
155
+ - `allowedTools` (`string[]`): Allowed tools whitelist
156
+ - `systemPrompt` (`string`): System prompt
157
+ - `cwd` (`string`): Working directory (default: `process.cwd()`)
158
+ - `env` (`Record<string, string>`): Environment variables
159
+ - `abortController` (`AbortController`): Cancellation support
160
+ - `permissionMode` (`PermissionMode`): Permission mode
161
+ - `hooks` (`HooksConfig`): Event hooks configuration
162
+
163
+ **Returns:** `Promise<PromptResult>`
164
+ - `result` (`string`): Final result text
165
+ - `duration_ms` (`number`): Execution time in milliseconds
166
+ - `usage` (`object`): Token usage statistics
167
+
168
+ ### `createSession(options)` / `resumeSession(id, options)`
169
+
170
+ Create or resume a persistent conversation session.
171
+
172
+ **Methods:**
173
+ - `send(message: string): Promise<void>`
174
+ - `stream(): AsyncGenerator<SDKMessage>`
175
+ - `close(): void`
176
+
177
+ ## Built-in Tools
178
+
179
+ | Tool | Description | Parameters |
180
+ |------|-------------|------------|
181
+ | `Read` | Read file contents, supports images | `file_path`, `offset?`, `limit?` |
182
+ | `Write` | Write content to a file | `file_path`, `content` |
183
+ | `Edit` | Edit file with search/replace | `file_path`, `old_string`, `new_string` |
184
+ | `Bash` | Execute shell commands | `command`, `timeout?`, `run_in_background?` |
185
+ | `Glob` | Find files matching patterns | `pattern`, `path?` |
186
+ | `Grep` | Search code with regex | `pattern`, `path?`, `output_mode?` |
187
+ | `WebSearch` | Search the web | `query`, `numResults?` |
188
+ | `WebFetch` | Fetch webpage content | `url`, `prompt?` |
189
+ | `Task` | Delegate to subagent (includes task management) | `description`, `prompt`, `subagent_type` |
190
+
191
+ ## Provider Support
192
+
193
+ | Provider | Status | Models Tested |
194
+ |----------|--------|---------------|
195
+ | OpenAI | ✅ Supported | gpt-4o, gpt-4o-mini, gpt-4 |
196
+ | Google Gemini | ✅ Supported | gemini-2.0-flash, gemini-1.5-flash |
197
+
198
+ ## Architecture
199
+
200
+ ```
201
+ ┌─────────────────────────────────────────────────────────────┐
202
+ │ Open Agent SDK │
203
+ ├─────────────────────────────────────────────────────────────┤
204
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
205
+ │ │ prompt() │ │ Session │ │ ReActLoop │ │
206
+ │ │ (One-shot) │ │ (Persistent) │ │ (Reason + Act) │ │
207
+ │ └──────┬───────┘ └──────┬───────┘ └────────┬─────────┘ │
208
+ │ └─────────────────┴───────────────────┘ │
209
+ │ │ │
210
+ │ ┌─────────────────┼─────────────────┐ │
211
+ │ ▼ ▼ ▼ │
212
+ │ ┌────────────┐ ┌──────────────┐ ┌──────────────┐ │
213
+ │ │ Provider │ │ ToolRegistry │ │ Permission │ │
214
+ │ │(OpenAI/ │ │(Read/Write/ │ │ Manager │ │
215
+ │ │ Google) │ │ Bash/Web...) │ │(4 modes) │ │
216
+ │ └────────────┘ └──────────────┘ └──────────────┘ │
217
+ │ │ │ │ │
218
+ │ └─────────────────┴─────────────────┘ │
219
+ │ │ │
220
+ │ ┌──────▼──────┐ │
221
+ │ │HookManager │ │
222
+ │ │(9 events) │ │
223
+ │ └─────────────┘ │
224
+ └─────────────────────────────────────────────────────────────┘
225
+ ```
226
+
227
+ ## Project Status
228
+
229
+ **Current Version:** v0.1.0-alpha.0
230
+
231
+ This project is being developed in public. Follow our progress:
232
+
233
+ - Twitter: [@octane0411](https://twitter.com/octane0411)
234
+ - Discussions: [GitHub Discussions](../../discussions)
235
+
236
+ ### Roadmap
237
+
238
+ | Version | Features | Status |
239
+ |---------|----------|--------|
240
+ | v0.1.0-alpha | Core ReAct loop, 17 tools, 3 providers, Session, Hooks, Permissions | ✅ Released |
241
+ | v0.1.0-beta | Structured outputs, File checkpointing, Session forking enhancements | 🚧 In Progress |
242
+ | v0.1.0 | Stable release | 📋 Planned |
243
+ | v0.2.0 | Browser automation, Skill system, Query class | 📋 Planned |
244
+ | v1.0.0 | Full Claude Agent SDK compatibility, Python SDK | 📋 Planned |
245
+
246
+ ## Development
247
+
248
+ ```bash
249
+ # Clone the repository
250
+ git clone https://github.com/Octane0411/open-agent-sdk.git
251
+ cd open-agent-sdk
252
+
253
+ # Install dependencies
254
+ bun install
255
+
256
+ # Run tests
257
+ bun test
258
+
259
+ # Run with coverage
260
+ bun test --coverage
261
+
262
+ # Type checking
263
+ cd packages/core && npx tsc --noEmit
264
+
265
+ # Run demo
266
+ GEMINI_API_KEY=your-key bun examples/demo.ts
267
+ ```
268
+
269
+ ## Why build this?
270
+
271
+ Claude Agent SDK is excellent but closed-source. We wanted:
272
+
273
+ 1. **Full transparency** — Open code, free to customize
274
+ 2. **Provider independence** — No lock-in to a single vendor
275
+ 3. **Lightweight core** — Focused, understandable architecture
276
+ 4. **Interview-friendly** — Every design decision is explainable
277
+
278
+ ## Contributing
279
+
280
+ Contributions welcome. Please read [CONTRIBUTING.md](./CONTRIBUTING.md).
281
+
282
+ ## License
283
+
284
+ [MIT](./LICENSE) © 2026 Octane0411
package/README.zh.md ADDED
@@ -0,0 +1,285 @@
1
+ # Open Agent SDK
2
+
3
+ [![Build in Public](https://img.shields.io/badge/Build%20in%20Public-blue)](https://twitter.com/octane0411)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue)](https://www.typescriptlang.org/)
6
+
7
+ Claude Agent SDK 的开源替代品 —— 轻量、可定制、无供应商锁定。
8
+
9
+ [English Documentation](./README.md)
10
+
11
+ ---
12
+
13
+ ## 这是什么?
14
+
15
+ Open Agent SDK 是一个用于构建 AI Agent 的 TypeScript 框架。它提供了与 Claude Agent SDK 类似的开发体验,但完全开源透明,没有供应商锁定。
16
+
17
+ **核心特性:**
18
+ - **ReAct 循环** —— 观察-思考-行动的自主 Agent 循环
19
+ - **内置工具** —— 文件操作(读/写/编辑)、Shell 执行、代码搜索(Glob/Grep)、网页搜索
20
+ - **流式支持** —— 实时响应流和 Token 使用量追踪
21
+ - **多供应商** —— 支持 OpenAI 和 Google Gemini
22
+ - **会话管理** —— 支持内存和文件存储的持久化对话
23
+ - **权限系统** —— 4 种权限模式(default/acceptEdits/bypassPermissions/plan)
24
+ - **Hooks 框架** —— 事件驱动的可扩展性(9 个钩子事件)
25
+ - **子 Agent 系统** —— 将任务委托给专门的 Agent
26
+ - **类型安全** —— 完整的 TypeScript 支持,严格的类型约束
27
+ - **取消支持** —— 通过 AbortController 中断长时间运行的操作
28
+
29
+ ## 安装
30
+
31
+ ```bash
32
+ npm install open-agent-sdk
33
+ ```
34
+
35
+ 或指定包管理器:
36
+
37
+ ```bash
38
+ # npm
39
+ npm install open-agent-sdk
40
+
41
+ # yarn
42
+ yarn add open-agent-sdk
43
+
44
+ # pnpm
45
+ pnpm add open-agent-sdk
46
+
47
+ # bun
48
+ bun add open-agent-sdk
49
+ ```
50
+
51
+ **环境要求:**
52
+ - Bun >= 1.0.0(主要运行环境)
53
+ - Node.js >= 20(需安装 peer dependencies)
54
+ - TypeScript >= 5.0
55
+
56
+ ## 快速开始
57
+
58
+ ### 基础用法
59
+
60
+ ```typescript
61
+ import { prompt } from 'open-agent-sdk';
62
+
63
+ const result = await prompt("当前目录有哪些文件?", {
64
+ model: 'gpt-4o',
65
+ apiKey: process.env.OPENAI_API_KEY,
66
+ });
67
+
68
+ console.log(result.result);
69
+ console.log(`耗时: ${result.duration_ms}ms`);
70
+ console.log(`Token: ${result.usage.input_tokens} 输入 / ${result.usage.output_tokens} 输出`);
71
+ ```
72
+
73
+ ### 使用 Gemini
74
+
75
+ ```typescript
76
+ const result = await prompt("解释量子计算", {
77
+ model: 'gemini-2.0-flash',
78
+ provider: 'google',
79
+ apiKey: process.env.GEMINI_API_KEY,
80
+ });
81
+ ```
82
+
83
+ ### 基于会话的对话
84
+
85
+ ```typescript
86
+ import { createSession } from 'open-agent-sdk';
87
+
88
+ const session = createSession({
89
+ model: 'gpt-4o',
90
+ apiKey: process.env.OPENAI_API_KEY,
91
+ });
92
+
93
+ // 发送消息
94
+ await session.send("5 + 3 等于多少?");
95
+
96
+ // 流式获取响应
97
+ for await (const message of session.stream()) {
98
+ if (message.type === 'assistant') {
99
+ console.log(message.content);
100
+ }
101
+ }
102
+
103
+ // 继续对话(上下文会被保留)
104
+ await session.send("将结果乘以 2");
105
+ for await (const message of session.stream()) {
106
+ console.log(message.content);
107
+ }
108
+
109
+ session.close();
110
+ ```
111
+
112
+ ### 高级选项
113
+
114
+ ```typescript
115
+ const result = await prompt("分析代码库", {
116
+ model: 'gpt-4o',
117
+ apiKey: process.env.OPENAI_API_KEY,
118
+ systemPrompt: "你是一个代码审查助手。",
119
+ maxTurns: 15,
120
+ allowedTools: ['Read', 'Glob', 'Grep'],
121
+ cwd: './src',
122
+ env: { NODE_ENV: 'development' },
123
+ permissionMode: 'default', // 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan'
124
+ });
125
+ ```
126
+
127
+ ### 取消操作
128
+
129
+ ```typescript
130
+ const abortController = new AbortController();
131
+
132
+ // 30 秒后取消
133
+ setTimeout(() => abortController.abort(), 30000);
134
+
135
+ const result = await prompt("长时间运行的分析...", {
136
+ model: 'gpt-4o',
137
+ apiKey: process.env.OPENAI_API_KEY,
138
+ abortController,
139
+ });
140
+ ```
141
+
142
+ ## API 参考
143
+
144
+ ### `prompt(prompt, options)`
145
+
146
+ 使用 ReAct 循环执行单个提示。
147
+
148
+ **参数:**
149
+ - `prompt` (`string`): 用户的问题或任务
150
+ - `options` (`PromptOptions`): 配置对象
151
+ - `model` (`string`, **必需**): 模型标识符
152
+ - `apiKey` (`string`): API 密钥(默认从环境变量读取)
153
+ - `provider` (`'openai' | 'google'`): 供应商(未指定时自动检测)
154
+ - `baseURL` (`string`): API 基础 URL(OpenAI 兼容)
155
+ - `maxTurns` (`number`): 最大对话轮数(默认:10)
156
+ - `allowedTools` (`string[]`): 允许使用的工具白名单
157
+ - `systemPrompt` (`string`): 系统提示词
158
+ - `cwd` (`string`): 工作目录(默认:`process.cwd()`)
159
+ - `env` (`Record<string, string>`): 环境变量
160
+ - `abortController` (`AbortController`): 取消支持
161
+ - `permissionMode` (`PermissionMode`): 权限模式
162
+ - `hooks` (`HooksConfig`): 事件钩子配置
163
+
164
+ **返回:** `Promise<PromptResult>`
165
+ - `result` (`string`): 最终结果文本
166
+ - `duration_ms` (`number`): 执行时间(毫秒)
167
+ - `usage` (`object`): Token 使用统计
168
+
169
+ ### `createSession(options)` / `resumeSession(id, options)`
170
+
171
+ 创建或恢复持久化对话会话。
172
+
173
+ **方法:**
174
+ - `send(message: string): Promise<void>`
175
+ - `stream(): AsyncGenerator<SDKMessage>`
176
+ - `close(): void`
177
+
178
+ ## 内置工具
179
+
180
+ | 工具 | 描述 | 参数 |
181
+ |------|------|------|
182
+ | `Read` | 读取文件内容,支持图片 | `file_path`, `offset?`, `limit?` |
183
+ | `Write` | 写入内容到文件 | `file_path`, `content` |
184
+ | `Edit` | 使用查找替换编辑文件 | `file_path`, `old_string`, `new_string` |
185
+ | `Bash` | 执行 Shell 命令 | `command`, `timeout?`, `run_in_background?` |
186
+ | `Glob` | 查找匹配模式的文件 | `pattern`, `path?` |
187
+ | `Grep` | 使用正则搜索代码 | `pattern`, `path?`, `output_mode?` |
188
+ | `WebSearch` | 网页搜索 | `query`, `numResults?` |
189
+ | `WebFetch` | 获取网页内容 | `url`, `prompt?` |
190
+ | `Task` | 委托给子 Agent(包含任务管理) | `description`, `prompt`, `subagent_type` |
191
+
192
+ ## 供应商支持
193
+
194
+ | 供应商 | 状态 | 已测试模型 |
195
+ |--------|------|-----------|
196
+ | OpenAI | ✅ 已支持 | gpt-4o, gpt-4o-mini, gpt-4 |
197
+ | Google Gemini | ✅ 已支持 | gemini-2.0-flash, gemini-1.5-flash |
198
+
199
+ ## 架构
200
+
201
+ ```
202
+ ┌─────────────────────────────────────────────────────────────┐
203
+ │ Open Agent SDK │
204
+ ├─────────────────────────────────────────────────────────────┤
205
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
206
+ │ │ prompt() │ │ Session │ │ ReActLoop │ │
207
+ │ │ (单次) │ │ (持久化) │ │ (推理 + 行动) │ │
208
+ │ └──────┬───────┘ └──────┬───────┘ └────────┬─────────┘ │
209
+ │ └─────────────────┴───────────────────┘ │
210
+ │ │ │
211
+ │ ┌─────────────────┼─────────────────┐ │
212
+ │ ▼ ▼ ▼ │
213
+ │ ┌────────────┐ ┌──────────────┐ ┌──────────────┐ │
214
+ │ │ Provider │ │ ToolRegistry │ │ Permission │ │
215
+ │ │(OpenAI/ │ │(Read/Write/ │ │ Manager │ │
216
+ │ │ Google) │ │ Bash/Web...) │ │(4 种模式) │ │
217
+ │ └────────────┘ └──────────────┘ └──────────────┘ │
218
+ │ │ │ │ │
219
+ │ └─────────────────┴─────────────────┘ │
220
+ │ │ │
221
+ │ ┌──────▼──────┐ │
222
+ │ │HookManager │ │
223
+ │ │(9 个事件) │ │
224
+ │ └─────────────┘ │
225
+ └─────────────────────────────────────────────────────────────┘
226
+ ```
227
+
228
+ ## 项目状态
229
+
230
+ **当前版本:** v0.1.0-alpha.0
231
+
232
+ 本项目正在公开开发中。关注我们的进展:
233
+
234
+ - Twitter: [@octane0411](https://twitter.com/octane0411)
235
+ - 讨论区: [GitHub Discussions](../../discussions)
236
+
237
+ ### 路线图
238
+
239
+ | 版本 | 特性 | 状态 |
240
+ |---------|----------|--------|
241
+ | v0.1.0-alpha | 核心 ReAct 循环、17 个工具、3 个供应商、Session、Hooks、权限系统 | ✅ 已发布 |
242
+ | v0.1.0-beta | 结构化输出、文件检查点、会话分叉增强 | 🚧 开发中 |
243
+ | v0.1.0 | 稳定版本 | 📋 计划中 |
244
+ | v0.2.0 | 浏览器自动化、Skill 系统、Query 类 | 📋 计划中 |
245
+ | v1.0.0 | 完整的 Claude Agent SDK 兼容、Python SDK | 📋 计划中 |
246
+
247
+ ## 开发
248
+
249
+ ```bash
250
+ # 克隆仓库
251
+ git clone https://github.com/Octane0411/open-agent-sdk.git
252
+ cd open-agent-sdk
253
+
254
+ # 安装依赖
255
+ bun install
256
+
257
+ # 运行测试
258
+ bun test
259
+
260
+ # 覆盖率测试
261
+ bun test --coverage
262
+
263
+ # 类型检查
264
+ cd packages/core && npx tsc --noEmit
265
+
266
+ # 运行演示
267
+ GEMINI_API_KEY=your-key bun examples/demo.ts
268
+ ```
269
+
270
+ ## 为什么构建这个项目?
271
+
272
+ Claude Agent SDK 非常优秀,但是闭源的。我们想要:
273
+
274
+ 1. **完全透明** —— 代码开源,可自由定制
275
+ 2. **供应商独立** —— 不被单一供应商锁定
276
+ 3. **轻量核心** —— 专注、易理解的架构
277
+ 4. **面试友好** —— 每个设计决策都可解释
278
+
279
+ ## 贡献
280
+
281
+ 欢迎贡献。请阅读 [CONTRIBUTING.md](./CONTRIBUTING.md)。
282
+
283
+ ## 许可证
284
+
285
+ [MIT](./LICENSE) © 2026 Octane0411
@@ -0,0 +1,107 @@
1
+ /**
2
+ * AgentDefinition types and validation
3
+ * Aligned with Claude Agent SDK
4
+ */
5
+ import { z } from 'zod';
6
+ /**
7
+ * Permission modes for agent execution
8
+ */
9
+ export type PermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';
10
+ /**
11
+ * Model identifiers for subagent
12
+ * - 'sonnet' | 'opus' | 'haiku': Specific model presets
13
+ * - 'inherit': Inherit parent agent's model
14
+ */
15
+ export type ModelIdentifier = 'sonnet' | 'opus' | 'haiku' | 'inherit';
16
+ /**
17
+ * Zod schema for AgentDefinition validation
18
+ */
19
+ export declare const AgentDefinitionSchema: z.ZodObject<{
20
+ /** Natural language description of when to use this agent */
21
+ description: z.ZodString;
22
+ /** List of allowed tools (omit to inherit all from parent) */
23
+ tools: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
24
+ /** System prompt for the agent */
25
+ prompt: z.ZodString;
26
+ /** Model to use ('inherit' or omit to use parent's model) */
27
+ model: z.ZodOptional<z.ZodEnum<["sonnet", "opus", "haiku", "inherit"]>>;
28
+ /** Maximum turns for the agent (omit to use parent's maxTurns) */
29
+ maxTurns: z.ZodOptional<z.ZodNumber>;
30
+ /** Permission mode (omit to use parent's permissionMode) */
31
+ permissionMode: z.ZodOptional<z.ZodEnum<["default", "acceptEdits", "bypassPermissions", "plan"]>>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ description: string;
34
+ prompt: string;
35
+ permissionMode?: "default" | "acceptEdits" | "bypassPermissions" | "plan" | undefined;
36
+ model?: "haiku" | "inherit" | "sonnet" | "opus" | undefined;
37
+ tools?: string[] | undefined;
38
+ maxTurns?: number | undefined;
39
+ }, {
40
+ description: string;
41
+ prompt: string;
42
+ permissionMode?: "default" | "acceptEdits" | "bypassPermissions" | "plan" | undefined;
43
+ model?: "haiku" | "inherit" | "sonnet" | "opus" | undefined;
44
+ tools?: string[] | undefined;
45
+ maxTurns?: number | undefined;
46
+ }>;
47
+ /**
48
+ * Agent definition type
49
+ * Defines the configuration for a subagent
50
+ */
51
+ export type AgentDefinition = z.infer<typeof AgentDefinitionSchema>;
52
+ /**
53
+ * Collection of agent definitions
54
+ * Key is the subagent_type identifier
55
+ */
56
+ export type AgentDefinitions = Record<string, AgentDefinition>;
57
+ /**
58
+ * Validate an agent definition
59
+ * @param definition The definition to validate
60
+ * @returns The validated definition
61
+ * @throws ZodError if validation fails
62
+ */
63
+ export declare function validateAgentDefinition(definition: unknown): AgentDefinition;
64
+ /**
65
+ * Safely validate an agent definition
66
+ * @param definition The definition to validate
67
+ * @returns Object with success flag and data or error
68
+ */
69
+ export declare function safeValidateAgentDefinition(definition: unknown): {
70
+ success: true;
71
+ data: AgentDefinition;
72
+ } | {
73
+ success: false;
74
+ error: z.ZodError;
75
+ };
76
+ /**
77
+ * Create a minimal agent definition with required fields
78
+ * @param description When to use this agent
79
+ * @param prompt System prompt for the agent
80
+ * @returns AgentDefinition with required fields
81
+ */
82
+ export declare function createAgentDefinition(description: string, prompt: string): AgentDefinition;
83
+ /**
84
+ * Check if an agent definition has custom tools
85
+ * @param definition The agent definition
86
+ * @returns true if tools are explicitly defined
87
+ */
88
+ export declare function hasCustomTools(definition: AgentDefinition): boolean;
89
+ /**
90
+ * Check if an agent definition inherits parent's model
91
+ * @param definition The agent definition
92
+ * @returns true if model is 'inherit' or undefined
93
+ */
94
+ export declare function inheritsModel(definition: AgentDefinition): boolean;
95
+ /**
96
+ * Check if an agent definition has custom maxTurns
97
+ * @param definition The agent definition
98
+ * @returns true if maxTurns is explicitly defined
99
+ */
100
+ export declare function hasCustomMaxTurns(definition: AgentDefinition): boolean;
101
+ /**
102
+ * Check if an agent definition has custom permission mode
103
+ * @param definition The agent definition
104
+ * @returns true if permissionMode is explicitly defined
105
+ */
106
+ export declare function hasCustomPermissionMode(definition: AgentDefinition): boolean;
107
+ //# sourceMappingURL=agent-definition.d.ts.map