@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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +599 -0
  3. package/dist/client/client.d.ts +56 -0
  4. package/dist/client/client.d.ts.map +1 -0
  5. package/dist/client/client.js +285 -0
  6. package/dist/client/client.js.map +1 -0
  7. package/dist/client/config.d.ts +34 -0
  8. package/dist/client/config.d.ts.map +1 -0
  9. package/dist/client/config.js +141 -0
  10. package/dist/client/config.js.map +1 -0
  11. package/dist/client/index.d.ts +9 -0
  12. package/dist/client/index.d.ts.map +1 -0
  13. package/dist/client/index.js +13 -0
  14. package/dist/client/index.js.map +1 -0
  15. package/dist/client/providers.d.ts +27 -0
  16. package/dist/client/providers.d.ts.map +1 -0
  17. package/dist/client/providers.js +235 -0
  18. package/dist/client/providers.js.map +1 -0
  19. package/dist/client/task.d.ts +59 -0
  20. package/dist/client/task.d.ts.map +1 -0
  21. package/dist/client/task.js +179 -0
  22. package/dist/client/task.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +5 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/types/base.d.ts +38 -0
  28. package/dist/types/base.d.ts.map +1 -0
  29. package/dist/types/base.js +6 -0
  30. package/dist/types/base.js.map +1 -0
  31. package/dist/types/client.d.ts +47 -0
  32. package/dist/types/client.d.ts.map +1 -0
  33. package/dist/types/client.js +2 -0
  34. package/dist/types/client.js.map +1 -0
  35. package/dist/types/common.d.ts +19 -0
  36. package/dist/types/common.d.ts.map +1 -0
  37. package/dist/types/common.js +31 -0
  38. package/dist/types/common.js.map +1 -0
  39. package/dist/types/config.d.ts +26 -0
  40. package/dist/types/config.d.ts.map +1 -0
  41. package/dist/types/config.js +2 -0
  42. package/dist/types/config.js.map +1 -0
  43. package/dist/types/index.d.ts +14 -0
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +7 -0
  46. package/dist/types/index.js.map +1 -0
  47. package/dist/types/message.d.ts +25 -0
  48. package/dist/types/message.d.ts.map +1 -0
  49. package/dist/types/message.js +2 -0
  50. package/dist/types/message.js.map +1 -0
  51. package/dist/types/mod.d.ts +2 -0
  52. package/dist/types/mod.d.ts.map +1 -0
  53. package/dist/types/mod.js +2 -0
  54. package/dist/types/mod.js.map +1 -0
  55. package/dist/types/options.d.ts +31 -0
  56. package/dist/types/options.d.ts.map +1 -0
  57. package/dist/types/options.js +5 -0
  58. package/dist/types/options.js.map +1 -0
  59. package/dist/types/provider.d.ts +22 -0
  60. package/dist/types/provider.d.ts.map +1 -0
  61. package/dist/types/provider.js +2 -0
  62. package/dist/types/provider.js.map +1 -0
  63. package/dist/types/response.d.ts +19 -0
  64. package/dist/types/response.d.ts.map +1 -0
  65. package/dist/types/response.js +5 -0
  66. package/dist/types/response.js.map +1 -0
  67. package/dist/types/task.d.ts +28 -0
  68. package/dist/types/task.d.ts.map +1 -0
  69. package/dist/types/task.js +2 -0
  70. package/dist/types/task.js.map +1 -0
  71. 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"}