@downcity/city 0.2.75 → 0.2.78
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/bin/core/base/base-runtime.d.ts +7 -2
- package/bin/core/base/base-runtime.d.ts.map +1 -1
- package/bin/core/base/base-runtime.js +22 -8
- package/bin/core/base/base-runtime.js.map +1 -1
- package/bin/core/base/base.js +1 -1
- package/bin/core/base/base.js.map +1 -1
- package/bin/core/types.d.ts +7 -22
- package/bin/core/types.d.ts.map +1 -1
- package/bin/index.d.ts +3 -3
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +1 -1
- package/bin/index.js.map +1 -1
- package/bin/service/ai/ai-service.d.ts.map +1 -1
- package/bin/service/ai/ai-service.js +2 -70
- package/bin/service/ai/ai-service.js.map +1 -1
- package/bin/service/ai/helpers.d.ts +121 -0
- package/bin/service/ai/helpers.d.ts.map +1 -0
- package/bin/service/ai/helpers.js +368 -0
- package/bin/service/ai/helpers.js.map +1 -0
- package/bin/service/ai/provider.d.ts +100 -26
- package/bin/service/ai/provider.d.ts.map +1 -1
- package/bin/service/ai/provider.js +166 -24
- package/bin/service/ai/provider.js.map +1 -1
- package/bin/service/ai/types.d.ts +35 -1
- package/bin/service/ai/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/bin/service/ai/openai-compatible-provider.d.ts +0 -54
- package/bin/service/ai/openai-compatible-provider.d.ts.map +0 -1
- package/bin/service/ai/openai-compatible-provider.js +0 -175
- package/bin/service/ai/openai-compatible-provider.js.map +0 -1
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Provider 通用工具模块。
|
|
3
|
+
*
|
|
4
|
+
* 集中管理 Provider 子类常用的输入解析、消息构造、usage 归一化、
|
|
5
|
+
* HTTP 响应读取等工具函数。
|
|
6
|
+
*/
|
|
7
|
+
import { jsonSchema, tool } from "ai";
|
|
8
|
+
// ===========================================================================
|
|
9
|
+
// 基础类型判断
|
|
10
|
+
// ===========================================================================
|
|
11
|
+
/**
|
|
12
|
+
* 判断一个值是否为普通对象。
|
|
13
|
+
*/
|
|
14
|
+
export function isRecord(value) {
|
|
15
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 将未知值转换为普通对象,失败返回 null。
|
|
19
|
+
*/
|
|
20
|
+
export function toRecord(value) {
|
|
21
|
+
return isRecord(value) ? value : null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 读取字符串字段,非字符串返回空字符串。
|
|
25
|
+
*/
|
|
26
|
+
export function readString(value) {
|
|
27
|
+
return typeof value === "string" ? value.trim() : "";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 过滤掉对象中的 undefined 值。
|
|
31
|
+
*/
|
|
32
|
+
export function stripUndefined(record) {
|
|
33
|
+
return Object.fromEntries(Object.entries(record).filter(([, item]) => item !== undefined));
|
|
34
|
+
}
|
|
35
|
+
// ===========================================================================
|
|
36
|
+
// 环境变量与 URL
|
|
37
|
+
// ===========================================================================
|
|
38
|
+
/**
|
|
39
|
+
* 移除 URL 尾部斜杠。
|
|
40
|
+
*/
|
|
41
|
+
export function trimTrailingSlash(value) {
|
|
42
|
+
return value.replace(/\/+$/, "");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 读取必填环境变量。
|
|
46
|
+
*/
|
|
47
|
+
export function readRequiredEnv(ctx, key) {
|
|
48
|
+
const value = ctx.env(key);
|
|
49
|
+
if (!value)
|
|
50
|
+
throw new Error(`${key} is required`);
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 解析上游模型 ID。
|
|
55
|
+
*
|
|
56
|
+
* 优先使用 model meta 中的 upstream_model,其次使用 fallback。
|
|
57
|
+
*/
|
|
58
|
+
export function resolveUpstreamModel(ctx, fallback) {
|
|
59
|
+
const meta_model = typeof ctx.variant?.meta?.upstream_model === "string"
|
|
60
|
+
? ctx.variant.meta.upstream_model.trim()
|
|
61
|
+
: "";
|
|
62
|
+
return meta_model || fallback;
|
|
63
|
+
}
|
|
64
|
+
// ===========================================================================
|
|
65
|
+
// HTTP 响应读取
|
|
66
|
+
// ===========================================================================
|
|
67
|
+
/**
|
|
68
|
+
* 读取 JSON 响应,非 2xx 时抛出错误。
|
|
69
|
+
*/
|
|
70
|
+
export async function readJsonResponse(response) {
|
|
71
|
+
const text = await response.text();
|
|
72
|
+
const data = text ? JSON.parse(text) : {};
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
const message = readErrorMessage(data) || response.statusText || `HTTP ${response.status}`;
|
|
75
|
+
throw new Error(message);
|
|
76
|
+
}
|
|
77
|
+
return data;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 从上游错误响应中提取可读错误信息。
|
|
81
|
+
*/
|
|
82
|
+
export function readErrorMessage(data) {
|
|
83
|
+
const record = toRecord(data);
|
|
84
|
+
const nested = toRecord(record?.data) ?? toRecord(record?.job) ?? toRecord(record?.result);
|
|
85
|
+
const error = toRecord(record?.error);
|
|
86
|
+
const nested_error = toRecord(nested?.error);
|
|
87
|
+
const detail = toRecord(error?.detail);
|
|
88
|
+
const nested_detail = toRecord(nested_error?.detail);
|
|
89
|
+
const message = readString(error?.message) ||
|
|
90
|
+
readString(detail?.message) ||
|
|
91
|
+
readString(nested_error?.message) ||
|
|
92
|
+
readString(nested_detail?.message) ||
|
|
93
|
+
readString(record?.message) ||
|
|
94
|
+
readString(nested?.message) ||
|
|
95
|
+
readString(record?.error) ||
|
|
96
|
+
readString(nested?.error);
|
|
97
|
+
const code = readString(error?.code) ||
|
|
98
|
+
readString(detail?.code) ||
|
|
99
|
+
readString(nested_error?.code) ||
|
|
100
|
+
readString(nested_detail?.code);
|
|
101
|
+
if (!message)
|
|
102
|
+
return "";
|
|
103
|
+
return code && !message.includes(code) ? `${message} (${code})` : message;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 构造标准 assistant UIMessage。
|
|
107
|
+
*/
|
|
108
|
+
export function buildAssistantMessage(text, ctx, result, billing) {
|
|
109
|
+
const parts = [{ type: "text", text }];
|
|
110
|
+
if (result.toolCalls) {
|
|
111
|
+
for (const toolCall of result.toolCalls) {
|
|
112
|
+
const part = {
|
|
113
|
+
type: "dynamic-tool",
|
|
114
|
+
toolCallId: toolCall.toolCallId,
|
|
115
|
+
toolName: toolCall.toolName,
|
|
116
|
+
state: "input-available",
|
|
117
|
+
input: toolCall.input,
|
|
118
|
+
};
|
|
119
|
+
parts.push(part);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
output: {
|
|
124
|
+
id: `msg_${crypto.randomUUID()}`,
|
|
125
|
+
role: "assistant",
|
|
126
|
+
parts,
|
|
127
|
+
metadata: {
|
|
128
|
+
model: ctx.variant?.id,
|
|
129
|
+
town_id: ctx.town?.town_id,
|
|
130
|
+
user_id: ctx.user?.user_id,
|
|
131
|
+
finishReason: result.finishReason,
|
|
132
|
+
usage: result.usage,
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
billing,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 构造标准图片 file-parts UIMessage。
|
|
140
|
+
*/
|
|
141
|
+
export function buildImageMessage(ctx, images, metadata) {
|
|
142
|
+
if (images.length === 0) {
|
|
143
|
+
throw new Error("Image provider returned no images");
|
|
144
|
+
}
|
|
145
|
+
const parts = images.map((image) => ({
|
|
146
|
+
type: "file",
|
|
147
|
+
mediaType: image.media_type,
|
|
148
|
+
url: image.url,
|
|
149
|
+
...(image.filename ? { filename: image.filename } : {}),
|
|
150
|
+
}));
|
|
151
|
+
return {
|
|
152
|
+
id: `msg_${crypto.randomUUID()}`,
|
|
153
|
+
role: "assistant",
|
|
154
|
+
parts,
|
|
155
|
+
metadata: stripUndefined({
|
|
156
|
+
model: ctx.variant?.id,
|
|
157
|
+
town_id: ctx.town?.town_id,
|
|
158
|
+
user_id: ctx.user?.user_id,
|
|
159
|
+
...metadata,
|
|
160
|
+
}),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 读取图片任务推进上下文。
|
|
165
|
+
*/
|
|
166
|
+
export function readImageJobStepContext(ctx) {
|
|
167
|
+
const value = ctx.locals.image_job;
|
|
168
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
169
|
+
? value
|
|
170
|
+
: undefined;
|
|
171
|
+
}
|
|
172
|
+
// ===========================================================================
|
|
173
|
+
// Tool 解析
|
|
174
|
+
// ===========================================================================
|
|
175
|
+
/**
|
|
176
|
+
* OpenAI function tools → ai-sdk ToolSet。
|
|
177
|
+
*/
|
|
178
|
+
export function buildToolSet(items) {
|
|
179
|
+
if (!items?.length)
|
|
180
|
+
return undefined;
|
|
181
|
+
return Object.fromEntries(items
|
|
182
|
+
.filter((item) => item.type === "function" && typeof item.function?.name === "string")
|
|
183
|
+
.map((item) => [
|
|
184
|
+
item.function.name,
|
|
185
|
+
tool({
|
|
186
|
+
description: item.function.description ?? "",
|
|
187
|
+
inputSchema: jsonSchema(item.function.parameters ?? {}),
|
|
188
|
+
}),
|
|
189
|
+
]));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 兼容常见 provider usage 字段,归一化为 input_tokens / output_tokens / cached_tokens。
|
|
193
|
+
*/
|
|
194
|
+
export function normalizeAIUsage(usage) {
|
|
195
|
+
if (!isRecord(usage))
|
|
196
|
+
return {};
|
|
197
|
+
const input_token_details = isRecord(usage.inputTokenDetails) ? usage.inputTokenDetails : undefined;
|
|
198
|
+
const cached_tokens = readNumberFieldValue(usage, [
|
|
199
|
+
"cached_input_tokens",
|
|
200
|
+
"cachedTokens",
|
|
201
|
+
"cached_tokens",
|
|
202
|
+
"prompt_cache_hit_tokens",
|
|
203
|
+
]) ?? readNestedNumberFieldValue(usage, "inputTokenDetails", [
|
|
204
|
+
"cacheReadTokens",
|
|
205
|
+
"cachedTokens",
|
|
206
|
+
]) ?? readNestedNumberFieldValue(usage, "prompt_tokens_details", [
|
|
207
|
+
"cached_tokens",
|
|
208
|
+
"cachedTokens",
|
|
209
|
+
]) ?? readNumberFieldValue(usage, [
|
|
210
|
+
"cachedInputTokens",
|
|
211
|
+
]);
|
|
212
|
+
const total_input_tokens = readNumberFieldValue(usage, [
|
|
213
|
+
"promptTokens",
|
|
214
|
+
"prompt_tokens",
|
|
215
|
+
"inputTokens",
|
|
216
|
+
"input_tokens",
|
|
217
|
+
"promptTokenCount",
|
|
218
|
+
"prompt_token_count",
|
|
219
|
+
]);
|
|
220
|
+
const input_tokens = readNumberFieldValue(usage, ["prompt_cache_miss_tokens"])
|
|
221
|
+
?? (input_token_details ? readNumberFieldValue(input_token_details, [
|
|
222
|
+
"noCacheTokens",
|
|
223
|
+
"inputTokens",
|
|
224
|
+
]) : undefined)
|
|
225
|
+
?? readNestedNumberFieldValue(usage, "prompt_tokens_details", [
|
|
226
|
+
"no_cache_tokens",
|
|
227
|
+
"noCacheTokens",
|
|
228
|
+
])
|
|
229
|
+
?? (total_input_tokens !== undefined && cached_tokens !== undefined
|
|
230
|
+
? Math.max(total_input_tokens - cached_tokens, 0)
|
|
231
|
+
: total_input_tokens);
|
|
232
|
+
return {
|
|
233
|
+
...(input_tokens !== undefined ? { input_tokens } : {}),
|
|
234
|
+
...readNumberField(usage, [
|
|
235
|
+
"outputTokens",
|
|
236
|
+
"output_tokens",
|
|
237
|
+
"completionTokens",
|
|
238
|
+
"completion_tokens",
|
|
239
|
+
"candidatesTokenCount",
|
|
240
|
+
"candidates_token_count",
|
|
241
|
+
], "output_tokens"),
|
|
242
|
+
...(cached_tokens !== undefined ? { cached_tokens } : {}),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function readNumberField(record, keys, output_key) {
|
|
246
|
+
const value = readNumberFieldValue(record, keys);
|
|
247
|
+
return value !== undefined ? { [output_key]: value } : {};
|
|
248
|
+
}
|
|
249
|
+
function readNumberFieldValue(record, keys) {
|
|
250
|
+
for (const key of keys) {
|
|
251
|
+
const value = record[key];
|
|
252
|
+
const normalized = Number(value);
|
|
253
|
+
if (Number.isFinite(normalized) && normalized >= 0) {
|
|
254
|
+
return normalized;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
function readNestedNumberFieldValue(record, parent, keys) {
|
|
260
|
+
const nested = record[parent];
|
|
261
|
+
return isRecord(nested) ? readNumberFieldValue(nested, keys) : undefined;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 给 /chat/completions 透传前规整 body。
|
|
265
|
+
*
|
|
266
|
+
* - 替换 model 为实际上游模型
|
|
267
|
+
* - 当 stream 为 true 时补充 include_usage
|
|
268
|
+
* - 把多模态 content 中的文本片段拼成纯文本(适合不支持 image_url 的上游)
|
|
269
|
+
*/
|
|
270
|
+
export function normalizeOpenAICompatibleBody(input, model) {
|
|
271
|
+
const stream_options = input.stream === true
|
|
272
|
+
? {
|
|
273
|
+
...(isRecord(input.stream_options) ? input.stream_options : {}),
|
|
274
|
+
include_usage: true,
|
|
275
|
+
}
|
|
276
|
+
: input.stream_options;
|
|
277
|
+
return {
|
|
278
|
+
...input,
|
|
279
|
+
model,
|
|
280
|
+
...(stream_options !== undefined ? { stream_options } : {}),
|
|
281
|
+
messages: Array.isArray(input.messages)
|
|
282
|
+
? input.messages.map((message) => normalizeOpenAIMessage(message))
|
|
283
|
+
: input.messages,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
function normalizeOpenAIMessage(message) {
|
|
287
|
+
if (!message || typeof message !== "object")
|
|
288
|
+
return message;
|
|
289
|
+
const record = message;
|
|
290
|
+
if (record.role !== "user")
|
|
291
|
+
return record;
|
|
292
|
+
return {
|
|
293
|
+
...record,
|
|
294
|
+
content: stringifyOpenAIContent(record.content),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
function stringifyOpenAIContent(content) {
|
|
298
|
+
if (typeof content === "string")
|
|
299
|
+
return content;
|
|
300
|
+
if (!Array.isArray(content))
|
|
301
|
+
return content == null ? "" : String(content);
|
|
302
|
+
const texts = [];
|
|
303
|
+
for (const part of content) {
|
|
304
|
+
if (!part || typeof part !== "object")
|
|
305
|
+
continue;
|
|
306
|
+
const record = part;
|
|
307
|
+
if (record.type === "text" && typeof record.text === "string") {
|
|
308
|
+
texts.push(record.text);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return texts.join("\n");
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* 从 OpenAI-compatible SSE 流中读取最后一个 usage。
|
|
315
|
+
*/
|
|
316
|
+
export async function readOpenAICompatibleSseUsage(body) {
|
|
317
|
+
const reader = body.getReader();
|
|
318
|
+
const decoder = new TextDecoder();
|
|
319
|
+
let buffer = "";
|
|
320
|
+
let usage;
|
|
321
|
+
try {
|
|
322
|
+
while (true) {
|
|
323
|
+
const { done, value } = await reader.read();
|
|
324
|
+
if (done)
|
|
325
|
+
break;
|
|
326
|
+
buffer += decoder.decode(value, { stream: true });
|
|
327
|
+
const lines = buffer.split(/\r?\n/);
|
|
328
|
+
buffer = lines.pop() ?? "";
|
|
329
|
+
for (const line of lines) {
|
|
330
|
+
const data = parseSseDataLine(line);
|
|
331
|
+
if (!data || data === "[DONE]")
|
|
332
|
+
continue;
|
|
333
|
+
const parsed = parseJsonObject(data);
|
|
334
|
+
if (parsed && "usage" in parsed)
|
|
335
|
+
usage = parsed.usage;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
buffer += decoder.decode();
|
|
339
|
+
for (const line of buffer.split(/\r?\n/)) {
|
|
340
|
+
const data = parseSseDataLine(line);
|
|
341
|
+
if (!data || data === "[DONE]")
|
|
342
|
+
continue;
|
|
343
|
+
const parsed = parseJsonObject(data);
|
|
344
|
+
if (parsed && "usage" in parsed)
|
|
345
|
+
usage = parsed.usage;
|
|
346
|
+
}
|
|
347
|
+
return usage;
|
|
348
|
+
}
|
|
349
|
+
finally {
|
|
350
|
+
reader.releaseLock();
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function parseSseDataLine(line) {
|
|
354
|
+
const trimmed = line.trimStart();
|
|
355
|
+
if (!trimmed.startsWith("data:"))
|
|
356
|
+
return undefined;
|
|
357
|
+
return trimmed.slice("data:".length).trim();
|
|
358
|
+
}
|
|
359
|
+
function parseJsonObject(value) {
|
|
360
|
+
try {
|
|
361
|
+
const parsed = JSON.parse(value);
|
|
362
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/service/ai/helpers.ts"],"names":[],"mappings":"AAAC;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAKtC,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAoC,MAAS;IACzE,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAC3D,CAAC;AACT,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,GAAW;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY,EAAE,QAAgB;IACjE,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,KAAK,QAAQ;QACtE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;QACxC,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,UAAU,IAAI,QAAQ,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAkB;IACvD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,OAAO,GACX,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC;QAC1B,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;QAC3B,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC;QACjC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC;QAClC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;QAC3B,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;QAC3B,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC;QACzB,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,MAAM,IAAI,GACR,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;QACvB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;QACxB,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC;QAC9B,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5E,CAAC;AA8BD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,GAAY,EACZ,MAAmC,EACnC,OAA+B;IAE/B,MAAM,KAAK,GAAuB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,IAAI,GAAsB;gBAC9B,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,iBAAiB;gBACxB,KAAK,EAAE,QAAQ,CAAC,KAAgC;aACjD,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,OAAO,MAAM,CAAC,UAAU,EAAE,EAAE;YAChC,IAAI,EAAE,WAAW;YACjB,KAAK;YACL,QAAQ,EAAE;gBACR,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE;gBACtB,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO;gBAC1B,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO;gBAC1B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB;SACF;QACD,OAAO;KACR,CAAC;AACJ,CAAC;AAcD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAY,EACZ,MAAwB,EACxB,QAAiC;IAEjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,KAAK,GAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,EAAE,EAAE,OAAO,MAAM,CAAC,UAAU,EAAE,EAAE;QAChC,IAAI,EAAE,WAAW;QACjB,KAAK;QACL,QAAQ,EAAE,cAAc,CAAC;YACvB,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE;YACtB,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO;YAC1B,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO;YAC1B,GAAG,QAAQ;SACZ,CAAC;KACH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IACnC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC,CAAC,KAA8B;QAChC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAA4C;IACvE,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,SAAS,CAAC;IAErC,OAAO,MAAM,CAAC,WAAW,CACvB,KAAK;SACF,MAAM,CAAC,CAAC,IAAI,EAGX,EAAE,CACF,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,OAAQ,IAA0C,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC;SAC5G,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI;QAClB,IAAI,CAAC;YACH,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE;YAC5C,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;SACxD,CAAC;KACH,CAAC,CACL,CAAC;AACJ,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAK7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IACpG,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,EAAE;QAChD,qBAAqB;QACrB,cAAc;QACd,eAAe;QACf,yBAAyB;KAC1B,CAAC,IAAI,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,EAAE;QAC3D,iBAAiB;QACjB,cAAc;KACf,CAAC,IAAI,0BAA0B,CAAC,KAAK,EAAE,uBAAuB,EAAE;QAC/D,eAAe;QACf,cAAc;KACf,CAAC,IAAI,oBAAoB,CAAC,KAAK,EAAE;QAChC,mBAAmB;KACpB,CAAC,CAAC;IACH,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,KAAK,EAAE;QACrD,cAAc;QACd,eAAe;QACf,aAAa;QACb,cAAc;QACd,kBAAkB;QAClB,oBAAoB;KACrB,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,EAAE,CAAC,0BAA0B,CAAC,CAAC;WACzE,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC,mBAAmB,EAAE;YAClE,eAAe;YACf,aAAa;SACd,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;WACZ,0BAA0B,CAAC,KAAK,EAAE,uBAAuB,EAAE;YAC5D,iBAAiB;YACjB,eAAe;SAChB,CAAC;WACC,CAAC,kBAAkB,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS;YACjE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,aAAa,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAE1B,OAAO;QACL,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,eAAe,CAAC,KAAK,EAAE;YACxB,cAAc;YACd,eAAe;YACf,kBAAkB;YAClB,mBAAmB;YACnB,sBAAsB;YACtB,wBAAwB;SACzB,EAAE,eAAe,CAAC;QACnB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,MAAmB,EACnB,IAAc,EACd,UAA8D;IAE9D,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB,EAAE,IAAc;IAC/D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAmB,EAAE,MAAc,EAAE,IAAc;IACrF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAA8B,EAC9B,KAAa;IAEb,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI;QAC1C,CAAC,CAAC;YACE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,aAAa,EAAE,IAAI;SACpB;QACH,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IACzB,OAAO;QACL,GAAG,KAAK;QACR,KAAK;QACL,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;YACrC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAClE,CAAC,CAAC,KAAK,CAAC,QAAQ;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAgB;IAC9C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC5D,MAAM,MAAM,GAAG,OAA4B,CAAC;IAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1C,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAgB;IAC9C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,MAAM,GAAG,IAA+B,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAc,CAAC;IAEnB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ;oBAAE,SAAS;gBACzC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM;oBAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACxD,CAAC;QACH,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACzC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM;gBAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACxD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;QAC5C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1,39 +1,112 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AI Provider 模块。
|
|
3
3
|
*
|
|
4
|
-
* Provider
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - SDK 通路:text / stream — 给 User City 用
|
|
9
|
-
* - OpenAI 兼容通路:openai — 给 /chat/completions 端点用
|
|
10
|
-
* - 未提供 openai action → AIService 自动透传(需 baseURL + envKey)
|
|
11
|
-
* - 提供了 openai action → 按自定义逻辑处理
|
|
4
|
+
* Provider 是第三方 AI 提供商的基类。
|
|
5
|
+
* - 默认提供 OpenAI-compatible 的 text / stream 实现。
|
|
6
|
+
* - 子类通过覆盖 createClient 来绑定不同的 AI SDK provider。
|
|
7
|
+
* - 需要其它模态(image / video / tts / asr)或自定义 openai 透传时,覆盖对应方法。
|
|
12
8
|
*/
|
|
13
|
-
import type {
|
|
14
|
-
import type {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
tts?: ActionFn;
|
|
26
|
-
asr?: ActionFn;
|
|
27
|
-
openai?: ActionFn;
|
|
9
|
+
import type { UIMessage } from "ai";
|
|
10
|
+
import type { Context } from "../service.js";
|
|
11
|
+
import type { AIProviderBilledOutput, AIProviderBilledResponse, AIProviderBillingLine } from "./billing.js";
|
|
12
|
+
import type { AIImageJobStepResult } from "./job-types.js";
|
|
13
|
+
import type { ModelConfig, OpenAICompatibleClient, OpenAICompatibleClientConfig, ProviderOptions } from "./types.js";
|
|
14
|
+
interface OpenAIActionInput {
|
|
15
|
+
/** 多轮 UIMessage。 */
|
|
16
|
+
messages?: UIMessage[];
|
|
17
|
+
/** 单轮 prompt。 */
|
|
18
|
+
prompt?: string;
|
|
19
|
+
/** OpenAI function tools。 */
|
|
20
|
+
tools?: Record<string, unknown>[];
|
|
28
21
|
}
|
|
29
|
-
|
|
22
|
+
/**
|
|
23
|
+
* AI Provider 基类。
|
|
24
|
+
*
|
|
25
|
+
* 子类通过覆盖方法声明 action,model() 会自动收集并生成 ModelConfig。
|
|
26
|
+
* 默认 text / stream 使用 OpenAI-compatible 协议,覆盖 createClient 即可接入不同上游。
|
|
27
|
+
*/
|
|
28
|
+
export declare abstract class Provider {
|
|
29
|
+
/** Provider 唯一 ID。 */
|
|
30
30
|
readonly id: string;
|
|
31
|
+
/** 模型所需环境变量说明。 */
|
|
31
32
|
readonly env?: Record<string, string>;
|
|
33
|
+
/** Provider 的 baseURL(用于自动透传)。 */
|
|
32
34
|
readonly baseURL?: string;
|
|
35
|
+
/** Provider 的环境变量 key。 */
|
|
33
36
|
readonly envKey?: string;
|
|
37
|
+
/** 上游 API 实际模型 ID(自动透传时替换 body.model)。 */
|
|
34
38
|
readonly passthroughModel?: string;
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
constructor(options: ProviderOptions);
|
|
40
|
+
/**
|
|
41
|
+
* 创建 OpenAI-compatible chat client。
|
|
42
|
+
*
|
|
43
|
+
* 子类需要支持 text / stream 时必须覆盖。
|
|
44
|
+
* 默认抛出错误。
|
|
45
|
+
*/
|
|
46
|
+
protected createClient(config: OpenAICompatibleClientConfig): OpenAICompatibleClient;
|
|
47
|
+
/**
|
|
48
|
+
* 从输入中提取 prompt 文本。
|
|
49
|
+
*
|
|
50
|
+
* 子类可覆盖以支持多模态 messages 转文本。
|
|
51
|
+
*/
|
|
52
|
+
protected extractPrompt(input: OpenAIActionInput): string;
|
|
53
|
+
/**
|
|
54
|
+
* 从 usage 生成计费行。
|
|
55
|
+
*
|
|
56
|
+
* 默认不返回计费,由 billingService pricing rules 兜底。
|
|
57
|
+
*/
|
|
58
|
+
protected buildBilling(ctx: Context, usage: unknown): AIProviderBillingLine | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* 创建当前请求的 chat model。
|
|
61
|
+
*/
|
|
62
|
+
private createChatModel;
|
|
63
|
+
/**
|
|
64
|
+
* 将输入解析成 prompt 或 tools+messages。
|
|
65
|
+
*/
|
|
66
|
+
private resolveActionInput;
|
|
67
|
+
/**
|
|
68
|
+
* 文本生成 action(OpenAI-compatible 默认实现)。
|
|
69
|
+
*/
|
|
70
|
+
text(ctx: Context): Promise<AIProviderBilledOutput<UIMessage>>;
|
|
71
|
+
/**
|
|
72
|
+
* 流式生成 action(OpenAI-compatible 默认实现)。
|
|
73
|
+
*/
|
|
74
|
+
stream(ctx: Context): Promise<AIProviderBilledResponse>;
|
|
75
|
+
/**
|
|
76
|
+
* 图片生成 action。
|
|
77
|
+
*
|
|
78
|
+
* 子类实现图片生成时覆盖。
|
|
79
|
+
*/
|
|
80
|
+
image?(ctx: Context): Promise<AIProviderBilledOutput<UIMessage>>;
|
|
81
|
+
/**
|
|
82
|
+
* 图片任务推进 action。
|
|
83
|
+
*
|
|
84
|
+
* 子类实现异步图片任务时覆盖。
|
|
85
|
+
*/
|
|
86
|
+
image_job?(ctx: Context): Promise<AIImageJobStepResult>;
|
|
87
|
+
/**
|
|
88
|
+
* 视频生成 action。
|
|
89
|
+
*/
|
|
90
|
+
video?(ctx: Context): Promise<AIProviderBilledOutput<UIMessage>>;
|
|
91
|
+
/**
|
|
92
|
+
* 语音合成 action。
|
|
93
|
+
*/
|
|
94
|
+
tts?(ctx: Context): Promise<AIProviderBilledResponse>;
|
|
95
|
+
/**
|
|
96
|
+
* 语音识别 action。
|
|
97
|
+
*/
|
|
98
|
+
asr?(ctx: Context): Promise<AIProviderBilledResponse>;
|
|
99
|
+
/**
|
|
100
|
+
* OpenAI 兼容 /chat/completions action。
|
|
101
|
+
*
|
|
102
|
+
* 未覆盖时由 AIService 自动透传。
|
|
103
|
+
*/
|
|
104
|
+
openai?(ctx: Context): Promise<AIProviderBilledResponse>;
|
|
105
|
+
/**
|
|
106
|
+
* 生成模型配置。
|
|
107
|
+
*
|
|
108
|
+
* 自动收集当前 Provider 实例上定义的 action 方法。
|
|
109
|
+
*/
|
|
37
110
|
model(spec: {
|
|
38
111
|
id: string;
|
|
39
112
|
name: string;
|
|
@@ -43,4 +116,5 @@ export declare class Provider {
|
|
|
43
116
|
default?: boolean | string[];
|
|
44
117
|
}): ModelConfig;
|
|
45
118
|
}
|
|
119
|
+
export {};
|
|
46
120
|
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/service/ai/provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/service/ai/provider.ts"],"names":[],"mappings":"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"}
|