llm-advanced-tools 0.1.2 → 0.1.3
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 +83 -70
- package/dist/adapters/index.d.ts +1 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -3
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/vercel-ai.d.ts +15 -2
- package/dist/adapters/vercel-ai.d.ts.map +1 -1
- package/dist/adapters/vercel-ai.js +76 -42
- package/dist/adapters/vercel-ai.js.map +1 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +5 -2
- package/dist/core/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/package.json +28 -11
- package/dist/adapters/openai.d.ts +0 -38
- package/dist/adapters/openai.d.ts.map +0 -1
- package/dist/adapters/openai.js +0 -170
- package/dist/adapters/openai.js.map +0 -1
- package/plan.md +0 -576
- package/src/adapters/index.ts +0 -2
- package/src/adapters/openai.ts +0 -195
- package/src/adapters/vercel-ai.ts +0 -281
- package/src/core/client.ts +0 -232
- package/src/core/index.ts +0 -2
- package/src/core/registry.ts +0 -198
- package/src/executor/base.ts +0 -122
- package/src/executor/index.ts +0 -2
- package/src/executor/vm.ts +0 -87
- package/src/index.ts +0 -26
- package/src/search/base.ts +0 -63
- package/src/search/bm25.ts +0 -64
- package/src/search/index.ts +0 -3
- package/src/search/regex.ts +0 -66
- package/src/types/index.ts +0 -221
- package/test-advanced.ts +0 -212
- package/test-simple.ts +0 -91
package/src/types/index.ts
DELETED
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Represents a tool definition with support for advanced features
|
|
5
|
-
*/
|
|
6
|
-
export interface ToolDefinition<TInput = any, TOutput = any> {
|
|
7
|
-
/** Tool name (must be unique in registry) */
|
|
8
|
-
name: string;
|
|
9
|
-
|
|
10
|
-
/** Human-readable description of what the tool does */
|
|
11
|
-
description: string;
|
|
12
|
-
|
|
13
|
-
/** JSON Schema defining input parameters */
|
|
14
|
-
inputSchema: z.ZodSchema<TInput> | Record<string, any>;
|
|
15
|
-
|
|
16
|
-
/** Example invocations showing proper usage */
|
|
17
|
-
inputExamples?: TInput[];
|
|
18
|
-
|
|
19
|
-
/** Whether to defer loading until explicitly requested (for Tool Search) */
|
|
20
|
-
deferLoading?: boolean;
|
|
21
|
-
|
|
22
|
-
/** Which callers can invoke this tool programmatically */
|
|
23
|
-
allowedCallers?: string[];
|
|
24
|
-
|
|
25
|
-
/** The actual implementation function */
|
|
26
|
-
handler: (input: TInput) => Promise<TOutput> | TOutput;
|
|
27
|
-
|
|
28
|
-
/** Optional metadata */
|
|
29
|
-
metadata?: Record<string, any>;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Represents a tool call from the LLM
|
|
34
|
-
*/
|
|
35
|
-
export interface ToolCall {
|
|
36
|
-
/** Unique identifier for this tool call */
|
|
37
|
-
id: string;
|
|
38
|
-
|
|
39
|
-
/** Name of the tool being called */
|
|
40
|
-
name: string;
|
|
41
|
-
|
|
42
|
-
/** Arguments passed to the tool */
|
|
43
|
-
input: Record<string, any>;
|
|
44
|
-
|
|
45
|
-
/** Optional caller information (for programmatic calling) */
|
|
46
|
-
caller?: {
|
|
47
|
-
type: string;
|
|
48
|
-
toolId: string;
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Result of a tool execution
|
|
54
|
-
*/
|
|
55
|
-
export interface ToolResult<T = any> {
|
|
56
|
-
/** ID of the tool call this result corresponds to */
|
|
57
|
-
toolCallId: string;
|
|
58
|
-
|
|
59
|
-
/** The result data */
|
|
60
|
-
data?: T;
|
|
61
|
-
|
|
62
|
-
/** Error if execution failed */
|
|
63
|
-
error?: {
|
|
64
|
-
message: string;
|
|
65
|
-
code?: string;
|
|
66
|
-
details?: any;
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Message format (provider-agnostic)
|
|
72
|
-
*/
|
|
73
|
-
export interface Message {
|
|
74
|
-
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
75
|
-
content: string | Array<{
|
|
76
|
-
type: 'text' | 'tool_use' | 'tool_result';
|
|
77
|
-
[key: string]: any;
|
|
78
|
-
}>;
|
|
79
|
-
toolCalls?: ToolCall[];
|
|
80
|
-
toolResults?: ToolResult[];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Chat completion request
|
|
85
|
-
*/
|
|
86
|
-
export interface ChatRequest {
|
|
87
|
-
messages: Message[];
|
|
88
|
-
tools?: ToolDefinition[];
|
|
89
|
-
maxTokens?: number;
|
|
90
|
-
temperature?: number;
|
|
91
|
-
stream?: boolean;
|
|
92
|
-
[key: string]: any;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Chat completion response
|
|
97
|
-
*/
|
|
98
|
-
export interface ChatResponse {
|
|
99
|
-
message: Message;
|
|
100
|
-
usage?: {
|
|
101
|
-
inputTokens: number;
|
|
102
|
-
outputTokens: number;
|
|
103
|
-
totalTokens: number;
|
|
104
|
-
};
|
|
105
|
-
stopReason?: 'end_turn' | 'max_tokens' | 'tool_use' | 'stop_sequence';
|
|
106
|
-
toolCalls?: ToolCall[];
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Search strategy for tool discovery
|
|
111
|
-
* - 'smart': Relevance-based ranking (best for most cases)
|
|
112
|
-
* - 'keyword': Fast keyword matching
|
|
113
|
-
* - 'semantic': Meaning-based search using embeddings
|
|
114
|
-
* - 'custom': Your own search function
|
|
115
|
-
*
|
|
116
|
-
* Legacy names (for backward compatibility):
|
|
117
|
-
* - 'bm25': alias for 'smart'
|
|
118
|
-
* - 'regex': alias for 'keyword'
|
|
119
|
-
*/
|
|
120
|
-
export type SearchStrategy =
|
|
121
|
-
| 'smart' | 'keyword' | 'semantic' | 'custom'
|
|
122
|
-
| 'bm25' | 'regex'; // backward compatibility
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Configuration for tool search
|
|
126
|
-
*/
|
|
127
|
-
export interface SearchConfig {
|
|
128
|
-
strategy: SearchStrategy;
|
|
129
|
-
maxResults?: number;
|
|
130
|
-
threshold?: number;
|
|
131
|
-
customSearchFn?: (query: string, tools: ToolDefinition[]) => Promise<ToolDefinition[]>;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Code execution result
|
|
136
|
-
*/
|
|
137
|
-
export interface ExecutionResult {
|
|
138
|
-
success: boolean;
|
|
139
|
-
stdout?: string;
|
|
140
|
-
stderr?: string;
|
|
141
|
-
returnValue?: any;
|
|
142
|
-
error?: {
|
|
143
|
-
message: string;
|
|
144
|
-
stack?: string;
|
|
145
|
-
};
|
|
146
|
-
toolCalls?: ToolCall[];
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Code executor configuration
|
|
151
|
-
*/
|
|
152
|
-
export interface ExecutorConfig {
|
|
153
|
-
timeout?: number;
|
|
154
|
-
memoryLimit?: string;
|
|
155
|
-
environment?: Record<string, string>;
|
|
156
|
-
allowedPackages?: string[];
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Provider capabilities
|
|
161
|
-
*/
|
|
162
|
-
export interface ProviderCapabilities {
|
|
163
|
-
supportsNativeToolSearch: boolean;
|
|
164
|
-
supportsNativeCodeExecution: boolean;
|
|
165
|
-
supportsNativeExamples: boolean;
|
|
166
|
-
supportsStreaming: boolean;
|
|
167
|
-
supportsParallelToolCalls: boolean;
|
|
168
|
-
maxToolsPerRequest?: number;
|
|
169
|
-
maxTokens?: number;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Base provider adapter interface
|
|
174
|
-
*/
|
|
175
|
-
export interface ProviderAdapter {
|
|
176
|
-
/** Provider name (e.g., 'openai', 'anthropic') */
|
|
177
|
-
readonly name: string;
|
|
178
|
-
|
|
179
|
-
/** Provider capabilities */
|
|
180
|
-
readonly capabilities: ProviderCapabilities;
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Format a tool definition for this provider's API
|
|
184
|
-
*/
|
|
185
|
-
formatTool(tool: ToolDefinition): Record<string, any>;
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Create a chat completion request
|
|
189
|
-
*/
|
|
190
|
-
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Parse tool calls from provider response
|
|
194
|
-
*/
|
|
195
|
-
parseToolCalls(response: any): ToolCall[];
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Format tool results for provider
|
|
199
|
-
*/
|
|
200
|
-
formatToolResults(results: ToolResult[]): any;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Client configuration
|
|
205
|
-
*/
|
|
206
|
-
export interface ClientConfig {
|
|
207
|
-
/** Provider adapter to use */
|
|
208
|
-
adapter: ProviderAdapter;
|
|
209
|
-
|
|
210
|
-
/** Enable tool search feature */
|
|
211
|
-
enableToolSearch?: boolean;
|
|
212
|
-
|
|
213
|
-
/** Enable programmatic tool calling */
|
|
214
|
-
enableProgrammaticCalling?: boolean;
|
|
215
|
-
|
|
216
|
-
/** Search configuration */
|
|
217
|
-
searchConfig?: SearchConfig;
|
|
218
|
-
|
|
219
|
-
/** Code executor configuration */
|
|
220
|
-
executorConfig?: ExecutorConfig;
|
|
221
|
-
}
|
package/test-advanced.ts
DELETED
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Client,
|
|
3
|
-
ToolRegistry,
|
|
4
|
-
OpenAIAdapter,
|
|
5
|
-
ToolDefinition
|
|
6
|
-
} from './src';
|
|
7
|
-
|
|
8
|
-
async function main() {
|
|
9
|
-
console.log('🚀 Testing Advanced Features\n');
|
|
10
|
-
console.log('=' .repeat(60));
|
|
11
|
-
|
|
12
|
-
const registry = new ToolRegistry({
|
|
13
|
-
strategy: 'smart', // intelligent relevance-based search
|
|
14
|
-
maxResults: 3
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
// ============================================================
|
|
18
|
-
// Feature 1: Tool Use Examples
|
|
19
|
-
// ============================================================
|
|
20
|
-
console.log('\n📝 Feature 1: Tool Use Examples');
|
|
21
|
-
console.log('-'.repeat(60));
|
|
22
|
-
|
|
23
|
-
const createTicketTool: ToolDefinition = {
|
|
24
|
-
name: 'create_support_ticket',
|
|
25
|
-
description: 'Create a customer support ticket',
|
|
26
|
-
inputSchema: {
|
|
27
|
-
type: 'object',
|
|
28
|
-
properties: {
|
|
29
|
-
title: { type: 'string' },
|
|
30
|
-
priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },
|
|
31
|
-
customer_email: { type: 'string' }
|
|
32
|
-
},
|
|
33
|
-
required: ['title']
|
|
34
|
-
},
|
|
35
|
-
// Examples show the LLM how to use the tool properly
|
|
36
|
-
inputExamples: [
|
|
37
|
-
{
|
|
38
|
-
title: 'Cannot login to account',
|
|
39
|
-
priority: 'critical',
|
|
40
|
-
customer_email: 'user@example.com'
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
title: 'Feature request: Dark mode',
|
|
44
|
-
priority: 'low'
|
|
45
|
-
}
|
|
46
|
-
],
|
|
47
|
-
deferLoading: false,
|
|
48
|
-
handler: async (input: any) => {
|
|
49
|
-
return {
|
|
50
|
-
ticket_id: 'TKT-' + Math.floor(Math.random() * 10000),
|
|
51
|
-
status: 'created',
|
|
52
|
-
...input
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
registry.register(createTicketTool);
|
|
58
|
-
|
|
59
|
-
const client1 = new Client(
|
|
60
|
-
{
|
|
61
|
-
adapter: new OpenAIAdapter(process.env.OPENAI_API_KEY!, 'gpt-4o-mini'),
|
|
62
|
-
enableToolSearch: false,
|
|
63
|
-
enableProgrammaticCalling: false
|
|
64
|
-
},
|
|
65
|
-
registry
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
console.log('\nAsking: "Create a high priority ticket about payment failure for john@example.com"');
|
|
69
|
-
const response1 = await client1.ask(
|
|
70
|
-
'Create a high priority ticket about payment failure for john@example.com',
|
|
71
|
-
'Use the create_support_ticket tool. The examples show you the proper format.'
|
|
72
|
-
);
|
|
73
|
-
console.log('✅ Result:', response1);
|
|
74
|
-
|
|
75
|
-
// ============================================================
|
|
76
|
-
// Feature 2: Tool Search Tool
|
|
77
|
-
// ============================================================
|
|
78
|
-
console.log('\n\n🔍 Feature 2: Tool Search Tool');
|
|
79
|
-
console.log('-'.repeat(60));
|
|
80
|
-
|
|
81
|
-
const registry2 = new ToolRegistry({ strategy: 'smart', maxResults: 3 });
|
|
82
|
-
|
|
83
|
-
// Add multiple deferred tools
|
|
84
|
-
const tools: ToolDefinition[] = [
|
|
85
|
-
{
|
|
86
|
-
name: 'send_email',
|
|
87
|
-
description: 'Send an email to a customer',
|
|
88
|
-
inputSchema: { type: 'object', properties: { to: { type: 'string' }, subject: { type: 'string' } }, required: ['to', 'subject'] },
|
|
89
|
-
deferLoading: true,
|
|
90
|
-
handler: async (input: any) => ({ sent: true, messageId: 'msg_' + Date.now() })
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
name: 'send_sms',
|
|
94
|
-
description: 'Send an SMS text message',
|
|
95
|
-
inputSchema: { type: 'object', properties: { phone: { type: 'string' }, message: { type: 'string' } }, required: ['phone', 'message'] },
|
|
96
|
-
deferLoading: true,
|
|
97
|
-
handler: async (input: any) => ({ sent: true, messageId: 'sms_' + Date.now() })
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
name: 'get_weather',
|
|
101
|
-
description: 'Get weather information for a location',
|
|
102
|
-
inputSchema: { type: 'object', properties: { location: { type: 'string' } }, required: ['location'] },
|
|
103
|
-
deferLoading: true,
|
|
104
|
-
handler: async (input: any) => ({ temp: 72, conditions: 'sunny' })
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: 'get_stock_price',
|
|
108
|
-
description: 'Get current stock price for a ticker symbol',
|
|
109
|
-
inputSchema: { type: 'object', properties: { symbol: { type: 'string' } }, required: ['symbol'] },
|
|
110
|
-
deferLoading: true,
|
|
111
|
-
handler: async (input: any) => ({ symbol: input.symbol, price: 150.25 })
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
name: 'database_query',
|
|
115
|
-
description: 'Query the customer database',
|
|
116
|
-
inputSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },
|
|
117
|
-
deferLoading: true,
|
|
118
|
-
handler: async (input: any) => ({ results: [] })
|
|
119
|
-
}
|
|
120
|
-
];
|
|
121
|
-
|
|
122
|
-
registry2.registerMany(tools);
|
|
123
|
-
|
|
124
|
-
console.log('\nInitial stats:', registry2.getStats());
|
|
125
|
-
console.log('- Total tools: 5');
|
|
126
|
-
console.log('- All tools deferred (not loaded)');
|
|
127
|
-
console.log('- Saved ~15K tokens by not loading definitions!\n');
|
|
128
|
-
|
|
129
|
-
// Test manual search
|
|
130
|
-
console.log('Manual search for "email":');
|
|
131
|
-
const emailResults = await registry2.search('email', 2);
|
|
132
|
-
console.log('✅ Found tools:', emailResults.map(t => t.name));
|
|
133
|
-
|
|
134
|
-
console.log('\nManual search for "stock market":');
|
|
135
|
-
const stockResults = await registry2.search('stock market', 2);
|
|
136
|
-
console.log('✅ Found tools:', stockResults.map(t => t.name));
|
|
137
|
-
|
|
138
|
-
console.log('\nStats after searches:', registry2.getStats());
|
|
139
|
-
console.log('- Loaded tools increased as they were discovered!');
|
|
140
|
-
|
|
141
|
-
// ============================================================
|
|
142
|
-
// Feature 3: Programmatic Tool Calling (Simulated)
|
|
143
|
-
// ============================================================
|
|
144
|
-
console.log('\n\n🚀 Feature 3: Programmatic Tool Calling');
|
|
145
|
-
console.log('-'.repeat(60));
|
|
146
|
-
|
|
147
|
-
const registry3 = new ToolRegistry();
|
|
148
|
-
|
|
149
|
-
const getUsersTool: ToolDefinition = {
|
|
150
|
-
name: 'get_users',
|
|
151
|
-
description: 'Get list of users',
|
|
152
|
-
inputSchema: { type: 'object', properties: {} },
|
|
153
|
-
allowedCallers: ['code_execution'],
|
|
154
|
-
deferLoading: false,
|
|
155
|
-
handler: async () => {
|
|
156
|
-
return [
|
|
157
|
-
{ id: 1, name: 'Alice', age: 30 },
|
|
158
|
-
{ id: 2, name: 'Bob', age: 25 },
|
|
159
|
-
{ id: 3, name: 'Carol', age: 35 }
|
|
160
|
-
];
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
const getUserDetailsTool: ToolDefinition = {
|
|
165
|
-
name: 'get_user_details',
|
|
166
|
-
description: 'Get detailed info for a user',
|
|
167
|
-
inputSchema: { type: 'object', properties: { id: { type: 'number' } }, required: ['id'] },
|
|
168
|
-
allowedCallers: ['code_execution'],
|
|
169
|
-
deferLoading: false,
|
|
170
|
-
handler: async (input: { id: number }) => {
|
|
171
|
-
return {
|
|
172
|
-
id: input.id,
|
|
173
|
-
email: `user${input.id}@example.com`,
|
|
174
|
-
credits: 100 * input.id
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
registry3.registerMany([getUsersTool, getUserDetailsTool]);
|
|
180
|
-
|
|
181
|
-
console.log('\nWithout Programmatic Calling:');
|
|
182
|
-
console.log('- Call get_users → Returns 3 users (enters context)');
|
|
183
|
-
console.log('- Call get_user_details(1) → Returns details (enters context)');
|
|
184
|
-
console.log('- Call get_user_details(2) → Returns details (enters context)');
|
|
185
|
-
console.log('- Call get_user_details(3) → Returns details (enters context)');
|
|
186
|
-
console.log('- Total: 4 API round-trips, all data in context\n');
|
|
187
|
-
|
|
188
|
-
console.log('With Programmatic Calling:');
|
|
189
|
-
console.log('- LLM writes code to orchestrate all calls');
|
|
190
|
-
console.log('- Code runs in sandbox, fetches all data');
|
|
191
|
-
console.log('- Only final result enters context');
|
|
192
|
-
console.log('- Total: 1 code execution, massive token savings!\n');
|
|
193
|
-
|
|
194
|
-
console.log('✅ Tools support programmatic calling:',
|
|
195
|
-
registry3.getAllTools().filter(t => t.allowedCallers?.includes('code_execution')).map(t => t.name)
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
// ============================================================
|
|
199
|
-
// Summary
|
|
200
|
-
// ============================================================
|
|
201
|
-
console.log('\n\n' + '='.repeat(60));
|
|
202
|
-
console.log('🎉 ALL FEATURES DEMONSTRATED!');
|
|
203
|
-
console.log('='.repeat(60));
|
|
204
|
-
console.log('\n✅ Tool Use Examples: Improved accuracy with example patterns');
|
|
205
|
-
console.log('✅ Tool Search: Dynamic discovery saves 85%+ tokens');
|
|
206
|
-
console.log('✅ Programmatic Calling: Code orchestration saves 37%+ tokens\n');
|
|
207
|
-
console.log('This library brings these features to ANY LLM provider!');
|
|
208
|
-
console.log('Currently implemented: OpenAI');
|
|
209
|
-
console.log('Coming soon: Anthropic, Google, Ollama\n');
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
main().catch(console.error);
|
package/test-simple.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Client,
|
|
3
|
-
ToolRegistry,
|
|
4
|
-
OpenAIAdapter,
|
|
5
|
-
ToolDefinition
|
|
6
|
-
} from './src';
|
|
7
|
-
|
|
8
|
-
async function main() {
|
|
9
|
-
console.log('🚀 Testing Provider-Agnostic Advanced Tools Library\n');
|
|
10
|
-
|
|
11
|
-
// 1. Create registry with smart search
|
|
12
|
-
const registry = new ToolRegistry({
|
|
13
|
-
strategy: 'smart', // intelligent relevance-based search
|
|
14
|
-
maxResults: 5
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
// 2. Define a simple weather tool
|
|
18
|
-
const weatherTool: ToolDefinition = {
|
|
19
|
-
name: 'get_weather',
|
|
20
|
-
description: 'Get current weather for a location',
|
|
21
|
-
inputSchema: {
|
|
22
|
-
type: 'object',
|
|
23
|
-
properties: {
|
|
24
|
-
location: {
|
|
25
|
-
type: 'string',
|
|
26
|
-
description: 'City name'
|
|
27
|
-
},
|
|
28
|
-
units: {
|
|
29
|
-
type: 'string',
|
|
30
|
-
enum: ['celsius', 'fahrenheit'],
|
|
31
|
-
description: 'Temperature units'
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
required: ['location']
|
|
35
|
-
},
|
|
36
|
-
// Tool Use Examples feature
|
|
37
|
-
inputExamples: [
|
|
38
|
-
{ location: 'San Francisco', units: 'fahrenheit' },
|
|
39
|
-
{ location: 'Tokyo', units: 'celsius' }
|
|
40
|
-
],
|
|
41
|
-
// Defer loading for Tool Search feature
|
|
42
|
-
deferLoading: false, // Keep it loaded for this simple test
|
|
43
|
-
handler: async (input: { location: string; units?: string }) => {
|
|
44
|
-
return {
|
|
45
|
-
location: input.location,
|
|
46
|
-
temperature: 72,
|
|
47
|
-
units: input.units || 'fahrenheit',
|
|
48
|
-
conditions: 'Sunny'
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
registry.register(weatherTool);
|
|
54
|
-
|
|
55
|
-
// 3. Create client with OpenAI
|
|
56
|
-
const client = new Client(
|
|
57
|
-
{
|
|
58
|
-
adapter: new OpenAIAdapter(
|
|
59
|
-
process.env.OPENAI_API_KEY!,
|
|
60
|
-
'gpt-4o-mini' // Using cheaper model for testing
|
|
61
|
-
),
|
|
62
|
-
enableToolSearch: false, // Disable for simple test
|
|
63
|
-
enableProgrammaticCalling: false // Disable for simple test
|
|
64
|
-
},
|
|
65
|
-
registry
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
console.log('Registry stats:', registry.getStats());
|
|
69
|
-
console.log('\n--- Test 1: Simple tool call ---\n');
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
const response = await client.ask(
|
|
73
|
-
"What's the weather like in San Francisco?",
|
|
74
|
-
"You have access to a weather tool. Use it to answer the user's question."
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
console.log('✅ Response:', response);
|
|
78
|
-
} catch (error: any) {
|
|
79
|
-
console.error('❌ Error:', error.message);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
console.log('\n--- Test 2: Tool Search ---\n');
|
|
83
|
-
|
|
84
|
-
// Test the search functionality
|
|
85
|
-
const searchResults = await registry.search('weather');
|
|
86
|
-
console.log('✅ Tools found for "weather":', searchResults.map(t => t.name));
|
|
87
|
-
|
|
88
|
-
console.log('\n🎉 Tests complete!');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
main().catch(console.error);
|