@samrahimi/smol-js 0.1.0 → 0.3.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/README.md +213 -99
- package/dist/index.d.mts +60 -1
- package/dist/index.d.ts +60 -1
- package/dist/index.js +85 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +83 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
# smol-js
|
|
2
2
|
|
|
3
|
-
A TypeScript port of the [smolagents](https://github.com/huggingface/smolagents) agentic framework
|
|
3
|
+
**A TypeScript port of the [smolagents](https://github.com/huggingface/smolagents) agentic framework.**
|
|
4
|
+
|
|
5
|
+
Build AI agents that solve tasks by writing and executing JavaScript code. The agent reasons about problems, generates code, executes it in a sandbox, observes results, and iterates until it finds the answer.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/@samrahimi/smol-js)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
9
|
|
|
5
10
|
## Features
|
|
6
11
|
|
|
7
|
-
- **
|
|
8
|
-
- **
|
|
9
|
-
- **Tool
|
|
10
|
-
- **
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
12
|
+
- **ReAct Framework**: Reasoning + Acting loop (Thought → Code → Observation → repeat)
|
|
13
|
+
- **Sandboxed Execution**: JavaScript runs in Node's vm module with state persistence
|
|
14
|
+
- **Tool System**: Extensible tools that agents can call as functions
|
|
15
|
+
- **Nested Agents**: Use agents as tools for hierarchical task delegation
|
|
16
|
+
- **Dynamic Imports**: Import npm packages on-the-fly via jsdelivr CDN
|
|
17
|
+
- **Built-in fetch()**: Agents can make HTTP requests directly in generated code
|
|
18
|
+
- **OpenAI-Compatible**: Works with OpenRouter, OpenAI, Azure, Anthropic, and local servers
|
|
19
|
+
- **Streaming**: Real-time output streaming from the LLM
|
|
20
|
+
- **Color-Coded Logging**: Beautiful terminal output with session logging to disk
|
|
21
|
+
- **Error Recovery**: Agent can recover from errors and try different approaches
|
|
15
22
|
|
|
16
23
|
## Installation
|
|
17
24
|
|
|
@@ -19,20 +26,15 @@ A TypeScript port of the [smolagents](https://github.com/huggingface/smolagents)
|
|
|
19
26
|
npm install @samrahimi/smol-js
|
|
20
27
|
```
|
|
21
28
|
|
|
22
|
-
Or with yarn:
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
yarn add @samrahimi/smol-js
|
|
26
|
-
```
|
|
27
|
-
|
|
28
29
|
## Quick Start
|
|
29
30
|
|
|
30
31
|
```typescript
|
|
32
|
+
import 'dotenv/config';
|
|
31
33
|
import { CodeAgent, OpenAIModel } from '@samrahimi/smol-js';
|
|
32
34
|
|
|
33
|
-
// Create the model (
|
|
35
|
+
// Create the model (defaults to Claude via OpenRouter)
|
|
34
36
|
const model = new OpenAIModel({
|
|
35
|
-
modelId: 'anthropic/claude-sonnet-4.5',
|
|
37
|
+
modelId: 'anthropic/claude-sonnet-4.5',
|
|
36
38
|
});
|
|
37
39
|
|
|
38
40
|
// Create the agent
|
|
@@ -43,7 +45,6 @@ const agent = new CodeAgent({
|
|
|
43
45
|
|
|
44
46
|
// Run a task
|
|
45
47
|
const result = await agent.run('Calculate the first 10 prime numbers');
|
|
46
|
-
|
|
47
48
|
console.log(result.output); // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
|
48
49
|
```
|
|
49
50
|
|
|
@@ -52,23 +53,23 @@ console.log(result.output); // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
|
|
52
53
|
### Environment Variables
|
|
53
54
|
|
|
54
55
|
```bash
|
|
55
|
-
#
|
|
56
|
-
OPENAI_API_KEY=your-
|
|
56
|
+
# API key for LLM provider (OpenRouter by default)
|
|
57
|
+
OPENAI_API_KEY=sk-or-v1-your-openrouter-key
|
|
57
58
|
|
|
58
|
-
# Or
|
|
59
|
-
|
|
59
|
+
# Or for OpenAI directly
|
|
60
|
+
OPENAI_API_KEY=sk-your-openai-key
|
|
60
61
|
```
|
|
61
62
|
|
|
62
63
|
### Model Configuration
|
|
63
64
|
|
|
64
65
|
```typescript
|
|
65
66
|
const model = new OpenAIModel({
|
|
66
|
-
modelId: '
|
|
67
|
-
apiKey: 'sk-...',
|
|
68
|
-
baseUrl: 'https://
|
|
69
|
-
maxTokens: 4096,
|
|
70
|
-
temperature: 0.7,
|
|
71
|
-
timeout: 120000,
|
|
67
|
+
modelId: 'anthropic/claude-sonnet-4.5', // Model identifier
|
|
68
|
+
apiKey: 'sk-...', // API key (or use env var)
|
|
69
|
+
baseUrl: 'https://openrouter.ai/api/v1', // API endpoint (default: OpenRouter)
|
|
70
|
+
maxTokens: 4096, // Max tokens to generate
|
|
71
|
+
temperature: 0.7, // Generation temperature
|
|
72
|
+
timeout: 120000, // Request timeout in ms
|
|
72
73
|
});
|
|
73
74
|
```
|
|
74
75
|
|
|
@@ -77,20 +78,22 @@ const model = new OpenAIModel({
|
|
|
77
78
|
```typescript
|
|
78
79
|
const agent = new CodeAgent({
|
|
79
80
|
model,
|
|
80
|
-
tools: [myTool],
|
|
81
|
-
maxSteps: 20,
|
|
82
|
-
codeExecutionDelay: 5000,
|
|
83
|
-
customInstructions: '...',
|
|
84
|
-
verboseLevel: LogLevel.INFO,
|
|
85
|
-
streamOutputs: true,
|
|
86
|
-
additionalAuthorizedImports: ['lodash'
|
|
87
|
-
workingDirectory: '/path/to/dir',
|
|
81
|
+
tools: [myTool], // Custom tools
|
|
82
|
+
maxSteps: 20, // Max iterations (default: 20)
|
|
83
|
+
codeExecutionDelay: 5000, // Safety delay before execution (default: 5000ms)
|
|
84
|
+
customInstructions: '...', // Additional system prompt instructions
|
|
85
|
+
verboseLevel: LogLevel.INFO, // Logging level (OFF, ERROR, INFO, DEBUG)
|
|
86
|
+
streamOutputs: true, // Stream LLM output in real-time
|
|
87
|
+
additionalAuthorizedImports: ['lodash'], // npm packages the agent can import
|
|
88
|
+
workingDirectory: '/path/to/dir', // Working dir for fs operations
|
|
88
89
|
});
|
|
89
90
|
```
|
|
90
91
|
|
|
91
92
|
## Creating Tools
|
|
92
93
|
|
|
93
|
-
Tools extend the agent's capabilities.
|
|
94
|
+
Tools extend the agent's capabilities. The agent sees tools as async functions it can call.
|
|
95
|
+
|
|
96
|
+
### Class-Based Tools
|
|
94
97
|
|
|
95
98
|
```typescript
|
|
96
99
|
import { Tool } from '@samrahimi/smol-js';
|
|
@@ -110,115 +113,164 @@ class WeatherTool extends Tool {
|
|
|
110
113
|
|
|
111
114
|
async execute(args: Record<string, unknown>): Promise<unknown> {
|
|
112
115
|
const city = args.city as string;
|
|
113
|
-
|
|
114
|
-
return
|
|
116
|
+
const response = await fetch(`https://api.weather.com/${city}`);
|
|
117
|
+
return response.json();
|
|
115
118
|
}
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
// Use with agent
|
|
119
121
|
const agent = new CodeAgent({
|
|
120
122
|
model,
|
|
121
123
|
tools: [new WeatherTool()],
|
|
122
124
|
});
|
|
123
125
|
```
|
|
124
126
|
|
|
125
|
-
|
|
127
|
+
### Functional Tools
|
|
126
128
|
|
|
127
129
|
```typescript
|
|
128
130
|
import { createTool } from '@samrahimi/smol-js';
|
|
129
131
|
|
|
130
|
-
const
|
|
131
|
-
name: '
|
|
132
|
-
description: '
|
|
132
|
+
const calculator = createTool({
|
|
133
|
+
name: 'calculate',
|
|
134
|
+
description: 'Evaluate a math expression',
|
|
133
135
|
inputs: {
|
|
134
|
-
|
|
135
|
-
b: { type: 'number', description: 'Second number' },
|
|
136
|
+
expression: { type: 'string', description: 'Math expression to evaluate', required: true },
|
|
136
137
|
},
|
|
137
138
|
outputType: 'number',
|
|
138
|
-
execute: async (args) =>
|
|
139
|
+
execute: async (args) => {
|
|
140
|
+
return new Function('Math', `return ${args.expression}`)(Math);
|
|
141
|
+
},
|
|
139
142
|
});
|
|
140
143
|
```
|
|
141
144
|
|
|
142
|
-
##
|
|
145
|
+
## Nested Agents (Agent as Tool)
|
|
143
146
|
|
|
144
|
-
|
|
147
|
+
Use agents as tools for hierarchical task delegation. A "manager" agent can delegate specialized tasks to "worker" agents.
|
|
145
148
|
|
|
146
149
|
```typescript
|
|
147
|
-
|
|
150
|
+
import { CodeAgent, OpenAIModel, AgentTool, agentAsTool } from '@samrahimi/smol-js';
|
|
151
|
+
|
|
152
|
+
// Create a specialized worker agent
|
|
153
|
+
const mathAgent = new CodeAgent({
|
|
148
154
|
model,
|
|
149
|
-
|
|
155
|
+
tools: [calculatorTool],
|
|
156
|
+
maxSteps: 5,
|
|
157
|
+
verboseLevel: LogLevel.OFF, // Quiet - manager reports results
|
|
150
158
|
});
|
|
151
159
|
|
|
152
|
-
//
|
|
153
|
-
|
|
154
|
-
|
|
160
|
+
// Wrap it as a tool
|
|
161
|
+
const mathExpert = new AgentTool({
|
|
162
|
+
agent: mathAgent,
|
|
163
|
+
name: 'math_expert',
|
|
164
|
+
description: 'Delegate math problems to a specialized math agent',
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Or use the helper function
|
|
168
|
+
const mathExpert = agentAsTool(mathAgent, {
|
|
169
|
+
name: 'math_expert',
|
|
170
|
+
description: 'Delegate math problems to a specialized math agent',
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Create manager that uses the worker
|
|
174
|
+
const manager = new CodeAgent({
|
|
175
|
+
model,
|
|
176
|
+
tools: [mathExpert, researchExpert], // Agents as tools!
|
|
177
|
+
maxSteps: 10,
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
await manager.run('Research Tokyo population and calculate water consumption');
|
|
155
181
|
```
|
|
156
182
|
|
|
157
|
-
|
|
183
|
+
## Using fetch() Directly
|
|
158
184
|
|
|
159
|
-
|
|
185
|
+
Agents can make HTTP requests directly in their code without needing a tool:
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
const agent = new CodeAgent({
|
|
189
|
+
model,
|
|
190
|
+
tools: [], // No tools needed!
|
|
191
|
+
customInstructions: `You can use fetch() directly to make HTTP requests.
|
|
192
|
+
Example: const data = await fetch('https://api.example.com').then(r => r.json());`,
|
|
193
|
+
});
|
|
160
194
|
|
|
161
|
-
|
|
195
|
+
await agent.run('Fetch users from https://jsonplaceholder.typicode.com/users');
|
|
196
|
+
```
|
|
162
197
|
|
|
163
|
-
|
|
164
|
-
- `fs` - File system operations (read, write, mkdir, etc.)
|
|
165
|
-
- `path` - Path utilities
|
|
166
|
-
- `fetch()` - HTTP requests
|
|
167
|
-
- `JSON`, `Math`, `Date` - Standard JavaScript globals
|
|
168
|
-
- `final_answer(value)` - Return the final result
|
|
198
|
+
## Dynamic npm Imports
|
|
169
199
|
|
|
170
|
-
|
|
200
|
+
The agent can import npm packages dynamically:
|
|
171
201
|
|
|
172
202
|
```typescript
|
|
173
|
-
|
|
203
|
+
const agent = new CodeAgent({
|
|
204
|
+
model,
|
|
205
|
+
additionalAuthorizedImports: ['lodash', 'dayjs', 'uuid'],
|
|
206
|
+
});
|
|
174
207
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
LogLevel.DEBUG // Detailed debugging
|
|
208
|
+
// The agent can now write:
|
|
209
|
+
// const _ = await importPackage('lodash');
|
|
210
|
+
// const dayjs = await importPackage('dayjs');
|
|
179
211
|
```
|
|
180
212
|
|
|
181
|
-
|
|
213
|
+
Packages are fetched from [jsdelivr CDN](https://www.jsdelivr.com/) and cached locally in `~/.smol-js/packages/`.
|
|
182
214
|
|
|
183
|
-
|
|
215
|
+
## Built-in Capabilities
|
|
184
216
|
|
|
185
|
-
|
|
217
|
+
The agent's sandbox includes:
|
|
186
218
|
|
|
187
|
-
|
|
219
|
+
| Category | Available |
|
|
220
|
+
|----------|-----------|
|
|
221
|
+
| **Output** | `console.log()`, `console.error()`, `print()` |
|
|
222
|
+
| **HTTP** | `fetch()`, `URL`, `URLSearchParams` |
|
|
223
|
+
| **File System** | `fs.readFileSync()`, `fs.writeFileSync()`, `fs.existsSync()`, etc. |
|
|
224
|
+
| **Path** | `path.join()`, `path.resolve()`, `path.dirname()`, etc. |
|
|
225
|
+
| **Data** | `JSON`, `Buffer`, `TextEncoder`, `TextDecoder` |
|
|
226
|
+
| **Math** | `Math.*`, `parseInt()`, `parseFloat()` |
|
|
227
|
+
| **Types** | `Object`, `Array`, `Map`, `Set`, `Date`, `RegExp`, `Promise` |
|
|
228
|
+
| **Timers** | `setTimeout()`, `setInterval()` |
|
|
229
|
+
| **Final** | `final_answer(value)` - Return the result |
|
|
188
230
|
|
|
189
|
-
|
|
190
|
-
2. **02-dynamic-imports.ts** - Using npm packages dynamically
|
|
191
|
-
3. **03-variable-persistence.ts** - Multi-step state management
|
|
192
|
-
4. **04-research-with-tools.ts** - Custom tools for research tasks
|
|
193
|
-
5. **05-error-recovery.ts** - Handling and recovering from errors
|
|
231
|
+
## Examples
|
|
194
232
|
|
|
195
|
-
|
|
233
|
+
The `examples/` folder contains complete, runnable examples:
|
|
196
234
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
235
|
+
| Example | Description |
|
|
236
|
+
|---------|-------------|
|
|
237
|
+
| **01-simple-math.ts** | Basic calculation task |
|
|
238
|
+
| **02-dynamic-imports.ts** | Using npm packages dynamically |
|
|
239
|
+
| **03-variable-persistence.ts** | Multi-step state management |
|
|
240
|
+
| **04-research-with-tools.ts** | Custom tools for research tasks |
|
|
241
|
+
| **05-error-recovery.ts** | Handling and recovering from errors |
|
|
242
|
+
| **06-deep-research.ts** | Real API calls with DuckDuckGo/Wikipedia |
|
|
243
|
+
| **07-npm-package-import.ts** | Importing from the published npm package |
|
|
244
|
+
| **08-fetch-agent.ts** | Agent using fetch() directly (no tools) |
|
|
245
|
+
| **09-nested-agents.ts** | Manager agent delegating to worker agents |
|
|
200
246
|
|
|
201
|
-
|
|
247
|
+
Run an example:
|
|
202
248
|
|
|
203
249
|
```bash
|
|
204
|
-
npx tsx examples/
|
|
250
|
+
npx tsx examples/08-fetch-agent.ts
|
|
205
251
|
```
|
|
206
252
|
|
|
207
253
|
## API Reference
|
|
208
254
|
|
|
209
255
|
### CodeAgent
|
|
210
256
|
|
|
211
|
-
Main agent class that generates and executes JavaScript code.
|
|
212
|
-
|
|
213
257
|
```typescript
|
|
214
258
|
class CodeAgent {
|
|
215
259
|
constructor(config: CodeAgentConfig)
|
|
260
|
+
|
|
261
|
+
// Run a task
|
|
216
262
|
run(task: string, reset?: boolean): Promise<RunResult>
|
|
263
|
+
|
|
264
|
+
// Control
|
|
217
265
|
stop(): void
|
|
218
266
|
reset(): void
|
|
267
|
+
|
|
268
|
+
// Tools
|
|
219
269
|
addTool(tool: Tool): void
|
|
220
270
|
removeTool(name: string): boolean
|
|
221
271
|
getTools(): Map<string, Tool>
|
|
272
|
+
|
|
273
|
+
// State
|
|
222
274
|
getMemory(): AgentMemory
|
|
223
275
|
getExecutor(): LocalExecutor
|
|
224
276
|
}
|
|
@@ -228,10 +280,10 @@ class CodeAgent {
|
|
|
228
280
|
|
|
229
281
|
```typescript
|
|
230
282
|
interface RunResult {
|
|
231
|
-
output: unknown;
|
|
232
|
-
steps: MemoryStep[];
|
|
233
|
-
tokenUsage: TokenUsage;
|
|
234
|
-
duration: number;
|
|
283
|
+
output: unknown; // Final answer
|
|
284
|
+
steps: MemoryStep[]; // Execution history
|
|
285
|
+
tokenUsage: TokenUsage; // Token counts
|
|
286
|
+
duration: number; // Total time in ms
|
|
235
287
|
}
|
|
236
288
|
```
|
|
237
289
|
|
|
@@ -245,10 +297,30 @@ abstract class Tool {
|
|
|
245
297
|
abstract readonly outputType: string;
|
|
246
298
|
|
|
247
299
|
abstract execute(args: Record<string, unknown>): Promise<unknown>;
|
|
248
|
-
|
|
300
|
+
|
|
301
|
+
setup(): Promise<void>; // Optional async initialization
|
|
249
302
|
call(args: Record<string, unknown>): Promise<unknown>;
|
|
250
|
-
toCodePrompt(): string;
|
|
303
|
+
toCodePrompt(): string; // Generate function signature for prompt
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### AgentTool
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
class AgentTool extends Tool {
|
|
311
|
+
constructor(config: AgentToolConfig)
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
interface AgentToolConfig {
|
|
315
|
+
agent: Agent; // The agent to wrap
|
|
316
|
+
name?: string; // Tool name (default: 'managed_agent')
|
|
317
|
+
description?: string; // Tool description
|
|
318
|
+
additionalContext?: string; // Extra context for the agent
|
|
319
|
+
returnFullResult?: boolean; // Return full result vs just output
|
|
251
320
|
}
|
|
321
|
+
|
|
322
|
+
// Helper function
|
|
323
|
+
function agentAsTool(agent: Agent, options?: Omit<AgentToolConfig, 'agent'>): AgentTool
|
|
252
324
|
```
|
|
253
325
|
|
|
254
326
|
### LocalExecutor
|
|
@@ -256,35 +328,77 @@ abstract class Tool {
|
|
|
256
328
|
```typescript
|
|
257
329
|
class LocalExecutor {
|
|
258
330
|
constructor(config?: ExecutorConfig)
|
|
331
|
+
|
|
259
332
|
execute(code: string): Promise<CodeExecutionOutput>
|
|
260
333
|
sendTools(tools: Record<string, Tool>): void
|
|
261
334
|
sendVariables(variables: Record<string, unknown>): void
|
|
262
335
|
reset(): void
|
|
263
336
|
getState(): Record<string, unknown>
|
|
264
337
|
}
|
|
338
|
+
|
|
339
|
+
interface ExecutorConfig {
|
|
340
|
+
timeout?: number; // Execution timeout (default: 30000ms)
|
|
341
|
+
authorizedImports?: string[]; // Allowed npm packages
|
|
342
|
+
allowFs?: boolean; // Enable fs access (default: true)
|
|
343
|
+
workingDirectory?: string; // Working dir for fs operations
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### LogLevel
|
|
348
|
+
|
|
349
|
+
```typescript
|
|
350
|
+
enum LogLevel {
|
|
351
|
+
OFF = 0, // No output
|
|
352
|
+
ERROR = 1, // Errors only
|
|
353
|
+
INFO = 2, // Normal output (default)
|
|
354
|
+
DEBUG = 3, // Detailed debugging
|
|
355
|
+
}
|
|
265
356
|
```
|
|
266
357
|
|
|
267
|
-
##
|
|
358
|
+
## Session Logging
|
|
359
|
+
|
|
360
|
+
All sessions are logged to `~/.smol-js/`:
|
|
361
|
+
- `session-<timestamp>.log` - Full session transcript
|
|
362
|
+
- `packages/` - Cached npm packages
|
|
363
|
+
|
|
364
|
+
## Comparison with Python smolagents
|
|
268
365
|
|
|
269
366
|
| Feature | Python smolagents | smol-js |
|
|
270
367
|
|---------|------------------|---------|
|
|
271
368
|
| Code execution | Python interpreter | Node.js vm module |
|
|
272
369
|
| Imports | `import` statement | `await importPackage()` |
|
|
273
370
|
| Tool definition | `@tool` decorator | Class extending `Tool` |
|
|
371
|
+
| Nested agents | `ManagedAgent` | `AgentTool` |
|
|
274
372
|
| Async support | Optional | All tools are async |
|
|
373
|
+
| HTTP requests | Requires tool | Built-in `fetch()` |
|
|
275
374
|
| Remote executors | E2B, Docker, etc. | Local only (for now) |
|
|
276
|
-
| Agent types | CodeAgent, ToolCallingAgent | CodeAgent only
|
|
375
|
+
| Agent types | CodeAgent, ToolCallingAgent | CodeAgent only |
|
|
376
|
+
| Multi-agent | Yes | Yes (via AgentTool) |
|
|
277
377
|
|
|
278
378
|
## Security Considerations
|
|
279
379
|
|
|
280
|
-
- Code
|
|
281
|
-
- Only
|
|
282
|
-
- File
|
|
283
|
-
- Configurable execution
|
|
380
|
+
- **Sandboxed Execution**: Code runs in Node's vm module, isolated from the main process
|
|
381
|
+
- **Authorized Imports**: Only explicitly allowed npm packages can be imported
|
|
382
|
+
- **File System Isolation**: fs operations are restricted to the configured working directory
|
|
383
|
+
- **Execution Delay**: Configurable delay before code execution allows user interruption (Ctrl+C)
|
|
384
|
+
- **Timeout Protection**: Code execution has a configurable timeout (default: 30s)
|
|
284
385
|
|
|
285
386
|
## Contributing
|
|
286
387
|
|
|
287
|
-
Contributions are welcome! Please open an issue or PR.
|
|
388
|
+
Contributions are welcome! Please open an issue or PR on GitHub.
|
|
389
|
+
|
|
390
|
+
```bash
|
|
391
|
+
# Clone and install
|
|
392
|
+
git clone https://github.com/samrahimi/smol-js
|
|
393
|
+
cd smol-js
|
|
394
|
+
npm install
|
|
395
|
+
|
|
396
|
+
# Run tests
|
|
397
|
+
npm test
|
|
398
|
+
|
|
399
|
+
# Run examples
|
|
400
|
+
npx tsx examples/01-simple-math.ts
|
|
401
|
+
```
|
|
288
402
|
|
|
289
403
|
## License
|
|
290
404
|
|
package/dist/index.d.mts
CHANGED
|
@@ -767,6 +767,65 @@ declare class UserInputTool extends Tool {
|
|
|
767
767
|
}
|
|
768
768
|
declare const finalAnswerTool: FinalAnswerTool;
|
|
769
769
|
|
|
770
|
+
/**
|
|
771
|
+
* AgentTool - Wraps a CodeAgent as a Tool for use by other agents
|
|
772
|
+
*
|
|
773
|
+
* This enables nested/hierarchical agent architectures where a "manager" agent
|
|
774
|
+
* can delegate tasks to specialized "worker" agents.
|
|
775
|
+
*
|
|
776
|
+
* Based on the ManagedAgent pattern from Python smolagents.
|
|
777
|
+
*/
|
|
778
|
+
|
|
779
|
+
interface AgentToolConfig {
|
|
780
|
+
/**
|
|
781
|
+
* The agent to wrap as a tool
|
|
782
|
+
*/
|
|
783
|
+
agent: Agent;
|
|
784
|
+
/**
|
|
785
|
+
* Name for the tool (defaults to agent's name or "managed_agent")
|
|
786
|
+
*/
|
|
787
|
+
name?: string;
|
|
788
|
+
/**
|
|
789
|
+
* Description of what this agent does (used in parent agent's prompt)
|
|
790
|
+
*/
|
|
791
|
+
description?: string;
|
|
792
|
+
/**
|
|
793
|
+
* Additional context to provide to the agent with each task
|
|
794
|
+
*/
|
|
795
|
+
additionalContext?: string;
|
|
796
|
+
/**
|
|
797
|
+
* Whether to provide the full result object or just the output
|
|
798
|
+
* @default false
|
|
799
|
+
*/
|
|
800
|
+
returnFullResult?: boolean;
|
|
801
|
+
}
|
|
802
|
+
declare class AgentTool extends Tool {
|
|
803
|
+
readonly name: string;
|
|
804
|
+
readonly description: string;
|
|
805
|
+
readonly inputs: ToolInputs;
|
|
806
|
+
readonly outputType = "string";
|
|
807
|
+
private agent;
|
|
808
|
+
private additionalContext?;
|
|
809
|
+
private returnFullResult;
|
|
810
|
+
constructor(config: AgentToolConfig);
|
|
811
|
+
/**
|
|
812
|
+
* Generate a default description based on the agent's configuration
|
|
813
|
+
*/
|
|
814
|
+
private generateDescription;
|
|
815
|
+
/**
|
|
816
|
+
* Execute the agent with the given task
|
|
817
|
+
*/
|
|
818
|
+
execute(args: Record<string, unknown>): Promise<unknown>;
|
|
819
|
+
/**
|
|
820
|
+
* Override toCodePrompt to provide a cleaner signature for nested agents
|
|
821
|
+
*/
|
|
822
|
+
toCodePrompt(): string;
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Helper function to quickly wrap an agent as a tool
|
|
826
|
+
*/
|
|
827
|
+
declare function agentAsTool(agent: Agent, options?: Omit<AgentToolConfig, 'agent'>): AgentTool;
|
|
828
|
+
|
|
770
829
|
/**
|
|
771
830
|
* System prompts for CodeAgent
|
|
772
831
|
*
|
|
@@ -790,4 +849,4 @@ declare const FINAL_ANSWER_PROMPT = "Based on the steps you've taken so far, pro
|
|
|
790
849
|
*/
|
|
791
850
|
declare function getErrorRecoveryPrompt(error: string): string;
|
|
792
851
|
|
|
793
|
-
export { type ActionOutput, type ActionStep, Agent, type AgentConfig, type AgentConfig$1 as AgentConfigType, AgentLogger, AgentMemory, type ChatMessage, CodeAgent, type CodeAgentConfig, type CodeExecutionOutput, type ExecutorConfig, FINAL_ANSWER_PROMPT, type FinalAnswerStep, FinalAnswerTool, type GenerateOptions, LocalExecutor, LogLevel, type MemoryStep, type MessageRole, Model, type ModelConfig, OpenAIModel, type OpenAIModelConfig, type PromptVariables, type RunResult, type StreamEvent, type SystemPromptStep, type TaskStep, type Timing, type TokenUsage, Tool, type ToolCall, type ToolInput, type ToolInputType, type ToolInputs, UserInputTool, createTool, finalAnswerTool, generateSystemPrompt, getErrorRecoveryPrompt };
|
|
852
|
+
export { type ActionOutput, type ActionStep, Agent, type AgentConfig, type AgentConfig$1 as AgentConfigType, AgentLogger, AgentMemory, AgentTool, type AgentToolConfig, type ChatMessage, CodeAgent, type CodeAgentConfig, type CodeExecutionOutput, type ExecutorConfig, FINAL_ANSWER_PROMPT, type FinalAnswerStep, FinalAnswerTool, type GenerateOptions, LocalExecutor, LogLevel, type MemoryStep, type MessageRole, Model, type ModelConfig, OpenAIModel, type OpenAIModelConfig, type PromptVariables, type RunResult, type StreamEvent, type SystemPromptStep, type TaskStep, type Timing, type TokenUsage, Tool, type ToolCall, type ToolInput, type ToolInputType, type ToolInputs, UserInputTool, agentAsTool, createTool, finalAnswerTool, generateSystemPrompt, getErrorRecoveryPrompt };
|
package/dist/index.d.ts
CHANGED
|
@@ -767,6 +767,65 @@ declare class UserInputTool extends Tool {
|
|
|
767
767
|
}
|
|
768
768
|
declare const finalAnswerTool: FinalAnswerTool;
|
|
769
769
|
|
|
770
|
+
/**
|
|
771
|
+
* AgentTool - Wraps a CodeAgent as a Tool for use by other agents
|
|
772
|
+
*
|
|
773
|
+
* This enables nested/hierarchical agent architectures where a "manager" agent
|
|
774
|
+
* can delegate tasks to specialized "worker" agents.
|
|
775
|
+
*
|
|
776
|
+
* Based on the ManagedAgent pattern from Python smolagents.
|
|
777
|
+
*/
|
|
778
|
+
|
|
779
|
+
interface AgentToolConfig {
|
|
780
|
+
/**
|
|
781
|
+
* The agent to wrap as a tool
|
|
782
|
+
*/
|
|
783
|
+
agent: Agent;
|
|
784
|
+
/**
|
|
785
|
+
* Name for the tool (defaults to agent's name or "managed_agent")
|
|
786
|
+
*/
|
|
787
|
+
name?: string;
|
|
788
|
+
/**
|
|
789
|
+
* Description of what this agent does (used in parent agent's prompt)
|
|
790
|
+
*/
|
|
791
|
+
description?: string;
|
|
792
|
+
/**
|
|
793
|
+
* Additional context to provide to the agent with each task
|
|
794
|
+
*/
|
|
795
|
+
additionalContext?: string;
|
|
796
|
+
/**
|
|
797
|
+
* Whether to provide the full result object or just the output
|
|
798
|
+
* @default false
|
|
799
|
+
*/
|
|
800
|
+
returnFullResult?: boolean;
|
|
801
|
+
}
|
|
802
|
+
declare class AgentTool extends Tool {
|
|
803
|
+
readonly name: string;
|
|
804
|
+
readonly description: string;
|
|
805
|
+
readonly inputs: ToolInputs;
|
|
806
|
+
readonly outputType = "string";
|
|
807
|
+
private agent;
|
|
808
|
+
private additionalContext?;
|
|
809
|
+
private returnFullResult;
|
|
810
|
+
constructor(config: AgentToolConfig);
|
|
811
|
+
/**
|
|
812
|
+
* Generate a default description based on the agent's configuration
|
|
813
|
+
*/
|
|
814
|
+
private generateDescription;
|
|
815
|
+
/**
|
|
816
|
+
* Execute the agent with the given task
|
|
817
|
+
*/
|
|
818
|
+
execute(args: Record<string, unknown>): Promise<unknown>;
|
|
819
|
+
/**
|
|
820
|
+
* Override toCodePrompt to provide a cleaner signature for nested agents
|
|
821
|
+
*/
|
|
822
|
+
toCodePrompt(): string;
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Helper function to quickly wrap an agent as a tool
|
|
826
|
+
*/
|
|
827
|
+
declare function agentAsTool(agent: Agent, options?: Omit<AgentToolConfig, 'agent'>): AgentTool;
|
|
828
|
+
|
|
770
829
|
/**
|
|
771
830
|
* System prompts for CodeAgent
|
|
772
831
|
*
|
|
@@ -790,4 +849,4 @@ declare const FINAL_ANSWER_PROMPT = "Based on the steps you've taken so far, pro
|
|
|
790
849
|
*/
|
|
791
850
|
declare function getErrorRecoveryPrompt(error: string): string;
|
|
792
851
|
|
|
793
|
-
export { type ActionOutput, type ActionStep, Agent, type AgentConfig, type AgentConfig$1 as AgentConfigType, AgentLogger, AgentMemory, type ChatMessage, CodeAgent, type CodeAgentConfig, type CodeExecutionOutput, type ExecutorConfig, FINAL_ANSWER_PROMPT, type FinalAnswerStep, FinalAnswerTool, type GenerateOptions, LocalExecutor, LogLevel, type MemoryStep, type MessageRole, Model, type ModelConfig, OpenAIModel, type OpenAIModelConfig, type PromptVariables, type RunResult, type StreamEvent, type SystemPromptStep, type TaskStep, type Timing, type TokenUsage, Tool, type ToolCall, type ToolInput, type ToolInputType, type ToolInputs, UserInputTool, createTool, finalAnswerTool, generateSystemPrompt, getErrorRecoveryPrompt };
|
|
852
|
+
export { type ActionOutput, type ActionStep, Agent, type AgentConfig, type AgentConfig$1 as AgentConfigType, AgentLogger, AgentMemory, AgentTool, type AgentToolConfig, type ChatMessage, CodeAgent, type CodeAgentConfig, type CodeExecutionOutput, type ExecutorConfig, FINAL_ANSWER_PROMPT, type FinalAnswerStep, FinalAnswerTool, type GenerateOptions, LocalExecutor, LogLevel, type MemoryStep, type MessageRole, Model, type ModelConfig, OpenAIModel, type OpenAIModelConfig, type PromptVariables, type RunResult, type StreamEvent, type SystemPromptStep, type TaskStep, type Timing, type TokenUsage, Tool, type ToolCall, type ToolInput, type ToolInputType, type ToolInputs, UserInputTool, agentAsTool, createTool, finalAnswerTool, generateSystemPrompt, getErrorRecoveryPrompt };
|