@almadar/llm 1.0.16 → 2.0.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/LICENSE +21 -72
- package/README.md +25 -0
- package/dist/{chunk-56H37PN5.js → chunk-YJVZ6ZWO.js} +80 -57
- package/dist/chunk-YJVZ6ZWO.js.map +1 -0
- package/dist/client.js +5 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/package.json +11 -2
- package/src/client.ts +99 -76
- package/src/index.ts +2 -0
- package/dist/chunk-56H37PN5.js.map +0 -1
- package/dist/client.d.ts +0 -136
- package/dist/index.d.ts +0 -67
- package/dist/json-parser.d.ts +0 -43
- package/dist/rate-limiter-9XAWfHwe.d.ts +0 -98
- package/dist/structured-output.d.ts +0 -113
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@almadar/llm",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Multi-provider LLM client with rate limiting, token tracking, structured outputs, and continuation handling",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"zod": "^3.22.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
|
-
"@almadar/core": "
|
|
38
|
+
"@almadar/core": ">=2.0.0"
|
|
39
39
|
},
|
|
40
40
|
"peerDependenciesMeta": {
|
|
41
41
|
"@almadar/core": {
|
|
@@ -46,6 +46,15 @@
|
|
|
46
46
|
"tsup": "^8.0.0",
|
|
47
47
|
"typescript": "^5.3.0"
|
|
48
48
|
},
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "https://github.com/almadar-io/almadar.git",
|
|
52
|
+
"directory": "docs/packages/llm"
|
|
53
|
+
},
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public"
|
|
56
|
+
},
|
|
57
|
+
"homepage": "https://github.com/almadar-io/almadar#readme",
|
|
49
58
|
"scripts": {
|
|
50
59
|
"build": "tsup",
|
|
51
60
|
"dev": "tsup --watch",
|
package/src/client.ts
CHANGED
|
@@ -12,10 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { ChatOpenAI } from '@langchain/openai';
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
type ChatAnthropicCallOptions,
|
|
18
|
-
} from '@langchain/anthropic';
|
|
15
|
+
import { ChatAnthropic } from '@langchain/anthropic';
|
|
16
|
+
import type { BaseMessageLike } from '@langchain/core/messages';
|
|
19
17
|
import Anthropic from '@anthropic-ai/sdk';
|
|
20
18
|
import { z } from 'zod';
|
|
21
19
|
import {
|
|
@@ -26,81 +24,38 @@ import {
|
|
|
26
24
|
import { TokenTracker, getGlobalTokenTracker } from './token-tracker.js';
|
|
27
25
|
import { parseJsonResponse } from './json-parser.js';
|
|
28
26
|
|
|
29
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
-
type MessageLike = any;
|
|
31
|
-
|
|
32
27
|
// ============================================================================
|
|
33
|
-
//
|
|
28
|
+
// Anthropic Cache Control Helper
|
|
34
29
|
// ============================================================================
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (typeof input === 'string') {
|
|
43
|
-
messages = [{ role: 'user', content: input }];
|
|
44
|
-
} else {
|
|
45
|
-
messages = input;
|
|
31
|
+
function addCacheControlToSystemMessages(
|
|
32
|
+
messages: Array<{ role: string; content: string }>,
|
|
33
|
+
): BaseMessageLike[] {
|
|
34
|
+
return messages.map((msg) => {
|
|
35
|
+
if (msg.role !== 'system') {
|
|
36
|
+
return msg as BaseMessageLike;
|
|
46
37
|
}
|
|
47
38
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
type: 'text',
|
|
60
|
-
text: msg.content,
|
|
61
|
-
cache_control: { type: 'ephemeral' },
|
|
62
|
-
},
|
|
63
|
-
],
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (Array.isArray(msg.content)) {
|
|
68
|
-
const blocks = msg.content as Array<{
|
|
69
|
-
type?: string;
|
|
70
|
-
text?: string;
|
|
71
|
-
cache_control?: unknown;
|
|
72
|
-
}>;
|
|
73
|
-
const hasAnyCacheControl = blocks.some((b) => b.cache_control);
|
|
74
|
-
|
|
75
|
-
if (!hasAnyCacheControl) {
|
|
76
|
-
const transformedBlocks = blocks.map((block, idx) => {
|
|
77
|
-
if (block.type === 'text' && idx === blocks.length - 1) {
|
|
78
|
-
return {
|
|
79
|
-
...block,
|
|
80
|
-
cache_control: { type: 'ephemeral' },
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
return block;
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
return { ...msg, content: transformedBlocks };
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return msg;
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
return super.invoke(transformedMessages, options);
|
|
94
|
-
}
|
|
39
|
+
return {
|
|
40
|
+
role: msg.role,
|
|
41
|
+
content: [
|
|
42
|
+
{
|
|
43
|
+
type: 'text' as const,
|
|
44
|
+
text: msg.content,
|
|
45
|
+
cache_control: { type: 'ephemeral' },
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
} as BaseMessageLike;
|
|
49
|
+
});
|
|
95
50
|
}
|
|
96
51
|
|
|
97
|
-
type ChatModel = ChatOpenAI |
|
|
52
|
+
type ChatModel = ChatOpenAI | ChatAnthropic;
|
|
98
53
|
|
|
99
54
|
// ============================================================================
|
|
100
55
|
// Types
|
|
101
56
|
// ============================================================================
|
|
102
57
|
|
|
103
|
-
export type LLMProvider = 'openai' | 'deepseek' | 'anthropic' | 'kimi';
|
|
58
|
+
export type LLMProvider = 'openai' | 'deepseek' | 'anthropic' | 'kimi' | 'openrouter';
|
|
104
59
|
|
|
105
60
|
export interface ProviderConfig {
|
|
106
61
|
apiKey: string;
|
|
@@ -215,10 +170,24 @@ const PROVIDER_CONFIGS: Record<LLMProvider, () => ProviderConfig> = {
|
|
|
215
170
|
}
|
|
216
171
|
return {
|
|
217
172
|
apiKey,
|
|
218
|
-
baseUrl: 'https://api.moonshot.
|
|
173
|
+
baseUrl: 'https://api.moonshot.ai/v1',
|
|
219
174
|
defaultModel: 'kimi-k2.5',
|
|
220
175
|
};
|
|
221
176
|
},
|
|
177
|
+
openrouter: () => {
|
|
178
|
+
const apiKey = process.env.OPEN_ROUTER_API_KEY;
|
|
179
|
+
if (!apiKey) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
'OPEN_ROUTER_API_KEY environment variable is not set. ' +
|
|
182
|
+
'Please set it in your .env file or environment.',
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
apiKey,
|
|
187
|
+
baseUrl: 'https://openrouter.ai/api/v1',
|
|
188
|
+
defaultModel: 'qwen/qwen-2.5-72b-instruct', // Default to Qwen 2.5
|
|
189
|
+
};
|
|
190
|
+
},
|
|
222
191
|
};
|
|
223
192
|
|
|
224
193
|
export const DEEPSEEK_MODELS = {
|
|
@@ -246,6 +215,19 @@ export const KIMI_MODELS = {
|
|
|
246
215
|
K2_5: 'kimi-k2.5',
|
|
247
216
|
} as const;
|
|
248
217
|
|
|
218
|
+
export const OPENROUTER_MODELS = {
|
|
219
|
+
// Qwen models - JSON/structured data specialists
|
|
220
|
+
QWEN_2_5_72B: 'qwen/qwen-2.5-72b-instruct',
|
|
221
|
+
QWEN_2_5_CODER_32B: 'qwen/qwen-2.5-coder-32b-instruct',
|
|
222
|
+
QWEN_3_235B: 'qwen/qwen3-235b-a22b',
|
|
223
|
+
|
|
224
|
+
// Llama models - agentic workhorses
|
|
225
|
+
LLAMA_3_3_70B: 'meta-llama/llama-3.3-70b-instruct',
|
|
226
|
+
LLAMA_3_1_405B: 'meta-llama/llama-3.1-405b-instruct',
|
|
227
|
+
LLAMA_4_MAVERICK: 'meta-llama/llama-4-maverick',
|
|
228
|
+
LLAMA_4_SCOUT: 'meta-llama/llama-4-scout',
|
|
229
|
+
} as const;
|
|
230
|
+
|
|
249
231
|
const DEFAULT_TEMPERATURE = 0.3;
|
|
250
232
|
|
|
251
233
|
// ============================================================================
|
|
@@ -264,7 +246,9 @@ export class LLMClient {
|
|
|
264
246
|
|
|
265
247
|
constructor(options: LLMClientOptions = {}) {
|
|
266
248
|
this.provider = options.provider || 'openai';
|
|
267
|
-
|
|
249
|
+
// Kimi: 0.6 when thinking disabled (our default), 1.0 when thinking enabled
|
|
250
|
+
this.temperature = options.temperature ??
|
|
251
|
+
(this.provider === 'kimi' ? 0.6 : DEFAULT_TEMPERATURE);
|
|
268
252
|
this.streaming = options.streaming ?? false;
|
|
269
253
|
|
|
270
254
|
this.providerConfig = PROVIDER_CONFIGS[this.provider]();
|
|
@@ -311,7 +295,7 @@ export class LLMClient {
|
|
|
311
295
|
const temperature = options?.temperature ?? this.temperature;
|
|
312
296
|
|
|
313
297
|
if (this.provider === 'anthropic') {
|
|
314
|
-
return new
|
|
298
|
+
return new ChatAnthropic({
|
|
315
299
|
apiKey: this.providerConfig.apiKey,
|
|
316
300
|
model: this.modelName,
|
|
317
301
|
temperature,
|
|
@@ -381,13 +365,32 @@ export class LLMClient {
|
|
|
381
365
|
|
|
382
366
|
const timeout = this.provider === 'deepseek' ? 600000 : undefined;
|
|
383
367
|
|
|
368
|
+
// Kimi-k2.5: disable thinking to avoid reasoning_content issues with tool calls
|
|
369
|
+
// When thinking is disabled, temperature must be 0.6 (not 1.0)
|
|
370
|
+
const isKimi = this.provider === 'kimi';
|
|
371
|
+
const effectiveTemp = isKimi ? 0.6 : temperature;
|
|
372
|
+
|
|
373
|
+
// Build modelKwargs incrementally to avoid spread conflicts
|
|
374
|
+
const modelKwargs: Record<string, unknown> = {};
|
|
375
|
+
if (useCompletionTokens && maxTokens) {
|
|
376
|
+
modelKwargs.max_completion_tokens = maxTokens;
|
|
377
|
+
}
|
|
378
|
+
if (isKimi) {
|
|
379
|
+
modelKwargs.thinking = { type: 'disabled' };
|
|
380
|
+
}
|
|
381
|
+
// OpenRouter (Qwen): explicit tool_choice so the model doesn't ignore tool definitions
|
|
382
|
+
if (this.provider === 'openrouter') {
|
|
383
|
+
modelKwargs.tool_choice = 'auto';
|
|
384
|
+
}
|
|
385
|
+
|
|
384
386
|
return new ChatOpenAI({
|
|
385
387
|
apiKey: this.providerConfig.apiKey,
|
|
386
388
|
model: this.modelName,
|
|
387
|
-
temperature: useCompletionTokens ? undefined :
|
|
389
|
+
temperature: useCompletionTokens ? undefined : effectiveTemp,
|
|
388
390
|
streaming: this.streaming,
|
|
389
391
|
timeout,
|
|
390
|
-
...
|
|
392
|
+
...(Object.keys(modelKwargs).length > 0 ? { modelKwargs } : {}),
|
|
393
|
+
...(useCompletionTokens ? {} : maxTokens ? { maxTokens } : {}),
|
|
391
394
|
configuration: {
|
|
392
395
|
apiKey: this.providerConfig.apiKey,
|
|
393
396
|
...(this.providerConfig.baseUrl
|
|
@@ -468,10 +471,15 @@ export class LLMClient {
|
|
|
468
471
|
? this.getModelWithOptions({ maxTokens, temperature })
|
|
469
472
|
: this.model;
|
|
470
473
|
|
|
471
|
-
const
|
|
474
|
+
const messages = [
|
|
472
475
|
{ role: 'system', content: systemPrompt },
|
|
473
476
|
{ role: 'user', content: currentPrompt },
|
|
474
|
-
]
|
|
477
|
+
];
|
|
478
|
+
const response = await modelToUse.invoke(
|
|
479
|
+
this.provider === 'anthropic'
|
|
480
|
+
? addCacheControlToSystemMessages(messages)
|
|
481
|
+
: messages,
|
|
482
|
+
);
|
|
475
483
|
|
|
476
484
|
console.log(
|
|
477
485
|
`[LLMClient:call] Model responded in ${Date.now() - invokeStartTime}ms`,
|
|
@@ -605,10 +613,15 @@ export class LLMClient {
|
|
|
605
613
|
? this.getModelWithOptions({ maxTokens })
|
|
606
614
|
: this.model;
|
|
607
615
|
|
|
608
|
-
const
|
|
616
|
+
const messages = [
|
|
609
617
|
{ role: 'system', content: systemPrompt },
|
|
610
618
|
{ role: 'user', content: userPrompt },
|
|
611
|
-
]
|
|
619
|
+
];
|
|
620
|
+
const response = await modelToUse.invoke(
|
|
621
|
+
this.provider === 'anthropic'
|
|
622
|
+
? addCacheControlToSystemMessages(messages)
|
|
623
|
+
: messages,
|
|
624
|
+
);
|
|
612
625
|
|
|
613
626
|
let usage: LLMUsage | null = null;
|
|
614
627
|
if (response.usage_metadata) {
|
|
@@ -965,3 +978,13 @@ export function createKimiClient(
|
|
|
965
978
|
...options,
|
|
966
979
|
});
|
|
967
980
|
}
|
|
981
|
+
|
|
982
|
+
export function createOpenRouterClient(
|
|
983
|
+
options?: Partial<Omit<LLMClientOptions, 'provider'>>,
|
|
984
|
+
): LLMClient {
|
|
985
|
+
return new LLMClient({
|
|
986
|
+
provider: 'openrouter',
|
|
987
|
+
model: OPENROUTER_MODELS.QWEN_2_5_72B,
|
|
988
|
+
...options,
|
|
989
|
+
});
|
|
990
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -18,12 +18,14 @@ export {
|
|
|
18
18
|
createOpenAIClient,
|
|
19
19
|
createAnthropicClient,
|
|
20
20
|
createKimiClient,
|
|
21
|
+
createOpenRouterClient,
|
|
21
22
|
getAvailableProvider,
|
|
22
23
|
isProviderAvailable,
|
|
23
24
|
DEEPSEEK_MODELS,
|
|
24
25
|
OPENAI_MODELS,
|
|
25
26
|
ANTHROPIC_MODELS,
|
|
26
27
|
KIMI_MODELS,
|
|
28
|
+
OPENROUTER_MODELS,
|
|
27
29
|
type LLMProvider,
|
|
28
30
|
type ProviderConfig,
|
|
29
31
|
type LLMClientOptions,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["/**\n * Shared LLM Client\n *\n * Multi-provider LLM client with:\n * - OpenAI, DeepSeek, Anthropic, and Kimi support\n * - Anthropic prompt caching (CachingChatAnthropic)\n * - Rate limiting and retry logic\n * - Token tracking\n * - Structured output parsing with Zod\n *\n * @packageDocumentation\n */\n\nimport { ChatOpenAI } from '@langchain/openai';\nimport {\n ChatAnthropic,\n type ChatAnthropicCallOptions,\n} from '@langchain/anthropic';\nimport Anthropic from '@anthropic-ai/sdk';\nimport { z } from 'zod';\nimport {\n RateLimiter,\n getGlobalRateLimiter,\n type RateLimiterOptions,\n} from './rate-limiter.js';\nimport { TokenTracker, getGlobalTokenTracker } from './token-tracker.js';\nimport { parseJsonResponse } from './json-parser.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MessageLike = any;\n\n// ============================================================================\n// Caching Chat Anthropic Wrapper\n// ============================================================================\n\nclass CachingChatAnthropic extends ChatAnthropic {\n async invoke(\n input: MessageLike[] | string,\n options?: Partial<ChatAnthropicCallOptions>,\n ): Promise<MessageLike> {\n let messages: MessageLike[];\n if (typeof input === 'string') {\n messages = [{ role: 'user', content: input }];\n } else {\n messages = input;\n }\n\n const transformedMessages = messages.map((msg: MessageLike) => {\n const msgType = msg._getType?.() || msg.role || 'unknown';\n const isSystem = msgType === 'system';\n\n if (!isSystem) return msg;\n\n if (typeof msg.content === 'string') {\n return {\n ...msg,\n content: [\n {\n type: 'text',\n text: msg.content,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n\n if (Array.isArray(msg.content)) {\n const blocks = msg.content as Array<{\n type?: string;\n text?: string;\n cache_control?: unknown;\n }>;\n const hasAnyCacheControl = blocks.some((b) => b.cache_control);\n\n if (!hasAnyCacheControl) {\n const transformedBlocks = blocks.map((block, idx) => {\n if (block.type === 'text' && idx === blocks.length - 1) {\n return {\n ...block,\n cache_control: { type: 'ephemeral' },\n };\n }\n return block;\n });\n\n return { ...msg, content: transformedBlocks };\n }\n }\n\n return msg;\n });\n\n return super.invoke(transformedMessages, options);\n }\n}\n\ntype ChatModel = ChatOpenAI | CachingChatAnthropic;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type LLMProvider = 'openai' | 'deepseek' | 'anthropic' | 'kimi';\n\nexport interface ProviderConfig {\n apiKey: string;\n baseUrl?: string;\n defaultModel: string;\n}\n\nexport interface LLMClientOptions {\n provider?: LLMProvider;\n model?: string;\n temperature?: number;\n streaming?: boolean;\n rateLimiter?: RateLimiterOptions;\n useGlobalRateLimiter?: boolean;\n trackTokens?: boolean;\n}\n\nexport interface LLMCallOptions<T = unknown> {\n systemPrompt: string;\n userPrompt: string;\n schema?: z.ZodSchema<T>;\n maxRetries?: number;\n retryWithContext?: boolean;\n maxTokens?: number;\n skipSchemaValidation?: boolean;\n temperature?: number;\n}\n\nexport interface CacheableBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\nexport interface CacheAwareLLMCallOptions<T = unknown>\n extends LLMCallOptions<T> {\n systemBlocks?: CacheableBlock[];\n userBlocks?: CacheableBlock[];\n rawText?: boolean;\n}\n\nexport interface LLMUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport type LLMFinishReason =\n | 'stop'\n | 'length'\n | 'content_filter'\n | 'tool_calls'\n | null;\n\nexport interface LLMResponse<T> {\n data: T;\n raw: string;\n finishReason: LLMFinishReason;\n usage: LLMUsage | null;\n}\n\n// ============================================================================\n// Provider Configuration\n// ============================================================================\n\nconst PROVIDER_CONFIGS: Record<LLMProvider, () => ProviderConfig> = {\n openai: () => {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'OPENAI_API_KEY environment variable is not set. ' +\n 'Please set it in your .env file or environment.',\n );\n }\n return { apiKey, baseUrl: undefined, defaultModel: 'gpt-4o' };\n },\n deepseek: () => {\n const apiKey = process.env.DEEPSEEK_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'DEEPSEEK_API_KEY environment variable is not set. ' +\n 'Please set it in your .env file or environment.',\n );\n }\n return {\n apiKey,\n baseUrl: 'https://api.deepseek.com/v1',\n defaultModel: 'deepseek-chat',\n };\n },\n anthropic: () => {\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'ANTHROPIC_API_KEY environment variable is not set. ' +\n 'Please set it in your .env file or environment.',\n );\n }\n return {\n apiKey,\n baseUrl: undefined,\n defaultModel: 'claude-sonnet-4-5-20250929',\n };\n },\n kimi: () => {\n const apiKey = process.env.KIMI_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'KIMI_API_KEY environment variable is not set. ' +\n 'Please set it in your .env file or environment.',\n );\n }\n return {\n apiKey,\n baseUrl: 'https://api.moonshot.cn/v1',\n defaultModel: 'kimi-k2.5',\n };\n },\n};\n\nexport const DEEPSEEK_MODELS = {\n CHAT: 'deepseek-chat',\n CODER: 'deepseek-coder',\n REASONER: 'deepseek-reasoner',\n} as const;\n\nexport const OPENAI_MODELS = {\n GPT4O: 'gpt-4o',\n GPT4O_MINI: 'gpt-4o-mini',\n GPT4_TURBO: 'gpt-4-turbo',\n GPT35_TURBO: 'gpt-3.5-turbo',\n GPT_5_1: 'gpt-5.1',\n} as const;\n\nexport const ANTHROPIC_MODELS = {\n CLAUDE_SONNET_4_5: 'claude-sonnet-4-5-20250929',\n CLAUDE_SONNET_4: 'claude-sonnet-4-20250514',\n CLAUDE_OPUS_4_5: 'claude-opus-4-5-20250929',\n CLAUDE_3_5_HAIKU: 'claude-3-5-haiku-20241022',\n} as const;\n\nexport const KIMI_MODELS = {\n K2_5: 'kimi-k2.5',\n} as const;\n\nconst DEFAULT_TEMPERATURE = 0.3;\n\n// ============================================================================\n// LLM Client\n// ============================================================================\n\nexport class LLMClient {\n private model: ChatModel;\n private rateLimiter: RateLimiter;\n private tokenTracker: TokenTracker | null;\n private modelName: string;\n private provider: LLMProvider;\n private providerConfig: ProviderConfig;\n private temperature: number;\n private streaming: boolean;\n\n constructor(options: LLMClientOptions = {}) {\n this.provider = options.provider || 'openai';\n this.temperature = options.temperature ?? DEFAULT_TEMPERATURE;\n this.streaming = options.streaming ?? false;\n\n this.providerConfig = PROVIDER_CONFIGS[this.provider]();\n this.modelName = options.model || this.providerConfig.defaultModel;\n\n const keyPreview = this.providerConfig.apiKey.slice(-4);\n console.log(\n `[LLMClient] Provider: ${this.provider}, Model: ${this.modelName}, Key: ****${keyPreview}`,\n );\n if (this.providerConfig.baseUrl) {\n console.log(\n `[LLMClient] Using custom base URL: ${this.providerConfig.baseUrl}`,\n );\n }\n\n this.model = this.createModel();\n\n this.rateLimiter =\n options.useGlobalRateLimiter !== false\n ? getGlobalRateLimiter(options.rateLimiter)\n : new RateLimiter(options.rateLimiter);\n\n this.tokenTracker =\n options.trackTokens !== false\n ? getGlobalTokenTracker(this.modelName)\n : null;\n }\n\n private usesMaxCompletionTokens(): boolean {\n const model = this.modelName.toLowerCase();\n return (\n model.startsWith('o1') ||\n model.startsWith('gpt-5') ||\n model.includes('o1-') ||\n model.includes('o3')\n );\n }\n\n private createModel(options?: {\n maxTokens?: number;\n temperature?: number;\n }): ChatModel {\n const maxTokens = options?.maxTokens;\n const temperature = options?.temperature ?? this.temperature;\n\n if (this.provider === 'anthropic') {\n return new CachingChatAnthropic({\n apiKey: this.providerConfig.apiKey,\n model: this.modelName,\n temperature,\n streaming: this.streaming,\n maxTokens: maxTokens || 8192,\n callbacks: [\n {\n handleLLMEnd: (output) => {\n const generation = output.generations?.[0]?.[0];\n const usage = (\n generation as unknown as {\n message?: {\n usage_metadata?: {\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n input_tokens?: number;\n output_tokens?: number;\n };\n };\n }\n )?.message?.usage_metadata;\n\n if (usage) {\n const cacheCreated = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n const inputTokens = usage.input_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? 0;\n\n if (cacheCreated > 0) {\n console.log(\n `[LLMClient:Anthropic] Cache WRITE: ${cacheCreated} tokens cached`,\n );\n }\n if (cacheRead > 0) {\n const savingsPercent = Math.round(\n (cacheRead / (cacheRead + inputTokens)) * 100,\n );\n console.log(\n `[LLMClient:Anthropic] Cache HIT: ${cacheRead} tokens (~${savingsPercent}% of prompt)`,\n );\n }\n if (cacheCreated === 0 && cacheRead === 0 && inputTokens > 0) {\n if (inputTokens < 500) {\n console.log(\n `[LLMClient:Anthropic] ${inputTokens} input, ${outputTokens} output tokens (likely cached)`,\n );\n } else {\n console.log(\n `[LLMClient:Anthropic] ${inputTokens} input, ${outputTokens} output tokens`,\n );\n }\n }\n }\n },\n },\n ],\n });\n }\n\n const useCompletionTokens = this.usesMaxCompletionTokens();\n\n const tokenConfig = maxTokens\n ? useCompletionTokens\n ? { modelKwargs: { max_completion_tokens: maxTokens } }\n : { maxTokens }\n : {};\n\n const timeout = this.provider === 'deepseek' ? 600000 : undefined;\n\n return new ChatOpenAI({\n apiKey: this.providerConfig.apiKey,\n model: this.modelName,\n temperature: useCompletionTokens ? undefined : temperature,\n streaming: this.streaming,\n timeout,\n ...tokenConfig,\n configuration: {\n apiKey: this.providerConfig.apiKey,\n ...(this.providerConfig.baseUrl\n ? { baseURL: this.providerConfig.baseUrl }\n : {}),\n },\n });\n }\n\n private getModelWithOptions(options: {\n maxTokens?: number;\n temperature?: number;\n }): ChatModel {\n return this.createModel(options);\n }\n\n getProvider(): LLMProvider {\n return this.provider;\n }\n\n getModelName(): string {\n return this.modelName;\n }\n\n getModel(): ChatModel {\n return this.model;\n }\n\n getRateLimiterStatus() {\n return this.rateLimiter.getStatus();\n }\n\n getTokenUsage() {\n return this.tokenTracker?.getSummary() ?? null;\n }\n\n async call<T>(options: LLMCallOptions<T>): Promise<T> {\n const response = await this.callWithMetadata(options);\n return response.data;\n }\n\n async callWithMetadata<T>(options: LLMCallOptions<T>): Promise<LLMResponse<T>> {\n const {\n systemPrompt,\n userPrompt,\n schema,\n maxRetries = 2,\n retryWithContext = true,\n maxTokens,\n skipSchemaValidation = false,\n temperature,\n } = options;\n\n let currentPrompt = userPrompt;\n let lastError: Error | null = null;\n\n console.log(\n `[LLMClient:call] Starting call to ${this.provider}/${this.modelName}`,\n );\n console.log(`[LLMClient:call] Prompt length: ${userPrompt.length} chars`);\n if (maxTokens) {\n console.log(`[LLMClient:call] Max tokens: ${maxTokens}`);\n }\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n console.log(\n `[LLMClient:call] Attempt ${attempt + 1}/${maxRetries + 1}...`,\n );\n const attemptStartTime = Date.now();\n\n const result = await this.rateLimiter.execute(async () => {\n console.log(`[LLMClient:call] Invoking model...`);\n const invokeStartTime = Date.now();\n\n const modelToUse =\n maxTokens || temperature !== undefined\n ? this.getModelWithOptions({ maxTokens, temperature })\n : this.model;\n\n const response = await modelToUse.invoke([\n { role: 'system', content: systemPrompt },\n { role: 'user', content: currentPrompt },\n ]);\n\n console.log(\n `[LLMClient:call] Model responded in ${Date.now() - invokeStartTime}ms`,\n );\n\n let usage: LLMUsage | null = null;\n if (response.usage_metadata) {\n const usageMeta = response.usage_metadata as {\n input_tokens?: number;\n output_tokens?: number;\n };\n usage = {\n promptTokens: usageMeta.input_tokens || 0,\n completionTokens: usageMeta.output_tokens || 0,\n totalTokens:\n (usageMeta.input_tokens || 0) +\n (usageMeta.output_tokens || 0),\n };\n console.log(\n `[LLMClient:call] Tokens used: ${usage.promptTokens} in, ${usage.completionTokens} out`,\n );\n\n if (this.tokenTracker) {\n this.tokenTracker.addUsage(\n usage.promptTokens,\n usage.completionTokens,\n );\n }\n }\n\n const finishReason = this.extractFinishReason(response);\n if (finishReason === 'length') {\n console.warn(\n `[LLMClient:call] Response truncated (finish_reason=length)`,\n );\n }\n\n const content =\n typeof response.content === 'string'\n ? response.content\n : JSON.stringify(response.content);\n\n console.log(\n `[LLMClient:call] Response length: ${content.length} chars, finish_reason: ${finishReason}`,\n );\n\n return { content, finishReason, usage };\n });\n\n console.log(\n `[LLMClient:call] Attempt ${attempt + 1} completed in ${Date.now() - attemptStartTime}ms, parsing response...`,\n );\n\n const parsed = skipSchemaValidation\n ? (parseJsonResponse(result.content, undefined) as T)\n : parseJsonResponse(result.content, schema);\n console.log(\n `[LLMClient:call] Response parsed successfully${skipSchemaValidation ? ' (schema validation skipped)' : ''}`,\n );\n\n return {\n data: parsed,\n raw: result.content,\n finishReason: result.finishReason,\n usage: result.usage,\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n console.error(\n `[LLMClient:call] Attempt ${attempt + 1} failed:`,\n lastError.message,\n );\n\n if (this.isRateLimitError(lastError)) {\n console.error(`[LLMClient:call] Rate limit error, not retrying`);\n throw lastError;\n }\n\n if (attempt < maxRetries && retryWithContext) {\n console.log(`[LLMClient:call] Will retry with error context`);\n currentPrompt =\n `${userPrompt}\\n\\n` +\n `[Previous attempt failed with: ${lastError.message}]\\n` +\n `Please output valid JSON that matches the expected schema.`;\n }\n }\n }\n\n console.error(`[LLMClient:call] All attempts exhausted, throwing error`);\n throw lastError;\n }\n\n private extractFinishReason(\n response: Awaited<ReturnType<ChatOpenAI['invoke']>>,\n ): LLMFinishReason {\n const metadata = response.response_metadata as\n | Record<string, unknown>\n | undefined;\n if (metadata?.finish_reason) {\n const reason = metadata.finish_reason as string;\n if (\n reason === 'stop' ||\n reason === 'length' ||\n reason === 'content_filter' ||\n reason === 'tool_calls'\n ) {\n return reason;\n }\n }\n return null;\n }\n\n async callRaw(options: {\n systemPrompt: string;\n userPrompt: string;\n maxTokens?: number;\n }): Promise<string> {\n const response = await this.callRawWithMetadata(options);\n return response.raw;\n }\n\n async callRawWithMetadata(options: {\n systemPrompt: string;\n userPrompt: string;\n maxTokens?: number;\n }): Promise<Omit<LLMResponse<string>, 'data'> & { raw: string }> {\n const { systemPrompt, userPrompt, maxTokens } = options;\n\n return this.rateLimiter.execute(async () => {\n const modelToUse = maxTokens\n ? this.getModelWithOptions({ maxTokens })\n : this.model;\n\n const response = await modelToUse.invoke([\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ]);\n\n let usage: LLMUsage | null = null;\n if (response.usage_metadata) {\n const usageMeta = response.usage_metadata as {\n input_tokens?: number;\n output_tokens?: number;\n };\n usage = {\n promptTokens: usageMeta.input_tokens || 0,\n completionTokens: usageMeta.output_tokens || 0,\n totalTokens:\n (usageMeta.input_tokens || 0) + (usageMeta.output_tokens || 0),\n };\n\n if (this.tokenTracker) {\n this.tokenTracker.addUsage(\n usage.promptTokens,\n usage.completionTokens,\n );\n }\n }\n\n const finishReason = this.extractFinishReason(response);\n const content =\n typeof response.content === 'string'\n ? response.content\n : JSON.stringify(response.content);\n\n return { raw: content, finishReason, usage };\n });\n }\n\n private isRateLimitError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('429') ||\n message.includes('quota exceeded')\n );\n }\n\n // ==========================================================================\n // Anthropic Cache Control Support\n // ==========================================================================\n\n async callWithCache<T>(\n options: CacheAwareLLMCallOptions<T>,\n ): Promise<LLMResponse<T>> {\n const {\n systemPrompt,\n userPrompt,\n systemBlocks,\n userBlocks,\n schema,\n maxRetries = 2,\n maxTokens,\n skipSchemaValidation = false,\n temperature,\n rawText = false,\n } = options;\n\n if (this.provider !== 'anthropic') {\n console.log(\n `[LLMClient:callWithCache] Provider ${this.provider} doesn't support caching, using regular call`,\n );\n return this.callWithMetadata(options);\n }\n\n const cacheableCount =\n (systemBlocks || []).filter((b) => b.cache_control).length +\n (userBlocks || []).filter((b) => b.cache_control).length;\n console.log(\n `[LLMClient:callWithCache] ${cacheableCount} cacheable block(s)`,\n );\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n console.log(\n `[LLMClient:callWithCache] Attempt ${attempt + 1}/${maxRetries + 1}...`,\n );\n\n const result = await this.rateLimiter.execute(async () => {\n const anthropic = new Anthropic();\n\n const systemContent =\n systemBlocks && systemBlocks.length > 0\n ? systemBlocks.map((b) => ({\n type: 'text' as const,\n text: b.text,\n ...(b.cache_control\n ? { cache_control: b.cache_control }\n : {}),\n }))\n : systemPrompt\n ? [{ type: 'text' as const, text: systemPrompt }]\n : [];\n\n const userContent =\n userBlocks && userBlocks.length > 0\n ? userBlocks.map((b) => ({\n type: 'text' as const,\n text: b.text,\n ...(b.cache_control\n ? { cache_control: b.cache_control }\n : {}),\n }))\n : userPrompt\n ? [{ type: 'text' as const, text: userPrompt }]\n : [];\n\n const response = await anthropic.messages.create({\n model: this.modelName,\n max_tokens: maxTokens || 8192,\n temperature: temperature ?? 0,\n system: systemContent,\n messages: [{ role: 'user', content: userContent }],\n });\n\n const textContent = response.content.find((c) => c.type === 'text');\n const content =\n textContent && 'text' in textContent ? textContent.text : '';\n\n const apiUsage = response.usage as {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n\n const cacheRead = apiUsage.cache_read_input_tokens || 0;\n const cacheCreation = apiUsage.cache_creation_input_tokens || 0;\n\n if (cacheCreation > 0) {\n console.log(\n `[LLMClient:callWithCache] Cache WRITE: ${cacheCreation} tokens`,\n );\n }\n if (cacheRead > 0) {\n const savingsPercent = Math.round(\n (cacheRead / (cacheRead + apiUsage.input_tokens)) * 100,\n );\n console.log(\n `[LLMClient:callWithCache] Cache HIT: ${cacheRead} tokens (~${savingsPercent}% of prompt)`,\n );\n }\n if (cacheCreation === 0 && cacheRead === 0) {\n console.log(\n `[LLMClient:callWithCache] No caching: ${apiUsage.input_tokens} input tokens`,\n );\n }\n\n const usage: LLMUsage = {\n promptTokens: apiUsage.input_tokens,\n completionTokens: apiUsage.output_tokens,\n totalTokens: apiUsage.input_tokens + apiUsage.output_tokens,\n };\n\n if (this.tokenTracker) {\n this.tokenTracker.addUsage(\n usage.promptTokens,\n usage.completionTokens,\n );\n }\n\n const finishReason =\n response.stop_reason === 'end_turn'\n ? 'stop'\n : response.stop_reason;\n\n return {\n content,\n finishReason: finishReason as LLMFinishReason,\n usage,\n };\n });\n\n let parsed: T;\n if (rawText) {\n parsed = result.content as unknown as T;\n } else if (skipSchemaValidation) {\n parsed = parseJsonResponse(result.content, undefined) as T;\n } else {\n parsed = parseJsonResponse(result.content, schema);\n }\n\n return {\n data: parsed,\n raw: result.content,\n finishReason: result.finishReason,\n usage: result.usage,\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n console.error(\n `[LLMClient:callWithCache] Attempt ${attempt + 1} failed:`,\n lastError.message,\n );\n\n if (this.isRateLimitError(lastError)) {\n throw lastError;\n }\n }\n }\n\n throw lastError;\n }\n\n static cacheableBlock(text: string, cache = true): CacheableBlock {\n return cache\n ? { type: 'text', text, cache_control: { type: 'ephemeral' } }\n : { type: 'text', text };\n }\n}\n\n// ============================================================================\n// Singleton Instances\n// ============================================================================\n\nconst sharedClients: Partial<Record<LLMProvider, LLMClient>> = {};\n\nexport function getSharedLLMClient(options?: LLMClientOptions): LLMClient {\n const provider = options?.provider || 'openai';\n if (!sharedClients[provider]) {\n sharedClients[provider] = new LLMClient(options);\n }\n return sharedClients[provider]!;\n}\n\nexport function resetSharedLLMClient(provider?: LLMProvider): void {\n if (provider) {\n delete sharedClients[provider];\n } else {\n for (const key of Object.keys(sharedClients) as LLMProvider[]) {\n delete sharedClients[key];\n }\n }\n}\n\n// ============================================================================\n// Provider Detection\n// ============================================================================\n\nexport function getAvailableProvider(): LLMProvider {\n if (process.env.ANTHROPIC_API_KEY) return 'anthropic';\n if (process.env.DEEPSEEK_API_KEY) return 'deepseek';\n if (process.env.KIMI_API_KEY) return 'kimi';\n if (process.env.OPENAI_API_KEY) return 'openai';\n throw new Error(\n 'No LLM API key found. Please set ANTHROPIC_API_KEY, OPENAI_API_KEY, DEEPSEEK_API_KEY, or KIMI_API_KEY.',\n );\n}\n\nexport function isProviderAvailable(provider: LLMProvider): boolean {\n switch (provider) {\n case 'openai':\n return !!process.env.OPENAI_API_KEY;\n case 'deepseek':\n return !!process.env.DEEPSEEK_API_KEY;\n case 'anthropic':\n return !!process.env.ANTHROPIC_API_KEY;\n case 'kimi':\n return !!process.env.KIMI_API_KEY;\n default:\n return false;\n }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\nexport function createRequirementsClient(\n options?: Partial<LLMClientOptions>,\n): LLMClient {\n const provider = options?.provider || getAvailableProvider();\n const defaultModel =\n provider === 'deepseek' ? DEEPSEEK_MODELS.CHAT : OPENAI_MODELS.GPT_5_1;\n return new LLMClient({\n provider,\n model: defaultModel,\n temperature: 0.3,\n ...options,\n });\n}\n\nexport function createCreativeClient(\n options?: Partial<LLMClientOptions>,\n): LLMClient {\n const provider = options?.provider || getAvailableProvider();\n const defaultModel =\n provider === 'deepseek' ? DEEPSEEK_MODELS.REASONER : OPENAI_MODELS.GPT4O;\n return new LLMClient({\n provider,\n model: defaultModel,\n temperature: 0.7,\n ...options,\n });\n}\n\nexport function createFixClient(\n options?: Partial<LLMClientOptions>,\n): LLMClient {\n const provider = options?.provider || getAvailableProvider();\n const defaultModel =\n provider === 'deepseek'\n ? DEEPSEEK_MODELS.CHAT\n : OPENAI_MODELS.GPT4O_MINI;\n return new LLMClient({\n provider,\n model: defaultModel,\n temperature: 0.2,\n ...options,\n });\n}\n\nexport function createDeepSeekClient(\n options?: Partial<Omit<LLMClientOptions, 'provider'>>,\n): LLMClient {\n return new LLMClient({\n provider: 'deepseek',\n model: DEEPSEEK_MODELS.CHAT,\n ...options,\n });\n}\n\nexport function createOpenAIClient(\n options?: Partial<Omit<LLMClientOptions, 'provider'>>,\n): LLMClient {\n return new LLMClient({\n provider: 'openai',\n model: OPENAI_MODELS.GPT4O,\n ...options,\n });\n}\n\nexport function createAnthropicClient(\n options?: Partial<Omit<LLMClientOptions, 'provider'>>,\n): LLMClient {\n return new LLMClient({\n provider: 'anthropic',\n model: ANTHROPIC_MODELS.CLAUDE_SONNET_4_5,\n ...options,\n });\n}\n\nexport function createKimiClient(\n options?: Partial<Omit<LLMClientOptions, 'provider'>>,\n): LLMClient {\n return new LLMClient({\n provider: 'kimi',\n model: KIMI_MODELS.K2_5,\n ...options,\n });\n}\n"],"mappings":"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","names":[]}
|
package/dist/client.d.ts
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { a as RateLimiterOptions, b as TokenUsage } from './rate-limiter-9XAWfHwe.js';
|
|
2
|
-
import { ChatOpenAI } from '@langchain/openai';
|
|
3
|
-
import { ChatAnthropic, ChatAnthropicCallOptions } from '@langchain/anthropic';
|
|
4
|
-
import { z } from 'zod';
|
|
5
|
-
|
|
6
|
-
type MessageLike = any;
|
|
7
|
-
declare class CachingChatAnthropic extends ChatAnthropic {
|
|
8
|
-
invoke(input: MessageLike[] | string, options?: Partial<ChatAnthropicCallOptions>): Promise<MessageLike>;
|
|
9
|
-
}
|
|
10
|
-
type ChatModel = ChatOpenAI | CachingChatAnthropic;
|
|
11
|
-
type LLMProvider = 'openai' | 'deepseek' | 'anthropic' | 'kimi';
|
|
12
|
-
interface ProviderConfig {
|
|
13
|
-
apiKey: string;
|
|
14
|
-
baseUrl?: string;
|
|
15
|
-
defaultModel: string;
|
|
16
|
-
}
|
|
17
|
-
interface LLMClientOptions {
|
|
18
|
-
provider?: LLMProvider;
|
|
19
|
-
model?: string;
|
|
20
|
-
temperature?: number;
|
|
21
|
-
streaming?: boolean;
|
|
22
|
-
rateLimiter?: RateLimiterOptions;
|
|
23
|
-
useGlobalRateLimiter?: boolean;
|
|
24
|
-
trackTokens?: boolean;
|
|
25
|
-
}
|
|
26
|
-
interface LLMCallOptions<T = unknown> {
|
|
27
|
-
systemPrompt: string;
|
|
28
|
-
userPrompt: string;
|
|
29
|
-
schema?: z.ZodSchema<T>;
|
|
30
|
-
maxRetries?: number;
|
|
31
|
-
retryWithContext?: boolean;
|
|
32
|
-
maxTokens?: number;
|
|
33
|
-
skipSchemaValidation?: boolean;
|
|
34
|
-
temperature?: number;
|
|
35
|
-
}
|
|
36
|
-
interface CacheableBlock {
|
|
37
|
-
type: 'text';
|
|
38
|
-
text: string;
|
|
39
|
-
cache_control?: {
|
|
40
|
-
type: 'ephemeral';
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
interface CacheAwareLLMCallOptions<T = unknown> extends LLMCallOptions<T> {
|
|
44
|
-
systemBlocks?: CacheableBlock[];
|
|
45
|
-
userBlocks?: CacheableBlock[];
|
|
46
|
-
rawText?: boolean;
|
|
47
|
-
}
|
|
48
|
-
interface LLMUsage {
|
|
49
|
-
promptTokens: number;
|
|
50
|
-
completionTokens: number;
|
|
51
|
-
totalTokens: number;
|
|
52
|
-
}
|
|
53
|
-
type LLMFinishReason = 'stop' | 'length' | 'content_filter' | 'tool_calls' | null;
|
|
54
|
-
interface LLMResponse<T> {
|
|
55
|
-
data: T;
|
|
56
|
-
raw: string;
|
|
57
|
-
finishReason: LLMFinishReason;
|
|
58
|
-
usage: LLMUsage | null;
|
|
59
|
-
}
|
|
60
|
-
declare const DEEPSEEK_MODELS: {
|
|
61
|
-
readonly CHAT: "deepseek-chat";
|
|
62
|
-
readonly CODER: "deepseek-coder";
|
|
63
|
-
readonly REASONER: "deepseek-reasoner";
|
|
64
|
-
};
|
|
65
|
-
declare const OPENAI_MODELS: {
|
|
66
|
-
readonly GPT4O: "gpt-4o";
|
|
67
|
-
readonly GPT4O_MINI: "gpt-4o-mini";
|
|
68
|
-
readonly GPT4_TURBO: "gpt-4-turbo";
|
|
69
|
-
readonly GPT35_TURBO: "gpt-3.5-turbo";
|
|
70
|
-
readonly GPT_5_1: "gpt-5.1";
|
|
71
|
-
};
|
|
72
|
-
declare const ANTHROPIC_MODELS: {
|
|
73
|
-
readonly CLAUDE_SONNET_4_5: "claude-sonnet-4-5-20250929";
|
|
74
|
-
readonly CLAUDE_SONNET_4: "claude-sonnet-4-20250514";
|
|
75
|
-
readonly CLAUDE_OPUS_4_5: "claude-opus-4-5-20250929";
|
|
76
|
-
readonly CLAUDE_3_5_HAIKU: "claude-3-5-haiku-20241022";
|
|
77
|
-
};
|
|
78
|
-
declare const KIMI_MODELS: {
|
|
79
|
-
readonly K2_5: "kimi-k2.5";
|
|
80
|
-
};
|
|
81
|
-
declare class LLMClient {
|
|
82
|
-
private model;
|
|
83
|
-
private rateLimiter;
|
|
84
|
-
private tokenTracker;
|
|
85
|
-
private modelName;
|
|
86
|
-
private provider;
|
|
87
|
-
private providerConfig;
|
|
88
|
-
private temperature;
|
|
89
|
-
private streaming;
|
|
90
|
-
constructor(options?: LLMClientOptions);
|
|
91
|
-
private usesMaxCompletionTokens;
|
|
92
|
-
private createModel;
|
|
93
|
-
private getModelWithOptions;
|
|
94
|
-
getProvider(): LLMProvider;
|
|
95
|
-
getModelName(): string;
|
|
96
|
-
getModel(): ChatModel;
|
|
97
|
-
getRateLimiterStatus(): {
|
|
98
|
-
queueLength: number;
|
|
99
|
-
activeRequests: number;
|
|
100
|
-
minuteTokens: number;
|
|
101
|
-
secondTokens: number;
|
|
102
|
-
backoffMs: number;
|
|
103
|
-
};
|
|
104
|
-
getTokenUsage(): TokenUsage | null;
|
|
105
|
-
call<T>(options: LLMCallOptions<T>): Promise<T>;
|
|
106
|
-
callWithMetadata<T>(options: LLMCallOptions<T>): Promise<LLMResponse<T>>;
|
|
107
|
-
private extractFinishReason;
|
|
108
|
-
callRaw(options: {
|
|
109
|
-
systemPrompt: string;
|
|
110
|
-
userPrompt: string;
|
|
111
|
-
maxTokens?: number;
|
|
112
|
-
}): Promise<string>;
|
|
113
|
-
callRawWithMetadata(options: {
|
|
114
|
-
systemPrompt: string;
|
|
115
|
-
userPrompt: string;
|
|
116
|
-
maxTokens?: number;
|
|
117
|
-
}): Promise<Omit<LLMResponse<string>, 'data'> & {
|
|
118
|
-
raw: string;
|
|
119
|
-
}>;
|
|
120
|
-
private isRateLimitError;
|
|
121
|
-
callWithCache<T>(options: CacheAwareLLMCallOptions<T>): Promise<LLMResponse<T>>;
|
|
122
|
-
static cacheableBlock(text: string, cache?: boolean): CacheableBlock;
|
|
123
|
-
}
|
|
124
|
-
declare function getSharedLLMClient(options?: LLMClientOptions): LLMClient;
|
|
125
|
-
declare function resetSharedLLMClient(provider?: LLMProvider): void;
|
|
126
|
-
declare function getAvailableProvider(): LLMProvider;
|
|
127
|
-
declare function isProviderAvailable(provider: LLMProvider): boolean;
|
|
128
|
-
declare function createRequirementsClient(options?: Partial<LLMClientOptions>): LLMClient;
|
|
129
|
-
declare function createCreativeClient(options?: Partial<LLMClientOptions>): LLMClient;
|
|
130
|
-
declare function createFixClient(options?: Partial<LLMClientOptions>): LLMClient;
|
|
131
|
-
declare function createDeepSeekClient(options?: Partial<Omit<LLMClientOptions, 'provider'>>): LLMClient;
|
|
132
|
-
declare function createOpenAIClient(options?: Partial<Omit<LLMClientOptions, 'provider'>>): LLMClient;
|
|
133
|
-
declare function createAnthropicClient(options?: Partial<Omit<LLMClientOptions, 'provider'>>): LLMClient;
|
|
134
|
-
declare function createKimiClient(options?: Partial<Omit<LLMClientOptions, 'provider'>>): LLMClient;
|
|
135
|
-
|
|
136
|
-
export { ANTHROPIC_MODELS, type CacheAwareLLMCallOptions, type CacheableBlock, DEEPSEEK_MODELS, KIMI_MODELS, type LLMCallOptions, LLMClient, type LLMClientOptions, type LLMFinishReason, type LLMProvider, type LLMResponse, type LLMUsage, OPENAI_MODELS, type ProviderConfig, createAnthropicClient, createCreativeClient, createDeepSeekClient, createFixClient, createKimiClient, createOpenAIClient, createRequirementsClient, getAvailableProvider, getSharedLLMClient, isProviderAvailable, resetSharedLLMClient };
|
package/dist/index.d.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { LLMFinishReason, LLMClient } from './client.js';
|
|
2
|
-
export { ANTHROPIC_MODELS, CacheAwareLLMCallOptions, CacheableBlock, DEEPSEEK_MODELS, KIMI_MODELS, LLMCallOptions, LLMClientOptions, LLMProvider, LLMResponse, LLMUsage, OPENAI_MODELS, ProviderConfig, createAnthropicClient, createCreativeClient, createDeepSeekClient, createFixClient, createKimiClient, createOpenAIClient, createRequirementsClient, getAvailableProvider, getSharedLLMClient, isProviderAvailable, resetSharedLLMClient } from './client.js';
|
|
3
|
-
export { R as RateLimiter, a as RateLimiterOptions, T as TokenTracker, b as TokenUsage, g as getGlobalRateLimiter, c as getGlobalTokenTracker, r as resetGlobalRateLimiter, d as resetGlobalTokenTracker } from './rate-limiter-9XAWfHwe.js';
|
|
4
|
-
export { autoCloseJson, extractJsonFromText, isValidJson, parseJsonResponse, safeParseJson } from './json-parser.js';
|
|
5
|
-
import { z } from 'zod';
|
|
6
|
-
export { JsonSchema, STRUCTURED_OUTPUT_MODELS, StructuredGenerationOptions, StructuredGenerationResult, StructuredOutputClient, StructuredOutputOptions, getStructuredOutputClient, isStructuredOutputAvailable, resetStructuredOutputClient } from './structured-output.js';
|
|
7
|
-
import '@langchain/openai';
|
|
8
|
-
import '@langchain/anthropic';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Truncation Detector
|
|
12
|
-
*
|
|
13
|
-
* Utilities for detecting when LLM output has been truncated and
|
|
14
|
-
* extracting usable content from partial responses.
|
|
15
|
-
*
|
|
16
|
-
* @packageDocumentation
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
type TruncationReason = 'finish_reason' | 'json_incomplete' | 'bracket_mismatch' | 'none';
|
|
20
|
-
interface TruncationResult {
|
|
21
|
-
isTruncated: boolean;
|
|
22
|
-
reason: TruncationReason;
|
|
23
|
-
partialContent?: string;
|
|
24
|
-
lastCompleteElement?: unknown;
|
|
25
|
-
missingCloseBrackets?: number;
|
|
26
|
-
missingCloseBraces?: number;
|
|
27
|
-
}
|
|
28
|
-
declare function detectTruncation(response: string, finishReason: LLMFinishReason): TruncationResult;
|
|
29
|
-
declare function findLastCompleteElement(json: string): unknown | null;
|
|
30
|
-
declare function isLikelyTruncated(content: string): boolean;
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* LLM Continuation Utility
|
|
34
|
-
*
|
|
35
|
-
* Handles truncated LLM responses with automatic continuation.
|
|
36
|
-
* - Detects truncation via finish_reason and JSON structure
|
|
37
|
-
* - Automatically continues with full context
|
|
38
|
-
* - Merges partial and continuation responses
|
|
39
|
-
* - Salvages partial data if max continuations reached
|
|
40
|
-
*
|
|
41
|
-
* @packageDocumentation
|
|
42
|
-
*/
|
|
43
|
-
|
|
44
|
-
interface ContinuationOptions<T> {
|
|
45
|
-
client: LLMClient;
|
|
46
|
-
systemPrompt: string;
|
|
47
|
-
userPrompt: string;
|
|
48
|
-
schema?: z.ZodSchema<T>;
|
|
49
|
-
maxTokens?: number;
|
|
50
|
-
maxContinuations?: number;
|
|
51
|
-
maxRetries?: number;
|
|
52
|
-
buildContinuationPrompt: (partialResponse: string, attempt: number) => string;
|
|
53
|
-
continuationSystemPrompt?: string;
|
|
54
|
-
}
|
|
55
|
-
interface ContinuationResult<T> {
|
|
56
|
-
data: T;
|
|
57
|
-
raw: string;
|
|
58
|
-
continuationCount: number;
|
|
59
|
-
warnings: string[];
|
|
60
|
-
wasSalvaged: boolean;
|
|
61
|
-
}
|
|
62
|
-
declare function mergeResponses(previous: string, continuation: string): string;
|
|
63
|
-
declare function salvagePartialResponse<T>(rawResponse: string): T | null;
|
|
64
|
-
declare function callWithContinuation<T>(options: ContinuationOptions<T>): Promise<ContinuationResult<T>>;
|
|
65
|
-
declare function buildGenericContinuationPrompt(context: string, partialResponse: string, attempt: number, maxAttempts?: number): string;
|
|
66
|
-
|
|
67
|
-
export { type ContinuationOptions, type ContinuationResult, LLMClient, LLMFinishReason, type TruncationReason, type TruncationResult, buildGenericContinuationPrompt, callWithContinuation, detectTruncation, findLastCompleteElement, isLikelyTruncated, mergeResponses, salvagePartialResponse };
|
package/dist/json-parser.d.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* JSON Parser Utilities
|
|
5
|
-
*
|
|
6
|
-
* Robust JSON parsing for LLM responses that may contain:
|
|
7
|
-
* - Markdown code blocks
|
|
8
|
-
* - Extra text before/after JSON
|
|
9
|
-
* - Minor formatting issues
|
|
10
|
-
*
|
|
11
|
-
* @packageDocumentation
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Extract JSON from LLM response text.
|
|
16
|
-
*
|
|
17
|
-
* Handles markdown code blocks, raw JSON objects/arrays, and primitive values.
|
|
18
|
-
*/
|
|
19
|
-
declare function extractJsonFromText(text: string): string | null;
|
|
20
|
-
/**
|
|
21
|
-
* Parse JSON from LLM response with optional Zod schema validation.
|
|
22
|
-
*/
|
|
23
|
-
declare function parseJsonResponse<T>(response: string, schema?: z.ZodSchema<T>): T;
|
|
24
|
-
/**
|
|
25
|
-
* Safely parse JSON without throwing.
|
|
26
|
-
*/
|
|
27
|
-
declare function safeParseJson<T>(response: string, schema?: z.ZodSchema<T>): {
|
|
28
|
-
success: true;
|
|
29
|
-
data: T;
|
|
30
|
-
} | {
|
|
31
|
-
success: false;
|
|
32
|
-
error: Error;
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* Check if a string is valid JSON.
|
|
36
|
-
*/
|
|
37
|
-
declare function isValidJson(str: string): boolean;
|
|
38
|
-
/**
|
|
39
|
-
* Attempt to auto-close unclosed JSON brackets.
|
|
40
|
-
*/
|
|
41
|
-
declare function autoCloseJson(json: string): string;
|
|
42
|
-
|
|
43
|
-
export { autoCloseJson, extractJsonFromText, isValidJson, parseJsonResponse, safeParseJson };
|