@spacex110/core 0.1.16 → 0.1.17
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.ts +337 -0
- package/dist/index.js +2551 -1891
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +7 -4
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/channel-manager.ts +190 -2
- package/src/index.ts +18 -0
- package/src/multimodal-normalize.ts +170 -0
- package/src/strategies.ts +735 -1
- package/src/types.ts +177 -0
package/src/types.ts
CHANGED
|
@@ -78,6 +78,13 @@ export interface Model {
|
|
|
78
78
|
name: string;
|
|
79
79
|
/** 模型能力列表(如 text, vision, audio) */
|
|
80
80
|
capabilities?: ModelCapability[];
|
|
81
|
+
/**
|
|
82
|
+
* 模型输出能力(如 image, audio)。
|
|
83
|
+
* 与 capabilities 区分:capabilities 指模型能理解/处理哪些输入;
|
|
84
|
+
* outputCapabilities 指模型能生成哪些类型的输出。
|
|
85
|
+
* 当前仅在多模态输出场景(如 OpenRouter 文生图、Gemini 生图)使用。
|
|
86
|
+
*/
|
|
87
|
+
outputCapabilities?: Array<'image' | 'audio'>;
|
|
81
88
|
/** 上下文窗口大小 */
|
|
82
89
|
contextLength?: number;
|
|
83
90
|
}
|
|
@@ -161,3 +168,173 @@ export interface AIConfigFormProps {
|
|
|
161
168
|
/** 是否禁用整个表单 */
|
|
162
169
|
disabled?: boolean;
|
|
163
170
|
}
|
|
171
|
+
|
|
172
|
+
// ============ Multimodal Chat Types ============
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* 多模态内容块(输入侧调用方传入格式)。
|
|
176
|
+
* 不同协议的 ContentPart 形态不同,这里提供统一的 OpenAI 风格接口作为上层标准。
|
|
177
|
+
*/
|
|
178
|
+
export type ContentPart =
|
|
179
|
+
| { type: 'text'; text: string }
|
|
180
|
+
| { type: 'image_url'; image_url: { url: string; detail?: 'low' | 'high' | 'auto' } }
|
|
181
|
+
// Anthropic 风格图片块
|
|
182
|
+
| {
|
|
183
|
+
type: 'image';
|
|
184
|
+
source:
|
|
185
|
+
| { type: 'base64'; media_type: string; data: string }
|
|
186
|
+
| { type: 'url'; url: string };
|
|
187
|
+
}
|
|
188
|
+
// Gemini 风格 inline 数据块(图片/音频通用)
|
|
189
|
+
| { type: 'inline_data'; inline_data: { mime_type: string; data: string } }
|
|
190
|
+
// OpenAI 风格输入音频
|
|
191
|
+
| { type: 'audio'; input_audio: { data: string; format: 'wav' | 'mp3' } };
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* 多模态聊天消息。
|
|
195
|
+
* content 可以是纯文本字符串(兼容 sendDirectChat)或多模态内容块数组。
|
|
196
|
+
*/
|
|
197
|
+
export interface ChatMessage {
|
|
198
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
199
|
+
/**
|
|
200
|
+
* 消息内容:字符串走纯文本路径,多模态块数组走多模态路径。
|
|
201
|
+
*/
|
|
202
|
+
content: string | ContentPart[];
|
|
203
|
+
/** 可选的消息名(部分协议支持) */
|
|
204
|
+
name?: string;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* 内部统一的多模态内容块。
|
|
209
|
+
* 各协议策略都接收 NormalizedMessage[] 作为输入,避免重复处理不同协议字段差异。
|
|
210
|
+
*/
|
|
211
|
+
export type NormalizedPart =
|
|
212
|
+
| { type: 'text'; data: string; meta?: Record<string, unknown> }
|
|
213
|
+
| { type: 'image'; data: string; mimeType?: string; meta?: Record<string, unknown> }
|
|
214
|
+
| { type: 'audio'; data: string; mimeType?: string; meta?: Record<string, unknown> };
|
|
215
|
+
|
|
216
|
+
/** 内部统一的消息结构 */
|
|
217
|
+
export interface NormalizedMessage {
|
|
218
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
219
|
+
parts: NormalizedPart[];
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* 响应侧的内容块。
|
|
224
|
+
* 文本部分用 string;多模态用数组,每个元素描述一种产出(文本/图片/音频)。
|
|
225
|
+
*/
|
|
226
|
+
export type ContentResponsePart =
|
|
227
|
+
| { type: 'text'; text: string }
|
|
228
|
+
| { type: 'image'; url?: string; b64_json?: string; mimeType?: string }
|
|
229
|
+
| { type: 'audio'; url?: string; b64_json?: string; mimeType?: string };
|
|
230
|
+
|
|
231
|
+
/** 各协议策略解析后的统一响应结构 */
|
|
232
|
+
export interface ResponseMessage {
|
|
233
|
+
role: 'assistant';
|
|
234
|
+
/**
|
|
235
|
+
* 响应内容:纯文本时用 string,包含图片/音频时用 ContentResponsePart 数组。
|
|
236
|
+
*/
|
|
237
|
+
content: string | ContentResponsePart[];
|
|
238
|
+
/** token 用量(如协议提供) */
|
|
239
|
+
usage?: {
|
|
240
|
+
inputTokens?: number;
|
|
241
|
+
outputTokens?: number;
|
|
242
|
+
totalTokens?: number;
|
|
243
|
+
};
|
|
244
|
+
/** 原始协议响应(调试/透传用) */
|
|
245
|
+
raw?: unknown;
|
|
246
|
+
/** 结束原因(如 'stop'、'length'、'tool_calls') */
|
|
247
|
+
finishReason?: string;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* 调用 sendMultimodalChat / sendMultimodalChatStream 的输入参数。
|
|
252
|
+
* 与 sendDirectChat 不同:messages 字段是 ChatMessage[](支持 content: string | ContentPart[])。
|
|
253
|
+
*/
|
|
254
|
+
export interface MultimodalChatOptions {
|
|
255
|
+
/** 协议类型 */
|
|
256
|
+
apiFormat: ApiFormat;
|
|
257
|
+
/** API Key */
|
|
258
|
+
apiKey: string;
|
|
259
|
+
/** 模型 ID */
|
|
260
|
+
model: string;
|
|
261
|
+
/** 厂商 Base URL */
|
|
262
|
+
baseUrl: string;
|
|
263
|
+
/** 聊天消息列表(支持多模态) */
|
|
264
|
+
messages: ChatMessage[];
|
|
265
|
+
/** 最大输出 token */
|
|
266
|
+
maxTokens?: number;
|
|
267
|
+
/** 温度 */
|
|
268
|
+
temperature?: number;
|
|
269
|
+
/** 请求超时(毫秒) */
|
|
270
|
+
timeoutMs?: number;
|
|
271
|
+
/**
|
|
272
|
+
* 期望的输出模态。
|
|
273
|
+
* - 仅在 OpenRouter(OpenAI 协议)或 Gemini 协议下生效;其他协议传入 image 会直接报错
|
|
274
|
+
* - 示例:['text']、['text', 'image']
|
|
275
|
+
*/
|
|
276
|
+
outputModalities?: Array<'text' | 'image'>;
|
|
277
|
+
/** 透传给 fetch 的额外 headers(用于透传 Authorization 代理等) */
|
|
278
|
+
extraHeaders?: Record<string, string>;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** 非流式多模态聊天结果 */
|
|
282
|
+
export interface MultimodalChatResult {
|
|
283
|
+
success: boolean;
|
|
284
|
+
/** 纯文本内容(仅当响应只有文本时填充) */
|
|
285
|
+
text?: string;
|
|
286
|
+
/** 多模态产出(文本/图片/音频混排;与 text 二选一) */
|
|
287
|
+
images?: Array<{
|
|
288
|
+
type: 'image';
|
|
289
|
+
url?: string;
|
|
290
|
+
b64_json?: string;
|
|
291
|
+
mimeType?: string;
|
|
292
|
+
}>;
|
|
293
|
+
/** token 用量 */
|
|
294
|
+
usage?: {
|
|
295
|
+
inputTokens?: number;
|
|
296
|
+
outputTokens?: number;
|
|
297
|
+
totalTokens?: number;
|
|
298
|
+
};
|
|
299
|
+
/** 耗时(毫秒) */
|
|
300
|
+
latencyMs?: number;
|
|
301
|
+
/** 错误信息(success=false 时填充) */
|
|
302
|
+
message?: string;
|
|
303
|
+
/** 结束原因 */
|
|
304
|
+
finishReason?: string;
|
|
305
|
+
/** 协议原始响应 */
|
|
306
|
+
raw?: unknown;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/** 流式多模态聊天的增量回调状态 */
|
|
310
|
+
export interface MultimodalStreamDelta {
|
|
311
|
+
/** 累计的完整文本 */
|
|
312
|
+
text?: string;
|
|
313
|
+
/** 累计的图片数组(每次浅拷贝替换,不要 append) */
|
|
314
|
+
images?: Array<{
|
|
315
|
+
type: 'image';
|
|
316
|
+
url?: string;
|
|
317
|
+
b64_json?: string;
|
|
318
|
+
mimeType?: string;
|
|
319
|
+
}>;
|
|
320
|
+
/** 结束原因(最后一片 chunk 时填充) */
|
|
321
|
+
finishReason?: string;
|
|
322
|
+
/** token 用量(最后一片 chunk 时填充) */
|
|
323
|
+
usage?: {
|
|
324
|
+
inputTokens?: number;
|
|
325
|
+
outputTokens?: number;
|
|
326
|
+
totalTokens?: number;
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/** 流式多模态聊天入参 */
|
|
331
|
+
export interface MultimodalChatStreamOptions extends Omit<MultimodalChatOptions, 'timeoutMs'> {
|
|
332
|
+
/**
|
|
333
|
+
* 增量回调,每次收到协议 chunk 时触发。
|
|
334
|
+
* state.text 是累计完整文本(同 sendDirectChatStream 约定);
|
|
335
|
+
* state.images 是累计完整图片数组(图片一般整块出现,浅拷贝给上层)。
|
|
336
|
+
*/
|
|
337
|
+
onDelta: (state: MultimodalStreamDelta) => void;
|
|
338
|
+
/** 可选超时(毫秒) */
|
|
339
|
+
timeoutMs?: number;
|
|
340
|
+
}
|