@weisiren000/oiiai 0.1.2 → 0.1.4

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/dist/index.d.mts CHANGED
@@ -6,20 +6,56 @@ interface ChatMessage {
6
6
  content: string;
7
7
  }
8
8
  /**
9
- * 思考/推理配置
10
- * - effort: OpenAI o1/o3, Grok 使用
11
- * - maxTokens: Anthropic Claude, Gemini, Qwen 使用
9
+ * 统一的思考努力程度
10
+ * - off: 关闭思考
11
+ * - low: 快速思考,适合简单问题
12
+ * - medium: 平衡模式(默认)
13
+ * - high: 深度思考,适合复杂问题
14
+ */
15
+ type ReasoningEffort = 'off' | 'low' | 'medium' | 'high';
16
+ /**
17
+ * 统一的思考/推理配置
18
+ *
19
+ * 只需设置 effort,库会自动转换为各 Provider 需要的格式:
20
+ * - OpenRouter: effort 参数
21
+ * - Gemini: reasoning_effort 参数
22
+ * - Groq: reasoning_effort 参数
23
+ * - ModelScope: enable_thinking 参数
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * // 简单用法 - 只设置 effort
28
+ * { effort: 'high' }
29
+ *
30
+ * // 高级用法 - 精细控制
31
+ * { effort: 'high', budgetTokens: 8000 }
32
+ * ```
12
33
  */
13
34
  interface ReasoningConfig {
14
- /** 思考努力程度 */
15
- effort?: 'high' | 'medium' | 'low';
16
- /** 思考最大 token 数 */
17
- maxTokens?: number;
18
- /** 是否在响应中排除思考内容 */
35
+ /**
36
+ * 思考努力程度(推荐使用)
37
+ * - 'off': 关闭思考
38
+ * - 'low': 快速思考
39
+ * - 'medium': 平衡模式
40
+ * - 'high': 深度思考
41
+ */
42
+ effort?: ReasoningEffort;
43
+ /**
44
+ * 思考 token 预算(可选,精细控制)
45
+ * 设置后会覆盖 effort 对应的默认值
46
+ * 仅部分 Provider 支持(OpenRouter)
47
+ */
48
+ budgetTokens?: number;
49
+ /**
50
+ * 是否在响应中排除思考内容
51
+ * 仅部分 Provider 支持(OpenRouter)
52
+ */
19
53
  exclude?: boolean;
20
- /** 是否启用思考 */
21
- enabled?: boolean;
22
54
  }
55
+ /**
56
+ * effort 到 token 预算的默认映射
57
+ */
58
+ declare const EFFORT_TOKEN_MAP: Record<ReasoningEffort, number>;
23
59
  interface ChatOptions {
24
60
  /** 模型 ID */
25
61
  model: string;
@@ -78,6 +114,57 @@ interface ModelInfo {
78
114
  supportedParameters: string[];
79
115
  }
80
116
 
117
+ /**
118
+ * 模型特性自动检测与智能降级策略
119
+ *
120
+ * 解决问题:
121
+ * 1. 思考模型(thinking models)在低 token 限制下 content 为空
122
+ * 2. 模型聚合平台无法预知哪些是思考模型
123
+ * 3. 避免硬编码模型列表
124
+ *
125
+ * 策略:
126
+ * 1. 基于模型名称模式匹配(启发式检测)
127
+ * 2. 基于响应特征动态检测(运行时检测)
128
+ * 3. 智能降级:自动调整参数或提取有效内容
129
+ */
130
+
131
+ /**
132
+ * 模型行为类型
133
+ */
134
+ type ModelBehavior = 'thinking-first' | 'direct-answer' | 'hybrid' | 'unknown';
135
+ /**
136
+ * 模型特性信息
137
+ */
138
+ interface ModelCharacteristics {
139
+ /** 模型行为类型 */
140
+ behavior: ModelBehavior;
141
+ /** 是否支持 reasoning 参数 */
142
+ supportsReasoningConfig: boolean;
143
+ /** 推荐的最小 maxTokens(针对思考模型) */
144
+ recommendedMinTokens: number;
145
+ /** 检测置信度 0-1 */
146
+ confidence: number;
147
+ /** 检测来源 */
148
+ detectedBy: 'pattern' | 'runtime' | 'cache';
149
+ }
150
+ /**
151
+ * 降级策略配置
152
+ */
153
+ interface FallbackConfig {
154
+ /** 是否启用自动降级 */
155
+ enabled: boolean;
156
+ /** 当 content 为空时,是否返回 reasoning */
157
+ returnReasoningAsContent: boolean;
158
+ /** 是否从 reasoning 中提取结论 */
159
+ extractConclusionFromReasoning: boolean;
160
+ /** 是否自动增加 maxTokens 重试 */
161
+ autoRetryWithMoreTokens: boolean;
162
+ /** 重试时的 token 增量 */
163
+ retryTokenIncrement: number;
164
+ /** 最大重试次数 */
165
+ maxRetries: number;
166
+ }
167
+
81
168
  /**
82
169
  * AI Provider 接口和基类
83
170
  */
@@ -109,27 +196,135 @@ interface AIProvider {
109
196
  * 获取可用模型列表(可选实现)
110
197
  */
111
198
  listModels?(): Promise<ModelInfo[]>;
199
+ /**
200
+ * 获取模型特性信息(可选实现)
201
+ */
202
+ getModelCharacteristics?(modelId: string): ModelCharacteristics;
203
+ }
204
+ /**
205
+ * 扩展的 ask 选项,支持降级配置
206
+ */
207
+ interface AskOptions extends Omit<ChatOptions, 'model' | 'messages'> {
208
+ /** 降级策略配置 */
209
+ fallback?: Partial<FallbackConfig>;
210
+ /** 是否自动调整参数以适应模型特性 */
211
+ autoAdjust?: boolean;
112
212
  }
113
213
  /**
114
214
  * AI Provider 基础抽象类
115
215
  * 提供一些通用实现,子类只需实现核心方法
216
+ *
217
+ * 特性:
218
+ * - 自动检测模型类型(思考模型 vs 直接回答模型)
219
+ * - 智能降级策略(content 为空时自动处理)
220
+ * - 参数自动调整(为思考模型增加 maxTokens)
116
221
  */
117
222
  declare abstract class BaseProvider implements AIProvider {
118
223
  abstract readonly name: string;
224
+ /** 降级策略配置 */
225
+ protected fallbackConfig: FallbackConfig;
226
+ /** 是否启用自动参数调整 */
227
+ protected autoAdjustEnabled: boolean;
119
228
  abstract chat(options: ChatOptions): Promise<ChatResult>;
120
229
  abstract chatStream(options: ChatOptions): AsyncGenerator<StreamChunk, void, unknown>;
230
+ /**
231
+ * 配置降级策略
232
+ */
233
+ configureFallback(config: Partial<FallbackConfig>): this;
234
+ /**
235
+ * 启用/禁用自动参数调整
236
+ */
237
+ setAutoAdjust(enabled: boolean): this;
238
+ /**
239
+ * 获取模型特性信息
240
+ */
241
+ getModelCharacteristics(modelId: string): ModelCharacteristics;
242
+ /**
243
+ * 智能聊天:自动检测模型特性并应用降级策略
244
+ */
245
+ chatSmart(options: ChatOptions): Promise<ChatResult>;
121
246
  /**
122
247
  * 简单对话:单轮问答(默认实现)
123
- * 对于思考模型,如果 content 为空则返回 reasoning
248
+ *
249
+ * 智能处理思考模型:
250
+ * 1. 自动检测模型类型
251
+ * 2. 为思考模型自动调整 maxTokens
252
+ * 3. 如果 content 为空,智能降级(提取结论或返回 reasoning)
124
253
  */
125
- ask(model: string, question: string, options?: Omit<ChatOptions, 'model' | 'messages'>): Promise<string>;
254
+ ask(model: string, question: string, options?: AskOptions): Promise<string>;
126
255
  /**
127
256
  * 带系统提示的对话(默认实现)
128
- * 对于思考模型,如果 content 为空则返回 reasoning
257
+ *
258
+ * 智能处理思考模型:
259
+ * 1. 自动检测模型类型
260
+ * 2. 为思考模型自动调整 maxTokens
261
+ * 3. 如果 content 为空,智能降级(提取结论或返回 reasoning)
129
262
  */
130
- askWithSystem(model: string, systemPrompt: string, userMessage: string, options?: Omit<ChatOptions, 'model' | 'messages'>): Promise<string>;
263
+ askWithSystem(model: string, systemPrompt: string, userMessage: string, options?: AskOptions): Promise<string>;
264
+ /**
265
+ * 场景化问答:根据场景自动配置参数
266
+ *
267
+ * @param model 模型 ID
268
+ * @param question 问题
269
+ * @param scenario 场景类型
270
+ * - 'simple': 简单问答(默认)
271
+ * - 'math': 数学计算
272
+ * - 'reasoning': 逻辑推理
273
+ * - 'fast': 快速回答(关闭思考)
274
+ */
275
+ askWithScenario(model: string, question: string, scenario?: 'simple' | 'math' | 'reasoning' | 'fast', options?: AskOptions): Promise<string>;
131
276
  }
132
277
 
278
+ /**
279
+ * 统一的 Provider 工厂
280
+ * 让所有 Provider 使用方式一致
281
+ */
282
+
283
+ /**
284
+ * 支持的 Provider 类型
285
+ */
286
+ type ProviderType = 'openrouter' | 'gemini' | 'groq' | 'huggingface' | 'modelscope' | 'deepseek' | 'poe' | 'nova';
287
+ /**
288
+ * 统一的 Provider 配置
289
+ */
290
+ interface ProviderConfig {
291
+ /** Provider 类型 */
292
+ provider: ProviderType;
293
+ /** API Key */
294
+ apiKey: string;
295
+ /** 自定义 API 地址(可选) */
296
+ baseUrl?: string;
297
+ }
298
+ /**
299
+ * 创建 AI Provider 实例
300
+ *
301
+ * @example
302
+ * ```ts
303
+ * // 所有 Provider 使用相同方式创建
304
+ * const openrouter = createProvider({ provider: 'openrouter', apiKey: 'xxx' });
305
+ * const gemini = createProvider({ provider: 'gemini', apiKey: 'xxx' });
306
+ * const groq = createProvider({ provider: 'groq', apiKey: 'xxx' });
307
+ *
308
+ * // 之后使用方式完全一致
309
+ * const answer = await openrouter.ask('gpt-4o', '你好');
310
+ * const answer = await gemini.ask('gemini-2.5-flash', '你好');
311
+ * ```
312
+ */
313
+ declare function createProvider(config: ProviderConfig): AIProvider;
314
+ /**
315
+ * 快捷创建函数
316
+ */
317
+ declare const ai: {
318
+ openrouter: (apiKey: string, baseUrl?: string) => AIProvider;
319
+ gemini: (apiKey: string, baseUrl?: string) => AIProvider;
320
+ groq: (apiKey: string, baseUrl?: string) => AIProvider;
321
+ huggingface: (apiKey: string, baseUrl?: string) => AIProvider;
322
+ modelscope: (apiKey: string, baseUrl?: string) => AIProvider;
323
+ deepseek: (apiKey: string, baseUrl?: string) => AIProvider;
324
+ poe: (apiKey: string, baseUrl?: string) => AIProvider;
325
+ nova: (apiKey: string, baseUrl?: string) => AIProvider;
326
+ };
327
+
133
328
  /**
134
329
  * OpenRouter Provider 实现
135
330
  */
@@ -172,4 +367,133 @@ declare class OpenRouterProvider extends BaseProvider {
172
367
  listModels(): Promise<OpenRouterModelInfo[]>;
173
368
  }
174
369
 
175
- export { type AIProvider, BaseProvider, type ChatMessage, type ChatOptions, type ChatResult, type ModelInfo, type ModelPricing, type OpenRouterModelInfo, OpenRouterProvider, type ReasoningConfig, type StreamChunk, type TokenUsage };
370
+ /**
371
+ * ModelScope Provider 实现
372
+ * 使用 OpenAI 兼容 API
373
+ */
374
+
375
+ /**
376
+ * ModelScope Provider 配置
377
+ */
378
+ interface ModelScopeConfig {
379
+ apiKey: string;
380
+ baseUrl?: string;
381
+ }
382
+ /**
383
+ * ModelScope Provider
384
+ * 兼容 OpenAI API 格式,支持 DeepSeek 等模型
385
+ */
386
+ declare class ModelScopeProvider extends BaseProvider {
387
+ readonly name = "modelscope";
388
+ private apiKey;
389
+ private baseUrl;
390
+ constructor(config: ModelScopeConfig | string);
391
+ /**
392
+ * 发送聊天请求(非流式)
393
+ */
394
+ chat(options: ChatOptions): Promise<ChatResult>;
395
+ /**
396
+ * 发送流式聊天请求
397
+ */
398
+ chatStream(options: ChatOptions): AsyncGenerator<StreamChunk, void, unknown>;
399
+ }
400
+
401
+ /**
402
+ * HuggingFace Provider 实现
403
+ * 使用 HuggingFace Router API (OpenAI 兼容)
404
+ */
405
+
406
+ /**
407
+ * HuggingFace Provider 配置
408
+ */
409
+ interface HuggingFaceConfig {
410
+ apiKey: string;
411
+ baseUrl?: string;
412
+ }
413
+ /**
414
+ * HuggingFace Provider
415
+ * 使用 HuggingFace Router,兼容 OpenAI API 格式
416
+ */
417
+ declare class HuggingFaceProvider extends BaseProvider {
418
+ readonly name = "huggingface";
419
+ private apiKey;
420
+ private baseUrl;
421
+ constructor(config: HuggingFaceConfig | string);
422
+ /**
423
+ * 发送聊天请求(非流式)
424
+ *
425
+ * reasoning 参数说明:
426
+ * - HuggingFace 是模型聚合平台,thinking 支持取决于具体模型
427
+ * - 如果模型支持,会返回 reasoning_content
428
+ */
429
+ chat(options: ChatOptions): Promise<ChatResult>;
430
+ /**
431
+ * 发送流式聊天请求
432
+ */
433
+ chatStream(options: ChatOptions): AsyncGenerator<StreamChunk, void, unknown>;
434
+ }
435
+
436
+ /**
437
+ * Groq Provider 实现
438
+ * 使用 Groq API (OpenAI 兼容)
439
+ */
440
+
441
+ /**
442
+ * Groq Provider 配置
443
+ */
444
+ interface GroqConfig {
445
+ apiKey: string;
446
+ baseUrl?: string;
447
+ }
448
+ /**
449
+ * Groq Provider
450
+ * 兼容 OpenAI API 格式,支持 reasoning_effort 参数
451
+ */
452
+ declare class GroqProvider extends BaseProvider {
453
+ readonly name = "groq";
454
+ private apiKey;
455
+ private baseUrl;
456
+ constructor(config: GroqConfig | string);
457
+ /**
458
+ * 发送聊天请求(非流式)
459
+ */
460
+ chat(options: ChatOptions): Promise<ChatResult>;
461
+ /**
462
+ * 发送流式聊天请求
463
+ */
464
+ chatStream(options: ChatOptions): AsyncGenerator<StreamChunk, void, unknown>;
465
+ }
466
+
467
+ /**
468
+ * Gemini Provider 实现
469
+ * 使用 Google Gemini API (OpenAI 兼容格式)
470
+ * https://ai.google.dev/gemini-api/docs/openai
471
+ */
472
+
473
+ /**
474
+ * Gemini Provider 配置
475
+ */
476
+ interface GeminiConfig {
477
+ apiKey: string;
478
+ baseUrl?: string;
479
+ }
480
+ /**
481
+ * Gemini Provider
482
+ * 使用 Google Gemini API,兼容 OpenAI 格式
483
+ */
484
+ declare class GeminiProvider extends BaseProvider {
485
+ readonly name = "gemini";
486
+ private apiKey;
487
+ private baseUrl;
488
+ constructor(config: GeminiConfig | string);
489
+ /**
490
+ * 发送聊天请求(非流式)
491
+ */
492
+ chat(options: ChatOptions): Promise<ChatResult>;
493
+ /**
494
+ * 发送流式聊天请求
495
+ */
496
+ chatStream(options: ChatOptions): AsyncGenerator<StreamChunk, void, unknown>;
497
+ }
498
+
499
+ export { type AIProvider, BaseProvider, type ChatMessage, type ChatOptions, type ChatResult, EFFORT_TOKEN_MAP, GeminiProvider, GroqProvider, HuggingFaceProvider, type ModelInfo, type ModelPricing, ModelScopeProvider, type OpenRouterModelInfo, OpenRouterProvider, type ProviderConfig, type ProviderType, type ReasoningConfig, type ReasoningEffort, type StreamChunk, type TokenUsage, ai, createProvider };