@shenghuabi/openai 1.2.12 → 1.2.13

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.
@@ -174,6 +174,24 @@ export declare const CompatSchema: v.SchemaWithPipe<readonly [v.UnionSchema<[v.S
174
174
  cacheControlFormat?: "anthropic" | undefined;
175
175
  sendSessionAffinityHeaders?: boolean | undefined;
176
176
  supportsLongCacheRetention?: boolean | undefined;
177
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
178
+ supportsStore?: boolean | undefined;
179
+ supportsDeveloperRole?: boolean | undefined;
180
+ supportsReasoningEffort?: boolean | undefined;
181
+ supportsUsageInStreaming?: boolean | undefined;
182
+ maxTokensField?: "max_completion_tokens" | "max_tokens" | undefined;
183
+ requiresToolResultName?: boolean | undefined;
184
+ requiresAssistantAfterToolResult?: boolean | undefined;
185
+ requiresThinkingAsText?: boolean | undefined;
186
+ requiresReasoningContentOnAssistantMessages?: boolean | undefined;
187
+ thinkingFormat?: "deepseek" | "openai" | "openrouter" | "zai" | "together" | "ant-ling" | "qwen" | "qwen-chat-template" | "string-thinking" | undefined;
188
+ openRouterRouting?: any;
189
+ vercelGatewayRouting?: any;
190
+ zaiToolStream?: boolean | undefined;
191
+ supportsStrictMode?: boolean | undefined;
192
+ cacheControlFormat?: "anthropic" | undefined;
193
+ sendSessionAffinityHeaders?: boolean | undefined;
194
+ supportsLongCacheRetention?: boolean | undefined;
177
195
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>, v.SchemaWithPipe<readonly [v.SchemaWithPipe<readonly [v.OptionalSchema<v.ObjectSchema<{
178
196
  readonly supportsDeveloperRole: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "支持开发者角色">, v.DescriptionAction<boolean, "是否支持 developer 系统消息角色">]>, undefined>;
179
197
  readonly sendSessionIdHeader: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "发送会话 ID 标头">, v.DescriptionAction<boolean, "是否在请求中携带 X-Session-ID 标头">]>, undefined>;
@@ -190,6 +208,10 @@ export declare const CompatSchema: v.SchemaWithPipe<readonly [v.UnionSchema<[v.S
190
208
  supportsDeveloperRole?: boolean | undefined;
191
209
  sendSessionIdHeader?: boolean | undefined;
192
210
  supportsLongCacheRetention?: boolean | undefined;
211
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
212
+ supportsDeveloperRole?: boolean | undefined;
213
+ sendSessionIdHeader?: boolean | undefined;
214
+ supportsLongCacheRetention?: boolean | undefined;
193
215
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>, v.SchemaWithPipe<readonly [v.SchemaWithPipe<readonly [v.OptionalSchema<v.ObjectSchema<{
194
216
  readonly supportsEagerToolInputStreaming: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, " eagerly 工具流式">, v.DescriptionAction<boolean, "是否支持工具调用的 eager 模式流式输出">]>, undefined>;
195
217
  readonly supportsLongCacheRetention: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "长期缓存保留">, v.DescriptionAction<boolean, "是否支持长期缓存保留策略">]>, undefined>;
@@ -222,6 +244,14 @@ export declare const CompatSchema: v.SchemaWithPipe<readonly [v.UnionSchema<[v.S
222
244
  supportsTemperature?: boolean | undefined;
223
245
  forceAdaptiveThinking?: boolean | undefined;
224
246
  allowEmptySignature?: boolean | undefined;
247
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
248
+ supportsEagerToolInputStreaming?: boolean | undefined;
249
+ supportsLongCacheRetention?: boolean | undefined;
250
+ sendSessionAffinityHeaders?: boolean | undefined;
251
+ supportsCacheControlOnTools?: boolean | undefined;
252
+ supportsTemperature?: boolean | undefined;
253
+ forceAdaptiveThinking?: boolean | undefined;
254
+ allowEmptySignature?: boolean | undefined;
225
255
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>], undefined>, import("@piying/valibot-visit").DefineTypeAction<{
226
256
  supportsStore?: boolean | undefined;
227
257
  supportsDeveloperRole?: boolean | undefined;
@@ -345,7 +375,12 @@ export declare const ModelSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
345
375
  output: number;
346
376
  cacheRead: number;
347
377
  cacheWrite: number;
348
- }, "模型各操作类型的 token 计价标准">]>, v.TitleAction<{
378
+ }, "模型各操作类型的 token 计价标准">]>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
379
+ input: number;
380
+ output: number;
381
+ cacheRead: number;
382
+ cacheWrite: number;
383
+ }, import("@piying/view-angular-core").AnyCoreSchemaHandle>, v.TitleAction<{
349
384
  input: number;
350
385
  output: number;
351
386
  cacheRead: number;
@@ -441,6 +476,24 @@ export declare const ModelSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
441
476
  cacheControlFormat?: "anthropic" | undefined;
442
477
  sendSessionAffinityHeaders?: boolean | undefined;
443
478
  supportsLongCacheRetention?: boolean | undefined;
479
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
480
+ supportsStore?: boolean | undefined;
481
+ supportsDeveloperRole?: boolean | undefined;
482
+ supportsReasoningEffort?: boolean | undefined;
483
+ supportsUsageInStreaming?: boolean | undefined;
484
+ maxTokensField?: "max_completion_tokens" | "max_tokens" | undefined;
485
+ requiresToolResultName?: boolean | undefined;
486
+ requiresAssistantAfterToolResult?: boolean | undefined;
487
+ requiresThinkingAsText?: boolean | undefined;
488
+ requiresReasoningContentOnAssistantMessages?: boolean | undefined;
489
+ thinkingFormat?: "deepseek" | "openai" | "openrouter" | "zai" | "together" | "ant-ling" | "qwen" | "qwen-chat-template" | "string-thinking" | undefined;
490
+ openRouterRouting?: any;
491
+ vercelGatewayRouting?: any;
492
+ zaiToolStream?: boolean | undefined;
493
+ supportsStrictMode?: boolean | undefined;
494
+ cacheControlFormat?: "anthropic" | undefined;
495
+ sendSessionAffinityHeaders?: boolean | undefined;
496
+ supportsLongCacheRetention?: boolean | undefined;
444
497
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>, v.SchemaWithPipe<readonly [v.SchemaWithPipe<readonly [v.OptionalSchema<v.ObjectSchema<{
445
498
  readonly supportsDeveloperRole: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "支持开发者角色">, v.DescriptionAction<boolean, "是否支持 developer 系统消息角色">]>, undefined>;
446
499
  readonly sendSessionIdHeader: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "发送会话 ID 标头">, v.DescriptionAction<boolean, "是否在请求中携带 X-Session-ID 标头">]>, undefined>;
@@ -457,6 +510,10 @@ export declare const ModelSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
457
510
  supportsDeveloperRole?: boolean | undefined;
458
511
  sendSessionIdHeader?: boolean | undefined;
459
512
  supportsLongCacheRetention?: boolean | undefined;
513
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
514
+ supportsDeveloperRole?: boolean | undefined;
515
+ sendSessionIdHeader?: boolean | undefined;
516
+ supportsLongCacheRetention?: boolean | undefined;
460
517
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>, v.SchemaWithPipe<readonly [v.SchemaWithPipe<readonly [v.OptionalSchema<v.ObjectSchema<{
461
518
  readonly supportsEagerToolInputStreaming: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, " eagerly 工具流式">, v.DescriptionAction<boolean, "是否支持工具调用的 eager 模式流式输出">]>, undefined>;
462
519
  readonly supportsLongCacheRetention: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "长期缓存保留">, v.DescriptionAction<boolean, "是否支持长期缓存保留策略">]>, undefined>;
@@ -489,6 +546,14 @@ export declare const ModelSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
489
546
  supportsTemperature?: boolean | undefined;
490
547
  forceAdaptiveThinking?: boolean | undefined;
491
548
  allowEmptySignature?: boolean | undefined;
549
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
550
+ supportsEagerToolInputStreaming?: boolean | undefined;
551
+ supportsLongCacheRetention?: boolean | undefined;
552
+ sendSessionAffinityHeaders?: boolean | undefined;
553
+ supportsCacheControlOnTools?: boolean | undefined;
554
+ supportsTemperature?: boolean | undefined;
555
+ forceAdaptiveThinking?: boolean | undefined;
556
+ allowEmptySignature?: boolean | undefined;
492
557
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>], undefined>, import("@piying/valibot-visit").DefineTypeAction<{
493
558
  supportsStore?: boolean | undefined;
494
559
  supportsDeveloperRole?: boolean | undefined;
@@ -771,7 +836,12 @@ export declare const ModelConfigDefine: v.SchemaWithPipe<readonly [v.ObjectSchem
771
836
  output: number;
772
837
  cacheRead: number;
773
838
  cacheWrite: number;
774
- }, "模型各操作类型的 token 计价标准">]>, v.TitleAction<{
839
+ }, "模型各操作类型的 token 计价标准">]>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
840
+ input: number;
841
+ output: number;
842
+ cacheRead: number;
843
+ cacheWrite: number;
844
+ }, import("@piying/view-angular-core").AnyCoreSchemaHandle>, v.TitleAction<{
775
845
  input: number;
776
846
  output: number;
777
847
  cacheRead: number;
@@ -867,6 +937,24 @@ export declare const ModelConfigDefine: v.SchemaWithPipe<readonly [v.ObjectSchem
867
937
  cacheControlFormat?: "anthropic" | undefined;
868
938
  sendSessionAffinityHeaders?: boolean | undefined;
869
939
  supportsLongCacheRetention?: boolean | undefined;
940
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
941
+ supportsStore?: boolean | undefined;
942
+ supportsDeveloperRole?: boolean | undefined;
943
+ supportsReasoningEffort?: boolean | undefined;
944
+ supportsUsageInStreaming?: boolean | undefined;
945
+ maxTokensField?: "max_completion_tokens" | "max_tokens" | undefined;
946
+ requiresToolResultName?: boolean | undefined;
947
+ requiresAssistantAfterToolResult?: boolean | undefined;
948
+ requiresThinkingAsText?: boolean | undefined;
949
+ requiresReasoningContentOnAssistantMessages?: boolean | undefined;
950
+ thinkingFormat?: "deepseek" | "openai" | "openrouter" | "zai" | "together" | "ant-ling" | "qwen" | "qwen-chat-template" | "string-thinking" | undefined;
951
+ openRouterRouting?: any;
952
+ vercelGatewayRouting?: any;
953
+ zaiToolStream?: boolean | undefined;
954
+ supportsStrictMode?: boolean | undefined;
955
+ cacheControlFormat?: "anthropic" | undefined;
956
+ sendSessionAffinityHeaders?: boolean | undefined;
957
+ supportsLongCacheRetention?: boolean | undefined;
870
958
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>, v.SchemaWithPipe<readonly [v.SchemaWithPipe<readonly [v.OptionalSchema<v.ObjectSchema<{
871
959
  readonly supportsDeveloperRole: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "支持开发者角色">, v.DescriptionAction<boolean, "是否支持 developer 系统消息角色">]>, undefined>;
872
960
  readonly sendSessionIdHeader: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "发送会话 ID 标头">, v.DescriptionAction<boolean, "是否在请求中携带 X-Session-ID 标头">]>, undefined>;
@@ -883,6 +971,10 @@ export declare const ModelConfigDefine: v.SchemaWithPipe<readonly [v.ObjectSchem
883
971
  supportsDeveloperRole?: boolean | undefined;
884
972
  sendSessionIdHeader?: boolean | undefined;
885
973
  supportsLongCacheRetention?: boolean | undefined;
974
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
975
+ supportsDeveloperRole?: boolean | undefined;
976
+ sendSessionIdHeader?: boolean | undefined;
977
+ supportsLongCacheRetention?: boolean | undefined;
886
978
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>, v.SchemaWithPipe<readonly [v.SchemaWithPipe<readonly [v.OptionalSchema<v.ObjectSchema<{
887
979
  readonly supportsEagerToolInputStreaming: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, " eagerly 工具流式">, v.DescriptionAction<boolean, "是否支持工具调用的 eager 模式流式输出">]>, undefined>;
888
980
  readonly supportsLongCacheRetention: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.TitleAction<boolean, "长期缓存保留">, v.DescriptionAction<boolean, "是否支持长期缓存保留策略">]>, undefined>;
@@ -915,6 +1007,14 @@ export declare const ModelConfigDefine: v.SchemaWithPipe<readonly [v.ObjectSchem
915
1007
  supportsTemperature?: boolean | undefined;
916
1008
  forceAdaptiveThinking?: boolean | undefined;
917
1009
  allowEmptySignature?: boolean | undefined;
1010
+ } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>, import("@piying/valibot-visit").RawConfigAction<"viewRawConfig", {
1011
+ supportsEagerToolInputStreaming?: boolean | undefined;
1012
+ supportsLongCacheRetention?: boolean | undefined;
1013
+ sendSessionAffinityHeaders?: boolean | undefined;
1014
+ supportsCacheControlOnTools?: boolean | undefined;
1015
+ supportsTemperature?: boolean | undefined;
1016
+ forceAdaptiveThinking?: boolean | undefined;
1017
+ allowEmptySignature?: boolean | undefined;
918
1018
  } | undefined, import("@piying/view-angular-core").AnyCoreSchemaHandle>]>], undefined>, import("@piying/valibot-visit").DefineTypeAction<{
919
1019
  supportsStore?: boolean | undefined;
920
1020
  supportsDeveloperRole?: boolean | undefined;
package/define/index.js CHANGED
@@ -424,6 +424,9 @@ var CompatSchema = v3.pipe(
424
424
  v3.union([
425
425
  v3.pipe(
426
426
  OpenAICompletionsCompatSchema,
427
+ import_view_angular_core.actions.wrappers.patch([
428
+ { type: "div", attributes: { class: "grid gap-2" } }
429
+ ]),
427
430
  (0, import_view_angular_core.hideWhen)({
428
431
  disabled: true,
429
432
  listen(fn, field) {
@@ -435,6 +438,9 @@ var CompatSchema = v3.pipe(
435
438
  ),
436
439
  v3.pipe(
437
440
  OpenAIResponsesCompatSchema,
441
+ import_view_angular_core.actions.wrappers.patch([
442
+ { type: "div", attributes: { class: "grid gap-2" } }
443
+ ]),
438
444
  (0, import_view_angular_core.hideWhen)({
439
445
  disabled: true,
440
446
  listen(fn, field) {
@@ -446,6 +452,9 @@ var CompatSchema = v3.pipe(
446
452
  ),
447
453
  v3.pipe(
448
454
  AnthropicMessagesCompatSchema,
455
+ import_view_angular_core.actions.wrappers.patch([
456
+ { type: "div", attributes: { class: "grid gap-2" } }
457
+ ]),
449
458
  (0, import_view_angular_core.hideWhen)({
450
459
  disabled: true,
451
460
  listen(fn, field) {
@@ -553,6 +562,7 @@ var ModelSchema = v3.pipe(
553
562
  ),
554
563
  cost: v3.pipe(
555
564
  CostSchema,
565
+ (0, import_view_angular_core.renderConfig)({ hidden: true }),
556
566
  v3.title("费用配置"),
557
567
  v3.description("模型 token 计价标准")
558
568
  ),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/openai/define/index.ts", "../../../packages/openai/chat/message.define.ts", "../../../packages/openai/chat/util/get-custom-provider.ts", "../../../packages/openai/chat/provider.define.ts"],
4
- "sourcesContent": ["export * from '../chat/message.define';\nexport * from '../chat/util/get-custom-provider'", "import * as v from 'valibot';\nexport const ChatCompletionContentPartStr = v.object({\n text: v.string(),\n type: v.optional(v.literal('text'), 'text'),\n});\nexport type ChatCompletionContentPartStrType = v.InferOutput<\n typeof ChatCompletionContentPartStr\n>;\n\nexport const ChatCompletionContentPartImage = v.object({\n image_url: v.object({\n url: v.string(),\n }),\n type: v.optional(v.literal('image_url'), 'image_url'),\n});\nexport type ChatCompletionContentPartImageType = v.InferOutput<\n typeof ChatCompletionContentPartImage\n>;\nexport const ChatCompletionContentPart = v.array(\n v.union([ChatCompletionContentPartStr, ChatCompletionContentPartImage]),\n);\nexport const SystemChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const UserChatCompletionContent = ChatCompletionContentPart;\nexport type UserChatCompletionContentType = v.InferOutput<\n typeof UserChatCompletionContent\n>;\nexport const AssistantChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const SystemChatMessage = v.object({\n role: v.optional(v.literal('system'), 'system'),\n content: SystemChatCompletionContent,\n});\nexport type SystemChatMessageType = v.InferOutput<typeof SystemChatMessage>;\nexport const UserChatMessage = v.object({\n role: v.optional(v.literal('user'), 'user'),\n content: UserChatCompletionContent,\n});\nexport type UserChatMessageType = v.InferOutput<typeof UserChatMessage>;\n\nexport const AssistantChatMessage = v.object({\n role: v.optional(v.literal('assistant'), 'assistant'),\n content: AssistantChatCompletionContent,\n thinkContent: v.optional(v.string()),\n});\n\nexport type AssistantChatMessageType = v.InferOutput<\n typeof AssistantChatMessage\n>;\n\nexport const ChatMessageItemDefine = v.union([\n SystemChatMessage,\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport const ChatMessageCommonItemDefine = v.union([\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport type ChatMessageItemType = v.InferOutput<typeof ChatMessageItemDefine>;\nexport const ChatMessageListDefine = v.array(ChatMessageItemDefine);\n\nexport type ChatMessageListOutputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\nexport type ChatMessageListInputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\n", "import * as v from 'valibot';\n\nimport { getModel, Model } from '@earendil-works/pi-ai';\nimport { KnownProviderDefine } from '../provider.define';\nimport {\n actions,\n asControl,\n hideWhen,\n renderConfig,\n setAlias,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map } from 'rxjs';\n\nfunction getCustomProvider<\n T extends 'openai-completions' | 'openai-responses' | 'anthropic-messages',\n>(\n compat: T,\n model: string,\n name: string,\n input: Omit<Model<T>, 'api' | 'id' | 'name'>,\n) {\n return { ...input, id: model, api: compat, name } satisfies Model<T>;\n}\nexport function getModelConfig(input: ModelConfigInputType) {\n if (input.provider === ('faux' as any)) {\n return {\n model: input.config as Model<any>,\n config: input as ModelConfigOutputType,\n };\n }\n const config = v.parse(ModelConfigDefine, input);\n if (\n config.provider === 'openai-completions' ||\n config.provider === 'openai-responses' ||\n config.provider === 'anthropic-messages'\n ) {\n return {\n model: getCustomProvider(\n config.provider,\n config.model,\n config.name,\n config.config!,\n ),\n config: config,\n };\n }\n\n return {\n model: getModel(config.provider, config.model as any as never),\n config: config,\n };\n}\nexport const ThinkingLevelSchema = v.pipe(\n v.picklist(['minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('思考等级'),\n v.description('模型思考的详细程度,从最小到最大'),\n);\n\nexport const ModelThinkingLevelSchema = v.pipe(\n v.picklist(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('模型思考等级'),\n v.description('关闭或设置模型思考的详细程度'),\n);\n\n// --- Compat schemas (conditional on TApi) ---\n\n/** OpenAI Completions compatibility overrides */\nexport const OpenAICompletionsCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsStore: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持存储'),\n v.description('是否支持服务端会话存储'),\n ),\n ),\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n supportsReasoningEffort: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持推理努力'),\n v.description('是否支持 reasoning_effort 参数'),\n ),\n ),\n supportsUsageInStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title('流式用量'),\n v.description('流式输出中是否返回 usage 信息'),\n ),\n ),\n maxTokensField: v.optional(\n v.pipe(\n v.picklist(['max_completion_tokens', 'max_tokens']),\n v.title('最大 token 字段名'),\n v.description('指定最大 token 参数使用的是哪个字段名'),\n ),\n ),\n requiresToolResultName: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要工具结果名称'),\n v.description('是否要求工具结果消息包含 name 字段'),\n ),\n ),\n requiresAssistantAfterToolResult: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要助手回复'),\n v.description('工具结果后是否需要助手消息跟进'),\n ),\n ),\n requiresThinkingAsText: v.optional(\n v.pipe(\n v.boolean(),\n v.title('思考转文本'),\n v.description('是否将思考过程作为普通文本发送'),\n ),\n ),\n requiresReasoningContentOnAssistantMessages: v.optional(\n v.pipe(\n v.boolean(),\n v.title('推理内容在助手消息中'),\n v.description('是否在助手消息中包含推理内容'),\n ),\n ),\n thinkingFormat: v.optional(\n v.pipe(\n v.picklist([\n 'openai',\n 'openrouter',\n 'deepseek',\n 'together',\n 'zai',\n 'qwen',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ]),\n v.title('思考格式'),\n v.description('指定 thinking 标签的序列化格式'),\n ),\n ),\n openRouterRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('OpenRouter 路由'),\n v.description('自定义 OpenRouter 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n vercelGatewayRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('Vercel Gateway 路由'),\n v.description('自定义 Vercel AI Gateway 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n zaiToolStream: v.optional(\n v.pipe(\n v.boolean(),\n v.title('ZAI 工具流式'),\n v.description('是否启用 ZAI 平台工具调用的流式输出'),\n ),\n ),\n supportsStrictMode: v.optional(\n v.pipe(\n v.boolean(),\n v.title('严格模式'),\n v.description('是否支持工具的 JSON Schema 严格校验'),\n ),\n ),\n cacheControlFormat: v.optional(\n v.pipe(\n v.literal('anthropic'),\n v.title('缓存控制格式'),\n v.description('指定缓存控制的语法格式'),\n renderConfig({ hidden: true }),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Completions 兼容配置'),\n v.description('针对 OpenAI Completions API 的兼容性覆写选项'),\n);\n\n/** OpenAI Responses compatibility overrides */\nexport const OpenAIResponsesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n sendSessionIdHeader: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话 ID 标头'),\n v.description('是否在请求中携带 X-Session-ID 标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Responses 兼容配置'),\n v.description('针对 OpenAI Responses API 的兼容性覆写选项'),\n);\n\n/** Anthropic Messages compatibility overrides */\nexport const AnthropicMessagesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsEagerToolInputStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title(' eagerly 工具流式'),\n v.description('是否支持工具调用的 eager 模式流式输出'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsCacheControlOnTools: v.optional(\n v.pipe(\n v.boolean(),\n v.title('工具缓存控制'),\n v.description('是否支持在 tool_use 消息中使用 cache_control'),\n ),\n ),\n supportsTemperature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持温度参数'),\n v.description('模型/接口是否支持 temperature 参数'),\n ),\n ),\n forceAdaptiveThinking: v.optional(\n v.pipe(\n v.boolean(),\n v.title('强制自适应思考'),\n v.description('是否强制启用 adaptive thinking 模式'),\n ),\n ),\n allowEmptySignature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('允许空签名'),\n v.description('是否允许工具调用不指定签名(sha256)'),\n ),\n ),\n }),\n ),\n v.title('Anthropic Messages 兼容配置'),\n v.description('针对 Anthropic Messages API 的兼容性覆写选项'),\n);\n\n// Generic compat schema (union of all compat types)\nexport const CompatSchema = v.pipe(\n v.union([\n v.pipe(\n OpenAICompletionsCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-completions'),\n );\n },\n }),\n ),\n v.pipe(\n OpenAIResponsesCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-responses'),\n );\n },\n }),\n ),\n v.pipe(\n AnthropicMessagesCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'anthropic-messages'),\n );\n },\n }),\n ),\n ]),\n setComponent('object'),\n v.title('兼容配置'),\n v.description(\n '模型 API 兼容性覆写选项,支持 OpenAI Completions、OpenAI Responses、Anthropic Messages 三种格式',\n ),\n);\n\n// --- Input array: (\"text\" | \"image\")[] ---\n\nexport const InputChoiceSchema = v.pipe(\n v.picklist(['text', 'image']),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n);\nexport const InputSchema = v.pipe(\n v.array(InputChoiceSchema),\n v.title('输入类型列表'),\n v.description('该模型支持的用户输入类型,如 text 文本或 image 图片'),\n);\n\n// --- Headers: Record<string, string> ---\n\nconst HeadersSchema = v.pipe(\n v.record(v.string(), v.string()),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头键值对配置'),\n renderConfig({ hidden: true }),\n);\n\n// --- Model schema (non-generic) ---\n\n/** Cost sub-schema */\nconst CostSchema = v.pipe(\n v.optional(\n v.object({\n input: v.pipe(\n v.number(),\n v.title('输入单价'),\n v.description('每 token 输入费用'),\n ),\n output: v.pipe(\n v.number(),\n v.title('输出单价'),\n v.description('每 token 输出费用'),\n ),\n cacheRead: v.pipe(\n v.number(),\n v.title('缓存读取单价'),\n v.description('从缓存读取每 token 的费用'),\n ),\n cacheWrite: v.pipe(\n v.number(),\n v.title('缓存写入单价'),\n v.description('写入缓存每 token 的费用'),\n ),\n }),\n { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n ),\n v.title('费用配置'),\n v.description('模型各操作类型的 token 计价标准'),\n);\n\n/** Thinking level map: Partial<Record<ModelThinkingLevel, string | null>> */\nconst ThinkingLevelMapSchema = v.pipe(\n v.record(\n ModelThinkingLevelSchema,\n v.pipe(\n v.nullish(v.string()),\n v.title('配置值'),\n v.description('对应思考等级的具体配置字符串,null 表示未设置'),\n ),\n ),\n v.title('思考等级配置映射'),\n v.description('各思考等级对应的具体配置参数映射'),\n);\n\n/**\n * Model schema for pi-ai models.\n * Matches `Model<TApi extends Api>` but without generic type preservation\n * at runtime — compat accepts any of the three compat variants via union.\n */\nexport const ModelSchema = v.pipe(\n v.object({\n provider: v.pipe(\n v.optional(v.string(), 'default'),\n v.title('厂商'),\n v.description('模型提供商,如 openai / anthropic / llama'),\n ),\n baseUrl: v.pipe(\n v.string(),\n v.title('基础 URL'),\n v.description('API 请求的基础地址'),\n ),\n reasoning: v.pipe(\n v.optional(v.boolean(), false),\n v.title('支持推理'),\n v.description('该模型是否支持思考/推理模式'),\n ),\n // thinkingLevelMap: v.optional(\n // v.pipe(\n // v.optional(ThinkingLevelMapSchema),\n // v.title('思考等级配置'),\n // v.description('各思考等级的具体参数配置映射'),\n // ),\n // ),\n input: v.pipe(\n v.optional(InputSchema, ['text', 'image']),\n asControl(),\n setComponent('picklist'),\n actions.inputs.set({ multiple: true, options: ['text', 'image'] }),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n ),\n cost: v.pipe(\n CostSchema,\n v.title('费用配置'),\n v.description('模型 token 计价标准'),\n ),\n contextWindow: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('上下文窗口'),\n v.description('模型支持的上下文最大 token 数'),\n ),\n maxTokens: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('最大输出 tokens'),\n v.description('单次请求允许的最大输出 token 数'),\n ),\n headers: v.optional(\n v.pipe(\n v.optional(HeadersSchema),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头配置'),\n ),\n ),\n compat: v.pipe(\n v.optional(CompatSchema, { supportsDeveloperRole: false }),\n v.title('兼容配置'),\n v.description('API 兼容性覆写选项'),\n ),\n }),\n v.title('模型定义'),\n v.description(\n 'pi-ai 模型的核心配置结构,包含模型标识、API 参数、费用及兼容性设置',\n ),\n);\n\nexport type ModelInput = v.InferInput<typeof ModelSchema>;\nexport type ModelOutput = v.InferOutput<typeof ModelSchema>;\n\n// --- ImagesModel schema ---\n\n/** Output array for image models: (\"text\" | \"image\")[] */\n\nexport const ModelConfigDefine = v.pipe(\n v.object({\n provider: v.pipe(KnownProviderDefine, setAlias('provider')),\n model: v.pipe(v.string(), v.title('模型名')),\n name: v.pipe(\n v.optional(v.string()),\n v.title('配置名'),\n v.description('模型的配置名称(默认为模型名)'),\n ),\n /** provider是自定义时使用 */\n apiKey: v.pipe(v.optional(v.string()), v.title('apiKey')),\n config: v.pipe(\n v.optional(ModelSchema),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['..', 'provider']] }).pipe(\n map(\n ({ list: [value] }) =>\n !(\n value === 'openai-completions' ||\n value === 'openai-responses' ||\n value === 'anthropic-messages'\n ),\n ),\n );\n },\n }),\n ),\n }),\n v.transform((item) => ({ ...item, name: item.name ?? item.model })),\n);\n\nexport type ModelConfigInputType = v.InferInput<typeof ModelConfigDefine>;\nexport type ModelConfigOutputType = v.InferOutput<typeof ModelConfigDefine>;\n", "import * as v from 'valibot';\nimport { KnownProvider } from '@earendil-works/pi-ai';\nexport const KnownProviderDefine = v.pipe(\n v.picklist([\n 'amazon-bedrock',\n 'anthropic',\n 'google',\n 'google-vertex',\n 'openai',\n 'azure-openai-responses',\n 'openai-codex',\n 'deepseek',\n 'github-copilot',\n 'xai',\n 'groq',\n 'cerebras',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'mistral',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'huggingface',\n 'fireworks',\n 'together',\n 'opencode',\n 'opencode-go',\n 'kimi-coding',\n 'cloudflare-workers-ai',\n 'cloudflare-ai-gateway',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n 'ant-ling',\n 'nvidia',\n 'zai-coding-cn',\n /** 自定义 */\n 'openai-completions',\n 'openai-responses',\n 'anthropic-messages',\n ]),\n v.title('提供商'),\n v.description(`'openai-completions','openai-responses','anthropic-messages',为自定义提供商`),\n);\n\nexport type KnownProviderType = v.InferOutput<typeof KnownProviderDefine>;\ntype D2T = KnownProvider extends KnownProviderType ? true : false;\ntype T2D = KnownProviderType extends KnownProvider ? true : false;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export * from '../chat/message.define';\nexport * from '../chat/util/get-custom-provider'", "import * as v from 'valibot';\nexport const ChatCompletionContentPartStr = v.object({\n text: v.string(),\n type: v.optional(v.literal('text'), 'text'),\n});\nexport type ChatCompletionContentPartStrType = v.InferOutput<\n typeof ChatCompletionContentPartStr\n>;\n\nexport const ChatCompletionContentPartImage = v.object({\n image_url: v.object({\n url: v.string(),\n }),\n type: v.optional(v.literal('image_url'), 'image_url'),\n});\nexport type ChatCompletionContentPartImageType = v.InferOutput<\n typeof ChatCompletionContentPartImage\n>;\nexport const ChatCompletionContentPart = v.array(\n v.union([ChatCompletionContentPartStr, ChatCompletionContentPartImage]),\n);\nexport const SystemChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const UserChatCompletionContent = ChatCompletionContentPart;\nexport type UserChatCompletionContentType = v.InferOutput<\n typeof UserChatCompletionContent\n>;\nexport const AssistantChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const SystemChatMessage = v.object({\n role: v.optional(v.literal('system'), 'system'),\n content: SystemChatCompletionContent,\n});\nexport type SystemChatMessageType = v.InferOutput<typeof SystemChatMessage>;\nexport const UserChatMessage = v.object({\n role: v.optional(v.literal('user'), 'user'),\n content: UserChatCompletionContent,\n});\nexport type UserChatMessageType = v.InferOutput<typeof UserChatMessage>;\n\nexport const AssistantChatMessage = v.object({\n role: v.optional(v.literal('assistant'), 'assistant'),\n content: AssistantChatCompletionContent,\n thinkContent: v.optional(v.string()),\n});\n\nexport type AssistantChatMessageType = v.InferOutput<\n typeof AssistantChatMessage\n>;\n\nexport const ChatMessageItemDefine = v.union([\n SystemChatMessage,\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport const ChatMessageCommonItemDefine = v.union([\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport type ChatMessageItemType = v.InferOutput<typeof ChatMessageItemDefine>;\nexport const ChatMessageListDefine = v.array(ChatMessageItemDefine);\n\nexport type ChatMessageListOutputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\nexport type ChatMessageListInputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\n", "import * as v from 'valibot';\n\nimport { getModel, Model } from '@earendil-works/pi-ai';\nimport { KnownProviderDefine } from '../provider.define';\nimport {\n actions,\n asControl,\n hideWhen,\n renderConfig,\n setAlias,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map } from 'rxjs';\n\nfunction getCustomProvider<\n T extends 'openai-completions' | 'openai-responses' | 'anthropic-messages',\n>(\n compat: T,\n model: string,\n name: string,\n input: Omit<Model<T>, 'api' | 'id' | 'name'>,\n) {\n return { ...input, id: model, api: compat, name } satisfies Model<T>;\n}\nexport function getModelConfig(input: ModelConfigInputType) {\n if (input.provider === ('faux' as any)) {\n return {\n model: input.config as Model<any>,\n config: input as ModelConfigOutputType,\n };\n }\n const config = v.parse(ModelConfigDefine, input);\n if (\n config.provider === 'openai-completions' ||\n config.provider === 'openai-responses' ||\n config.provider === 'anthropic-messages'\n ) {\n return {\n model: getCustomProvider(\n config.provider,\n config.model,\n config.name,\n config.config!,\n ),\n config: config,\n };\n }\n\n return {\n model: getModel(config.provider, config.model as any as never),\n config: config,\n };\n}\nexport const ThinkingLevelSchema = v.pipe(\n v.picklist(['minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('思考等级'),\n v.description('模型思考的详细程度,从最小到最大'),\n);\n\nexport const ModelThinkingLevelSchema = v.pipe(\n v.picklist(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('模型思考等级'),\n v.description('关闭或设置模型思考的详细程度'),\n);\n\n// --- Compat schemas (conditional on TApi) ---\n\n/** OpenAI Completions compatibility overrides */\nexport const OpenAICompletionsCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsStore: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持存储'),\n v.description('是否支持服务端会话存储'),\n ),\n ),\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n supportsReasoningEffort: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持推理努力'),\n v.description('是否支持 reasoning_effort 参数'),\n ),\n ),\n supportsUsageInStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title('流式用量'),\n v.description('流式输出中是否返回 usage 信息'),\n ),\n ),\n maxTokensField: v.optional(\n v.pipe(\n v.picklist(['max_completion_tokens', 'max_tokens']),\n v.title('最大 token 字段名'),\n v.description('指定最大 token 参数使用的是哪个字段名'),\n ),\n ),\n requiresToolResultName: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要工具结果名称'),\n v.description('是否要求工具结果消息包含 name 字段'),\n ),\n ),\n requiresAssistantAfterToolResult: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要助手回复'),\n v.description('工具结果后是否需要助手消息跟进'),\n ),\n ),\n requiresThinkingAsText: v.optional(\n v.pipe(\n v.boolean(),\n v.title('思考转文本'),\n v.description('是否将思考过程作为普通文本发送'),\n ),\n ),\n requiresReasoningContentOnAssistantMessages: v.optional(\n v.pipe(\n v.boolean(),\n v.title('推理内容在助手消息中'),\n v.description('是否在助手消息中包含推理内容'),\n ),\n ),\n thinkingFormat: v.optional(\n v.pipe(\n v.picklist([\n 'openai',\n 'openrouter',\n 'deepseek',\n 'together',\n 'zai',\n 'qwen',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ]),\n v.title('思考格式'),\n v.description('指定 thinking 标签的序列化格式'),\n ),\n ),\n openRouterRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('OpenRouter 路由'),\n v.description('自定义 OpenRouter 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n vercelGatewayRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('Vercel Gateway 路由'),\n v.description('自定义 Vercel AI Gateway 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n zaiToolStream: v.optional(\n v.pipe(\n v.boolean(),\n v.title('ZAI 工具流式'),\n v.description('是否启用 ZAI 平台工具调用的流式输出'),\n ),\n ),\n supportsStrictMode: v.optional(\n v.pipe(\n v.boolean(),\n v.title('严格模式'),\n v.description('是否支持工具的 JSON Schema 严格校验'),\n ),\n ),\n cacheControlFormat: v.optional(\n v.pipe(\n v.literal('anthropic'),\n v.title('缓存控制格式'),\n v.description('指定缓存控制的语法格式'),\n renderConfig({ hidden: true }),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Completions 兼容配置'),\n v.description('针对 OpenAI Completions API 的兼容性覆写选项'),\n);\n\n/** OpenAI Responses compatibility overrides */\nexport const OpenAIResponsesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n sendSessionIdHeader: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话 ID 标头'),\n v.description('是否在请求中携带 X-Session-ID 标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Responses 兼容配置'),\n v.description('针对 OpenAI Responses API 的兼容性覆写选项'),\n);\n\n/** Anthropic Messages compatibility overrides */\nexport const AnthropicMessagesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsEagerToolInputStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title(' eagerly 工具流式'),\n v.description('是否支持工具调用的 eager 模式流式输出'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsCacheControlOnTools: v.optional(\n v.pipe(\n v.boolean(),\n v.title('工具缓存控制'),\n v.description('是否支持在 tool_use 消息中使用 cache_control'),\n ),\n ),\n supportsTemperature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持温度参数'),\n v.description('模型/接口是否支持 temperature 参数'),\n ),\n ),\n forceAdaptiveThinking: v.optional(\n v.pipe(\n v.boolean(),\n v.title('强制自适应思考'),\n v.description('是否强制启用 adaptive thinking 模式'),\n ),\n ),\n allowEmptySignature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('允许空签名'),\n v.description('是否允许工具调用不指定签名(sha256)'),\n ),\n ),\n }),\n ),\n v.title('Anthropic Messages 兼容配置'),\n v.description('针对 Anthropic Messages API 的兼容性覆写选项'),\n);\n\n// Generic compat schema (union of all compat types)\nexport const CompatSchema = v.pipe(\n v.union([\n v.pipe(\n OpenAICompletionsCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-completions'),\n );\n },\n }),\n ),\n v.pipe(\n OpenAIResponsesCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-responses'),\n );\n },\n }),\n ),\n v.pipe(\n AnthropicMessagesCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'anthropic-messages'),\n );\n },\n }),\n ),\n ]),\n setComponent('object'),\n v.title('兼容配置'),\n v.description(\n '模型 API 兼容性覆写选项,支持 OpenAI Completions、OpenAI Responses、Anthropic Messages 三种格式',\n ),\n);\n\n// --- Input array: (\"text\" | \"image\")[] ---\n\nexport const InputChoiceSchema = v.pipe(\n v.picklist(['text', 'image']),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n);\nexport const InputSchema = v.pipe(\n v.array(InputChoiceSchema),\n v.title('输入类型列表'),\n v.description('该模型支持的用户输入类型,如 text 文本或 image 图片'),\n);\n\n// --- Headers: Record<string, string> ---\n\nconst HeadersSchema = v.pipe(\n v.record(v.string(), v.string()),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头键值对配置'),\n renderConfig({ hidden: true }),\n);\n\n// --- Model schema (non-generic) ---\n\n/** Cost sub-schema */\nconst CostSchema = v.pipe(\n v.optional(\n v.object({\n input: v.pipe(\n v.number(),\n v.title('输入单价'),\n v.description('每 token 输入费用'),\n ),\n output: v.pipe(\n v.number(),\n v.title('输出单价'),\n v.description('每 token 输出费用'),\n ),\n cacheRead: v.pipe(\n v.number(),\n v.title('缓存读取单价'),\n v.description('从缓存读取每 token 的费用'),\n ),\n cacheWrite: v.pipe(\n v.number(),\n v.title('缓存写入单价'),\n v.description('写入缓存每 token 的费用'),\n ),\n }),\n { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n ),\n v.title('费用配置'),\n v.description('模型各操作类型的 token 计价标准'),\n);\n\n/** Thinking level map: Partial<Record<ModelThinkingLevel, string | null>> */\nconst ThinkingLevelMapSchema = v.pipe(\n v.record(\n ModelThinkingLevelSchema,\n v.pipe(\n v.nullish(v.string()),\n v.title('配置值'),\n v.description('对应思考等级的具体配置字符串,null 表示未设置'),\n ),\n ),\n v.title('思考等级配置映射'),\n v.description('各思考等级对应的具体配置参数映射'),\n);\n\n/**\n * Model schema for pi-ai models.\n * Matches `Model<TApi extends Api>` but without generic type preservation\n * at runtime — compat accepts any of the three compat variants via union.\n */\nexport const ModelSchema = v.pipe(\n v.object({\n provider: v.pipe(\n v.optional(v.string(), 'default'),\n v.title('厂商'),\n v.description('模型提供商,如 openai / anthropic / llama'),\n ),\n baseUrl: v.pipe(\n v.string(),\n v.title('基础 URL'),\n v.description('API 请求的基础地址'),\n ),\n reasoning: v.pipe(\n v.optional(v.boolean(), false),\n v.title('支持推理'),\n v.description('该模型是否支持思考/推理模式'),\n ),\n // thinkingLevelMap: v.optional(\n // v.pipe(\n // v.optional(ThinkingLevelMapSchema),\n // v.title('思考等级配置'),\n // v.description('各思考等级的具体参数配置映射'),\n // ),\n // ),\n input: v.pipe(\n v.optional(InputSchema, ['text', 'image']),\n asControl(),\n setComponent('picklist'),\n actions.inputs.set({ multiple: true, options: ['text', 'image'] }),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n ),\n cost: v.pipe(\n CostSchema,\n renderConfig({ hidden: true }),\n v.title('费用配置'),\n v.description('模型 token 计价标准'),\n ),\n contextWindow: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('上下文窗口'),\n v.description('模型支持的上下文最大 token 数'),\n ),\n maxTokens: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('最大输出 tokens'),\n v.description('单次请求允许的最大输出 token 数'),\n ),\n headers: v.optional(\n v.pipe(\n v.optional(HeadersSchema),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头配置'),\n ),\n ),\n compat: v.pipe(\n v.optional(CompatSchema, { supportsDeveloperRole: false }),\n v.title('兼容配置'),\n v.description('API 兼容性覆写选项'),\n ),\n }),\n v.title('模型定义'),\n v.description(\n 'pi-ai 模型的核心配置结构,包含模型标识、API 参数、费用及兼容性设置',\n ),\n);\n\nexport type ModelInput = v.InferInput<typeof ModelSchema>;\nexport type ModelOutput = v.InferOutput<typeof ModelSchema>;\n\n// --- ImagesModel schema ---\n\n/** Output array for image models: (\"text\" | \"image\")[] */\n\nexport const ModelConfigDefine = v.pipe(\n v.object({\n provider: v.pipe(KnownProviderDefine, setAlias('provider')),\n model: v.pipe(v.string(), v.title('模型名')),\n name: v.pipe(\n v.optional(v.string()),\n v.title('配置名'),\n v.description('模型的配置名称(默认为模型名)'),\n ),\n /** provider是自定义时使用 */\n apiKey: v.pipe(v.optional(v.string()), v.title('apiKey')),\n config: v.pipe(\n v.optional(ModelSchema),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['..', 'provider']] }).pipe(\n map(\n ({ list: [value] }) =>\n !(\n value === 'openai-completions' ||\n value === 'openai-responses' ||\n value === 'anthropic-messages'\n ),\n ),\n );\n },\n }),\n ),\n }),\n v.transform((item) => ({ ...item, name: item.name ?? item.model })),\n);\n\nexport type ModelConfigInputType = v.InferInput<typeof ModelConfigDefine>;\nexport type ModelConfigOutputType = v.InferOutput<typeof ModelConfigDefine>;\n", "import * as v from 'valibot';\nimport { KnownProvider } from '@earendil-works/pi-ai';\nexport const KnownProviderDefine = v.pipe(\n v.picklist([\n 'amazon-bedrock',\n 'anthropic',\n 'google',\n 'google-vertex',\n 'openai',\n 'azure-openai-responses',\n 'openai-codex',\n 'deepseek',\n 'github-copilot',\n 'xai',\n 'groq',\n 'cerebras',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'mistral',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'huggingface',\n 'fireworks',\n 'together',\n 'opencode',\n 'opencode-go',\n 'kimi-coding',\n 'cloudflare-workers-ai',\n 'cloudflare-ai-gateway',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n 'ant-ling',\n 'nvidia',\n 'zai-coding-cn',\n /** 自定义 */\n 'openai-completions',\n 'openai-responses',\n 'anthropic-messages',\n ]),\n v.title('提供商'),\n v.description(`'openai-completions','openai-responses','anthropic-messages',为自定义提供商`),\n);\n\nexport type KnownProviderType = v.InferOutput<typeof KnownProviderDefine>;\ntype D2T = KnownProvider extends KnownProviderType ? true : false;\ntype T2D = KnownProviderType extends KnownProvider ? true : false;\n"],
5
+ "mappings": "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",
6
6
  "names": ["v", "v"]
7
7
  }
package/define/index.mjs CHANGED
@@ -373,6 +373,9 @@ var CompatSchema = v3.pipe(
373
373
  v3.union([
374
374
  v3.pipe(
375
375
  OpenAICompletionsCompatSchema,
376
+ actions.wrappers.patch([
377
+ { type: "div", attributes: { class: "grid gap-2" } }
378
+ ]),
376
379
  hideWhen({
377
380
  disabled: true,
378
381
  listen(fn, field) {
@@ -384,6 +387,9 @@ var CompatSchema = v3.pipe(
384
387
  ),
385
388
  v3.pipe(
386
389
  OpenAIResponsesCompatSchema,
390
+ actions.wrappers.patch([
391
+ { type: "div", attributes: { class: "grid gap-2" } }
392
+ ]),
387
393
  hideWhen({
388
394
  disabled: true,
389
395
  listen(fn, field) {
@@ -395,6 +401,9 @@ var CompatSchema = v3.pipe(
395
401
  ),
396
402
  v3.pipe(
397
403
  AnthropicMessagesCompatSchema,
404
+ actions.wrappers.patch([
405
+ { type: "div", attributes: { class: "grid gap-2" } }
406
+ ]),
398
407
  hideWhen({
399
408
  disabled: true,
400
409
  listen(fn, field) {
@@ -502,6 +511,7 @@ var ModelSchema = v3.pipe(
502
511
  ),
503
512
  cost: v3.pipe(
504
513
  CostSchema,
514
+ renderConfig({ hidden: true }),
505
515
  v3.title("费用配置"),
506
516
  v3.description("模型 token 计价标准")
507
517
  ),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/openai/chat/message.define.ts", "../../../packages/openai/chat/util/get-custom-provider.ts", "../../../packages/openai/chat/provider.define.ts"],
4
- "sourcesContent": ["import * as v from 'valibot';\nexport const ChatCompletionContentPartStr = v.object({\n text: v.string(),\n type: v.optional(v.literal('text'), 'text'),\n});\nexport type ChatCompletionContentPartStrType = v.InferOutput<\n typeof ChatCompletionContentPartStr\n>;\n\nexport const ChatCompletionContentPartImage = v.object({\n image_url: v.object({\n url: v.string(),\n }),\n type: v.optional(v.literal('image_url'), 'image_url'),\n});\nexport type ChatCompletionContentPartImageType = v.InferOutput<\n typeof ChatCompletionContentPartImage\n>;\nexport const ChatCompletionContentPart = v.array(\n v.union([ChatCompletionContentPartStr, ChatCompletionContentPartImage]),\n);\nexport const SystemChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const UserChatCompletionContent = ChatCompletionContentPart;\nexport type UserChatCompletionContentType = v.InferOutput<\n typeof UserChatCompletionContent\n>;\nexport const AssistantChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const SystemChatMessage = v.object({\n role: v.optional(v.literal('system'), 'system'),\n content: SystemChatCompletionContent,\n});\nexport type SystemChatMessageType = v.InferOutput<typeof SystemChatMessage>;\nexport const UserChatMessage = v.object({\n role: v.optional(v.literal('user'), 'user'),\n content: UserChatCompletionContent,\n});\nexport type UserChatMessageType = v.InferOutput<typeof UserChatMessage>;\n\nexport const AssistantChatMessage = v.object({\n role: v.optional(v.literal('assistant'), 'assistant'),\n content: AssistantChatCompletionContent,\n thinkContent: v.optional(v.string()),\n});\n\nexport type AssistantChatMessageType = v.InferOutput<\n typeof AssistantChatMessage\n>;\n\nexport const ChatMessageItemDefine = v.union([\n SystemChatMessage,\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport const ChatMessageCommonItemDefine = v.union([\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport type ChatMessageItemType = v.InferOutput<typeof ChatMessageItemDefine>;\nexport const ChatMessageListDefine = v.array(ChatMessageItemDefine);\n\nexport type ChatMessageListOutputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\nexport type ChatMessageListInputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\n", "import * as v from 'valibot';\n\nimport { getModel, Model } from '@earendil-works/pi-ai';\nimport { KnownProviderDefine } from '../provider.define';\nimport {\n actions,\n asControl,\n hideWhen,\n renderConfig,\n setAlias,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map } from 'rxjs';\n\nfunction getCustomProvider<\n T extends 'openai-completions' | 'openai-responses' | 'anthropic-messages',\n>(\n compat: T,\n model: string,\n name: string,\n input: Omit<Model<T>, 'api' | 'id' | 'name'>,\n) {\n return { ...input, id: model, api: compat, name } satisfies Model<T>;\n}\nexport function getModelConfig(input: ModelConfigInputType) {\n if (input.provider === ('faux' as any)) {\n return {\n model: input.config as Model<any>,\n config: input as ModelConfigOutputType,\n };\n }\n const config = v.parse(ModelConfigDefine, input);\n if (\n config.provider === 'openai-completions' ||\n config.provider === 'openai-responses' ||\n config.provider === 'anthropic-messages'\n ) {\n return {\n model: getCustomProvider(\n config.provider,\n config.model,\n config.name,\n config.config!,\n ),\n config: config,\n };\n }\n\n return {\n model: getModel(config.provider, config.model as any as never),\n config: config,\n };\n}\nexport const ThinkingLevelSchema = v.pipe(\n v.picklist(['minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('思考等级'),\n v.description('模型思考的详细程度,从最小到最大'),\n);\n\nexport const ModelThinkingLevelSchema = v.pipe(\n v.picklist(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('模型思考等级'),\n v.description('关闭或设置模型思考的详细程度'),\n);\n\n// --- Compat schemas (conditional on TApi) ---\n\n/** OpenAI Completions compatibility overrides */\nexport const OpenAICompletionsCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsStore: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持存储'),\n v.description('是否支持服务端会话存储'),\n ),\n ),\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n supportsReasoningEffort: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持推理努力'),\n v.description('是否支持 reasoning_effort 参数'),\n ),\n ),\n supportsUsageInStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title('流式用量'),\n v.description('流式输出中是否返回 usage 信息'),\n ),\n ),\n maxTokensField: v.optional(\n v.pipe(\n v.picklist(['max_completion_tokens', 'max_tokens']),\n v.title('最大 token 字段名'),\n v.description('指定最大 token 参数使用的是哪个字段名'),\n ),\n ),\n requiresToolResultName: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要工具结果名称'),\n v.description('是否要求工具结果消息包含 name 字段'),\n ),\n ),\n requiresAssistantAfterToolResult: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要助手回复'),\n v.description('工具结果后是否需要助手消息跟进'),\n ),\n ),\n requiresThinkingAsText: v.optional(\n v.pipe(\n v.boolean(),\n v.title('思考转文本'),\n v.description('是否将思考过程作为普通文本发送'),\n ),\n ),\n requiresReasoningContentOnAssistantMessages: v.optional(\n v.pipe(\n v.boolean(),\n v.title('推理内容在助手消息中'),\n v.description('是否在助手消息中包含推理内容'),\n ),\n ),\n thinkingFormat: v.optional(\n v.pipe(\n v.picklist([\n 'openai',\n 'openrouter',\n 'deepseek',\n 'together',\n 'zai',\n 'qwen',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ]),\n v.title('思考格式'),\n v.description('指定 thinking 标签的序列化格式'),\n ),\n ),\n openRouterRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('OpenRouter 路由'),\n v.description('自定义 OpenRouter 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n vercelGatewayRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('Vercel Gateway 路由'),\n v.description('自定义 Vercel AI Gateway 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n zaiToolStream: v.optional(\n v.pipe(\n v.boolean(),\n v.title('ZAI 工具流式'),\n v.description('是否启用 ZAI 平台工具调用的流式输出'),\n ),\n ),\n supportsStrictMode: v.optional(\n v.pipe(\n v.boolean(),\n v.title('严格模式'),\n v.description('是否支持工具的 JSON Schema 严格校验'),\n ),\n ),\n cacheControlFormat: v.optional(\n v.pipe(\n v.literal('anthropic'),\n v.title('缓存控制格式'),\n v.description('指定缓存控制的语法格式'),\n renderConfig({ hidden: true }),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Completions 兼容配置'),\n v.description('针对 OpenAI Completions API 的兼容性覆写选项'),\n);\n\n/** OpenAI Responses compatibility overrides */\nexport const OpenAIResponsesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n sendSessionIdHeader: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话 ID 标头'),\n v.description('是否在请求中携带 X-Session-ID 标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Responses 兼容配置'),\n v.description('针对 OpenAI Responses API 的兼容性覆写选项'),\n);\n\n/** Anthropic Messages compatibility overrides */\nexport const AnthropicMessagesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsEagerToolInputStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title(' eagerly 工具流式'),\n v.description('是否支持工具调用的 eager 模式流式输出'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsCacheControlOnTools: v.optional(\n v.pipe(\n v.boolean(),\n v.title('工具缓存控制'),\n v.description('是否支持在 tool_use 消息中使用 cache_control'),\n ),\n ),\n supportsTemperature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持温度参数'),\n v.description('模型/接口是否支持 temperature 参数'),\n ),\n ),\n forceAdaptiveThinking: v.optional(\n v.pipe(\n v.boolean(),\n v.title('强制自适应思考'),\n v.description('是否强制启用 adaptive thinking 模式'),\n ),\n ),\n allowEmptySignature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('允许空签名'),\n v.description('是否允许工具调用不指定签名(sha256)'),\n ),\n ),\n }),\n ),\n v.title('Anthropic Messages 兼容配置'),\n v.description('针对 Anthropic Messages API 的兼容性覆写选项'),\n);\n\n// Generic compat schema (union of all compat types)\nexport const CompatSchema = v.pipe(\n v.union([\n v.pipe(\n OpenAICompletionsCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-completions'),\n );\n },\n }),\n ),\n v.pipe(\n OpenAIResponsesCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-responses'),\n );\n },\n }),\n ),\n v.pipe(\n AnthropicMessagesCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'anthropic-messages'),\n );\n },\n }),\n ),\n ]),\n setComponent('object'),\n v.title('兼容配置'),\n v.description(\n '模型 API 兼容性覆写选项,支持 OpenAI Completions、OpenAI Responses、Anthropic Messages 三种格式',\n ),\n);\n\n// --- Input array: (\"text\" | \"image\")[] ---\n\nexport const InputChoiceSchema = v.pipe(\n v.picklist(['text', 'image']),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n);\nexport const InputSchema = v.pipe(\n v.array(InputChoiceSchema),\n v.title('输入类型列表'),\n v.description('该模型支持的用户输入类型,如 text 文本或 image 图片'),\n);\n\n// --- Headers: Record<string, string> ---\n\nconst HeadersSchema = v.pipe(\n v.record(v.string(), v.string()),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头键值对配置'),\n renderConfig({ hidden: true }),\n);\n\n// --- Model schema (non-generic) ---\n\n/** Cost sub-schema */\nconst CostSchema = v.pipe(\n v.optional(\n v.object({\n input: v.pipe(\n v.number(),\n v.title('输入单价'),\n v.description('每 token 输入费用'),\n ),\n output: v.pipe(\n v.number(),\n v.title('输出单价'),\n v.description('每 token 输出费用'),\n ),\n cacheRead: v.pipe(\n v.number(),\n v.title('缓存读取单价'),\n v.description('从缓存读取每 token 的费用'),\n ),\n cacheWrite: v.pipe(\n v.number(),\n v.title('缓存写入单价'),\n v.description('写入缓存每 token 的费用'),\n ),\n }),\n { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n ),\n v.title('费用配置'),\n v.description('模型各操作类型的 token 计价标准'),\n);\n\n/** Thinking level map: Partial<Record<ModelThinkingLevel, string | null>> */\nconst ThinkingLevelMapSchema = v.pipe(\n v.record(\n ModelThinkingLevelSchema,\n v.pipe(\n v.nullish(v.string()),\n v.title('配置值'),\n v.description('对应思考等级的具体配置字符串,null 表示未设置'),\n ),\n ),\n v.title('思考等级配置映射'),\n v.description('各思考等级对应的具体配置参数映射'),\n);\n\n/**\n * Model schema for pi-ai models.\n * Matches `Model<TApi extends Api>` but without generic type preservation\n * at runtime — compat accepts any of the three compat variants via union.\n */\nexport const ModelSchema = v.pipe(\n v.object({\n provider: v.pipe(\n v.optional(v.string(), 'default'),\n v.title('厂商'),\n v.description('模型提供商,如 openai / anthropic / llama'),\n ),\n baseUrl: v.pipe(\n v.string(),\n v.title('基础 URL'),\n v.description('API 请求的基础地址'),\n ),\n reasoning: v.pipe(\n v.optional(v.boolean(), false),\n v.title('支持推理'),\n v.description('该模型是否支持思考/推理模式'),\n ),\n // thinkingLevelMap: v.optional(\n // v.pipe(\n // v.optional(ThinkingLevelMapSchema),\n // v.title('思考等级配置'),\n // v.description('各思考等级的具体参数配置映射'),\n // ),\n // ),\n input: v.pipe(\n v.optional(InputSchema, ['text', 'image']),\n asControl(),\n setComponent('picklist'),\n actions.inputs.set({ multiple: true, options: ['text', 'image'] }),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n ),\n cost: v.pipe(\n CostSchema,\n v.title('费用配置'),\n v.description('模型 token 计价标准'),\n ),\n contextWindow: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('上下文窗口'),\n v.description('模型支持的上下文最大 token 数'),\n ),\n maxTokens: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('最大输出 tokens'),\n v.description('单次请求允许的最大输出 token 数'),\n ),\n headers: v.optional(\n v.pipe(\n v.optional(HeadersSchema),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头配置'),\n ),\n ),\n compat: v.pipe(\n v.optional(CompatSchema, { supportsDeveloperRole: false }),\n v.title('兼容配置'),\n v.description('API 兼容性覆写选项'),\n ),\n }),\n v.title('模型定义'),\n v.description(\n 'pi-ai 模型的核心配置结构,包含模型标识、API 参数、费用及兼容性设置',\n ),\n);\n\nexport type ModelInput = v.InferInput<typeof ModelSchema>;\nexport type ModelOutput = v.InferOutput<typeof ModelSchema>;\n\n// --- ImagesModel schema ---\n\n/** Output array for image models: (\"text\" | \"image\")[] */\n\nexport const ModelConfigDefine = v.pipe(\n v.object({\n provider: v.pipe(KnownProviderDefine, setAlias('provider')),\n model: v.pipe(v.string(), v.title('模型名')),\n name: v.pipe(\n v.optional(v.string()),\n v.title('配置名'),\n v.description('模型的配置名称(默认为模型名)'),\n ),\n /** provider是自定义时使用 */\n apiKey: v.pipe(v.optional(v.string()), v.title('apiKey')),\n config: v.pipe(\n v.optional(ModelSchema),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['..', 'provider']] }).pipe(\n map(\n ({ list: [value] }) =>\n !(\n value === 'openai-completions' ||\n value === 'openai-responses' ||\n value === 'anthropic-messages'\n ),\n ),\n );\n },\n }),\n ),\n }),\n v.transform((item) => ({ ...item, name: item.name ?? item.model })),\n);\n\nexport type ModelConfigInputType = v.InferInput<typeof ModelConfigDefine>;\nexport type ModelConfigOutputType = v.InferOutput<typeof ModelConfigDefine>;\n", "import * as v from 'valibot';\nimport { KnownProvider } from '@earendil-works/pi-ai';\nexport const KnownProviderDefine = v.pipe(\n v.picklist([\n 'amazon-bedrock',\n 'anthropic',\n 'google',\n 'google-vertex',\n 'openai',\n 'azure-openai-responses',\n 'openai-codex',\n 'deepseek',\n 'github-copilot',\n 'xai',\n 'groq',\n 'cerebras',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'mistral',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'huggingface',\n 'fireworks',\n 'together',\n 'opencode',\n 'opencode-go',\n 'kimi-coding',\n 'cloudflare-workers-ai',\n 'cloudflare-ai-gateway',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n 'ant-ling',\n 'nvidia',\n 'zai-coding-cn',\n /** 自定义 */\n 'openai-completions',\n 'openai-responses',\n 'anthropic-messages',\n ]),\n v.title('提供商'),\n v.description(`'openai-completions','openai-responses','anthropic-messages',为自定义提供商`),\n);\n\nexport type KnownProviderType = v.InferOutput<typeof KnownProviderDefine>;\ntype D2T = KnownProvider extends KnownProviderType ? true : false;\ntype T2D = KnownProviderType extends KnownProvider ? true : false;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as v from 'valibot';\nexport const ChatCompletionContentPartStr = v.object({\n text: v.string(),\n type: v.optional(v.literal('text'), 'text'),\n});\nexport type ChatCompletionContentPartStrType = v.InferOutput<\n typeof ChatCompletionContentPartStr\n>;\n\nexport const ChatCompletionContentPartImage = v.object({\n image_url: v.object({\n url: v.string(),\n }),\n type: v.optional(v.literal('image_url'), 'image_url'),\n});\nexport type ChatCompletionContentPartImageType = v.InferOutput<\n typeof ChatCompletionContentPartImage\n>;\nexport const ChatCompletionContentPart = v.array(\n v.union([ChatCompletionContentPartStr, ChatCompletionContentPartImage]),\n);\nexport const SystemChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const UserChatCompletionContent = ChatCompletionContentPart;\nexport type UserChatCompletionContentType = v.InferOutput<\n typeof UserChatCompletionContent\n>;\nexport const AssistantChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const SystemChatMessage = v.object({\n role: v.optional(v.literal('system'), 'system'),\n content: SystemChatCompletionContent,\n});\nexport type SystemChatMessageType = v.InferOutput<typeof SystemChatMessage>;\nexport const UserChatMessage = v.object({\n role: v.optional(v.literal('user'), 'user'),\n content: UserChatCompletionContent,\n});\nexport type UserChatMessageType = v.InferOutput<typeof UserChatMessage>;\n\nexport const AssistantChatMessage = v.object({\n role: v.optional(v.literal('assistant'), 'assistant'),\n content: AssistantChatCompletionContent,\n thinkContent: v.optional(v.string()),\n});\n\nexport type AssistantChatMessageType = v.InferOutput<\n typeof AssistantChatMessage\n>;\n\nexport const ChatMessageItemDefine = v.union([\n SystemChatMessage,\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport const ChatMessageCommonItemDefine = v.union([\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport type ChatMessageItemType = v.InferOutput<typeof ChatMessageItemDefine>;\nexport const ChatMessageListDefine = v.array(ChatMessageItemDefine);\n\nexport type ChatMessageListOutputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\nexport type ChatMessageListInputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\n", "import * as v from 'valibot';\n\nimport { getModel, Model } from '@earendil-works/pi-ai';\nimport { KnownProviderDefine } from '../provider.define';\nimport {\n actions,\n asControl,\n hideWhen,\n renderConfig,\n setAlias,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map } from 'rxjs';\n\nfunction getCustomProvider<\n T extends 'openai-completions' | 'openai-responses' | 'anthropic-messages',\n>(\n compat: T,\n model: string,\n name: string,\n input: Omit<Model<T>, 'api' | 'id' | 'name'>,\n) {\n return { ...input, id: model, api: compat, name } satisfies Model<T>;\n}\nexport function getModelConfig(input: ModelConfigInputType) {\n if (input.provider === ('faux' as any)) {\n return {\n model: input.config as Model<any>,\n config: input as ModelConfigOutputType,\n };\n }\n const config = v.parse(ModelConfigDefine, input);\n if (\n config.provider === 'openai-completions' ||\n config.provider === 'openai-responses' ||\n config.provider === 'anthropic-messages'\n ) {\n return {\n model: getCustomProvider(\n config.provider,\n config.model,\n config.name,\n config.config!,\n ),\n config: config,\n };\n }\n\n return {\n model: getModel(config.provider, config.model as any as never),\n config: config,\n };\n}\nexport const ThinkingLevelSchema = v.pipe(\n v.picklist(['minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('思考等级'),\n v.description('模型思考的详细程度,从最小到最大'),\n);\n\nexport const ModelThinkingLevelSchema = v.pipe(\n v.picklist(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('模型思考等级'),\n v.description('关闭或设置模型思考的详细程度'),\n);\n\n// --- Compat schemas (conditional on TApi) ---\n\n/** OpenAI Completions compatibility overrides */\nexport const OpenAICompletionsCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsStore: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持存储'),\n v.description('是否支持服务端会话存储'),\n ),\n ),\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n supportsReasoningEffort: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持推理努力'),\n v.description('是否支持 reasoning_effort 参数'),\n ),\n ),\n supportsUsageInStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title('流式用量'),\n v.description('流式输出中是否返回 usage 信息'),\n ),\n ),\n maxTokensField: v.optional(\n v.pipe(\n v.picklist(['max_completion_tokens', 'max_tokens']),\n v.title('最大 token 字段名'),\n v.description('指定最大 token 参数使用的是哪个字段名'),\n ),\n ),\n requiresToolResultName: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要工具结果名称'),\n v.description('是否要求工具结果消息包含 name 字段'),\n ),\n ),\n requiresAssistantAfterToolResult: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要助手回复'),\n v.description('工具结果后是否需要助手消息跟进'),\n ),\n ),\n requiresThinkingAsText: v.optional(\n v.pipe(\n v.boolean(),\n v.title('思考转文本'),\n v.description('是否将思考过程作为普通文本发送'),\n ),\n ),\n requiresReasoningContentOnAssistantMessages: v.optional(\n v.pipe(\n v.boolean(),\n v.title('推理内容在助手消息中'),\n v.description('是否在助手消息中包含推理内容'),\n ),\n ),\n thinkingFormat: v.optional(\n v.pipe(\n v.picklist([\n 'openai',\n 'openrouter',\n 'deepseek',\n 'together',\n 'zai',\n 'qwen',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ]),\n v.title('思考格式'),\n v.description('指定 thinking 标签的序列化格式'),\n ),\n ),\n openRouterRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('OpenRouter 路由'),\n v.description('自定义 OpenRouter 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n vercelGatewayRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('Vercel Gateway 路由'),\n v.description('自定义 Vercel AI Gateway 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n zaiToolStream: v.optional(\n v.pipe(\n v.boolean(),\n v.title('ZAI 工具流式'),\n v.description('是否启用 ZAI 平台工具调用的流式输出'),\n ),\n ),\n supportsStrictMode: v.optional(\n v.pipe(\n v.boolean(),\n v.title('严格模式'),\n v.description('是否支持工具的 JSON Schema 严格校验'),\n ),\n ),\n cacheControlFormat: v.optional(\n v.pipe(\n v.literal('anthropic'),\n v.title('缓存控制格式'),\n v.description('指定缓存控制的语法格式'),\n renderConfig({ hidden: true }),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Completions 兼容配置'),\n v.description('针对 OpenAI Completions API 的兼容性覆写选项'),\n);\n\n/** OpenAI Responses compatibility overrides */\nexport const OpenAIResponsesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n sendSessionIdHeader: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话 ID 标头'),\n v.description('是否在请求中携带 X-Session-ID 标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Responses 兼容配置'),\n v.description('针对 OpenAI Responses API 的兼容性覆写选项'),\n);\n\n/** Anthropic Messages compatibility overrides */\nexport const AnthropicMessagesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsEagerToolInputStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title(' eagerly 工具流式'),\n v.description('是否支持工具调用的 eager 模式流式输出'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsCacheControlOnTools: v.optional(\n v.pipe(\n v.boolean(),\n v.title('工具缓存控制'),\n v.description('是否支持在 tool_use 消息中使用 cache_control'),\n ),\n ),\n supportsTemperature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持温度参数'),\n v.description('模型/接口是否支持 temperature 参数'),\n ),\n ),\n forceAdaptiveThinking: v.optional(\n v.pipe(\n v.boolean(),\n v.title('强制自适应思考'),\n v.description('是否强制启用 adaptive thinking 模式'),\n ),\n ),\n allowEmptySignature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('允许空签名'),\n v.description('是否允许工具调用不指定签名(sha256)'),\n ),\n ),\n }),\n ),\n v.title('Anthropic Messages 兼容配置'),\n v.description('针对 Anthropic Messages API 的兼容性覆写选项'),\n);\n\n// Generic compat schema (union of all compat types)\nexport const CompatSchema = v.pipe(\n v.union([\n v.pipe(\n OpenAICompletionsCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-completions'),\n );\n },\n }),\n ),\n v.pipe(\n OpenAIResponsesCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-responses'),\n );\n },\n }),\n ),\n v.pipe(\n AnthropicMessagesCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'anthropic-messages'),\n );\n },\n }),\n ),\n ]),\n setComponent('object'),\n v.title('兼容配置'),\n v.description(\n '模型 API 兼容性覆写选项,支持 OpenAI Completions、OpenAI Responses、Anthropic Messages 三种格式',\n ),\n);\n\n// --- Input array: (\"text\" | \"image\")[] ---\n\nexport const InputChoiceSchema = v.pipe(\n v.picklist(['text', 'image']),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n);\nexport const InputSchema = v.pipe(\n v.array(InputChoiceSchema),\n v.title('输入类型列表'),\n v.description('该模型支持的用户输入类型,如 text 文本或 image 图片'),\n);\n\n// --- Headers: Record<string, string> ---\n\nconst HeadersSchema = v.pipe(\n v.record(v.string(), v.string()),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头键值对配置'),\n renderConfig({ hidden: true }),\n);\n\n// --- Model schema (non-generic) ---\n\n/** Cost sub-schema */\nconst CostSchema = v.pipe(\n v.optional(\n v.object({\n input: v.pipe(\n v.number(),\n v.title('输入单价'),\n v.description('每 token 输入费用'),\n ),\n output: v.pipe(\n v.number(),\n v.title('输出单价'),\n v.description('每 token 输出费用'),\n ),\n cacheRead: v.pipe(\n v.number(),\n v.title('缓存读取单价'),\n v.description('从缓存读取每 token 的费用'),\n ),\n cacheWrite: v.pipe(\n v.number(),\n v.title('缓存写入单价'),\n v.description('写入缓存每 token 的费用'),\n ),\n }),\n { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n ),\n v.title('费用配置'),\n v.description('模型各操作类型的 token 计价标准'),\n);\n\n/** Thinking level map: Partial<Record<ModelThinkingLevel, string | null>> */\nconst ThinkingLevelMapSchema = v.pipe(\n v.record(\n ModelThinkingLevelSchema,\n v.pipe(\n v.nullish(v.string()),\n v.title('配置值'),\n v.description('对应思考等级的具体配置字符串,null 表示未设置'),\n ),\n ),\n v.title('思考等级配置映射'),\n v.description('各思考等级对应的具体配置参数映射'),\n);\n\n/**\n * Model schema for pi-ai models.\n * Matches `Model<TApi extends Api>` but without generic type preservation\n * at runtime — compat accepts any of the three compat variants via union.\n */\nexport const ModelSchema = v.pipe(\n v.object({\n provider: v.pipe(\n v.optional(v.string(), 'default'),\n v.title('厂商'),\n v.description('模型提供商,如 openai / anthropic / llama'),\n ),\n baseUrl: v.pipe(\n v.string(),\n v.title('基础 URL'),\n v.description('API 请求的基础地址'),\n ),\n reasoning: v.pipe(\n v.optional(v.boolean(), false),\n v.title('支持推理'),\n v.description('该模型是否支持思考/推理模式'),\n ),\n // thinkingLevelMap: v.optional(\n // v.pipe(\n // v.optional(ThinkingLevelMapSchema),\n // v.title('思考等级配置'),\n // v.description('各思考等级的具体参数配置映射'),\n // ),\n // ),\n input: v.pipe(\n v.optional(InputSchema, ['text', 'image']),\n asControl(),\n setComponent('picklist'),\n actions.inputs.set({ multiple: true, options: ['text', 'image'] }),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n ),\n cost: v.pipe(\n CostSchema,\n renderConfig({ hidden: true }),\n v.title('费用配置'),\n v.description('模型 token 计价标准'),\n ),\n contextWindow: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('上下文窗口'),\n v.description('模型支持的上下文最大 token 数'),\n ),\n maxTokens: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('最大输出 tokens'),\n v.description('单次请求允许的最大输出 token 数'),\n ),\n headers: v.optional(\n v.pipe(\n v.optional(HeadersSchema),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头配置'),\n ),\n ),\n compat: v.pipe(\n v.optional(CompatSchema, { supportsDeveloperRole: false }),\n v.title('兼容配置'),\n v.description('API 兼容性覆写选项'),\n ),\n }),\n v.title('模型定义'),\n v.description(\n 'pi-ai 模型的核心配置结构,包含模型标识、API 参数、费用及兼容性设置',\n ),\n);\n\nexport type ModelInput = v.InferInput<typeof ModelSchema>;\nexport type ModelOutput = v.InferOutput<typeof ModelSchema>;\n\n// --- ImagesModel schema ---\n\n/** Output array for image models: (\"text\" | \"image\")[] */\n\nexport const ModelConfigDefine = v.pipe(\n v.object({\n provider: v.pipe(KnownProviderDefine, setAlias('provider')),\n model: v.pipe(v.string(), v.title('模型名')),\n name: v.pipe(\n v.optional(v.string()),\n v.title('配置名'),\n v.description('模型的配置名称(默认为模型名)'),\n ),\n /** provider是自定义时使用 */\n apiKey: v.pipe(v.optional(v.string()), v.title('apiKey')),\n config: v.pipe(\n v.optional(ModelSchema),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['..', 'provider']] }).pipe(\n map(\n ({ list: [value] }) =>\n !(\n value === 'openai-completions' ||\n value === 'openai-responses' ||\n value === 'anthropic-messages'\n ),\n ),\n );\n },\n }),\n ),\n }),\n v.transform((item) => ({ ...item, name: item.name ?? item.model })),\n);\n\nexport type ModelConfigInputType = v.InferInput<typeof ModelConfigDefine>;\nexport type ModelConfigOutputType = v.InferOutput<typeof ModelConfigDefine>;\n", "import * as v from 'valibot';\nimport { KnownProvider } from '@earendil-works/pi-ai';\nexport const KnownProviderDefine = v.pipe(\n v.picklist([\n 'amazon-bedrock',\n 'anthropic',\n 'google',\n 'google-vertex',\n 'openai',\n 'azure-openai-responses',\n 'openai-codex',\n 'deepseek',\n 'github-copilot',\n 'xai',\n 'groq',\n 'cerebras',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'mistral',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'huggingface',\n 'fireworks',\n 'together',\n 'opencode',\n 'opencode-go',\n 'kimi-coding',\n 'cloudflare-workers-ai',\n 'cloudflare-ai-gateway',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n 'ant-ling',\n 'nvidia',\n 'zai-coding-cn',\n /** 自定义 */\n 'openai-completions',\n 'openai-responses',\n 'anthropic-messages',\n ]),\n v.title('提供商'),\n v.description(`'openai-completions','openai-responses','anthropic-messages',为自定义提供商`),\n);\n\nexport type KnownProviderType = v.InferOutput<typeof KnownProviderDefine>;\ntype D2T = KnownProvider extends KnownProviderType ? true : false;\ntype T2D = KnownProviderType extends KnownProvider ? true : false;\n"],
5
+ "mappings": "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",
6
6
  "names": ["v", "v"]
7
7
  }
package/index.js CHANGED
@@ -469,6 +469,9 @@ var CompatSchema = v3.pipe(
469
469
  v3.union([
470
470
  v3.pipe(
471
471
  OpenAICompletionsCompatSchema,
472
+ import_view_angular_core.actions.wrappers.patch([
473
+ { type: "div", attributes: { class: "grid gap-2" } }
474
+ ]),
472
475
  (0, import_view_angular_core.hideWhen)({
473
476
  disabled: true,
474
477
  listen(fn, field) {
@@ -480,6 +483,9 @@ var CompatSchema = v3.pipe(
480
483
  ),
481
484
  v3.pipe(
482
485
  OpenAIResponsesCompatSchema,
486
+ import_view_angular_core.actions.wrappers.patch([
487
+ { type: "div", attributes: { class: "grid gap-2" } }
488
+ ]),
483
489
  (0, import_view_angular_core.hideWhen)({
484
490
  disabled: true,
485
491
  listen(fn, field) {
@@ -491,6 +497,9 @@ var CompatSchema = v3.pipe(
491
497
  ),
492
498
  v3.pipe(
493
499
  AnthropicMessagesCompatSchema,
500
+ import_view_angular_core.actions.wrappers.patch([
501
+ { type: "div", attributes: { class: "grid gap-2" } }
502
+ ]),
494
503
  (0, import_view_angular_core.hideWhen)({
495
504
  disabled: true,
496
505
  listen(fn, field) {
@@ -598,6 +607,7 @@ var ModelSchema = v3.pipe(
598
607
  ),
599
608
  cost: v3.pipe(
600
609
  CostSchema,
610
+ (0, import_view_angular_core.renderConfig)({ hidden: true }),
601
611
  v3.title("费用配置"),
602
612
  v3.description("模型 token 计价标准")
603
613
  ),
package/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/openai/index.ts", "../../packages/openai/chat/token.ts", "../../packages/openai/chat/message.define.ts", "../../packages/openai/chat/util/create.ts", "../../packages/openai/chat/module.ts", "../../packages/openai/chat/chat.ts", "../../packages/openai/chat/util/get-custom-provider.ts", "../../packages/openai/chat/provider.define.ts", "../../packages/openai/chat/util/faux-provider.ts"],
4
- "sourcesContent": ["export * from './chat/token';\nexport * from './chat/message.define';\nexport * from './chat/util/create';\nexport * from './chat/type/history';\nexport * from './chat/type';\nexport * from './chat/module';\nexport * from './chat/chat'\nexport * from './chat/util/get-custom-provider'\nexport { complete, stream, fauxAssistantMessage, fauxText, fauxThinking } from '@earendil-works/pi-ai'\nexport * from './chat/util/faux-provider'", "import { InjectionToken, Signal } from 'static-injector';\nimport { OpenAIConfig } from './type';\n\nexport const OpenAIConfigToken = new InjectionToken<Signal<OpenAIConfig>>(\n 'OpenAIConfig',\n);\n", "import * as v from 'valibot';\nexport const ChatCompletionContentPartStr = v.object({\n text: v.string(),\n type: v.optional(v.literal('text'), 'text'),\n});\nexport type ChatCompletionContentPartStrType = v.InferOutput<\n typeof ChatCompletionContentPartStr\n>;\n\nexport const ChatCompletionContentPartImage = v.object({\n image_url: v.object({\n url: v.string(),\n }),\n type: v.optional(v.literal('image_url'), 'image_url'),\n});\nexport type ChatCompletionContentPartImageType = v.InferOutput<\n typeof ChatCompletionContentPartImage\n>;\nexport const ChatCompletionContentPart = v.array(\n v.union([ChatCompletionContentPartStr, ChatCompletionContentPartImage]),\n);\nexport const SystemChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const UserChatCompletionContent = ChatCompletionContentPart;\nexport type UserChatCompletionContentType = v.InferOutput<\n typeof UserChatCompletionContent\n>;\nexport const AssistantChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const SystemChatMessage = v.object({\n role: v.optional(v.literal('system'), 'system'),\n content: SystemChatCompletionContent,\n});\nexport type SystemChatMessageType = v.InferOutput<typeof SystemChatMessage>;\nexport const UserChatMessage = v.object({\n role: v.optional(v.literal('user'), 'user'),\n content: UserChatCompletionContent,\n});\nexport type UserChatMessageType = v.InferOutput<typeof UserChatMessage>;\n\nexport const AssistantChatMessage = v.object({\n role: v.optional(v.literal('assistant'), 'assistant'),\n content: AssistantChatCompletionContent,\n thinkContent: v.optional(v.string()),\n});\n\nexport type AssistantChatMessageType = v.InferOutput<\n typeof AssistantChatMessage\n>;\n\nexport const ChatMessageItemDefine = v.union([\n SystemChatMessage,\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport const ChatMessageCommonItemDefine = v.union([\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport type ChatMessageItemType = v.InferOutput<typeof ChatMessageItemDefine>;\nexport const ChatMessageListDefine = v.array(ChatMessageItemDefine);\n\nexport type ChatMessageListOutputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\nexport type ChatMessageListInputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\n", "import {\n AssistantChatMessageType,\n SystemChatMessageType,\n UserChatMessageType,\n} from '../message.define';\n\nexport function createSystemMessage() {\n return { role: 'system' } as SystemChatMessageType;\n}\nexport function createUserMessage(text?: string) {\n return {\n role: 'user',\n content:\n typeof text === 'string' ? [{ type: 'text', text: '' }] : undefined,\n } as UserChatMessageType;\n}\nexport function createAssistantMessage(text: string = '') {\n return {\n role: 'assistant',\n content: [{ type: 'text', text }],\n } as AssistantChatMessageType;\n}\n", "import { OpenAIConfigToken } from './token';\n\nexport const OPENAI_MODULE = {\n provider: [],\n token: { OpenAIConfigToken },\n};\n", "import {\n AssistantMessage,\n Context,\n stream,\n StreamOptions,\n UserMessage,\n} from '@earendil-works/pi-ai';\nimport {\n getModelConfig,\n ModelConfigInputType,\n} from './util/get-custom-provider';\nimport type OpenAI from 'openai';\nimport {\n AssistantChatMessage,\n ChatMessageItemType,\n SystemChatMessageType,\n UserChatMessage,\n} from './message.define';\nimport { deepClone } from '@cyia/util';\nimport { Injector } from 'static-injector';\nimport { OpenAIConfigToken } from './token';\nimport * as v from 'valibot';\n\nexport function createChatStream(input: ModelConfigInputType) {\n const result = getModelConfig(input);\n return (\n context: Omit<Context, 'messages'> & { messages: ChatMessageItemType[] },\n options?: StreamOptions,\n extra?: {\n response_format?: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming['response_format'];\n injector?: Injector;\n },\n ) => {\n context.messages = deepClone(context.messages);\n const PiPUserConvertDefine = v.pipe(\n UserChatMessage,\n v.transform(\n (item) =>\n ({\n role: 'user',\n timestamp: Date.now(),\n content: item.content.map((item) => {\n if (item.type === 'text') {\n return item;\n } else {\n const match = item.image_url.url.match(\n /^data:([^;]+);base64,(.+)$/,\n );\n return {\n type: 'image',\n mimeType: match![1],\n data: match![2],\n };\n }\n }),\n }) satisfies UserMessage,\n ),\n );\n const PiPAssConvertDefine = v.pipe(\n AssistantChatMessage,\n v.transform(\n (item) =>\n ({\n role: 'assistant',\n timestamp: Date.now(),\n content: item.content.map((item) => item),\n api: result.model.api,\n provider: result.model.provider,\n usage: {\n cacheRead: 0,\n cacheWrite: 0,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n total: 0,\n },\n input: 0,\n output: 0,\n totalTokens: 0,\n },\n stopReason: 'stop',\n model: result.model.api,\n }) satisfies AssistantMessage,\n ),\n );\n // todo 系统类型在输入时未处理\n const sysIndex = context.messages.findIndex(\n (item) => item.role === 'system',\n );\n if (sysIndex !== -1) {\n const item = context.messages[sysIndex] as any as SystemChatMessageType;\n context.messages.splice(sysIndex, 1);\n context.systemPrompt = item.content[0].text;\n }\n const createStream = () =>\n stream(\n result.model,\n {\n ...context,\n messages: v.parse(\n v.array(v.union([PiPUserConvertDefine, PiPAssConvertDefine])),\n context.messages,\n ),\n },\n {\n ...options,\n\n apiKey: options?.apiKey ?? result.config.apiKey,\n onPayload(payload, model) {\n payload = options?.onPayload?.(payload, model) ?? payload;\n if (model.api === 'openai-completions') {\n return {\n ...(payload as any),\n response_format: extra?.response_format,\n };\n }\n return payload;\n },\n },\n );\n\n let currentStream = createStream();\n const config = extra?.injector?.get(OpenAIConfigToken);\n return (async function* () {\n let hasRetry = false;\n while (true) {\n let retry = false;\n for await (const item of currentStream) {\n if (item.type === 'error') {\n if (\n item.error.errorMessage?.includes('404') &&\n item.error.errorMessage?.includes(\n 'no router for requested model',\n ) &&\n !hasRetry\n ) {\n if (config?.().tryPull?.()) {\n await config().pullModel?.(input.model);\n retry = true;\n break;\n }\n }\n }\n yield item;\n }\n if (!retry || hasRetry) {\n break;\n }\n hasRetry = true;\n currentStream = createStream();\n }\n })();\n };\n}\n", "import * as v from 'valibot';\n\nimport { getModel, Model } from '@earendil-works/pi-ai';\nimport { KnownProviderDefine } from '../provider.define';\nimport {\n actions,\n asControl,\n hideWhen,\n renderConfig,\n setAlias,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map } from 'rxjs';\n\nfunction getCustomProvider<\n T extends 'openai-completions' | 'openai-responses' | 'anthropic-messages',\n>(\n compat: T,\n model: string,\n name: string,\n input: Omit<Model<T>, 'api' | 'id' | 'name'>,\n) {\n return { ...input, id: model, api: compat, name } satisfies Model<T>;\n}\nexport function getModelConfig(input: ModelConfigInputType) {\n if (input.provider === ('faux' as any)) {\n return {\n model: input.config as Model<any>,\n config: input as ModelConfigOutputType,\n };\n }\n const config = v.parse(ModelConfigDefine, input);\n if (\n config.provider === 'openai-completions' ||\n config.provider === 'openai-responses' ||\n config.provider === 'anthropic-messages'\n ) {\n return {\n model: getCustomProvider(\n config.provider,\n config.model,\n config.name,\n config.config!,\n ),\n config: config,\n };\n }\n\n return {\n model: getModel(config.provider, config.model as any as never),\n config: config,\n };\n}\nexport const ThinkingLevelSchema = v.pipe(\n v.picklist(['minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('思考等级'),\n v.description('模型思考的详细程度,从最小到最大'),\n);\n\nexport const ModelThinkingLevelSchema = v.pipe(\n v.picklist(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('模型思考等级'),\n v.description('关闭或设置模型思考的详细程度'),\n);\n\n// --- Compat schemas (conditional on TApi) ---\n\n/** OpenAI Completions compatibility overrides */\nexport const OpenAICompletionsCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsStore: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持存储'),\n v.description('是否支持服务端会话存储'),\n ),\n ),\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n supportsReasoningEffort: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持推理努力'),\n v.description('是否支持 reasoning_effort 参数'),\n ),\n ),\n supportsUsageInStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title('流式用量'),\n v.description('流式输出中是否返回 usage 信息'),\n ),\n ),\n maxTokensField: v.optional(\n v.pipe(\n v.picklist(['max_completion_tokens', 'max_tokens']),\n v.title('最大 token 字段名'),\n v.description('指定最大 token 参数使用的是哪个字段名'),\n ),\n ),\n requiresToolResultName: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要工具结果名称'),\n v.description('是否要求工具结果消息包含 name 字段'),\n ),\n ),\n requiresAssistantAfterToolResult: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要助手回复'),\n v.description('工具结果后是否需要助手消息跟进'),\n ),\n ),\n requiresThinkingAsText: v.optional(\n v.pipe(\n v.boolean(),\n v.title('思考转文本'),\n v.description('是否将思考过程作为普通文本发送'),\n ),\n ),\n requiresReasoningContentOnAssistantMessages: v.optional(\n v.pipe(\n v.boolean(),\n v.title('推理内容在助手消息中'),\n v.description('是否在助手消息中包含推理内容'),\n ),\n ),\n thinkingFormat: v.optional(\n v.pipe(\n v.picklist([\n 'openai',\n 'openrouter',\n 'deepseek',\n 'together',\n 'zai',\n 'qwen',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ]),\n v.title('思考格式'),\n v.description('指定 thinking 标签的序列化格式'),\n ),\n ),\n openRouterRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('OpenRouter 路由'),\n v.description('自定义 OpenRouter 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n vercelGatewayRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('Vercel Gateway 路由'),\n v.description('自定义 Vercel AI Gateway 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n zaiToolStream: v.optional(\n v.pipe(\n v.boolean(),\n v.title('ZAI 工具流式'),\n v.description('是否启用 ZAI 平台工具调用的流式输出'),\n ),\n ),\n supportsStrictMode: v.optional(\n v.pipe(\n v.boolean(),\n v.title('严格模式'),\n v.description('是否支持工具的 JSON Schema 严格校验'),\n ),\n ),\n cacheControlFormat: v.optional(\n v.pipe(\n v.literal('anthropic'),\n v.title('缓存控制格式'),\n v.description('指定缓存控制的语法格式'),\n renderConfig({ hidden: true }),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Completions 兼容配置'),\n v.description('针对 OpenAI Completions API 的兼容性覆写选项'),\n);\n\n/** OpenAI Responses compatibility overrides */\nexport const OpenAIResponsesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n sendSessionIdHeader: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话 ID 标头'),\n v.description('是否在请求中携带 X-Session-ID 标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Responses 兼容配置'),\n v.description('针对 OpenAI Responses API 的兼容性覆写选项'),\n);\n\n/** Anthropic Messages compatibility overrides */\nexport const AnthropicMessagesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsEagerToolInputStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title(' eagerly 工具流式'),\n v.description('是否支持工具调用的 eager 模式流式输出'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsCacheControlOnTools: v.optional(\n v.pipe(\n v.boolean(),\n v.title('工具缓存控制'),\n v.description('是否支持在 tool_use 消息中使用 cache_control'),\n ),\n ),\n supportsTemperature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持温度参数'),\n v.description('模型/接口是否支持 temperature 参数'),\n ),\n ),\n forceAdaptiveThinking: v.optional(\n v.pipe(\n v.boolean(),\n v.title('强制自适应思考'),\n v.description('是否强制启用 adaptive thinking 模式'),\n ),\n ),\n allowEmptySignature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('允许空签名'),\n v.description('是否允许工具调用不指定签名(sha256)'),\n ),\n ),\n }),\n ),\n v.title('Anthropic Messages 兼容配置'),\n v.description('针对 Anthropic Messages API 的兼容性覆写选项'),\n);\n\n// Generic compat schema (union of all compat types)\nexport const CompatSchema = v.pipe(\n v.union([\n v.pipe(\n OpenAICompletionsCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-completions'),\n );\n },\n }),\n ),\n v.pipe(\n OpenAIResponsesCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-responses'),\n );\n },\n }),\n ),\n v.pipe(\n AnthropicMessagesCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'anthropic-messages'),\n );\n },\n }),\n ),\n ]),\n setComponent('object'),\n v.title('兼容配置'),\n v.description(\n '模型 API 兼容性覆写选项,支持 OpenAI Completions、OpenAI Responses、Anthropic Messages 三种格式',\n ),\n);\n\n// --- Input array: (\"text\" | \"image\")[] ---\n\nexport const InputChoiceSchema = v.pipe(\n v.picklist(['text', 'image']),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n);\nexport const InputSchema = v.pipe(\n v.array(InputChoiceSchema),\n v.title('输入类型列表'),\n v.description('该模型支持的用户输入类型,如 text 文本或 image 图片'),\n);\n\n// --- Headers: Record<string, string> ---\n\nconst HeadersSchema = v.pipe(\n v.record(v.string(), v.string()),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头键值对配置'),\n renderConfig({ hidden: true }),\n);\n\n// --- Model schema (non-generic) ---\n\n/** Cost sub-schema */\nconst CostSchema = v.pipe(\n v.optional(\n v.object({\n input: v.pipe(\n v.number(),\n v.title('输入单价'),\n v.description('每 token 输入费用'),\n ),\n output: v.pipe(\n v.number(),\n v.title('输出单价'),\n v.description('每 token 输出费用'),\n ),\n cacheRead: v.pipe(\n v.number(),\n v.title('缓存读取单价'),\n v.description('从缓存读取每 token 的费用'),\n ),\n cacheWrite: v.pipe(\n v.number(),\n v.title('缓存写入单价'),\n v.description('写入缓存每 token 的费用'),\n ),\n }),\n { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n ),\n v.title('费用配置'),\n v.description('模型各操作类型的 token 计价标准'),\n);\n\n/** Thinking level map: Partial<Record<ModelThinkingLevel, string | null>> */\nconst ThinkingLevelMapSchema = v.pipe(\n v.record(\n ModelThinkingLevelSchema,\n v.pipe(\n v.nullish(v.string()),\n v.title('配置值'),\n v.description('对应思考等级的具体配置字符串,null 表示未设置'),\n ),\n ),\n v.title('思考等级配置映射'),\n v.description('各思考等级对应的具体配置参数映射'),\n);\n\n/**\n * Model schema for pi-ai models.\n * Matches `Model<TApi extends Api>` but without generic type preservation\n * at runtime — compat accepts any of the three compat variants via union.\n */\nexport const ModelSchema = v.pipe(\n v.object({\n provider: v.pipe(\n v.optional(v.string(), 'default'),\n v.title('厂商'),\n v.description('模型提供商,如 openai / anthropic / llama'),\n ),\n baseUrl: v.pipe(\n v.string(),\n v.title('基础 URL'),\n v.description('API 请求的基础地址'),\n ),\n reasoning: v.pipe(\n v.optional(v.boolean(), false),\n v.title('支持推理'),\n v.description('该模型是否支持思考/推理模式'),\n ),\n // thinkingLevelMap: v.optional(\n // v.pipe(\n // v.optional(ThinkingLevelMapSchema),\n // v.title('思考等级配置'),\n // v.description('各思考等级的具体参数配置映射'),\n // ),\n // ),\n input: v.pipe(\n v.optional(InputSchema, ['text', 'image']),\n asControl(),\n setComponent('picklist'),\n actions.inputs.set({ multiple: true, options: ['text', 'image'] }),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n ),\n cost: v.pipe(\n CostSchema,\n v.title('费用配置'),\n v.description('模型 token 计价标准'),\n ),\n contextWindow: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('上下文窗口'),\n v.description('模型支持的上下文最大 token 数'),\n ),\n maxTokens: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('最大输出 tokens'),\n v.description('单次请求允许的最大输出 token 数'),\n ),\n headers: v.optional(\n v.pipe(\n v.optional(HeadersSchema),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头配置'),\n ),\n ),\n compat: v.pipe(\n v.optional(CompatSchema, { supportsDeveloperRole: false }),\n v.title('兼容配置'),\n v.description('API 兼容性覆写选项'),\n ),\n }),\n v.title('模型定义'),\n v.description(\n 'pi-ai 模型的核心配置结构,包含模型标识、API 参数、费用及兼容性设置',\n ),\n);\n\nexport type ModelInput = v.InferInput<typeof ModelSchema>;\nexport type ModelOutput = v.InferOutput<typeof ModelSchema>;\n\n// --- ImagesModel schema ---\n\n/** Output array for image models: (\"text\" | \"image\")[] */\n\nexport const ModelConfigDefine = v.pipe(\n v.object({\n provider: v.pipe(KnownProviderDefine, setAlias('provider')),\n model: v.pipe(v.string(), v.title('模型名')),\n name: v.pipe(\n v.optional(v.string()),\n v.title('配置名'),\n v.description('模型的配置名称(默认为模型名)'),\n ),\n /** provider是自定义时使用 */\n apiKey: v.pipe(v.optional(v.string()), v.title('apiKey')),\n config: v.pipe(\n v.optional(ModelSchema),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['..', 'provider']] }).pipe(\n map(\n ({ list: [value] }) =>\n !(\n value === 'openai-completions' ||\n value === 'openai-responses' ||\n value === 'anthropic-messages'\n ),\n ),\n );\n },\n }),\n ),\n }),\n v.transform((item) => ({ ...item, name: item.name ?? item.model })),\n);\n\nexport type ModelConfigInputType = v.InferInput<typeof ModelConfigDefine>;\nexport type ModelConfigOutputType = v.InferOutput<typeof ModelConfigDefine>;\n", "import * as v from 'valibot';\nimport { KnownProvider } from '@earendil-works/pi-ai';\nexport const KnownProviderDefine = v.pipe(\n v.picklist([\n 'amazon-bedrock',\n 'anthropic',\n 'google',\n 'google-vertex',\n 'openai',\n 'azure-openai-responses',\n 'openai-codex',\n 'deepseek',\n 'github-copilot',\n 'xai',\n 'groq',\n 'cerebras',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'mistral',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'huggingface',\n 'fireworks',\n 'together',\n 'opencode',\n 'opencode-go',\n 'kimi-coding',\n 'cloudflare-workers-ai',\n 'cloudflare-ai-gateway',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n 'ant-ling',\n 'nvidia',\n 'zai-coding-cn',\n /** 自定义 */\n 'openai-completions',\n 'openai-responses',\n 'anthropic-messages',\n ]),\n v.title('提供商'),\n v.description(`'openai-completions','openai-responses','anthropic-messages',为自定义提供商`),\n);\n\nexport type KnownProviderType = v.InferOutput<typeof KnownProviderDefine>;\ntype D2T = KnownProvider extends KnownProviderType ? true : false;\ntype T2D = KnownProviderType extends KnownProvider ? true : false;\n", "import {\n registerFauxProvider,\n fauxAssistantMessage,\n fauxText,\n Context,\n StreamOptions,\n FauxResponseStep,\n} from '@earendil-works/pi-ai';\n\n/**\n * 创建一个基于用户输入动态返回响应的方法。\n * @param responseFactory - 根据上下文动态生成响应的工厂函数,接收历史消息和调用序号,返回文本或文本数组\n */\nexport function createDynamicResponse(\n responseFactory: (context: Context, callCount: number) => string | string[],\n) {\n return async (\n context: Context,\n _options: StreamOptions | undefined,\n state: { callCount: number },\n ) => {\n const responses = responseFactory(context, state.callCount);\n const content = Array.isArray(responses)\n ? responses.map((r) => fauxText(r))\n : fauxText(responses);\n return fauxAssistantMessage(content);\n };\n}\n\n/** Options for registerFauxProvider. */\nexport interface MockProviderOptions {\n api?: string;\n provider?: string;\n tokensPerSecond?: number;\n}\n\n\n\n/**\n * Register a faux mock provider and return a ready-to-use model with cleanup.\n * \n * @example\n * ```ts\n * const { model, setResponses, unregister } = registerMockProvider();\n * setResponses([fauxAssistantMessage('hello')]);\n * const response = await complete(model, { messages: [{ role: 'user', content: 'hi', timestamp: Date.now() }] });\n * unregister(); // clean up when done\n * ```\n */\nexport function registerMockProvider(\n options?: MockProviderOptions,\n) {\n const registration = registerFauxProvider(options);\n\n return {\n model: registration.getModel(),\n setResponses: (responses: FauxResponseStep[]) => registration.setResponses(responses),\n unregister: () => registration.unregister(),\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export * from './chat/token';\nexport * from './chat/message.define';\nexport * from './chat/util/create';\nexport * from './chat/type/history';\nexport * from './chat/type';\nexport * from './chat/module';\nexport * from './chat/chat'\nexport * from './chat/util/get-custom-provider'\nexport { complete, stream, fauxAssistantMessage, fauxText, fauxThinking } from '@earendil-works/pi-ai'\nexport * from './chat/util/faux-provider'", "import { InjectionToken, Signal } from 'static-injector';\nimport { OpenAIConfig } from './type';\n\nexport const OpenAIConfigToken = new InjectionToken<Signal<OpenAIConfig>>(\n 'OpenAIConfig',\n);\n", "import * as v from 'valibot';\nexport const ChatCompletionContentPartStr = v.object({\n text: v.string(),\n type: v.optional(v.literal('text'), 'text'),\n});\nexport type ChatCompletionContentPartStrType = v.InferOutput<\n typeof ChatCompletionContentPartStr\n>;\n\nexport const ChatCompletionContentPartImage = v.object({\n image_url: v.object({\n url: v.string(),\n }),\n type: v.optional(v.literal('image_url'), 'image_url'),\n});\nexport type ChatCompletionContentPartImageType = v.InferOutput<\n typeof ChatCompletionContentPartImage\n>;\nexport const ChatCompletionContentPart = v.array(\n v.union([ChatCompletionContentPartStr, ChatCompletionContentPartImage]),\n);\nexport const SystemChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const UserChatCompletionContent = ChatCompletionContentPart;\nexport type UserChatCompletionContentType = v.InferOutput<\n typeof UserChatCompletionContent\n>;\nexport const AssistantChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const SystemChatMessage = v.object({\n role: v.optional(v.literal('system'), 'system'),\n content: SystemChatCompletionContent,\n});\nexport type SystemChatMessageType = v.InferOutput<typeof SystemChatMessage>;\nexport const UserChatMessage = v.object({\n role: v.optional(v.literal('user'), 'user'),\n content: UserChatCompletionContent,\n});\nexport type UserChatMessageType = v.InferOutput<typeof UserChatMessage>;\n\nexport const AssistantChatMessage = v.object({\n role: v.optional(v.literal('assistant'), 'assistant'),\n content: AssistantChatCompletionContent,\n thinkContent: v.optional(v.string()),\n});\n\nexport type AssistantChatMessageType = v.InferOutput<\n typeof AssistantChatMessage\n>;\n\nexport const ChatMessageItemDefine = v.union([\n SystemChatMessage,\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport const ChatMessageCommonItemDefine = v.union([\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport type ChatMessageItemType = v.InferOutput<typeof ChatMessageItemDefine>;\nexport const ChatMessageListDefine = v.array(ChatMessageItemDefine);\n\nexport type ChatMessageListOutputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\nexport type ChatMessageListInputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\n", "import {\n AssistantChatMessageType,\n SystemChatMessageType,\n UserChatMessageType,\n} from '../message.define';\n\nexport function createSystemMessage() {\n return { role: 'system' } as SystemChatMessageType;\n}\nexport function createUserMessage(text?: string) {\n return {\n role: 'user',\n content:\n typeof text === 'string' ? [{ type: 'text', text: '' }] : undefined,\n } as UserChatMessageType;\n}\nexport function createAssistantMessage(text: string = '') {\n return {\n role: 'assistant',\n content: [{ type: 'text', text }],\n } as AssistantChatMessageType;\n}\n", "import { OpenAIConfigToken } from './token';\n\nexport const OPENAI_MODULE = {\n provider: [],\n token: { OpenAIConfigToken },\n};\n", "import {\n AssistantMessage,\n Context,\n stream,\n StreamOptions,\n UserMessage,\n} from '@earendil-works/pi-ai';\nimport {\n getModelConfig,\n ModelConfigInputType,\n} from './util/get-custom-provider';\nimport type OpenAI from 'openai';\nimport {\n AssistantChatMessage,\n ChatMessageItemType,\n SystemChatMessageType,\n UserChatMessage,\n} from './message.define';\nimport { deepClone } from '@cyia/util';\nimport { Injector } from 'static-injector';\nimport { OpenAIConfigToken } from './token';\nimport * as v from 'valibot';\n\nexport function createChatStream(input: ModelConfigInputType) {\n const result = getModelConfig(input);\n return (\n context: Omit<Context, 'messages'> & { messages: ChatMessageItemType[] },\n options?: StreamOptions,\n extra?: {\n response_format?: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming['response_format'];\n injector?: Injector;\n },\n ) => {\n context.messages = deepClone(context.messages);\n const PiPUserConvertDefine = v.pipe(\n UserChatMessage,\n v.transform(\n (item) =>\n ({\n role: 'user',\n timestamp: Date.now(),\n content: item.content.map((item) => {\n if (item.type === 'text') {\n return item;\n } else {\n const match = item.image_url.url.match(\n /^data:([^;]+);base64,(.+)$/,\n );\n return {\n type: 'image',\n mimeType: match![1],\n data: match![2],\n };\n }\n }),\n }) satisfies UserMessage,\n ),\n );\n const PiPAssConvertDefine = v.pipe(\n AssistantChatMessage,\n v.transform(\n (item) =>\n ({\n role: 'assistant',\n timestamp: Date.now(),\n content: item.content.map((item) => item),\n api: result.model.api,\n provider: result.model.provider,\n usage: {\n cacheRead: 0,\n cacheWrite: 0,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n total: 0,\n },\n input: 0,\n output: 0,\n totalTokens: 0,\n },\n stopReason: 'stop',\n model: result.model.api,\n }) satisfies AssistantMessage,\n ),\n );\n // todo 系统类型在输入时未处理\n const sysIndex = context.messages.findIndex(\n (item) => item.role === 'system',\n );\n if (sysIndex !== -1) {\n const item = context.messages[sysIndex] as any as SystemChatMessageType;\n context.messages.splice(sysIndex, 1);\n context.systemPrompt = item.content[0].text;\n }\n const createStream = () =>\n stream(\n result.model,\n {\n ...context,\n messages: v.parse(\n v.array(v.union([PiPUserConvertDefine, PiPAssConvertDefine])),\n context.messages,\n ),\n },\n {\n ...options,\n\n apiKey: options?.apiKey ?? result.config.apiKey,\n onPayload(payload, model) {\n payload = options?.onPayload?.(payload, model) ?? payload;\n if (model.api === 'openai-completions') {\n return {\n ...(payload as any),\n response_format: extra?.response_format,\n };\n }\n return payload;\n },\n },\n );\n\n let currentStream = createStream();\n const config = extra?.injector?.get(OpenAIConfigToken);\n return (async function* () {\n let hasRetry = false;\n while (true) {\n let retry = false;\n for await (const item of currentStream) {\n if (item.type === 'error') {\n if (\n item.error.errorMessage?.includes('404') &&\n item.error.errorMessage?.includes(\n 'no router for requested model',\n ) &&\n !hasRetry\n ) {\n if (config?.().tryPull?.()) {\n await config().pullModel?.(input.model);\n retry = true;\n break;\n }\n }\n }\n yield item;\n }\n if (!retry || hasRetry) {\n break;\n }\n hasRetry = true;\n currentStream = createStream();\n }\n })();\n };\n}\n", "import * as v from 'valibot';\n\nimport { getModel, Model } from '@earendil-works/pi-ai';\nimport { KnownProviderDefine } from '../provider.define';\nimport {\n actions,\n asControl,\n hideWhen,\n renderConfig,\n setAlias,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map } from 'rxjs';\n\nfunction getCustomProvider<\n T extends 'openai-completions' | 'openai-responses' | 'anthropic-messages',\n>(\n compat: T,\n model: string,\n name: string,\n input: Omit<Model<T>, 'api' | 'id' | 'name'>,\n) {\n return { ...input, id: model, api: compat, name } satisfies Model<T>;\n}\nexport function getModelConfig(input: ModelConfigInputType) {\n if (input.provider === ('faux' as any)) {\n return {\n model: input.config as Model<any>,\n config: input as ModelConfigOutputType,\n };\n }\n const config = v.parse(ModelConfigDefine, input);\n if (\n config.provider === 'openai-completions' ||\n config.provider === 'openai-responses' ||\n config.provider === 'anthropic-messages'\n ) {\n return {\n model: getCustomProvider(\n config.provider,\n config.model,\n config.name,\n config.config!,\n ),\n config: config,\n };\n }\n\n return {\n model: getModel(config.provider, config.model as any as never),\n config: config,\n };\n}\nexport const ThinkingLevelSchema = v.pipe(\n v.picklist(['minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('思考等级'),\n v.description('模型思考的详细程度,从最小到最大'),\n);\n\nexport const ModelThinkingLevelSchema = v.pipe(\n v.picklist(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('模型思考等级'),\n v.description('关闭或设置模型思考的详细程度'),\n);\n\n// --- Compat schemas (conditional on TApi) ---\n\n/** OpenAI Completions compatibility overrides */\nexport const OpenAICompletionsCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsStore: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持存储'),\n v.description('是否支持服务端会话存储'),\n ),\n ),\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n supportsReasoningEffort: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持推理努力'),\n v.description('是否支持 reasoning_effort 参数'),\n ),\n ),\n supportsUsageInStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title('流式用量'),\n v.description('流式输出中是否返回 usage 信息'),\n ),\n ),\n maxTokensField: v.optional(\n v.pipe(\n v.picklist(['max_completion_tokens', 'max_tokens']),\n v.title('最大 token 字段名'),\n v.description('指定最大 token 参数使用的是哪个字段名'),\n ),\n ),\n requiresToolResultName: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要工具结果名称'),\n v.description('是否要求工具结果消息包含 name 字段'),\n ),\n ),\n requiresAssistantAfterToolResult: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要助手回复'),\n v.description('工具结果后是否需要助手消息跟进'),\n ),\n ),\n requiresThinkingAsText: v.optional(\n v.pipe(\n v.boolean(),\n v.title('思考转文本'),\n v.description('是否将思考过程作为普通文本发送'),\n ),\n ),\n requiresReasoningContentOnAssistantMessages: v.optional(\n v.pipe(\n v.boolean(),\n v.title('推理内容在助手消息中'),\n v.description('是否在助手消息中包含推理内容'),\n ),\n ),\n thinkingFormat: v.optional(\n v.pipe(\n v.picklist([\n 'openai',\n 'openrouter',\n 'deepseek',\n 'together',\n 'zai',\n 'qwen',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ]),\n v.title('思考格式'),\n v.description('指定 thinking 标签的序列化格式'),\n ),\n ),\n openRouterRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('OpenRouter 路由'),\n v.description('自定义 OpenRouter 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n vercelGatewayRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('Vercel Gateway 路由'),\n v.description('自定义 Vercel AI Gateway 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n zaiToolStream: v.optional(\n v.pipe(\n v.boolean(),\n v.title('ZAI 工具流式'),\n v.description('是否启用 ZAI 平台工具调用的流式输出'),\n ),\n ),\n supportsStrictMode: v.optional(\n v.pipe(\n v.boolean(),\n v.title('严格模式'),\n v.description('是否支持工具的 JSON Schema 严格校验'),\n ),\n ),\n cacheControlFormat: v.optional(\n v.pipe(\n v.literal('anthropic'),\n v.title('缓存控制格式'),\n v.description('指定缓存控制的语法格式'),\n renderConfig({ hidden: true }),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Completions 兼容配置'),\n v.description('针对 OpenAI Completions API 的兼容性覆写选项'),\n);\n\n/** OpenAI Responses compatibility overrides */\nexport const OpenAIResponsesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n sendSessionIdHeader: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话 ID 标头'),\n v.description('是否在请求中携带 X-Session-ID 标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Responses 兼容配置'),\n v.description('针对 OpenAI Responses API 的兼容性覆写选项'),\n);\n\n/** Anthropic Messages compatibility overrides */\nexport const AnthropicMessagesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsEagerToolInputStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title(' eagerly 工具流式'),\n v.description('是否支持工具调用的 eager 模式流式输出'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsCacheControlOnTools: v.optional(\n v.pipe(\n v.boolean(),\n v.title('工具缓存控制'),\n v.description('是否支持在 tool_use 消息中使用 cache_control'),\n ),\n ),\n supportsTemperature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持温度参数'),\n v.description('模型/接口是否支持 temperature 参数'),\n ),\n ),\n forceAdaptiveThinking: v.optional(\n v.pipe(\n v.boolean(),\n v.title('强制自适应思考'),\n v.description('是否强制启用 adaptive thinking 模式'),\n ),\n ),\n allowEmptySignature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('允许空签名'),\n v.description('是否允许工具调用不指定签名(sha256)'),\n ),\n ),\n }),\n ),\n v.title('Anthropic Messages 兼容配置'),\n v.description('针对 Anthropic Messages API 的兼容性覆写选项'),\n);\n\n// Generic compat schema (union of all compat types)\nexport const CompatSchema = v.pipe(\n v.union([\n v.pipe(\n OpenAICompletionsCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-completions'),\n );\n },\n }),\n ),\n v.pipe(\n OpenAIResponsesCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-responses'),\n );\n },\n }),\n ),\n v.pipe(\n AnthropicMessagesCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'anthropic-messages'),\n );\n },\n }),\n ),\n ]),\n setComponent('object'),\n v.title('兼容配置'),\n v.description(\n '模型 API 兼容性覆写选项,支持 OpenAI Completions、OpenAI Responses、Anthropic Messages 三种格式',\n ),\n);\n\n// --- Input array: (\"text\" | \"image\")[] ---\n\nexport const InputChoiceSchema = v.pipe(\n v.picklist(['text', 'image']),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n);\nexport const InputSchema = v.pipe(\n v.array(InputChoiceSchema),\n v.title('输入类型列表'),\n v.description('该模型支持的用户输入类型,如 text 文本或 image 图片'),\n);\n\n// --- Headers: Record<string, string> ---\n\nconst HeadersSchema = v.pipe(\n v.record(v.string(), v.string()),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头键值对配置'),\n renderConfig({ hidden: true }),\n);\n\n// --- Model schema (non-generic) ---\n\n/** Cost sub-schema */\nconst CostSchema = v.pipe(\n v.optional(\n v.object({\n input: v.pipe(\n v.number(),\n v.title('输入单价'),\n v.description('每 token 输入费用'),\n ),\n output: v.pipe(\n v.number(),\n v.title('输出单价'),\n v.description('每 token 输出费用'),\n ),\n cacheRead: v.pipe(\n v.number(),\n v.title('缓存读取单价'),\n v.description('从缓存读取每 token 的费用'),\n ),\n cacheWrite: v.pipe(\n v.number(),\n v.title('缓存写入单价'),\n v.description('写入缓存每 token 的费用'),\n ),\n }),\n { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n ),\n v.title('费用配置'),\n v.description('模型各操作类型的 token 计价标准'),\n);\n\n/** Thinking level map: Partial<Record<ModelThinkingLevel, string | null>> */\nconst ThinkingLevelMapSchema = v.pipe(\n v.record(\n ModelThinkingLevelSchema,\n v.pipe(\n v.nullish(v.string()),\n v.title('配置值'),\n v.description('对应思考等级的具体配置字符串,null 表示未设置'),\n ),\n ),\n v.title('思考等级配置映射'),\n v.description('各思考等级对应的具体配置参数映射'),\n);\n\n/**\n * Model schema for pi-ai models.\n * Matches `Model<TApi extends Api>` but without generic type preservation\n * at runtime — compat accepts any of the three compat variants via union.\n */\nexport const ModelSchema = v.pipe(\n v.object({\n provider: v.pipe(\n v.optional(v.string(), 'default'),\n v.title('厂商'),\n v.description('模型提供商,如 openai / anthropic / llama'),\n ),\n baseUrl: v.pipe(\n v.string(),\n v.title('基础 URL'),\n v.description('API 请求的基础地址'),\n ),\n reasoning: v.pipe(\n v.optional(v.boolean(), false),\n v.title('支持推理'),\n v.description('该模型是否支持思考/推理模式'),\n ),\n // thinkingLevelMap: v.optional(\n // v.pipe(\n // v.optional(ThinkingLevelMapSchema),\n // v.title('思考等级配置'),\n // v.description('各思考等级的具体参数配置映射'),\n // ),\n // ),\n input: v.pipe(\n v.optional(InputSchema, ['text', 'image']),\n asControl(),\n setComponent('picklist'),\n actions.inputs.set({ multiple: true, options: ['text', 'image'] }),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n ),\n cost: v.pipe(\n CostSchema,\n renderConfig({ hidden: true }),\n v.title('费用配置'),\n v.description('模型 token 计价标准'),\n ),\n contextWindow: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('上下文窗口'),\n v.description('模型支持的上下文最大 token 数'),\n ),\n maxTokens: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('最大输出 tokens'),\n v.description('单次请求允许的最大输出 token 数'),\n ),\n headers: v.optional(\n v.pipe(\n v.optional(HeadersSchema),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头配置'),\n ),\n ),\n compat: v.pipe(\n v.optional(CompatSchema, { supportsDeveloperRole: false }),\n v.title('兼容配置'),\n v.description('API 兼容性覆写选项'),\n ),\n }),\n v.title('模型定义'),\n v.description(\n 'pi-ai 模型的核心配置结构,包含模型标识、API 参数、费用及兼容性设置',\n ),\n);\n\nexport type ModelInput = v.InferInput<typeof ModelSchema>;\nexport type ModelOutput = v.InferOutput<typeof ModelSchema>;\n\n// --- ImagesModel schema ---\n\n/** Output array for image models: (\"text\" | \"image\")[] */\n\nexport const ModelConfigDefine = v.pipe(\n v.object({\n provider: v.pipe(KnownProviderDefine, setAlias('provider')),\n model: v.pipe(v.string(), v.title('模型名')),\n name: v.pipe(\n v.optional(v.string()),\n v.title('配置名'),\n v.description('模型的配置名称(默认为模型名)'),\n ),\n /** provider是自定义时使用 */\n apiKey: v.pipe(v.optional(v.string()), v.title('apiKey')),\n config: v.pipe(\n v.optional(ModelSchema),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['..', 'provider']] }).pipe(\n map(\n ({ list: [value] }) =>\n !(\n value === 'openai-completions' ||\n value === 'openai-responses' ||\n value === 'anthropic-messages'\n ),\n ),\n );\n },\n }),\n ),\n }),\n v.transform((item) => ({ ...item, name: item.name ?? item.model })),\n);\n\nexport type ModelConfigInputType = v.InferInput<typeof ModelConfigDefine>;\nexport type ModelConfigOutputType = v.InferOutput<typeof ModelConfigDefine>;\n", "import * as v from 'valibot';\nimport { KnownProvider } from '@earendil-works/pi-ai';\nexport const KnownProviderDefine = v.pipe(\n v.picklist([\n 'amazon-bedrock',\n 'anthropic',\n 'google',\n 'google-vertex',\n 'openai',\n 'azure-openai-responses',\n 'openai-codex',\n 'deepseek',\n 'github-copilot',\n 'xai',\n 'groq',\n 'cerebras',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'mistral',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'huggingface',\n 'fireworks',\n 'together',\n 'opencode',\n 'opencode-go',\n 'kimi-coding',\n 'cloudflare-workers-ai',\n 'cloudflare-ai-gateway',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n 'ant-ling',\n 'nvidia',\n 'zai-coding-cn',\n /** 自定义 */\n 'openai-completions',\n 'openai-responses',\n 'anthropic-messages',\n ]),\n v.title('提供商'),\n v.description(`'openai-completions','openai-responses','anthropic-messages',为自定义提供商`),\n);\n\nexport type KnownProviderType = v.InferOutput<typeof KnownProviderDefine>;\ntype D2T = KnownProvider extends KnownProviderType ? true : false;\ntype T2D = KnownProviderType extends KnownProvider ? true : false;\n", "import {\n registerFauxProvider,\n fauxAssistantMessage,\n fauxText,\n Context,\n StreamOptions,\n FauxResponseStep,\n} from '@earendil-works/pi-ai';\n\n/**\n * 创建一个基于用户输入动态返回响应的方法。\n * @param responseFactory - 根据上下文动态生成响应的工厂函数,接收历史消息和调用序号,返回文本或文本数组\n */\nexport function createDynamicResponse(\n responseFactory: (context: Context, callCount: number) => string | string[],\n) {\n return async (\n context: Context,\n _options: StreamOptions | undefined,\n state: { callCount: number },\n ) => {\n const responses = responseFactory(context, state.callCount);\n const content = Array.isArray(responses)\n ? responses.map((r) => fauxText(r))\n : fauxText(responses);\n return fauxAssistantMessage(content);\n };\n}\n\n/** Options for registerFauxProvider. */\nexport interface MockProviderOptions {\n api?: string;\n provider?: string;\n tokensPerSecond?: number;\n}\n\n\n\n/**\n * Register a faux mock provider and return a ready-to-use model with cleanup.\n * \n * @example\n * ```ts\n * const { model, setResponses, unregister } = registerMockProvider();\n * setResponses([fauxAssistantMessage('hello')]);\n * const response = await complete(model, { messages: [{ role: 'user', content: 'hi', timestamp: Date.now() }] });\n * unregister(); // clean up when done\n * ```\n */\nexport function registerMockProvider(\n options?: MockProviderOptions,\n) {\n const registration = registerFauxProvider(options);\n\n return {\n model: registration.getModel(),\n setResponses: (responses: FauxResponseStep[]) => registration.setResponses(responses),\n unregister: () => registration.unregister(),\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_pi_ai", "v", "v", "v", "item", "import_pi_ai", "import_pi_ai"]
7
7
  }
package/index.mjs CHANGED
@@ -407,6 +407,9 @@ var CompatSchema = v3.pipe(
407
407
  v3.union([
408
408
  v3.pipe(
409
409
  OpenAICompletionsCompatSchema,
410
+ actions.wrappers.patch([
411
+ { type: "div", attributes: { class: "grid gap-2" } }
412
+ ]),
410
413
  hideWhen({
411
414
  disabled: true,
412
415
  listen(fn, field) {
@@ -418,6 +421,9 @@ var CompatSchema = v3.pipe(
418
421
  ),
419
422
  v3.pipe(
420
423
  OpenAIResponsesCompatSchema,
424
+ actions.wrappers.patch([
425
+ { type: "div", attributes: { class: "grid gap-2" } }
426
+ ]),
421
427
  hideWhen({
422
428
  disabled: true,
423
429
  listen(fn, field) {
@@ -429,6 +435,9 @@ var CompatSchema = v3.pipe(
429
435
  ),
430
436
  v3.pipe(
431
437
  AnthropicMessagesCompatSchema,
438
+ actions.wrappers.patch([
439
+ { type: "div", attributes: { class: "grid gap-2" } }
440
+ ]),
432
441
  hideWhen({
433
442
  disabled: true,
434
443
  listen(fn, field) {
@@ -536,6 +545,7 @@ var ModelSchema = v3.pipe(
536
545
  ),
537
546
  cost: v3.pipe(
538
547
  CostSchema,
548
+ renderConfig({ hidden: true }),
539
549
  v3.title("费用配置"),
540
550
  v3.description("模型 token 计价标准")
541
551
  ),
package/index.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/openai/chat/token.ts", "../../packages/openai/chat/message.define.ts", "../../packages/openai/chat/util/create.ts", "../../packages/openai/chat/module.ts", "../../packages/openai/chat/chat.ts", "../../packages/openai/chat/util/get-custom-provider.ts", "../../packages/openai/chat/provider.define.ts", "../../packages/openai/index.ts", "../../packages/openai/chat/util/faux-provider.ts"],
4
- "sourcesContent": ["import { InjectionToken, Signal } from 'static-injector';\nimport { OpenAIConfig } from './type';\n\nexport const OpenAIConfigToken = new InjectionToken<Signal<OpenAIConfig>>(\n 'OpenAIConfig',\n);\n", "import * as v from 'valibot';\nexport const ChatCompletionContentPartStr = v.object({\n text: v.string(),\n type: v.optional(v.literal('text'), 'text'),\n});\nexport type ChatCompletionContentPartStrType = v.InferOutput<\n typeof ChatCompletionContentPartStr\n>;\n\nexport const ChatCompletionContentPartImage = v.object({\n image_url: v.object({\n url: v.string(),\n }),\n type: v.optional(v.literal('image_url'), 'image_url'),\n});\nexport type ChatCompletionContentPartImageType = v.InferOutput<\n typeof ChatCompletionContentPartImage\n>;\nexport const ChatCompletionContentPart = v.array(\n v.union([ChatCompletionContentPartStr, ChatCompletionContentPartImage]),\n);\nexport const SystemChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const UserChatCompletionContent = ChatCompletionContentPart;\nexport type UserChatCompletionContentType = v.InferOutput<\n typeof UserChatCompletionContent\n>;\nexport const AssistantChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const SystemChatMessage = v.object({\n role: v.optional(v.literal('system'), 'system'),\n content: SystemChatCompletionContent,\n});\nexport type SystemChatMessageType = v.InferOutput<typeof SystemChatMessage>;\nexport const UserChatMessage = v.object({\n role: v.optional(v.literal('user'), 'user'),\n content: UserChatCompletionContent,\n});\nexport type UserChatMessageType = v.InferOutput<typeof UserChatMessage>;\n\nexport const AssistantChatMessage = v.object({\n role: v.optional(v.literal('assistant'), 'assistant'),\n content: AssistantChatCompletionContent,\n thinkContent: v.optional(v.string()),\n});\n\nexport type AssistantChatMessageType = v.InferOutput<\n typeof AssistantChatMessage\n>;\n\nexport const ChatMessageItemDefine = v.union([\n SystemChatMessage,\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport const ChatMessageCommonItemDefine = v.union([\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport type ChatMessageItemType = v.InferOutput<typeof ChatMessageItemDefine>;\nexport const ChatMessageListDefine = v.array(ChatMessageItemDefine);\n\nexport type ChatMessageListOutputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\nexport type ChatMessageListInputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\n", "import {\n AssistantChatMessageType,\n SystemChatMessageType,\n UserChatMessageType,\n} from '../message.define';\n\nexport function createSystemMessage() {\n return { role: 'system' } as SystemChatMessageType;\n}\nexport function createUserMessage(text?: string) {\n return {\n role: 'user',\n content:\n typeof text === 'string' ? [{ type: 'text', text: '' }] : undefined,\n } as UserChatMessageType;\n}\nexport function createAssistantMessage(text: string = '') {\n return {\n role: 'assistant',\n content: [{ type: 'text', text }],\n } as AssistantChatMessageType;\n}\n", "import { OpenAIConfigToken } from './token';\n\nexport const OPENAI_MODULE = {\n provider: [],\n token: { OpenAIConfigToken },\n};\n", "import {\n AssistantMessage,\n Context,\n stream,\n StreamOptions,\n UserMessage,\n} from '@earendil-works/pi-ai';\nimport {\n getModelConfig,\n ModelConfigInputType,\n} from './util/get-custom-provider';\nimport type OpenAI from 'openai';\nimport {\n AssistantChatMessage,\n ChatMessageItemType,\n SystemChatMessageType,\n UserChatMessage,\n} from './message.define';\nimport { deepClone } from '@cyia/util';\nimport { Injector } from 'static-injector';\nimport { OpenAIConfigToken } from './token';\nimport * as v from 'valibot';\n\nexport function createChatStream(input: ModelConfigInputType) {\n const result = getModelConfig(input);\n return (\n context: Omit<Context, 'messages'> & { messages: ChatMessageItemType[] },\n options?: StreamOptions,\n extra?: {\n response_format?: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming['response_format'];\n injector?: Injector;\n },\n ) => {\n context.messages = deepClone(context.messages);\n const PiPUserConvertDefine = v.pipe(\n UserChatMessage,\n v.transform(\n (item) =>\n ({\n role: 'user',\n timestamp: Date.now(),\n content: item.content.map((item) => {\n if (item.type === 'text') {\n return item;\n } else {\n const match = item.image_url.url.match(\n /^data:([^;]+);base64,(.+)$/,\n );\n return {\n type: 'image',\n mimeType: match![1],\n data: match![2],\n };\n }\n }),\n }) satisfies UserMessage,\n ),\n );\n const PiPAssConvertDefine = v.pipe(\n AssistantChatMessage,\n v.transform(\n (item) =>\n ({\n role: 'assistant',\n timestamp: Date.now(),\n content: item.content.map((item) => item),\n api: result.model.api,\n provider: result.model.provider,\n usage: {\n cacheRead: 0,\n cacheWrite: 0,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n total: 0,\n },\n input: 0,\n output: 0,\n totalTokens: 0,\n },\n stopReason: 'stop',\n model: result.model.api,\n }) satisfies AssistantMessage,\n ),\n );\n // todo 系统类型在输入时未处理\n const sysIndex = context.messages.findIndex(\n (item) => item.role === 'system',\n );\n if (sysIndex !== -1) {\n const item = context.messages[sysIndex] as any as SystemChatMessageType;\n context.messages.splice(sysIndex, 1);\n context.systemPrompt = item.content[0].text;\n }\n const createStream = () =>\n stream(\n result.model,\n {\n ...context,\n messages: v.parse(\n v.array(v.union([PiPUserConvertDefine, PiPAssConvertDefine])),\n context.messages,\n ),\n },\n {\n ...options,\n\n apiKey: options?.apiKey ?? result.config.apiKey,\n onPayload(payload, model) {\n payload = options?.onPayload?.(payload, model) ?? payload;\n if (model.api === 'openai-completions') {\n return {\n ...(payload as any),\n response_format: extra?.response_format,\n };\n }\n return payload;\n },\n },\n );\n\n let currentStream = createStream();\n const config = extra?.injector?.get(OpenAIConfigToken);\n return (async function* () {\n let hasRetry = false;\n while (true) {\n let retry = false;\n for await (const item of currentStream) {\n if (item.type === 'error') {\n if (\n item.error.errorMessage?.includes('404') &&\n item.error.errorMessage?.includes(\n 'no router for requested model',\n ) &&\n !hasRetry\n ) {\n if (config?.().tryPull?.()) {\n await config().pullModel?.(input.model);\n retry = true;\n break;\n }\n }\n }\n yield item;\n }\n if (!retry || hasRetry) {\n break;\n }\n hasRetry = true;\n currentStream = createStream();\n }\n })();\n };\n}\n", "import * as v from 'valibot';\n\nimport { getModel, Model } from '@earendil-works/pi-ai';\nimport { KnownProviderDefine } from '../provider.define';\nimport {\n actions,\n asControl,\n hideWhen,\n renderConfig,\n setAlias,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map } from 'rxjs';\n\nfunction getCustomProvider<\n T extends 'openai-completions' | 'openai-responses' | 'anthropic-messages',\n>(\n compat: T,\n model: string,\n name: string,\n input: Omit<Model<T>, 'api' | 'id' | 'name'>,\n) {\n return { ...input, id: model, api: compat, name } satisfies Model<T>;\n}\nexport function getModelConfig(input: ModelConfigInputType) {\n if (input.provider === ('faux' as any)) {\n return {\n model: input.config as Model<any>,\n config: input as ModelConfigOutputType,\n };\n }\n const config = v.parse(ModelConfigDefine, input);\n if (\n config.provider === 'openai-completions' ||\n config.provider === 'openai-responses' ||\n config.provider === 'anthropic-messages'\n ) {\n return {\n model: getCustomProvider(\n config.provider,\n config.model,\n config.name,\n config.config!,\n ),\n config: config,\n };\n }\n\n return {\n model: getModel(config.provider, config.model as any as never),\n config: config,\n };\n}\nexport const ThinkingLevelSchema = v.pipe(\n v.picklist(['minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('思考等级'),\n v.description('模型思考的详细程度,从最小到最大'),\n);\n\nexport const ModelThinkingLevelSchema = v.pipe(\n v.picklist(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('模型思考等级'),\n v.description('关闭或设置模型思考的详细程度'),\n);\n\n// --- Compat schemas (conditional on TApi) ---\n\n/** OpenAI Completions compatibility overrides */\nexport const OpenAICompletionsCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsStore: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持存储'),\n v.description('是否支持服务端会话存储'),\n ),\n ),\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n supportsReasoningEffort: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持推理努力'),\n v.description('是否支持 reasoning_effort 参数'),\n ),\n ),\n supportsUsageInStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title('流式用量'),\n v.description('流式输出中是否返回 usage 信息'),\n ),\n ),\n maxTokensField: v.optional(\n v.pipe(\n v.picklist(['max_completion_tokens', 'max_tokens']),\n v.title('最大 token 字段名'),\n v.description('指定最大 token 参数使用的是哪个字段名'),\n ),\n ),\n requiresToolResultName: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要工具结果名称'),\n v.description('是否要求工具结果消息包含 name 字段'),\n ),\n ),\n requiresAssistantAfterToolResult: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要助手回复'),\n v.description('工具结果后是否需要助手消息跟进'),\n ),\n ),\n requiresThinkingAsText: v.optional(\n v.pipe(\n v.boolean(),\n v.title('思考转文本'),\n v.description('是否将思考过程作为普通文本发送'),\n ),\n ),\n requiresReasoningContentOnAssistantMessages: v.optional(\n v.pipe(\n v.boolean(),\n v.title('推理内容在助手消息中'),\n v.description('是否在助手消息中包含推理内容'),\n ),\n ),\n thinkingFormat: v.optional(\n v.pipe(\n v.picklist([\n 'openai',\n 'openrouter',\n 'deepseek',\n 'together',\n 'zai',\n 'qwen',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ]),\n v.title('思考格式'),\n v.description('指定 thinking 标签的序列化格式'),\n ),\n ),\n openRouterRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('OpenRouter 路由'),\n v.description('自定义 OpenRouter 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n vercelGatewayRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('Vercel Gateway 路由'),\n v.description('自定义 Vercel AI Gateway 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n zaiToolStream: v.optional(\n v.pipe(\n v.boolean(),\n v.title('ZAI 工具流式'),\n v.description('是否启用 ZAI 平台工具调用的流式输出'),\n ),\n ),\n supportsStrictMode: v.optional(\n v.pipe(\n v.boolean(),\n v.title('严格模式'),\n v.description('是否支持工具的 JSON Schema 严格校验'),\n ),\n ),\n cacheControlFormat: v.optional(\n v.pipe(\n v.literal('anthropic'),\n v.title('缓存控制格式'),\n v.description('指定缓存控制的语法格式'),\n renderConfig({ hidden: true }),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Completions 兼容配置'),\n v.description('针对 OpenAI Completions API 的兼容性覆写选项'),\n);\n\n/** OpenAI Responses compatibility overrides */\nexport const OpenAIResponsesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n sendSessionIdHeader: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话 ID 标头'),\n v.description('是否在请求中携带 X-Session-ID 标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Responses 兼容配置'),\n v.description('针对 OpenAI Responses API 的兼容性覆写选项'),\n);\n\n/** Anthropic Messages compatibility overrides */\nexport const AnthropicMessagesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsEagerToolInputStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title(' eagerly 工具流式'),\n v.description('是否支持工具调用的 eager 模式流式输出'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsCacheControlOnTools: v.optional(\n v.pipe(\n v.boolean(),\n v.title('工具缓存控制'),\n v.description('是否支持在 tool_use 消息中使用 cache_control'),\n ),\n ),\n supportsTemperature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持温度参数'),\n v.description('模型/接口是否支持 temperature 参数'),\n ),\n ),\n forceAdaptiveThinking: v.optional(\n v.pipe(\n v.boolean(),\n v.title('强制自适应思考'),\n v.description('是否强制启用 adaptive thinking 模式'),\n ),\n ),\n allowEmptySignature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('允许空签名'),\n v.description('是否允许工具调用不指定签名(sha256)'),\n ),\n ),\n }),\n ),\n v.title('Anthropic Messages 兼容配置'),\n v.description('针对 Anthropic Messages API 的兼容性覆写选项'),\n);\n\n// Generic compat schema (union of all compat types)\nexport const CompatSchema = v.pipe(\n v.union([\n v.pipe(\n OpenAICompletionsCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-completions'),\n );\n },\n }),\n ),\n v.pipe(\n OpenAIResponsesCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-responses'),\n );\n },\n }),\n ),\n v.pipe(\n AnthropicMessagesCompatSchema,\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'anthropic-messages'),\n );\n },\n }),\n ),\n ]),\n setComponent('object'),\n v.title('兼容配置'),\n v.description(\n '模型 API 兼容性覆写选项,支持 OpenAI Completions、OpenAI Responses、Anthropic Messages 三种格式',\n ),\n);\n\n// --- Input array: (\"text\" | \"image\")[] ---\n\nexport const InputChoiceSchema = v.pipe(\n v.picklist(['text', 'image']),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n);\nexport const InputSchema = v.pipe(\n v.array(InputChoiceSchema),\n v.title('输入类型列表'),\n v.description('该模型支持的用户输入类型,如 text 文本或 image 图片'),\n);\n\n// --- Headers: Record<string, string> ---\n\nconst HeadersSchema = v.pipe(\n v.record(v.string(), v.string()),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头键值对配置'),\n renderConfig({ hidden: true }),\n);\n\n// --- Model schema (non-generic) ---\n\n/** Cost sub-schema */\nconst CostSchema = v.pipe(\n v.optional(\n v.object({\n input: v.pipe(\n v.number(),\n v.title('输入单价'),\n v.description('每 token 输入费用'),\n ),\n output: v.pipe(\n v.number(),\n v.title('输出单价'),\n v.description('每 token 输出费用'),\n ),\n cacheRead: v.pipe(\n v.number(),\n v.title('缓存读取单价'),\n v.description('从缓存读取每 token 的费用'),\n ),\n cacheWrite: v.pipe(\n v.number(),\n v.title('缓存写入单价'),\n v.description('写入缓存每 token 的费用'),\n ),\n }),\n { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n ),\n v.title('费用配置'),\n v.description('模型各操作类型的 token 计价标准'),\n);\n\n/** Thinking level map: Partial<Record<ModelThinkingLevel, string | null>> */\nconst ThinkingLevelMapSchema = v.pipe(\n v.record(\n ModelThinkingLevelSchema,\n v.pipe(\n v.nullish(v.string()),\n v.title('配置值'),\n v.description('对应思考等级的具体配置字符串,null 表示未设置'),\n ),\n ),\n v.title('思考等级配置映射'),\n v.description('各思考等级对应的具体配置参数映射'),\n);\n\n/**\n * Model schema for pi-ai models.\n * Matches `Model<TApi extends Api>` but without generic type preservation\n * at runtime — compat accepts any of the three compat variants via union.\n */\nexport const ModelSchema = v.pipe(\n v.object({\n provider: v.pipe(\n v.optional(v.string(), 'default'),\n v.title('厂商'),\n v.description('模型提供商,如 openai / anthropic / llama'),\n ),\n baseUrl: v.pipe(\n v.string(),\n v.title('基础 URL'),\n v.description('API 请求的基础地址'),\n ),\n reasoning: v.pipe(\n v.optional(v.boolean(), false),\n v.title('支持推理'),\n v.description('该模型是否支持思考/推理模式'),\n ),\n // thinkingLevelMap: v.optional(\n // v.pipe(\n // v.optional(ThinkingLevelMapSchema),\n // v.title('思考等级配置'),\n // v.description('各思考等级的具体参数配置映射'),\n // ),\n // ),\n input: v.pipe(\n v.optional(InputSchema, ['text', 'image']),\n asControl(),\n setComponent('picklist'),\n actions.inputs.set({ multiple: true, options: ['text', 'image'] }),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n ),\n cost: v.pipe(\n CostSchema,\n v.title('费用配置'),\n v.description('模型 token 计价标准'),\n ),\n contextWindow: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('上下文窗口'),\n v.description('模型支持的上下文最大 token 数'),\n ),\n maxTokens: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('最大输出 tokens'),\n v.description('单次请求允许的最大输出 token 数'),\n ),\n headers: v.optional(\n v.pipe(\n v.optional(HeadersSchema),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头配置'),\n ),\n ),\n compat: v.pipe(\n v.optional(CompatSchema, { supportsDeveloperRole: false }),\n v.title('兼容配置'),\n v.description('API 兼容性覆写选项'),\n ),\n }),\n v.title('模型定义'),\n v.description(\n 'pi-ai 模型的核心配置结构,包含模型标识、API 参数、费用及兼容性设置',\n ),\n);\n\nexport type ModelInput = v.InferInput<typeof ModelSchema>;\nexport type ModelOutput = v.InferOutput<typeof ModelSchema>;\n\n// --- ImagesModel schema ---\n\n/** Output array for image models: (\"text\" | \"image\")[] */\n\nexport const ModelConfigDefine = v.pipe(\n v.object({\n provider: v.pipe(KnownProviderDefine, setAlias('provider')),\n model: v.pipe(v.string(), v.title('模型名')),\n name: v.pipe(\n v.optional(v.string()),\n v.title('配置名'),\n v.description('模型的配置名称(默认为模型名)'),\n ),\n /** provider是自定义时使用 */\n apiKey: v.pipe(v.optional(v.string()), v.title('apiKey')),\n config: v.pipe(\n v.optional(ModelSchema),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['..', 'provider']] }).pipe(\n map(\n ({ list: [value] }) =>\n !(\n value === 'openai-completions' ||\n value === 'openai-responses' ||\n value === 'anthropic-messages'\n ),\n ),\n );\n },\n }),\n ),\n }),\n v.transform((item) => ({ ...item, name: item.name ?? item.model })),\n);\n\nexport type ModelConfigInputType = v.InferInput<typeof ModelConfigDefine>;\nexport type ModelConfigOutputType = v.InferOutput<typeof ModelConfigDefine>;\n", "import * as v from 'valibot';\nimport { KnownProvider } from '@earendil-works/pi-ai';\nexport const KnownProviderDefine = v.pipe(\n v.picklist([\n 'amazon-bedrock',\n 'anthropic',\n 'google',\n 'google-vertex',\n 'openai',\n 'azure-openai-responses',\n 'openai-codex',\n 'deepseek',\n 'github-copilot',\n 'xai',\n 'groq',\n 'cerebras',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'mistral',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'huggingface',\n 'fireworks',\n 'together',\n 'opencode',\n 'opencode-go',\n 'kimi-coding',\n 'cloudflare-workers-ai',\n 'cloudflare-ai-gateway',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n 'ant-ling',\n 'nvidia',\n 'zai-coding-cn',\n /** 自定义 */\n 'openai-completions',\n 'openai-responses',\n 'anthropic-messages',\n ]),\n v.title('提供商'),\n v.description(`'openai-completions','openai-responses','anthropic-messages',为自定义提供商`),\n);\n\nexport type KnownProviderType = v.InferOutput<typeof KnownProviderDefine>;\ntype D2T = KnownProvider extends KnownProviderType ? true : false;\ntype T2D = KnownProviderType extends KnownProvider ? true : false;\n", "export * from './chat/token';\nexport * from './chat/message.define';\nexport * from './chat/util/create';\nexport * from './chat/type/history';\nexport * from './chat/type';\nexport * from './chat/module';\nexport * from './chat/chat'\nexport * from './chat/util/get-custom-provider'\nexport { complete, stream, fauxAssistantMessage, fauxText, fauxThinking } from '@earendil-works/pi-ai'\nexport * from './chat/util/faux-provider'", "import {\n registerFauxProvider,\n fauxAssistantMessage,\n fauxText,\n Context,\n StreamOptions,\n FauxResponseStep,\n} from '@earendil-works/pi-ai';\n\n/**\n * 创建一个基于用户输入动态返回响应的方法。\n * @param responseFactory - 根据上下文动态生成响应的工厂函数,接收历史消息和调用序号,返回文本或文本数组\n */\nexport function createDynamicResponse(\n responseFactory: (context: Context, callCount: number) => string | string[],\n) {\n return async (\n context: Context,\n _options: StreamOptions | undefined,\n state: { callCount: number },\n ) => {\n const responses = responseFactory(context, state.callCount);\n const content = Array.isArray(responses)\n ? responses.map((r) => fauxText(r))\n : fauxText(responses);\n return fauxAssistantMessage(content);\n };\n}\n\n/** Options for registerFauxProvider. */\nexport interface MockProviderOptions {\n api?: string;\n provider?: string;\n tokensPerSecond?: number;\n}\n\n\n\n/**\n * Register a faux mock provider and return a ready-to-use model with cleanup.\n * \n * @example\n * ```ts\n * const { model, setResponses, unregister } = registerMockProvider();\n * setResponses([fauxAssistantMessage('hello')]);\n * const response = await complete(model, { messages: [{ role: 'user', content: 'hi', timestamp: Date.now() }] });\n * unregister(); // clean up when done\n * ```\n */\nexport function registerMockProvider(\n options?: MockProviderOptions,\n) {\n const registration = registerFauxProvider(options);\n\n return {\n model: registration.getModel(),\n setResponses: (responses: FauxResponseStep[]) => registration.setResponses(responses),\n unregister: () => registration.unregister(),\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { InjectionToken, Signal } from 'static-injector';\nimport { OpenAIConfig } from './type';\n\nexport const OpenAIConfigToken = new InjectionToken<Signal<OpenAIConfig>>(\n 'OpenAIConfig',\n);\n", "import * as v from 'valibot';\nexport const ChatCompletionContentPartStr = v.object({\n text: v.string(),\n type: v.optional(v.literal('text'), 'text'),\n});\nexport type ChatCompletionContentPartStrType = v.InferOutput<\n typeof ChatCompletionContentPartStr\n>;\n\nexport const ChatCompletionContentPartImage = v.object({\n image_url: v.object({\n url: v.string(),\n }),\n type: v.optional(v.literal('image_url'), 'image_url'),\n});\nexport type ChatCompletionContentPartImageType = v.InferOutput<\n typeof ChatCompletionContentPartImage\n>;\nexport const ChatCompletionContentPart = v.array(\n v.union([ChatCompletionContentPartStr, ChatCompletionContentPartImage]),\n);\nexport const SystemChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const UserChatCompletionContent = ChatCompletionContentPart;\nexport type UserChatCompletionContentType = v.InferOutput<\n typeof UserChatCompletionContent\n>;\nexport const AssistantChatCompletionContent = v.array(\n ChatCompletionContentPartStr,\n);\nexport const SystemChatMessage = v.object({\n role: v.optional(v.literal('system'), 'system'),\n content: SystemChatCompletionContent,\n});\nexport type SystemChatMessageType = v.InferOutput<typeof SystemChatMessage>;\nexport const UserChatMessage = v.object({\n role: v.optional(v.literal('user'), 'user'),\n content: UserChatCompletionContent,\n});\nexport type UserChatMessageType = v.InferOutput<typeof UserChatMessage>;\n\nexport const AssistantChatMessage = v.object({\n role: v.optional(v.literal('assistant'), 'assistant'),\n content: AssistantChatCompletionContent,\n thinkContent: v.optional(v.string()),\n});\n\nexport type AssistantChatMessageType = v.InferOutput<\n typeof AssistantChatMessage\n>;\n\nexport const ChatMessageItemDefine = v.union([\n SystemChatMessage,\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport const ChatMessageCommonItemDefine = v.union([\n UserChatMessage,\n AssistantChatMessage,\n]);\nexport type ChatMessageItemType = v.InferOutput<typeof ChatMessageItemDefine>;\nexport const ChatMessageListDefine = v.array(ChatMessageItemDefine);\n\nexport type ChatMessageListOutputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\nexport type ChatMessageListInputType = v.InferOutput<\n typeof ChatMessageListDefine\n>;\n", "import {\n AssistantChatMessageType,\n SystemChatMessageType,\n UserChatMessageType,\n} from '../message.define';\n\nexport function createSystemMessage() {\n return { role: 'system' } as SystemChatMessageType;\n}\nexport function createUserMessage(text?: string) {\n return {\n role: 'user',\n content:\n typeof text === 'string' ? [{ type: 'text', text: '' }] : undefined,\n } as UserChatMessageType;\n}\nexport function createAssistantMessage(text: string = '') {\n return {\n role: 'assistant',\n content: [{ type: 'text', text }],\n } as AssistantChatMessageType;\n}\n", "import { OpenAIConfigToken } from './token';\n\nexport const OPENAI_MODULE = {\n provider: [],\n token: { OpenAIConfigToken },\n};\n", "import {\n AssistantMessage,\n Context,\n stream,\n StreamOptions,\n UserMessage,\n} from '@earendil-works/pi-ai';\nimport {\n getModelConfig,\n ModelConfigInputType,\n} from './util/get-custom-provider';\nimport type OpenAI from 'openai';\nimport {\n AssistantChatMessage,\n ChatMessageItemType,\n SystemChatMessageType,\n UserChatMessage,\n} from './message.define';\nimport { deepClone } from '@cyia/util';\nimport { Injector } from 'static-injector';\nimport { OpenAIConfigToken } from './token';\nimport * as v from 'valibot';\n\nexport function createChatStream(input: ModelConfigInputType) {\n const result = getModelConfig(input);\n return (\n context: Omit<Context, 'messages'> & { messages: ChatMessageItemType[] },\n options?: StreamOptions,\n extra?: {\n response_format?: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming['response_format'];\n injector?: Injector;\n },\n ) => {\n context.messages = deepClone(context.messages);\n const PiPUserConvertDefine = v.pipe(\n UserChatMessage,\n v.transform(\n (item) =>\n ({\n role: 'user',\n timestamp: Date.now(),\n content: item.content.map((item) => {\n if (item.type === 'text') {\n return item;\n } else {\n const match = item.image_url.url.match(\n /^data:([^;]+);base64,(.+)$/,\n );\n return {\n type: 'image',\n mimeType: match![1],\n data: match![2],\n };\n }\n }),\n }) satisfies UserMessage,\n ),\n );\n const PiPAssConvertDefine = v.pipe(\n AssistantChatMessage,\n v.transform(\n (item) =>\n ({\n role: 'assistant',\n timestamp: Date.now(),\n content: item.content.map((item) => item),\n api: result.model.api,\n provider: result.model.provider,\n usage: {\n cacheRead: 0,\n cacheWrite: 0,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n total: 0,\n },\n input: 0,\n output: 0,\n totalTokens: 0,\n },\n stopReason: 'stop',\n model: result.model.api,\n }) satisfies AssistantMessage,\n ),\n );\n // todo 系统类型在输入时未处理\n const sysIndex = context.messages.findIndex(\n (item) => item.role === 'system',\n );\n if (sysIndex !== -1) {\n const item = context.messages[sysIndex] as any as SystemChatMessageType;\n context.messages.splice(sysIndex, 1);\n context.systemPrompt = item.content[0].text;\n }\n const createStream = () =>\n stream(\n result.model,\n {\n ...context,\n messages: v.parse(\n v.array(v.union([PiPUserConvertDefine, PiPAssConvertDefine])),\n context.messages,\n ),\n },\n {\n ...options,\n\n apiKey: options?.apiKey ?? result.config.apiKey,\n onPayload(payload, model) {\n payload = options?.onPayload?.(payload, model) ?? payload;\n if (model.api === 'openai-completions') {\n return {\n ...(payload as any),\n response_format: extra?.response_format,\n };\n }\n return payload;\n },\n },\n );\n\n let currentStream = createStream();\n const config = extra?.injector?.get(OpenAIConfigToken);\n return (async function* () {\n let hasRetry = false;\n while (true) {\n let retry = false;\n for await (const item of currentStream) {\n if (item.type === 'error') {\n if (\n item.error.errorMessage?.includes('404') &&\n item.error.errorMessage?.includes(\n 'no router for requested model',\n ) &&\n !hasRetry\n ) {\n if (config?.().tryPull?.()) {\n await config().pullModel?.(input.model);\n retry = true;\n break;\n }\n }\n }\n yield item;\n }\n if (!retry || hasRetry) {\n break;\n }\n hasRetry = true;\n currentStream = createStream();\n }\n })();\n };\n}\n", "import * as v from 'valibot';\n\nimport { getModel, Model } from '@earendil-works/pi-ai';\nimport { KnownProviderDefine } from '../provider.define';\nimport {\n actions,\n asControl,\n hideWhen,\n renderConfig,\n setAlias,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map } from 'rxjs';\n\nfunction getCustomProvider<\n T extends 'openai-completions' | 'openai-responses' | 'anthropic-messages',\n>(\n compat: T,\n model: string,\n name: string,\n input: Omit<Model<T>, 'api' | 'id' | 'name'>,\n) {\n return { ...input, id: model, api: compat, name } satisfies Model<T>;\n}\nexport function getModelConfig(input: ModelConfigInputType) {\n if (input.provider === ('faux' as any)) {\n return {\n model: input.config as Model<any>,\n config: input as ModelConfigOutputType,\n };\n }\n const config = v.parse(ModelConfigDefine, input);\n if (\n config.provider === 'openai-completions' ||\n config.provider === 'openai-responses' ||\n config.provider === 'anthropic-messages'\n ) {\n return {\n model: getCustomProvider(\n config.provider,\n config.model,\n config.name,\n config.config!,\n ),\n config: config,\n };\n }\n\n return {\n model: getModel(config.provider, config.model as any as never),\n config: config,\n };\n}\nexport const ThinkingLevelSchema = v.pipe(\n v.picklist(['minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('思考等级'),\n v.description('模型思考的详细程度,从最小到最大'),\n);\n\nexport const ModelThinkingLevelSchema = v.pipe(\n v.picklist(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']),\n v.title('模型思考等级'),\n v.description('关闭或设置模型思考的详细程度'),\n);\n\n// --- Compat schemas (conditional on TApi) ---\n\n/** OpenAI Completions compatibility overrides */\nexport const OpenAICompletionsCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsStore: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持存储'),\n v.description('是否支持服务端会话存储'),\n ),\n ),\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n supportsReasoningEffort: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持推理努力'),\n v.description('是否支持 reasoning_effort 参数'),\n ),\n ),\n supportsUsageInStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title('流式用量'),\n v.description('流式输出中是否返回 usage 信息'),\n ),\n ),\n maxTokensField: v.optional(\n v.pipe(\n v.picklist(['max_completion_tokens', 'max_tokens']),\n v.title('最大 token 字段名'),\n v.description('指定最大 token 参数使用的是哪个字段名'),\n ),\n ),\n requiresToolResultName: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要工具结果名称'),\n v.description('是否要求工具结果消息包含 name 字段'),\n ),\n ),\n requiresAssistantAfterToolResult: v.optional(\n v.pipe(\n v.boolean(),\n v.title('需要助手回复'),\n v.description('工具结果后是否需要助手消息跟进'),\n ),\n ),\n requiresThinkingAsText: v.optional(\n v.pipe(\n v.boolean(),\n v.title('思考转文本'),\n v.description('是否将思考过程作为普通文本发送'),\n ),\n ),\n requiresReasoningContentOnAssistantMessages: v.optional(\n v.pipe(\n v.boolean(),\n v.title('推理内容在助手消息中'),\n v.description('是否在助手消息中包含推理内容'),\n ),\n ),\n thinkingFormat: v.optional(\n v.pipe(\n v.picklist([\n 'openai',\n 'openrouter',\n 'deepseek',\n 'together',\n 'zai',\n 'qwen',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ]),\n v.title('思考格式'),\n v.description('指定 thinking 标签的序列化格式'),\n ),\n ),\n openRouterRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('OpenRouter 路由'),\n v.description('自定义 OpenRouter 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n vercelGatewayRouting: v.optional(\n v.pipe(\n v.any(),\n v.title('Vercel Gateway 路由'),\n v.description('自定义 Vercel AI Gateway 的路由配置'),\n renderConfig({ hidden: true }),\n ),\n ),\n zaiToolStream: v.optional(\n v.pipe(\n v.boolean(),\n v.title('ZAI 工具流式'),\n v.description('是否启用 ZAI 平台工具调用的流式输出'),\n ),\n ),\n supportsStrictMode: v.optional(\n v.pipe(\n v.boolean(),\n v.title('严格模式'),\n v.description('是否支持工具的 JSON Schema 严格校验'),\n ),\n ),\n cacheControlFormat: v.optional(\n v.pipe(\n v.literal('anthropic'),\n v.title('缓存控制格式'),\n v.description('指定缓存控制的语法格式'),\n renderConfig({ hidden: true }),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Completions 兼容配置'),\n v.description('针对 OpenAI Completions API 的兼容性覆写选项'),\n);\n\n/** OpenAI Responses compatibility overrides */\nexport const OpenAIResponsesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsDeveloperRole: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持开发者角色'),\n v.description('是否支持 developer 系统消息角色'),\n ),\n ),\n sendSessionIdHeader: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话 ID 标头'),\n v.description('是否在请求中携带 X-Session-ID 标头'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n }),\n ),\n v.title('OpenAI Responses 兼容配置'),\n v.description('针对 OpenAI Responses API 的兼容性覆写选项'),\n);\n\n/** Anthropic Messages compatibility overrides */\nexport const AnthropicMessagesCompatSchema = v.pipe(\n v.optional(\n v.object({\n supportsEagerToolInputStreaming: v.optional(\n v.pipe(\n v.boolean(),\n v.title(' eagerly 工具流式'),\n v.description('是否支持工具调用的 eager 模式流式输出'),\n ),\n ),\n supportsLongCacheRetention: v.optional(\n v.pipe(\n v.boolean(),\n v.title('长期缓存保留'),\n v.description('是否支持长期缓存保留策略'),\n ),\n ),\n sendSessionAffinityHeaders: v.optional(\n v.pipe(\n v.boolean(),\n v.title('发送会话亲和标头'),\n v.description('是否在请求中携带会话亲和性标头'),\n ),\n ),\n supportsCacheControlOnTools: v.optional(\n v.pipe(\n v.boolean(),\n v.title('工具缓存控制'),\n v.description('是否支持在 tool_use 消息中使用 cache_control'),\n ),\n ),\n supportsTemperature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('支持温度参数'),\n v.description('模型/接口是否支持 temperature 参数'),\n ),\n ),\n forceAdaptiveThinking: v.optional(\n v.pipe(\n v.boolean(),\n v.title('强制自适应思考'),\n v.description('是否强制启用 adaptive thinking 模式'),\n ),\n ),\n allowEmptySignature: v.optional(\n v.pipe(\n v.boolean(),\n v.title('允许空签名'),\n v.description('是否允许工具调用不指定签名(sha256)'),\n ),\n ),\n }),\n ),\n v.title('Anthropic Messages 兼容配置'),\n v.description('针对 Anthropic Messages API 的兼容性覆写选项'),\n);\n\n// Generic compat schema (union of all compat types)\nexport const CompatSchema = v.pipe(\n v.union([\n v.pipe(\n OpenAICompletionsCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-completions'),\n );\n },\n }),\n ),\n v.pipe(\n OpenAIResponsesCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'openai-responses'),\n );\n },\n }),\n ),\n v.pipe(\n AnthropicMessagesCompatSchema,\n actions.wrappers.patch([\n { type: 'div', attributes: { class: 'grid gap-2' } },\n ]),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['@provider']] }).pipe(\n map((item) => item.list[0] !== 'anthropic-messages'),\n );\n },\n }),\n ),\n ]),\n setComponent('object'),\n v.title('兼容配置'),\n v.description(\n '模型 API 兼容性覆写选项,支持 OpenAI Completions、OpenAI Responses、Anthropic Messages 三种格式',\n ),\n);\n\n// --- Input array: (\"text\" | \"image\")[] ---\n\nexport const InputChoiceSchema = v.pipe(\n v.picklist(['text', 'image']),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n);\nexport const InputSchema = v.pipe(\n v.array(InputChoiceSchema),\n v.title('输入类型列表'),\n v.description('该模型支持的用户输入类型,如 text 文本或 image 图片'),\n);\n\n// --- Headers: Record<string, string> ---\n\nconst HeadersSchema = v.pipe(\n v.record(v.string(), v.string()),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头键值对配置'),\n renderConfig({ hidden: true }),\n);\n\n// --- Model schema (non-generic) ---\n\n/** Cost sub-schema */\nconst CostSchema = v.pipe(\n v.optional(\n v.object({\n input: v.pipe(\n v.number(),\n v.title('输入单价'),\n v.description('每 token 输入费用'),\n ),\n output: v.pipe(\n v.number(),\n v.title('输出单价'),\n v.description('每 token 输出费用'),\n ),\n cacheRead: v.pipe(\n v.number(),\n v.title('缓存读取单价'),\n v.description('从缓存读取每 token 的费用'),\n ),\n cacheWrite: v.pipe(\n v.number(),\n v.title('缓存写入单价'),\n v.description('写入缓存每 token 的费用'),\n ),\n }),\n { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n ),\n v.title('费用配置'),\n v.description('模型各操作类型的 token 计价标准'),\n);\n\n/** Thinking level map: Partial<Record<ModelThinkingLevel, string | null>> */\nconst ThinkingLevelMapSchema = v.pipe(\n v.record(\n ModelThinkingLevelSchema,\n v.pipe(\n v.nullish(v.string()),\n v.title('配置值'),\n v.description('对应思考等级的具体配置字符串,null 表示未设置'),\n ),\n ),\n v.title('思考等级配置映射'),\n v.description('各思考等级对应的具体配置参数映射'),\n);\n\n/**\n * Model schema for pi-ai models.\n * Matches `Model<TApi extends Api>` but without generic type preservation\n * at runtime — compat accepts any of the three compat variants via union.\n */\nexport const ModelSchema = v.pipe(\n v.object({\n provider: v.pipe(\n v.optional(v.string(), 'default'),\n v.title('厂商'),\n v.description('模型提供商,如 openai / anthropic / llama'),\n ),\n baseUrl: v.pipe(\n v.string(),\n v.title('基础 URL'),\n v.description('API 请求的基础地址'),\n ),\n reasoning: v.pipe(\n v.optional(v.boolean(), false),\n v.title('支持推理'),\n v.description('该模型是否支持思考/推理模式'),\n ),\n // thinkingLevelMap: v.optional(\n // v.pipe(\n // v.optional(ThinkingLevelMapSchema),\n // v.title('思考等级配置'),\n // v.description('各思考等级的具体参数配置映射'),\n // ),\n // ),\n input: v.pipe(\n v.optional(InputSchema, ['text', 'image']),\n asControl(),\n setComponent('picklist'),\n actions.inputs.set({ multiple: true, options: ['text', 'image'] }),\n v.title('输入类型'),\n v.description('支持的输入模态类型'),\n ),\n cost: v.pipe(\n CostSchema,\n renderConfig({ hidden: true }),\n v.title('费用配置'),\n v.description('模型 token 计价标准'),\n ),\n contextWindow: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('上下文窗口'),\n v.description('模型支持的上下文最大 token 数'),\n ),\n maxTokens: v.pipe(\n v.pipe(v.optional(v.number(), 99999999)),\n v.title('最大输出 tokens'),\n v.description('单次请求允许的最大输出 token 数'),\n ),\n headers: v.optional(\n v.pipe(\n v.optional(HeadersSchema),\n v.title('自定义请求头'),\n v.description('额外的 HTTP 请求头配置'),\n ),\n ),\n compat: v.pipe(\n v.optional(CompatSchema, { supportsDeveloperRole: false }),\n v.title('兼容配置'),\n v.description('API 兼容性覆写选项'),\n ),\n }),\n v.title('模型定义'),\n v.description(\n 'pi-ai 模型的核心配置结构,包含模型标识、API 参数、费用及兼容性设置',\n ),\n);\n\nexport type ModelInput = v.InferInput<typeof ModelSchema>;\nexport type ModelOutput = v.InferOutput<typeof ModelSchema>;\n\n// --- ImagesModel schema ---\n\n/** Output array for image models: (\"text\" | \"image\")[] */\n\nexport const ModelConfigDefine = v.pipe(\n v.object({\n provider: v.pipe(KnownProviderDefine, setAlias('provider')),\n model: v.pipe(v.string(), v.title('模型名')),\n name: v.pipe(\n v.optional(v.string()),\n v.title('配置名'),\n v.description('模型的配置名称(默认为模型名)'),\n ),\n /** provider是自定义时使用 */\n apiKey: v.pipe(v.optional(v.string()), v.title('apiKey')),\n config: v.pipe(\n v.optional(ModelSchema),\n hideWhen({\n disabled: true,\n listen(fn, field) {\n return fn({ list: [['..', 'provider']] }).pipe(\n map(\n ({ list: [value] }) =>\n !(\n value === 'openai-completions' ||\n value === 'openai-responses' ||\n value === 'anthropic-messages'\n ),\n ),\n );\n },\n }),\n ),\n }),\n v.transform((item) => ({ ...item, name: item.name ?? item.model })),\n);\n\nexport type ModelConfigInputType = v.InferInput<typeof ModelConfigDefine>;\nexport type ModelConfigOutputType = v.InferOutput<typeof ModelConfigDefine>;\n", "import * as v from 'valibot';\nimport { KnownProvider } from '@earendil-works/pi-ai';\nexport const KnownProviderDefine = v.pipe(\n v.picklist([\n 'amazon-bedrock',\n 'anthropic',\n 'google',\n 'google-vertex',\n 'openai',\n 'azure-openai-responses',\n 'openai-codex',\n 'deepseek',\n 'github-copilot',\n 'xai',\n 'groq',\n 'cerebras',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'mistral',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'huggingface',\n 'fireworks',\n 'together',\n 'opencode',\n 'opencode-go',\n 'kimi-coding',\n 'cloudflare-workers-ai',\n 'cloudflare-ai-gateway',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n 'ant-ling',\n 'nvidia',\n 'zai-coding-cn',\n /** 自定义 */\n 'openai-completions',\n 'openai-responses',\n 'anthropic-messages',\n ]),\n v.title('提供商'),\n v.description(`'openai-completions','openai-responses','anthropic-messages',为自定义提供商`),\n);\n\nexport type KnownProviderType = v.InferOutput<typeof KnownProviderDefine>;\ntype D2T = KnownProvider extends KnownProviderType ? true : false;\ntype T2D = KnownProviderType extends KnownProvider ? true : false;\n", "export * from './chat/token';\nexport * from './chat/message.define';\nexport * from './chat/util/create';\nexport * from './chat/type/history';\nexport * from './chat/type';\nexport * from './chat/module';\nexport * from './chat/chat'\nexport * from './chat/util/get-custom-provider'\nexport { complete, stream, fauxAssistantMessage, fauxText, fauxThinking } from '@earendil-works/pi-ai'\nexport * from './chat/util/faux-provider'", "import {\n registerFauxProvider,\n fauxAssistantMessage,\n fauxText,\n Context,\n StreamOptions,\n FauxResponseStep,\n} from '@earendil-works/pi-ai';\n\n/**\n * 创建一个基于用户输入动态返回响应的方法。\n * @param responseFactory - 根据上下文动态生成响应的工厂函数,接收历史消息和调用序号,返回文本或文本数组\n */\nexport function createDynamicResponse(\n responseFactory: (context: Context, callCount: number) => string | string[],\n) {\n return async (\n context: Context,\n _options: StreamOptions | undefined,\n state: { callCount: number },\n ) => {\n const responses = responseFactory(context, state.callCount);\n const content = Array.isArray(responses)\n ? responses.map((r) => fauxText(r))\n : fauxText(responses);\n return fauxAssistantMessage(content);\n };\n}\n\n/** Options for registerFauxProvider. */\nexport interface MockProviderOptions {\n api?: string;\n provider?: string;\n tokensPerSecond?: number;\n}\n\n\n\n/**\n * Register a faux mock provider and return a ready-to-use model with cleanup.\n * \n * @example\n * ```ts\n * const { model, setResponses, unregister } = registerMockProvider();\n * setResponses([fauxAssistantMessage('hello')]);\n * const response = await complete(model, { messages: [{ role: 'user', content: 'hi', timestamp: Date.now() }] });\n * unregister(); // clean up when done\n * ```\n */\nexport function registerMockProvider(\n options?: MockProviderOptions,\n) {\n const registration = registerFauxProvider(options);\n\n return {\n model: registration.getModel(),\n setResponses: (responses: FauxResponseStep[]) => registration.setResponses(responses),\n unregister: () => registration.unregister(),\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["v", "v", "v", "item", "stream", "fauxAssistantMessage", "fauxText"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shenghuabi/openai",
3
- "version": "1.2.12",
3
+ "version": "1.2.13",
4
4
  "description": "模板",
5
5
  "author": "wszgrcy",
6
6
  "sideEffects": false,