llm-advanced-tools 0.1.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 +402 -0
- package/dist/adapters/index.d.ts +3 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openai.d.ts +38 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +170 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/adapters/vercel-ai.d.ts +46 -0
- package/dist/adapters/vercel-ai.d.ts.map +1 -0
- package/dist/adapters/vercel-ai.js +228 -0
- package/dist/adapters/vercel-ai.js.map +1 -0
- package/dist/core/client.d.ts +36 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +188 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/registry.d.ts +64 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +169 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/executor/base.d.ts +35 -0
- package/dist/executor/base.d.ts.map +1 -0
- package/dist/executor/base.js +85 -0
- package/dist/executor/base.js.map +1 -0
- package/dist/executor/index.d.ts +3 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +9 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/vm.d.ts +18 -0
- package/dist/executor/vm.d.ts.map +1 -0
- package/dist/executor/vm.js +106 -0
- package/dist/executor/vm.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/search/base.d.ts +32 -0
- package/dist/search/base.d.ts.map +1 -0
- package/dist/search/base.js +28 -0
- package/dist/search/base.js.map +1 -0
- package/dist/search/bm25.d.ts +16 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +84 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/index.d.ts +4 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +10 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/regex.d.ts +12 -0
- package/dist/search/regex.d.ts.map +1 -0
- package/dist/search/regex.js +57 -0
- package/dist/search/regex.js.map +1 -0
- package/dist/types/index.d.ts +186 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +52 -0
- package/plan.md +576 -0
- package/src/adapters/index.ts +2 -0
- package/src/adapters/openai.ts +195 -0
- package/src/adapters/vercel-ai.ts +270 -0
- package/src/core/client.ts +232 -0
- package/src/core/index.ts +2 -0
- package/src/core/registry.ts +198 -0
- package/src/executor/base.ts +122 -0
- package/src/executor/index.ts +2 -0
- package/src/executor/vm.ts +87 -0
- package/src/index.ts +26 -0
- package/src/search/base.ts +63 -0
- package/src/search/bm25.ts +64 -0
- package/src/search/index.ts +3 -0
- package/src/search/regex.ts +66 -0
- package/src/types/index.ts +221 -0
- package/test-advanced.ts +212 -0
- package/test-simple.ts +91 -0
package/README.md
ADDED
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
# Advanced Tools - Provider-Agnostic LLM Tool Use Library
|
|
2
|
+
|
|
3
|
+
A TypeScript library that brings Anthropic's advanced tool use features to all major LLM providers (OpenAI, Google, Anthropic, Ollama, etc.).
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
### 🔍 Tool Search Tool
|
|
8
|
+
Dynamically discover and load tools on-demand instead of loading everything upfront.
|
|
9
|
+
|
|
10
|
+
**Benefits:**
|
|
11
|
+
- 85%+ reduction in token usage
|
|
12
|
+
- Improved accuracy with large tool sets
|
|
13
|
+
- Scale to hundreds or thousands of tools
|
|
14
|
+
|
|
15
|
+
### 🚀 Programmatic Tool Calling
|
|
16
|
+
Orchestrate tools through code execution rather than individual API calls.
|
|
17
|
+
|
|
18
|
+
**Benefits:**
|
|
19
|
+
- Keep intermediate results out of LLM context
|
|
20
|
+
- Parallel tool execution
|
|
21
|
+
- Better control flow with loops, conditionals, data transformations
|
|
22
|
+
- 37%+ reduction in token usage on complex tasks
|
|
23
|
+
|
|
24
|
+
### 📝 Tool Use Examples
|
|
25
|
+
Provide sample invocations to improve tool call accuracy.
|
|
26
|
+
|
|
27
|
+
**Benefits:**
|
|
28
|
+
- 18%+ accuracy improvement on complex parameters
|
|
29
|
+
- Show proper usage patterns
|
|
30
|
+
- Clarify format conventions and optional parameters
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install advanced-tools
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Quick Start
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { Client, ToolRegistry, OpenAIAdapter, ToolDefinition } from 'advanced-tools';
|
|
42
|
+
|
|
43
|
+
// 1. Create a tool registry
|
|
44
|
+
const registry = new ToolRegistry({
|
|
45
|
+
strategy: 'smart', // 'smart', 'keyword', or 'custom'
|
|
46
|
+
maxResults: 5
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// 2. Define tools with advanced features
|
|
50
|
+
const weatherTool: ToolDefinition = {
|
|
51
|
+
name: 'get_weather',
|
|
52
|
+
description: 'Get current weather for a location',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
location: { type: 'string' },
|
|
57
|
+
units: { type: 'string', enum: ['celsius', 'fahrenheit'] }
|
|
58
|
+
},
|
|
59
|
+
required: ['location']
|
|
60
|
+
},
|
|
61
|
+
// Tool Use Examples - improve accuracy
|
|
62
|
+
inputExamples: [
|
|
63
|
+
{ location: 'San Francisco', units: 'fahrenheit' },
|
|
64
|
+
{ location: 'Tokyo', units: 'celsius' }
|
|
65
|
+
],
|
|
66
|
+
// Defer loading - only load when searched
|
|
67
|
+
deferLoading: true,
|
|
68
|
+
// Allow programmatic calling
|
|
69
|
+
allowedCallers: ['code_execution'],
|
|
70
|
+
handler: async (input) => {
|
|
71
|
+
// Your implementation
|
|
72
|
+
return { temp: 72, conditions: 'Sunny' };
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
registry.register(weatherTool);
|
|
77
|
+
|
|
78
|
+
// 3. Create client with any provider
|
|
79
|
+
const client = new Client({
|
|
80
|
+
adapter: new OpenAIAdapter(process.env.OPENAI_API_KEY!),
|
|
81
|
+
enableToolSearch: true,
|
|
82
|
+
enableProgrammaticCalling: true
|
|
83
|
+
}, registry);
|
|
84
|
+
|
|
85
|
+
// 4. Chat!
|
|
86
|
+
const response = await client.ask("What's the weather in SF?");
|
|
87
|
+
console.log(response);
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Quick Start with Vercel AI SDK (v4.x)
|
|
91
|
+
|
|
92
|
+
Use the latest Vercel AI SDK with any provider:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import { Client, ToolRegistry, VercelAIAdapter } from 'advanced-tools';
|
|
96
|
+
import { openai } from '@ai-sdk/openai';
|
|
97
|
+
import { anthropic } from '@ai-sdk/anthropic';
|
|
98
|
+
|
|
99
|
+
const registry = new ToolRegistry({ strategy: 'smart' });
|
|
100
|
+
|
|
101
|
+
// Register your tools...
|
|
102
|
+
registry.register(weatherTool);
|
|
103
|
+
|
|
104
|
+
// Use with OpenAI
|
|
105
|
+
const openaiClient = new Client({
|
|
106
|
+
adapter: new VercelAIAdapter(openai('gpt-4o-mini')),
|
|
107
|
+
enableToolSearch: true,
|
|
108
|
+
enableProgrammaticCalling: true
|
|
109
|
+
}, registry);
|
|
110
|
+
|
|
111
|
+
// Or switch to Anthropic with one line!
|
|
112
|
+
const claudeClient = new Client({
|
|
113
|
+
adapter: new VercelAIAdapter(anthropic('claude-3-5-sonnet-20241022')),
|
|
114
|
+
enableToolSearch: true,
|
|
115
|
+
enableProgrammaticCalling: true
|
|
116
|
+
}, registry);
|
|
117
|
+
|
|
118
|
+
const response = await openaiClient.ask("What's the weather?");
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Benefits of Vercel AI SDK Adapter:**
|
|
122
|
+
- ✅ One interface for all providers (OpenAI, Anthropic, Google, etc.)
|
|
123
|
+
- ✅ Switch providers by changing one line
|
|
124
|
+
- ✅ Advanced features work across all providers
|
|
125
|
+
- ✅ Latest AI SDK v4.x support
|
|
126
|
+
|
|
127
|
+
## Architecture
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
┌─────────────────────────────────────────────────────────┐
|
|
131
|
+
│ Your Application │
|
|
132
|
+
└─────────────────────────────────────────────────────────┘
|
|
133
|
+
│
|
|
134
|
+
▼
|
|
135
|
+
┌─────────────────────────────────────────────────────────┐
|
|
136
|
+
│ Unified Tool Interface │
|
|
137
|
+
│ • ToolRegistry (search, defer loading) │
|
|
138
|
+
│ • CodeExecutor (programmatic calling) │
|
|
139
|
+
│ • ToolDefinition (with examples) │
|
|
140
|
+
└─────────────────────────────────────────────────────────┘
|
|
141
|
+
│
|
|
142
|
+
▼
|
|
143
|
+
┌─────────────────────────────────────────────────────────┐
|
|
144
|
+
│ Provider Adapters │
|
|
145
|
+
│ ┌──────────┬──────────┬──────────┬──────────┐ │
|
|
146
|
+
│ │ OpenAI │Anthropic │ Google │ Ollama │ │
|
|
147
|
+
│ └──────────┴──────────┴──────────┴──────────┘ │
|
|
148
|
+
└─────────────────────────────────────────────────────────┘
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## How It Works
|
|
152
|
+
|
|
153
|
+
### Tool Search Tool
|
|
154
|
+
|
|
155
|
+
For providers without native support (OpenAI, Google), we implement client-side search:
|
|
156
|
+
|
|
157
|
+
1. Tools marked with `deferLoading: true` are registered but not loaded
|
|
158
|
+
2. A special `tool_search` tool is automatically added
|
|
159
|
+
3. When LLM needs capabilities, it searches using the tool_search tool
|
|
160
|
+
4. Only relevant tools are loaded into context
|
|
161
|
+
5. Massive token savings (85%+ reduction)
|
|
162
|
+
|
|
163
|
+
**Search Strategies:**
|
|
164
|
+
- **smart**: Intelligent relevance ranking using BM25 algorithm (recommended, default)
|
|
165
|
+
- **keyword**: Fast keyword matching for exact terms
|
|
166
|
+
- **semantic**: Meaning-based search using embeddings (coming soon)
|
|
167
|
+
- **custom**: Provide your own search function
|
|
168
|
+
|
|
169
|
+
### Programmatic Tool Calling
|
|
170
|
+
|
|
171
|
+
For providers without native support, we use sandboxed code execution:
|
|
172
|
+
|
|
173
|
+
1. Tools marked with `allowedCallers: ['code_execution']` can be called from code
|
|
174
|
+
2. LLM writes code to orchestrate multiple tool calls
|
|
175
|
+
3. Code runs in sandbox (VM, Docker, or cloud service)
|
|
176
|
+
4. Only final results enter LLM context, not intermediate data
|
|
177
|
+
5. Supports parallel execution, loops, conditionals
|
|
178
|
+
|
|
179
|
+
**Example:**
|
|
180
|
+
|
|
181
|
+
Instead of this (traditional):
|
|
182
|
+
```
|
|
183
|
+
→ LLM: get_team_members("engineering")
|
|
184
|
+
← API: [20 members...]
|
|
185
|
+
→ LLM: get_expenses("emp_1", "Q3")
|
|
186
|
+
← API: [50 line items...]
|
|
187
|
+
... 19 more calls ...
|
|
188
|
+
→ LLM: Manual analysis of 1000+ line items
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
You get this (programmatic):
|
|
192
|
+
```
|
|
193
|
+
→ LLM: Writes code to orchestrate all calls
|
|
194
|
+
← Code runs in sandbox
|
|
195
|
+
← Only final results: [2 people who exceeded budget]
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Tool Use Examples
|
|
199
|
+
|
|
200
|
+
For providers without native support, examples are injected into descriptions:
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
{
|
|
204
|
+
name: "create_ticket",
|
|
205
|
+
description: "Create a support ticket.
|
|
206
|
+
|
|
207
|
+
Examples:
|
|
208
|
+
1. {\"title\": \"Login broken\", \"priority\": \"critical\", ...}
|
|
209
|
+
2. {\"title\": \"Feature request\", \"labels\": [\"enhancement\"]}",
|
|
210
|
+
// ...
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
The LLM learns proper usage patterns from the examples.
|
|
215
|
+
|
|
216
|
+
## Provider Support
|
|
217
|
+
|
|
218
|
+
| Provider | Native Tool Search | Native Code Execution | Native Examples | Status |
|
|
219
|
+
|----------|-------------------|----------------------|----------------|--------|
|
|
220
|
+
| **Vercel AI SDK** | ❌ (emulated) | ❌ (emulated) | ❌ (emulated) | ✅ **Ready** |
|
|
221
|
+
| ↳ OpenAI | ❌ (emulated) | ❌ (emulated) | ❌ (emulated) | ✅ via AI SDK |
|
|
222
|
+
| ↳ Anthropic | ✅ | ✅ | ✅ | ✅ via AI SDK |
|
|
223
|
+
| ↳ Google | ❌ (emulated) | ❌ (emulated) | ❌ (emulated) | ✅ via AI SDK |
|
|
224
|
+
| ↳ Others | ❌ (emulated) | ❌ (emulated) | ❌ (emulated) | ✅ via AI SDK |
|
|
225
|
+
| OpenAI (direct) | ❌ (emulated) | ❌ (emulated) | ❌ (emulated) | ✅ Ready |
|
|
226
|
+
| Anthropic (direct) | ✅ | ✅ | ✅ | 🚧 Coming |
|
|
227
|
+
| Ollama | ❌ (emulated) | ❌ (emulated) | ❌ (emulated) | 🚧 Coming |
|
|
228
|
+
|
|
229
|
+
## Configuration
|
|
230
|
+
|
|
231
|
+
### Search Configuration
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
const registry = new ToolRegistry({
|
|
235
|
+
strategy: 'smart', // 'smart' (default), 'keyword', 'semantic', or 'custom'
|
|
236
|
+
maxResults: 10, // Max tools to return per search
|
|
237
|
+
threshold: 0.0, // Minimum relevance score (0-100)
|
|
238
|
+
customSearchFn: async (query, tools) => {
|
|
239
|
+
// Your custom search logic (only needed if strategy is 'custom')
|
|
240
|
+
return filteredTools;
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Strategy Guide:**
|
|
246
|
+
- `smart`: Best for most cases - understands relevance and context
|
|
247
|
+
- `keyword`: Fast exact matching - use when you know exact tool names
|
|
248
|
+
- `semantic`: Coming soon - meaning-based search with embeddings
|
|
249
|
+
- `custom`: Advanced - provide your own search algorithm
|
|
250
|
+
|
|
251
|
+
### Code Executor Configuration
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
const client = new Client({
|
|
255
|
+
adapter: new OpenAIAdapter(apiKey),
|
|
256
|
+
enableProgrammaticCalling: true,
|
|
257
|
+
executorConfig: {
|
|
258
|
+
timeout: 30000, // 30 seconds
|
|
259
|
+
memoryLimit: '256mb',
|
|
260
|
+
environment: { // Environment variables
|
|
261
|
+
NODE_ENV: 'production'
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Examples
|
|
268
|
+
|
|
269
|
+
See the `examples/` directory:
|
|
270
|
+
|
|
271
|
+
- `basic-usage.ts` - All three features in action
|
|
272
|
+
- `programmatic-calling.ts` - Budget compliance check example
|
|
273
|
+
|
|
274
|
+
## API Reference
|
|
275
|
+
|
|
276
|
+
### ToolDefinition
|
|
277
|
+
|
|
278
|
+
```typescript
|
|
279
|
+
interface ToolDefinition {
|
|
280
|
+
name: string;
|
|
281
|
+
description: string;
|
|
282
|
+
inputSchema: JSONSchema | ZodSchema;
|
|
283
|
+
inputExamples?: any[]; // Tool Use Examples
|
|
284
|
+
deferLoading?: boolean; // For Tool Search
|
|
285
|
+
allowedCallers?: string[]; // For Programmatic Calling
|
|
286
|
+
handler: (input: any) => Promise<any>;
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### ToolRegistry
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
class ToolRegistry {
|
|
294
|
+
register(tool: ToolDefinition): void
|
|
295
|
+
registerMany(tools: ToolDefinition[]): void
|
|
296
|
+
search(query: string, maxResults?: number): Promise<ToolDefinition[]>
|
|
297
|
+
get(name: string): ToolDefinition | undefined
|
|
298
|
+
getLoadedTools(): ToolDefinition[]
|
|
299
|
+
getStats(): { total: number; loaded: number; deferred: number }
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Client
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
class Client {
|
|
307
|
+
constructor(config: ClientConfig, registry?: ToolRegistry)
|
|
308
|
+
chat(request: ChatRequest): Promise<ChatResponse>
|
|
309
|
+
ask(prompt: string, systemPrompt?: string): Promise<string>
|
|
310
|
+
getRegistry(): ToolRegistry
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
## Performance
|
|
315
|
+
|
|
316
|
+
Based on internal testing:
|
|
317
|
+
|
|
318
|
+
| Metric | Traditional | With Advanced Tools | Improvement |
|
|
319
|
+
|--------|------------|---------------------|-------------|
|
|
320
|
+
| Token usage (large tool set) | ~77K tokens | ~8.7K tokens | **88% reduction** |
|
|
321
|
+
| Token usage (complex workflows) | 43,588 tokens | 27,297 tokens | **37% reduction** |
|
|
322
|
+
| Tool selection accuracy | 79.5% | 88.1% | **+8.6 points** |
|
|
323
|
+
| Parameter accuracy | 72% | 90% | **+18 points** |
|
|
324
|
+
|
|
325
|
+
## When to Use Each Feature
|
|
326
|
+
|
|
327
|
+
### Tool Search Tool
|
|
328
|
+
|
|
329
|
+
**Use when:**
|
|
330
|
+
- Tool definitions consuming >10K tokens
|
|
331
|
+
- Experiencing tool selection accuracy issues
|
|
332
|
+
- Building MCP-powered systems with multiple servers
|
|
333
|
+
- 10+ tools available
|
|
334
|
+
|
|
335
|
+
**Skip when:**
|
|
336
|
+
- Small tool library (<10 tools)
|
|
337
|
+
- All tools used frequently
|
|
338
|
+
- Tool definitions are compact
|
|
339
|
+
|
|
340
|
+
### Programmatic Tool Calling
|
|
341
|
+
|
|
342
|
+
**Use when:**
|
|
343
|
+
- Processing large datasets where you only need aggregates
|
|
344
|
+
- Running multi-step workflows with 3+ dependent tool calls
|
|
345
|
+
- Filtering, sorting, or transforming tool results
|
|
346
|
+
- Handling tasks where intermediate data shouldn't influence reasoning
|
|
347
|
+
- Running parallel operations across many items
|
|
348
|
+
|
|
349
|
+
**Skip when:**
|
|
350
|
+
- Making simple single-tool invocations
|
|
351
|
+
- Working on tasks where LLM should see all intermediate results
|
|
352
|
+
- Running quick lookups with small responses
|
|
353
|
+
|
|
354
|
+
### Tool Use Examples
|
|
355
|
+
|
|
356
|
+
**Use when:**
|
|
357
|
+
- Complex nested structures where valid JSON doesn't imply correct usage
|
|
358
|
+
- Tools with many optional parameters
|
|
359
|
+
- APIs with domain-specific conventions
|
|
360
|
+
- Similar tools where examples clarify which to use
|
|
361
|
+
|
|
362
|
+
**Skip when:**
|
|
363
|
+
- Simple single-parameter tools with obvious usage
|
|
364
|
+
- Standard formats (URLs, emails) that LLM already understands
|
|
365
|
+
- Validation concerns better handled by JSON Schema
|
|
366
|
+
|
|
367
|
+
## Sandboxing Options
|
|
368
|
+
|
|
369
|
+
The default VM executor is **NOT secure** for untrusted code. For production:
|
|
370
|
+
|
|
371
|
+
1. **Docker** (recommended for local): Full isolation, requires Docker installed
|
|
372
|
+
2. **E2B**: Cloud sandbox service, easy setup, scalable
|
|
373
|
+
3. **Modal**: Serverless containers
|
|
374
|
+
4. **Custom**: Implement `CodeExecutor` interface
|
|
375
|
+
|
|
376
|
+
## Roadmap
|
|
377
|
+
|
|
378
|
+
- [x] Core library with OpenAI adapter
|
|
379
|
+
- [ ] Anthropic adapter (native features)
|
|
380
|
+
- [ ] Google/Gemini adapter
|
|
381
|
+
- [ ] Ollama adapter with model capability detection
|
|
382
|
+
- [ ] Docker-based executor
|
|
383
|
+
- [ ] E2B integration
|
|
384
|
+
- [ ] Embedding-based search
|
|
385
|
+
- [ ] Streaming support
|
|
386
|
+
- [ ] Async tool execution
|
|
387
|
+
- [ ] LangChain/LlamaIndex integration
|
|
388
|
+
|
|
389
|
+
## Contributing
|
|
390
|
+
|
|
391
|
+
Contributions welcome! Please see CONTRIBUTING.md.
|
|
392
|
+
|
|
393
|
+
## License
|
|
394
|
+
|
|
395
|
+
MIT
|
|
396
|
+
|
|
397
|
+
## Credits
|
|
398
|
+
|
|
399
|
+
This library implements features described in Anthropic's blog post:
|
|
400
|
+
[Introducing advanced tool use on the Claude Developer Platform](https://www.anthropic.com/news/advanced-tool-use)
|
|
401
|
+
|
|
402
|
+
The implementation is provider-agnostic and works with any LLM that supports function calling.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VercelAIAdapter = exports.OpenAIAdapter = void 0;
|
|
4
|
+
var openai_1 = require("./openai");
|
|
5
|
+
Object.defineProperty(exports, "OpenAIAdapter", { enumerable: true, get: function () { return openai_1.OpenAIAdapter; } });
|
|
6
|
+
var vercel_ai_1 = require("./vercel-ai");
|
|
7
|
+
Object.defineProperty(exports, "VercelAIAdapter", { enumerable: true, get: function () { return vercel_ai_1.VercelAIAdapter; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;AAAA,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,yCAA8C;AAArC,4GAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { ProviderAdapter, ProviderCapabilities, ToolDefinition, ChatRequest, ChatResponse, ToolCall, ToolResult } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* OpenAI provider adapter
|
|
5
|
+
* Emulates advanced tool use features for OpenAI's API
|
|
6
|
+
*/
|
|
7
|
+
export declare class OpenAIAdapter implements ProviderAdapter {
|
|
8
|
+
readonly name = "openai";
|
|
9
|
+
readonly capabilities: ProviderCapabilities;
|
|
10
|
+
private client;
|
|
11
|
+
private model;
|
|
12
|
+
constructor(apiKey: string, model?: string);
|
|
13
|
+
/**
|
|
14
|
+
* Format a tool definition for OpenAI's function calling format
|
|
15
|
+
*/
|
|
16
|
+
formatTool(tool: ToolDefinition): Record<string, any>;
|
|
17
|
+
/**
|
|
18
|
+
* Convert our Message format to OpenAI's format
|
|
19
|
+
*/
|
|
20
|
+
private convertMessages;
|
|
21
|
+
/**
|
|
22
|
+
* Create a chat completion
|
|
23
|
+
*/
|
|
24
|
+
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
25
|
+
/**
|
|
26
|
+
* Parse tool calls from OpenAI response
|
|
27
|
+
*/
|
|
28
|
+
parseToolCalls(toolCalls: OpenAI.ChatCompletionMessageToolCall[]): ToolCall[];
|
|
29
|
+
/**
|
|
30
|
+
* Format tool results for OpenAI
|
|
31
|
+
*/
|
|
32
|
+
formatToolResults(results: ToolResult[]): OpenAI.ChatCompletionMessageParam[];
|
|
33
|
+
/**
|
|
34
|
+
* Map OpenAI finish reason to our format
|
|
35
|
+
*/
|
|
36
|
+
private mapFinishReason;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,UAAU,EAEX,MAAM,UAAU,CAAC;AAElB;;;GAGG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAOzC;IAEF,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,SAAwB;IAKzD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA6BrD;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA0CvD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,6BAA6B,EAAE,GAAG,QAAQ,EAAE;IAQ7E;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,0BAA0B,EAAE;IAU7E;;OAEG;IACH,OAAO,CAAC,eAAe;CAcxB"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OpenAIAdapter = void 0;
|
|
7
|
+
const openai_1 = __importDefault(require("openai"));
|
|
8
|
+
/**
|
|
9
|
+
* OpenAI provider adapter
|
|
10
|
+
* Emulates advanced tool use features for OpenAI's API
|
|
11
|
+
*/
|
|
12
|
+
class OpenAIAdapter {
|
|
13
|
+
constructor(apiKey, model = 'gpt-4-turbo-preview') {
|
|
14
|
+
this.name = 'openai';
|
|
15
|
+
this.capabilities = {
|
|
16
|
+
supportsNativeToolSearch: false,
|
|
17
|
+
supportsNativeCodeExecution: false,
|
|
18
|
+
supportsNativeExamples: false,
|
|
19
|
+
supportsStreaming: true,
|
|
20
|
+
supportsParallelToolCalls: true,
|
|
21
|
+
maxTokens: 128000 // GPT-4 Turbo
|
|
22
|
+
};
|
|
23
|
+
this.client = new openai_1.default({ apiKey });
|
|
24
|
+
this.model = model;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Format a tool definition for OpenAI's function calling format
|
|
28
|
+
*/
|
|
29
|
+
formatTool(tool) {
|
|
30
|
+
// Extract schema from Zod or use as-is
|
|
31
|
+
let schema = tool.inputSchema;
|
|
32
|
+
if (typeof schema === 'object' && 'parse' in schema) {
|
|
33
|
+
// It's a Zod schema - we'd need to convert it
|
|
34
|
+
// For now, assume it's already JSON schema
|
|
35
|
+
schema = tool.inputSchema;
|
|
36
|
+
}
|
|
37
|
+
// Prepare description with examples if available
|
|
38
|
+
let description = tool.description;
|
|
39
|
+
if (tool.inputExamples && tool.inputExamples.length > 0) {
|
|
40
|
+
description += '\n\nExamples:';
|
|
41
|
+
tool.inputExamples.forEach((example, i) => {
|
|
42
|
+
description += `\n${i + 1}. ${JSON.stringify(example)}`;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
type: 'function',
|
|
47
|
+
function: {
|
|
48
|
+
name: tool.name,
|
|
49
|
+
description,
|
|
50
|
+
parameters: schema
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Convert our Message format to OpenAI's format
|
|
56
|
+
*/
|
|
57
|
+
convertMessages(messages) {
|
|
58
|
+
return messages.map(msg => {
|
|
59
|
+
if (msg.role === 'tool') {
|
|
60
|
+
// Tool result message
|
|
61
|
+
const toolResults = msg.toolResults || [];
|
|
62
|
+
return toolResults.map(result => ({
|
|
63
|
+
role: 'tool',
|
|
64
|
+
tool_call_id: result.toolCallId,
|
|
65
|
+
content: result.error
|
|
66
|
+
? `Error: ${result.error.message}`
|
|
67
|
+
: JSON.stringify(result.data)
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
if (msg.toolCalls && msg.toolCalls.length > 0) {
|
|
71
|
+
// Assistant message with tool calls
|
|
72
|
+
return {
|
|
73
|
+
role: 'assistant',
|
|
74
|
+
content: typeof msg.content === 'string' ? msg.content : null,
|
|
75
|
+
tool_calls: msg.toolCalls.map(tc => ({
|
|
76
|
+
id: tc.id,
|
|
77
|
+
type: 'function',
|
|
78
|
+
function: {
|
|
79
|
+
name: tc.name,
|
|
80
|
+
arguments: JSON.stringify(tc.input)
|
|
81
|
+
}
|
|
82
|
+
}))
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Regular message
|
|
86
|
+
return {
|
|
87
|
+
role: msg.role,
|
|
88
|
+
content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content)
|
|
89
|
+
};
|
|
90
|
+
}).flat();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a chat completion
|
|
94
|
+
*/
|
|
95
|
+
async chat(request) {
|
|
96
|
+
const messages = this.convertMessages(request.messages);
|
|
97
|
+
const tools = request.tools
|
|
98
|
+
?.filter(tool => !tool.deferLoading) // Only send loaded tools
|
|
99
|
+
?.map(tool => this.formatTool(tool));
|
|
100
|
+
const completion = await this.client.chat.completions.create({
|
|
101
|
+
model: this.model,
|
|
102
|
+
messages,
|
|
103
|
+
tools: tools && tools.length > 0 ? tools : undefined,
|
|
104
|
+
max_tokens: request.maxTokens,
|
|
105
|
+
temperature: request.temperature,
|
|
106
|
+
stream: false // Streaming not yet supported
|
|
107
|
+
});
|
|
108
|
+
const choice = completion.choices[0];
|
|
109
|
+
const message = choice.message;
|
|
110
|
+
// Parse tool calls if any
|
|
111
|
+
const toolCalls = message.tool_calls
|
|
112
|
+
? this.parseToolCalls(message.tool_calls)
|
|
113
|
+
: [];
|
|
114
|
+
return {
|
|
115
|
+
message: {
|
|
116
|
+
role: 'assistant',
|
|
117
|
+
content: message.content || '',
|
|
118
|
+
toolCalls
|
|
119
|
+
},
|
|
120
|
+
usage: completion.usage
|
|
121
|
+
? {
|
|
122
|
+
inputTokens: completion.usage.prompt_tokens,
|
|
123
|
+
outputTokens: completion.usage.completion_tokens,
|
|
124
|
+
totalTokens: completion.usage.total_tokens
|
|
125
|
+
}
|
|
126
|
+
: undefined,
|
|
127
|
+
stopReason: this.mapFinishReason(choice.finish_reason),
|
|
128
|
+
toolCalls
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Parse tool calls from OpenAI response
|
|
133
|
+
*/
|
|
134
|
+
parseToolCalls(toolCalls) {
|
|
135
|
+
return toolCalls.map(tc => ({
|
|
136
|
+
id: tc.id,
|
|
137
|
+
name: tc.function.name,
|
|
138
|
+
input: JSON.parse(tc.function.arguments)
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Format tool results for OpenAI
|
|
143
|
+
*/
|
|
144
|
+
formatToolResults(results) {
|
|
145
|
+
return results.map(result => ({
|
|
146
|
+
role: 'tool',
|
|
147
|
+
tool_call_id: result.toolCallId,
|
|
148
|
+
content: result.error
|
|
149
|
+
? `Error: ${result.error.message}`
|
|
150
|
+
: JSON.stringify(result.data)
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Map OpenAI finish reason to our format
|
|
155
|
+
*/
|
|
156
|
+
mapFinishReason(reason) {
|
|
157
|
+
switch (reason) {
|
|
158
|
+
case 'stop':
|
|
159
|
+
return 'end_turn';
|
|
160
|
+
case 'length':
|
|
161
|
+
return 'max_tokens';
|
|
162
|
+
case 'tool_calls':
|
|
163
|
+
return 'tool_use';
|
|
164
|
+
default:
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.OpenAIAdapter = OpenAIAdapter;
|
|
170
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { LanguageModel } from 'ai';
|
|
2
|
+
import { ProviderAdapter, ProviderCapabilities, ToolDefinition, ChatRequest, ChatResponse, ToolCall, ToolResult } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Vercel AI SDK adapter
|
|
5
|
+
* Works with any provider supported by AI SDK (OpenAI, Anthropic, Google, etc.)
|
|
6
|
+
*/
|
|
7
|
+
export declare class VercelAIAdapter implements ProviderAdapter {
|
|
8
|
+
readonly name = "vercel-ai";
|
|
9
|
+
readonly capabilities: ProviderCapabilities;
|
|
10
|
+
private model;
|
|
11
|
+
private providerName;
|
|
12
|
+
/**
|
|
13
|
+
* @param model - AI SDK language model (e.g., from @ai-sdk/openai, @ai-sdk/anthropic)
|
|
14
|
+
* @param providerName - Optional provider name for identification
|
|
15
|
+
*/
|
|
16
|
+
constructor(model: LanguageModel, providerName?: string);
|
|
17
|
+
/**
|
|
18
|
+
* Format a tool definition for AI SDK's format
|
|
19
|
+
*/
|
|
20
|
+
formatTool(tool: ToolDefinition): Record<string, any>;
|
|
21
|
+
/**
|
|
22
|
+
* Convert our Message format to AI SDK's format
|
|
23
|
+
*/
|
|
24
|
+
private convertMessages;
|
|
25
|
+
/**
|
|
26
|
+
* Convert JSON Schema to Zod schema (simplified)
|
|
27
|
+
*/
|
|
28
|
+
private jsonSchemaToZod;
|
|
29
|
+
/**
|
|
30
|
+
* Create a chat completion using AI SDK
|
|
31
|
+
*/
|
|
32
|
+
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
33
|
+
/**
|
|
34
|
+
* Parse tool calls from AI SDK response
|
|
35
|
+
*/
|
|
36
|
+
parseToolCalls(toolCalls: any[]): ToolCall[];
|
|
37
|
+
/**
|
|
38
|
+
* Format tool results for AI SDK
|
|
39
|
+
*/
|
|
40
|
+
formatToolResults(results: ToolResult[]): any;
|
|
41
|
+
/**
|
|
42
|
+
* Map AI SDK finish reason to our format
|
|
43
|
+
*/
|
|
44
|
+
private mapFinishReason;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=vercel-ai.d.ts.map
|