kimi-vercel-ai-sdk-provider 0.3.0 → 0.5.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 (44) hide show
  1. package/README.md +567 -17
  2. package/dist/index.d.mts +1750 -3
  3. package/dist/index.d.ts +1750 -3
  4. package/dist/index.js +2317 -161
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +2292 -160
  7. package/dist/index.mjs.map +1 -1
  8. package/package.json +1 -1
  9. package/src/__tests__/auto-detect.test.ts +140 -0
  10. package/src/__tests__/code-validation.test.ts +267 -0
  11. package/src/__tests__/ensemble.test.ts +242 -0
  12. package/src/__tests__/file-cache.test.ts +310 -0
  13. package/src/__tests__/model-config.test.ts +120 -0
  14. package/src/__tests__/multi-agent.test.ts +201 -0
  15. package/src/__tests__/project-tools.test.ts +181 -0
  16. package/src/__tests__/reasoning-utils.test.ts +164 -0
  17. package/src/__tests__/tools.test.ts +76 -8
  18. package/src/chat/kimi-chat-language-model.ts +21 -2
  19. package/src/chat/kimi-chat-settings.ts +15 -1
  20. package/src/code-validation/detector.ts +319 -0
  21. package/src/code-validation/index.ts +31 -0
  22. package/src/code-validation/types.ts +291 -0
  23. package/src/code-validation/validator.ts +547 -0
  24. package/src/core/errors.ts +91 -0
  25. package/src/core/index.ts +15 -3
  26. package/src/core/types.ts +57 -2
  27. package/src/core/utils.ts +138 -0
  28. package/src/ensemble/index.ts +17 -0
  29. package/src/ensemble/multi-sampler.ts +433 -0
  30. package/src/ensemble/types.ts +279 -0
  31. package/src/files/attachment-processor.ts +51 -4
  32. package/src/files/file-cache.ts +260 -0
  33. package/src/files/index.ts +16 -1
  34. package/src/index.ts +102 -3
  35. package/src/kimi-provider.ts +354 -1
  36. package/src/multi-agent/index.ts +21 -0
  37. package/src/multi-agent/types.ts +312 -0
  38. package/src/multi-agent/workflows.ts +539 -0
  39. package/src/project-tools/index.ts +16 -0
  40. package/src/project-tools/scaffolder.ts +494 -0
  41. package/src/project-tools/types.ts +244 -0
  42. package/src/tools/auto-detect.ts +276 -0
  43. package/src/tools/index.ts +6 -2
  44. package/src/tools/prepare-tools.ts +179 -4
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Types for project scaffolding functionality.
3
+ * @module
4
+ */
5
+
6
+ // ============================================================================
7
+ // Configuration Types
8
+ // ============================================================================
9
+
10
+ /**
11
+ * Supported project types/frameworks.
12
+ */
13
+ export type ProjectType =
14
+ | 'nextjs'
15
+ | 'react'
16
+ | 'vue'
17
+ | 'node'
18
+ | 'express'
19
+ | 'fastify'
20
+ | 'python'
21
+ | 'fastapi'
22
+ | 'flask'
23
+ | 'go'
24
+ | 'rust'
25
+ | 'auto';
26
+
27
+ /**
28
+ * Output format for scaffolded projects.
29
+ */
30
+ export type OutputFormat = 'files' | 'json' | 'instructions';
31
+
32
+ /**
33
+ * Configuration for project scaffolding.
34
+ */
35
+ export interface ScaffoldConfig {
36
+ /**
37
+ * Project type/framework.
38
+ * @default 'auto'
39
+ */
40
+ type?: ProjectType;
41
+
42
+ /**
43
+ * Include testing setup.
44
+ * @default true
45
+ */
46
+ includeTests?: boolean;
47
+
48
+ /**
49
+ * Include CI/CD configuration (e.g., GitHub Actions).
50
+ * @default false
51
+ */
52
+ includeCI?: boolean;
53
+
54
+ /**
55
+ * Include documentation (README, API docs).
56
+ * @default true
57
+ */
58
+ includeDocs?: boolean;
59
+
60
+ /**
61
+ * Include Docker configuration.
62
+ * @default false
63
+ */
64
+ includeDocker?: boolean;
65
+
66
+ /**
67
+ * Include ESLint/Prettier configuration.
68
+ * @default true
69
+ */
70
+ includeLinting?: boolean;
71
+
72
+ /**
73
+ * Output format.
74
+ * @default 'files'
75
+ */
76
+ outputFormat?: OutputFormat;
77
+
78
+ /**
79
+ * TypeScript vs JavaScript (for applicable frameworks).
80
+ * @default true
81
+ */
82
+ useTypeScript?: boolean;
83
+
84
+ /**
85
+ * Additional features to include.
86
+ */
87
+ features?: string[];
88
+
89
+ /**
90
+ * Custom template or instructions to include.
91
+ */
92
+ customTemplate?: string;
93
+ }
94
+
95
+ // ============================================================================
96
+ // Result Types
97
+ // ============================================================================
98
+
99
+ /**
100
+ * A single file in the scaffolded project.
101
+ */
102
+ export interface ProjectFile {
103
+ /**
104
+ * Relative path from project root.
105
+ */
106
+ path: string;
107
+
108
+ /**
109
+ * File contents.
110
+ */
111
+ content: string;
112
+
113
+ /**
114
+ * Description of the file's purpose.
115
+ */
116
+ description?: string;
117
+
118
+ /**
119
+ * Whether this is a binary file (base64 encoded).
120
+ */
121
+ binary?: boolean;
122
+ }
123
+
124
+ /**
125
+ * Metadata about the scaffolded project.
126
+ */
127
+ export interface ProjectMetadata {
128
+ /**
129
+ * Detected or specified project type.
130
+ */
131
+ projectType: ProjectType;
132
+
133
+ /**
134
+ * Project name (derived from description).
135
+ */
136
+ projectName: string;
137
+
138
+ /**
139
+ * Number of files generated.
140
+ */
141
+ fileCount: number;
142
+
143
+ /**
144
+ * Total size of all files (bytes).
145
+ */
146
+ totalSize: number;
147
+
148
+ /**
149
+ * Estimated setup time.
150
+ */
151
+ estimatedSetupTime: string;
152
+
153
+ /**
154
+ * Main technologies/dependencies used.
155
+ */
156
+ technologies: string[];
157
+
158
+ /**
159
+ * Features included in the project.
160
+ */
161
+ features: string[];
162
+ }
163
+
164
+ /**
165
+ * Result of scaffolding a project.
166
+ */
167
+ export interface ScaffoldResult {
168
+ /**
169
+ * Generated project files.
170
+ */
171
+ files: ProjectFile[];
172
+
173
+ /**
174
+ * Setup instructions for the user.
175
+ */
176
+ instructions: string;
177
+
178
+ /**
179
+ * Commands to run for setup.
180
+ */
181
+ setupCommands: string[];
182
+
183
+ /**
184
+ * Project metadata.
185
+ */
186
+ metadata: ProjectMetadata;
187
+
188
+ /**
189
+ * Raw response from the model (for debugging).
190
+ */
191
+ rawResponse?: string;
192
+ }
193
+
194
+ // ============================================================================
195
+ // Template Types
196
+ // ============================================================================
197
+
198
+ /**
199
+ * A project template definition.
200
+ */
201
+ export interface ProjectTemplate {
202
+ /**
203
+ * Template identifier.
204
+ */
205
+ id: string;
206
+
207
+ /**
208
+ * Human-readable name.
209
+ */
210
+ name: string;
211
+
212
+ /**
213
+ * Template description.
214
+ */
215
+ description: string;
216
+
217
+ /**
218
+ * Project type this template is for.
219
+ */
220
+ projectType: ProjectType;
221
+
222
+ /**
223
+ * Base files that are always included.
224
+ */
225
+ baseFiles: ProjectFile[];
226
+
227
+ /**
228
+ * Optional files based on configuration.
229
+ */
230
+ optionalFiles?: {
231
+ condition: keyof ScaffoldConfig;
232
+ files: ProjectFile[];
233
+ }[];
234
+
235
+ /**
236
+ * Default setup commands.
237
+ */
238
+ setupCommands: string[];
239
+
240
+ /**
241
+ * Technologies used.
242
+ */
243
+ technologies: string[];
244
+ }
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Auto-detection utilities for enabling tools based on prompt content.
3
+ * @module
4
+ */
5
+
6
+ // ============================================================================
7
+ // Types
8
+ // ============================================================================
9
+
10
+ /**
11
+ * Result of auto-detecting which tools should be enabled.
12
+ */
13
+ export interface AutoDetectToolsResult {
14
+ /**
15
+ * Whether web search should be enabled.
16
+ */
17
+ webSearch: boolean;
18
+
19
+ /**
20
+ * Whether code interpreter should be enabled.
21
+ */
22
+ codeInterpreter: boolean;
23
+
24
+ /**
25
+ * Confidence score (0-1) for web search detection.
26
+ */
27
+ webSearchConfidence: number;
28
+
29
+ /**
30
+ * Confidence score (0-1) for code interpreter detection.
31
+ */
32
+ codeInterpreterConfidence: number;
33
+
34
+ /**
35
+ * Patterns that matched for web search.
36
+ */
37
+ webSearchMatches: string[];
38
+
39
+ /**
40
+ * Patterns that matched for code interpreter.
41
+ */
42
+ codeInterpreterMatches: string[];
43
+ }
44
+
45
+ /**
46
+ * Configuration for auto-detect behavior.
47
+ */
48
+ export interface AutoDetectConfig {
49
+ /**
50
+ * Minimum confidence threshold to enable a tool.
51
+ * @default 0.3
52
+ */
53
+ confidenceThreshold?: number;
54
+
55
+ /**
56
+ * Whether to include partial matches in detection.
57
+ * @default true
58
+ */
59
+ includePartialMatches?: boolean;
60
+ }
61
+
62
+ // ============================================================================
63
+ // Detection Patterns
64
+ // ============================================================================
65
+
66
+ /**
67
+ * Patterns that suggest web search would be helpful.
68
+ * Each pattern has an associated confidence weight.
69
+ */
70
+ const WEB_SEARCH_PATTERNS: Array<{ pattern: RegExp; weight: number; name: string }> = [
71
+ // Direct search requests
72
+ { pattern: /search\s+(for|the\s+web|online|internet)/i, weight: 1.0, name: 'direct_search' },
73
+ { pattern: /look\s+up\b/i, weight: 0.9, name: 'look_up' },
74
+ { pattern: /find\s+(information|info|data|details)\s+(about|on|regarding)/i, weight: 0.9, name: 'find_info' },
75
+
76
+ // Real-time/current information
77
+ {
78
+ pattern: /\b(latest|current|recent|today'?s?|now)\b.*\b(news|price|weather|update|version|status)/i,
79
+ weight: 1.0,
80
+ name: 'current_info'
81
+ },
82
+ { pattern: /what\s+(is|are)\s+the\s+(latest|current|newest)/i, weight: 0.95, name: 'what_latest' },
83
+ { pattern: /\b(right\s+now|at\s+the\s+moment|currently)\b/i, weight: 0.7, name: 'temporal' },
84
+
85
+ // News and events
86
+ { pattern: /\bnews\b.*\b(about|on|regarding)\b/i, weight: 0.85, name: 'news_about' },
87
+ { pattern: /what('?s|\s+is)\s+happening\b/i, weight: 0.8, name: 'happening' },
88
+ { pattern: /\b(headline|breaking|trending)\b/i, weight: 0.85, name: 'headlines' },
89
+
90
+ // Prices and markets
91
+ { pattern: /\b(price|cost|rate)\s+of\b/i, weight: 0.7, name: 'price' },
92
+ { pattern: /\b(stock|crypto|bitcoin|ethereum|btc|eth)\s+(price|value|market)/i, weight: 0.95, name: 'crypto_stock' },
93
+ { pattern: /how\s+much\s+(does|is|are).*\b(cost|worth)\b/i, weight: 0.7, name: 'how_much' },
94
+
95
+ // Weather
96
+ { pattern: /\bweather\b.*\b(in|at|for|today|tomorrow|forecast)\b/i, weight: 0.95, name: 'weather' },
97
+
98
+ // Documentation and APIs
99
+ { pattern: /\bdocumentation\b.*\b(for|of|about)\b/i, weight: 0.6, name: 'documentation' },
100
+ { pattern: /official\s+(website|docs|documentation|guide)/i, weight: 0.7, name: 'official_docs' },
101
+
102
+ // Verification needs
103
+ { pattern: /\b(verify|confirm|check|fact-check)\b.*\b(true|accurate|correct|real)\b/i, weight: 0.75, name: 'verify' },
104
+
105
+ // Comparisons with external data
106
+ { pattern: /\bcompare\b.*\b(prices|reviews|ratings|options)\b/i, weight: 0.65, name: 'compare' }
107
+ ];
108
+
109
+ /**
110
+ * Patterns that suggest code interpreter would be helpful.
111
+ * Each pattern has an associated confidence weight.
112
+ */
113
+ const CODE_INTERPRETER_PATTERNS: Array<{ pattern: RegExp; weight: number; name: string }> = [
114
+ // Direct code requests
115
+ { pattern: /write\s+(a\s+)?(function|code|script|program|algorithm)/i, weight: 0.95, name: 'write_code' },
116
+ { pattern: /\b(code|implement|program)\s+(this|that|the|a)/i, weight: 0.85, name: 'code_this' },
117
+ { pattern: /create\s+(a\s+)?(script|function|class|module)/i, weight: 0.9, name: 'create_script' },
118
+
119
+ // Mathematical calculations
120
+ { pattern: /\bcalculate\b.*\d+/i, weight: 0.9, name: 'calculate' },
121
+ { pattern: /\b(compute|evaluate|solve)\b.*\b(equation|expression|formula|problem)\b/i, weight: 0.9, name: 'compute' },
122
+ { pattern: /what\s+(is|are)\s+\d+[\s+\-*/^]+\d+/i, weight: 0.95, name: 'arithmetic' },
123
+ { pattern: /\b(factorial|fibonacci|prime|sqrt|power|exponent)\b/i, weight: 0.85, name: 'math_functions' },
124
+
125
+ // Data processing
126
+ {
127
+ pattern: /\b(parse|process|transform|convert)\s+(this\s+)?(data|json|csv|xml)/i,
128
+ weight: 0.85,
129
+ name: 'data_processing'
130
+ },
131
+ { pattern: /\b(analyze|process)\s+(this\s+)?(file|dataset|table)/i, weight: 0.8, name: 'analyze_data' },
132
+
133
+ // Debugging
134
+ { pattern: /\bdebug\b.*\b(this|my|the)\s+(code|function|script|program)/i, weight: 0.9, name: 'debug' },
135
+ { pattern: /\b(fix|correct|repair)\s+(this|my|the)\s+(error|bug|issue|problem)\b/i, weight: 0.85, name: 'fix_error' },
136
+ {
137
+ pattern: /why\s+(is|does)\s+(this|my)\s+(code|function)\s+(not\s+work|fail|error)/i,
138
+ weight: 0.9,
139
+ name: 'why_not_work'
140
+ },
141
+
142
+ // Testing
143
+ {
144
+ pattern: /\b(test|verify|validate)\s+(this|my|the)\s+(code|function|implementation)/i,
145
+ weight: 0.85,
146
+ name: 'test_code'
147
+ },
148
+ { pattern: /\brun\s+(this|my|the)\s+(code|script|program)/i, weight: 0.95, name: 'run_code' },
149
+ { pattern: /\bexecute\b.*\b(code|script|command)/i, weight: 0.95, name: 'execute' },
150
+
151
+ // Code blocks in input (handles various markdown formats)
152
+ { pattern: /```[\w]*[\s\S]*?```/, weight: 0.7, name: 'code_block' },
153
+
154
+ // Algorithm requests
155
+ { pattern: /\b(sort|search|traverse|optimize)\s+(algorithm|function|method)/i, weight: 0.85, name: 'algorithm' },
156
+
157
+ // Regex
158
+ { pattern: /\b(regex|regular\s+expression)\b/i, weight: 0.75, name: 'regex' },
159
+
160
+ // File operations
161
+ { pattern: /\b(read|write|create|delete)\s+(a\s+)?(file|directory|folder)/i, weight: 0.7, name: 'file_ops' }
162
+ ];
163
+
164
+ // ============================================================================
165
+ // Main Functions
166
+ // ============================================================================
167
+
168
+ /**
169
+ * Automatically detect which tools should be enabled based on prompt content.
170
+ *
171
+ * @param prompt - The user's prompt text
172
+ * @param config - Optional detection configuration
173
+ * @returns Detection result with tool recommendations
174
+ *
175
+ * @example
176
+ * ```ts
177
+ * const result = detectToolsFromPrompt('What is the current price of Bitcoin?');
178
+ * // result.webSearch === true
179
+ * // result.webSearchConfidence === 0.95
180
+ * ```
181
+ */
182
+ export function detectToolsFromPrompt(prompt: string, config: AutoDetectConfig = {}): AutoDetectToolsResult {
183
+ const { confidenceThreshold = 0.3, includePartialMatches = true } = config;
184
+
185
+ const webSearchResult = detectPatterns(prompt, WEB_SEARCH_PATTERNS, includePartialMatches);
186
+ const codeInterpreterResult = detectPatterns(prompt, CODE_INTERPRETER_PATTERNS, includePartialMatches);
187
+
188
+ return {
189
+ webSearch: webSearchResult.confidence >= confidenceThreshold,
190
+ codeInterpreter: codeInterpreterResult.confidence >= confidenceThreshold,
191
+ webSearchConfidence: webSearchResult.confidence,
192
+ codeInterpreterConfidence: codeInterpreterResult.confidence,
193
+ webSearchMatches: webSearchResult.matches,
194
+ codeInterpreterMatches: codeInterpreterResult.matches
195
+ };
196
+ }
197
+
198
+ /**
199
+ * Simple version that just returns boolean flags.
200
+ * Useful for quick checks without detailed confidence info.
201
+ *
202
+ * @param prompt - The user's prompt text
203
+ * @returns Object with boolean flags for each tool
204
+ */
205
+ export function shouldAutoEnableTools(prompt: string): {
206
+ webSearch: boolean;
207
+ codeInterpreter: boolean;
208
+ } {
209
+ const result = detectToolsFromPrompt(prompt);
210
+ return {
211
+ webSearch: result.webSearch,
212
+ codeInterpreter: result.codeInterpreter
213
+ };
214
+ }
215
+
216
+ // ============================================================================
217
+ // Helper Functions
218
+ // ============================================================================
219
+
220
+ /**
221
+ * Detect patterns in text and calculate confidence.
222
+ */
223
+ function detectPatterns(
224
+ text: string,
225
+ patterns: Array<{ pattern: RegExp; weight: number; name: string }>,
226
+ includePartial: boolean
227
+ ): { confidence: number; matches: string[] } {
228
+ const matches: string[] = [];
229
+ let maxWeight = 0;
230
+ let matchCount = 0;
231
+
232
+ for (const { pattern, weight, name } of patterns) {
233
+ if (pattern.test(text)) {
234
+ matches.push(name);
235
+ maxWeight = Math.max(maxWeight, weight);
236
+ matchCount++;
237
+ }
238
+ }
239
+
240
+ // Calculate confidence based on matches
241
+ // Use the max weight as the base, boosted by additional matches
242
+ let confidence = 0;
243
+ if (matchCount > 0) {
244
+ if (includePartial) {
245
+ // Boost confidence slightly for multiple matches (diminishing returns)
246
+ const boost = Math.min(0.15, (matchCount - 1) * 0.05);
247
+ confidence = Math.min(1.0, maxWeight + boost);
248
+ } else {
249
+ confidence = maxWeight;
250
+ }
251
+ }
252
+
253
+ return { confidence, matches };
254
+ }
255
+
256
+ /**
257
+ * Check if a prompt explicitly mentions not wanting tool usage.
258
+ * Useful for respecting user preferences.
259
+ */
260
+ export function hasToolOptOut(prompt: string): {
261
+ webSearch: boolean;
262
+ codeInterpreter: boolean;
263
+ } {
264
+ const webSearchOptOut = /(don'?t|do\s+not|without|no)\s+(search(ing)?|web|internet|online)/i.test(prompt);
265
+ // Match phrases like: "don't run", "without running code", "no code execution", etc.
266
+ // Also match "or running code" type phrases after a "without" earlier in sentence
267
+ const codeOptOut =
268
+ /(don'?t|do\s+not|without|no)\s+(run(ning)?|execut(e|ing)|cod(e|ing))/i.test(prompt) ||
269
+ /without\s+[\w\s]*running\s+code/i.test(prompt) ||
270
+ /(or|and)\s+running\s+code/i.test(prompt);
271
+
272
+ return {
273
+ webSearch: webSearchOptOut,
274
+ codeInterpreter: codeOptOut
275
+ };
276
+ }
@@ -3,6 +3,7 @@
3
3
  * @module
4
4
  */
5
5
 
6
+ export type { AutoDetectConfig, AutoDetectToolsResult } from './auto-detect';
6
7
  export type {
7
8
  KimiBuiltinTool,
8
9
  KimiCodeInterpreterConfig,
@@ -15,8 +16,11 @@ export type {
15
16
  KimiFunctionTool,
16
17
  KimiTool,
17
18
  PrepareToolsOptions,
18
- PrepareToolsResult
19
+ PrepareToolsResult,
20
+ ToolGuidanceOptions
19
21
  } from './prepare-tools';
22
+ // Auto-detection
23
+ export { detectToolsFromPrompt, hasToolOptOut, shouldAutoEnableTools } from './auto-detect';
20
24
  // Built-in tools
21
25
  export {
22
26
  KIMI_CODE_INTERPRETER_TOOL_NAME,
@@ -30,4 +34,4 @@ export {
30
34
  kimiTools
31
35
  } from './builtin-tools';
32
36
  // Tool preparation
33
- export { prepareKimiTools } from './prepare-tools';
37
+ export { generateToolGuidanceMessage, prepareKimiTools } from './prepare-tools';