@shenghuabi/openai 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/define/index.js CHANGED
@@ -250,15 +250,13 @@ var ChatItemDefine = v2.pipe(
250
250
  v2.description("大语言模型提供的厂商"),
251
251
  v2.title("对话厂商"),
252
252
  v2.metadata({
253
- enumOptions: VendorList.map((item) => {
254
- return {
255
- label: item.label,
256
- description: [
257
- item.options.description ? item.options.description : "",
258
- item.options.baseURL ? `链接: ${item.options.baseURL}` : ""
259
- ].filter(Boolean).join("\n")
260
- };
261
- })
253
+ enumOptions: VendorList.map((item) => ({
254
+ label: item.label,
255
+ description: [
256
+ item.options.description ? item.options.description : "",
257
+ item.options.baseURL ? `链接: ${item.options.baseURL}` : ""
258
+ ].filter(Boolean).join("\n")
259
+ }))
262
260
  }),
263
261
  (0, import_view_angular_core.patchInputs)({
264
262
  options: VendorList
@@ -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/options.define.ts"],
4
- "sourcesContent": ["export * from '../chat/message.define';\nexport * from '../chat/options.define';\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 detail: v.optional(v.picklist(['auto', 'low', 'high'])),\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 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 asControl,\n componentClass,\n hideWhen,\n patchInputs,\n patchProps,\n patchWrappers,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map, of } from 'rxjs';\nimport * as v from 'valibot';\nimport {\n asVirtualGroup,\n metadataPipe,\n omitIntersect,\n} from '@piying/valibot-visit';\nconst VendorList = [\n {\n value: 'openai',\n label: 'openai',\n options: {\n baseURL: '',\n modelList: [],\n description: '如果是openai兼容的厂商,需要设置baseURL',\n },\n },\n {\n value: '360',\n label: '360',\n options: { baseURL: 'https://ai.360.cn', modelList: [] },\n },\n {\n value: 'azure',\n label: 'azure',\n options: { baseURL: '', modelList: [] },\n },\n {\n value: 'moonshot',\n label: 'moonshot',\n options: { baseURL: 'https://api.moonshot.cn', modelList: [] },\n },\n {\n value: 'baichuan',\n label: 'baichuan',\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n {\n value: 'minimax',\n label: 'minimax',\n options: { baseURL: 'https://api.minimax.chat', modelList: [] },\n },\n {\n value: 'mistralai',\n label: 'mistralai',\n options: { baseURL: 'https://api.mistral.ai', modelList: [] },\n },\n {\n value: 'groq',\n label: 'groq',\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n {\n value: 'lingyiwanwu',\n label: 'lingyiwanwu',\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n {\n value: 'stepfun',\n label: 'stepfun',\n options: { baseURL: 'https://api.stepfun.com', modelList: [] },\n },\n {\n value: 'deepseek',\n label: 'deepseek',\n options: { baseURL: 'https://api.deepseek.com', modelList: [] },\n },\n {\n value: 'together.ai',\n label: 'together.ai',\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n {\n value: 'volcengine',\n label: 'volcengine',\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n {\n value: 'novita',\n label: 'novita',\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n {\n value: 'siliconflow',\n label: 'siliconflow',\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n {\n value: 'tongyi',\n label: 'tongyi',\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n {\n value: 'zhipu',\n label: 'zhipu',\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n {\n value: 'spark',\n label: 'spark',\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n {\n value: 'hunyuan',\n label: 'hunyuan',\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n\n {\n value: 'gemini',\n label: 'gemini',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n {\n value: 'claude',\n label: 'claude',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n] as const;\nconst vendorOptionsDescribe = `## 通用参数\n- \\`extraOptions\\`字段用于覆盖默认字段\n\\`\\`\\`json\n{\"厂商名(与vendor字段相同)\":{ \"extraOptions\":{\"temperature\":0.1,\"topP\":0.8,\"maxTokens\":8192,\"baseURL\":\"http://127.0.0.1:11434/v1\",\"apiKey\":\" \"} }\n\\`\\`\\`\n`;\nconst InputWrapper = metadataPipe(patchWrappers(['tooltip', 'form-field']));\n\nexport const ChatItemDefine = v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(v.string(), v.title('配置名')),\n vendor: v.pipe(\n v.optional(\n v.picklist(VendorList.map((item) => item.value)),\n 'openai',\n ),\n v.description('大语言模型提供的厂商'),\n v.title('对话厂商'),\n v.metadata({\n enumOptions: VendorList.map((item) => {\n return {\n label: item.label,\n description: [\n (item.options as any).description\n ? (item.options as any).description\n : '',\n item.options.baseURL ? `链接: ${item.options.baseURL}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n };\n }),\n }),\n patchInputs({\n options: VendorList,\n }),\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.pipe(\n v.object({\n baseURL: v.pipe(\n v.optional(v.string(), 'http://127.0.0.1:11434/v1'),\n v.title('地址'),\n v.description('openai兼容接口'),\n ...InputWrapper,\n ),\n model: v.pipe(\n v.optional(v.string(), `qwen3:8b`),\n v.title('模型'),\n v.description(\n '## 模型名\\n### ollama模型推荐\\n- `qwen3:8b`\\n- `qwen3:14b`,`deepseek-r1:7b`,`deepseek-r1:14b`\\n### 图片对话模型\\n- `minicpm-v:8b`',\n ),\n ...InputWrapper,\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.object({\n apiKey: v.pipe(\n v.optional(v.string()),\n v.description('本地部署默认可以不填'),\n ),\n }),\n v.pipe(\n v.object({\n max_tokens: v.pipe(v.optional(v.number(), 8192)),\n top_p: v.pipe(\n v.optional(v.number(), 0.8),\n v.minValue(0),\n v.maxValue(10),\n v.description(`核采样(nucleus sampling)是温度采样的另一种替代方法,模型会考虑累积概率质量达到 top_p 的 token。例如,当 top_p 设为 0.1 时,仅考虑累积概率前 10% 的 token。\n\n我们通常建议调整 top_p 或温度参数,但不要同时调整两者。`),\n ...InputWrapper,\n ),\n temperature: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(2)), 0.1),\n v.description(\n '采样温度应设置在0到2之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)则会使输出更集中且确定。我们通常建议仅调整此参数或top_p,而不同时调整两者。',\n ),\n ...InputWrapper,\n ),\n frequency_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '取值范围为-2.0至2.0。正值会根据当前文本中已有标记的频率对新标记进行惩罚,从而降低模型逐字重复相同内容的概率。',\n ),\n ...InputWrapper,\n ),\n presence_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '数值介于-2.0至2.0之间。正值会基于新标记是否已在当前文本中出现,对新标记施加惩罚,从而提升模型讨论新话题的可能性。',\n ),\n ...InputWrapper,\n ),\n seed: v.pipe(\n v.optional(v.pipe(v.number())),\n v.description(\n '若已指定,系统将尽力确保采样具有确定性,即使用相同种子和参数的重复请求将返回相同结果。确定性无法保证,请通过 system_fingerprint 响应参数监控后端变化。',\n ),\n ...InputWrapper,\n ),\n stop: v.pipe(\n v.optional(v.pipe(v.array(v.pipe(v.string())), v.maxLength(4))),\n v.description(\n '最多可指定4个停止序列,API将在生成到该序列时停止,返回的文本中不包含该停止序列。',\n ),\n asControl(),\n setComponent('chip-input-list'),\n patchInputs({\n addOnBlur: true,\n }),\n ...InputWrapper,\n ),\n // top_logprobs: v.pipe(\n // v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(20))),\n // v.description(\n // '一个介于0和20之间的整数,用于指定在每个标记位置返回的最可能的标记数量,每个标记均关联对应的对数概率。若使用此参数,则必须将logprobs设置为true。',\n // ),\n // ),\n\n // verbosity: v.pipe(\n // v.optional(v.picklist(['low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n // reasoning_effort: v.pipe(\n // v.optional(v.picklist(['minimal', 'low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n }),\n componentClass('grid gap-2'),\n ),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n);\n\nexport const VendorOptionsDefine = v.pipe(\n v.optional(\n v.record(\n v.string(),\n v.pipe(\n v.intersect([\n v.object({\n /** @internal */\n extraOptions: v.pipe(\n v.optional(omitIntersect(ChatItemDefine, ['name', 'vendor'])),\n v.description(`附加配置`),\n ),\n }),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n ),\n ),\n ),\n v.description(vendorOptionsDescribe),\n setComponent('rest-chip-group'),\n patchInputs({\n optionalkeyList: VendorList.map((item) => item.value),\n placeholder: '请设置额外配置',\n }),\n v.title('厂商额外配置'),\n);\nexport const ChatParamsItemDefine = v.pipe(\n v.intersect([\n ChatItemDefine,\n v.object({ vendorOptions: VendorOptionsDefine }),\n ]),\n asVirtualGroup(),\n componentClass('grid gap-2'),\n);\n\nexport const ChatParamsListDefine = v.pipe(\n v.array(ChatParamsItemDefine),\n setComponent('label-chip-array'),\n v.description('对话模型列表,目前用于切换使用'),\n patchInputs({\n displayKey: 'name',\n placeholder: '请添加配置',\n }),\n);\nexport type ChatModelOptions = v.InferOutput<typeof ChatParamsItemDefine>;\nexport type ChatModelOptionsInput = v.InferInput<typeof ChatParamsItemDefine>;\n\nexport const InputChatOptionsDefine = omitIntersect(ChatParamsItemDefine, [\n 'name',\n]);\nexport type CreateChatModelOptions = v.InferInput<typeof InputChatOptionsDefine>;"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,QAAmB;AACZ,IAAM,+BAAiC,SAAO;AAAA,EACnD,MAAQ,SAAO;AAAA,EACf,MAAQ,WAAW,UAAQ,MAAM,GAAG,MAAM;AAC5C,CAAC;AAKM,IAAM,iCAAmC,SAAO;AAAA,EACrD,WAAa,SAAO;AAAA,IAClB,KAAO,SAAO;AAAA,IACd,QAAU,WAAW,WAAS,CAAC,QAAQ,OAAO,MAAM,CAAC,CAAC;AAAA,EACxD,CAAC;AAAA,EACD,MAAQ,WAAW,UAAQ,WAAW,GAAG,WAAW;AACtD,CAAC;AAIM,IAAM,4BAA8B;AAAA,EACvC,QAAM,CAAC,8BAA8B,8BAA8B,CAAC;AACxE;AACO,IAAM,8BAAgC;AAAA,EAC3C;AACF;AACO,IAAM,4BAA4B;AAIlC,IAAM,iCAAmC;AAAA,EAC9C;AACF;AACO,IAAM,oBAAsB,SAAO;AAAA,EACxC,MAAQ,WAAW,UAAQ,QAAQ,GAAG,QAAQ;AAAA,EAC9C,SAAS;AACX,CAAC;AAEM,IAAM,kBAAoB,SAAO;AAAA,EACtC,MAAQ,WAAW,UAAQ,MAAM,GAAG,MAAM;AAAA,EAC1C,SAAS;AACX,CAAC;AAGM,IAAM,uBAAyB,SAAO;AAAA,EAC3C,MAAQ,WAAW,UAAQ,WAAW,GAAG,WAAW;AAAA,EACpD,SAAS;AAAA,EACT,cAAgB,WAAW,SAAO,CAAC;AACrC,CAAC;AAMM,IAAM,wBAA0B,QAAM;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,wBAA0B,QAAM,qBAAqB;;;AC3DlE,+BAQO;AAEP,IAAAA,KAAmB;AACnB,2BAIO;AACP,IAAM,aAAa;AAAA,EACjB;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,qBAAqB,WAAW,CAAC,EAAE;AAAA,EACzD;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,IAAI,WAAW,CAAC,EAAE;AAAA,EACxC;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,2BAA2B,WAAW,CAAC,EAAE;AAAA,EAC/D;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE;AAAA,EAChE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,0BAA0B,WAAW,CAAC,EAAE;AAAA,EAC9D;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,2BAA2B,WAAW,CAAC,EAAE;AAAA,EAC/D;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE;AAAA,EAChE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE;AAAA,EAChE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,mCAAmC,WAAW,CAAC,EAAE;AAAA,EACvE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,8BAA8B,WAAW,CAAC,EAAE;AAAA,EAClE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,EACF;AACF;AACA,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAM9B,IAAM,mBAAe,uCAAa,wCAAc,CAAC,WAAW,YAAY,CAAC,CAAC;AAEnE,IAAM,iBAAmB;AAAA,EAC5B,aAAU;AAAA,IACR;AAAA,MACE,UAAO;AAAA,QACP,MAAQ,QAAO,UAAO,GAAK,SAAM,KAAK,CAAC;AAAA,QACvC,QAAU;AAAA,UACN;AAAA,YACE,YAAS,WAAW,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,YAC/C;AAAA,UACF;AAAA,UACE,eAAY,YAAY;AAAA,UACxB,SAAM,MAAM;AAAA,UACZ,YAAS;AAAA,YACT,aAAa,WAAW,IAAI,CAAC,SAAS;AACpC,qBAAO;AAAA,gBACL,OAAO,KAAK;AAAA,gBACZ,aAAa;AAAA,kBACV,KAAK,QAAgB,cACjB,KAAK,QAAgB,cACtB;AAAA,kBACJ,KAAK,QAAQ,UAAU,OAAO,KAAK,QAAQ,OAAO,KAAK;AAAA,gBACzD,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,cACd;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,cACD,sCAAY;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,UACD,yCAAe,kCAAkC;AAAA,IACnD;AAAA,IACE;AAAA,MACE,UAAO;AAAA,QACP,SAAW;AAAA,UACP,YAAW,UAAO,GAAG,2BAA2B;AAAA,UAChD,SAAM,IAAI;AAAA,UACV,eAAY,YAAY;AAAA,UAC1B,GAAG;AAAA,QACL;AAAA,QACA,OAAS;AAAA,UACL,YAAW,UAAO,GAAG,UAAU;AAAA,UAC/B,SAAM,IAAI;AAAA,UACV;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,MACF,CAAC;AAAA,UACD,yCAAe,kCAAkC;AAAA,IACnD;AAAA,IACE,UAAO;AAAA,MACP,QAAU;AAAA,QACN,YAAW,UAAO,CAAC;AAAA,QACnB,eAAY,YAAY;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,IACC;AAAA,MACE,UAAO;AAAA,QACP,YAAc,QAAO,YAAW,UAAO,GAAG,IAAI,CAAC;AAAA,QAC/C,OAAS;AAAA,UACL,YAAW,UAAO,GAAG,GAAG;AAAA,UACxB,YAAS,CAAC;AAAA,UACV,YAAS,EAAE;AAAA,UACX,eAAY;AAAA;AAAA,gCAEQ;AAAA,UACtB,GAAG;AAAA,QACL;AAAA,QACA,aAAe;AAAA,UACX,YAAW,QAAO,UAAO,GAAK,YAAS,CAAC,GAAK,YAAS,CAAC,CAAC,GAAG,GAAG;AAAA,UAC9D;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,mBAAqB;AAAA,UACjB,YAAW,QAAO,UAAO,GAAK,YAAS,EAAE,GAAK,YAAS,CAAC,CAAC,CAAC;AAAA,UAC1D;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,kBAAoB;AAAA,UAChB,YAAW,QAAO,UAAO,GAAK,YAAS,EAAE,GAAK,YAAS,CAAC,CAAC,CAAC;AAAA,UAC1D;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,MAAQ;AAAA,UACJ,YAAW,QAAO,UAAO,CAAC,CAAC;AAAA,UAC3B;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,MAAQ;AAAA,UACJ,YAAW,QAAO,SAAQ,QAAO,UAAO,CAAC,CAAC,GAAK,aAAU,CAAC,CAAC,CAAC;AAAA,UAC5D;AAAA,YACA;AAAA,UACF;AAAA,cACA,oCAAU;AAAA,cACV,uCAAa,iBAAiB;AAAA,cAC9B,sCAAY;AAAA,YACV,WAAW;AAAA,UACb,CAAC;AAAA,UACD,GAAG;AAAA,QACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAoBF,CAAC;AAAA,UACD,yCAAe,YAAY;AAAA,IAC7B;AAAA,EACF,CAAC;AAAA,MACD,yCAAe,YAAY;AAAA,MAC3B,qCAAe;AACjB;AAEO,IAAM,sBAAwB;AAAA,EACjC;AAAA,IACE;AAAA,MACE,UAAO;AAAA,MACP;AAAA,QACE,aAAU;AAAA,UACR,UAAO;AAAA;AAAA,YAEP,cAAgB;AAAA,cACZ,gBAAS,oCAAc,gBAAgB,CAAC,QAAQ,QAAQ,CAAC,CAAC;AAAA,cAC1D,eAAY,MAAM;AAAA,YACtB;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,YACD,yCAAe,YAAY;AAAA,YAC3B,qCAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EACE,eAAY,qBAAqB;AAAA,MACnC,uCAAa,iBAAiB;AAAA,MAC9B,sCAAY;AAAA,IACV,iBAAiB,WAAW,IAAI,CAAC,SAAS,KAAK,KAAK;AAAA,IACpD,aAAa;AAAA,EACf,CAAC;AAAA,EACC,SAAM,QAAQ;AAClB;AACO,IAAM,uBAAyB;AAAA,EAClC,aAAU;AAAA,IACV;AAAA,IACE,UAAO,EAAE,eAAe,oBAAoB,CAAC;AAAA,EACjD,CAAC;AAAA,MACD,qCAAe;AAAA,MACf,yCAAe,YAAY;AAC7B;AAEO,IAAM,uBAAyB;AAAA,EAClC,SAAM,oBAAoB;AAAA,MAC5B,uCAAa,kBAAkB;AAAA,EAC7B,eAAY,iBAAiB;AAAA,MAC/B,sCAAY;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AACH;AAIO,IAAM,6BAAyB,oCAAc,sBAAsB;AAAA,EACxE;AACF,CAAC;",
4
+ "sourcesContent": ["export * from '../chat/message.define';\nexport * from '../chat/options.define';\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 detail: v.optional(v.picklist(['auto', 'low', 'high'])),\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 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 asControl,\n componentClass,\n patchInputs,\n patchWrappers,\n setComponent,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport {\n asVirtualGroup,\n metadataPipe,\n omitIntersect,\n} from '@piying/valibot-visit';\nconst VendorList = [\n {\n value: 'openai',\n label: 'openai',\n options: {\n baseURL: '',\n modelList: [],\n description: '如果是openai兼容的厂商,需要设置baseURL',\n },\n },\n {\n value: '360',\n label: '360',\n options: { baseURL: 'https://ai.360.cn', modelList: [] },\n },\n {\n value: 'azure',\n label: 'azure',\n options: { baseURL: '', modelList: [] },\n },\n {\n value: 'moonshot',\n label: 'moonshot',\n options: { baseURL: 'https://api.moonshot.cn', modelList: [] },\n },\n {\n value: 'baichuan',\n label: 'baichuan',\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n {\n value: 'minimax',\n label: 'minimax',\n options: { baseURL: 'https://api.minimax.chat', modelList: [] },\n },\n {\n value: 'mistralai',\n label: 'mistralai',\n options: { baseURL: 'https://api.mistral.ai', modelList: [] },\n },\n {\n value: 'groq',\n label: 'groq',\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n {\n value: 'lingyiwanwu',\n label: 'lingyiwanwu',\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n {\n value: 'stepfun',\n label: 'stepfun',\n options: { baseURL: 'https://api.stepfun.com', modelList: [] },\n },\n {\n value: 'deepseek',\n label: 'deepseek',\n options: { baseURL: 'https://api.deepseek.com', modelList: [] },\n },\n {\n value: 'together.ai',\n label: 'together.ai',\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n {\n value: 'volcengine',\n label: 'volcengine',\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n {\n value: 'novita',\n label: 'novita',\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n {\n value: 'siliconflow',\n label: 'siliconflow',\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n {\n value: 'tongyi',\n label: 'tongyi',\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n {\n value: 'zhipu',\n label: 'zhipu',\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n {\n value: 'spark',\n label: 'spark',\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n {\n value: 'hunyuan',\n label: 'hunyuan',\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n\n {\n value: 'gemini',\n label: 'gemini',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n {\n value: 'claude',\n label: 'claude',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n] as const;\nconst vendorOptionsDescribe = `## 通用参数\n- \\`extraOptions\\`字段用于覆盖默认字段\n\\`\\`\\`json\n{\"厂商名(与vendor字段相同)\":{ \"extraOptions\":{\"temperature\":0.1,\"topP\":0.8,\"maxTokens\":8192,\"baseURL\":\"http://127.0.0.1:11434/v1\",\"apiKey\":\" \"} }\n\\`\\`\\`\n`;\nconst InputWrapper = metadataPipe(patchWrappers(['tooltip', 'form-field']));\n\nexport const ChatItemDefine = v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(v.string(), v.title('配置名')),\n vendor: v.pipe(\n v.optional(\n v.picklist(VendorList.map((item) => item.value)),\n 'openai',\n ),\n v.description('大语言模型提供的厂商'),\n v.title('对话厂商'),\n v.metadata({\n enumOptions: VendorList.map((item) => ({\n label: item.label,\n description: [\n (item.options as any).description\n ? (item.options as any).description\n : '',\n item.options.baseURL ? `链接: ${item.options.baseURL}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n })),\n }),\n patchInputs({\n options: VendorList,\n }),\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.pipe(\n v.object({\n baseURL: v.pipe(\n v.optional(v.string(), 'http://127.0.0.1:11434/v1'),\n v.title('地址'),\n v.description('openai兼容接口'),\n ...InputWrapper,\n ),\n model: v.pipe(\n v.optional(v.string(), `qwen3:8b`),\n v.title('模型'),\n v.description(\n '## 模型名\\n### ollama模型推荐\\n- `qwen3:8b`\\n- `qwen3:14b`,`deepseek-r1:7b`,`deepseek-r1:14b`\\n### 图片对话模型\\n- `minicpm-v:8b`',\n ),\n ...InputWrapper,\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.object({\n apiKey: v.pipe(\n v.optional(v.string()),\n v.description('本地部署默认可以不填'),\n ),\n }),\n v.pipe(\n v.object({\n max_tokens: v.pipe(v.optional(v.number(), 8192)),\n top_p: v.pipe(\n v.optional(v.number(), 0.8),\n v.minValue(0),\n v.maxValue(10),\n v.description(`核采样(nucleus sampling)是温度采样的另一种替代方法,模型会考虑累积概率质量达到 top_p 的 token。例如,当 top_p 设为 0.1 时,仅考虑累积概率前 10% 的 token。\n\n我们通常建议调整 top_p 或温度参数,但不要同时调整两者。`),\n ...InputWrapper,\n ),\n temperature: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(2)), 0.1),\n v.description(\n '采样温度应设置在0到2之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)则会使输出更集中且确定。我们通常建议仅调整此参数或top_p,而不同时调整两者。',\n ),\n ...InputWrapper,\n ),\n frequency_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '取值范围为-2.0至2.0。正值会根据当前文本中已有标记的频率对新标记进行惩罚,从而降低模型逐字重复相同内容的概率。',\n ),\n ...InputWrapper,\n ),\n presence_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '数值介于-2.0至2.0之间。正值会基于新标记是否已在当前文本中出现,对新标记施加惩罚,从而提升模型讨论新话题的可能性。',\n ),\n ...InputWrapper,\n ),\n seed: v.pipe(\n v.optional(v.pipe(v.number())),\n v.description(\n '若已指定,系统将尽力确保采样具有确定性,即使用相同种子和参数的重复请求将返回相同结果。确定性无法保证,请通过 system_fingerprint 响应参数监控后端变化。',\n ),\n ...InputWrapper,\n ),\n stop: v.pipe(\n v.optional(v.pipe(v.array(v.pipe(v.string())), v.maxLength(4))),\n v.description(\n '最多可指定4个停止序列,API将在生成到该序列时停止,返回的文本中不包含该停止序列。',\n ),\n asControl(),\n setComponent('chip-input-list'),\n patchInputs({\n addOnBlur: true,\n }),\n ...InputWrapper,\n ),\n // top_logprobs: v.pipe(\n // v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(20))),\n // v.description(\n // '一个介于0和20之间的整数,用于指定在每个标记位置返回的最可能的标记数量,每个标记均关联对应的对数概率。若使用此参数,则必须将logprobs设置为true。',\n // ),\n // ),\n\n // verbosity: v.pipe(\n // v.optional(v.picklist(['low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n // reasoning_effort: v.pipe(\n // v.optional(v.picklist(['minimal', 'low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n }),\n componentClass('grid gap-2'),\n ),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n);\n\nexport const VendorOptionsDefine = v.pipe(\n v.optional(\n v.record(\n v.string(),\n v.pipe(\n v.intersect([\n v.object({\n /** @internal */\n extraOptions: v.pipe(\n v.optional(omitIntersect(ChatItemDefine, ['name', 'vendor'])),\n v.description(`附加配置`),\n ),\n }),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n ),\n ),\n ),\n v.description(vendorOptionsDescribe),\n setComponent('rest-chip-group'),\n patchInputs({\n optionalkeyList: VendorList.map((item) => item.value),\n placeholder: '请设置额外配置',\n }),\n v.title('厂商额外配置'),\n);\nexport const ChatParamsItemDefine = v.pipe(\n v.intersect([\n ChatItemDefine,\n v.object({ vendorOptions: VendorOptionsDefine }),\n ]),\n asVirtualGroup(),\n componentClass('grid gap-2'),\n);\n\nexport const ChatParamsListDefine = v.pipe(\n v.array(ChatParamsItemDefine),\n setComponent('label-chip-array'),\n v.description('对话模型列表,目前用于切换使用'),\n patchInputs({\n displayKey: 'name',\n placeholder: '请添加配置',\n }),\n);\nexport type ChatModelOptions = v.InferOutput<typeof ChatParamsItemDefine>;\nexport type ChatModelOptionsInput = v.InferInput<typeof ChatParamsItemDefine>;\n\nexport const InputChatOptionsDefine = omitIntersect(ChatParamsItemDefine, [\n 'name',\n]);\nexport type CreateChatModelOptions = v.InferInput<\n typeof InputChatOptionsDefine\n>;\n"],
5
+ "mappings": "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",
6
6
  "names": ["v"]
7
7
  }
package/define/index.mjs CHANGED
@@ -209,15 +209,13 @@ var ChatItemDefine = v2.pipe(
209
209
  v2.description("大语言模型提供的厂商"),
210
210
  v2.title("对话厂商"),
211
211
  v2.metadata({
212
- enumOptions: VendorList.map((item) => {
213
- return {
214
- label: item.label,
215
- description: [
216
- item.options.description ? item.options.description : "",
217
- item.options.baseURL ? `链接: ${item.options.baseURL}` : ""
218
- ].filter(Boolean).join("\n")
219
- };
220
- })
212
+ enumOptions: VendorList.map((item) => ({
213
+ label: item.label,
214
+ description: [
215
+ item.options.description ? item.options.description : "",
216
+ item.options.baseURL ? `链接: ${item.options.baseURL}` : ""
217
+ ].filter(Boolean).join("\n")
218
+ }))
221
219
  }),
222
220
  patchInputs({
223
221
  options: VendorList
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/openai/chat/message.define.ts", "../../../packages/openai/chat/options.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 detail: v.optional(v.picklist(['auto', 'low', 'high'])),\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 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 asControl,\n componentClass,\n hideWhen,\n patchInputs,\n patchProps,\n patchWrappers,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map, of } from 'rxjs';\nimport * as v from 'valibot';\nimport {\n asVirtualGroup,\n metadataPipe,\n omitIntersect,\n} from '@piying/valibot-visit';\nconst VendorList = [\n {\n value: 'openai',\n label: 'openai',\n options: {\n baseURL: '',\n modelList: [],\n description: '如果是openai兼容的厂商,需要设置baseURL',\n },\n },\n {\n value: '360',\n label: '360',\n options: { baseURL: 'https://ai.360.cn', modelList: [] },\n },\n {\n value: 'azure',\n label: 'azure',\n options: { baseURL: '', modelList: [] },\n },\n {\n value: 'moonshot',\n label: 'moonshot',\n options: { baseURL: 'https://api.moonshot.cn', modelList: [] },\n },\n {\n value: 'baichuan',\n label: 'baichuan',\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n {\n value: 'minimax',\n label: 'minimax',\n options: { baseURL: 'https://api.minimax.chat', modelList: [] },\n },\n {\n value: 'mistralai',\n label: 'mistralai',\n options: { baseURL: 'https://api.mistral.ai', modelList: [] },\n },\n {\n value: 'groq',\n label: 'groq',\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n {\n value: 'lingyiwanwu',\n label: 'lingyiwanwu',\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n {\n value: 'stepfun',\n label: 'stepfun',\n options: { baseURL: 'https://api.stepfun.com', modelList: [] },\n },\n {\n value: 'deepseek',\n label: 'deepseek',\n options: { baseURL: 'https://api.deepseek.com', modelList: [] },\n },\n {\n value: 'together.ai',\n label: 'together.ai',\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n {\n value: 'volcengine',\n label: 'volcengine',\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n {\n value: 'novita',\n label: 'novita',\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n {\n value: 'siliconflow',\n label: 'siliconflow',\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n {\n value: 'tongyi',\n label: 'tongyi',\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n {\n value: 'zhipu',\n label: 'zhipu',\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n {\n value: 'spark',\n label: 'spark',\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n {\n value: 'hunyuan',\n label: 'hunyuan',\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n\n {\n value: 'gemini',\n label: 'gemini',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n {\n value: 'claude',\n label: 'claude',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n] as const;\nconst vendorOptionsDescribe = `## 通用参数\n- \\`extraOptions\\`字段用于覆盖默认字段\n\\`\\`\\`json\n{\"厂商名(与vendor字段相同)\":{ \"extraOptions\":{\"temperature\":0.1,\"topP\":0.8,\"maxTokens\":8192,\"baseURL\":\"http://127.0.0.1:11434/v1\",\"apiKey\":\" \"} }\n\\`\\`\\`\n`;\nconst InputWrapper = metadataPipe(patchWrappers(['tooltip', 'form-field']));\n\nexport const ChatItemDefine = v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(v.string(), v.title('配置名')),\n vendor: v.pipe(\n v.optional(\n v.picklist(VendorList.map((item) => item.value)),\n 'openai',\n ),\n v.description('大语言模型提供的厂商'),\n v.title('对话厂商'),\n v.metadata({\n enumOptions: VendorList.map((item) => {\n return {\n label: item.label,\n description: [\n (item.options as any).description\n ? (item.options as any).description\n : '',\n item.options.baseURL ? `链接: ${item.options.baseURL}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n };\n }),\n }),\n patchInputs({\n options: VendorList,\n }),\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.pipe(\n v.object({\n baseURL: v.pipe(\n v.optional(v.string(), 'http://127.0.0.1:11434/v1'),\n v.title('地址'),\n v.description('openai兼容接口'),\n ...InputWrapper,\n ),\n model: v.pipe(\n v.optional(v.string(), `qwen3:8b`),\n v.title('模型'),\n v.description(\n '## 模型名\\n### ollama模型推荐\\n- `qwen3:8b`\\n- `qwen3:14b`,`deepseek-r1:7b`,`deepseek-r1:14b`\\n### 图片对话模型\\n- `minicpm-v:8b`',\n ),\n ...InputWrapper,\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.object({\n apiKey: v.pipe(\n v.optional(v.string()),\n v.description('本地部署默认可以不填'),\n ),\n }),\n v.pipe(\n v.object({\n max_tokens: v.pipe(v.optional(v.number(), 8192)),\n top_p: v.pipe(\n v.optional(v.number(), 0.8),\n v.minValue(0),\n v.maxValue(10),\n v.description(`核采样(nucleus sampling)是温度采样的另一种替代方法,模型会考虑累积概率质量达到 top_p 的 token。例如,当 top_p 设为 0.1 时,仅考虑累积概率前 10% 的 token。\n\n我们通常建议调整 top_p 或温度参数,但不要同时调整两者。`),\n ...InputWrapper,\n ),\n temperature: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(2)), 0.1),\n v.description(\n '采样温度应设置在0到2之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)则会使输出更集中且确定。我们通常建议仅调整此参数或top_p,而不同时调整两者。',\n ),\n ...InputWrapper,\n ),\n frequency_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '取值范围为-2.0至2.0。正值会根据当前文本中已有标记的频率对新标记进行惩罚,从而降低模型逐字重复相同内容的概率。',\n ),\n ...InputWrapper,\n ),\n presence_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '数值介于-2.0至2.0之间。正值会基于新标记是否已在当前文本中出现,对新标记施加惩罚,从而提升模型讨论新话题的可能性。',\n ),\n ...InputWrapper,\n ),\n seed: v.pipe(\n v.optional(v.pipe(v.number())),\n v.description(\n '若已指定,系统将尽力确保采样具有确定性,即使用相同种子和参数的重复请求将返回相同结果。确定性无法保证,请通过 system_fingerprint 响应参数监控后端变化。',\n ),\n ...InputWrapper,\n ),\n stop: v.pipe(\n v.optional(v.pipe(v.array(v.pipe(v.string())), v.maxLength(4))),\n v.description(\n '最多可指定4个停止序列,API将在生成到该序列时停止,返回的文本中不包含该停止序列。',\n ),\n asControl(),\n setComponent('chip-input-list'),\n patchInputs({\n addOnBlur: true,\n }),\n ...InputWrapper,\n ),\n // top_logprobs: v.pipe(\n // v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(20))),\n // v.description(\n // '一个介于0和20之间的整数,用于指定在每个标记位置返回的最可能的标记数量,每个标记均关联对应的对数概率。若使用此参数,则必须将logprobs设置为true。',\n // ),\n // ),\n\n // verbosity: v.pipe(\n // v.optional(v.picklist(['low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n // reasoning_effort: v.pipe(\n // v.optional(v.picklist(['minimal', 'low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n }),\n componentClass('grid gap-2'),\n ),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n);\n\nexport const VendorOptionsDefine = v.pipe(\n v.optional(\n v.record(\n v.string(),\n v.pipe(\n v.intersect([\n v.object({\n /** @internal */\n extraOptions: v.pipe(\n v.optional(omitIntersect(ChatItemDefine, ['name', 'vendor'])),\n v.description(`附加配置`),\n ),\n }),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n ),\n ),\n ),\n v.description(vendorOptionsDescribe),\n setComponent('rest-chip-group'),\n patchInputs({\n optionalkeyList: VendorList.map((item) => item.value),\n placeholder: '请设置额外配置',\n }),\n v.title('厂商额外配置'),\n);\nexport const ChatParamsItemDefine = v.pipe(\n v.intersect([\n ChatItemDefine,\n v.object({ vendorOptions: VendorOptionsDefine }),\n ]),\n asVirtualGroup(),\n componentClass('grid gap-2'),\n);\n\nexport const ChatParamsListDefine = v.pipe(\n v.array(ChatParamsItemDefine),\n setComponent('label-chip-array'),\n v.description('对话模型列表,目前用于切换使用'),\n patchInputs({\n displayKey: 'name',\n placeholder: '请添加配置',\n }),\n);\nexport type ChatModelOptions = v.InferOutput<typeof ChatParamsItemDefine>;\nexport type ChatModelOptionsInput = v.InferInput<typeof ChatParamsItemDefine>;\n\nexport const InputChatOptionsDefine = omitIntersect(ChatParamsItemDefine, [\n 'name',\n]);\nexport type CreateChatModelOptions = v.InferInput<typeof InputChatOptionsDefine>;"],
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 detail: v.optional(v.picklist(['auto', 'low', 'high'])),\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 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 asControl,\n componentClass,\n patchInputs,\n patchWrappers,\n setComponent,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport {\n asVirtualGroup,\n metadataPipe,\n omitIntersect,\n} from '@piying/valibot-visit';\nconst VendorList = [\n {\n value: 'openai',\n label: 'openai',\n options: {\n baseURL: '',\n modelList: [],\n description: '如果是openai兼容的厂商,需要设置baseURL',\n },\n },\n {\n value: '360',\n label: '360',\n options: { baseURL: 'https://ai.360.cn', modelList: [] },\n },\n {\n value: 'azure',\n label: 'azure',\n options: { baseURL: '', modelList: [] },\n },\n {\n value: 'moonshot',\n label: 'moonshot',\n options: { baseURL: 'https://api.moonshot.cn', modelList: [] },\n },\n {\n value: 'baichuan',\n label: 'baichuan',\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n {\n value: 'minimax',\n label: 'minimax',\n options: { baseURL: 'https://api.minimax.chat', modelList: [] },\n },\n {\n value: 'mistralai',\n label: 'mistralai',\n options: { baseURL: 'https://api.mistral.ai', modelList: [] },\n },\n {\n value: 'groq',\n label: 'groq',\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n {\n value: 'lingyiwanwu',\n label: 'lingyiwanwu',\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n {\n value: 'stepfun',\n label: 'stepfun',\n options: { baseURL: 'https://api.stepfun.com', modelList: [] },\n },\n {\n value: 'deepseek',\n label: 'deepseek',\n options: { baseURL: 'https://api.deepseek.com', modelList: [] },\n },\n {\n value: 'together.ai',\n label: 'together.ai',\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n {\n value: 'volcengine',\n label: 'volcengine',\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n {\n value: 'novita',\n label: 'novita',\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n {\n value: 'siliconflow',\n label: 'siliconflow',\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n {\n value: 'tongyi',\n label: 'tongyi',\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n {\n value: 'zhipu',\n label: 'zhipu',\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n {\n value: 'spark',\n label: 'spark',\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n {\n value: 'hunyuan',\n label: 'hunyuan',\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n\n {\n value: 'gemini',\n label: 'gemini',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n {\n value: 'claude',\n label: 'claude',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n] as const;\nconst vendorOptionsDescribe = `## 通用参数\n- \\`extraOptions\\`字段用于覆盖默认字段\n\\`\\`\\`json\n{\"厂商名(与vendor字段相同)\":{ \"extraOptions\":{\"temperature\":0.1,\"topP\":0.8,\"maxTokens\":8192,\"baseURL\":\"http://127.0.0.1:11434/v1\",\"apiKey\":\" \"} }\n\\`\\`\\`\n`;\nconst InputWrapper = metadataPipe(patchWrappers(['tooltip', 'form-field']));\n\nexport const ChatItemDefine = v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(v.string(), v.title('配置名')),\n vendor: v.pipe(\n v.optional(\n v.picklist(VendorList.map((item) => item.value)),\n 'openai',\n ),\n v.description('大语言模型提供的厂商'),\n v.title('对话厂商'),\n v.metadata({\n enumOptions: VendorList.map((item) => ({\n label: item.label,\n description: [\n (item.options as any).description\n ? (item.options as any).description\n : '',\n item.options.baseURL ? `链接: ${item.options.baseURL}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n })),\n }),\n patchInputs({\n options: VendorList,\n }),\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.pipe(\n v.object({\n baseURL: v.pipe(\n v.optional(v.string(), 'http://127.0.0.1:11434/v1'),\n v.title('地址'),\n v.description('openai兼容接口'),\n ...InputWrapper,\n ),\n model: v.pipe(\n v.optional(v.string(), `qwen3:8b`),\n v.title('模型'),\n v.description(\n '## 模型名\\n### ollama模型推荐\\n- `qwen3:8b`\\n- `qwen3:14b`,`deepseek-r1:7b`,`deepseek-r1:14b`\\n### 图片对话模型\\n- `minicpm-v:8b`',\n ),\n ...InputWrapper,\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.object({\n apiKey: v.pipe(\n v.optional(v.string()),\n v.description('本地部署默认可以不填'),\n ),\n }),\n v.pipe(\n v.object({\n max_tokens: v.pipe(v.optional(v.number(), 8192)),\n top_p: v.pipe(\n v.optional(v.number(), 0.8),\n v.minValue(0),\n v.maxValue(10),\n v.description(`核采样(nucleus sampling)是温度采样的另一种替代方法,模型会考虑累积概率质量达到 top_p 的 token。例如,当 top_p 设为 0.1 时,仅考虑累积概率前 10% 的 token。\n\n我们通常建议调整 top_p 或温度参数,但不要同时调整两者。`),\n ...InputWrapper,\n ),\n temperature: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(2)), 0.1),\n v.description(\n '采样温度应设置在0到2之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)则会使输出更集中且确定。我们通常建议仅调整此参数或top_p,而不同时调整两者。',\n ),\n ...InputWrapper,\n ),\n frequency_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '取值范围为-2.0至2.0。正值会根据当前文本中已有标记的频率对新标记进行惩罚,从而降低模型逐字重复相同内容的概率。',\n ),\n ...InputWrapper,\n ),\n presence_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '数值介于-2.0至2.0之间。正值会基于新标记是否已在当前文本中出现,对新标记施加惩罚,从而提升模型讨论新话题的可能性。',\n ),\n ...InputWrapper,\n ),\n seed: v.pipe(\n v.optional(v.pipe(v.number())),\n v.description(\n '若已指定,系统将尽力确保采样具有确定性,即使用相同种子和参数的重复请求将返回相同结果。确定性无法保证,请通过 system_fingerprint 响应参数监控后端变化。',\n ),\n ...InputWrapper,\n ),\n stop: v.pipe(\n v.optional(v.pipe(v.array(v.pipe(v.string())), v.maxLength(4))),\n v.description(\n '最多可指定4个停止序列,API将在生成到该序列时停止,返回的文本中不包含该停止序列。',\n ),\n asControl(),\n setComponent('chip-input-list'),\n patchInputs({\n addOnBlur: true,\n }),\n ...InputWrapper,\n ),\n // top_logprobs: v.pipe(\n // v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(20))),\n // v.description(\n // '一个介于0和20之间的整数,用于指定在每个标记位置返回的最可能的标记数量,每个标记均关联对应的对数概率。若使用此参数,则必须将logprobs设置为true。',\n // ),\n // ),\n\n // verbosity: v.pipe(\n // v.optional(v.picklist(['low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n // reasoning_effort: v.pipe(\n // v.optional(v.picklist(['minimal', 'low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n }),\n componentClass('grid gap-2'),\n ),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n);\n\nexport const VendorOptionsDefine = v.pipe(\n v.optional(\n v.record(\n v.string(),\n v.pipe(\n v.intersect([\n v.object({\n /** @internal */\n extraOptions: v.pipe(\n v.optional(omitIntersect(ChatItemDefine, ['name', 'vendor'])),\n v.description(`附加配置`),\n ),\n }),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n ),\n ),\n ),\n v.description(vendorOptionsDescribe),\n setComponent('rest-chip-group'),\n patchInputs({\n optionalkeyList: VendorList.map((item) => item.value),\n placeholder: '请设置额外配置',\n }),\n v.title('厂商额外配置'),\n);\nexport const ChatParamsItemDefine = v.pipe(\n v.intersect([\n ChatItemDefine,\n v.object({ vendorOptions: VendorOptionsDefine }),\n ]),\n asVirtualGroup(),\n componentClass('grid gap-2'),\n);\n\nexport const ChatParamsListDefine = v.pipe(\n v.array(ChatParamsItemDefine),\n setComponent('label-chip-array'),\n v.description('对话模型列表,目前用于切换使用'),\n patchInputs({\n displayKey: 'name',\n placeholder: '请添加配置',\n }),\n);\nexport type ChatModelOptions = v.InferOutput<typeof ChatParamsItemDefine>;\nexport type ChatModelOptionsInput = v.InferInput<typeof ChatParamsItemDefine>;\n\nexport const InputChatOptionsDefine = omitIntersect(ChatParamsItemDefine, [\n 'name',\n]);\nexport type CreateChatModelOptions = v.InferInput<\n typeof InputChatOptionsDefine\n>;\n"],
5
+ "mappings": "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",
6
6
  "names": ["v"]
7
7
  }
package/index.js CHANGED
@@ -297,33 +297,27 @@ function messageContentTransform(list) {
297
297
  }
298
298
  var GenminiSystemMessageDefine = v3.pipe(
299
299
  SystemChatMessage,
300
- v3.transform((item) => {
301
- return {
302
- role: "system",
303
- parts: messageContentTransform(item.content)
304
- };
305
- })
300
+ v3.transform((item) => ({
301
+ role: "system",
302
+ parts: messageContentTransform(item.content)
303
+ }))
306
304
  );
307
305
  var GenminiChatMessageListDefine = v3.pipe(
308
306
  v3.array(
309
307
  v3.union([
310
308
  v3.pipe(
311
309
  UserChatMessage,
312
- v3.transform((item) => {
313
- return {
314
- role: "user",
315
- parts: messageContentTransform(item.content)
316
- };
317
- })
310
+ v3.transform((item) => ({
311
+ role: "user",
312
+ parts: messageContentTransform(item.content)
313
+ }))
318
314
  ),
319
315
  v3.pipe(
320
316
  AssistantChatMessage,
321
- v3.transform((item) => {
322
- return {
323
- role: "model",
324
- parts: messageContentTransform(item.content)
325
- };
326
- })
317
+ v3.transform((item) => ({
318
+ role: "model",
319
+ parts: messageContentTransform(item.content)
320
+ }))
327
321
  )
328
322
  ])
329
323
  )
@@ -380,9 +374,9 @@ function baseImageSplit(str) {
380
374
  }
381
375
  var AnthropicSystemMessageDefine = v5.pipe(
382
376
  SystemChatCompletionContent,
383
- v5.transform((list) => {
384
- return list.map((item) => item.type === "text" ? item : void 0).filter(import_util2.isTruthy);
385
- })
377
+ v5.transform(
378
+ (list) => list.map((item) => item.type === "text" ? item : void 0).filter(import_util2.isTruthy)
379
+ )
386
380
  );
387
381
  function contentConvert(part) {
388
382
  if (part.type === "text") {
@@ -400,21 +394,17 @@ function contentConvert(part) {
400
394
  }
401
395
  var UserMessageDefine = v5.pipe(
402
396
  UserChatMessage,
403
- v5.transform((item) => {
404
- return {
405
- ...item,
406
- content: item.content.map(contentConvert)
407
- };
408
- })
397
+ v5.transform((item) => ({
398
+ ...item,
399
+ content: item.content.map(contentConvert)
400
+ }))
409
401
  );
410
402
  var AssistantMessageDefine = v5.pipe(
411
403
  AssistantChatMessage,
412
- v5.transform((item) => {
413
- return {
414
- ...item,
415
- content: item.content.map(contentConvert)
416
- };
417
- })
404
+ v5.transform((item) => ({
405
+ ...item,
406
+ content: item.content.map(contentConvert)
407
+ }))
418
408
  );
419
409
  var AnthropicChatMessageListDefine = v5.array(
420
410
  v5.union([UserMessageDefine, AssistantMessageDefine])
@@ -468,13 +458,11 @@ var AnthropicChat = class extends OpenAIChat {
468
458
  top_p: this.options.top_p,
469
459
  temperature: this.options.temperature,
470
460
  stream: false,
471
- tools: input.tools.map((item) => {
472
- return {
473
- name: item.function.name,
474
- description: item.function.description,
475
- input_schema: item.function.parameters
476
- };
477
- })
461
+ tools: input.tools.map((item) => ({
462
+ name: item.function.name,
463
+ description: item.function.description,
464
+ input_schema: item.function.parameters
465
+ }))
478
466
  },
479
467
  {
480
468
  signal: options?.signal
@@ -685,15 +673,13 @@ var ChatItemDefine = v7.pipe(
685
673
  v7.description("大语言模型提供的厂商"),
686
674
  v7.title("对话厂商"),
687
675
  v7.metadata({
688
- enumOptions: VendorList.map((item) => {
689
- return {
690
- label: item.label,
691
- description: [
692
- item.options.description ? item.options.description : "",
693
- item.options.baseURL ? `链接: ${item.options.baseURL}` : ""
694
- ].filter(Boolean).join("\n")
695
- };
696
- })
676
+ enumOptions: VendorList.map((item) => ({
677
+ label: item.label,
678
+ description: [
679
+ item.options.description ? item.options.description : "",
680
+ item.options.baseURL ? `链接: ${item.options.baseURL}` : ""
681
+ ].filter(Boolean).join("\n")
682
+ }))
697
683
  }),
698
684
  (0, import_view_angular_core.patchInputs)({
699
685
  options: VendorList
@@ -953,7 +939,7 @@ var ChatProviderService = class {
953
939
  instance = createCompatibleFactory(options);
954
940
  }
955
941
  instance.init();
956
- let openAIOptions = this.#config;
942
+ const openAIOptions = this.#config;
957
943
  const chatHistory = this.#chatHistory;
958
944
  const fn = async function* (...args) {
959
945
  const result = instance.stream(args[0], {
@@ -1019,9 +1005,7 @@ var ChatProviderService = class {
1019
1005
  }
1020
1006
  return obj;
1021
1007
  },
1022
- callTool: (input2, options2) => {
1023
- return instance.callTool(input2, options2);
1024
- }
1008
+ callTool: (input2, options2) => instance.callTool(input2, options2)
1025
1009
  };
1026
1010
  }
1027
1011
  };
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/service.ts", "../../packages/openai/chat/vendor/openai.ts", "../../packages/openai/chat/message.define.ts", "../../packages/openai/chat/vendor/openai-compatible.factory.ts", "../../packages/openai/chat/vendor/genmini/genmini.ts", "../../packages/openai/chat/vendor/genmini/message.define.ts", "../../packages/openai/chat/vendor/anthropic/anthropic.ts", "../../packages/openai/chat/vendor/anthropic/message.define.ts", "../../packages/openai/chat/util/create.ts", "../../packages/openai/chat/const.ts", "../../packages/openai/chat/options.define.ts", "../../packages/openai/chat/token.ts", "../../packages/openai/chat/chat.history.service.ts", "../../packages/openai/chat/module.ts"],
4
- "sourcesContent": ["export * from './chat/service';\nexport * from './chat/token';\nexport * from './chat/options.define';\nexport * from './chat/message.define';\nexport * from './chat/util/create';\nexport * from './chat/type/history';\nexport * from './chat/type';\nexport * from './chat/chat.history.service';\nexport * from './chat/module';\n", "import { inject, RootStaticInjectOptions } from 'static-injector';\nimport { OpenAIChat } from './vendor/openai';\nimport { ChatRequestOptions, ChatToolBodyInput } from './type';\nimport { createCompatibleFactory } from './vendor/openai-compatible.factory';\nimport { GeminiChat } from './vendor/genmini/genmini';\nimport { AnthropicChat } from './vendor/anthropic/anthropic';\nimport { createAssistantMessage } from './util/create';\nimport { ThinkList } from './const';\nimport {\n ChatModelOptions,\n CreateChatModelOptions,\n InputChatOptionsDefine,\n} from './options.define';\nimport { OpenAIConfigToken } from './token';\nimport { ChatHistoryService } from './chat.history.service';\nimport * as v from 'valibot';\nexport class ChatProviderService {\n #config = inject(OpenAIConfigToken);\n #chatHistory = inject(ChatHistoryService);\n\n create(input: Omit<CreateChatModelOptions, 'name'>) {\n let options = v.parse(InputChatOptionsDefine, input);\n let instance;\n const extraOptions =\n options.vendorOptions?.[options.vendor]?.['extraOptions'];\n options = {\n ...extraOptions,\n ...options,\n apiKey: options.apiKey?.trim() || extraOptions?.apiKey || ' ',\n };\n if (!options.vendor || options.vendor === 'openai') {\n instance = new OpenAIChat(options);\n } else if (options.vendor === 'gemini') {\n instance = new GeminiChat(options);\n } else if (options.vendor === 'claude') {\n instance = new AnthropicChat(options);\n } else {\n instance = createCompatibleFactory(options);\n }\n instance.init();\n let openAIOptions = this.#config;\n const chatHistory = this.#chatHistory;\n\n const fn = async function* (...args: Parameters<OpenAIChat['stream']>) {\n const result = instance.stream(args[0], {\n ...args[1],\n tryPull: openAIOptions().tryPull,\n pullModel: openAIOptions().pullModel,\n });\n let content = '';\n let isThink = false;\n let thinkStart = 0;\n let thinkEnd: number | undefined;\n let start = true;\n /** 是否处于思考期 */\n let isThinking = false;\n let contentEnd: number | undefined;\n let lastEmit;\n for await (const delta of result) {\n content += delta;\n if (start) {\n start = false;\n const result = ThinkList.find((item) =>\n delta.startsWith(`<${item}>`),\n );\n if (result) {\n isThink = true;\n thinkStart = result.length + 2;\n isThinking = true;\n }\n } else if (isThink && thinkEnd === undefined) {\n const result = ThinkList.find((item) => delta === `</${item}>`);\n if (result) {\n contentEnd = content.length;\n thinkEnd = content.length - result.length - 3;\n isThinking = false;\n }\n }\n lastEmit = {\n content: isThink\n ? (contentEnd ? content.slice(contentEnd) : '').trim()\n : content,\n isThinking: isThinking,\n delta,\n thinkContent: isThink\n ? content.slice(thinkStart, thinkEnd).trim()\n : undefined,\n };\n yield lastEmit;\n }\n const lastMessage = createAssistantMessage(\n isThink ? (contentEnd ? content.slice(contentEnd) : '') : content,\n );\n if (lastEmit?.thinkContent) {\n lastMessage.thinkContent = lastEmit.thinkContent;\n }\n chatHistory.save(\n [...args[0].messages, lastMessage],\n { ...args[0], messages: undefined },\n options,\n );\n };\n return {\n stream: fn,\n chat: async (...args: Parameters<OpenAIChat['stream']>) => {\n const result = fn(...args);\n let obj;\n for await (const element of result) {\n obj = element;\n }\n return obj!;\n },\n callTool: (input: ChatToolBodyInput, options?: ChatRequestOptions) => {\n return instance.callTool(input, options);\n },\n };\n }\n}\n", "import { OpenAI } from 'openai';\nimport { ChatMessageListDefine } from '../message.define';\nimport { ChatBodyInput, ChatRequestOptions, ChatToolBodyInput } from '../type';\nimport * as v from 'valibot';\nimport type { Stream } from 'openai/streaming.mjs';\nimport { ChatCompletionCreateParamsStreaming } from 'openai/resources/index.mjs';\nimport { ChatModelOptions } from '../options.define';\nexport class OpenAIChat {\n protected instance!: OpenAI;\n protected extraBody = {};\n protected extraHeaders = {};\n constructor(protected options: ChatModelOptions) {}\n init() {\n this.instance = new OpenAI({\n apiKey: this.options.apiKey || ' ',\n baseURL: this.options.baseURL ?? undefined,\n });\n }\n async #createStream(\n input: ChatCompletionCreateParamsStreaming,\n options?: ChatRequestOptions,\n ): Promise<\n Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {\n _request_id?: string | null;\n }\n > {\n return await this.instance.chat.completions\n .create(input, { headers: this.extraHeaders, ...options })\n .catch(async (error) => {\n // ollama server/routes.go\n if (options?.tryPull?.(error)) {\n await options?.pullModel!(this.options.model);\n return this.#createStream(input, {\n ...options,\n tryPull: () => false,\n });\n }\n\n throw error;\n });\n }\n async *stream(input: ChatBodyInput, options?: ChatRequestOptions) {\n const input2 = {\n ...input,\n messages: v.parse(ChatMessageListDefine, input.messages),\n model: this.options.model,\n stream: true,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n frequency_penalty: this.options.frequency_penalty,\n presence_penalty: this.options.presence_penalty,\n seed: this.options.seed,\n stop: this.options.stop,\n ...this.extraBody,\n } as ChatCompletionCreateParamsStreaming;\n const result = await this.#createStream(input2, options);\n let isThinking = 0;\n for await (const item of result) {\n try {\n //reasoning_content 思考\n if (!item.choices[0].finish_reason) {\n if (\n typeof (item.choices[0].delta as any).reasoning_content ===\n 'string' ||\n typeof (item.choices[0].delta as any).reasoning === 'string'\n ) {\n if (isThinking === 0) {\n isThinking = 1;\n yield '<thinking>';\n }\n const result =\n (item.choices[0].delta as any).reasoning_content ??\n (item.choices[0].delta as any).reasoning;\n if (result) {\n yield result;\n }\n } else if (typeof item.choices[0].delta.content === 'string') {\n if (isThinking === 1) {\n yield '</thinking>';\n isThinking = 2;\n }\n const result = item.choices[0].delta.content!;\n if (result) {\n yield result;\n }\n }\n }\n } catch (error) {\n throw error;\n }\n }\n }\n // 工具调用,暂时不清楚怎么调用...是返回工具,还是返回对话\n async callTool(input: ChatToolBodyInput, options?: ChatRequestOptions) {\n const result = await this.instance.chat.completions.create(\n {\n ...input,\n messages: v.parse(ChatMessageListDefine, input.messages),\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n frequency_penalty: this.options.frequency_penalty,\n presence_penalty: this.options.presence_penalty,\n seed: this.options.seed,\n stop: this.options.stop,\n ...this.extraBody,\n stream: false,\n },\n { headers: this.extraHeaders, ...options },\n );\n const isTool = !!result.choices[0].message.tool_calls;\n if (isTool) {\n // todo\n const data = (result.choices[0].message.tool_calls![0] as any).function;\n return {\n type: 'function' as const,\n function: {\n name: data.name,\n arguments: JSON.parse(data.arguments) as\n | Record<string, any>\n | undefined,\n },\n };\n }\n return { type: 'text' as const, text: result.choices[0].message.content! };\n }\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 detail: v.optional(v.picklist(['auto', 'low', 'high'])),\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 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 { ChatModelOptions } from '../options.define';\nimport { OpenAIChat } from './openai';\nconst VendorObject: Record<\n string,\n { options: { baseURL: string; modelList: string[] } }\n> = {\n '360': { options: { baseURL: 'https://ai.360.cn', modelList: [] } },\n azure: { options: { baseURL: '', modelList: [] } },\n moonshot: { options: { baseURL: 'https://api.moonshot.cn', modelList: [] } },\n baichuan: {\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n minimax: { options: { baseURL: 'https://api.minimax.chat', modelList: [] } },\n mistralai: { options: { baseURL: 'https://api.mistral.ai', modelList: [] } },\n groq: {\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n lingyiwanwu: {\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n stepfun: { options: { baseURL: 'https://api.stepfun.com', modelList: [] } },\n deepseek: { options: { baseURL: 'https://api.deepseek.com', modelList: [] } },\n 'together.ai': {\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n volcengine: {\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n novita: {\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n siliconflow: {\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n // 官网明确兼容\n // https://help.aliyun.com/zh/model-studio/developer-reference/use-qwen-by-calling-api?spm=a2c6h.13066369.question.5.3a0e527bbxeJLJ#4ec3e641c294d\n tongyi: {\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n // 文档上看是一样的\n // https://open.bigmodel.cn/dev/api/normal-model/glm-4\n zhipu: {\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n // 明确兼容\n // https://www.xfyun.cn/doc/spark/HTTP%E8%B0%83%E7%94%A8%E6%96%87%E6%A1%A3.html#_7-%E4%BD%BF%E7%94%A8openai-sdk%E8%AF%B7%E6%B1%82%E7%A4%BA%E4%BE%8B\n spark: {\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n // 官方兼容\n // https://cloud.tencent.com/document/product/1729/111007\n hunyuan: {\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n};\n\nexport function createCompatibleFactory(options: ChatModelOptions) {\n const vendorConfig = VendorObject[options.vendor];\n return new OpenAIChat({\n ...options,\n baseURL: vendorConfig.options.baseURL,\n });\n}\n", "import { OpenAIChat } from '../openai';\nimport { GoogleGenerativeAI, StartChatParams } from '@google/generative-ai';\nimport {\n GenminiChatMessageListDefine,\n GenminiSystemMessageDefine,\n} from './message.define';\nimport * as v from 'valibot';\nimport { ChatBodyInput, ChatRequestOptions } from '../../type';\n\nexport class GeminiChat extends OpenAIChat {\n #ggai!: GoogleGenerativeAI;\n override init(): void {\n this.#ggai = new GoogleGenerativeAI(this.options.apiKey!);\n }\n override async *stream(\n input: ChatBodyInput,\n options?: ChatRequestOptions,\n ): AsyncGenerator<string, void, unknown> {\n const model = this.#ggai.getGenerativeModel({\n model: this.options.model,\n generationConfig: {\n topP: this.options.top_p,\n temperature: this.options.temperature,\n maxOutputTokens: this.options.max_tokens,\n },\n });\n const messages = input.messages;\n const data = {} as Partial<StartChatParams>;\n if (messages[0].role === 'system') {\n const system = messages.shift();\n data.systemInstruction = v.parse(GenminiSystemMessageDefine, system);\n }\n data.history = v.parse(GenminiChatMessageListDefine, messages);\n const lastMessage = data.history.pop()!;\n\n const chat = model.startChat(data);\n const result = await chat.sendMessageStream(lastMessage.parts, {\n signal: options?.signal,\n });\n for await (const chunk of result.stream) {\n const chunkText = chunk.text();\n yield chunkText;\n }\n }\n}\n", "import * as v from 'valibot';\nimport {\n AssistantChatMessage,\n ChatCompletionContentPartImageType,\n ChatCompletionContentPartStrType,\n SystemChatMessage,\n UserChatMessage,\n} from '../../message.define';\nimport { isTruthy } from '@cyia/util';\n\nfunction messageContentTransform(\n list: (\n | ChatCompletionContentPartStrType\n | ChatCompletionContentPartImageType\n )[],\n) {\n return list\n .map((item) => (item.type === 'text' ? { text: item.text } : undefined))\n .filter(isTruthy);\n}\nexport const GenminiSystemMessageDefine = v.pipe(\n SystemChatMessage,\n v.transform((item) => {\n return {\n role: 'system',\n parts: messageContentTransform(item.content),\n };\n }),\n);\n\nexport const GenminiChatMessageListDefine = v.pipe(\n v.array(\n v.union([\n v.pipe(\n UserChatMessage,\n v.transform((item) => {\n return {\n role: 'user' as const,\n parts: messageContentTransform(item.content),\n };\n }),\n ),\n\n v.pipe(\n AssistantChatMessage,\n v.transform((item) => {\n return {\n role: 'model' as const,\n parts: messageContentTransform(item.content),\n };\n }),\n ),\n ]),\n ),\n);\n", "import { OpenAIChat } from '../openai';\nimport Anthropic from '@anthropic-ai/sdk';\nimport {\n AnthropicChatMessageListDefine,\n AnthropicSystemMessageDefine,\n} from './message.define';\nimport { createAsyncGeneratorAdapter } from '@cyia/util';\nimport * as v from 'valibot';\nimport {\n ChatBodyInput,\n ChatRequestOptions,\n ChatToolBodyInput,\n} from '../../type';\nexport class AnthropicChat extends OpenAIChat {\n client!: Anthropic;\n override init(): void {\n this.client = new Anthropic({ apiKey: this.options.apiKey });\n }\n override async *stream(\n input: ChatBodyInput,\n options?: ChatRequestOptions,\n ): AsyncGenerator<string, void, unknown> {\n const body = {\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n stream: true,\n } as Partial<Anthropic.Messages.MessageStreamParams>;\n\n if (input.messages[0].role === 'system') {\n const system = input.messages.shift()!.content;\n body.system = v.parse(AnthropicSystemMessageDefine, system);\n }\n body.messages = v.parse(AnthropicChatMessageListDefine, input.messages);\n const result = this.client.messages.stream(body as any, {\n signal: options?.signal,\n });\n const aga = createAsyncGeneratorAdapter<string>();\n result.once('end', () => aga.complete());\n result.on('text', (text) => {\n aga.next(text);\n });\n for await (const item of aga.getData()) {\n yield item;\n }\n }\n override async callTool(\n input: ChatToolBodyInput,\n options?: ChatRequestOptions,\n ) {\n const body =\n {} as Partial<Anthropic.Messages.MessageCreateParamsNonStreaming> &\n Pick<Anthropic.Messages.MessageCreateParamsNonStreaming, 'messages'>;\n\n if (input.messages[0].role === 'system') {\n const system = input.messages.shift()!.content;\n body.system = v.parse(AnthropicSystemMessageDefine, system);\n }\n body.messages = v.parse(AnthropicChatMessageListDefine, input.messages);\n const result = await this.client.messages.create(\n {\n ...body,\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n stream: false,\n tools: input.tools.map((item) => {\n return {\n name: item.function.name,\n description: item.function.description,\n input_schema: item.function.parameters! as any,\n };\n }),\n },\n {\n signal: options?.signal,\n },\n );\n const isToolResult = result.content.find(\n (item) => item.type === 'tool_use',\n );\n if (isToolResult) {\n return {\n type: 'function' as const,\n function: {\n name: isToolResult.name,\n arguments: isToolResult.input as Record<string, any> | undefined,\n },\n };\n }\n const text = result.content.find((item) => item.type === 'text');\n return {\n type: 'text' as const,\n text: text!.text,\n };\n }\n}\n", "import { isTruthy } from '@cyia/util';\nimport {\n SystemChatCompletionContent,\n UserChatMessage,\n AssistantChatMessage,\n ChatCompletionContentPartStrType,\n ChatCompletionContentPartImageType,\n} from '../../message.define';\nimport * as v from 'valibot';\n// data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAR\nfunction baseImageSplit(str: string) {\n const mimeTypeIndex = str.indexOf(';');\n const dataStartIndex = str.indexOf(',', mimeTypeIndex);\n return {\n mimeType: str.slice(5, mimeTypeIndex) as\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp',\n data: str.slice(dataStartIndex + 1),\n };\n}\n\nexport const AnthropicSystemMessageDefine = v.pipe(\n SystemChatCompletionContent,\n v.transform((list) => {\n return list\n .map((item) => (item.type === 'text' ? item : undefined))\n .filter(isTruthy);\n }),\n);\nfunction contentConvert(\n part: ChatCompletionContentPartStrType | ChatCompletionContentPartImageType,\n) {\n if (part.type === 'text') {\n return part;\n }\n const result = baseImageSplit(part.image_url.url);\n return {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: result.mimeType,\n data: result.data,\n },\n };\n}\nconst UserMessageDefine = v.pipe(\n UserChatMessage,\n v.transform((item) => {\n return {\n ...item,\n content: item.content.map(contentConvert),\n };\n }),\n);\nconst AssistantMessageDefine = v.pipe(\n AssistantChatMessage,\n v.transform((item) => {\n return {\n ...item,\n content: item.content.map(contentConvert),\n };\n }),\n);\nexport const AnthropicChatMessageListDefine = v.array(\n v.union([UserMessageDefine, AssistantMessageDefine]),\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", "export const ThinkList = [\n 'think',\n 'thinking',\n 'reason',\n 'reasoning',\n 'thought',\n 'Thought',\n];\n", "import {\n asControl,\n componentClass,\n hideWhen,\n patchInputs,\n patchProps,\n patchWrappers,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map, of } from 'rxjs';\nimport * as v from 'valibot';\nimport {\n asVirtualGroup,\n metadataPipe,\n omitIntersect,\n} from '@piying/valibot-visit';\nconst VendorList = [\n {\n value: 'openai',\n label: 'openai',\n options: {\n baseURL: '',\n modelList: [],\n description: '如果是openai兼容的厂商,需要设置baseURL',\n },\n },\n {\n value: '360',\n label: '360',\n options: { baseURL: 'https://ai.360.cn', modelList: [] },\n },\n {\n value: 'azure',\n label: 'azure',\n options: { baseURL: '', modelList: [] },\n },\n {\n value: 'moonshot',\n label: 'moonshot',\n options: { baseURL: 'https://api.moonshot.cn', modelList: [] },\n },\n {\n value: 'baichuan',\n label: 'baichuan',\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n {\n value: 'minimax',\n label: 'minimax',\n options: { baseURL: 'https://api.minimax.chat', modelList: [] },\n },\n {\n value: 'mistralai',\n label: 'mistralai',\n options: { baseURL: 'https://api.mistral.ai', modelList: [] },\n },\n {\n value: 'groq',\n label: 'groq',\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n {\n value: 'lingyiwanwu',\n label: 'lingyiwanwu',\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n {\n value: 'stepfun',\n label: 'stepfun',\n options: { baseURL: 'https://api.stepfun.com', modelList: [] },\n },\n {\n value: 'deepseek',\n label: 'deepseek',\n options: { baseURL: 'https://api.deepseek.com', modelList: [] },\n },\n {\n value: 'together.ai',\n label: 'together.ai',\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n {\n value: 'volcengine',\n label: 'volcengine',\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n {\n value: 'novita',\n label: 'novita',\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n {\n value: 'siliconflow',\n label: 'siliconflow',\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n {\n value: 'tongyi',\n label: 'tongyi',\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n {\n value: 'zhipu',\n label: 'zhipu',\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n {\n value: 'spark',\n label: 'spark',\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n {\n value: 'hunyuan',\n label: 'hunyuan',\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n\n {\n value: 'gemini',\n label: 'gemini',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n {\n value: 'claude',\n label: 'claude',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n] as const;\nconst vendorOptionsDescribe = `## 通用参数\n- \\`extraOptions\\`字段用于覆盖默认字段\n\\`\\`\\`json\n{\"厂商名(与vendor字段相同)\":{ \"extraOptions\":{\"temperature\":0.1,\"topP\":0.8,\"maxTokens\":8192,\"baseURL\":\"http://127.0.0.1:11434/v1\",\"apiKey\":\" \"} }\n\\`\\`\\`\n`;\nconst InputWrapper = metadataPipe(patchWrappers(['tooltip', 'form-field']));\n\nexport const ChatItemDefine = v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(v.string(), v.title('配置名')),\n vendor: v.pipe(\n v.optional(\n v.picklist(VendorList.map((item) => item.value)),\n 'openai',\n ),\n v.description('大语言模型提供的厂商'),\n v.title('对话厂商'),\n v.metadata({\n enumOptions: VendorList.map((item) => {\n return {\n label: item.label,\n description: [\n (item.options as any).description\n ? (item.options as any).description\n : '',\n item.options.baseURL ? `链接: ${item.options.baseURL}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n };\n }),\n }),\n patchInputs({\n options: VendorList,\n }),\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.pipe(\n v.object({\n baseURL: v.pipe(\n v.optional(v.string(), 'http://127.0.0.1:11434/v1'),\n v.title('地址'),\n v.description('openai兼容接口'),\n ...InputWrapper,\n ),\n model: v.pipe(\n v.optional(v.string(), `qwen3:8b`),\n v.title('模型'),\n v.description(\n '## 模型名\\n### ollama模型推荐\\n- `qwen3:8b`\\n- `qwen3:14b`,`deepseek-r1:7b`,`deepseek-r1:14b`\\n### 图片对话模型\\n- `minicpm-v:8b`',\n ),\n ...InputWrapper,\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.object({\n apiKey: v.pipe(\n v.optional(v.string()),\n v.description('本地部署默认可以不填'),\n ),\n }),\n v.pipe(\n v.object({\n max_tokens: v.pipe(v.optional(v.number(), 8192)),\n top_p: v.pipe(\n v.optional(v.number(), 0.8),\n v.minValue(0),\n v.maxValue(10),\n v.description(`核采样(nucleus sampling)是温度采样的另一种替代方法,模型会考虑累积概率质量达到 top_p 的 token。例如,当 top_p 设为 0.1 时,仅考虑累积概率前 10% 的 token。\n\n我们通常建议调整 top_p 或温度参数,但不要同时调整两者。`),\n ...InputWrapper,\n ),\n temperature: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(2)), 0.1),\n v.description(\n '采样温度应设置在0到2之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)则会使输出更集中且确定。我们通常建议仅调整此参数或top_p,而不同时调整两者。',\n ),\n ...InputWrapper,\n ),\n frequency_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '取值范围为-2.0至2.0。正值会根据当前文本中已有标记的频率对新标记进行惩罚,从而降低模型逐字重复相同内容的概率。',\n ),\n ...InputWrapper,\n ),\n presence_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '数值介于-2.0至2.0之间。正值会基于新标记是否已在当前文本中出现,对新标记施加惩罚,从而提升模型讨论新话题的可能性。',\n ),\n ...InputWrapper,\n ),\n seed: v.pipe(\n v.optional(v.pipe(v.number())),\n v.description(\n '若已指定,系统将尽力确保采样具有确定性,即使用相同种子和参数的重复请求将返回相同结果。确定性无法保证,请通过 system_fingerprint 响应参数监控后端变化。',\n ),\n ...InputWrapper,\n ),\n stop: v.pipe(\n v.optional(v.pipe(v.array(v.pipe(v.string())), v.maxLength(4))),\n v.description(\n '最多可指定4个停止序列,API将在生成到该序列时停止,返回的文本中不包含该停止序列。',\n ),\n asControl(),\n setComponent('chip-input-list'),\n patchInputs({\n addOnBlur: true,\n }),\n ...InputWrapper,\n ),\n // top_logprobs: v.pipe(\n // v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(20))),\n // v.description(\n // '一个介于0和20之间的整数,用于指定在每个标记位置返回的最可能的标记数量,每个标记均关联对应的对数概率。若使用此参数,则必须将logprobs设置为true。',\n // ),\n // ),\n\n // verbosity: v.pipe(\n // v.optional(v.picklist(['low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n // reasoning_effort: v.pipe(\n // v.optional(v.picklist(['minimal', 'low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n }),\n componentClass('grid gap-2'),\n ),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n);\n\nexport const VendorOptionsDefine = v.pipe(\n v.optional(\n v.record(\n v.string(),\n v.pipe(\n v.intersect([\n v.object({\n /** @internal */\n extraOptions: v.pipe(\n v.optional(omitIntersect(ChatItemDefine, ['name', 'vendor'])),\n v.description(`附加配置`),\n ),\n }),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n ),\n ),\n ),\n v.description(vendorOptionsDescribe),\n setComponent('rest-chip-group'),\n patchInputs({\n optionalkeyList: VendorList.map((item) => item.value),\n placeholder: '请设置额外配置',\n }),\n v.title('厂商额外配置'),\n);\nexport const ChatParamsItemDefine = v.pipe(\n v.intersect([\n ChatItemDefine,\n v.object({ vendorOptions: VendorOptionsDefine }),\n ]),\n asVirtualGroup(),\n componentClass('grid gap-2'),\n);\n\nexport const ChatParamsListDefine = v.pipe(\n v.array(ChatParamsItemDefine),\n setComponent('label-chip-array'),\n v.description('对话模型列表,目前用于切换使用'),\n patchInputs({\n displayKey: 'name',\n placeholder: '请添加配置',\n }),\n);\nexport type ChatModelOptions = v.InferOutput<typeof ChatParamsItemDefine>;\nexport type ChatModelOptionsInput = v.InferInput<typeof ChatParamsItemDefine>;\n\nexport const InputChatOptionsDefine = omitIntersect(ChatParamsItemDefine, [\n 'name',\n]);\nexport type CreateChatModelOptions = v.InferInput<typeof InputChatOptionsDefine>;", "import { InjectionToken, Signal } from 'static-injector';\nimport { OpenAIConfig } from './type';\n\nexport const OpenAIConfigToken = new InjectionToken<Signal<OpenAIConfig>>(\n 'OpenAIConfig',\n);\n", "import {\n computed,\n inject,\n RootStaticInjectOptions,\n signal,\n} from 'static-injector';\n\nimport { omitBy } from 'es-toolkit';\nimport { bufferWhen, debounceTime, filter, Subject } from 'rxjs';\nimport { path } from '@cyia/vfs2';\nimport { HistoryItem } from './type/history';\nimport { OpenAIConfigToken } from './token';\nimport * as fs from 'fs';\nimport { parse, stringify } from 'yaml';\nimport { ChatMessageListOutputType } from './message.define';\nimport dayjs from 'dayjs';\nimport { isEmptyInput } from '@cyia/util';\n\nexport class ChatHistoryService {\n #update$ = signal(0);\n /** 外部监听更新用 */\n update$$ = computed(() => this.#update$());\n #logMap = new Map<string, Subject<HistoryItem>>();\n #config = inject(OpenAIConfigToken);\n #dir() {\n return this.#config().history.dir;\n }\n #createNewListen(fileName: string) {\n const filePath = path.join(this.#dir(), `${fileName}.yml`);\n const instance = new Subject<HistoryItem>();\n instance\n .pipe(\n bufferWhen(() => instance.pipe(debounceTime(2_000))),\n filter((list) => !!list.length),\n )\n .subscribe(async (inputList) => {\n if (!fs.existsSync(this.#dir())) {\n await fs.promises.mkdir(this.#dir(), { recursive: true });\n }\n try {\n let list: HistoryItem[] = [];\n if (await fs.existsSync(filePath)) {\n const content = await fs.promises.readFile(filePath, {\n encoding: 'utf-8',\n });\n list = parse(content);\n } else {\n list = [];\n }\n list.unshift(...inputList.reverse());\n await fs.promises.writeFile(filePath, stringify(list));\n this.#update$.update((a) => a + 1);\n } catch (error) {\n this.#config().captureException(error);\n }\n });\n this.#logMap.set(fileName, instance);\n\n return instance;\n }\n save(messages: ChatMessageListOutputType, options: any, config: any) {\n if (!this.#config().history.enable) {\n return;\n }\n try {\n const fileName = dayjs().format('YYYY-MM-DD');\n const message$ =\n this.#logMap.get(fileName) ?? this.#createNewListen(fileName);\n const item = {\n date: dayjs().valueOf(),\n messages,\n options: omitBy(options, isEmptyInput),\n config,\n };\n message$.next(item);\n } catch (error) {\n try {\n this.#config().captureException(error);\n } catch (error) {}\n }\n }\n}\n", "import { ChatHistoryService } from './chat.history.service';\r\nimport { ChatProviderService } from './service';\r\nimport { OpenAIConfigToken } from './token';\r\n\r\nexport const OPENAI_MODULE = {\r\n provider: [ChatProviderService, ChatHistoryService],\r\n token: { OpenAIConfigToken },\r\n};\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,0BAAgD;;;ACAhD,oBAAuB;;;ACAvB,QAAmB;AACZ,IAAM,+BAAiC,SAAO;AAAA,EACnD,MAAQ,SAAO;AAAA,EACf,MAAQ,WAAW,UAAQ,MAAM,GAAG,MAAM;AAC5C,CAAC;AAKM,IAAM,iCAAmC,SAAO;AAAA,EACrD,WAAa,SAAO;AAAA,IAClB,KAAO,SAAO;AAAA,IACd,QAAU,WAAW,WAAS,CAAC,QAAQ,OAAO,MAAM,CAAC,CAAC;AAAA,EACxD,CAAC;AAAA,EACD,MAAQ,WAAW,UAAQ,WAAW,GAAG,WAAW;AACtD,CAAC;AAIM,IAAM,4BAA8B;AAAA,EACvC,QAAM,CAAC,8BAA8B,8BAA8B,CAAC;AACxE;AACO,IAAM,8BAAgC;AAAA,EAC3C;AACF;AACO,IAAM,4BAA4B;AAIlC,IAAM,iCAAmC;AAAA,EAC9C;AACF;AACO,IAAM,oBAAsB,SAAO;AAAA,EACxC,MAAQ,WAAW,UAAQ,QAAQ,GAAG,QAAQ;AAAA,EAC9C,SAAS;AACX,CAAC;AAEM,IAAM,kBAAoB,SAAO;AAAA,EACtC,MAAQ,WAAW,UAAQ,MAAM,GAAG,MAAM;AAAA,EAC1C,SAAS;AACX,CAAC;AAGM,IAAM,uBAAyB,SAAO;AAAA,EAC3C,MAAQ,WAAW,UAAQ,WAAW,GAAG,WAAW;AAAA,EACpD,SAAS;AAAA,EACT,cAAgB,WAAW,SAAO,CAAC;AACrC,CAAC;AAMM,IAAM,wBAA0B,QAAM;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,wBAA0B,QAAM,qBAAqB;;;ADxDlE,IAAAC,KAAmB;AAIZ,IAAM,aAAN,MAAiB;AAAA,EAItB,YAAsB,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAA5B;AAAA,EAHZ;AAAA,EACA,YAAY,CAAC;AAAA,EACb,eAAe,CAAC;AAAA,EAE1B,OAAO;AACL,SAAK,WAAW,IAAI,qBAAO;AAAA,MACzB,QAAQ,KAAK,QAAQ,UAAU;AAAA,MAC/B,SAAS,KAAK,QAAQ,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EACA,MAAM,cACJ,OACA,SAKA;AACA,WAAO,MAAM,KAAK,SAAS,KAAK,YAC7B,OAAO,OAAO,EAAE,SAAS,KAAK,cAAc,GAAG,QAAQ,CAAC,EACxD,MAAM,OAAO,UAAU;AAEtB,UAAI,SAAS,UAAU,KAAK,GAAG;AAC7B,cAAM,SAAS,UAAW,KAAK,QAAQ,KAAK;AAC5C,eAAO,KAAK,cAAc,OAAO;AAAA,UAC/B,GAAG;AAAA,UACH,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,MACH;AAEA,YAAM;AAAA,IACR,CAAC;AAAA,EACL;AAAA,EACA,OAAO,OAAO,OAAsB,SAA8B;AAChE,UAAM,SAAS;AAAA,MACb,GAAG;AAAA,MACH,UAAY,SAAM,uBAAuB,MAAM,QAAQ;AAAA,MACvD,OAAO,KAAK,QAAQ;AAAA,MACpB,QAAQ;AAAA,MACR,YAAY,KAAK,QAAQ;AAAA,MACzB,OAAO,KAAK,QAAQ;AAAA,MACpB,aAAa,KAAK,QAAQ;AAAA,MAC1B,mBAAmB,KAAK,QAAQ;AAAA,MAChC,kBAAkB,KAAK,QAAQ;AAAA,MAC/B,MAAM,KAAK,QAAQ;AAAA,MACnB,MAAM,KAAK,QAAQ;AAAA,MACnB,GAAG,KAAK;AAAA,IACV;AACA,UAAM,SAAS,MAAM,KAAK,cAAc,QAAQ,OAAO;AACvD,QAAI,aAAa;AACjB,qBAAiB,QAAQ,QAAQ;AAC/B,UAAI;AAEF,YAAI,CAAC,KAAK,QAAQ,CAAC,EAAE,eAAe;AAClC,cACE,OAAQ,KAAK,QAAQ,CAAC,EAAE,MAAc,sBACpC,YACF,OAAQ,KAAK,QAAQ,CAAC,EAAE,MAAc,cAAc,UACpD;AACA,gBAAI,eAAe,GAAG;AACpB,2BAAa;AACb,oBAAM;AAAA,YACR;AACA,kBAAMC,UACH,KAAK,QAAQ,CAAC,EAAE,MAAc,qBAC9B,KAAK,QAAQ,CAAC,EAAE,MAAc;AACjC,gBAAIA,SAAQ;AACV,oBAAMA;AAAA,YACR;AAAA,UACF,WAAW,OAAO,KAAK,QAAQ,CAAC,EAAE,MAAM,YAAY,UAAU;AAC5D,gBAAI,eAAe,GAAG;AACpB,oBAAM;AACN,2BAAa;AAAA,YACf;AACA,kBAAMA,UAAS,KAAK,QAAQ,CAAC,EAAE,MAAM;AACrC,gBAAIA,SAAQ;AACV,oBAAMA;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA,MAAM,SAAS,OAA0B,SAA8B;AACrE,UAAM,SAAS,MAAM,KAAK,SAAS,KAAK,YAAY;AAAA,MAClD;AAAA,QACE,GAAG;AAAA,QACH,UAAY,SAAM,uBAAuB,MAAM,QAAQ;AAAA,QACvD,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY,KAAK,QAAQ;AAAA,QACzB,OAAO,KAAK,QAAQ;AAAA,QACpB,aAAa,KAAK,QAAQ;AAAA,QAC1B,mBAAmB,KAAK,QAAQ;AAAA,QAChC,kBAAkB,KAAK,QAAQ;AAAA,QAC/B,MAAM,KAAK,QAAQ;AAAA,QACnB,MAAM,KAAK,QAAQ;AAAA,QACnB,GAAG,KAAK;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA,EAAE,SAAS,KAAK,cAAc,GAAG,QAAQ;AAAA,IAC3C;AACA,UAAM,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC,EAAE,QAAQ;AAC3C,QAAI,QAAQ;AAEV,YAAM,OAAQ,OAAO,QAAQ,CAAC,EAAE,QAAQ,WAAY,CAAC,EAAU;AAC/D,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK;AAAA,UACX,WAAW,KAAK,MAAM,KAAK,SAAS;AAAA,QAGtC;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,MAAM,QAAiB,MAAM,OAAO,QAAQ,CAAC,EAAE,QAAQ,QAAS;AAAA,EAC3E;AACF;;;AE9HA,IAAM,eAGF;AAAA,EACF,OAAO,EAAE,SAAS,EAAE,SAAS,qBAAqB,WAAW,CAAC,EAAE,EAAE;AAAA,EAClE,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,WAAW,CAAC,EAAE,EAAE;AAAA,EACjD,UAAU,EAAE,SAAS,EAAE,SAAS,2BAA2B,WAAW,CAAC,EAAE,EAAE;AAAA,EAC3E,UAAU;AAAA,IACR,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA,SAAS,EAAE,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE,EAAE;AAAA,EAC3E,WAAW,EAAE,SAAS,EAAE,SAAS,0BAA0B,WAAW,CAAC,EAAE,EAAE;AAAA,EAC3E,MAAM;AAAA,IACJ,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA,aAAa;AAAA,IACX,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA,SAAS,EAAE,SAAS,EAAE,SAAS,2BAA2B,WAAW,CAAC,EAAE,EAAE;AAAA,EAC1E,UAAU,EAAE,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE,EAAE;AAAA,EAC5E,eAAe;AAAA,IACb,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE;AAAA,EAChE;AAAA,EACA,YAAY;AAAA,IACV,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,SAAS,EAAE,SAAS,mCAAmC,WAAW,CAAC,EAAE;AAAA,EACvE;AAAA,EACA,aAAa;AAAA,IACX,SAAS,EAAE,SAAS,8BAA8B,WAAW,CAAC,EAAE;AAAA,EAClE;AAAA;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,SAA2B;AACjE,QAAM,eAAe,aAAa,QAAQ,MAAM;AAChD,SAAO,IAAI,WAAW;AAAA,IACpB,GAAG;AAAA,IACH,SAAS,aAAa,QAAQ;AAAA,EAChC,CAAC;AACH;;;AC5EA,2BAAoD;;;ACDpD,IAAAC,KAAmB;AAQnB,kBAAyB;AAEzB,SAAS,wBACP,MAIA;AACA,SAAO,KACJ,IAAI,CAAC,SAAU,KAAK,SAAS,SAAS,EAAE,MAAM,KAAK,KAAK,IAAI,MAAU,EACtE,OAAO,oBAAQ;AACpB;AACO,IAAM,6BAA+B;AAAA,EAC1C;AAAA,EACE,aAAU,CAAC,SAAS;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,wBAAwB,KAAK,OAAO;AAAA,IAC7C;AAAA,EACF,CAAC;AACH;AAEO,IAAM,+BAAiC;AAAA,EAC1C;AAAA,IACE,SAAM;AAAA,MACJ;AAAA,QACA;AAAA,QACE,aAAU,CAAC,SAAS;AACpB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO,wBAAwB,KAAK,OAAO;AAAA,UAC7C;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEE;AAAA,QACA;AAAA,QACE,aAAU,CAAC,SAAS;AACpB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO,wBAAwB,KAAK,OAAO;AAAA,UAC7C;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ADhDA,IAAAC,KAAmB;AAGZ,IAAM,aAAN,cAAyB,WAAW;AAAA,EACzC;AAAA,EACS,OAAa;AACpB,SAAK,QAAQ,IAAI,wCAAmB,KAAK,QAAQ,MAAO;AAAA,EAC1D;AAAA,EACA,OAAgB,OACd,OACA,SACuC;AACvC,UAAM,QAAQ,KAAK,MAAM,mBAAmB;AAAA,MAC1C,OAAO,KAAK,QAAQ;AAAA,MACpB,kBAAkB;AAAA,QAChB,MAAM,KAAK,QAAQ;AAAA,QACnB,aAAa,KAAK,QAAQ;AAAA,QAC1B,iBAAiB,KAAK,QAAQ;AAAA,MAChC;AAAA,IACF,CAAC;AACD,UAAM,WAAW,MAAM;AACvB,UAAM,OAAO,CAAC;AACd,QAAI,SAAS,CAAC,EAAE,SAAS,UAAU;AACjC,YAAM,SAAS,SAAS,MAAM;AAC9B,WAAK,oBAAsB,SAAM,4BAA4B,MAAM;AAAA,IACrE;AACA,SAAK,UAAY,SAAM,8BAA8B,QAAQ;AAC7D,UAAM,cAAc,KAAK,QAAQ,IAAI;AAErC,UAAM,OAAO,MAAM,UAAU,IAAI;AACjC,UAAM,SAAS,MAAM,KAAK,kBAAkB,YAAY,OAAO;AAAA,MAC7D,QAAQ,SAAS;AAAA,IACnB,CAAC;AACD,qBAAiB,SAAS,OAAO,QAAQ;AACvC,YAAM,YAAY,MAAM,KAAK;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AE3CA,iBAAsB;;;ACDtB,IAAAC,eAAyB;AAQzB,IAAAC,KAAmB;AAEnB,SAAS,eAAe,KAAa;AACnC,QAAM,gBAAgB,IAAI,QAAQ,GAAG;AACrC,QAAM,iBAAiB,IAAI,QAAQ,KAAK,aAAa;AACrD,SAAO;AAAA,IACL,UAAU,IAAI,MAAM,GAAG,aAAa;AAAA,IAKpC,MAAM,IAAI,MAAM,iBAAiB,CAAC;AAAA,EACpC;AACF;AAEO,IAAM,+BAAiC;AAAA,EAC5C;AAAA,EACE,aAAU,CAAC,SAAS;AACpB,WAAO,KACJ,IAAI,CAAC,SAAU,KAAK,SAAS,SAAS,OAAO,MAAU,EACvD,OAAO,qBAAQ;AAAA,EACpB,CAAC;AACH;AACA,SAAS,eACP,MACA;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,eAAe,KAAK,UAAU,GAAG;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AACF;AACA,IAAM,oBAAsB;AAAA,EAC1B;AAAA,EACE,aAAU,CAAC,SAAS;AACpB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,KAAK,QAAQ,IAAI,cAAc;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AACA,IAAM,yBAA2B;AAAA,EAC/B;AAAA,EACE,aAAU,CAAC,SAAS;AACpB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,KAAK,QAAQ,IAAI,cAAc;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AACO,IAAM,iCAAmC;AAAA,EAC5C,SAAM,CAAC,mBAAmB,sBAAsB,CAAC;AACrD;;;AD7DA,IAAAC,eAA4C;AAC5C,IAAAC,KAAmB;AAMZ,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAC5C;AAAA,EACS,OAAa;AACpB,SAAK,SAAS,IAAI,WAAAC,QAAU,EAAE,QAAQ,KAAK,QAAQ,OAAO,CAAC;AAAA,EAC7D;AAAA,EACA,OAAgB,OACd,OACA,SACuC;AACvC,UAAM,OAAO;AAAA,MACX,OAAO,KAAK,QAAQ;AAAA,MACpB,YAAY,KAAK,QAAQ;AAAA,MACzB,OAAO,KAAK,QAAQ;AAAA,MACpB,aAAa,KAAK,QAAQ;AAAA,MAC1B,QAAQ;AAAA,IACV;AAEA,QAAI,MAAM,SAAS,CAAC,EAAE,SAAS,UAAU;AACvC,YAAM,SAAS,MAAM,SAAS,MAAM,EAAG;AACvC,WAAK,SAAW,SAAM,8BAA8B,MAAM;AAAA,IAC5D;AACA,SAAK,WAAa,SAAM,gCAAgC,MAAM,QAAQ;AACtE,UAAM,SAAS,KAAK,OAAO,SAAS,OAAO,MAAa;AAAA,MACtD,QAAQ,SAAS;AAAA,IACnB,CAAC;AACD,UAAM,UAAM,0CAAoC;AAChD,WAAO,KAAK,OAAO,MAAM,IAAI,SAAS,CAAC;AACvC,WAAO,GAAG,QAAQ,CAAC,SAAS;AAC1B,UAAI,KAAK,IAAI;AAAA,IACf,CAAC;AACD,qBAAiB,QAAQ,IAAI,QAAQ,GAAG;AACtC,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAe,SACb,OACA,SACA;AACA,UAAM,OACJ,CAAC;AAGH,QAAI,MAAM,SAAS,CAAC,EAAE,SAAS,UAAU;AACvC,YAAM,SAAS,MAAM,SAAS,MAAM,EAAG;AACvC,WAAK,SAAW,SAAM,8BAA8B,MAAM;AAAA,IAC5D;AACA,SAAK,WAAa,SAAM,gCAAgC,MAAM,QAAQ;AACtE,UAAM,SAAS,MAAM,KAAK,OAAO,SAAS;AAAA,MACxC;AAAA,QACE,GAAG;AAAA,QACH,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY,KAAK,QAAQ;AAAA,QACzB,OAAO,KAAK,QAAQ;AAAA,QACpB,aAAa,KAAK,QAAQ;AAAA,QAC1B,QAAQ;AAAA,QACR,OAAO,MAAM,MAAM,IAAI,CAAC,SAAS;AAC/B,iBAAO;AAAA,YACL,MAAM,KAAK,SAAS;AAAA,YACpB,aAAa,KAAK,SAAS;AAAA,YAC3B,cAAc,KAAK,SAAS;AAAA,UAC9B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AACA,UAAM,eAAe,OAAO,QAAQ;AAAA,MAClC,CAAC,SAAS,KAAK,SAAS;AAAA,IAC1B;AACA,QAAI,cAAc;AAChB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,aAAa;AAAA,UACnB,WAAW,aAAa;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AACA,UAAM,OAAO,OAAO,QAAQ,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AAC/D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,KAAM;AAAA,IACd;AAAA,EACF;AACF;;;AE5FO,SAAS,sBAAsB;AACpC,SAAO,EAAE,MAAM,SAAS;AAC1B;AACO,SAAS,kBAAkB,MAAe;AAC/C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SACE,OAAO,SAAS,WAAW,CAAC,EAAE,MAAM,QAAQ,MAAM,GAAG,CAAC,IAAI;AAAA,EAC9D;AACF;AACO,SAAS,uBAAuB,OAAe,IAAI;AACxD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,EAClC;AACF;;;ACrBO,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACPA,+BAQO;AAEP,IAAAC,KAAmB;AACnB,2BAIO;AACP,IAAM,aAAa;AAAA,EACjB;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,qBAAqB,WAAW,CAAC,EAAE;AAAA,EACzD;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,IAAI,WAAW,CAAC,EAAE;AAAA,EACxC;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,2BAA2B,WAAW,CAAC,EAAE;AAAA,EAC/D;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE;AAAA,EAChE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,0BAA0B,WAAW,CAAC,EAAE;AAAA,EAC9D;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,+BAA+B,WAAW,CAAC,EAAE;AAAA,EACnE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,2BAA2B,WAAW,CAAC,EAAE;AAAA,EAC/D;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE;AAAA,EAChE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,4BAA4B,WAAW,CAAC,EAAE;AAAA,EAChE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,mCAAmC,WAAW,CAAC,EAAE;AAAA,EACvE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,EAAE,SAAS,8BAA8B,WAAW,CAAC,EAAE;AAAA,EAClE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,EACF;AACF;AACA,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAM9B,IAAM,mBAAe,uCAAa,wCAAc,CAAC,WAAW,YAAY,CAAC,CAAC;AAEnE,IAAM,iBAAmB;AAAA,EAC5B,aAAU;AAAA,IACR;AAAA,MACE,UAAO;AAAA,QACP,MAAQ,QAAO,UAAO,GAAK,SAAM,KAAK,CAAC;AAAA,QACvC,QAAU;AAAA,UACN;AAAA,YACE,YAAS,WAAW,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,YAC/C;AAAA,UACF;AAAA,UACE,eAAY,YAAY;AAAA,UACxB,SAAM,MAAM;AAAA,UACZ,YAAS;AAAA,YACT,aAAa,WAAW,IAAI,CAAC,SAAS;AACpC,qBAAO;AAAA,gBACL,OAAO,KAAK;AAAA,gBACZ,aAAa;AAAA,kBACV,KAAK,QAAgB,cACjB,KAAK,QAAgB,cACtB;AAAA,kBACJ,KAAK,QAAQ,UAAU,OAAO,KAAK,QAAQ,OAAO,KAAK;AAAA,gBACzD,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,cACd;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,cACD,sCAAY;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,UACD,yCAAe,kCAAkC;AAAA,IACnD;AAAA,IACE;AAAA,MACE,UAAO;AAAA,QACP,SAAW;AAAA,UACP,YAAW,UAAO,GAAG,2BAA2B;AAAA,UAChD,SAAM,IAAI;AAAA,UACV,eAAY,YAAY;AAAA,UAC1B,GAAG;AAAA,QACL;AAAA,QACA,OAAS;AAAA,UACL,YAAW,UAAO,GAAG,UAAU;AAAA,UAC/B,SAAM,IAAI;AAAA,UACV;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,MACF,CAAC;AAAA,UACD,yCAAe,kCAAkC;AAAA,IACnD;AAAA,IACE,UAAO;AAAA,MACP,QAAU;AAAA,QACN,YAAW,UAAO,CAAC;AAAA,QACnB,eAAY,YAAY;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,IACC;AAAA,MACE,UAAO;AAAA,QACP,YAAc,QAAO,YAAW,UAAO,GAAG,IAAI,CAAC;AAAA,QAC/C,OAAS;AAAA,UACL,YAAW,UAAO,GAAG,GAAG;AAAA,UACxB,YAAS,CAAC;AAAA,UACV,YAAS,EAAE;AAAA,UACX,eAAY;AAAA;AAAA,gCAEQ;AAAA,UACtB,GAAG;AAAA,QACL;AAAA,QACA,aAAe;AAAA,UACX,YAAW,QAAO,UAAO,GAAK,YAAS,CAAC,GAAK,YAAS,CAAC,CAAC,GAAG,GAAG;AAAA,UAC9D;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,mBAAqB;AAAA,UACjB,YAAW,QAAO,UAAO,GAAK,YAAS,EAAE,GAAK,YAAS,CAAC,CAAC,CAAC;AAAA,UAC1D;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,kBAAoB;AAAA,UAChB,YAAW,QAAO,UAAO,GAAK,YAAS,EAAE,GAAK,YAAS,CAAC,CAAC,CAAC;AAAA,UAC1D;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,MAAQ;AAAA,UACJ,YAAW,QAAO,UAAO,CAAC,CAAC;AAAA,UAC3B;AAAA,YACA;AAAA,UACF;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,MAAQ;AAAA,UACJ,YAAW,QAAO,SAAQ,QAAO,UAAO,CAAC,CAAC,GAAK,aAAU,CAAC,CAAC,CAAC;AAAA,UAC5D;AAAA,YACA;AAAA,UACF;AAAA,cACA,oCAAU;AAAA,cACV,uCAAa,iBAAiB;AAAA,cAC9B,sCAAY;AAAA,YACV,WAAW;AAAA,UACb,CAAC;AAAA,UACD,GAAG;AAAA,QACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAoBF,CAAC;AAAA,UACD,yCAAe,YAAY;AAAA,IAC7B;AAAA,EACF,CAAC;AAAA,MACD,yCAAe,YAAY;AAAA,MAC3B,qCAAe;AACjB;AAEO,IAAM,sBAAwB;AAAA,EACjC;AAAA,IACE;AAAA,MACE,UAAO;AAAA,MACP;AAAA,QACE,aAAU;AAAA,UACR,UAAO;AAAA;AAAA,YAEP,cAAgB;AAAA,cACZ,gBAAS,oCAAc,gBAAgB,CAAC,QAAQ,QAAQ,CAAC,CAAC;AAAA,cAC1D,eAAY,MAAM;AAAA,YACtB;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,YACD,yCAAe,YAAY;AAAA,YAC3B,qCAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EACE,eAAY,qBAAqB;AAAA,MACnC,uCAAa,iBAAiB;AAAA,MAC9B,sCAAY;AAAA,IACV,iBAAiB,WAAW,IAAI,CAAC,SAAS,KAAK,KAAK;AAAA,IACpD,aAAa;AAAA,EACf,CAAC;AAAA,EACC,SAAM,QAAQ;AAClB;AACO,IAAM,uBAAyB;AAAA,EAClC,aAAU;AAAA,IACV;AAAA,IACE,UAAO,EAAE,eAAe,oBAAoB,CAAC;AAAA,EACjD,CAAC;AAAA,MACD,qCAAe;AAAA,MACf,yCAAe,YAAY;AAC7B;AAEO,IAAM,uBAAyB;AAAA,EAClC,SAAM,oBAAoB;AAAA,MAC5B,uCAAa,kBAAkB;AAAA,EAC7B,eAAY,iBAAiB;AAAA,MAC/B,sCAAY;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AACH;AAIO,IAAM,6BAAyB,oCAAc,sBAAsB;AAAA,EACxE;AACF,CAAC;;;AC3VD,6BAAuC;AAGhC,IAAM,oBAAoB,IAAI;AAAA,EACnC;AACF;;;ACLA,IAAAC,0BAKO;AAEP,wBAAuB;AACvB,kBAA0D;AAC1D,kBAAqB;AAGrB,SAAoB;AACpB,kBAAiC;AAEjC,mBAAkB;AAClB,IAAAC,eAA6B;AAEtB,IAAM,qBAAN,MAAyB;AAAA,EAC9B,eAAW,gCAAO,CAAC;AAAA;AAAA,EAEnB,eAAW,kCAAS,MAAM,KAAK,SAAS,CAAC;AAAA,EACzC,UAAU,oBAAI,IAAkC;AAAA,EAChD,cAAU,gCAAO,iBAAiB;AAAA,EAClC,OAAO;AACL,WAAO,KAAK,QAAQ,EAAE,QAAQ;AAAA,EAChC;AAAA,EACA,iBAAiB,UAAkB;AACjC,UAAM,WAAW,iBAAK,KAAK,KAAK,KAAK,GAAG,GAAG,QAAQ,MAAM;AACzD,UAAM,WAAW,IAAI,oBAAqB;AAC1C,aACG;AAAA,UACC,wBAAW,MAAM,SAAS,SAAK,0BAAa,GAAK,CAAC,CAAC;AAAA,UACnD,oBAAO,CAAC,SAAS,CAAC,CAAC,KAAK,MAAM;AAAA,IAChC,EACC,UAAU,OAAO,cAAc;AAC9B,UAAI,CAAI,cAAW,KAAK,KAAK,CAAC,GAAG;AAC/B,cAAS,YAAS,MAAM,KAAK,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC1D;AACA,UAAI;AACF,YAAI,OAAsB,CAAC;AAC3B,YAAI,MAAS,cAAW,QAAQ,GAAG;AACjC,gBAAM,UAAU,MAAS,YAAS,SAAS,UAAU;AAAA,YACnD,UAAU;AAAA,UACZ,CAAC;AACD,qBAAO,mBAAM,OAAO;AAAA,QACtB,OAAO;AACL,iBAAO,CAAC;AAAA,QACV;AACA,aAAK,QAAQ,GAAG,UAAU,QAAQ,CAAC;AACnC,cAAS,YAAS,UAAU,cAAU,uBAAU,IAAI,CAAC;AACrD,aAAK,SAAS,OAAO,CAAC,MAAM,IAAI,CAAC;AAAA,MACnC,SAAS,OAAO;AACd,aAAK,QAAQ,EAAE,iBAAiB,KAAK;AAAA,MACvC;AAAA,IACF,CAAC;AACH,SAAK,QAAQ,IAAI,UAAU,QAAQ;AAEnC,WAAO;AAAA,EACT;AAAA,EACA,KAAK,UAAqC,SAAc,QAAa;AACnE,QAAI,CAAC,KAAK,QAAQ,EAAE,QAAQ,QAAQ;AAClC;AAAA,IACF;AACA,QAAI;AACF,YAAM,eAAW,aAAAC,SAAM,EAAE,OAAO,YAAY;AAC5C,YAAM,WACJ,KAAK,QAAQ,IAAI,QAAQ,KAAK,KAAK,iBAAiB,QAAQ;AAC9D,YAAM,OAAO;AAAA,QACX,UAAM,aAAAA,SAAM,EAAE,QAAQ;AAAA,QACtB;AAAA,QACA,aAAS,0BAAO,SAAS,yBAAY;AAAA,QACrC;AAAA,MACF;AACA,eAAS,KAAK,IAAI;AAAA,IACpB,SAAS,OAAO;AACd,UAAI;AACF,aAAK,QAAQ,EAAE,iBAAiB,KAAK;AAAA,MACvC,SAASC,QAAO;AAAA,MAAC;AAAA,IACnB;AAAA,EACF;AACF;;;AZlEA,IAAAC,KAAmB;AACZ,IAAM,sBAAN,MAA0B;AAAA,EAC/B,cAAU,gCAAO,iBAAiB;AAAA,EAClC,mBAAe,gCAAO,kBAAkB;AAAA,EAExC,OAAO,OAA6C;AAClD,QAAI,UAAY,SAAM,wBAAwB,KAAK;AACnD,QAAI;AACJ,UAAM,eACJ,QAAQ,gBAAgB,QAAQ,MAAM,IAAI,cAAc;AAC1D,cAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG;AAAA,MACH,QAAQ,QAAQ,QAAQ,KAAK,KAAK,cAAc,UAAU;AAAA,IAC5D;AACA,QAAI,CAAC,QAAQ,UAAU,QAAQ,WAAW,UAAU;AAClD,iBAAW,IAAI,WAAW,OAAO;AAAA,IACnC,WAAW,QAAQ,WAAW,UAAU;AACtC,iBAAW,IAAI,WAAW,OAAO;AAAA,IACnC,WAAW,QAAQ,WAAW,UAAU;AACtC,iBAAW,IAAI,cAAc,OAAO;AAAA,IACtC,OAAO;AACL,iBAAW,wBAAwB,OAAO;AAAA,IAC5C;AACA,aAAS,KAAK;AACd,QAAI,gBAAgB,KAAK;AACzB,UAAM,cAAc,KAAK;AAEzB,UAAM,KAAK,oBAAoB,MAAwC;AACrE,YAAM,SAAS,SAAS,OAAO,KAAK,CAAC,GAAG;AAAA,QACtC,GAAG,KAAK,CAAC;AAAA,QACT,SAAS,cAAc,EAAE;AAAA,QACzB,WAAW,cAAc,EAAE;AAAA,MAC7B,CAAC;AACD,UAAI,UAAU;AACd,UAAI,UAAU;AACd,UAAI,aAAa;AACjB,UAAI;AACJ,UAAI,QAAQ;AAEZ,UAAI,aAAa;AACjB,UAAI;AACJ,UAAI;AACJ,uBAAiB,SAAS,QAAQ;AAChC,mBAAW;AACX,YAAI,OAAO;AACT,kBAAQ;AACR,gBAAMC,UAAS,UAAU;AAAA,YAAK,CAAC,SAC7B,MAAM,WAAW,IAAI,IAAI,GAAG;AAAA,UAC9B;AACA,cAAIA,SAAQ;AACV,sBAAU;AACV,yBAAaA,QAAO,SAAS;AAC7B,yBAAa;AAAA,UACf;AAAA,QACF,WAAW,WAAW,aAAa,QAAW;AAC5C,gBAAMA,UAAS,UAAU,KAAK,CAAC,SAAS,UAAU,KAAK,IAAI,GAAG;AAC9D,cAAIA,SAAQ;AACV,yBAAa,QAAQ;AACrB,uBAAW,QAAQ,SAASA,QAAO,SAAS;AAC5C,yBAAa;AAAA,UACf;AAAA,QACF;AACA,mBAAW;AAAA,UACT,SAAS,WACJ,aAAa,QAAQ,MAAM,UAAU,IAAI,IAAI,KAAK,IACnD;AAAA,UACJ;AAAA,UACA;AAAA,UACA,cAAc,UACV,QAAQ,MAAM,YAAY,QAAQ,EAAE,KAAK,IACzC;AAAA,QACN;AACA,cAAM;AAAA,MACR;AACA,YAAM,cAAc;AAAA,QAClB,UAAW,aAAa,QAAQ,MAAM,UAAU,IAAI,KAAM;AAAA,MAC5D;AACA,UAAI,UAAU,cAAc;AAC1B,oBAAY,eAAe,SAAS;AAAA,MACtC;AACA,kBAAY;AAAA,QACV,CAAC,GAAG,KAAK,CAAC,EAAE,UAAU,WAAW;AAAA,QACjC,EAAE,GAAG,KAAK,CAAC,GAAG,UAAU,OAAU;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,UAAU,SAA2C;AACzD,cAAM,SAAS,GAAG,GAAG,IAAI;AACzB,YAAI;AACJ,yBAAiB,WAAW,QAAQ;AAClC,gBAAM;AAAA,QACR;AACA,eAAO;AAAA,MACT;AAAA,MACA,UAAU,CAACC,QAA0BC,aAAiC;AACpE,eAAO,SAAS,SAASD,QAAOC,QAAO;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AACF;;;AajHO,IAAM,gBAAgB;AAAA,EAC3B,UAAU,CAAC,qBAAqB,kBAAkB;AAAA,EAClD,OAAO,EAAE,kBAAkB;AAC7B;",
4
+ "sourcesContent": ["export * from './chat/service';\nexport * from './chat/token';\nexport * from './chat/options.define';\nexport * from './chat/message.define';\nexport * from './chat/util/create';\nexport * from './chat/type/history';\nexport * from './chat/type';\nexport * from './chat/chat.history.service';\nexport * from './chat/module';\n", "import { inject } from 'static-injector';\nimport { OpenAIChat } from './vendor/openai';\nimport { ChatRequestOptions, ChatToolBodyInput } from './type';\nimport { createCompatibleFactory } from './vendor/openai-compatible.factory';\nimport { GeminiChat } from './vendor/genmini/genmini';\nimport { AnthropicChat } from './vendor/anthropic/anthropic';\nimport { createAssistantMessage } from './util/create';\nimport { ThinkList } from './const';\nimport {\n CreateChatModelOptions,\n InputChatOptionsDefine,\n} from './options.define';\nimport { OpenAIConfigToken } from './token';\nimport { ChatHistoryService } from './chat.history.service';\nimport * as v from 'valibot';\nexport class ChatProviderService {\n #config = inject(OpenAIConfigToken);\n #chatHistory = inject(ChatHistoryService);\n\n create(input: Omit<CreateChatModelOptions, 'name'>) {\n let options = v.parse(InputChatOptionsDefine, input);\n let instance;\n const extraOptions =\n options.vendorOptions?.[options.vendor]?.['extraOptions'];\n options = {\n ...extraOptions,\n ...options,\n apiKey: options.apiKey?.trim() || extraOptions?.apiKey || ' ',\n };\n if (!options.vendor || options.vendor === 'openai') {\n instance = new OpenAIChat(options);\n } else if (options.vendor === 'gemini') {\n instance = new GeminiChat(options);\n } else if (options.vendor === 'claude') {\n instance = new AnthropicChat(options);\n } else {\n instance = createCompatibleFactory(options);\n }\n instance.init();\n const openAIOptions = this.#config;\n const chatHistory = this.#chatHistory;\n\n const fn = async function* (...args: Parameters<OpenAIChat['stream']>) {\n const result = instance.stream(args[0], {\n ...args[1],\n tryPull: openAIOptions().tryPull,\n pullModel: openAIOptions().pullModel,\n });\n let content = '';\n let isThink = false;\n let thinkStart = 0;\n let thinkEnd: number | undefined;\n let start = true;\n /** 是否处于思考期 */\n let isThinking = false;\n let contentEnd: number | undefined;\n let lastEmit;\n for await (const delta of result) {\n content += delta;\n if (start) {\n start = false;\n const result = ThinkList.find((item) =>\n delta.startsWith(`<${item}>`),\n );\n if (result) {\n isThink = true;\n thinkStart = result.length + 2;\n isThinking = true;\n }\n } else if (isThink && thinkEnd === undefined) {\n const result = ThinkList.find((item) => delta === `</${item}>`);\n if (result) {\n contentEnd = content.length;\n thinkEnd = content.length - result.length - 3;\n isThinking = false;\n }\n }\n lastEmit = {\n content: isThink\n ? (contentEnd ? content.slice(contentEnd) : '').trim()\n : content,\n isThinking: isThinking,\n delta,\n thinkContent: isThink\n ? content.slice(thinkStart, thinkEnd).trim()\n : undefined,\n };\n yield lastEmit;\n }\n const lastMessage = createAssistantMessage(\n isThink ? (contentEnd ? content.slice(contentEnd) : '') : content,\n );\n if (lastEmit?.thinkContent) {\n lastMessage.thinkContent = lastEmit.thinkContent;\n }\n chatHistory.save(\n [...args[0].messages, lastMessage],\n { ...args[0], messages: undefined },\n options,\n );\n };\n return {\n stream: fn,\n chat: async (...args: Parameters<OpenAIChat['stream']>) => {\n const result = fn(...args);\n let obj;\n for await (const element of result) {\n obj = element;\n }\n return obj!;\n },\n callTool: (input: ChatToolBodyInput, options?: ChatRequestOptions) =>\n instance.callTool(input, options),\n };\n }\n}\n", "import { OpenAI } from 'openai';\nimport { ChatMessageListDefine } from '../message.define';\nimport { ChatBodyInput, ChatRequestOptions, ChatToolBodyInput } from '../type';\nimport * as v from 'valibot';\nimport type { Stream } from 'openai/streaming.mjs';\nimport { ChatCompletionCreateParamsStreaming } from 'openai/resources/index.mjs';\nimport { ChatModelOptions } from '../options.define';\nexport class OpenAIChat {\n protected instance!: OpenAI;\n protected extraBody = {};\n protected extraHeaders = {};\n constructor(protected options: ChatModelOptions) {}\n init() {\n this.instance = new OpenAI({\n apiKey: this.options.apiKey || ' ',\n baseURL: this.options.baseURL ?? undefined,\n });\n }\n async #createStream(\n input: ChatCompletionCreateParamsStreaming,\n options?: ChatRequestOptions,\n ): Promise<\n Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {\n _request_id?: string | null;\n }\n > {\n return await this.instance.chat.completions\n .create(input, { headers: this.extraHeaders, ...options })\n .catch(async (error) => {\n // ollama server/routes.go\n if (options?.tryPull?.(error)) {\n await options?.pullModel!(this.options.model);\n return this.#createStream(input, {\n ...options,\n tryPull: () => false,\n });\n }\n\n throw error;\n });\n }\n async *stream(input: ChatBodyInput, options?: ChatRequestOptions) {\n const input2 = {\n ...input,\n messages: v.parse(ChatMessageListDefine, input.messages),\n model: this.options.model,\n stream: true,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n frequency_penalty: this.options.frequency_penalty,\n presence_penalty: this.options.presence_penalty,\n seed: this.options.seed,\n stop: this.options.stop,\n ...this.extraBody,\n } as ChatCompletionCreateParamsStreaming;\n const result = await this.#createStream(input2, options);\n let isThinking = 0;\n for await (const item of result) {\n try {\n //reasoning_content 思考\n if (!item.choices[0].finish_reason) {\n if (\n typeof (item.choices[0].delta as any).reasoning_content ===\n 'string' ||\n typeof (item.choices[0].delta as any).reasoning === 'string'\n ) {\n if (isThinking === 0) {\n isThinking = 1;\n yield '<thinking>';\n }\n const result =\n (item.choices[0].delta as any).reasoning_content ??\n (item.choices[0].delta as any).reasoning;\n if (result) {\n yield result;\n }\n } else if (typeof item.choices[0].delta.content === 'string') {\n if (isThinking === 1) {\n yield '</thinking>';\n isThinking = 2;\n }\n const result = item.choices[0].delta.content!;\n if (result) {\n yield result;\n }\n }\n }\n } catch (error) {\n throw error;\n }\n }\n }\n // 工具调用,暂时不清楚怎么调用...是返回工具,还是返回对话\n async callTool(input: ChatToolBodyInput, options?: ChatRequestOptions) {\n const result = await this.instance.chat.completions.create(\n {\n ...input,\n messages: v.parse(ChatMessageListDefine, input.messages),\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n frequency_penalty: this.options.frequency_penalty,\n presence_penalty: this.options.presence_penalty,\n seed: this.options.seed,\n stop: this.options.stop,\n ...this.extraBody,\n stream: false,\n },\n { headers: this.extraHeaders, ...options },\n );\n const isTool = !!result.choices[0].message.tool_calls;\n if (isTool) {\n // todo\n const data = (result.choices[0].message.tool_calls![0] as any).function;\n return {\n type: 'function' as const,\n function: {\n name: data.name,\n arguments: JSON.parse(data.arguments) as\n | Record<string, any>\n | undefined,\n },\n };\n }\n return { type: 'text' as const, text: result.choices[0].message.content! };\n }\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 detail: v.optional(v.picklist(['auto', 'low', 'high'])),\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 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 { ChatModelOptions } from '../options.define';\nimport { OpenAIChat } from './openai';\nconst VendorObject: Record<\n string,\n { options: { baseURL: string; modelList: string[] } }\n> = {\n '360': { options: { baseURL: 'https://ai.360.cn', modelList: [] } },\n azure: { options: { baseURL: '', modelList: [] } },\n moonshot: { options: { baseURL: 'https://api.moonshot.cn', modelList: [] } },\n baichuan: {\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n minimax: { options: { baseURL: 'https://api.minimax.chat', modelList: [] } },\n mistralai: { options: { baseURL: 'https://api.mistral.ai', modelList: [] } },\n groq: {\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n lingyiwanwu: {\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n stepfun: { options: { baseURL: 'https://api.stepfun.com', modelList: [] } },\n deepseek: { options: { baseURL: 'https://api.deepseek.com', modelList: [] } },\n 'together.ai': {\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n volcengine: {\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n novita: {\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n siliconflow: {\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n // 官网明确兼容\n // https://help.aliyun.com/zh/model-studio/developer-reference/use-qwen-by-calling-api?spm=a2c6h.13066369.question.5.3a0e527bbxeJLJ#4ec3e641c294d\n tongyi: {\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n // 文档上看是一样的\n // https://open.bigmodel.cn/dev/api/normal-model/glm-4\n zhipu: {\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n // 明确兼容\n // https://www.xfyun.cn/doc/spark/HTTP%E8%B0%83%E7%94%A8%E6%96%87%E6%A1%A3.html#_7-%E4%BD%BF%E7%94%A8openai-sdk%E8%AF%B7%E6%B1%82%E7%A4%BA%E4%BE%8B\n spark: {\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n // 官方兼容\n // https://cloud.tencent.com/document/product/1729/111007\n hunyuan: {\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n};\n\nexport function createCompatibleFactory(options: ChatModelOptions) {\n const vendorConfig = VendorObject[options.vendor];\n return new OpenAIChat({\n ...options,\n baseURL: vendorConfig.options.baseURL,\n });\n}\n", "import { OpenAIChat } from '../openai';\nimport { GoogleGenerativeAI, StartChatParams } from '@google/generative-ai';\nimport {\n GenminiChatMessageListDefine,\n GenminiSystemMessageDefine,\n} from './message.define';\nimport * as v from 'valibot';\nimport { ChatBodyInput, ChatRequestOptions } from '../../type';\n\nexport class GeminiChat extends OpenAIChat {\n #ggai!: GoogleGenerativeAI;\n override init(): void {\n this.#ggai = new GoogleGenerativeAI(this.options.apiKey!);\n }\n override async *stream(\n input: ChatBodyInput,\n options?: ChatRequestOptions,\n ): AsyncGenerator<string, void, unknown> {\n const model = this.#ggai.getGenerativeModel({\n model: this.options.model,\n generationConfig: {\n topP: this.options.top_p,\n temperature: this.options.temperature,\n maxOutputTokens: this.options.max_tokens,\n },\n });\n const messages = input.messages;\n const data = {} as Partial<StartChatParams>;\n if (messages[0].role === 'system') {\n const system = messages.shift();\n data.systemInstruction = v.parse(GenminiSystemMessageDefine, system);\n }\n data.history = v.parse(GenminiChatMessageListDefine, messages);\n const lastMessage = data.history.pop()!;\n\n const chat = model.startChat(data);\n const result = await chat.sendMessageStream(lastMessage.parts, {\n signal: options?.signal,\n });\n for await (const chunk of result.stream) {\n const chunkText = chunk.text();\n yield chunkText;\n }\n }\n}\n", "import * as v from 'valibot';\nimport {\n AssistantChatMessage,\n ChatCompletionContentPartImageType,\n ChatCompletionContentPartStrType,\n SystemChatMessage,\n UserChatMessage,\n} from '../../message.define';\nimport { isTruthy } from '@cyia/util';\n\nfunction messageContentTransform(\n list: (\n | ChatCompletionContentPartStrType\n | ChatCompletionContentPartImageType\n )[],\n) {\n return list\n .map((item) => (item.type === 'text' ? { text: item.text } : undefined))\n .filter(isTruthy);\n}\nexport const GenminiSystemMessageDefine = v.pipe(\n SystemChatMessage,\n v.transform((item) => ({\n role: 'system',\n parts: messageContentTransform(item.content),\n })),\n);\n\nexport const GenminiChatMessageListDefine = v.pipe(\n v.array(\n v.union([\n v.pipe(\n UserChatMessage,\n v.transform((item) => ({\n role: 'user' as const,\n parts: messageContentTransform(item.content),\n })),\n ),\n\n v.pipe(\n AssistantChatMessage,\n v.transform((item) => ({\n role: 'model' as const,\n parts: messageContentTransform(item.content),\n })),\n ),\n ]),\n ),\n);\n", "import { OpenAIChat } from '../openai';\nimport Anthropic from '@anthropic-ai/sdk';\nimport {\n AnthropicChatMessageListDefine,\n AnthropicSystemMessageDefine,\n} from './message.define';\nimport { createAsyncGeneratorAdapter } from '@cyia/util';\nimport * as v from 'valibot';\nimport {\n ChatBodyInput,\n ChatRequestOptions,\n ChatToolBodyInput,\n} from '../../type';\nexport class AnthropicChat extends OpenAIChat {\n client!: Anthropic;\n override init(): void {\n this.client = new Anthropic({ apiKey: this.options.apiKey });\n }\n override async *stream(\n input: ChatBodyInput,\n options?: ChatRequestOptions,\n ): AsyncGenerator<string, void, unknown> {\n const body = {\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n stream: true,\n } as Partial<Anthropic.Messages.MessageStreamParams>;\n\n if (input.messages[0].role === 'system') {\n const system = input.messages.shift()!.content;\n body.system = v.parse(AnthropicSystemMessageDefine, system);\n }\n body.messages = v.parse(AnthropicChatMessageListDefine, input.messages);\n const result = this.client.messages.stream(body as any, {\n signal: options?.signal,\n });\n const aga = createAsyncGeneratorAdapter<string>();\n result.once('end', () => aga.complete());\n result.on('text', (text) => {\n aga.next(text);\n });\n for await (const item of aga.getData()) {\n yield item;\n }\n }\n override async callTool(\n input: ChatToolBodyInput,\n options?: ChatRequestOptions,\n ) {\n const body =\n {} as Partial<Anthropic.Messages.MessageCreateParamsNonStreaming> &\n Pick<Anthropic.Messages.MessageCreateParamsNonStreaming, 'messages'>;\n\n if (input.messages[0].role === 'system') {\n const system = input.messages.shift()!.content;\n body.system = v.parse(AnthropicSystemMessageDefine, system);\n }\n body.messages = v.parse(AnthropicChatMessageListDefine, input.messages);\n const result = await this.client.messages.create(\n {\n ...body,\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n stream: false,\n tools: input.tools.map((item) => ({\n name: item.function.name,\n description: item.function.description,\n input_schema: item.function.parameters! as any,\n })),\n },\n {\n signal: options?.signal,\n },\n );\n const isToolResult = result.content.find(\n (item) => item.type === 'tool_use',\n );\n if (isToolResult) {\n return {\n type: 'function' as const,\n function: {\n name: isToolResult.name,\n arguments: isToolResult.input as Record<string, any> | undefined,\n },\n };\n }\n const text = result.content.find((item) => item.type === 'text');\n return {\n type: 'text' as const,\n text: text!.text,\n };\n }\n}\n", "import { isTruthy } from '@cyia/util';\nimport {\n SystemChatCompletionContent,\n UserChatMessage,\n AssistantChatMessage,\n ChatCompletionContentPartStrType,\n ChatCompletionContentPartImageType,\n} from '../../message.define';\nimport * as v from 'valibot';\n// data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAR\nfunction baseImageSplit(str: string) {\n const mimeTypeIndex = str.indexOf(';');\n const dataStartIndex = str.indexOf(',', mimeTypeIndex);\n return {\n mimeType: str.slice(5, mimeTypeIndex) as\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp',\n data: str.slice(dataStartIndex + 1),\n };\n}\n\nexport const AnthropicSystemMessageDefine = v.pipe(\n SystemChatCompletionContent,\n v.transform((list) =>\n list\n .map((item) => (item.type === 'text' ? item : undefined))\n .filter(isTruthy),\n ),\n);\nfunction contentConvert(\n part: ChatCompletionContentPartStrType | ChatCompletionContentPartImageType,\n) {\n if (part.type === 'text') {\n return part;\n }\n const result = baseImageSplit(part.image_url.url);\n return {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: result.mimeType,\n data: result.data,\n },\n };\n}\nconst UserMessageDefine = v.pipe(\n UserChatMessage,\n v.transform((item) => ({\n ...item,\n content: item.content.map(contentConvert),\n })),\n);\nconst AssistantMessageDefine = v.pipe(\n AssistantChatMessage,\n v.transform((item) => ({\n ...item,\n content: item.content.map(contentConvert),\n })),\n);\nexport const AnthropicChatMessageListDefine = v.array(\n v.union([UserMessageDefine, AssistantMessageDefine]),\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", "export const ThinkList = [\n 'think',\n 'thinking',\n 'reason',\n 'reasoning',\n 'thought',\n 'Thought',\n];\n", "import {\n asControl,\n componentClass,\n patchInputs,\n patchWrappers,\n setComponent,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport {\n asVirtualGroup,\n metadataPipe,\n omitIntersect,\n} from '@piying/valibot-visit';\nconst VendorList = [\n {\n value: 'openai',\n label: 'openai',\n options: {\n baseURL: '',\n modelList: [],\n description: '如果是openai兼容的厂商,需要设置baseURL',\n },\n },\n {\n value: '360',\n label: '360',\n options: { baseURL: 'https://ai.360.cn', modelList: [] },\n },\n {\n value: 'azure',\n label: 'azure',\n options: { baseURL: '', modelList: [] },\n },\n {\n value: 'moonshot',\n label: 'moonshot',\n options: { baseURL: 'https://api.moonshot.cn', modelList: [] },\n },\n {\n value: 'baichuan',\n label: 'baichuan',\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n {\n value: 'minimax',\n label: 'minimax',\n options: { baseURL: 'https://api.minimax.chat', modelList: [] },\n },\n {\n value: 'mistralai',\n label: 'mistralai',\n options: { baseURL: 'https://api.mistral.ai', modelList: [] },\n },\n {\n value: 'groq',\n label: 'groq',\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n {\n value: 'lingyiwanwu',\n label: 'lingyiwanwu',\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n {\n value: 'stepfun',\n label: 'stepfun',\n options: { baseURL: 'https://api.stepfun.com', modelList: [] },\n },\n {\n value: 'deepseek',\n label: 'deepseek',\n options: { baseURL: 'https://api.deepseek.com', modelList: [] },\n },\n {\n value: 'together.ai',\n label: 'together.ai',\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n {\n value: 'volcengine',\n label: 'volcengine',\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n {\n value: 'novita',\n label: 'novita',\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n {\n value: 'siliconflow',\n label: 'siliconflow',\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n {\n value: 'tongyi',\n label: 'tongyi',\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n {\n value: 'zhipu',\n label: 'zhipu',\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n {\n value: 'spark',\n label: 'spark',\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n {\n value: 'hunyuan',\n label: 'hunyuan',\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n\n {\n value: 'gemini',\n label: 'gemini',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n {\n value: 'claude',\n label: 'claude',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n] as const;\nconst vendorOptionsDescribe = `## 通用参数\n- \\`extraOptions\\`字段用于覆盖默认字段\n\\`\\`\\`json\n{\"厂商名(与vendor字段相同)\":{ \"extraOptions\":{\"temperature\":0.1,\"topP\":0.8,\"maxTokens\":8192,\"baseURL\":\"http://127.0.0.1:11434/v1\",\"apiKey\":\" \"} }\n\\`\\`\\`\n`;\nconst InputWrapper = metadataPipe(patchWrappers(['tooltip', 'form-field']));\n\nexport const ChatItemDefine = v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(v.string(), v.title('配置名')),\n vendor: v.pipe(\n v.optional(\n v.picklist(VendorList.map((item) => item.value)),\n 'openai',\n ),\n v.description('大语言模型提供的厂商'),\n v.title('对话厂商'),\n v.metadata({\n enumOptions: VendorList.map((item) => ({\n label: item.label,\n description: [\n (item.options as any).description\n ? (item.options as any).description\n : '',\n item.options.baseURL ? `链接: ${item.options.baseURL}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n })),\n }),\n patchInputs({\n options: VendorList,\n }),\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.pipe(\n v.object({\n baseURL: v.pipe(\n v.optional(v.string(), 'http://127.0.0.1:11434/v1'),\n v.title('地址'),\n v.description('openai兼容接口'),\n ...InputWrapper,\n ),\n model: v.pipe(\n v.optional(v.string(), `qwen3:8b`),\n v.title('模型'),\n v.description(\n '## 模型名\\n### ollama模型推荐\\n- `qwen3:8b`\\n- `qwen3:14b`,`deepseek-r1:7b`,`deepseek-r1:14b`\\n### 图片对话模型\\n- `minicpm-v:8b`',\n ),\n ...InputWrapper,\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.object({\n apiKey: v.pipe(\n v.optional(v.string()),\n v.description('本地部署默认可以不填'),\n ),\n }),\n v.pipe(\n v.object({\n max_tokens: v.pipe(v.optional(v.number(), 8192)),\n top_p: v.pipe(\n v.optional(v.number(), 0.8),\n v.minValue(0),\n v.maxValue(10),\n v.description(`核采样(nucleus sampling)是温度采样的另一种替代方法,模型会考虑累积概率质量达到 top_p 的 token。例如,当 top_p 设为 0.1 时,仅考虑累积概率前 10% 的 token。\n\n我们通常建议调整 top_p 或温度参数,但不要同时调整两者。`),\n ...InputWrapper,\n ),\n temperature: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(2)), 0.1),\n v.description(\n '采样温度应设置在0到2之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)则会使输出更集中且确定。我们通常建议仅调整此参数或top_p,而不同时调整两者。',\n ),\n ...InputWrapper,\n ),\n frequency_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '取值范围为-2.0至2.0。正值会根据当前文本中已有标记的频率对新标记进行惩罚,从而降低模型逐字重复相同内容的概率。',\n ),\n ...InputWrapper,\n ),\n presence_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '数值介于-2.0至2.0之间。正值会基于新标记是否已在当前文本中出现,对新标记施加惩罚,从而提升模型讨论新话题的可能性。',\n ),\n ...InputWrapper,\n ),\n seed: v.pipe(\n v.optional(v.pipe(v.number())),\n v.description(\n '若已指定,系统将尽力确保采样具有确定性,即使用相同种子和参数的重复请求将返回相同结果。确定性无法保证,请通过 system_fingerprint 响应参数监控后端变化。',\n ),\n ...InputWrapper,\n ),\n stop: v.pipe(\n v.optional(v.pipe(v.array(v.pipe(v.string())), v.maxLength(4))),\n v.description(\n '最多可指定4个停止序列,API将在生成到该序列时停止,返回的文本中不包含该停止序列。',\n ),\n asControl(),\n setComponent('chip-input-list'),\n patchInputs({\n addOnBlur: true,\n }),\n ...InputWrapper,\n ),\n // top_logprobs: v.pipe(\n // v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(20))),\n // v.description(\n // '一个介于0和20之间的整数,用于指定在每个标记位置返回的最可能的标记数量,每个标记均关联对应的对数概率。若使用此参数,则必须将logprobs设置为true。',\n // ),\n // ),\n\n // verbosity: v.pipe(\n // v.optional(v.picklist(['low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n // reasoning_effort: v.pipe(\n // v.optional(v.picklist(['minimal', 'low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n }),\n componentClass('grid gap-2'),\n ),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n);\n\nexport const VendorOptionsDefine = v.pipe(\n v.optional(\n v.record(\n v.string(),\n v.pipe(\n v.intersect([\n v.object({\n /** @internal */\n extraOptions: v.pipe(\n v.optional(omitIntersect(ChatItemDefine, ['name', 'vendor'])),\n v.description(`附加配置`),\n ),\n }),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n ),\n ),\n ),\n v.description(vendorOptionsDescribe),\n setComponent('rest-chip-group'),\n patchInputs({\n optionalkeyList: VendorList.map((item) => item.value),\n placeholder: '请设置额外配置',\n }),\n v.title('厂商额外配置'),\n);\nexport const ChatParamsItemDefine = v.pipe(\n v.intersect([\n ChatItemDefine,\n v.object({ vendorOptions: VendorOptionsDefine }),\n ]),\n asVirtualGroup(),\n componentClass('grid gap-2'),\n);\n\nexport const ChatParamsListDefine = v.pipe(\n v.array(ChatParamsItemDefine),\n setComponent('label-chip-array'),\n v.description('对话模型列表,目前用于切换使用'),\n patchInputs({\n displayKey: 'name',\n placeholder: '请添加配置',\n }),\n);\nexport type ChatModelOptions = v.InferOutput<typeof ChatParamsItemDefine>;\nexport type ChatModelOptionsInput = v.InferInput<typeof ChatParamsItemDefine>;\n\nexport const InputChatOptionsDefine = omitIntersect(ChatParamsItemDefine, [\n 'name',\n]);\nexport type CreateChatModelOptions = v.InferInput<\n typeof InputChatOptionsDefine\n>;\n", "import { InjectionToken, Signal } from 'static-injector';\nimport { OpenAIConfig } from './type';\n\nexport const OpenAIConfigToken = new InjectionToken<Signal<OpenAIConfig>>(\n 'OpenAIConfig',\n);\n", "import { computed, inject, signal } from 'static-injector';\n\nimport { omitBy } from 'es-toolkit';\nimport { bufferWhen, debounceTime, filter, Subject } from 'rxjs';\nimport { path } from '@cyia/vfs2';\nimport { HistoryItem } from './type/history';\nimport { OpenAIConfigToken } from './token';\nimport * as fs from 'fs';\nimport { parse, stringify } from 'yaml';\nimport { ChatMessageListOutputType } from './message.define';\nimport dayjs from 'dayjs';\nimport { isEmptyInput } from '@cyia/util';\n\nexport class ChatHistoryService {\n #update$ = signal(0);\n /** 外部监听更新用 */\n update$$ = computed(() => this.#update$());\n #logMap = new Map<string, Subject<HistoryItem>>();\n #config = inject(OpenAIConfigToken);\n #dir() {\n return this.#config().history.dir;\n }\n #createNewListen(fileName: string) {\n const filePath = path.join(this.#dir(), `${fileName}.yml`);\n const instance = new Subject<HistoryItem>();\n instance\n .pipe(\n bufferWhen(() => instance.pipe(debounceTime(2_000))),\n filter((list) => !!list.length),\n )\n .subscribe(async (inputList) => {\n if (!fs.existsSync(this.#dir())) {\n await fs.promises.mkdir(this.#dir(), { recursive: true });\n }\n try {\n let list: HistoryItem[] = [];\n if (await fs.existsSync(filePath)) {\n const content = await fs.promises.readFile(filePath, {\n encoding: 'utf-8',\n });\n list = parse(content);\n } else {\n list = [];\n }\n list.unshift(...inputList.reverse());\n await fs.promises.writeFile(filePath, stringify(list));\n this.#update$.update((a) => a + 1);\n } catch (error) {\n this.#config().captureException(error);\n }\n });\n this.#logMap.set(fileName, instance);\n\n return instance;\n }\n save(messages: ChatMessageListOutputType, options: any, config: any) {\n if (!this.#config().history.enable) {\n return;\n }\n try {\n const fileName = dayjs().format('YYYY-MM-DD');\n const message$ =\n this.#logMap.get(fileName) ?? this.#createNewListen(fileName);\n const item = {\n date: dayjs().valueOf(),\n messages,\n options: omitBy(options, isEmptyInput),\n config,\n };\n message$.next(item);\n } catch (error) {\n try {\n this.#config().captureException(error);\n } catch (error) {}\n }\n }\n}\n", "import { ChatHistoryService } from './chat.history.service';\nimport { ChatProviderService } from './service';\nimport { OpenAIConfigToken } from './token';\n\nexport const OPENAI_MODULE = {\n provider: [ChatProviderService, ChatHistoryService],\n token: { OpenAIConfigToken },\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_static_injector", "v", "result", "v", "v", "import_util", "v", "import_util", "v", "Anthropic", "v", "import_static_injector", "import_util", "dayjs", "error", "v", "result", "input", "options"]
7
7
  }
package/index.mjs CHANGED
@@ -239,33 +239,27 @@ function messageContentTransform(list) {
239
239
  }
240
240
  var GenminiSystemMessageDefine = v3.pipe(
241
241
  SystemChatMessage,
242
- v3.transform((item) => {
243
- return {
244
- role: "system",
245
- parts: messageContentTransform(item.content)
246
- };
247
- })
242
+ v3.transform((item) => ({
243
+ role: "system",
244
+ parts: messageContentTransform(item.content)
245
+ }))
248
246
  );
249
247
  var GenminiChatMessageListDefine = v3.pipe(
250
248
  v3.array(
251
249
  v3.union([
252
250
  v3.pipe(
253
251
  UserChatMessage,
254
- v3.transform((item) => {
255
- return {
256
- role: "user",
257
- parts: messageContentTransform(item.content)
258
- };
259
- })
252
+ v3.transform((item) => ({
253
+ role: "user",
254
+ parts: messageContentTransform(item.content)
255
+ }))
260
256
  ),
261
257
  v3.pipe(
262
258
  AssistantChatMessage,
263
- v3.transform((item) => {
264
- return {
265
- role: "model",
266
- parts: messageContentTransform(item.content)
267
- };
268
- })
259
+ v3.transform((item) => ({
260
+ role: "model",
261
+ parts: messageContentTransform(item.content)
262
+ }))
269
263
  )
270
264
  ])
271
265
  )
@@ -322,9 +316,9 @@ function baseImageSplit(str) {
322
316
  }
323
317
  var AnthropicSystemMessageDefine = v5.pipe(
324
318
  SystemChatCompletionContent,
325
- v5.transform((list) => {
326
- return list.map((item) => item.type === "text" ? item : void 0).filter(isTruthy2);
327
- })
319
+ v5.transform(
320
+ (list) => list.map((item) => item.type === "text" ? item : void 0).filter(isTruthy2)
321
+ )
328
322
  );
329
323
  function contentConvert(part) {
330
324
  if (part.type === "text") {
@@ -342,21 +336,17 @@ function contentConvert(part) {
342
336
  }
343
337
  var UserMessageDefine = v5.pipe(
344
338
  UserChatMessage,
345
- v5.transform((item) => {
346
- return {
347
- ...item,
348
- content: item.content.map(contentConvert)
349
- };
350
- })
339
+ v5.transform((item) => ({
340
+ ...item,
341
+ content: item.content.map(contentConvert)
342
+ }))
351
343
  );
352
344
  var AssistantMessageDefine = v5.pipe(
353
345
  AssistantChatMessage,
354
- v5.transform((item) => {
355
- return {
356
- ...item,
357
- content: item.content.map(contentConvert)
358
- };
359
- })
346
+ v5.transform((item) => ({
347
+ ...item,
348
+ content: item.content.map(contentConvert)
349
+ }))
360
350
  );
361
351
  var AnthropicChatMessageListDefine = v5.array(
362
352
  v5.union([UserMessageDefine, AssistantMessageDefine])
@@ -410,13 +400,11 @@ var AnthropicChat = class extends OpenAIChat {
410
400
  top_p: this.options.top_p,
411
401
  temperature: this.options.temperature,
412
402
  stream: false,
413
- tools: input.tools.map((item) => {
414
- return {
415
- name: item.function.name,
416
- description: item.function.description,
417
- input_schema: item.function.parameters
418
- };
419
- })
403
+ tools: input.tools.map((item) => ({
404
+ name: item.function.name,
405
+ description: item.function.description,
406
+ input_schema: item.function.parameters
407
+ }))
420
408
  },
421
409
  {
422
410
  signal: options?.signal
@@ -637,15 +625,13 @@ var ChatItemDefine = v7.pipe(
637
625
  v7.description("大语言模型提供的厂商"),
638
626
  v7.title("对话厂商"),
639
627
  v7.metadata({
640
- enumOptions: VendorList.map((item) => {
641
- return {
642
- label: item.label,
643
- description: [
644
- item.options.description ? item.options.description : "",
645
- item.options.baseURL ? `链接: ${item.options.baseURL}` : ""
646
- ].filter(Boolean).join("\n")
647
- };
648
- })
628
+ enumOptions: VendorList.map((item) => ({
629
+ label: item.label,
630
+ description: [
631
+ item.options.description ? item.options.description : "",
632
+ item.options.baseURL ? `链接: ${item.options.baseURL}` : ""
633
+ ].filter(Boolean).join("\n")
634
+ }))
649
635
  }),
650
636
  patchInputs({
651
637
  options: VendorList
@@ -811,11 +797,7 @@ var OpenAIConfigToken = new InjectionToken(
811
797
  );
812
798
 
813
799
  // packages/openai/chat/chat.history.service.ts
814
- import {
815
- computed,
816
- inject,
817
- signal
818
- } from "static-injector";
800
+ import { computed, inject, signal } from "static-injector";
819
801
  import { omitBy } from "es-toolkit";
820
802
  import { bufferWhen, debounceTime, filter, Subject } from "rxjs";
821
803
  import { path } from "@cyia/vfs2";
@@ -909,7 +891,7 @@ var ChatProviderService = class {
909
891
  instance = createCompatibleFactory(options);
910
892
  }
911
893
  instance.init();
912
- let openAIOptions = this.#config;
894
+ const openAIOptions = this.#config;
913
895
  const chatHistory = this.#chatHistory;
914
896
  const fn = async function* (...args) {
915
897
  const result = instance.stream(args[0], {
@@ -975,9 +957,7 @@ var ChatProviderService = class {
975
957
  }
976
958
  return obj;
977
959
  },
978
- callTool: (input2, options2) => {
979
- return instance.callTool(input2, options2);
980
- }
960
+ callTool: (input2, options2) => instance.callTool(input2, options2)
981
961
  };
982
962
  }
983
963
  };
package/index.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/openai/chat/service.ts", "../../packages/openai/chat/vendor/openai.ts", "../../packages/openai/chat/message.define.ts", "../../packages/openai/chat/vendor/openai-compatible.factory.ts", "../../packages/openai/chat/vendor/genmini/genmini.ts", "../../packages/openai/chat/vendor/genmini/message.define.ts", "../../packages/openai/chat/vendor/anthropic/anthropic.ts", "../../packages/openai/chat/vendor/anthropic/message.define.ts", "../../packages/openai/chat/util/create.ts", "../../packages/openai/chat/const.ts", "../../packages/openai/chat/options.define.ts", "../../packages/openai/chat/token.ts", "../../packages/openai/chat/chat.history.service.ts", "../../packages/openai/chat/module.ts"],
4
- "sourcesContent": ["import { inject, RootStaticInjectOptions } from 'static-injector';\nimport { OpenAIChat } from './vendor/openai';\nimport { ChatRequestOptions, ChatToolBodyInput } from './type';\nimport { createCompatibleFactory } from './vendor/openai-compatible.factory';\nimport { GeminiChat } from './vendor/genmini/genmini';\nimport { AnthropicChat } from './vendor/anthropic/anthropic';\nimport { createAssistantMessage } from './util/create';\nimport { ThinkList } from './const';\nimport {\n ChatModelOptions,\n CreateChatModelOptions,\n InputChatOptionsDefine,\n} from './options.define';\nimport { OpenAIConfigToken } from './token';\nimport { ChatHistoryService } from './chat.history.service';\nimport * as v from 'valibot';\nexport class ChatProviderService {\n #config = inject(OpenAIConfigToken);\n #chatHistory = inject(ChatHistoryService);\n\n create(input: Omit<CreateChatModelOptions, 'name'>) {\n let options = v.parse(InputChatOptionsDefine, input);\n let instance;\n const extraOptions =\n options.vendorOptions?.[options.vendor]?.['extraOptions'];\n options = {\n ...extraOptions,\n ...options,\n apiKey: options.apiKey?.trim() || extraOptions?.apiKey || ' ',\n };\n if (!options.vendor || options.vendor === 'openai') {\n instance = new OpenAIChat(options);\n } else if (options.vendor === 'gemini') {\n instance = new GeminiChat(options);\n } else if (options.vendor === 'claude') {\n instance = new AnthropicChat(options);\n } else {\n instance = createCompatibleFactory(options);\n }\n instance.init();\n let openAIOptions = this.#config;\n const chatHistory = this.#chatHistory;\n\n const fn = async function* (...args: Parameters<OpenAIChat['stream']>) {\n const result = instance.stream(args[0], {\n ...args[1],\n tryPull: openAIOptions().tryPull,\n pullModel: openAIOptions().pullModel,\n });\n let content = '';\n let isThink = false;\n let thinkStart = 0;\n let thinkEnd: number | undefined;\n let start = true;\n /** 是否处于思考期 */\n let isThinking = false;\n let contentEnd: number | undefined;\n let lastEmit;\n for await (const delta of result) {\n content += delta;\n if (start) {\n start = false;\n const result = ThinkList.find((item) =>\n delta.startsWith(`<${item}>`),\n );\n if (result) {\n isThink = true;\n thinkStart = result.length + 2;\n isThinking = true;\n }\n } else if (isThink && thinkEnd === undefined) {\n const result = ThinkList.find((item) => delta === `</${item}>`);\n if (result) {\n contentEnd = content.length;\n thinkEnd = content.length - result.length - 3;\n isThinking = false;\n }\n }\n lastEmit = {\n content: isThink\n ? (contentEnd ? content.slice(contentEnd) : '').trim()\n : content,\n isThinking: isThinking,\n delta,\n thinkContent: isThink\n ? content.slice(thinkStart, thinkEnd).trim()\n : undefined,\n };\n yield lastEmit;\n }\n const lastMessage = createAssistantMessage(\n isThink ? (contentEnd ? content.slice(contentEnd) : '') : content,\n );\n if (lastEmit?.thinkContent) {\n lastMessage.thinkContent = lastEmit.thinkContent;\n }\n chatHistory.save(\n [...args[0].messages, lastMessage],\n { ...args[0], messages: undefined },\n options,\n );\n };\n return {\n stream: fn,\n chat: async (...args: Parameters<OpenAIChat['stream']>) => {\n const result = fn(...args);\n let obj;\n for await (const element of result) {\n obj = element;\n }\n return obj!;\n },\n callTool: (input: ChatToolBodyInput, options?: ChatRequestOptions) => {\n return instance.callTool(input, options);\n },\n };\n }\n}\n", "import { OpenAI } from 'openai';\nimport { ChatMessageListDefine } from '../message.define';\nimport { ChatBodyInput, ChatRequestOptions, ChatToolBodyInput } from '../type';\nimport * as v from 'valibot';\nimport type { Stream } from 'openai/streaming.mjs';\nimport { ChatCompletionCreateParamsStreaming } from 'openai/resources/index.mjs';\nimport { ChatModelOptions } from '../options.define';\nexport class OpenAIChat {\n protected instance!: OpenAI;\n protected extraBody = {};\n protected extraHeaders = {};\n constructor(protected options: ChatModelOptions) {}\n init() {\n this.instance = new OpenAI({\n apiKey: this.options.apiKey || ' ',\n baseURL: this.options.baseURL ?? undefined,\n });\n }\n async #createStream(\n input: ChatCompletionCreateParamsStreaming,\n options?: ChatRequestOptions,\n ): Promise<\n Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {\n _request_id?: string | null;\n }\n > {\n return await this.instance.chat.completions\n .create(input, { headers: this.extraHeaders, ...options })\n .catch(async (error) => {\n // ollama server/routes.go\n if (options?.tryPull?.(error)) {\n await options?.pullModel!(this.options.model);\n return this.#createStream(input, {\n ...options,\n tryPull: () => false,\n });\n }\n\n throw error;\n });\n }\n async *stream(input: ChatBodyInput, options?: ChatRequestOptions) {\n const input2 = {\n ...input,\n messages: v.parse(ChatMessageListDefine, input.messages),\n model: this.options.model,\n stream: true,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n frequency_penalty: this.options.frequency_penalty,\n presence_penalty: this.options.presence_penalty,\n seed: this.options.seed,\n stop: this.options.stop,\n ...this.extraBody,\n } as ChatCompletionCreateParamsStreaming;\n const result = await this.#createStream(input2, options);\n let isThinking = 0;\n for await (const item of result) {\n try {\n //reasoning_content 思考\n if (!item.choices[0].finish_reason) {\n if (\n typeof (item.choices[0].delta as any).reasoning_content ===\n 'string' ||\n typeof (item.choices[0].delta as any).reasoning === 'string'\n ) {\n if (isThinking === 0) {\n isThinking = 1;\n yield '<thinking>';\n }\n const result =\n (item.choices[0].delta as any).reasoning_content ??\n (item.choices[0].delta as any).reasoning;\n if (result) {\n yield result;\n }\n } else if (typeof item.choices[0].delta.content === 'string') {\n if (isThinking === 1) {\n yield '</thinking>';\n isThinking = 2;\n }\n const result = item.choices[0].delta.content!;\n if (result) {\n yield result;\n }\n }\n }\n } catch (error) {\n throw error;\n }\n }\n }\n // 工具调用,暂时不清楚怎么调用...是返回工具,还是返回对话\n async callTool(input: ChatToolBodyInput, options?: ChatRequestOptions) {\n const result = await this.instance.chat.completions.create(\n {\n ...input,\n messages: v.parse(ChatMessageListDefine, input.messages),\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n frequency_penalty: this.options.frequency_penalty,\n presence_penalty: this.options.presence_penalty,\n seed: this.options.seed,\n stop: this.options.stop,\n ...this.extraBody,\n stream: false,\n },\n { headers: this.extraHeaders, ...options },\n );\n const isTool = !!result.choices[0].message.tool_calls;\n if (isTool) {\n // todo\n const data = (result.choices[0].message.tool_calls![0] as any).function;\n return {\n type: 'function' as const,\n function: {\n name: data.name,\n arguments: JSON.parse(data.arguments) as\n | Record<string, any>\n | undefined,\n },\n };\n }\n return { type: 'text' as const, text: result.choices[0].message.content! };\n }\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 detail: v.optional(v.picklist(['auto', 'low', 'high'])),\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 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 { ChatModelOptions } from '../options.define';\nimport { OpenAIChat } from './openai';\nconst VendorObject: Record<\n string,\n { options: { baseURL: string; modelList: string[] } }\n> = {\n '360': { options: { baseURL: 'https://ai.360.cn', modelList: [] } },\n azure: { options: { baseURL: '', modelList: [] } },\n moonshot: { options: { baseURL: 'https://api.moonshot.cn', modelList: [] } },\n baichuan: {\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n minimax: { options: { baseURL: 'https://api.minimax.chat', modelList: [] } },\n mistralai: { options: { baseURL: 'https://api.mistral.ai', modelList: [] } },\n groq: {\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n lingyiwanwu: {\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n stepfun: { options: { baseURL: 'https://api.stepfun.com', modelList: [] } },\n deepseek: { options: { baseURL: 'https://api.deepseek.com', modelList: [] } },\n 'together.ai': {\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n volcengine: {\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n novita: {\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n siliconflow: {\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n // 官网明确兼容\n // https://help.aliyun.com/zh/model-studio/developer-reference/use-qwen-by-calling-api?spm=a2c6h.13066369.question.5.3a0e527bbxeJLJ#4ec3e641c294d\n tongyi: {\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n // 文档上看是一样的\n // https://open.bigmodel.cn/dev/api/normal-model/glm-4\n zhipu: {\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n // 明确兼容\n // https://www.xfyun.cn/doc/spark/HTTP%E8%B0%83%E7%94%A8%E6%96%87%E6%A1%A3.html#_7-%E4%BD%BF%E7%94%A8openai-sdk%E8%AF%B7%E6%B1%82%E7%A4%BA%E4%BE%8B\n spark: {\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n // 官方兼容\n // https://cloud.tencent.com/document/product/1729/111007\n hunyuan: {\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n};\n\nexport function createCompatibleFactory(options: ChatModelOptions) {\n const vendorConfig = VendorObject[options.vendor];\n return new OpenAIChat({\n ...options,\n baseURL: vendorConfig.options.baseURL,\n });\n}\n", "import { OpenAIChat } from '../openai';\nimport { GoogleGenerativeAI, StartChatParams } from '@google/generative-ai';\nimport {\n GenminiChatMessageListDefine,\n GenminiSystemMessageDefine,\n} from './message.define';\nimport * as v from 'valibot';\nimport { ChatBodyInput, ChatRequestOptions } from '../../type';\n\nexport class GeminiChat extends OpenAIChat {\n #ggai!: GoogleGenerativeAI;\n override init(): void {\n this.#ggai = new GoogleGenerativeAI(this.options.apiKey!);\n }\n override async *stream(\n input: ChatBodyInput,\n options?: ChatRequestOptions,\n ): AsyncGenerator<string, void, unknown> {\n const model = this.#ggai.getGenerativeModel({\n model: this.options.model,\n generationConfig: {\n topP: this.options.top_p,\n temperature: this.options.temperature,\n maxOutputTokens: this.options.max_tokens,\n },\n });\n const messages = input.messages;\n const data = {} as Partial<StartChatParams>;\n if (messages[0].role === 'system') {\n const system = messages.shift();\n data.systemInstruction = v.parse(GenminiSystemMessageDefine, system);\n }\n data.history = v.parse(GenminiChatMessageListDefine, messages);\n const lastMessage = data.history.pop()!;\n\n const chat = model.startChat(data);\n const result = await chat.sendMessageStream(lastMessage.parts, {\n signal: options?.signal,\n });\n for await (const chunk of result.stream) {\n const chunkText = chunk.text();\n yield chunkText;\n }\n }\n}\n", "import * as v from 'valibot';\nimport {\n AssistantChatMessage,\n ChatCompletionContentPartImageType,\n ChatCompletionContentPartStrType,\n SystemChatMessage,\n UserChatMessage,\n} from '../../message.define';\nimport { isTruthy } from '@cyia/util';\n\nfunction messageContentTransform(\n list: (\n | ChatCompletionContentPartStrType\n | ChatCompletionContentPartImageType\n )[],\n) {\n return list\n .map((item) => (item.type === 'text' ? { text: item.text } : undefined))\n .filter(isTruthy);\n}\nexport const GenminiSystemMessageDefine = v.pipe(\n SystemChatMessage,\n v.transform((item) => {\n return {\n role: 'system',\n parts: messageContentTransform(item.content),\n };\n }),\n);\n\nexport const GenminiChatMessageListDefine = v.pipe(\n v.array(\n v.union([\n v.pipe(\n UserChatMessage,\n v.transform((item) => {\n return {\n role: 'user' as const,\n parts: messageContentTransform(item.content),\n };\n }),\n ),\n\n v.pipe(\n AssistantChatMessage,\n v.transform((item) => {\n return {\n role: 'model' as const,\n parts: messageContentTransform(item.content),\n };\n }),\n ),\n ]),\n ),\n);\n", "import { OpenAIChat } from '../openai';\nimport Anthropic from '@anthropic-ai/sdk';\nimport {\n AnthropicChatMessageListDefine,\n AnthropicSystemMessageDefine,\n} from './message.define';\nimport { createAsyncGeneratorAdapter } from '@cyia/util';\nimport * as v from 'valibot';\nimport {\n ChatBodyInput,\n ChatRequestOptions,\n ChatToolBodyInput,\n} from '../../type';\nexport class AnthropicChat extends OpenAIChat {\n client!: Anthropic;\n override init(): void {\n this.client = new Anthropic({ apiKey: this.options.apiKey });\n }\n override async *stream(\n input: ChatBodyInput,\n options?: ChatRequestOptions,\n ): AsyncGenerator<string, void, unknown> {\n const body = {\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n stream: true,\n } as Partial<Anthropic.Messages.MessageStreamParams>;\n\n if (input.messages[0].role === 'system') {\n const system = input.messages.shift()!.content;\n body.system = v.parse(AnthropicSystemMessageDefine, system);\n }\n body.messages = v.parse(AnthropicChatMessageListDefine, input.messages);\n const result = this.client.messages.stream(body as any, {\n signal: options?.signal,\n });\n const aga = createAsyncGeneratorAdapter<string>();\n result.once('end', () => aga.complete());\n result.on('text', (text) => {\n aga.next(text);\n });\n for await (const item of aga.getData()) {\n yield item;\n }\n }\n override async callTool(\n input: ChatToolBodyInput,\n options?: ChatRequestOptions,\n ) {\n const body =\n {} as Partial<Anthropic.Messages.MessageCreateParamsNonStreaming> &\n Pick<Anthropic.Messages.MessageCreateParamsNonStreaming, 'messages'>;\n\n if (input.messages[0].role === 'system') {\n const system = input.messages.shift()!.content;\n body.system = v.parse(AnthropicSystemMessageDefine, system);\n }\n body.messages = v.parse(AnthropicChatMessageListDefine, input.messages);\n const result = await this.client.messages.create(\n {\n ...body,\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n stream: false,\n tools: input.tools.map((item) => {\n return {\n name: item.function.name,\n description: item.function.description,\n input_schema: item.function.parameters! as any,\n };\n }),\n },\n {\n signal: options?.signal,\n },\n );\n const isToolResult = result.content.find(\n (item) => item.type === 'tool_use',\n );\n if (isToolResult) {\n return {\n type: 'function' as const,\n function: {\n name: isToolResult.name,\n arguments: isToolResult.input as Record<string, any> | undefined,\n },\n };\n }\n const text = result.content.find((item) => item.type === 'text');\n return {\n type: 'text' as const,\n text: text!.text,\n };\n }\n}\n", "import { isTruthy } from '@cyia/util';\nimport {\n SystemChatCompletionContent,\n UserChatMessage,\n AssistantChatMessage,\n ChatCompletionContentPartStrType,\n ChatCompletionContentPartImageType,\n} from '../../message.define';\nimport * as v from 'valibot';\n// data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAR\nfunction baseImageSplit(str: string) {\n const mimeTypeIndex = str.indexOf(';');\n const dataStartIndex = str.indexOf(',', mimeTypeIndex);\n return {\n mimeType: str.slice(5, mimeTypeIndex) as\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp',\n data: str.slice(dataStartIndex + 1),\n };\n}\n\nexport const AnthropicSystemMessageDefine = v.pipe(\n SystemChatCompletionContent,\n v.transform((list) => {\n return list\n .map((item) => (item.type === 'text' ? item : undefined))\n .filter(isTruthy);\n }),\n);\nfunction contentConvert(\n part: ChatCompletionContentPartStrType | ChatCompletionContentPartImageType,\n) {\n if (part.type === 'text') {\n return part;\n }\n const result = baseImageSplit(part.image_url.url);\n return {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: result.mimeType,\n data: result.data,\n },\n };\n}\nconst UserMessageDefine = v.pipe(\n UserChatMessage,\n v.transform((item) => {\n return {\n ...item,\n content: item.content.map(contentConvert),\n };\n }),\n);\nconst AssistantMessageDefine = v.pipe(\n AssistantChatMessage,\n v.transform((item) => {\n return {\n ...item,\n content: item.content.map(contentConvert),\n };\n }),\n);\nexport const AnthropicChatMessageListDefine = v.array(\n v.union([UserMessageDefine, AssistantMessageDefine]),\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", "export const ThinkList = [\n 'think',\n 'thinking',\n 'reason',\n 'reasoning',\n 'thought',\n 'Thought',\n];\n", "import {\n asControl,\n componentClass,\n hideWhen,\n patchInputs,\n patchProps,\n patchWrappers,\n setComponent,\n} from '@piying/view-angular-core';\nimport { map, of } from 'rxjs';\nimport * as v from 'valibot';\nimport {\n asVirtualGroup,\n metadataPipe,\n omitIntersect,\n} from '@piying/valibot-visit';\nconst VendorList = [\n {\n value: 'openai',\n label: 'openai',\n options: {\n baseURL: '',\n modelList: [],\n description: '如果是openai兼容的厂商,需要设置baseURL',\n },\n },\n {\n value: '360',\n label: '360',\n options: { baseURL: 'https://ai.360.cn', modelList: [] },\n },\n {\n value: 'azure',\n label: 'azure',\n options: { baseURL: '', modelList: [] },\n },\n {\n value: 'moonshot',\n label: 'moonshot',\n options: { baseURL: 'https://api.moonshot.cn', modelList: [] },\n },\n {\n value: 'baichuan',\n label: 'baichuan',\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n {\n value: 'minimax',\n label: 'minimax',\n options: { baseURL: 'https://api.minimax.chat', modelList: [] },\n },\n {\n value: 'mistralai',\n label: 'mistralai',\n options: { baseURL: 'https://api.mistral.ai', modelList: [] },\n },\n {\n value: 'groq',\n label: 'groq',\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n {\n value: 'lingyiwanwu',\n label: 'lingyiwanwu',\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n {\n value: 'stepfun',\n label: 'stepfun',\n options: { baseURL: 'https://api.stepfun.com', modelList: [] },\n },\n {\n value: 'deepseek',\n label: 'deepseek',\n options: { baseURL: 'https://api.deepseek.com', modelList: [] },\n },\n {\n value: 'together.ai',\n label: 'together.ai',\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n {\n value: 'volcengine',\n label: 'volcengine',\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n {\n value: 'novita',\n label: 'novita',\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n {\n value: 'siliconflow',\n label: 'siliconflow',\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n {\n value: 'tongyi',\n label: 'tongyi',\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n {\n value: 'zhipu',\n label: 'zhipu',\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n {\n value: 'spark',\n label: 'spark',\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n {\n value: 'hunyuan',\n label: 'hunyuan',\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n\n {\n value: 'gemini',\n label: 'gemini',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n {\n value: 'claude',\n label: 'claude',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n] as const;\nconst vendorOptionsDescribe = `## 通用参数\n- \\`extraOptions\\`字段用于覆盖默认字段\n\\`\\`\\`json\n{\"厂商名(与vendor字段相同)\":{ \"extraOptions\":{\"temperature\":0.1,\"topP\":0.8,\"maxTokens\":8192,\"baseURL\":\"http://127.0.0.1:11434/v1\",\"apiKey\":\" \"} }\n\\`\\`\\`\n`;\nconst InputWrapper = metadataPipe(patchWrappers(['tooltip', 'form-field']));\n\nexport const ChatItemDefine = v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(v.string(), v.title('配置名')),\n vendor: v.pipe(\n v.optional(\n v.picklist(VendorList.map((item) => item.value)),\n 'openai',\n ),\n v.description('大语言模型提供的厂商'),\n v.title('对话厂商'),\n v.metadata({\n enumOptions: VendorList.map((item) => {\n return {\n label: item.label,\n description: [\n (item.options as any).description\n ? (item.options as any).description\n : '',\n item.options.baseURL ? `链接: ${item.options.baseURL}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n };\n }),\n }),\n patchInputs({\n options: VendorList,\n }),\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.pipe(\n v.object({\n baseURL: v.pipe(\n v.optional(v.string(), 'http://127.0.0.1:11434/v1'),\n v.title('地址'),\n v.description('openai兼容接口'),\n ...InputWrapper,\n ),\n model: v.pipe(\n v.optional(v.string(), `qwen3:8b`),\n v.title('模型'),\n v.description(\n '## 模型名\\n### ollama模型推荐\\n- `qwen3:8b`\\n- `qwen3:14b`,`deepseek-r1:7b`,`deepseek-r1:14b`\\n### 图片对话模型\\n- `minicpm-v:8b`',\n ),\n ...InputWrapper,\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.object({\n apiKey: v.pipe(\n v.optional(v.string()),\n v.description('本地部署默认可以不填'),\n ),\n }),\n v.pipe(\n v.object({\n max_tokens: v.pipe(v.optional(v.number(), 8192)),\n top_p: v.pipe(\n v.optional(v.number(), 0.8),\n v.minValue(0),\n v.maxValue(10),\n v.description(`核采样(nucleus sampling)是温度采样的另一种替代方法,模型会考虑累积概率质量达到 top_p 的 token。例如,当 top_p 设为 0.1 时,仅考虑累积概率前 10% 的 token。\n\n我们通常建议调整 top_p 或温度参数,但不要同时调整两者。`),\n ...InputWrapper,\n ),\n temperature: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(2)), 0.1),\n v.description(\n '采样温度应设置在0到2之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)则会使输出更集中且确定。我们通常建议仅调整此参数或top_p,而不同时调整两者。',\n ),\n ...InputWrapper,\n ),\n frequency_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '取值范围为-2.0至2.0。正值会根据当前文本中已有标记的频率对新标记进行惩罚,从而降低模型逐字重复相同内容的概率。',\n ),\n ...InputWrapper,\n ),\n presence_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '数值介于-2.0至2.0之间。正值会基于新标记是否已在当前文本中出现,对新标记施加惩罚,从而提升模型讨论新话题的可能性。',\n ),\n ...InputWrapper,\n ),\n seed: v.pipe(\n v.optional(v.pipe(v.number())),\n v.description(\n '若已指定,系统将尽力确保采样具有确定性,即使用相同种子和参数的重复请求将返回相同结果。确定性无法保证,请通过 system_fingerprint 响应参数监控后端变化。',\n ),\n ...InputWrapper,\n ),\n stop: v.pipe(\n v.optional(v.pipe(v.array(v.pipe(v.string())), v.maxLength(4))),\n v.description(\n '最多可指定4个停止序列,API将在生成到该序列时停止,返回的文本中不包含该停止序列。',\n ),\n asControl(),\n setComponent('chip-input-list'),\n patchInputs({\n addOnBlur: true,\n }),\n ...InputWrapper,\n ),\n // top_logprobs: v.pipe(\n // v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(20))),\n // v.description(\n // '一个介于0和20之间的整数,用于指定在每个标记位置返回的最可能的标记数量,每个标记均关联对应的对数概率。若使用此参数,则必须将logprobs设置为true。',\n // ),\n // ),\n\n // verbosity: v.pipe(\n // v.optional(v.picklist(['low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n // reasoning_effort: v.pipe(\n // v.optional(v.picklist(['minimal', 'low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n }),\n componentClass('grid gap-2'),\n ),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n);\n\nexport const VendorOptionsDefine = v.pipe(\n v.optional(\n v.record(\n v.string(),\n v.pipe(\n v.intersect([\n v.object({\n /** @internal */\n extraOptions: v.pipe(\n v.optional(omitIntersect(ChatItemDefine, ['name', 'vendor'])),\n v.description(`附加配置`),\n ),\n }),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n ),\n ),\n ),\n v.description(vendorOptionsDescribe),\n setComponent('rest-chip-group'),\n patchInputs({\n optionalkeyList: VendorList.map((item) => item.value),\n placeholder: '请设置额外配置',\n }),\n v.title('厂商额外配置'),\n);\nexport const ChatParamsItemDefine = v.pipe(\n v.intersect([\n ChatItemDefine,\n v.object({ vendorOptions: VendorOptionsDefine }),\n ]),\n asVirtualGroup(),\n componentClass('grid gap-2'),\n);\n\nexport const ChatParamsListDefine = v.pipe(\n v.array(ChatParamsItemDefine),\n setComponent('label-chip-array'),\n v.description('对话模型列表,目前用于切换使用'),\n patchInputs({\n displayKey: 'name',\n placeholder: '请添加配置',\n }),\n);\nexport type ChatModelOptions = v.InferOutput<typeof ChatParamsItemDefine>;\nexport type ChatModelOptionsInput = v.InferInput<typeof ChatParamsItemDefine>;\n\nexport const InputChatOptionsDefine = omitIntersect(ChatParamsItemDefine, [\n 'name',\n]);\nexport type CreateChatModelOptions = v.InferInput<typeof InputChatOptionsDefine>;", "import { InjectionToken, Signal } from 'static-injector';\nimport { OpenAIConfig } from './type';\n\nexport const OpenAIConfigToken = new InjectionToken<Signal<OpenAIConfig>>(\n 'OpenAIConfig',\n);\n", "import {\n computed,\n inject,\n RootStaticInjectOptions,\n signal,\n} from 'static-injector';\n\nimport { omitBy } from 'es-toolkit';\nimport { bufferWhen, debounceTime, filter, Subject } from 'rxjs';\nimport { path } from '@cyia/vfs2';\nimport { HistoryItem } from './type/history';\nimport { OpenAIConfigToken } from './token';\nimport * as fs from 'fs';\nimport { parse, stringify } from 'yaml';\nimport { ChatMessageListOutputType } from './message.define';\nimport dayjs from 'dayjs';\nimport { isEmptyInput } from '@cyia/util';\n\nexport class ChatHistoryService {\n #update$ = signal(0);\n /** 外部监听更新用 */\n update$$ = computed(() => this.#update$());\n #logMap = new Map<string, Subject<HistoryItem>>();\n #config = inject(OpenAIConfigToken);\n #dir() {\n return this.#config().history.dir;\n }\n #createNewListen(fileName: string) {\n const filePath = path.join(this.#dir(), `${fileName}.yml`);\n const instance = new Subject<HistoryItem>();\n instance\n .pipe(\n bufferWhen(() => instance.pipe(debounceTime(2_000))),\n filter((list) => !!list.length),\n )\n .subscribe(async (inputList) => {\n if (!fs.existsSync(this.#dir())) {\n await fs.promises.mkdir(this.#dir(), { recursive: true });\n }\n try {\n let list: HistoryItem[] = [];\n if (await fs.existsSync(filePath)) {\n const content = await fs.promises.readFile(filePath, {\n encoding: 'utf-8',\n });\n list = parse(content);\n } else {\n list = [];\n }\n list.unshift(...inputList.reverse());\n await fs.promises.writeFile(filePath, stringify(list));\n this.#update$.update((a) => a + 1);\n } catch (error) {\n this.#config().captureException(error);\n }\n });\n this.#logMap.set(fileName, instance);\n\n return instance;\n }\n save(messages: ChatMessageListOutputType, options: any, config: any) {\n if (!this.#config().history.enable) {\n return;\n }\n try {\n const fileName = dayjs().format('YYYY-MM-DD');\n const message$ =\n this.#logMap.get(fileName) ?? this.#createNewListen(fileName);\n const item = {\n date: dayjs().valueOf(),\n messages,\n options: omitBy(options, isEmptyInput),\n config,\n };\n message$.next(item);\n } catch (error) {\n try {\n this.#config().captureException(error);\n } catch (error) {}\n }\n }\n}\n", "import { ChatHistoryService } from './chat.history.service';\r\nimport { ChatProviderService } from './service';\r\nimport { OpenAIConfigToken } from './token';\r\n\r\nexport const OPENAI_MODULE = {\r\n provider: [ChatProviderService, ChatHistoryService],\r\n token: { OpenAIConfigToken },\r\n};\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { inject } from 'static-injector';\nimport { OpenAIChat } from './vendor/openai';\nimport { ChatRequestOptions, ChatToolBodyInput } from './type';\nimport { createCompatibleFactory } from './vendor/openai-compatible.factory';\nimport { GeminiChat } from './vendor/genmini/genmini';\nimport { AnthropicChat } from './vendor/anthropic/anthropic';\nimport { createAssistantMessage } from './util/create';\nimport { ThinkList } from './const';\nimport {\n CreateChatModelOptions,\n InputChatOptionsDefine,\n} from './options.define';\nimport { OpenAIConfigToken } from './token';\nimport { ChatHistoryService } from './chat.history.service';\nimport * as v from 'valibot';\nexport class ChatProviderService {\n #config = inject(OpenAIConfigToken);\n #chatHistory = inject(ChatHistoryService);\n\n create(input: Omit<CreateChatModelOptions, 'name'>) {\n let options = v.parse(InputChatOptionsDefine, input);\n let instance;\n const extraOptions =\n options.vendorOptions?.[options.vendor]?.['extraOptions'];\n options = {\n ...extraOptions,\n ...options,\n apiKey: options.apiKey?.trim() || extraOptions?.apiKey || ' ',\n };\n if (!options.vendor || options.vendor === 'openai') {\n instance = new OpenAIChat(options);\n } else if (options.vendor === 'gemini') {\n instance = new GeminiChat(options);\n } else if (options.vendor === 'claude') {\n instance = new AnthropicChat(options);\n } else {\n instance = createCompatibleFactory(options);\n }\n instance.init();\n const openAIOptions = this.#config;\n const chatHistory = this.#chatHistory;\n\n const fn = async function* (...args: Parameters<OpenAIChat['stream']>) {\n const result = instance.stream(args[0], {\n ...args[1],\n tryPull: openAIOptions().tryPull,\n pullModel: openAIOptions().pullModel,\n });\n let content = '';\n let isThink = false;\n let thinkStart = 0;\n let thinkEnd: number | undefined;\n let start = true;\n /** 是否处于思考期 */\n let isThinking = false;\n let contentEnd: number | undefined;\n let lastEmit;\n for await (const delta of result) {\n content += delta;\n if (start) {\n start = false;\n const result = ThinkList.find((item) =>\n delta.startsWith(`<${item}>`),\n );\n if (result) {\n isThink = true;\n thinkStart = result.length + 2;\n isThinking = true;\n }\n } else if (isThink && thinkEnd === undefined) {\n const result = ThinkList.find((item) => delta === `</${item}>`);\n if (result) {\n contentEnd = content.length;\n thinkEnd = content.length - result.length - 3;\n isThinking = false;\n }\n }\n lastEmit = {\n content: isThink\n ? (contentEnd ? content.slice(contentEnd) : '').trim()\n : content,\n isThinking: isThinking,\n delta,\n thinkContent: isThink\n ? content.slice(thinkStart, thinkEnd).trim()\n : undefined,\n };\n yield lastEmit;\n }\n const lastMessage = createAssistantMessage(\n isThink ? (contentEnd ? content.slice(contentEnd) : '') : content,\n );\n if (lastEmit?.thinkContent) {\n lastMessage.thinkContent = lastEmit.thinkContent;\n }\n chatHistory.save(\n [...args[0].messages, lastMessage],\n { ...args[0], messages: undefined },\n options,\n );\n };\n return {\n stream: fn,\n chat: async (...args: Parameters<OpenAIChat['stream']>) => {\n const result = fn(...args);\n let obj;\n for await (const element of result) {\n obj = element;\n }\n return obj!;\n },\n callTool: (input: ChatToolBodyInput, options?: ChatRequestOptions) =>\n instance.callTool(input, options),\n };\n }\n}\n", "import { OpenAI } from 'openai';\nimport { ChatMessageListDefine } from '../message.define';\nimport { ChatBodyInput, ChatRequestOptions, ChatToolBodyInput } from '../type';\nimport * as v from 'valibot';\nimport type { Stream } from 'openai/streaming.mjs';\nimport { ChatCompletionCreateParamsStreaming } from 'openai/resources/index.mjs';\nimport { ChatModelOptions } from '../options.define';\nexport class OpenAIChat {\n protected instance!: OpenAI;\n protected extraBody = {};\n protected extraHeaders = {};\n constructor(protected options: ChatModelOptions) {}\n init() {\n this.instance = new OpenAI({\n apiKey: this.options.apiKey || ' ',\n baseURL: this.options.baseURL ?? undefined,\n });\n }\n async #createStream(\n input: ChatCompletionCreateParamsStreaming,\n options?: ChatRequestOptions,\n ): Promise<\n Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {\n _request_id?: string | null;\n }\n > {\n return await this.instance.chat.completions\n .create(input, { headers: this.extraHeaders, ...options })\n .catch(async (error) => {\n // ollama server/routes.go\n if (options?.tryPull?.(error)) {\n await options?.pullModel!(this.options.model);\n return this.#createStream(input, {\n ...options,\n tryPull: () => false,\n });\n }\n\n throw error;\n });\n }\n async *stream(input: ChatBodyInput, options?: ChatRequestOptions) {\n const input2 = {\n ...input,\n messages: v.parse(ChatMessageListDefine, input.messages),\n model: this.options.model,\n stream: true,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n frequency_penalty: this.options.frequency_penalty,\n presence_penalty: this.options.presence_penalty,\n seed: this.options.seed,\n stop: this.options.stop,\n ...this.extraBody,\n } as ChatCompletionCreateParamsStreaming;\n const result = await this.#createStream(input2, options);\n let isThinking = 0;\n for await (const item of result) {\n try {\n //reasoning_content 思考\n if (!item.choices[0].finish_reason) {\n if (\n typeof (item.choices[0].delta as any).reasoning_content ===\n 'string' ||\n typeof (item.choices[0].delta as any).reasoning === 'string'\n ) {\n if (isThinking === 0) {\n isThinking = 1;\n yield '<thinking>';\n }\n const result =\n (item.choices[0].delta as any).reasoning_content ??\n (item.choices[0].delta as any).reasoning;\n if (result) {\n yield result;\n }\n } else if (typeof item.choices[0].delta.content === 'string') {\n if (isThinking === 1) {\n yield '</thinking>';\n isThinking = 2;\n }\n const result = item.choices[0].delta.content!;\n if (result) {\n yield result;\n }\n }\n }\n } catch (error) {\n throw error;\n }\n }\n }\n // 工具调用,暂时不清楚怎么调用...是返回工具,还是返回对话\n async callTool(input: ChatToolBodyInput, options?: ChatRequestOptions) {\n const result = await this.instance.chat.completions.create(\n {\n ...input,\n messages: v.parse(ChatMessageListDefine, input.messages),\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n frequency_penalty: this.options.frequency_penalty,\n presence_penalty: this.options.presence_penalty,\n seed: this.options.seed,\n stop: this.options.stop,\n ...this.extraBody,\n stream: false,\n },\n { headers: this.extraHeaders, ...options },\n );\n const isTool = !!result.choices[0].message.tool_calls;\n if (isTool) {\n // todo\n const data = (result.choices[0].message.tool_calls![0] as any).function;\n return {\n type: 'function' as const,\n function: {\n name: data.name,\n arguments: JSON.parse(data.arguments) as\n | Record<string, any>\n | undefined,\n },\n };\n }\n return { type: 'text' as const, text: result.choices[0].message.content! };\n }\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 detail: v.optional(v.picklist(['auto', 'low', 'high'])),\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 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 { ChatModelOptions } from '../options.define';\nimport { OpenAIChat } from './openai';\nconst VendorObject: Record<\n string,\n { options: { baseURL: string; modelList: string[] } }\n> = {\n '360': { options: { baseURL: 'https://ai.360.cn', modelList: [] } },\n azure: { options: { baseURL: '', modelList: [] } },\n moonshot: { options: { baseURL: 'https://api.moonshot.cn', modelList: [] } },\n baichuan: {\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n minimax: { options: { baseURL: 'https://api.minimax.chat', modelList: [] } },\n mistralai: { options: { baseURL: 'https://api.mistral.ai', modelList: [] } },\n groq: {\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n lingyiwanwu: {\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n stepfun: { options: { baseURL: 'https://api.stepfun.com', modelList: [] } },\n deepseek: { options: { baseURL: 'https://api.deepseek.com', modelList: [] } },\n 'together.ai': {\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n volcengine: {\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n novita: {\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n siliconflow: {\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n // 官网明确兼容\n // https://help.aliyun.com/zh/model-studio/developer-reference/use-qwen-by-calling-api?spm=a2c6h.13066369.question.5.3a0e527bbxeJLJ#4ec3e641c294d\n tongyi: {\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n // 文档上看是一样的\n // https://open.bigmodel.cn/dev/api/normal-model/glm-4\n zhipu: {\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n // 明确兼容\n // https://www.xfyun.cn/doc/spark/HTTP%E8%B0%83%E7%94%A8%E6%96%87%E6%A1%A3.html#_7-%E4%BD%BF%E7%94%A8openai-sdk%E8%AF%B7%E6%B1%82%E7%A4%BA%E4%BE%8B\n spark: {\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n // 官方兼容\n // https://cloud.tencent.com/document/product/1729/111007\n hunyuan: {\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n};\n\nexport function createCompatibleFactory(options: ChatModelOptions) {\n const vendorConfig = VendorObject[options.vendor];\n return new OpenAIChat({\n ...options,\n baseURL: vendorConfig.options.baseURL,\n });\n}\n", "import { OpenAIChat } from '../openai';\nimport { GoogleGenerativeAI, StartChatParams } from '@google/generative-ai';\nimport {\n GenminiChatMessageListDefine,\n GenminiSystemMessageDefine,\n} from './message.define';\nimport * as v from 'valibot';\nimport { ChatBodyInput, ChatRequestOptions } from '../../type';\n\nexport class GeminiChat extends OpenAIChat {\n #ggai!: GoogleGenerativeAI;\n override init(): void {\n this.#ggai = new GoogleGenerativeAI(this.options.apiKey!);\n }\n override async *stream(\n input: ChatBodyInput,\n options?: ChatRequestOptions,\n ): AsyncGenerator<string, void, unknown> {\n const model = this.#ggai.getGenerativeModel({\n model: this.options.model,\n generationConfig: {\n topP: this.options.top_p,\n temperature: this.options.temperature,\n maxOutputTokens: this.options.max_tokens,\n },\n });\n const messages = input.messages;\n const data = {} as Partial<StartChatParams>;\n if (messages[0].role === 'system') {\n const system = messages.shift();\n data.systemInstruction = v.parse(GenminiSystemMessageDefine, system);\n }\n data.history = v.parse(GenminiChatMessageListDefine, messages);\n const lastMessage = data.history.pop()!;\n\n const chat = model.startChat(data);\n const result = await chat.sendMessageStream(lastMessage.parts, {\n signal: options?.signal,\n });\n for await (const chunk of result.stream) {\n const chunkText = chunk.text();\n yield chunkText;\n }\n }\n}\n", "import * as v from 'valibot';\nimport {\n AssistantChatMessage,\n ChatCompletionContentPartImageType,\n ChatCompletionContentPartStrType,\n SystemChatMessage,\n UserChatMessage,\n} from '../../message.define';\nimport { isTruthy } from '@cyia/util';\n\nfunction messageContentTransform(\n list: (\n | ChatCompletionContentPartStrType\n | ChatCompletionContentPartImageType\n )[],\n) {\n return list\n .map((item) => (item.type === 'text' ? { text: item.text } : undefined))\n .filter(isTruthy);\n}\nexport const GenminiSystemMessageDefine = v.pipe(\n SystemChatMessage,\n v.transform((item) => ({\n role: 'system',\n parts: messageContentTransform(item.content),\n })),\n);\n\nexport const GenminiChatMessageListDefine = v.pipe(\n v.array(\n v.union([\n v.pipe(\n UserChatMessage,\n v.transform((item) => ({\n role: 'user' as const,\n parts: messageContentTransform(item.content),\n })),\n ),\n\n v.pipe(\n AssistantChatMessage,\n v.transform((item) => ({\n role: 'model' as const,\n parts: messageContentTransform(item.content),\n })),\n ),\n ]),\n ),\n);\n", "import { OpenAIChat } from '../openai';\nimport Anthropic from '@anthropic-ai/sdk';\nimport {\n AnthropicChatMessageListDefine,\n AnthropicSystemMessageDefine,\n} from './message.define';\nimport { createAsyncGeneratorAdapter } from '@cyia/util';\nimport * as v from 'valibot';\nimport {\n ChatBodyInput,\n ChatRequestOptions,\n ChatToolBodyInput,\n} from '../../type';\nexport class AnthropicChat extends OpenAIChat {\n client!: Anthropic;\n override init(): void {\n this.client = new Anthropic({ apiKey: this.options.apiKey });\n }\n override async *stream(\n input: ChatBodyInput,\n options?: ChatRequestOptions,\n ): AsyncGenerator<string, void, unknown> {\n const body = {\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n stream: true,\n } as Partial<Anthropic.Messages.MessageStreamParams>;\n\n if (input.messages[0].role === 'system') {\n const system = input.messages.shift()!.content;\n body.system = v.parse(AnthropicSystemMessageDefine, system);\n }\n body.messages = v.parse(AnthropicChatMessageListDefine, input.messages);\n const result = this.client.messages.stream(body as any, {\n signal: options?.signal,\n });\n const aga = createAsyncGeneratorAdapter<string>();\n result.once('end', () => aga.complete());\n result.on('text', (text) => {\n aga.next(text);\n });\n for await (const item of aga.getData()) {\n yield item;\n }\n }\n override async callTool(\n input: ChatToolBodyInput,\n options?: ChatRequestOptions,\n ) {\n const body =\n {} as Partial<Anthropic.Messages.MessageCreateParamsNonStreaming> &\n Pick<Anthropic.Messages.MessageCreateParamsNonStreaming, 'messages'>;\n\n if (input.messages[0].role === 'system') {\n const system = input.messages.shift()!.content;\n body.system = v.parse(AnthropicSystemMessageDefine, system);\n }\n body.messages = v.parse(AnthropicChatMessageListDefine, input.messages);\n const result = await this.client.messages.create(\n {\n ...body,\n model: this.options.model,\n max_tokens: this.options.max_tokens,\n top_p: this.options.top_p,\n temperature: this.options.temperature,\n stream: false,\n tools: input.tools.map((item) => ({\n name: item.function.name,\n description: item.function.description,\n input_schema: item.function.parameters! as any,\n })),\n },\n {\n signal: options?.signal,\n },\n );\n const isToolResult = result.content.find(\n (item) => item.type === 'tool_use',\n );\n if (isToolResult) {\n return {\n type: 'function' as const,\n function: {\n name: isToolResult.name,\n arguments: isToolResult.input as Record<string, any> | undefined,\n },\n };\n }\n const text = result.content.find((item) => item.type === 'text');\n return {\n type: 'text' as const,\n text: text!.text,\n };\n }\n}\n", "import { isTruthy } from '@cyia/util';\nimport {\n SystemChatCompletionContent,\n UserChatMessage,\n AssistantChatMessage,\n ChatCompletionContentPartStrType,\n ChatCompletionContentPartImageType,\n} from '../../message.define';\nimport * as v from 'valibot';\n// data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAR\nfunction baseImageSplit(str: string) {\n const mimeTypeIndex = str.indexOf(';');\n const dataStartIndex = str.indexOf(',', mimeTypeIndex);\n return {\n mimeType: str.slice(5, mimeTypeIndex) as\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp',\n data: str.slice(dataStartIndex + 1),\n };\n}\n\nexport const AnthropicSystemMessageDefine = v.pipe(\n SystemChatCompletionContent,\n v.transform((list) =>\n list\n .map((item) => (item.type === 'text' ? item : undefined))\n .filter(isTruthy),\n ),\n);\nfunction contentConvert(\n part: ChatCompletionContentPartStrType | ChatCompletionContentPartImageType,\n) {\n if (part.type === 'text') {\n return part;\n }\n const result = baseImageSplit(part.image_url.url);\n return {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: result.mimeType,\n data: result.data,\n },\n };\n}\nconst UserMessageDefine = v.pipe(\n UserChatMessage,\n v.transform((item) => ({\n ...item,\n content: item.content.map(contentConvert),\n })),\n);\nconst AssistantMessageDefine = v.pipe(\n AssistantChatMessage,\n v.transform((item) => ({\n ...item,\n content: item.content.map(contentConvert),\n })),\n);\nexport const AnthropicChatMessageListDefine = v.array(\n v.union([UserMessageDefine, AssistantMessageDefine]),\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", "export const ThinkList = [\n 'think',\n 'thinking',\n 'reason',\n 'reasoning',\n 'thought',\n 'Thought',\n];\n", "import {\n asControl,\n componentClass,\n patchInputs,\n patchWrappers,\n setComponent,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport {\n asVirtualGroup,\n metadataPipe,\n omitIntersect,\n} from '@piying/valibot-visit';\nconst VendorList = [\n {\n value: 'openai',\n label: 'openai',\n options: {\n baseURL: '',\n modelList: [],\n description: '如果是openai兼容的厂商,需要设置baseURL',\n },\n },\n {\n value: '360',\n label: '360',\n options: { baseURL: 'https://ai.360.cn', modelList: [] },\n },\n {\n value: 'azure',\n label: 'azure',\n options: { baseURL: '', modelList: [] },\n },\n {\n value: 'moonshot',\n label: 'moonshot',\n options: { baseURL: 'https://api.moonshot.cn', modelList: [] },\n },\n {\n value: 'baichuan',\n label: 'baichuan',\n options: { baseURL: 'https://api.baichuan-ai.com', modelList: [] },\n },\n {\n value: 'minimax',\n label: 'minimax',\n options: { baseURL: 'https://api.minimax.chat', modelList: [] },\n },\n {\n value: 'mistralai',\n label: 'mistralai',\n options: { baseURL: 'https://api.mistral.ai', modelList: [] },\n },\n {\n value: 'groq',\n label: 'groq',\n options: { baseURL: 'https://api.groq.com/openai', modelList: [] },\n },\n {\n value: 'lingyiwanwu',\n label: 'lingyiwanwu',\n options: { baseURL: 'https://api.lingyiwanwu.com', modelList: [] },\n },\n {\n value: 'stepfun',\n label: 'stepfun',\n options: { baseURL: 'https://api.stepfun.com', modelList: [] },\n },\n {\n value: 'deepseek',\n label: 'deepseek',\n options: { baseURL: 'https://api.deepseek.com', modelList: [] },\n },\n {\n value: 'together.ai',\n label: 'together.ai',\n options: { baseURL: 'https://api.together.xyz', modelList: [] },\n },\n {\n value: 'volcengine',\n label: 'volcengine',\n options: {\n baseURL: 'https://ark.cn-beijing.volces.com/api/v3',\n modelList: [],\n },\n },\n {\n value: 'novita',\n label: 'novita',\n options: { baseURL: 'https://api.novita.ai/v3/openai', modelList: [] },\n },\n {\n value: 'siliconflow',\n label: 'siliconflow',\n options: { baseURL: 'https://api.siliconflow.cn', modelList: [] },\n },\n {\n value: 'tongyi',\n label: 'tongyi',\n options: {\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n modelList: [],\n },\n },\n {\n value: 'zhipu',\n label: 'zhipu',\n options: {\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\n modelList: [],\n },\n },\n {\n value: 'spark',\n label: 'spark',\n options: {\n baseURL: 'https://spark-api-open.xf-yun.com/v1',\n modelList: [],\n },\n },\n {\n value: 'hunyuan',\n label: 'hunyuan',\n options: {\n baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',\n modelList: [],\n },\n },\n\n {\n value: 'gemini',\n label: 'gemini',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n {\n value: 'claude',\n label: 'claude',\n options: {\n baseURL: '',\n modelList: [],\n description: '非openai兼容,手动适配,如果有问题欢迎报告',\n },\n },\n] as const;\nconst vendorOptionsDescribe = `## 通用参数\n- \\`extraOptions\\`字段用于覆盖默认字段\n\\`\\`\\`json\n{\"厂商名(与vendor字段相同)\":{ \"extraOptions\":{\"temperature\":0.1,\"topP\":0.8,\"maxTokens\":8192,\"baseURL\":\"http://127.0.0.1:11434/v1\",\"apiKey\":\" \"} }\n\\`\\`\\`\n`;\nconst InputWrapper = metadataPipe(patchWrappers(['tooltip', 'form-field']));\n\nexport const ChatItemDefine = v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(v.string(), v.title('配置名')),\n vendor: v.pipe(\n v.optional(\n v.picklist(VendorList.map((item) => item.value)),\n 'openai',\n ),\n v.description('大语言模型提供的厂商'),\n v.title('对话厂商'),\n v.metadata({\n enumOptions: VendorList.map((item) => ({\n label: item.label,\n description: [\n (item.options as any).description\n ? (item.options as any).description\n : '',\n item.options.baseURL ? `链接: ${item.options.baseURL}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n })),\n }),\n patchInputs({\n options: VendorList,\n }),\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.pipe(\n v.object({\n baseURL: v.pipe(\n v.optional(v.string(), 'http://127.0.0.1:11434/v1'),\n v.title('地址'),\n v.description('openai兼容接口'),\n ...InputWrapper,\n ),\n model: v.pipe(\n v.optional(v.string(), `qwen3:8b`),\n v.title('模型'),\n v.description(\n '## 模型名\\n### ollama模型推荐\\n- `qwen3:8b`\\n- `qwen3:14b`,`deepseek-r1:7b`,`deepseek-r1:14b`\\n### 图片对话模型\\n- `minicpm-v:8b`',\n ),\n ...InputWrapper,\n ),\n }),\n componentClass('flex *:flex-1 gap-2 items-center'),\n ),\n v.object({\n apiKey: v.pipe(\n v.optional(v.string()),\n v.description('本地部署默认可以不填'),\n ),\n }),\n v.pipe(\n v.object({\n max_tokens: v.pipe(v.optional(v.number(), 8192)),\n top_p: v.pipe(\n v.optional(v.number(), 0.8),\n v.minValue(0),\n v.maxValue(10),\n v.description(`核采样(nucleus sampling)是温度采样的另一种替代方法,模型会考虑累积概率质量达到 top_p 的 token。例如,当 top_p 设为 0.1 时,仅考虑累积概率前 10% 的 token。\n\n我们通常建议调整 top_p 或温度参数,但不要同时调整两者。`),\n ...InputWrapper,\n ),\n temperature: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(2)), 0.1),\n v.description(\n '采样温度应设置在0到2之间。较高的值(如0.8)会使输出更随机,而较低的值(如0.2)则会使输出更集中且确定。我们通常建议仅调整此参数或top_p,而不同时调整两者。',\n ),\n ...InputWrapper,\n ),\n frequency_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '取值范围为-2.0至2.0。正值会根据当前文本中已有标记的频率对新标记进行惩罚,从而降低模型逐字重复相同内容的概率。',\n ),\n ...InputWrapper,\n ),\n presence_penalty: v.pipe(\n v.optional(v.pipe(v.number(), v.minValue(-2), v.maxValue(2))),\n v.description(\n '数值介于-2.0至2.0之间。正值会基于新标记是否已在当前文本中出现,对新标记施加惩罚,从而提升模型讨论新话题的可能性。',\n ),\n ...InputWrapper,\n ),\n seed: v.pipe(\n v.optional(v.pipe(v.number())),\n v.description(\n '若已指定,系统将尽力确保采样具有确定性,即使用相同种子和参数的重复请求将返回相同结果。确定性无法保证,请通过 system_fingerprint 响应参数监控后端变化。',\n ),\n ...InputWrapper,\n ),\n stop: v.pipe(\n v.optional(v.pipe(v.array(v.pipe(v.string())), v.maxLength(4))),\n v.description(\n '最多可指定4个停止序列,API将在生成到该序列时停止,返回的文本中不包含该停止序列。',\n ),\n asControl(),\n setComponent('chip-input-list'),\n patchInputs({\n addOnBlur: true,\n }),\n ...InputWrapper,\n ),\n // top_logprobs: v.pipe(\n // v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(20))),\n // v.description(\n // '一个介于0和20之间的整数,用于指定在每个标记位置返回的最可能的标记数量,每个标记均关联对应的对数概率。若使用此参数,则必须将logprobs设置为true。',\n // ),\n // ),\n\n // verbosity: v.pipe(\n // v.optional(v.picklist(['low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n // reasoning_effort: v.pipe(\n // v.optional(v.picklist(['minimal', 'low', 'medium', 'high'])),\n // v.description(\n // `控制模型回复的详细程度。数值越低,回复越简洁;数值越高,回复越详细。当前支持的取值为低、中和高。`,\n // ),\n // ),\n }),\n componentClass('grid gap-2'),\n ),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n);\n\nexport const VendorOptionsDefine = v.pipe(\n v.optional(\n v.record(\n v.string(),\n v.pipe(\n v.intersect([\n v.object({\n /** @internal */\n extraOptions: v.pipe(\n v.optional(omitIntersect(ChatItemDefine, ['name', 'vendor'])),\n v.description(`附加配置`),\n ),\n }),\n ]),\n componentClass('grid gap-2'),\n asVirtualGroup(),\n ),\n ),\n ),\n v.description(vendorOptionsDescribe),\n setComponent('rest-chip-group'),\n patchInputs({\n optionalkeyList: VendorList.map((item) => item.value),\n placeholder: '请设置额外配置',\n }),\n v.title('厂商额外配置'),\n);\nexport const ChatParamsItemDefine = v.pipe(\n v.intersect([\n ChatItemDefine,\n v.object({ vendorOptions: VendorOptionsDefine }),\n ]),\n asVirtualGroup(),\n componentClass('grid gap-2'),\n);\n\nexport const ChatParamsListDefine = v.pipe(\n v.array(ChatParamsItemDefine),\n setComponent('label-chip-array'),\n v.description('对话模型列表,目前用于切换使用'),\n patchInputs({\n displayKey: 'name',\n placeholder: '请添加配置',\n }),\n);\nexport type ChatModelOptions = v.InferOutput<typeof ChatParamsItemDefine>;\nexport type ChatModelOptionsInput = v.InferInput<typeof ChatParamsItemDefine>;\n\nexport const InputChatOptionsDefine = omitIntersect(ChatParamsItemDefine, [\n 'name',\n]);\nexport type CreateChatModelOptions = v.InferInput<\n typeof InputChatOptionsDefine\n>;\n", "import { InjectionToken, Signal } from 'static-injector';\nimport { OpenAIConfig } from './type';\n\nexport const OpenAIConfigToken = new InjectionToken<Signal<OpenAIConfig>>(\n 'OpenAIConfig',\n);\n", "import { computed, inject, signal } from 'static-injector';\n\nimport { omitBy } from 'es-toolkit';\nimport { bufferWhen, debounceTime, filter, Subject } from 'rxjs';\nimport { path } from '@cyia/vfs2';\nimport { HistoryItem } from './type/history';\nimport { OpenAIConfigToken } from './token';\nimport * as fs from 'fs';\nimport { parse, stringify } from 'yaml';\nimport { ChatMessageListOutputType } from './message.define';\nimport dayjs from 'dayjs';\nimport { isEmptyInput } from '@cyia/util';\n\nexport class ChatHistoryService {\n #update$ = signal(0);\n /** 外部监听更新用 */\n update$$ = computed(() => this.#update$());\n #logMap = new Map<string, Subject<HistoryItem>>();\n #config = inject(OpenAIConfigToken);\n #dir() {\n return this.#config().history.dir;\n }\n #createNewListen(fileName: string) {\n const filePath = path.join(this.#dir(), `${fileName}.yml`);\n const instance = new Subject<HistoryItem>();\n instance\n .pipe(\n bufferWhen(() => instance.pipe(debounceTime(2_000))),\n filter((list) => !!list.length),\n )\n .subscribe(async (inputList) => {\n if (!fs.existsSync(this.#dir())) {\n await fs.promises.mkdir(this.#dir(), { recursive: true });\n }\n try {\n let list: HistoryItem[] = [];\n if (await fs.existsSync(filePath)) {\n const content = await fs.promises.readFile(filePath, {\n encoding: 'utf-8',\n });\n list = parse(content);\n } else {\n list = [];\n }\n list.unshift(...inputList.reverse());\n await fs.promises.writeFile(filePath, stringify(list));\n this.#update$.update((a) => a + 1);\n } catch (error) {\n this.#config().captureException(error);\n }\n });\n this.#logMap.set(fileName, instance);\n\n return instance;\n }\n save(messages: ChatMessageListOutputType, options: any, config: any) {\n if (!this.#config().history.enable) {\n return;\n }\n try {\n const fileName = dayjs().format('YYYY-MM-DD');\n const message$ =\n this.#logMap.get(fileName) ?? this.#createNewListen(fileName);\n const item = {\n date: dayjs().valueOf(),\n messages,\n options: omitBy(options, isEmptyInput),\n config,\n };\n message$.next(item);\n } catch (error) {\n try {\n this.#config().captureException(error);\n } catch (error) {}\n }\n }\n}\n", "import { ChatHistoryService } from './chat.history.service';\nimport { ChatProviderService } from './service';\nimport { OpenAIConfigToken } from './token';\n\nexport const OPENAI_MODULE = {\n provider: [ChatProviderService, ChatHistoryService],\n token: { OpenAIConfigToken },\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["inject", "v", "result", "v", "v", "isTruthy", "v", "isTruthy", "v", "v", "parse", "error", "v", "inject", "result", "input", "options"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shenghuabi/openai",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "模板",
5
5
  "author": "wszgrcy",
6
6
  "sideEffects": false,
@@ -40,6 +40,6 @@
40
40
  "access": "public"
41
41
  },
42
42
  "repository": {
43
- "url": "https://github.com/wszgrcy/toolkit"
43
+ "url": "https://github.com/wszgrcy/shb-lib"
44
44
  }
45
45
  }