@qianxude/ai 0.2.1
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 -0
- package/README.md +599 -0
- package/dist/client/client.d.ts +56 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +285 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/config.d.ts +34 -0
- package/dist/client/config.d.ts.map +1 -0
- package/dist/client/config.js +141 -0
- package/dist/client/config.js.map +1 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/providers.d.ts +27 -0
- package/dist/client/providers.d.ts.map +1 -0
- package/dist/client/providers.js +235 -0
- package/dist/client/providers.js.map +1 -0
- package/dist/client/task.d.ts +59 -0
- package/dist/client/task.d.ts.map +1 -0
- package/dist/client/task.js +179 -0
- package/dist/client/task.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types/base.d.ts +38 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/base.js +6 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/client.d.ts +47 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +2 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/common.d.ts +19 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +31 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/config.d.ts +26 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/message.d.ts +25 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +2 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/mod.d.ts +2 -0
- package/dist/types/mod.d.ts.map +1 -0
- package/dist/types/mod.js +2 -0
- package/dist/types/mod.js.map +1 -0
- package/dist/types/options.d.ts +31 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +5 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/provider.d.ts +22 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +2 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/response.d.ts +19 -0
- package/dist/types/response.d.ts.map +1 -0
- package/dist/types/response.js +5 -0
- package/dist/types/response.js.map +1 -0
- package/dist/types/task.d.ts +28 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +2 -0
- package/dist/types/task.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main LLM client with unified interface
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '@qianxude/shared';
|
|
5
|
+
import { t } from '../types/mod.js';
|
|
6
|
+
import { ConfigLoader } from './config.js';
|
|
7
|
+
import { createProvider } from './providers.js';
|
|
8
|
+
import { LLMTask } from './task.js';
|
|
9
|
+
/**
|
|
10
|
+
* Get the default config path from environment variable
|
|
11
|
+
* @throws ConfigurationError if LLM_MANIFEST is not set
|
|
12
|
+
*/
|
|
13
|
+
function getDefaultConfigPath() {
|
|
14
|
+
const envPath = process.env.LLM_MANIFEST;
|
|
15
|
+
if (!envPath) {
|
|
16
|
+
throw new t.ConfigurationError('LLM_MANIFEST environment variable is not set. ' +
|
|
17
|
+
'Please set it to the path of your llm.manifest.json file, ' +
|
|
18
|
+
'or provide manifestPath option explicitly.');
|
|
19
|
+
}
|
|
20
|
+
return envPath;
|
|
21
|
+
}
|
|
22
|
+
export class LLMClient {
|
|
23
|
+
configLoader;
|
|
24
|
+
initialized = false;
|
|
25
|
+
logger;
|
|
26
|
+
manifestPath;
|
|
27
|
+
provider;
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
this.manifestPath = options.manifestPath;
|
|
30
|
+
this.logger = options.logger ?? logger;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get or create the provider instance (lazy initialization)
|
|
34
|
+
*/
|
|
35
|
+
getProvider() {
|
|
36
|
+
if (!this.provider) {
|
|
37
|
+
this.provider = createProvider(this.logger);
|
|
38
|
+
}
|
|
39
|
+
return this.provider;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Initialize the client by loading configuration
|
|
43
|
+
*/
|
|
44
|
+
async initialize() {
|
|
45
|
+
if (this.initialized)
|
|
46
|
+
return;
|
|
47
|
+
const configPath = this.manifestPath ?? getDefaultConfigPath();
|
|
48
|
+
this.configLoader = new ConfigLoader(configPath);
|
|
49
|
+
await this.configLoader.load();
|
|
50
|
+
this.initialized = true;
|
|
51
|
+
this.logger.info('LLM Client initialized');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Ensure the client is initialized
|
|
55
|
+
*/
|
|
56
|
+
ensureInitialized() {
|
|
57
|
+
if (!this.initialized || !this.configLoader) {
|
|
58
|
+
throw new t.ConfigurationError('Client not initialized. Call initialize() first.');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the model ID for a specific task
|
|
63
|
+
*/
|
|
64
|
+
getModelForTask(task) {
|
|
65
|
+
this.ensureInitialized();
|
|
66
|
+
return this.configLoader.getModelForTask(task);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the raw configuration
|
|
70
|
+
*/
|
|
71
|
+
getConfig() {
|
|
72
|
+
this.ensureInitialized();
|
|
73
|
+
return this.configLoader.getConfig();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Complete a request with either a prompt string or messages array
|
|
77
|
+
* @param input - Either a prompt string or an array of LLMMessage objects
|
|
78
|
+
* @param options - Optional completion options
|
|
79
|
+
*/
|
|
80
|
+
async complete(input, options = {}) {
|
|
81
|
+
this.ensureInitialized();
|
|
82
|
+
const modelId = this.resolveModelId(options);
|
|
83
|
+
// Create a copy of config to avoid mutating the cached configuration
|
|
84
|
+
const config = { ...this.configLoader.resolveModel(modelId) };
|
|
85
|
+
const provider = this.getProvider();
|
|
86
|
+
// Override config with options if provided (consistent pattern with explicit undefined checks)
|
|
87
|
+
if (options.temperature !== undefined) {
|
|
88
|
+
config.temperature = options.temperature;
|
|
89
|
+
}
|
|
90
|
+
if (options.maxTokens !== undefined) {
|
|
91
|
+
config.maxTokens = options.maxTokens;
|
|
92
|
+
}
|
|
93
|
+
if (options.topK !== undefined) {
|
|
94
|
+
config.topK = options.topK;
|
|
95
|
+
}
|
|
96
|
+
if (options.topP !== undefined) {
|
|
97
|
+
config.topP = options.topP;
|
|
98
|
+
}
|
|
99
|
+
// Convert input to messages array
|
|
100
|
+
let messages;
|
|
101
|
+
if (typeof input === 'string') {
|
|
102
|
+
// Input is a prompt string
|
|
103
|
+
messages = [];
|
|
104
|
+
if (options.systemPrompt) {
|
|
105
|
+
messages.push({ role: 'system', content: options.systemPrompt });
|
|
106
|
+
}
|
|
107
|
+
messages.push({ role: 'user', content: input });
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Input is a messages array
|
|
111
|
+
messages = input;
|
|
112
|
+
// Handle system prompt from options
|
|
113
|
+
if (options.systemPrompt) {
|
|
114
|
+
const hasSystemMessage = messages.some((m) => m.role === 'system');
|
|
115
|
+
if (!hasSystemMessage) {
|
|
116
|
+
messages = [{ role: 'system', content: options.systemPrompt }, ...messages];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Build LLMRequest with both prompt and messages fields populated
|
|
121
|
+
const call = {
|
|
122
|
+
messages,
|
|
123
|
+
temperature: options.temperature,
|
|
124
|
+
maxTokens: options.maxTokens,
|
|
125
|
+
topK: options.topK,
|
|
126
|
+
topP: options.topP,
|
|
127
|
+
timeout: options.timeout,
|
|
128
|
+
};
|
|
129
|
+
// If input was a string, also populate prompt field for provider flexibility
|
|
130
|
+
if (typeof input === 'string') {
|
|
131
|
+
call.prompt = input;
|
|
132
|
+
call.systemPrompt = options.systemPrompt;
|
|
133
|
+
}
|
|
134
|
+
this.logger.debug('LLM completion started', {
|
|
135
|
+
provider: config.provider,
|
|
136
|
+
model: modelId,
|
|
137
|
+
task: options.task,
|
|
138
|
+
messageCount: messages.length,
|
|
139
|
+
});
|
|
140
|
+
const startTime = Date.now();
|
|
141
|
+
try {
|
|
142
|
+
const response = await provider.complete(config, call);
|
|
143
|
+
const duration = Date.now() - startTime;
|
|
144
|
+
this.logger.debug('LLM completion completed', {
|
|
145
|
+
duration,
|
|
146
|
+
model: response.model,
|
|
147
|
+
usage: response.usage,
|
|
148
|
+
});
|
|
149
|
+
return response;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
this.logger.error('LLM completion failed', {
|
|
153
|
+
error: error instanceof Error ? error.message : String(error),
|
|
154
|
+
duration: Date.now() - startTime,
|
|
155
|
+
});
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Stream a request with either a prompt string or messages array
|
|
161
|
+
* @param input - Either a prompt string or an array of LLMMessage objects
|
|
162
|
+
* @param options - Optional completion options
|
|
163
|
+
*/
|
|
164
|
+
async *stream(input, options = {}) {
|
|
165
|
+
this.ensureInitialized();
|
|
166
|
+
const modelId = this.resolveModelId(options);
|
|
167
|
+
// Create a copy of config to avoid mutating the cached configuration
|
|
168
|
+
const config = { ...this.configLoader.resolveModel(modelId) };
|
|
169
|
+
const provider = this.getProvider();
|
|
170
|
+
// Override config with options if provided (consistent pattern with explicit undefined checks)
|
|
171
|
+
if (options.temperature !== undefined) {
|
|
172
|
+
config.temperature = options.temperature;
|
|
173
|
+
}
|
|
174
|
+
if (options.maxTokens !== undefined) {
|
|
175
|
+
config.maxTokens = options.maxTokens;
|
|
176
|
+
}
|
|
177
|
+
if (options.topK !== undefined) {
|
|
178
|
+
config.topK = options.topK;
|
|
179
|
+
}
|
|
180
|
+
if (options.topP !== undefined) {
|
|
181
|
+
config.topP = options.topP;
|
|
182
|
+
}
|
|
183
|
+
// Convert input to messages array
|
|
184
|
+
let messages;
|
|
185
|
+
if (typeof input === 'string') {
|
|
186
|
+
// Input is a prompt string
|
|
187
|
+
messages = [];
|
|
188
|
+
if (options.systemPrompt) {
|
|
189
|
+
messages.push({ role: 'system', content: options.systemPrompt });
|
|
190
|
+
}
|
|
191
|
+
messages.push({ role: 'user', content: input });
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Input is a messages array
|
|
195
|
+
messages = input;
|
|
196
|
+
// Handle system prompt from options
|
|
197
|
+
if (options.systemPrompt) {
|
|
198
|
+
const hasSystemMessage = messages.some((m) => m.role === 'system');
|
|
199
|
+
if (!hasSystemMessage) {
|
|
200
|
+
messages = [{ role: 'system', content: options.systemPrompt }, ...messages];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Build LLMRequest with both prompt and messages fields populated
|
|
205
|
+
const call = {
|
|
206
|
+
messages,
|
|
207
|
+
temperature: options.temperature,
|
|
208
|
+
maxTokens: options.maxTokens,
|
|
209
|
+
topK: options.topK,
|
|
210
|
+
topP: options.topP,
|
|
211
|
+
timeout: undefined, // Use provider default timeout
|
|
212
|
+
};
|
|
213
|
+
// If input was a string, also populate prompt field for provider flexibility
|
|
214
|
+
if (typeof input === 'string') {
|
|
215
|
+
call.prompt = input;
|
|
216
|
+
call.systemPrompt = options.systemPrompt;
|
|
217
|
+
}
|
|
218
|
+
this.logger.debug('LLM stream started', {
|
|
219
|
+
model: modelId,
|
|
220
|
+
provider: config.provider,
|
|
221
|
+
task: options.task,
|
|
222
|
+
messageCount: messages.length,
|
|
223
|
+
});
|
|
224
|
+
const startTime = Date.now();
|
|
225
|
+
try {
|
|
226
|
+
for await (const chunk of provider.stream(config, call)) {
|
|
227
|
+
yield chunk;
|
|
228
|
+
}
|
|
229
|
+
this.logger.debug('LLM stream completed', {
|
|
230
|
+
duration: Date.now() - startTime,
|
|
231
|
+
model: modelId,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
this.logger.error('LLM stream failed', {
|
|
236
|
+
error: error instanceof Error ? error.message : String(error),
|
|
237
|
+
duration: Date.now() - startTime,
|
|
238
|
+
});
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Resolve model ID from options or task defaults
|
|
244
|
+
*/
|
|
245
|
+
resolveModelId(options) {
|
|
246
|
+
if (options.model) {
|
|
247
|
+
return options.model;
|
|
248
|
+
}
|
|
249
|
+
if (options.task) {
|
|
250
|
+
return this.configLoader.getModelForTask(options.task);
|
|
251
|
+
}
|
|
252
|
+
// Default to first available model if no task or model specified
|
|
253
|
+
const config = this.configLoader.getConfig();
|
|
254
|
+
const firstModel = Object.keys(config.models)[0];
|
|
255
|
+
if (!firstModel) {
|
|
256
|
+
throw new t.ConfigurationError('No models configured');
|
|
257
|
+
}
|
|
258
|
+
return firstModel;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Create a task with resolved configuration
|
|
262
|
+
* @param taskName - The task name to resolve configuration for
|
|
263
|
+
* @param options - Optional task-level options
|
|
264
|
+
*/
|
|
265
|
+
createTask(taskName, options) {
|
|
266
|
+
this.ensureInitialized();
|
|
267
|
+
// Get model ID for task and resolve full configuration
|
|
268
|
+
const modelId = this.configLoader.getModelForTask(taskName);
|
|
269
|
+
const resolvedConfig = this.configLoader.resolveModel(modelId);
|
|
270
|
+
this.logger.debug('[Client] Creating task', {
|
|
271
|
+
taskName,
|
|
272
|
+
modelId,
|
|
273
|
+
provider: resolvedConfig.provider,
|
|
274
|
+
});
|
|
275
|
+
// Create and return task implementation with logger
|
|
276
|
+
return new LLMTask(resolvedConfig, options, undefined, this.logger);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Create a new LLM client instance
|
|
281
|
+
*/
|
|
282
|
+
export function createLLMClient(options) {
|
|
283
|
+
return new LLMClient(options);
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader and validator for LLM models
|
|
3
|
+
*/
|
|
4
|
+
import { t } from '../types/mod.js';
|
|
5
|
+
export declare class ConfigLoader {
|
|
6
|
+
private readonly configPath;
|
|
7
|
+
private config;
|
|
8
|
+
constructor(configPath: string);
|
|
9
|
+
/**
|
|
10
|
+
* Load and validate the llm.manifest.json configuration file
|
|
11
|
+
*/
|
|
12
|
+
load(): Promise<t.LLMConfig>;
|
|
13
|
+
/**
|
|
14
|
+
* Validate the configuration structure
|
|
15
|
+
*/
|
|
16
|
+
private validate;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a model configuration with API keys from environment
|
|
19
|
+
*/
|
|
20
|
+
resolveModel(modelId: string): t.ResolvedModelConfig;
|
|
21
|
+
/**
|
|
22
|
+
* Get the default model ID for a task
|
|
23
|
+
*/
|
|
24
|
+
getModelForTask(task: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Get all tasks that are configured to use a specific model
|
|
27
|
+
*/
|
|
28
|
+
getTasksForModel(modelId: string): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Get the raw configuration
|
|
31
|
+
*/
|
|
32
|
+
getConfig(): t.LLMConfig;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/client/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAEpC,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,MAAM,CAA4B;gBAEb,UAAU,EAAE,MAAM;IAE/C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAsBlC;;OAEG;IACH,OAAO,CAAC,QAAQ;IA8BhB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,mBAAmB;IAiDpD;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAarC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAU3C;;OAEG;IACH,SAAS,IAAI,CAAC,CAAC,SAAS;CAMzB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader and validator for LLM models
|
|
3
|
+
*/
|
|
4
|
+
import { t } from '../types/mod.js';
|
|
5
|
+
export class ConfigLoader {
|
|
6
|
+
configPath;
|
|
7
|
+
config = null;
|
|
8
|
+
constructor(configPath) {
|
|
9
|
+
this.configPath = configPath;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Load and validate the llm.manifest.json configuration file
|
|
13
|
+
*/
|
|
14
|
+
async load() {
|
|
15
|
+
try {
|
|
16
|
+
const file = Bun.file(this.configPath);
|
|
17
|
+
if (!(await file.exists())) {
|
|
18
|
+
throw new t.ConfigurationError(`Configuration file not found: ${this.configPath}`);
|
|
19
|
+
}
|
|
20
|
+
const content = await file.text();
|
|
21
|
+
const parsed = JSON.parse(content);
|
|
22
|
+
this.validate(parsed);
|
|
23
|
+
this.config = parsed;
|
|
24
|
+
return parsed;
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
if (err instanceof t.ConfigurationError)
|
|
28
|
+
throw err;
|
|
29
|
+
if (err instanceof SyntaxError) {
|
|
30
|
+
throw new t.ConfigurationError(`Invalid JSON in configuration file: ${err.message}`);
|
|
31
|
+
}
|
|
32
|
+
throw new t.ConfigurationError(`Failed to load configuration: ${String(err)}`, err);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate the configuration structure
|
|
37
|
+
*/
|
|
38
|
+
validate(config) {
|
|
39
|
+
if (!config.version) {
|
|
40
|
+
throw new t.ConfigurationError("Missing 'version' field in configuration");
|
|
41
|
+
}
|
|
42
|
+
if (!config.providers || Object.keys(config.providers).length === 0) {
|
|
43
|
+
throw new t.ConfigurationError('No providers defined in configuration');
|
|
44
|
+
}
|
|
45
|
+
if (!config.models || Object.keys(config.models).length === 0) {
|
|
46
|
+
throw new t.ConfigurationError('No models defined in configuration');
|
|
47
|
+
}
|
|
48
|
+
// Validate that all models reference valid providers
|
|
49
|
+
for (const [modelId, model] of Object.entries(config.models)) {
|
|
50
|
+
if (!config.providers[model.provider]) {
|
|
51
|
+
throw new t.ConfigurationError(`Model '${modelId}' references unknown provider '${model.provider}'`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Validate that tasks reference valid models
|
|
55
|
+
if (config.tasks) {
|
|
56
|
+
for (const [task, modelId] of Object.entries(config.tasks)) {
|
|
57
|
+
if (!config.models[modelId]) {
|
|
58
|
+
throw new t.ConfigurationError(`Task '${task}' references unknown model '${modelId}'`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a model configuration with API keys from environment
|
|
65
|
+
*/
|
|
66
|
+
resolveModel(modelId) {
|
|
67
|
+
if (!this.config) {
|
|
68
|
+
throw new t.ConfigurationError('Configuration not loaded. Call load() first.');
|
|
69
|
+
}
|
|
70
|
+
const model = this.config.models[modelId];
|
|
71
|
+
if (!model) {
|
|
72
|
+
throw new t.ConfigurationError(`Model '${modelId}' not found in configuration`);
|
|
73
|
+
}
|
|
74
|
+
const provider = this.config.providers[model.provider];
|
|
75
|
+
if (!provider) {
|
|
76
|
+
throw new t.ConfigurationError(`Provider '${model.provider}' not found in configuration`);
|
|
77
|
+
}
|
|
78
|
+
const apiKey = process.env[provider.apiKeyEnv];
|
|
79
|
+
if (!apiKey) {
|
|
80
|
+
throw new t.ConfigurationError(`API key not found for provider '${model.provider}'. ` + `Set the ${provider.apiKeyEnv} environment variable.`);
|
|
81
|
+
}
|
|
82
|
+
// Resolve base URL: env var > defaultBaseUrl > error
|
|
83
|
+
let baseUrl;
|
|
84
|
+
if (provider.baseUrlEnv) {
|
|
85
|
+
baseUrl = process.env[provider.baseUrlEnv];
|
|
86
|
+
}
|
|
87
|
+
if (!baseUrl && provider.defaultBaseUrl) {
|
|
88
|
+
baseUrl = provider.defaultBaseUrl;
|
|
89
|
+
}
|
|
90
|
+
if (!baseUrl) {
|
|
91
|
+
throw new t.ConfigurationError(`Base URL not found for provider '${model.provider}'. ` +
|
|
92
|
+
`Set the ${provider.baseUrlEnv ?? 'baseUrlEnv'} environment variable ` +
|
|
93
|
+
`or provide a defaultBaseUrl in the provider config.`);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
provider: model.provider,
|
|
97
|
+
model: model.model,
|
|
98
|
+
temperature: model.temperature,
|
|
99
|
+
maxTokens: model.maxTokens,
|
|
100
|
+
topK: model.topK,
|
|
101
|
+
topP: model.topP,
|
|
102
|
+
apiKey,
|
|
103
|
+
baseUrl,
|
|
104
|
+
excludeCaps: provider.excludeCaps,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get the default model ID for a task
|
|
109
|
+
*/
|
|
110
|
+
getModelForTask(task) {
|
|
111
|
+
if (!this.config) {
|
|
112
|
+
throw new t.ConfigurationError('Configuration not loaded. Call load() first.');
|
|
113
|
+
}
|
|
114
|
+
const modelId = this.config.tasks[task];
|
|
115
|
+
if (!modelId) {
|
|
116
|
+
throw new t.ConfigurationError(`No default model configured for task '${task}'`);
|
|
117
|
+
}
|
|
118
|
+
return modelId;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get all tasks that are configured to use a specific model
|
|
122
|
+
*/
|
|
123
|
+
getTasksForModel(modelId) {
|
|
124
|
+
if (!this.config) {
|
|
125
|
+
throw new t.ConfigurationError('Configuration not loaded. Call load() first.');
|
|
126
|
+
}
|
|
127
|
+
return Object.entries(this.config.tasks)
|
|
128
|
+
.filter(([, configuredModelId]) => configuredModelId === modelId)
|
|
129
|
+
.map(([task]) => task);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get the raw configuration
|
|
133
|
+
*/
|
|
134
|
+
getConfig() {
|
|
135
|
+
if (!this.config) {
|
|
136
|
+
throw new t.ConfigurationError('Configuration not loaded. Call load() first.');
|
|
137
|
+
}
|
|
138
|
+
return this.config;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/client/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Client exports
|
|
3
|
+
* New provider-model-task architecture from CEKB
|
|
4
|
+
*/
|
|
5
|
+
export { LLMClient, createLLMClient } from './client.js';
|
|
6
|
+
export { ConfigLoader } from './config.js';
|
|
7
|
+
export { OpenAICompatibleProvider, createProvider } from './providers.js';
|
|
8
|
+
export { LLMTask, LLMTaskCall, type TaskDependencies } from './task.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG1E,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Client exports
|
|
3
|
+
* New provider-model-task architecture from CEKB
|
|
4
|
+
*/
|
|
5
|
+
// Main client (CEKB-style)
|
|
6
|
+
export { LLMClient, createLLMClient } from './client.js';
|
|
7
|
+
// Config loader
|
|
8
|
+
export { ConfigLoader } from './config.js';
|
|
9
|
+
// Provider
|
|
10
|
+
export { OpenAICompatibleProvider, createProvider } from './providers.js';
|
|
11
|
+
// Task-based implementation
|
|
12
|
+
export { LLMTask, LLMTaskCall } from './task.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2BAA2B;AAC3B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEzD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,WAAW;AACX,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE1E,4BAA4B;AAC5B,OAAO,EAAE,OAAO,EAAE,WAAW,EAAyB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-specific API implementations for LLM services
|
|
3
|
+
*/
|
|
4
|
+
import { Logger } from '@qianxude/shared';
|
|
5
|
+
import { t } from '../types/mod.js';
|
|
6
|
+
/**
|
|
7
|
+
* OpenAI-compatible API client implementation
|
|
8
|
+
* Works with any provider using OpenAI-compatible protocol (CE, SiliconFlow, etc.)
|
|
9
|
+
*/
|
|
10
|
+
export declare class OpenAICompatibleProvider implements t.ProviderClient {
|
|
11
|
+
private logger;
|
|
12
|
+
constructor(lg?: Logger);
|
|
13
|
+
private logDebug;
|
|
14
|
+
complete(config: t.ResolvedModelConfig, call: t.LLMRequest): Promise<t.LLMResponse>;
|
|
15
|
+
stream(config: t.ResolvedModelConfig, call: t.LLMRequest): AsyncGenerator<t.LLMStreamChunk>;
|
|
16
|
+
/**
|
|
17
|
+
* Build messages array from call input
|
|
18
|
+
* Converts prompt/systemPrompt to messages if messages not provided
|
|
19
|
+
*/
|
|
20
|
+
private buildMessages;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Factory for creating provider clients
|
|
24
|
+
* All providers use OpenAI-compatible API protocol
|
|
25
|
+
*/
|
|
26
|
+
export declare function createProvider(logger?: Logger): t.ProviderClient;
|
|
27
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/client/providers.ts"],"names":[],"mappings":"AACA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAU,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAIpC;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,CAAC,CAAC,cAAc;IAC/D,OAAO,CAAC,MAAM,CAAS;gBAEX,EAAE,CAAC,EAAE,MAAM;IAIvB,OAAO,CAAC,QAAQ;IAIV,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAwGlF,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;IA4GlG;;;OAGG;IACH,OAAO,CAAC,aAAa;CAmBtB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,cAAc,CAEhE"}
|