@visiblebase/core 0.2.0 → 0.2.3

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 (57) hide show
  1. package/README.md +12 -11
  2. package/bin/core/auth/authenticator.d.ts +17 -6
  3. package/bin/core/auth/authenticator.d.ts.map +1 -1
  4. package/bin/core/auth/authenticator.js +49 -30
  5. package/bin/core/auth/authenticator.js.map +1 -1
  6. package/bin/core/base/base.d.ts +11 -40
  7. package/bin/core/base/base.d.ts.map +1 -1
  8. package/bin/core/base/base.js +146 -102
  9. package/bin/core/base/base.js.map +1 -1
  10. package/bin/core/runtime.d.ts +10 -0
  11. package/bin/core/runtime.d.ts.map +1 -1
  12. package/bin/index.d.ts +5 -14
  13. package/bin/index.d.ts.map +1 -1
  14. package/bin/index.js +5 -14
  15. package/bin/index.js.map +1 -1
  16. package/bin/service/action.d.ts +44 -0
  17. package/bin/service/action.d.ts.map +1 -0
  18. package/bin/service/action.js +48 -0
  19. package/bin/service/action.js.map +1 -0
  20. package/bin/service/ai/ai-service.d.ts +36 -60
  21. package/bin/service/ai/ai-service.d.ts.map +1 -1
  22. package/bin/service/ai/ai-service.js +194 -120
  23. package/bin/service/ai/ai-service.js.map +1 -1
  24. package/bin/service/ai/provider.d.ts +24 -58
  25. package/bin/service/ai/provider.d.ts.map +1 -1
  26. package/bin/service/ai/provider.js +20 -41
  27. package/bin/service/ai/provider.js.map +1 -1
  28. package/bin/service/ai/types.d.ts +57 -35
  29. package/bin/service/ai/types.d.ts.map +1 -1
  30. package/bin/service/ai/types.js +1 -1
  31. package/bin/service/env/env-service.d.ts +0 -4
  32. package/bin/service/env/env-service.d.ts.map +1 -1
  33. package/bin/service/env/env-service.js +15 -25
  34. package/bin/service/env/env-service.js.map +1 -1
  35. package/bin/service/hook.d.ts +8 -5
  36. package/bin/service/hook.d.ts.map +1 -1
  37. package/bin/service/hook.js +11 -14
  38. package/bin/service/hook.js.map +1 -1
  39. package/bin/service/plugin.d.ts +20 -96
  40. package/bin/service/plugin.d.ts.map +1 -1
  41. package/bin/service/plugin.js +24 -61
  42. package/bin/service/plugin.js.map +1 -1
  43. package/bin/service/products/products-service.d.ts +0 -5
  44. package/bin/service/products/products-service.d.ts.map +1 -1
  45. package/bin/service/products/products-service.js +19 -25
  46. package/bin/service/products/products-service.js.map +1 -1
  47. package/bin/service/service.d.ts +76 -65
  48. package/bin/service/service.d.ts.map +1 -1
  49. package/bin/service/service.js +47 -80
  50. package/bin/service/service.js.map +1 -1
  51. package/bin/service/types.d.ts +2 -8
  52. package/bin/service/types.d.ts.map +1 -1
  53. package/bin/store/db.d.ts +5 -4
  54. package/bin/store/db.d.ts.map +1 -1
  55. package/bin/store/db.js +3 -2
  56. package/bin/store/db.js.map +1 -1
  57. package/package.json +8 -9
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Action 模块。
3
+ *
4
+ * Action 是 Service 的一等能力单元。
5
+ * 每个 Action 有独立的 hook(before/after/onError),可独立被 client 调用。
6
+ *
7
+ * 使用方式:
8
+ * ```ts
9
+ * const zh2en = translateService.action("zh2en", async (ctx) => {
10
+ * return await translate(ctx.input.text, "zh", "en");
11
+ * });
12
+ * zh2en.before(checkBalance).after(deductFee);
13
+ * ```
14
+ */
15
+ import { Hook } from "./hook.js";
16
+ /** Action 实例 */
17
+ export class Action {
18
+ /** Action 唯一 ID */
19
+ id;
20
+ /** Action 独立的 hook(before/after/onError) */
21
+ hook = new Hook();
22
+ /** 业务逻辑 */
23
+ _run;
24
+ constructor(id, fn) {
25
+ this.id = id;
26
+ this._run = fn;
27
+ }
28
+ /** 注册 before hook */
29
+ before(fn) {
30
+ this.hook.before(fn);
31
+ return this;
32
+ }
33
+ /** 注册 after hook */
34
+ after(fn) {
35
+ this.hook.after(fn);
36
+ return this;
37
+ }
38
+ /** 注册 onError hook */
39
+ onError(fn) {
40
+ this.hook.onError(fn);
41
+ return this;
42
+ }
43
+ /** 执行业务逻辑 */
44
+ async run(ctx) {
45
+ return this._run(ctx);
46
+ }
47
+ }
48
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/service/action.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,gBAAgB;AAChB,MAAM,OAAO,MAAM;IACjB,mBAAmB;IACV,EAAE,CAAS;IACpB,4CAA4C;IACnC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IAE3B,WAAW;IACM,IAAI,CAAW;IAEhC,YAAY,EAAU,EAAE,EAAY;QAClC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,qBAAqB;IACrB,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,EAAU;QACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,EAAU;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa;IACb,KAAK,CAAC,GAAG,CAAC,GAAY;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;CACF"}
@@ -1,80 +1,56 @@
1
1
  /**
2
2
  * AI Service 模块。
3
3
  *
4
- * 一个 AIService 处理所有 AI 模态(text/stream/image/video/tts/asr)。
5
- * 通过 use() 注册模型,通过 resolve() 匹配模型和 handler
4
+ * AIService 处理所有 AI 通路(SDK 通路 + OpenAI 兼容通路)。
5
+ * 通过 action() 注册 modality action,通过 resolve() 匹配模型和 action
6
6
  *
7
- * 路由:
8
- * - POST /text — 文本生成
9
- * - POST /stream — 流式生成
10
- * - POST /image 图片生成
11
- * - POST /video 视频生成
12
- * - POST /tts 语音合成
13
- * - POST /asr 语音识别
14
- * - GET /models 模型列表
7
+ * 鉴权由 Base 在路由入口统一强制执行。
8
+ *
9
+ * 路由(Base 自动生成):
10
+ * - POST /v1/ai/text 文本生成
11
+ * - POST /v1/ai/stream 流式生成
12
+ * - POST /v1/ai/image 图片生成
13
+ * - POST /v1/ai/video 视频生成
14
+ * - POST /v1/ai/chat/completions OpenAI 兼容端点
15
+ * - GET /v1/ai/models — 模型列表
15
16
  */
16
17
  import { Service } from "../service.js";
17
- import type { ServiceHandler } from "../types.js";
18
+ import type { ActionFn } from "../action.js";
18
19
  import type { ModelConfig, PublicModel } from "./types.js";
19
- /**
20
- * AI 模型服务。
21
- *
22
- * 继承 Service,构造时自动注册所有模态子路由和模型列表路由。
23
- *
24
- * 使用方式:
25
- * ```ts
26
- * const ai = new AIService();
27
- * ai.use(provider.model({ id: "gpt-4o", name: "GPT-4o" }));
28
- * base.use(ai);
29
- * ```
30
- */
20
+ type EnvReader = (key: string) => string | undefined;
31
21
  export declare class AIService extends Service {
32
- /**
33
- * 模型注册表,key 为 model id。
34
- */
22
+ /** 模型注册表 */
35
23
  private modelMap;
24
+ /** SDK 通路 action 映射(modality → action) */
25
+ private modalityActions;
36
26
  constructor();
37
- /**
38
- * 注册一个或多个模型配置。
39
- *
40
- * 支持三种调用形式:
41
- * - `use(modelConfig)` — 单个
42
- * - `use([config1, config2])` — 数组
43
- * - `use(config1, config2)` — 展开参数
44
- */
45
27
  use(...inputs: (ModelConfig | ModelConfig[])[]): this;
46
- /**
47
- * 返回所有已注册的模型配置。
48
- */
49
28
  listModels(): ModelConfig[];
50
- /**
51
- * 是否有已注册的 handler。
52
- */
53
- hasHandler(): boolean;
54
- /**
55
- * 根据查询参数匹配模型和对应的 handler。
56
- *
57
- * 匹配优先级:
58
- * 1. 指定 model → 精确匹配 modelMap
59
- * 2. 未指定 model → 该 mode 的默认模型
60
- * 3. 都没有 → 第一个注册的模型(兜底)
61
- */
29
+ hasAction(): boolean;
62
30
  resolve(query: {
63
31
  model?: string;
64
32
  mode?: string;
65
- }): {
33
+ }, env?: EnvReader): {
66
34
  model?: ModelConfig;
67
- handler: ServiceHandler;
35
+ action: ActionFn;
68
36
  };
69
- private getHandler;
70
- private findDefaultForMode;
71
- /**
72
- * 处理单个模态的 HTTP 请求。
73
- */
37
+ private getAction;
38
+ private resolveOpenAIAction;
39
+ private createAutoPassthroughAction;
40
+ private listCandidateModels;
41
+ private compareModelPriority;
42
+ private getDefaultScore;
43
+ private getDefaultModes;
44
+ private getModelModalities;
45
+ private getModelEnvRequirements;
46
+ private getMissingEnv;
74
47
  private handleModality;
75
- /**
76
- * AIService 实例中聚合公开模型列表。
77
- */
78
- static listModels(aiService: AIService): PublicModel[];
48
+ private handleChatCompletions;
49
+ static listModels(aiService: AIService, options: {
50
+ env: EnvReader;
51
+ identity: "guest" | "user" | "admin";
52
+ }): PublicModel[];
53
+ private toPublicModel;
79
54
  }
55
+ export {};
80
56
  //# 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;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAgB,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EACV,WAAW,EAEX,WAAW,EACZ,MAAM,YAAY,CAAC;AAQpB;;;;;;;;;;;GAWG;AACH,qBAAa,SAAU,SAAQ,OAAO;IACpC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAkC;;IAmBlD;;;;;;;OAOG;IACH,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,IAAI;IAqBrD;;OAEG;IACH,UAAU,IAAI,WAAW,EAAE;IAI3B;;OAEG;IACH,UAAU,IAAI,OAAO;IAMrB;;;;;;;OAOG;IACH,OAAO,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,CAAC,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE;IA2BnG,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;YACW,cAAc;IAiC5B;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,EAAE;CAgBvD"}
1
+ {"version":3,"file":"ai-service.d.ts","sourceRoot":"","sources":["../../../src/service/ai/ai-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAgB,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAEV,WAAW,EAEX,WAAW,EACZ,MAAM,YAAY,CAAC;AAQpB,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AASrD,qBAAa,SAAU,SAAQ,OAAO;IACpC,YAAY;IACZ,OAAO,CAAC,QAAQ,CAAkC;IAElD,0CAA0C;IAC1C,OAAO,CAAC,eAAe,CAA+B;;IAwBtD,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,IAAI;IAarD,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;IA2B7G,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,2BAA2B;IAmCnC,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,aAAa;YAQP,cAAc;YAiBd,qBAAqB;IAmBnC,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;IAYjB,OAAO,CAAC,aAAa;CAgBtB"}
@@ -1,184 +1,258 @@
1
1
  /**
2
2
  * AI Service 模块。
3
3
  *
4
- * 一个 AIService 处理所有 AI 模态(text/stream/image/video/tts/asr)。
5
- * 通过 use() 注册模型,通过 resolve() 匹配模型和 handler
4
+ * AIService 处理所有 AI 通路(SDK 通路 + OpenAI 兼容通路)。
5
+ * 通过 action() 注册 modality action,通过 resolve() 匹配模型和 action
6
6
  *
7
- * 路由:
8
- * - POST /text — 文本生成
9
- * - POST /stream — 流式生成
10
- * - POST /image 图片生成
11
- * - POST /video 视频生成
12
- * - POST /tts 语音合成
13
- * - POST /asr 语音识别
14
- * - GET /models 模型列表
7
+ * 鉴权由 Base 在路由入口统一强制执行。
8
+ *
9
+ * 路由(Base 自动生成):
10
+ * - POST /v1/ai/text 文本生成
11
+ * - POST /v1/ai/stream 流式生成
12
+ * - POST /v1/ai/image 图片生成
13
+ * - POST /v1/ai/video 视频生成
14
+ * - POST /v1/ai/chat/completions OpenAI 兼容端点
15
+ * - GET /v1/ai/models — 模型列表
15
16
  */
16
17
  import { Service } from "../service.js";
17
18
  import { httpError } from "../../utils/helpers.js";
18
- /** AIService 支持的模态列表 */
19
+ /** AIService 支持的 SDK 通路模态列表 */
19
20
  const MODALITIES = ["text", "stream", "image", "video", "tts", "asr"];
21
+ /** 用户侧默认以 text 模态排序模型 */
22
+ const DEFAULT_MODEL_MODE = "text";
20
23
  /**
21
- * AI 模型服务。
22
- *
23
- * 继承 Service,构造时自动注册所有模态子路由和模型列表路由。
24
- *
25
- * 使用方式:
26
- * ```ts
27
- * const ai = new AIService();
28
- * ai.use(provider.model({ id: "gpt-4o", name: "GPT-4o" }));
29
- * base.use(ai);
30
- * ```
24
+ * 判断一个值是否为 HTTP Response。
31
25
  */
26
+ function isResponse(value) {
27
+ return typeof value === "object" && value !== null && "status" in value && "headers" in value;
28
+ }
32
29
  export class AIService extends Service {
33
- /**
34
- * 模型注册表,key 为 model id。
35
- */
30
+ /** 模型注册表 */
36
31
  modelMap = new Map();
32
+ /** SDK 通路 action 映射(modality → action) */
33
+ modalityActions = new Map();
37
34
  constructor() {
38
35
  super({ id: "ai", name: "AI" });
39
- // 为每个模态注册 POST 子路由
36
+ // 为每个 modality 注册 routing action
40
37
  for (const modality of MODALITIES) {
41
- this.post(`/${modality}`, (ctx) => this.handleModality(modality, ctx));
38
+ this.action(modality, async (ctx) => this.handleModality(modality, ctx));
42
39
  }
43
- // 模型列表
44
- this.get("/models", () => ({ items: AIService.listModels(this) }));
40
+ // OpenAI 兼容端点
41
+ this.action("chat/completions", async (ctx) => this.handleChatCompletions(ctx));
42
+ // 模型列表走同一路径,根据身份决定可见范围。
43
+ this.action("models", (ctx) => ({
44
+ items: AIService.listModels(this, {
45
+ env: ctx.env,
46
+ identity: ctx.identity?.kind ?? "guest",
47
+ }),
48
+ }), { method: "GET", auth: ["user", "admin"] });
45
49
  }
46
50
  // ========== 模型注册 ==========
47
- /**
48
- * 注册一个或多个模型配置。
49
- *
50
- * 支持三种调用形式:
51
- * - `use(modelConfig)` — 单个
52
- * - `use([config1, config2])` — 数组
53
- * - `use(config1, config2)` — 展开参数
54
- */
55
51
  use(...inputs) {
56
52
  const configs = [];
57
53
  for (const input of inputs) {
58
- if (Array.isArray(input)) {
54
+ if (Array.isArray(input))
59
55
  configs.push(...input);
60
- }
61
- else {
56
+ else
62
57
  configs.push(input);
63
- }
64
58
  }
65
59
  for (const config of configs) {
66
- if (this.modelMap.has(config.id)) {
60
+ if (this.modelMap.has(config.id))
67
61
  throw new Error(`Duplicate model: ${config.id}`);
68
- }
69
62
  this.modelMap.set(config.id, config);
70
63
  }
71
64
  return this;
72
65
  }
73
- /**
74
- * 返回所有已注册的模型配置。
75
- */
76
66
  listModels() {
77
67
  return [...this.modelMap.values()];
78
68
  }
79
- /**
80
- * 是否有已注册的 handler。
81
- */
82
- hasHandler() {
69
+ hasAction() {
83
70
  return this.modelMap.size > 0;
84
71
  }
85
72
  // ========== 模型匹配 ==========
86
- /**
87
- * 根据查询参数匹配模型和对应的 handler。
88
- *
89
- * 匹配优先级:
90
- * 1. 指定 model → 精确匹配 modelMap
91
- * 2. 未指定 model → 该 mode 的默认模型
92
- * 3. 都没有 → 第一个注册的模型(兜底)
93
- */
94
- resolve(query) {
73
+ resolve(query, env) {
95
74
  const { model: modelId, mode } = query;
75
+ const isOpenAIMode = mode === "openai";
96
76
  if (modelId) {
97
77
  const model = this.modelMap.get(modelId);
98
78
  if (!model)
99
79
  throw httpError(422, `Unknown model: ${modelId}`);
100
- const handler = this.getHandler(model, mode);
101
- if (!handler)
80
+ const action = isOpenAIMode ? this.resolveOpenAIAction(model) : this.getAction(model, mode);
81
+ if (!action)
102
82
  throw httpError(422, `Model ${modelId} does not support mode: ${mode ?? "text"}`);
103
- return { model, handler };
83
+ return { model, action };
104
84
  }
105
- const defaultModel = this.findDefaultForMode(mode);
85
+ const candidates = this.listCandidateModels(mode, env);
86
+ const defaultModel = candidates[0];
106
87
  if (defaultModel) {
107
- const handler = this.getHandler(defaultModel, mode);
108
- if (handler)
109
- return { model: defaultModel, handler };
88
+ const action = isOpenAIMode ? this.resolveOpenAIAction(defaultModel) : this.getAction(defaultModel, mode);
89
+ if (action)
90
+ return { model: defaultModel, action };
110
91
  }
111
- const first = this.modelMap.values().next().value;
112
- if (first) {
113
- const handler = this.getHandler(first, mode);
114
- if (handler)
115
- return { model: first, handler };
116
- throw httpError(422, `No handler for mode: ${mode ?? "text"}`);
92
+ if (this.modelMap.size > 0) {
93
+ if (env)
94
+ throw httpError(422, `No available model for mode: ${mode ?? DEFAULT_MODEL_MODE}`);
95
+ throw httpError(422, `No action for mode: ${mode ?? DEFAULT_MODEL_MODE}`);
117
96
  }
118
97
  throw httpError(422, `No model registered`);
119
98
  }
120
- getHandler(model, mode) {
121
- return model.handle[(mode ?? "text")];
99
+ getAction(model, mode) {
100
+ return model.actions[(mode ?? "text")];
122
101
  }
123
- findDefaultForMode(mode) {
124
- const m = mode ?? "text";
125
- for (const model of this.modelMap.values()) {
126
- if (model.default === true)
127
- return model;
128
- if (Array.isArray(model.default) && model.default.includes(m))
129
- return model;
130
- }
102
+ resolveOpenAIAction(model) {
103
+ if (model.actions.openai)
104
+ return model.actions.openai;
105
+ if (model.baseURL && model.envKey)
106
+ return this.createAutoPassthroughAction(model);
131
107
  return undefined;
132
108
  }
133
- // ========== 请求处理 ==========
134
- /**
135
- * 处理单个模态的 HTTP 请求。
136
- */
137
- async handleModality(modality, ctx) {
138
- const resolved = this.resolve({
139
- model: ctx.input.model,
140
- mode: modality,
141
- });
142
- // 构建 model handler Context(注入 model 信息)
143
- const aiCtx = {
144
- ...ctx,
145
- model: resolved.model ? { id: resolved.model.id, name: resolved.model.name } : undefined,
109
+ createAutoPassthroughAction(model) {
110
+ const baseURL = model.baseURL;
111
+ const envKey = model.envKey;
112
+ const passthroughModel = model.passthroughModel;
113
+ return async (ctx) => {
114
+ const apiKey = ctx.env(envKey);
115
+ if (!apiKey) {
116
+ return new Response(JSON.stringify({
117
+ error: { message: `${envKey} is required`, type: "authentication_error" },
118
+ }), { status: 401, headers: { "content-type": "application/json" } });
119
+ }
120
+ const body = { ...ctx.input };
121
+ if (passthroughModel) {
122
+ body.model = passthroughModel;
123
+ }
124
+ const response = await fetch(`${baseURL}/chat/completions`, {
125
+ method: "POST",
126
+ headers: {
127
+ "Authorization": `Bearer ${apiKey}`,
128
+ "Content-Type": "application/json",
129
+ },
130
+ body: JSON.stringify(body),
131
+ });
132
+ return new Response(response.body, {
133
+ status: response.status,
134
+ statusText: response.statusText,
135
+ headers: response.headers,
136
+ });
146
137
  };
138
+ }
139
+ listCandidateModels(mode, env) {
140
+ const candidates = [...this.modelMap.values()].filter((model) => {
141
+ const action = mode === "openai" ? this.resolveOpenAIAction(model) : this.getAction(model, mode);
142
+ return Boolean(action);
143
+ });
144
+ const readyCandidates = env
145
+ ? candidates.filter((model) => this.getMissingEnv(model, env).length === 0)
146
+ : candidates;
147
+ return readyCandidates.sort((a, b) => this.compareModelPriority(a, b, mode ?? DEFAULT_MODEL_MODE));
148
+ }
149
+ compareModelPriority(a, b, mode) {
150
+ const scoreDiff = this.getDefaultScore(b, mode) - this.getDefaultScore(a, mode);
151
+ if (scoreDiff !== 0)
152
+ return scoreDiff;
153
+ return 0;
154
+ }
155
+ getDefaultScore(model, mode) {
156
+ const defaultModes = this.getDefaultModes(model);
157
+ if (defaultModes.includes(mode))
158
+ return 3;
159
+ if (defaultModes.includes(DEFAULT_MODEL_MODE))
160
+ return 2;
161
+ if (defaultModes.length > 0)
162
+ return 1;
163
+ return 0;
164
+ }
165
+ getDefaultModes(model) {
166
+ const modalities = this.getModelModalities(model);
167
+ if (model.default === true)
168
+ return modalities;
169
+ if (Array.isArray(model.default))
170
+ return model.default.filter((mode) => modalities.includes(mode));
171
+ return [];
172
+ }
173
+ getModelModalities(model) {
174
+ const modalities = Object.keys(model.actions).filter((key) => model.actions[key] !== undefined);
175
+ if (!modalities.includes("openai") && this.resolveOpenAIAction(model))
176
+ modalities.push("openai");
177
+ return modalities;
178
+ }
179
+ getModelEnvRequirements(model) {
180
+ const requirements = model.env
181
+ ? Object.entries(model.env)
182
+ : model.envKey
183
+ ? [[model.envKey, `${model.id} API Key`]]
184
+ : [];
185
+ return requirements.map(([key, description]) => ({
186
+ key,
187
+ description,
188
+ required: true,
189
+ }));
190
+ }
191
+ getMissingEnv(model, env) {
192
+ return this.getModelEnvRequirements(model)
193
+ .filter((item) => item.required && !env(item.key))
194
+ .map((item) => item.key);
195
+ }
196
+ // ========== SDK 通路 ==========
197
+ async handleModality(modality, ctx) {
198
+ const resolved = this.resolve({ model: ctx.input.model, mode: modality }, ctx.env);
199
+ const aiCtx = { ...ctx, variant: resolved.model ? { id: resolved.model.id, name: resolved.model.name, meta: resolved.model.meta } : undefined };
147
200
  try {
148
- const beforeCtx = await this.hook.runBefore(aiCtx);
149
- const output = await resolved.handler(beforeCtx);
150
- await this.hook.runAfter(beforeCtx);
151
- if (output instanceof Response)
201
+ const output = await resolved.action(aiCtx);
202
+ if (isResponse(output))
152
203
  return output;
153
204
  return output;
154
205
  }
155
206
  catch (error) {
156
- await this.hook.runOnError(aiCtx);
157
207
  const message = error instanceof Error ? error.message : String(error);
158
208
  const status = error.statusCode ?? 500;
159
- return new Response(JSON.stringify({ error: message }), {
160
- status,
161
- headers: { "content-type": "application/json" },
162
- });
209
+ return new Response(JSON.stringify({ error: message }), { status, headers: { "content-type": "application/json" } });
163
210
  }
164
211
  }
165
- // ========== 静态:模型列表聚合 ==========
166
- /**
167
- * AIService 实例中聚合公开模型列表。
168
- */
169
- static listModels(aiService) {
170
- return [...aiService.modelMap.values()].map((config) => {
171
- const modalities = Object.keys(config.handle).filter((k) => config.handle[k] !== undefined);
172
- return {
173
- id: config.id,
174
- name: config.name,
175
- description: config.description ?? "",
176
- modalities,
177
- tags: config.tags ?? [],
178
- meta: config.meta ?? {},
179
- env: config.env ?? {},
180
- };
181
- });
212
+ // ========== OpenAI 兼容通路 ==========
213
+ async handleChatCompletions(ctx) {
214
+ const body = ctx.input;
215
+ const modelId = body.model;
216
+ const resolved = this.resolve({ model: modelId, mode: "openai" }, ctx.env);
217
+ const aiCtx = { ...ctx, input: body, variant: resolved.model ? { id: resolved.model.id, name: resolved.model.name, meta: resolved.model.meta } : undefined };
218
+ try {
219
+ const output = await resolved.action(aiCtx);
220
+ if (isResponse(output))
221
+ return output;
222
+ return new Response(JSON.stringify(output), { status: 200, headers: { "content-type": "application/json" } });
223
+ }
224
+ catch (error) {
225
+ const message = error instanceof Error ? error.message : String(error);
226
+ const status = error.statusCode ?? 500;
227
+ return new Response(JSON.stringify({ error: { message, type: "server_error" } }), { status, headers: { "content-type": "application/json" } });
228
+ }
229
+ }
230
+ // ========== 模型列表 ==========
231
+ static listModels(aiService, options) {
232
+ const { env, identity } = options;
233
+ const includeAdminFields = identity === "admin";
234
+ const items = identity === "admin"
235
+ ? [...aiService.modelMap.values()]
236
+ : [...aiService.modelMap.values()].filter((config) => aiService.getMissingEnv(config, env).length === 0);
237
+ return items
238
+ .sort((a, b) => aiService.compareModelPriority(a, b, DEFAULT_MODEL_MODE))
239
+ .map((config) => aiService.toPublicModel(config, includeAdminFields));
240
+ }
241
+ toPublicModel(config, includeAdminFields = false) {
242
+ return {
243
+ id: config.id,
244
+ name: config.name,
245
+ description: config.description ?? "",
246
+ modalities: this.getModelModalities(config),
247
+ tags: config.tags ?? [],
248
+ meta: config.meta ?? {},
249
+ ...(includeAdminFields
250
+ ? {
251
+ env_requirements: this.getModelEnvRequirements(config),
252
+ default_modes: this.getDefaultModes(config),
253
+ }
254
+ : {}),
255
+ };
182
256
  }
183
257
  }
184
258
  //# sourceMappingURL=ai-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-service.js","sourceRoot":"","sources":["../../../src/service/ai/ai-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-service.js","sourceRoot":"","sources":["../../../src/service/ai/ai-service.ts"],"names":[],"mappings":"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"}