@visiblebase/core 0.2.0

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 (110) hide show
  1. package/README.md +127 -0
  2. package/bin/core/auth/authenticator.d.ts +68 -0
  3. package/bin/core/auth/authenticator.d.ts.map +1 -0
  4. package/bin/core/auth/authenticator.js +106 -0
  5. package/bin/core/auth/authenticator.js.map +1 -0
  6. package/bin/core/auth/token-signer.d.ts +27 -0
  7. package/bin/core/auth/token-signer.d.ts.map +1 -0
  8. package/bin/core/auth/token-signer.js +116 -0
  9. package/bin/core/auth/token-signer.js.map +1 -0
  10. package/bin/core/auth/types.d.ts +94 -0
  11. package/bin/core/auth/types.d.ts.map +1 -0
  12. package/bin/core/auth/types.js +7 -0
  13. package/bin/core/auth/types.js.map +1 -0
  14. package/bin/core/base/base.d.ts +98 -0
  15. package/bin/core/base/base.d.ts.map +1 -0
  16. package/bin/core/base/base.js +281 -0
  17. package/bin/core/base/base.js.map +1 -0
  18. package/bin/core/runtime.d.ts +112 -0
  19. package/bin/core/runtime.d.ts.map +1 -0
  20. package/bin/core/runtime.js +19 -0
  21. package/bin/core/runtime.js.map +1 -0
  22. package/bin/core/types.d.ts +39 -0
  23. package/bin/core/types.d.ts.map +1 -0
  24. package/bin/core/types.js +7 -0
  25. package/bin/core/types.js.map +1 -0
  26. package/bin/index.d.ts +39 -0
  27. package/bin/index.d.ts.map +1 -0
  28. package/bin/index.js +45 -0
  29. package/bin/index.js.map +1 -0
  30. package/bin/service/ai/ai-service.d.ts +80 -0
  31. package/bin/service/ai/ai-service.d.ts.map +1 -0
  32. package/bin/service/ai/ai-service.js +184 -0
  33. package/bin/service/ai/ai-service.js.map +1 -0
  34. package/bin/service/ai/provider.d.ts +77 -0
  35. package/bin/service/ai/provider.d.ts.map +1 -0
  36. package/bin/service/ai/provider.js +71 -0
  37. package/bin/service/ai/provider.js.map +1 -0
  38. package/bin/service/ai/types.d.ts +72 -0
  39. package/bin/service/ai/types.d.ts.map +1 -0
  40. package/bin/service/ai/types.js +7 -0
  41. package/bin/service/ai/types.js.map +1 -0
  42. package/bin/service/env/env-service.d.ts +14 -0
  43. package/bin/service/env/env-service.d.ts.map +1 -0
  44. package/bin/service/env/env-service.js +42 -0
  45. package/bin/service/env/env-service.js.map +1 -0
  46. package/bin/service/env/env-store.d.ts +15 -0
  47. package/bin/service/env/env-store.d.ts.map +1 -0
  48. package/bin/service/env/env-store.js +35 -0
  49. package/bin/service/env/env-store.js.map +1 -0
  50. package/bin/service/env/schema.d.ts +171 -0
  51. package/bin/service/env/schema.d.ts.map +1 -0
  52. package/bin/service/env/schema.js +52 -0
  53. package/bin/service/env/schema.js.map +1 -0
  54. package/bin/service/env/types.d.ts +37 -0
  55. package/bin/service/env/types.d.ts.map +1 -0
  56. package/bin/service/env/types.js +8 -0
  57. package/bin/service/env/types.js.map +1 -0
  58. package/bin/service/hook.d.ts +20 -0
  59. package/bin/service/hook.d.ts.map +1 -0
  60. package/bin/service/hook.js +52 -0
  61. package/bin/service/hook.js.map +1 -0
  62. package/bin/service/plugin.d.ts +141 -0
  63. package/bin/service/plugin.d.ts.map +1 -0
  64. package/bin/service/plugin.js +124 -0
  65. package/bin/service/plugin.js.map +1 -0
  66. package/bin/service/products/product-store.d.ts +17 -0
  67. package/bin/service/products/product-store.d.ts.map +1 -0
  68. package/bin/service/products/product-store.js +49 -0
  69. package/bin/service/products/product-store.js.map +1 -0
  70. package/bin/service/products/products-service.d.ts +16 -0
  71. package/bin/service/products/products-service.d.ts.map +1 -0
  72. package/bin/service/products/products-service.js +52 -0
  73. package/bin/service/products/products-service.js.map +1 -0
  74. package/bin/service/products/schema.d.ts +207 -0
  75. package/bin/service/products/schema.d.ts.map +1 -0
  76. package/bin/service/products/schema.js +60 -0
  77. package/bin/service/products/schema.js.map +1 -0
  78. package/bin/service/products/types.d.ts +51 -0
  79. package/bin/service/products/types.d.ts.map +1 -0
  80. package/bin/service/products/types.js +7 -0
  81. package/bin/service/products/types.js.map +1 -0
  82. package/bin/service/service.d.ts +118 -0
  83. package/bin/service/service.d.ts.map +1 -0
  84. package/bin/service/service.js +114 -0
  85. package/bin/service/service.js.map +1 -0
  86. package/bin/service/types.d.ts +17 -0
  87. package/bin/service/types.d.ts.map +1 -0
  88. package/bin/service/types.js +5 -0
  89. package/bin/service/types.js.map +1 -0
  90. package/bin/store/db.d.ts +64 -0
  91. package/bin/store/db.d.ts.map +1 -0
  92. package/bin/store/db.js +28 -0
  93. package/bin/store/db.js.map +1 -0
  94. package/bin/store/table-api.d.ts +42 -0
  95. package/bin/store/table-api.d.ts.map +1 -0
  96. package/bin/store/table-api.js +98 -0
  97. package/bin/store/table-api.js.map +1 -0
  98. package/bin/store/types.d.ts +14 -0
  99. package/bin/store/types.d.ts.map +1 -0
  100. package/bin/store/types.js +7 -0
  101. package/bin/store/types.js.map +1 -0
  102. package/bin/utils/helpers.d.ts +101 -0
  103. package/bin/utils/helpers.d.ts.map +1 -0
  104. package/bin/utils/helpers.js +192 -0
  105. package/bin/utils/helpers.js.map +1 -0
  106. package/bin/utils/validation.d.ts +18 -0
  107. package/bin/utils/validation.d.ts.map +1 -0
  108. package/bin/utils/validation.js +28 -0
  109. package/bin/utils/validation.js.map +1 -0
  110. package/package.json +52 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * AI Service 模块。
3
+ *
4
+ * 一个 AIService 处理所有 AI 模态(text/stream/image/video/tts/asr)。
5
+ * 通过 use() 注册模型,通过 resolve() 匹配模型和 handler。
6
+ *
7
+ * 路由:
8
+ * - POST /text — 文本生成
9
+ * - POST /stream — 流式生成
10
+ * - POST /image — 图片生成
11
+ * - POST /video — 视频生成
12
+ * - POST /tts — 语音合成
13
+ * - POST /asr — 语音识别
14
+ * - GET /models — 模型列表
15
+ */
16
+ import { Service } from "../service.js";
17
+ import type { ServiceHandler } from "../types.js";
18
+ 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
+ */
31
+ export declare class AIService extends Service {
32
+ /**
33
+ * 模型注册表,key 为 model id。
34
+ */
35
+ private modelMap;
36
+ constructor();
37
+ /**
38
+ * 注册一个或多个模型配置。
39
+ *
40
+ * 支持三种调用形式:
41
+ * - `use(modelConfig)` — 单个
42
+ * - `use([config1, config2])` — 数组
43
+ * - `use(config1, config2)` — 展开参数
44
+ */
45
+ use(...inputs: (ModelConfig | ModelConfig[])[]): this;
46
+ /**
47
+ * 返回所有已注册的模型配置。
48
+ */
49
+ 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
+ */
62
+ resolve(query: {
63
+ model?: string;
64
+ mode?: string;
65
+ }): {
66
+ model?: ModelConfig;
67
+ handler: ServiceHandler;
68
+ };
69
+ private getHandler;
70
+ private findDefaultForMode;
71
+ /**
72
+ * 处理单个模态的 HTTP 请求。
73
+ */
74
+ private handleModality;
75
+ /**
76
+ * 从 AIService 实例中聚合公开模型列表。
77
+ */
78
+ static listModels(aiService: AIService): PublicModel[];
79
+ }
80
+ //# sourceMappingURL=ai-service.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * AI Service 模块。
3
+ *
4
+ * 一个 AIService 处理所有 AI 模态(text/stream/image/video/tts/asr)。
5
+ * 通过 use() 注册模型,通过 resolve() 匹配模型和 handler。
6
+ *
7
+ * 路由:
8
+ * - POST /text — 文本生成
9
+ * - POST /stream — 流式生成
10
+ * - POST /image — 图片生成
11
+ * - POST /video — 视频生成
12
+ * - POST /tts — 语音合成
13
+ * - POST /asr — 语音识别
14
+ * - GET /models — 模型列表
15
+ */
16
+ import { Service } from "../service.js";
17
+ import { httpError } from "../../utils/helpers.js";
18
+ /** AIService 支持的模态列表 */
19
+ const MODALITIES = ["text", "stream", "image", "video", "tts", "asr"];
20
+ /**
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
+ * ```
31
+ */
32
+ export class AIService extends Service {
33
+ /**
34
+ * 模型注册表,key 为 model id。
35
+ */
36
+ modelMap = new Map();
37
+ constructor() {
38
+ super({ id: "ai", name: "AI" });
39
+ // 为每个模态注册 POST 子路由
40
+ for (const modality of MODALITIES) {
41
+ this.post(`/${modality}`, (ctx) => this.handleModality(modality, ctx));
42
+ }
43
+ // 模型列表
44
+ this.get("/models", () => ({ items: AIService.listModels(this) }));
45
+ }
46
+ // ========== 模型注册 ==========
47
+ /**
48
+ * 注册一个或多个模型配置。
49
+ *
50
+ * 支持三种调用形式:
51
+ * - `use(modelConfig)` — 单个
52
+ * - `use([config1, config2])` — 数组
53
+ * - `use(config1, config2)` — 展开参数
54
+ */
55
+ use(...inputs) {
56
+ const configs = [];
57
+ for (const input of inputs) {
58
+ if (Array.isArray(input)) {
59
+ configs.push(...input);
60
+ }
61
+ else {
62
+ configs.push(input);
63
+ }
64
+ }
65
+ for (const config of configs) {
66
+ if (this.modelMap.has(config.id)) {
67
+ throw new Error(`Duplicate model: ${config.id}`);
68
+ }
69
+ this.modelMap.set(config.id, config);
70
+ }
71
+ return this;
72
+ }
73
+ /**
74
+ * 返回所有已注册的模型配置。
75
+ */
76
+ listModels() {
77
+ return [...this.modelMap.values()];
78
+ }
79
+ /**
80
+ * 是否有已注册的 handler。
81
+ */
82
+ hasHandler() {
83
+ return this.modelMap.size > 0;
84
+ }
85
+ // ========== 模型匹配 ==========
86
+ /**
87
+ * 根据查询参数匹配模型和对应的 handler。
88
+ *
89
+ * 匹配优先级:
90
+ * 1. 指定 model → 精确匹配 modelMap
91
+ * 2. 未指定 model → 该 mode 的默认模型
92
+ * 3. 都没有 → 第一个注册的模型(兜底)
93
+ */
94
+ resolve(query) {
95
+ const { model: modelId, mode } = query;
96
+ if (modelId) {
97
+ const model = this.modelMap.get(modelId);
98
+ if (!model)
99
+ throw httpError(422, `Unknown model: ${modelId}`);
100
+ const handler = this.getHandler(model, mode);
101
+ if (!handler)
102
+ throw httpError(422, `Model ${modelId} does not support mode: ${mode ?? "text"}`);
103
+ return { model, handler };
104
+ }
105
+ const defaultModel = this.findDefaultForMode(mode);
106
+ if (defaultModel) {
107
+ const handler = this.getHandler(defaultModel, mode);
108
+ if (handler)
109
+ return { model: defaultModel, handler };
110
+ }
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"}`);
117
+ }
118
+ throw httpError(422, `No model registered`);
119
+ }
120
+ getHandler(model, mode) {
121
+ return model.handle[(mode ?? "text")];
122
+ }
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
+ }
131
+ return undefined;
132
+ }
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,
146
+ };
147
+ 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)
152
+ return output;
153
+ return output;
154
+ }
155
+ catch (error) {
156
+ await this.hook.runOnError(aiCtx);
157
+ const message = error instanceof Error ? error.message : String(error);
158
+ const status = error.statusCode ?? 500;
159
+ return new Response(JSON.stringify({ error: message }), {
160
+ status,
161
+ headers: { "content-type": "application/json" },
162
+ });
163
+ }
164
+ }
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
+ });
182
+ }
183
+ }
184
+ //# sourceMappingURL=ai-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-service.js","sourceRoot":"","sources":["../../../src/service/ai/ai-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * AI Provider 模块。
3
+ *
4
+ * Provider 封装第三方 AI 提供商的 handler 实现和环境变量声明,
5
+ * 通过 model() 方法批量生成模型配置(ModelConfig),
6
+ * 可直接传给 AIService.use() 完成注册。
7
+ *
8
+ * 使用方式:
9
+ * ```ts
10
+ * const openai = new Provider("openai", {
11
+ * env: { OPENAI_API_KEY: "OpenAI API Key" },
12
+ * text: openaiTextHandler,
13
+ * stream: openaiStreamHandler,
14
+ * image: openaiImageHandler,
15
+ * });
16
+ *
17
+ * ai.use(
18
+ * openai.model({ id: "gpt-4o", name: "GPT-4o", default: true }),
19
+ * openai.model({ id: "gpt-4o-mini", name: "GPT-4o Mini" }),
20
+ * );
21
+ * ```
22
+ */
23
+ import type { ServiceHandler } from "../types.js";
24
+ import type { ModelConfig } from "./types.js";
25
+ /**
26
+ * AI Provider。
27
+ *
28
+ * 封装第三方 AI 提供商的 handler 实现和环境变量声明。
29
+ * 通过 model() 方法生成模型配置,可传给 AIService.use() 批量注册。
30
+ */
31
+ export declare class Provider {
32
+ /** Provider 唯一 ID */
33
+ readonly id: string;
34
+ /** Provider 所需环境变量(key → 描述) */
35
+ readonly env?: Record<string, string>;
36
+ /** 各 modality 的 handler 实现 */
37
+ private readonly handlers;
38
+ constructor(id: string, opts: {
39
+ /** Provider 所需环境变量(key → 描述) */
40
+ env?: Record<string, string>;
41
+ /** 文本生成 handler */
42
+ text: ServiceHandler;
43
+ /** 流式生成 handler */
44
+ stream: ServiceHandler;
45
+ /** 图片生成 handler */
46
+ image?: ServiceHandler;
47
+ /** 视频生成 handler */
48
+ video?: ServiceHandler;
49
+ });
50
+ /**
51
+ * 创建一个使用此 Provider handler 的模型配置。
52
+ *
53
+ * 返回的 ModelConfig 可直接传给 AIService.use() 注册:
54
+ * ```ts
55
+ * const m = provider.model({ id: "gpt-4o", name: "GPT-4o", default: true });
56
+ * ai.use(m);
57
+ * ```
58
+ *
59
+ * @param spec - 模型规格
60
+ * @returns 完整的模型配置(含 handler 绑定)
61
+ */
62
+ model(spec: {
63
+ /** 模型唯一 ID */
64
+ id: string;
65
+ /** 模型展示名称 */
66
+ name: string;
67
+ /** 模型描述 */
68
+ description?: string;
69
+ /** 模型标签 */
70
+ tags?: string[];
71
+ /** 模型元数据(如价格、上下文窗口等) */
72
+ meta?: Record<string, unknown>;
73
+ /** 是否为默认模型。true 全局默认,或指定 modality 列表 */
74
+ default?: boolean | string[];
75
+ }): ModelConfig;
76
+ }
77
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/service/ai/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AAE7D;;;;;GAKG;AACH,qBAAa,QAAQ;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAE7B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC5B,gCAAgC;QAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,mBAAmB;QACnB,IAAI,EAAE,cAAc,CAAC;QACrB,mBAAmB;QACnB,MAAM,EAAE,cAAc,CAAC;QACvB,mBAAmB;QACnB,KAAK,CAAC,EAAE,cAAc,CAAC;QACvB,mBAAmB;QACnB,KAAK,CAAC,EAAE,cAAc,CAAC;KACxB;IAWD;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,IAAI,EAAE;QACV,cAAc;QACd,EAAE,EAAE,MAAM,CAAC;QACX,aAAa;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW;QACX,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW;QACX,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,wBAAwB;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,wCAAwC;QACxC,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;KAC9B,GAAG,WAAW;CAYhB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * AI Provider 模块。
3
+ *
4
+ * Provider 封装第三方 AI 提供商的 handler 实现和环境变量声明,
5
+ * 通过 model() 方法批量生成模型配置(ModelConfig),
6
+ * 可直接传给 AIService.use() 完成注册。
7
+ *
8
+ * 使用方式:
9
+ * ```ts
10
+ * const openai = new Provider("openai", {
11
+ * env: { OPENAI_API_KEY: "OpenAI API Key" },
12
+ * text: openaiTextHandler,
13
+ * stream: openaiStreamHandler,
14
+ * image: openaiImageHandler,
15
+ * });
16
+ *
17
+ * ai.use(
18
+ * openai.model({ id: "gpt-4o", name: "GPT-4o", default: true }),
19
+ * openai.model({ id: "gpt-4o-mini", name: "GPT-4o Mini" }),
20
+ * );
21
+ * ```
22
+ */
23
+ /**
24
+ * AI Provider。
25
+ *
26
+ * 封装第三方 AI 提供商的 handler 实现和环境变量声明。
27
+ * 通过 model() 方法生成模型配置,可传给 AIService.use() 批量注册。
28
+ */
29
+ export class Provider {
30
+ /** Provider 唯一 ID */
31
+ id;
32
+ /** Provider 所需环境变量(key → 描述) */
33
+ env;
34
+ /** 各 modality 的 handler 实现 */
35
+ handlers;
36
+ constructor(id, opts) {
37
+ this.id = id;
38
+ this.env = opts.env;
39
+ this.handlers = {
40
+ text: opts.text,
41
+ stream: opts.stream,
42
+ image: opts.image,
43
+ video: opts.video,
44
+ };
45
+ }
46
+ /**
47
+ * 创建一个使用此 Provider handler 的模型配置。
48
+ *
49
+ * 返回的 ModelConfig 可直接传给 AIService.use() 注册:
50
+ * ```ts
51
+ * const m = provider.model({ id: "gpt-4o", name: "GPT-4o", default: true });
52
+ * ai.use(m);
53
+ * ```
54
+ *
55
+ * @param spec - 模型规格
56
+ * @returns 完整的模型配置(含 handler 绑定)
57
+ */
58
+ model(spec) {
59
+ return {
60
+ id: spec.id,
61
+ name: spec.name,
62
+ description: spec.description,
63
+ tags: spec.tags,
64
+ meta: spec.meta,
65
+ default: spec.default,
66
+ env: this.env,
67
+ handle: this.handlers,
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/service/ai/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH;;;;;GAKG;AACH,MAAM,OAAO,QAAQ;IACnB,qBAAqB;IACZ,EAAE,CAAS;IACpB,gCAAgC;IACvB,GAAG,CAA0B;IACtC,8BAA8B;IACb,QAAQ,CAAgB;IAEzC,YAAY,EAAU,EAAE,IAWvB;QACC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,IAaL;QACC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,QAAQ;SACtB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * AI Service 类型模块。
3
+ *
4
+ * 包含模型配置、handler 映射、运行时模型和执行上下文类型。
5
+ */
6
+ import type { ServiceHandler } from "../types.js";
7
+ /**
8
+ * 模型 handler 映射,key 为 modality 名称(text/stream/image/video/tts/asr)。
9
+ *
10
+ * 每个 handler 接收 ServiceContext,返回对应 modality 的结果。
11
+ * Provider 在构造时提供这些 handler,通过 model() 方法绑定到模型配置。
12
+ */
13
+ export interface ModelHandlers {
14
+ /** 文本生成 handler */
15
+ text?: ServiceHandler;
16
+ /** 流式生成 handler */
17
+ stream?: ServiceHandler;
18
+ /** 图片生成 handler */
19
+ image?: ServiceHandler;
20
+ /** 视频生成 handler */
21
+ video?: ServiceHandler;
22
+ /** 语音合成 handler */
23
+ tts?: ServiceHandler;
24
+ /** 语音识别 handler */
25
+ asr?: ServiceHandler;
26
+ /** 扩展 modality handler */
27
+ [modality: string]: ServiceHandler | undefined;
28
+ }
29
+ /**
30
+ * 模型配置(Provider.model() 的返回值)。
31
+ *
32
+ * 包含模型的完整元信息和各 modality 的 handler 绑定,
33
+ * 可直接传给 AIService.use() 完成注册。
34
+ */
35
+ export interface ModelConfig {
36
+ /** 模型唯一 ID(如 "gpt-4o") */
37
+ id: string;
38
+ /** 模型展示名称 */
39
+ name: string;
40
+ /** 模型描述 */
41
+ description?: string;
42
+ /** 模型标签(如 ["openai", "vision"]) */
43
+ tags?: string[];
44
+ /** 模型元数据(如 provider 信息、价格等) */
45
+ meta?: Record<string, unknown>;
46
+ /** 是否为默认模型。true 全局默认,或指定 modality 列表按 modality 默认 */
47
+ default?: boolean | string[];
48
+ /** 模型所需环境变量(key → 描述) */
49
+ env?: Record<string, string>;
50
+ /** 各 modality 的 handler 绑定 */
51
+ handle: ModelHandlers;
52
+ }
53
+ /**
54
+ * 公开模型列表项(API 返回给客户端)。
55
+ */
56
+ export interface PublicModel {
57
+ /** 模型 ID */
58
+ id: string;
59
+ /** 模型展示名称 */
60
+ name: string;
61
+ /** 模型描述 */
62
+ description: string;
63
+ /** 模型支持的 modality 列表 */
64
+ modalities: string[];
65
+ /** 模型标签 */
66
+ tags: string[];
67
+ /** 模型元数据 */
68
+ meta: Record<string, unknown>;
69
+ /** 模型所需环境变量 */
70
+ env: Record<string, string>;
71
+ }
72
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/service/ai/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,mBAAmB;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,mBAAmB;IACnB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,mBAAmB;IACnB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,mBAAmB;IACnB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,mBAAmB;IACnB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,0BAA0B;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;CAChD;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;IAC7B,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,8BAA8B;IAC9B,MAAM,EAAE,aAAa,CAAC;CACvB;AAMD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW;IACX,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,eAAe;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * AI Service 类型模块。
3
+ *
4
+ * 包含模型配置、handler 映射、运行时模型和执行上下文类型。
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/service/ai/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * env 内置服务。
3
+ *
4
+ * 提供 admin API 路由用于管理运行时环境变量。
5
+ * EnvStore 的创建和 attach 逻辑已由 Base 内部处理,
6
+ * 本 Service 只负责路由。
7
+ */
8
+ import { Service } from "../service.js";
9
+ import type { EnvProvider } from "../../core/runtime.js";
10
+ export declare class EnvService extends Service {
11
+ private readonly envProvider;
12
+ constructor(envProvider: EnvProvider);
13
+ }
14
+ //# sourceMappingURL=env-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-service.d.ts","sourceRoot":"","sources":["../../../src/service/env/env-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOzD,qBAAa,UAAW,SAAQ,OAAO;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAE9B,WAAW,EAAE,WAAW;CA8BrC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * env 内置服务。
3
+ *
4
+ * 提供 admin API 路由用于管理运行时环境变量。
5
+ * EnvStore 的创建和 attach 逻辑已由 Base 内部处理,
6
+ * 本 Service 只负责路由。
7
+ */
8
+ import { Service } from "../service.js";
9
+ const INTERNAL_KEYS = new Set([
10
+ "VISIBLEBASE_ADMIN_SECRET_KEY",
11
+ "VISIBLEBASE_TOKEN_SIGNING_KEY",
12
+ ]);
13
+ export class EnvService extends Service {
14
+ envProvider;
15
+ constructor(envProvider) {
16
+ super({ id: "env", name: "Env" });
17
+ this.envProvider = envProvider;
18
+ this.get("/", () => {
19
+ const list = this.envProvider.list();
20
+ const items = Array.isArray(list) ? list : [];
21
+ return {
22
+ items: items.filter((e) => !INTERNAL_KEYS.has(e.key)),
23
+ };
24
+ }, { auth: "admin" });
25
+ this.post("/upsert", async ({ input }) => {
26
+ const entry = await this.envProvider.upsert({
27
+ key: String(input.key ?? ""),
28
+ value: String(input.value ?? ""),
29
+ });
30
+ return { success: true, key: entry.key };
31
+ }, { auth: "admin" });
32
+ this.post("/remove", async ({ input }) => {
33
+ await this.envProvider.remove(String(input.key ?? ""));
34
+ return { success: true, key: String(input.key ?? "") };
35
+ }, { auth: "admin" });
36
+ this.post("/import", async ({ input }) => {
37
+ const entries = await this.envProvider.import(input.raw);
38
+ return { success: true, count: entries.length, keys: entries.map((e) => e.key) };
39
+ }, { auth: "admin" });
40
+ }
41
+ }
42
+ //# sourceMappingURL=env-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-service.js","sourceRoot":"","sources":["../../../src/service/env/env-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,8BAA8B;IAC9B,+BAA+B;CAChC,CAAC,CAAC;AAEH,MAAM,OAAO,UAAW,SAAQ,OAAO;IACpB,WAAW,CAAc;IAE1C,YAAY,WAAwB;QAClC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAE/B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aACtD,CAAC;QACJ,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAC1C,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC5B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;aACjC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QAC3C,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACvC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;QACzD,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACnF,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Env 数据存储。
3
+ *
4
+ * 基于 BaseTableApi,不直接依赖 Drizzle。
5
+ */
6
+ import type { BaseTableApi } from "../../store/table-api.js";
7
+ import type { EnvEntry, EnvUpsertInput } from "./types.js";
8
+ export declare class EnvStore {
9
+ private table;
10
+ constructor(table: BaseTableApi<EnvEntry>);
11
+ list(): Promise<EnvEntry[]>;
12
+ upsert(input: EnvUpsertInput): Promise<EnvEntry>;
13
+ remove(key: string): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=env-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-store.d.ts","sourceRoot":"","sources":["../../../src/service/env/env-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3D,qBAAa,QAAQ;IACP,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;IAE3C,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI3B,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkBhD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Env 数据存储。
3
+ *
4
+ * 基于 BaseTableApi,不直接依赖 Drizzle。
5
+ */
6
+ import { normalizeEnvKey } from "../../utils/helpers.js";
7
+ export class EnvStore {
8
+ table;
9
+ constructor(table) {
10
+ this.table = table;
11
+ }
12
+ async list() {
13
+ return this.table.select();
14
+ }
15
+ async upsert(input) {
16
+ const key = normalizeEnvKey(input.key);
17
+ const value = String(input.value ?? "");
18
+ const rows = await this.table.select({ key });
19
+ if (rows.length > 0) {
20
+ await this.table.update({
21
+ where: { key },
22
+ values: { value, updated_at: new Date().toISOString() },
23
+ });
24
+ }
25
+ else {
26
+ const now = new Date().toISOString();
27
+ await this.table.insert({ key, value, source: "database", created_at: now, updated_at: now });
28
+ }
29
+ return { key, value, source: "database" };
30
+ }
31
+ async remove(key) {
32
+ await this.table.delete({ key: normalizeEnvKey(key) });
33
+ }
34
+ }
35
+ //# sourceMappingURL=env-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-store.js","sourceRoot":"","sources":["../../../src/service/env/env-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAIzD,MAAM,OAAO,QAAQ;IACC;IAApB,YAAoB,KAA6B;QAA7B,UAAK,GAAL,KAAK,CAAwB;IAAG,CAAC;IAErD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAqB;QAChC,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAuB,CAAC,CAAC;QAEnE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBACtB,KAAK,EAAE,EAAE,GAAG,EAAuB;gBACnC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAuB;aAC7E,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAc,CAAC,CAAC;QAC5G,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,EAAuB,CAAC,CAAC;IAC9E,CAAC;CACF"}