@downcity/city 0.2.153 → 0.2.157
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/index.d.ts +3 -1
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +1 -0
- package/bin/index.js.map +1 -1
- package/bin/pact/user/types.d.ts +2 -0
- package/bin/pact/user/types.d.ts.map +1 -1
- package/bin/service/ai/ai-service.d.ts +3 -55
- package/bin/service/ai/ai-service.d.ts.map +1 -1
- package/bin/service/ai/ai-service.js +34 -245
- package/bin/service/ai/ai-service.js.map +1 -1
- package/bin/service/ai/model-registry.d.ts +39 -0
- package/bin/service/ai/model-registry.d.ts.map +1 -0
- package/bin/service/ai/model-registry.js +74 -0
- package/bin/service/ai/model-registry.js.map +1 -0
- package/bin/service/ai/model-routing.d.ts +10 -0
- package/bin/service/ai/model-routing.d.ts.map +1 -0
- package/bin/service/ai/model-routing.js +140 -0
- package/bin/service/ai/model-routing.js.map +1 -0
- package/bin/service/ai/provider.d.ts +11 -1
- package/bin/service/ai/provider.d.ts.map +1 -1
- package/bin/service/ai/provider.js +33 -4
- package/bin/service/ai/provider.js.map +1 -1
- package/bin/service/ai/reasoning.d.ts +26 -0
- package/bin/service/ai/reasoning.d.ts.map +1 -0
- package/bin/service/ai/reasoning.js +118 -0
- package/bin/service/ai/reasoning.js.map +1 -0
- package/bin/service/ai/types.d.ts +5 -24
- package/bin/service/ai/types.d.ts.map +1 -1
- package/bin/types/AIReasoning.d.ts +25 -0
- package/bin/types/AIReasoning.d.ts.map +1 -0
- package/bin/types/AIReasoning.js +7 -0
- package/bin/types/AIReasoning.js.map +1 -0
- package/bin/types/AIRouting.d.ts +37 -0
- package/bin/types/AIRouting.d.ts.map +1 -0
- package/bin/types/AIRouting.js +7 -0
- package/bin/types/AIRouting.js.map +1 -0
- package/package.json +2 -2
package/bin/index.d.ts
CHANGED
|
@@ -24,7 +24,9 @@ export type { ServiceDefinition, ServiceInstallContext, ServiceRouteContext, } f
|
|
|
24
24
|
export type { InstructionDefinition, InstructionContext, InstructionActionDefinition, InstructionCapable, } from "./service/instruction.js";
|
|
25
25
|
export { AIService } from "./service/ai/ai-service.js";
|
|
26
26
|
export { Provider } from "./service/ai/provider.js";
|
|
27
|
+
export { read_resolved_reasoning } from "./service/ai/reasoning.js";
|
|
27
28
|
export type { AIServiceOptions, ModelConfig, ModelFallbackMedia, ModelFallbackRule, ModelActions, OpenAICompatibleClient, OpenAICompatibleClientConfig, ProviderOptions, PublicModel, } from "./service/ai/types.js";
|
|
29
|
+
export type { AIProviderOptionObject, AIProviderOptions, AIProviderOptionValue, AIResolvedReasoning, } from "./types/AIReasoning.js";
|
|
28
30
|
export { buildAssistantMessage, buildImageMessage, buildToolSet, isRecord, normalizeAIUsage, normalizeOpenAICompatibleBody, normalizeTextOnlyOpenAICompatibleBody, readErrorMessage, readJsonResponse, readOpenAICompatibleSseUsage, readRequiredEnv, readString, resolveUpstreamModel, stripUndefined, toRecord, trimTrailingSlash, } from "./service/ai/helpers.js";
|
|
29
31
|
export type { BuildAssistantMessageResult, ExtractedImage, ToolCallShape, } from "./service/ai/helpers.js";
|
|
30
32
|
export type { AIBalanceBridge, AIBalanceChargeInput, AIProviderBillFn, AIProviderChargedOutput, AIProviderChargedResponse, AIProviderChargeLine, } from "./service/ai/charge.js";
|
|
@@ -38,7 +40,7 @@ export { executeDDL } from "./store/db.js";
|
|
|
38
40
|
export type { CityTableApi } from "./store/table-api.js";
|
|
39
41
|
export type { CityUserSchemaInput } from "./store/types.js";
|
|
40
42
|
export type { FetchLike, FetchResponseLike, RawStreamBody, RequestInitLike, } from "./pact/http.js";
|
|
41
|
-
export type { CityModel, CityModelDescriptor, CityModelEnvRequirement, } from "@downcity/type";
|
|
43
|
+
export type { CityModel, CityModelDescriptor, CityModelEnvRequirement, CityModelReasoning, CityModelReasoningEffort, } from "@downcity/type";
|
|
42
44
|
export { City } from "./client/city.js";
|
|
43
45
|
export type { AdminCityOptions, CityBaseOptions, CityOptions, CityOptionsForRole, CityRole, UserCityOptions, } from "./client/types.js";
|
|
44
46
|
export { AIInvoker, ModelCatalog, ModelHandle } from "./pact/invoker/ai/index.js";
|
package/bin/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACvF,YAAY,EAAE,sBAAsB,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC;AACvG,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC7F,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,YAAY,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,EAC5B,YAAY,EACZ,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,oBAAoB,EACpB,2BAA2B,EAC3B,iCAAiC,EACjC,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAMzC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,YAAY,EACV,OAAO,EACP,SAAS,EACT,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,cAAc,EACd,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,QAAQ,EACR,MAAM,GACP,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/bin/index.js
CHANGED
|
@@ -18,6 +18,7 @@ export { InstallableService } from "./service/installable-service.js";
|
|
|
18
18
|
export { Action } from "./service/action.js";
|
|
19
19
|
export { AIService } from "./service/ai/ai-service.js";
|
|
20
20
|
export { Provider } from "./service/ai/provider.js";
|
|
21
|
+
export { read_resolved_reasoning } from "./service/ai/reasoning.js";
|
|
21
22
|
export { buildAssistantMessage, buildImageMessage, buildToolSet, isRecord, normalizeAIUsage, normalizeOpenAICompatibleBody, normalizeTextOnlyOpenAICompatibleBody, readErrorMessage, readJsonResponse, readOpenAICompatibleSseUsage, readRequiredEnv, readString, resolveUpstreamModel, stripUndefined, toRecord, trimTrailingSlash, } from "./service/ai/helpers.js";
|
|
22
23
|
// ===========================================================================
|
|
23
24
|
// 场景 3:用户鉴权与 Token
|
package/bin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAKxD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAepD,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAmC7C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAKxD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAepD,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAmC7C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAqBpE,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,6BAA6B,EAC7B,qCAAqC,EACrC,gBAAgB,EAChB,gBAAgB,EAChB,4BAA4B,EAC5B,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,cAAc,EACd,QAAQ,EACR,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAiBjC,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAShE,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAQ1D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAOtD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAuB3C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAUxC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAyCxE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AA8BzD,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE7E,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,eAAe,EACf,WAAW,EACX,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
|
package/bin/pact/user/types.d.ts
CHANGED
|
@@ -150,6 +150,8 @@ export interface UserAsrInput extends UserServiceInput {
|
|
|
150
150
|
export interface UserServiceInput {
|
|
151
151
|
/** AIService 调用必须显式传入的模型引用或模型 ID。 */
|
|
152
152
|
model: UserModelInput;
|
|
153
|
+
/** 模型推理强度档位,必须来自模型目录 `reasoning.efforts`。 */
|
|
154
|
+
reasoning_effort?: string;
|
|
153
155
|
[key: string]: unknown;
|
|
154
156
|
}
|
|
155
157
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/pact/user/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/pact/user/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ import type { AIServiceOptions, ModelConfig, PublicModel } from "./types.js";
|
|
|
21
21
|
type EnvReader = (key: string) => string | undefined;
|
|
22
22
|
export declare class AIService extends Service {
|
|
23
23
|
/** 模型注册表 */
|
|
24
|
-
private
|
|
24
|
+
private readonly models;
|
|
25
25
|
/** SDK 通路 action 映射(modality → action) */
|
|
26
26
|
private modalityActions;
|
|
27
27
|
/** AI 专用余额桥接。 */
|
|
@@ -44,59 +44,8 @@ export declare class AIService extends Service {
|
|
|
44
44
|
private resolveOpenAIAction;
|
|
45
45
|
private createAutoPassthroughAction;
|
|
46
46
|
private getModelModalities;
|
|
47
|
-
|
|
48
|
-
private
|
|
49
|
-
/**
|
|
50
|
-
* 按请求媒体输入和模型级 fallback 规则决定实际执行模型。
|
|
51
|
-
*
|
|
52
|
-
* 关键说明(中文)
|
|
53
|
-
* - 这里只做路由,不改写请求体,避免 AIService 绑定具体上游协议。
|
|
54
|
-
* - UIMessage 只从 file part 提取媒体信息,具体如何分流交给 fallback.match。
|
|
55
|
-
* - OpenAI image_url / input_image 会归一为 image 媒体输入后进入同一套规则。
|
|
56
|
-
* - fallback 规则按数组顺序匹配,规则顺序高于请求里的 file 顺序。
|
|
57
|
-
* - 没有配置 fallback 时保持既有行为,由 Provider 自己决定如何处理。
|
|
58
|
-
*/
|
|
59
|
-
private planTextExecution;
|
|
60
|
-
/**
|
|
61
|
-
* 解析模型 fallback 引用。
|
|
62
|
-
*/
|
|
63
|
-
private resolveFallbackModel;
|
|
64
|
-
/**
|
|
65
|
-
* 根据一条规则和一个媒体输入解析 fallback 计划。
|
|
66
|
-
*/
|
|
67
|
-
private resolveMediaFallbackPlan;
|
|
68
|
-
/**
|
|
69
|
-
* 安全执行 fallback 规则匹配。
|
|
70
|
-
*/
|
|
71
|
-
private matchesFallbackRule;
|
|
72
|
-
/**
|
|
73
|
-
* 从当前请求中提取可参与 fallback 判断的媒体输入。
|
|
74
|
-
*/
|
|
75
|
-
private extractMediaInputs;
|
|
76
|
-
/**
|
|
77
|
-
* 扫描 OpenAI-compatible messages 的媒体输入。
|
|
78
|
-
*/
|
|
79
|
-
private extractOpenAIMediaInputs;
|
|
80
|
-
/**
|
|
81
|
-
* 读取 OpenAI-compatible content part 的媒体输入。
|
|
82
|
-
*/
|
|
83
|
-
private readOpenAIMediaPart;
|
|
84
|
-
/**
|
|
85
|
-
* 读取 OpenAI-compatible 图片 URL。
|
|
86
|
-
*/
|
|
87
|
-
private readOpenAIImageUrl;
|
|
88
|
-
/**
|
|
89
|
-
* 扫描 UIMessage messages 的 file 媒体输入。
|
|
90
|
-
*/
|
|
91
|
-
private extractUiMediaInputs;
|
|
92
|
-
/**
|
|
93
|
-
* 读取 UIMessage file part 的媒体输入。
|
|
94
|
-
*/
|
|
95
|
-
private readUiFilePart;
|
|
96
|
-
/**
|
|
97
|
-
* 构造 fallback 媒体输入,避免可选字段写入 undefined。
|
|
98
|
-
*/
|
|
99
|
-
private buildFallbackMedia;
|
|
47
|
+
/** 按媒体输入解析最终模型,推理强度必须在该步骤之后解析。 */
|
|
48
|
+
private plan_text_execution;
|
|
100
49
|
private handleModality;
|
|
101
50
|
private createImageJob;
|
|
102
51
|
private readImageJob;
|
|
@@ -183,7 +132,6 @@ export declare class AIService extends Service {
|
|
|
183
132
|
env: EnvReader;
|
|
184
133
|
identity: "guest" | "user" | "admin";
|
|
185
134
|
}): PublicModel[];
|
|
186
|
-
private toPublicModel;
|
|
187
135
|
}
|
|
188
136
|
export {};
|
|
189
137
|
//# sourceMappingURL=ai-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-service.d.ts","sourceRoot":"","sources":["../../../src/service/ai/ai-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAgB,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAI7C,OAAO,KAAK,EACV,gBAAgB,
|
|
1
|
+
{"version":3,"file":"ai-service.d.ts","sourceRoot":"","sources":["../../../src/service/ai/ai-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAgB,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAI7C,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EAEX,WAAW,EACZ,MAAM,YAAY,CAAC;AA2CpB,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AA2PrD,qBAAa,SAAU,SAAQ,OAAO;IACpC,YAAY;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAEhD,0CAA0C;IAC1C,OAAO,CAAC,eAAe,CAA+B;IAEtD,iBAAiB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAkB;IAC3C,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAS;gBAE3C,OAAO,GAAE,gBAAqB;IA0C1C,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,IAAI;IAKrD,UAAU,IAAI,WAAW,EAAE;IAI3B,SAAS,IAAI,OAAO;IAMpB,OAAO,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,CAAC,EAAE,SAAS,GAAG;QAAE,KAAK,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,QAAQ,CAAA;KAAE;IAgB7G,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,2BAA2B;IAmCnC,OAAO,CAAC,kBAAkB;IAS1B,kCAAkC;IAClC,OAAO,CAAC,mBAAmB;YAkBb,cAAc;YA4Bd,cAAc;YAgBd,YAAY;IAS1B;;OAEG;YACW,aAAa;IA2C3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAOjC;;OAEG;IACH,OAAO,CAAC,kCAAkC;IAc1C;;OAEG;YACW,iBAAiB;IAU/B;;;;;;;OAOG;YACW,2BAA2B;IAwDzC;;OAEG;YACW,cAAc;IAuB5B;;OAEG;YACW,eAAe;IAW7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;YACW,uBAAuB;YAmBvB,qBAAqB;IA6BnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;;;;;OAOG;YACW,QAAQ;IAMtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;OAEG;YACW,YAAY;IAkD1B,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE;QAC/C,GAAG,EAAE,SAAS,CAAC;QACf,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;KACtC,GAAG,WAAW,EAAE;CAMlB"}
|
|
@@ -19,6 +19,9 @@ import { Service } from "../service.js";
|
|
|
19
19
|
import { httpError } from "../../utils/helpers.js";
|
|
20
20
|
import { sqliteAsyncJobs } from "../async-job/schema.js";
|
|
21
21
|
import { normalizeAIUsage } from "./helpers.js";
|
|
22
|
+
import { attach_resolved_reasoning, resolve_model_reasoning, } from "./reasoning.js";
|
|
23
|
+
import { AIModelRegistry } from "./model-registry.js";
|
|
24
|
+
import { resolve_text_routing_plan } from "./model-routing.js";
|
|
22
25
|
/** AIService 直接暴露的 SDK 通路模态列表。图片只通过 image/create + image/result 暴露。 */
|
|
23
26
|
const MODALITIES = ["text", "stream", "video", "tts", "asr"];
|
|
24
27
|
/** 用户侧默认以 text 模态排序模型 */
|
|
@@ -94,14 +97,6 @@ function readOptionalNumber(value) {
|
|
|
94
97
|
const parsed = Number(value);
|
|
95
98
|
return Number.isFinite(parsed) ? parsed : undefined;
|
|
96
99
|
}
|
|
97
|
-
/**
|
|
98
|
-
* 读取 part 的 MIME 类型。
|
|
99
|
-
*/
|
|
100
|
-
function readPartMediaType(part) {
|
|
101
|
-
return readOptionalString(part.mediaType)
|
|
102
|
-
?? readOptionalString(part.media_type)
|
|
103
|
-
?? "";
|
|
104
|
-
}
|
|
105
100
|
/**
|
|
106
101
|
* 读取正数配置。
|
|
107
102
|
*/
|
|
@@ -273,7 +268,7 @@ function isImageJobStatus(value) {
|
|
|
273
268
|
}
|
|
274
269
|
export class AIService extends Service {
|
|
275
270
|
/** 模型注册表 */
|
|
276
|
-
|
|
271
|
+
models = new AIModelRegistry();
|
|
277
272
|
/** SDK 通路 action 映射(modality → action) */
|
|
278
273
|
modalityActions = new Map();
|
|
279
274
|
/** AI 专用余额桥接。 */
|
|
@@ -314,25 +309,14 @@ export class AIService extends Service {
|
|
|
314
309
|
}
|
|
315
310
|
// ========== 模型注册 ==========
|
|
316
311
|
use(...inputs) {
|
|
317
|
-
|
|
318
|
-
for (const input of inputs) {
|
|
319
|
-
if (Array.isArray(input))
|
|
320
|
-
configs.push(...input);
|
|
321
|
-
else
|
|
322
|
-
configs.push(input);
|
|
323
|
-
}
|
|
324
|
-
for (const config of configs) {
|
|
325
|
-
if (this.modelMap.has(config.id))
|
|
326
|
-
throw new Error(`Duplicate model: ${config.id}`);
|
|
327
|
-
this.modelMap.set(config.id, config);
|
|
328
|
-
}
|
|
312
|
+
this.models.register(...inputs);
|
|
329
313
|
return this;
|
|
330
314
|
}
|
|
331
315
|
listModels() {
|
|
332
|
-
return
|
|
316
|
+
return this.models.list();
|
|
333
317
|
}
|
|
334
318
|
hasAction() {
|
|
335
|
-
return this.
|
|
319
|
+
return this.models.size > 0;
|
|
336
320
|
}
|
|
337
321
|
// ========== 模型匹配 ==========
|
|
338
322
|
resolve(query, env) {
|
|
@@ -340,10 +324,10 @@ export class AIService extends Service {
|
|
|
340
324
|
const isOpenAIMode = mode === "openai";
|
|
341
325
|
if (!modelId)
|
|
342
326
|
throw httpError(422, "model is required");
|
|
343
|
-
const model = this.
|
|
327
|
+
const model = this.models.get(modelId);
|
|
344
328
|
if (!model)
|
|
345
329
|
throw httpError(422, `Unknown model: ${modelId}`);
|
|
346
|
-
if (env && this.
|
|
330
|
+
if (env && this.models.get_missing_env(model, env).length > 0) {
|
|
347
331
|
throw httpError(422, `No available model: ${modelId}`);
|
|
348
332
|
}
|
|
349
333
|
const action = isOpenAIMode ? this.resolveOpenAIAction(model) : this.getAction(model, mode);
|
|
@@ -412,209 +396,27 @@ export class AIService extends Service {
|
|
|
412
396
|
modalities.push("openai");
|
|
413
397
|
return modalities.filter((mode) => mode !== "image_create" && mode !== "image_fetch" && mode !== "image_result");
|
|
414
398
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
:
|
|
419
|
-
?
|
|
420
|
-
:
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
}));
|
|
426
|
-
}
|
|
427
|
-
getMissingEnv(model, env) {
|
|
428
|
-
return this.getModelEnvRequirements(model)
|
|
429
|
-
.filter((item) => item.required && !env(item.key))
|
|
430
|
-
.map((item) => item.key);
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* 按请求媒体输入和模型级 fallback 规则决定实际执行模型。
|
|
434
|
-
*
|
|
435
|
-
* 关键说明(中文)
|
|
436
|
-
* - 这里只做路由,不改写请求体,避免 AIService 绑定具体上游协议。
|
|
437
|
-
* - UIMessage 只从 file part 提取媒体信息,具体如何分流交给 fallback.match。
|
|
438
|
-
* - OpenAI image_url / input_image 会归一为 image 媒体输入后进入同一套规则。
|
|
439
|
-
* - fallback 规则按数组顺序匹配,规则顺序高于请求里的 file 顺序。
|
|
440
|
-
* - 没有配置 fallback 时保持既有行为,由 Provider 自己决定如何处理。
|
|
441
|
-
*/
|
|
442
|
-
planTextExecution(resolved, ctx, mode) {
|
|
443
|
-
const model = resolved.model;
|
|
444
|
-
if (!model || !model.fallback?.length) {
|
|
445
|
-
return { resolved };
|
|
446
|
-
}
|
|
447
|
-
const media_inputs = this.extractMediaInputs(ctx.input, mode);
|
|
448
|
-
if (media_inputs.length === 0) {
|
|
449
|
-
return { resolved };
|
|
450
|
-
}
|
|
451
|
-
for (const rule of model.fallback ?? []) {
|
|
452
|
-
for (const media of media_inputs) {
|
|
453
|
-
const plan = this.resolveMediaFallbackPlan(model, rule, media, mode, ctx.env);
|
|
454
|
-
if (!plan)
|
|
455
|
-
continue;
|
|
456
|
-
return plan;
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
return { resolved };
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* 解析模型 fallback 引用。
|
|
463
|
-
*/
|
|
464
|
-
resolveFallbackModel(input) {
|
|
465
|
-
if (!input)
|
|
466
|
-
return undefined;
|
|
467
|
-
if (typeof input === "string")
|
|
468
|
-
return this.modelMap.get(input);
|
|
469
|
-
return this.modelMap.get(input.id) ?? input;
|
|
470
|
-
}
|
|
471
|
-
/**
|
|
472
|
-
* 根据一条规则和一个媒体输入解析 fallback 计划。
|
|
473
|
-
*/
|
|
474
|
-
resolveMediaFallbackPlan(model, rule, media, mode, env) {
|
|
475
|
-
if (!this.matchesFallbackRule(rule, media))
|
|
476
|
-
return undefined;
|
|
477
|
-
const fallback_model = this.resolveFallbackModel(rule.model);
|
|
478
|
-
if (!fallback_model || fallback_model.id === model.id)
|
|
479
|
-
return undefined;
|
|
480
|
-
const action = mode === "openai"
|
|
481
|
-
? this.resolveOpenAIAction(fallback_model)
|
|
482
|
-
: this.getAction(fallback_model, mode);
|
|
483
|
-
if (!action || this.getMissingEnv(fallback_model, env).length > 0)
|
|
484
|
-
return undefined;
|
|
485
|
-
return {
|
|
486
|
-
resolved: {
|
|
487
|
-
model: fallback_model,
|
|
488
|
-
action,
|
|
489
|
-
},
|
|
490
|
-
fallback_from: model.id,
|
|
491
|
-
fallback_reason: "input_requires_media",
|
|
492
|
-
fallback_media_type: media.media_type,
|
|
493
|
-
};
|
|
494
|
-
}
|
|
495
|
-
/**
|
|
496
|
-
* 安全执行 fallback 规则匹配。
|
|
497
|
-
*/
|
|
498
|
-
matchesFallbackRule(rule, media) {
|
|
499
|
-
try {
|
|
500
|
-
return rule.match(media);
|
|
501
|
-
}
|
|
502
|
-
catch {
|
|
503
|
-
return false;
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
/**
|
|
507
|
-
* 从当前请求中提取可参与 fallback 判断的媒体输入。
|
|
508
|
-
*/
|
|
509
|
-
extractMediaInputs(input, mode) {
|
|
510
|
-
if (!isRecord(input))
|
|
511
|
-
return [];
|
|
512
|
-
if (mode === "openai") {
|
|
513
|
-
return this.extractOpenAIMediaInputs(input.messages);
|
|
514
|
-
}
|
|
515
|
-
return this.extractUiMediaInputs(input.messages);
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* 扫描 OpenAI-compatible messages 的媒体输入。
|
|
519
|
-
*/
|
|
520
|
-
extractOpenAIMediaInputs(messages) {
|
|
521
|
-
if (!Array.isArray(messages))
|
|
522
|
-
return [];
|
|
523
|
-
const media_inputs = [];
|
|
524
|
-
for (const message of messages) {
|
|
525
|
-
if (!isRecord(message))
|
|
526
|
-
continue;
|
|
527
|
-
const content = message.content;
|
|
528
|
-
if (!Array.isArray(content))
|
|
529
|
-
continue;
|
|
530
|
-
for (const part of content) {
|
|
531
|
-
const media = this.readOpenAIMediaPart(part);
|
|
532
|
-
if (media)
|
|
533
|
-
media_inputs.push(media);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
return media_inputs;
|
|
537
|
-
}
|
|
538
|
-
/**
|
|
539
|
-
* 读取 OpenAI-compatible content part 的媒体输入。
|
|
540
|
-
*/
|
|
541
|
-
readOpenAIMediaPart(part) {
|
|
542
|
-
if (!isRecord(part))
|
|
543
|
-
return undefined;
|
|
544
|
-
const type = readOptionalString(part.type);
|
|
545
|
-
if (type === "image_url" || type === "input_image") {
|
|
546
|
-
return this.buildFallbackMedia("image/*", {
|
|
547
|
-
url: this.readOpenAIImageUrl(part),
|
|
548
|
-
});
|
|
549
|
-
}
|
|
550
|
-
if (type !== "file")
|
|
551
|
-
return undefined;
|
|
552
|
-
const media_type = readPartMediaType(part);
|
|
553
|
-
if (!media_type)
|
|
554
|
-
return undefined;
|
|
555
|
-
return this.buildFallbackMedia(media_type, {
|
|
556
|
-
filename: readFilePartFilename(part),
|
|
557
|
-
url: readOptionalString(part.url),
|
|
399
|
+
/** 按媒体输入解析最终模型,推理强度必须在该步骤之后解析。 */
|
|
400
|
+
plan_text_execution(resolved, ctx, mode) {
|
|
401
|
+
return resolve_text_routing_plan(resolved, ctx.input, mode, {
|
|
402
|
+
resolve_model: (input) => typeof input === "string"
|
|
403
|
+
? this.models.get(input)
|
|
404
|
+
: this.models.get(input.id) ?? input,
|
|
405
|
+
resolve_action: (model, target_mode) => target_mode === "openai"
|
|
406
|
+
? this.resolveOpenAIAction(model)
|
|
407
|
+
: this.getAction(model, target_mode),
|
|
408
|
+
is_available: (model) => this.models.get_missing_env(model, ctx.env).length === 0,
|
|
558
409
|
});
|
|
559
410
|
}
|
|
560
|
-
/**
|
|
561
|
-
* 读取 OpenAI-compatible 图片 URL。
|
|
562
|
-
*/
|
|
563
|
-
readOpenAIImageUrl(part) {
|
|
564
|
-
const direct_url = readOptionalString(part.url);
|
|
565
|
-
if (direct_url)
|
|
566
|
-
return direct_url;
|
|
567
|
-
if (!isRecord(part.image_url))
|
|
568
|
-
return undefined;
|
|
569
|
-
return readOptionalString(part.image_url.url);
|
|
570
|
-
}
|
|
571
|
-
/**
|
|
572
|
-
* 扫描 UIMessage messages 的 file 媒体输入。
|
|
573
|
-
*/
|
|
574
|
-
extractUiMediaInputs(messages) {
|
|
575
|
-
if (!Array.isArray(messages))
|
|
576
|
-
return [];
|
|
577
|
-
const media_inputs = [];
|
|
578
|
-
for (const message of messages) {
|
|
579
|
-
if (!isRecord(message) || !Array.isArray(message.parts))
|
|
580
|
-
continue;
|
|
581
|
-
for (const part of message.parts) {
|
|
582
|
-
const media = this.readUiFilePart(part);
|
|
583
|
-
if (media)
|
|
584
|
-
media_inputs.push(media);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
return media_inputs;
|
|
588
|
-
}
|
|
589
|
-
/**
|
|
590
|
-
* 读取 UIMessage file part 的媒体输入。
|
|
591
|
-
*/
|
|
592
|
-
readUiFilePart(part) {
|
|
593
|
-
if (!isRecord(part) || part.type !== "file")
|
|
594
|
-
return undefined;
|
|
595
|
-
const media_type = readPartMediaType(part);
|
|
596
|
-
if (!media_type)
|
|
597
|
-
return undefined;
|
|
598
|
-
return this.buildFallbackMedia(media_type, {
|
|
599
|
-
filename: readFilePartFilename(part),
|
|
600
|
-
url: readOptionalString(part.url),
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
/**
|
|
604
|
-
* 构造 fallback 媒体输入,避免可选字段写入 undefined。
|
|
605
|
-
*/
|
|
606
|
-
buildFallbackMedia(media_type, optional) {
|
|
607
|
-
return {
|
|
608
|
-
media_type,
|
|
609
|
-
...(optional.filename ? { filename: optional.filename } : {}),
|
|
610
|
-
...(optional.url ? { url: optional.url } : {}),
|
|
611
|
-
};
|
|
612
|
-
}
|
|
613
411
|
// ========== SDK 通路 ==========
|
|
614
412
|
async handleModality(modality, ctx) {
|
|
615
413
|
const initial_resolved = this.resolve({ model: this.normalizeModelId(ctx.input.model), mode: modality }, ctx.env);
|
|
616
|
-
const { resolved, fallback_from, fallback_reason, fallback_media_type } = this.
|
|
414
|
+
const { resolved, fallback_from, fallback_reason, fallback_media_type } = this.plan_text_execution(initial_resolved, ctx, modality);
|
|
415
|
+
const reasoning = resolved.model && (modality === "text" || modality === "stream")
|
|
416
|
+
? resolve_model_reasoning(resolved.model, ctx.input)
|
|
417
|
+
: undefined;
|
|
617
418
|
this.attachResolvedModel(ctx, resolved.model, modality, { fallback_from, fallback_reason, fallback_media_type });
|
|
419
|
+
attach_resolved_reasoning(ctx, reasoning);
|
|
618
420
|
const started_at = Date.now();
|
|
619
421
|
try {
|
|
620
422
|
const provider_output = await resolved.action(ctx);
|
|
@@ -675,7 +477,7 @@ export class AIService extends Service {
|
|
|
675
477
|
const model_id = job.model_id ?? readOptionalString(ctx.input.model);
|
|
676
478
|
if (!model_id)
|
|
677
479
|
throw httpError(422, "Image job is missing model_id");
|
|
678
|
-
const model = this.
|
|
480
|
+
const model = this.models.get(model_id);
|
|
679
481
|
if (!model?.actions.image_fetch) {
|
|
680
482
|
throw httpError(422, `No image_fetch action for model: ${model_id}`);
|
|
681
483
|
}
|
|
@@ -906,9 +708,13 @@ export class AIService extends Service {
|
|
|
906
708
|
const body = ctx.input;
|
|
907
709
|
const modelId = this.normalizeModelId(body.model);
|
|
908
710
|
const initial_resolved = this.resolve({ model: modelId, mode: "openai" }, ctx.env);
|
|
909
|
-
const { resolved, fallback_from, fallback_reason, fallback_media_type } = this.
|
|
711
|
+
const { resolved, fallback_from, fallback_reason, fallback_media_type } = this.plan_text_execution(initial_resolved, ctx, "openai");
|
|
712
|
+
const reasoning = resolved.model
|
|
713
|
+
? resolve_model_reasoning(resolved.model, body)
|
|
714
|
+
: undefined;
|
|
910
715
|
this.attachResolvedModel(ctx, resolved.model, "openai", { fallback_from, fallback_reason, fallback_media_type });
|
|
911
716
|
ctx.input = body;
|
|
717
|
+
attach_resolved_reasoning(ctx, reasoning);
|
|
912
718
|
const started_at = Date.now();
|
|
913
719
|
try {
|
|
914
720
|
const output = await resolved.action(ctx);
|
|
@@ -1056,27 +862,10 @@ export class AIService extends Service {
|
|
|
1056
862
|
}
|
|
1057
863
|
// ========== 模型列表 ==========
|
|
1058
864
|
static listModels(aiService, options) {
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
: [...aiService.modelMap.values()].filter((config) => aiService.getMissingEnv(config, env).length === 0);
|
|
1064
|
-
return items.map((config) => aiService.toPublicModel(config, includeAdminFields));
|
|
1065
|
-
}
|
|
1066
|
-
toPublicModel(config, includeAdminFields = false) {
|
|
1067
|
-
return {
|
|
1068
|
-
id: config.id,
|
|
1069
|
-
name: config.name,
|
|
1070
|
-
description: config.description ?? "",
|
|
1071
|
-
modalities: this.getModelModalities(config),
|
|
1072
|
-
tags: config.tags ?? [],
|
|
1073
|
-
meta: config.meta ?? {},
|
|
1074
|
-
...(includeAdminFields
|
|
1075
|
-
? {
|
|
1076
|
-
env_requirements: this.getModelEnvRequirements(config),
|
|
1077
|
-
}
|
|
1078
|
-
: {}),
|
|
1079
|
-
};
|
|
865
|
+
return aiService.models.list_public({
|
|
866
|
+
...options,
|
|
867
|
+
get_modalities: (model) => aiService.getModelModalities(model),
|
|
868
|
+
});
|
|
1080
869
|
}
|
|
1081
870
|
}
|
|
1082
871
|
//# sourceMappingURL=ai-service.js.map
|