@qjp88995/provider-client 0.0.0-stage → 0.1.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.
Files changed (122) hide show
  1. package/dist/center-fetch.d.ts +29 -0
  2. package/dist/center-fetch.d.ts.map +1 -0
  3. package/dist/center-fetch.js +45 -0
  4. package/dist/center-fetch.js.map +1 -0
  5. package/dist/direct-resolver.d.ts +29 -0
  6. package/dist/direct-resolver.d.ts.map +1 -0
  7. package/dist/direct-resolver.js +47 -0
  8. package/dist/direct-resolver.js.map +1 -0
  9. package/dist/errors.d.ts +38 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +57 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/index.d.ts +9 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +8 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/model-handle.d.ts +92 -0
  18. package/dist/model-handle.d.ts.map +1 -0
  19. package/dist/model-handle.js +72 -0
  20. package/dist/model-handle.js.map +1 -0
  21. package/dist/provider-client.d.ts +40 -0
  22. package/dist/provider-client.d.ts.map +1 -0
  23. package/dist/provider-client.js +96 -0
  24. package/dist/provider-client.js.map +1 -0
  25. package/dist/to-error.d.ts +12 -0
  26. package/dist/to-error.d.ts.map +1 -0
  27. package/dist/to-error.js +33 -0
  28. package/dist/to-error.js.map +1 -0
  29. package/dist/types.d.ts +78 -0
  30. package/dist/types.d.ts.map +1 -0
  31. package/dist/types.js +75 -0
  32. package/dist/types.js.map +1 -0
  33. package/dist/vendors/alibaba.adapter.d.ts +47 -0
  34. package/dist/vendors/alibaba.adapter.d.ts.map +1 -0
  35. package/dist/vendors/alibaba.adapter.js +79 -0
  36. package/dist/vendors/alibaba.adapter.js.map +1 -0
  37. package/dist/vendors/ark-responses-shim.d.ts +25 -0
  38. package/dist/vendors/ark-responses-shim.d.ts.map +1 -0
  39. package/dist/vendors/ark-responses-shim.js +60 -0
  40. package/dist/vendors/ark-responses-shim.js.map +1 -0
  41. package/dist/vendors/deepseek.adapter.d.ts +50 -0
  42. package/dist/vendors/deepseek.adapter.d.ts.map +1 -0
  43. package/dist/vendors/deepseek.adapter.js +123 -0
  44. package/dist/vendors/deepseek.adapter.js.map +1 -0
  45. package/dist/vendors/dots.adapter.d.ts +32 -0
  46. package/dist/vendors/dots.adapter.d.ts.map +1 -0
  47. package/dist/vendors/dots.adapter.js +53 -0
  48. package/dist/vendors/dots.adapter.js.map +1 -0
  49. package/dist/vendors/generic.adapter.d.ts +33 -0
  50. package/dist/vendors/generic.adapter.d.ts.map +1 -0
  51. package/dist/vendors/generic.adapter.js +82 -0
  52. package/dist/vendors/generic.adapter.js.map +1 -0
  53. package/dist/vendors/google-signature.d.ts +17 -0
  54. package/dist/vendors/google-signature.d.ts.map +1 -0
  55. package/dist/vendors/google-signature.js +69 -0
  56. package/dist/vendors/google-signature.js.map +1 -0
  57. package/dist/vendors/google.adapter.d.ts +41 -0
  58. package/dist/vendors/google.adapter.d.ts.map +1 -0
  59. package/dist/vendors/google.adapter.js +164 -0
  60. package/dist/vendors/google.adapter.js.map +1 -0
  61. package/dist/vendors/index.d.ts +11 -0
  62. package/dist/vendors/index.d.ts.map +1 -0
  63. package/dist/vendors/index.js +39 -0
  64. package/dist/vendors/index.js.map +1 -0
  65. package/dist/vendors/minimax.adapter.d.ts +98 -0
  66. package/dist/vendors/minimax.adapter.d.ts.map +1 -0
  67. package/dist/vendors/minimax.adapter.js +163 -0
  68. package/dist/vendors/minimax.adapter.js.map +1 -0
  69. package/dist/vendors/moonshotai.adapter.d.ts +31 -0
  70. package/dist/vendors/moonshotai.adapter.d.ts.map +1 -0
  71. package/dist/vendors/moonshotai.adapter.js +57 -0
  72. package/dist/vendors/moonshotai.adapter.js.map +1 -0
  73. package/dist/vendors/openai-responses.d.ts +49 -0
  74. package/dist/vendors/openai-responses.d.ts.map +1 -0
  75. package/dist/vendors/openai-responses.js +64 -0
  76. package/dist/vendors/openai-responses.js.map +1 -0
  77. package/dist/vendors/openai.adapter.d.ts +27 -0
  78. package/dist/vendors/openai.adapter.d.ts.map +1 -0
  79. package/dist/vendors/openai.adapter.js +196 -0
  80. package/dist/vendors/openai.adapter.js.map +1 -0
  81. package/dist/vendors/responses-reasoning-text-shim.d.ts +50 -0
  82. package/dist/vendors/responses-reasoning-text-shim.d.ts.map +1 -0
  83. package/dist/vendors/responses-reasoning-text-shim.js +170 -0
  84. package/dist/vendors/responses-reasoning-text-shim.js.map +1 -0
  85. package/dist/vendors/vendor-adapter.d.ts +214 -0
  86. package/dist/vendors/vendor-adapter.d.ts.map +1 -0
  87. package/dist/vendors/vendor-adapter.js +150 -0
  88. package/dist/vendors/vendor-adapter.js.map +1 -0
  89. package/dist/vendors/volcengine.adapter.d.ts +74 -0
  90. package/dist/vendors/volcengine.adapter.d.ts.map +1 -0
  91. package/dist/vendors/volcengine.adapter.js +139 -0
  92. package/dist/vendors/volcengine.adapter.js.map +1 -0
  93. package/dist/vendors/zhipu.adapter.d.ts +81 -0
  94. package/dist/vendors/zhipu.adapter.d.ts.map +1 -0
  95. package/dist/vendors/zhipu.adapter.js +133 -0
  96. package/dist/vendors/zhipu.adapter.js.map +1 -0
  97. package/package.json +53 -3
  98. package/src/center-fetch.ts +69 -0
  99. package/src/direct-resolver.ts +90 -0
  100. package/src/errors.ts +88 -0
  101. package/src/index.ts +54 -0
  102. package/src/model-handle.ts +197 -0
  103. package/src/provider-client.ts +136 -0
  104. package/src/to-error.ts +39 -0
  105. package/src/types.ts +126 -0
  106. package/src/vendors/alibaba.adapter.ts +101 -0
  107. package/src/vendors/ark-responses-shim.ts +60 -0
  108. package/src/vendors/deepseek.adapter.ts +155 -0
  109. package/src/vendors/dots.adapter.ts +69 -0
  110. package/src/vendors/generic.adapter.ts +103 -0
  111. package/src/vendors/google-signature.ts +87 -0
  112. package/src/vendors/google.adapter.ts +197 -0
  113. package/src/vendors/index.ts +56 -0
  114. package/src/vendors/minimax.adapter.ts +193 -0
  115. package/src/vendors/moonshotai.adapter.ts +84 -0
  116. package/src/vendors/openai-responses.ts +82 -0
  117. package/src/vendors/openai.adapter.ts +235 -0
  118. package/src/vendors/responses-reasoning-text-shim.ts +174 -0
  119. package/src/vendors/vendor-adapter.ts +294 -0
  120. package/src/vendors/volcengine.adapter.ts +166 -0
  121. package/src/vendors/zhipu.adapter.ts +169 -0
  122. package/README.md +0 -3
@@ -0,0 +1,169 @@
1
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
2
+ import type { LanguageModel } from 'ai';
3
+
4
+ import type { LlmProtocol } from '../types.js';
5
+ import {
6
+ COMPATIBLE_RESPONSES_OPTIONS,
7
+ createResponsesModel,
8
+ } from './openai-responses.js';
9
+ import { withReasoningTextResponsesShim } from './responses-reasoning-text-shim.js';
10
+ import {
11
+ type CreateModelInput,
12
+ LlmVendorAdapter,
13
+ type ProviderOptions,
14
+ type ReasoningEffort,
15
+ unsupportedProtocol,
16
+ } from './vendor-adapter.js';
17
+
18
+ /**
19
+ * 工厂 `name`。它同时决定 provider id(`zhipu.chat`)与 providerOptions 的
20
+ * 命名空间 key(SDK 认 `name` 与 `toCamelCase(name)`,单词无连字符两者相同),
21
+ * 恰好等于我们的 `kind`,故基类默认的 `optionsKey` 直接可用。
22
+ */
23
+ const FACTORY_NAME = 'zhipu';
24
+
25
+ /**
26
+ * 智谱的推理开关是**模型级**的两种形态(2026-08-27 用真实 API 探针钉住,
27
+ * 文档见 <https://docs.bigmodel.cn/cn/guide/capabilities/thinking-mode.md>):
28
+ *
29
+ * - `forced`:glm-5.3 / glm-5.3-flash。**思考关不掉**——发 `thinking:{type:'disabled'}`
30
+ * 直接 400(code 1210「该模型始终思考,不支持关闭思考;请使用 low、high 或 max」),
31
+ * 只认 `reasoning_effort`。
32
+ * - `toggle`:glm-5.2 及更早的推理模型(5.1 / 5 / 4.7 / 4.6 / 4.5)。`thinking` 的
33
+ * `enabled`/`disabled` 都合法,且**默认是 enabled**(不发 = 开着推理,探针
34
+ * `reasoning_tokens: 62`),档位同样走 `reasoning_effort`(4.7、5.2 实测都收)。
35
+ *
36
+ * 模型名换了就改这一个函数。没有推理能力的老模型(glm-4-flash 那批)走不到这里
37
+ * ——resolver 只对标了 `reasoning` 能力的模型问推理选项。
38
+ */
39
+ type ThinkingStyle = 'forced' | 'toggle';
40
+
41
+ export function zhipuThinkingStyle(modelId: string): ThinkingStyle {
42
+ const id = modelId.toLowerCase();
43
+ if (id.startsWith('glm-5.3')) return 'forced';
44
+ return 'toggle';
45
+ }
46
+
47
+ /**
48
+ * 智谱 BigModel(GLM 系)。
49
+ *
50
+ * 承载包是 `@ai-sdk/openai-compatible`,**不是**社区的 `zhipu-ai-provider`(维护
51
+ * 停滞、跟不上 AI SDK 大版本)。选它的依据是一条实测过的 SDK 行为:它把
52
+ * `providerOptions[name]` 里**不在自己 schema 里的键原样展开进请求体**
53
+ * (dist 里 `...Object.fromEntries(Object.entries(providerOptions[...]).filter(...))`),
54
+ * 所以智谱私有的 `thinking` 参数不必写一整套 LanguageModel 就能下发;
55
+ * `reasoningEffort` 则在 schema 里、由 SDK 翻成 `reasoning_effort`。响应侧
56
+ * `reasoning_content`(非流式 message 与流式 delta 都是这个字段名)也正是
57
+ * 该包原生读取的字段——同目录 `zhipu.sdk-contract.spec.ts` 跑真实 SDK 钉这两条。
58
+ *
59
+ * 接入面:文档的「HTTP 原生」与「OpenAI 兼容」是**同一个端点**
60
+ * `/api/paas/v4/chat/completions`,前者只是多了几个私有参数,合为 chat-completions
61
+ * 一个分支;Responses 端点(`/api/v1/responses`)**没有任何文档页**,只在模型页的
62
+ * 接入方式表与 Codex 接入指南里各出现一次,全部判据来自 2026-08-27 的探针(见
63
+ * `reasoning()` 注释与 providers.md);Anthropic 兼容面(`/api/anthropic`)本仓
64
+ * 尚无 `anthropic-messages` 分支,用户拍板先不做。
65
+ *
66
+ * Responses 面的两条运维事实:① GLM-5.3 模型页接入表下的 `<Note>` 原文——「如果您
67
+ * 有订阅过 GLM Coding Plan(含已过期),那么**暂时**您只能通过 OpenAI Chat Completion
68
+ * 协议调用模型 API,我们将在近期迭代优化」,是临时限制,那种账号在 responses 端点
69
+ * 失败时先想到它;② 探针约 30 次调用里有 3 次非流式请求挂到超时(重打即成功),
70
+ * 是厂商侧偶发,不是形状问题。
71
+ *
72
+ * **`temperature` 只收 `[0,1]`**(超出直接 400「temperature参数非法」,实测),
73
+ * 与 OpenAI 的 `[0,2]` 不同;`sampling` 只有「发不发」的粒度,这条限制目前靠
74
+ * 运营录参数时自觉,未做钳位。
75
+ */
76
+ export class ZhipuAdapter extends LlmVendorAdapter {
77
+ readonly kind = 'zhipu' as const;
78
+
79
+ override readonly supportedProtocols: readonly LlmProtocol[] = [
80
+ 'openai-chat-completions',
81
+ 'openai-responses',
82
+ ];
83
+
84
+ /**
85
+ * responses 走 `@ai-sdk/openai` + 与 DeepSeek 共用的响应侧垫片:智谱的推理正文
86
+ * 同样以 reasoning item 的 `content[{reasoning_text}]` 返回、流式事件同样是
87
+ * `response.reasoning_text.delta`(探针逐字段核对过),不垫就是推理整段消失。
88
+ * 请求侧不动:四种回传形状(原样 output / 只回 function_call / `item_reference`
89
+ * / 流式)全部 200;与 DeepSeek 不同的是它**会消费**发回去的 reasoning item
90
+ * (input_tokens 恰好多出上一轮的 reasoning_tokens),SDK 默认发什么就发什么。
91
+ */
92
+ createModel(input: CreateModelInput): LanguageModel {
93
+ switch (input.protocol) {
94
+ case 'openai-chat-completions': {
95
+ const { baseUrl, apiKey, modelId, fetch } = input;
96
+ return createOpenAICompatible({
97
+ name: FACTORY_NAME,
98
+ baseURL: baseUrl,
99
+ apiKey,
100
+ fetch,
101
+ })(modelId);
102
+ }
103
+ case 'openai-responses':
104
+ return createResponsesModel(
105
+ input,
106
+ withReasoningTextResponsesShim(input.fetch)
107
+ );
108
+ default:
109
+ throw unsupportedProtocol(this, input.protocol);
110
+ }
111
+ }
112
+
113
+ /**
114
+ * **chat-completions**:`off` 在 toggle 模型上必须发**显式的**
115
+ * `thinking:{type:'disabled'}`——它默认开着推理,「不发 ≠ 关闭」在这家再次成立;
116
+ * forced 模型没有关闭开关,off 只能不发(如实反映厂商限制,不是漏了关闭指令)。
117
+ * 非 off 一律 `thinking:enabled` + `reasoning_effort`:厂商原生三档 `low/high/max`
118
+ * (glm-5.3 默认 `max`),我们的五档压进去;`max` 直通。`medium` 实测 5.2 也收,
119
+ * 但 5.3 的 400 文案只认三档,统一映射不赌宽容度。
120
+ *
121
+ * **responses**:只有 `reasoning.effort` 一个开关,且**这个面上推理关不掉**——
122
+ * 探针在 glm-5.2 上把 `effort:'none'`、体内 `thinking:{type:'disabled'}`、两者同发
123
+ * 全试过,reasoning_tokens 纹丝不动(100);glm-5.3 系收到 `none` 则直接 400
124
+ * 「该模型始终思考」。所以 `off` 在 responses 下**不发**:发 `none` 在 5.2 上
125
+ * 是无效指令、在 5.3 上是错误,两边都不是「关闭」。这是本协议面的已知限制,
126
+ * 要真关推理请给模型只声明 chat-completions。档位 key 随承载包换成 `openai`,
127
+ * 并带 `COMPATIBLE_RESPONSES_OPTIONS`(否则 SDK 按模型名判成非推理模型、
128
+ * `reasoning` 整个不发;`developer` 角色实测也收,但只保证 `system`)。
129
+ */
130
+ override reasoning(
131
+ modelId: string,
132
+ effort: ReasoningEffort,
133
+ protocol: LlmProtocol
134
+ ): ProviderOptions | undefined {
135
+ switch (protocol) {
136
+ case 'openai-chat-completions': {
137
+ const style = zhipuThinkingStyle(modelId);
138
+ if (effort === 'off') {
139
+ if (style === 'forced') return undefined;
140
+ return { [this.optionsKey]: { thinking: { type: 'disabled' } } };
141
+ }
142
+ return {
143
+ [this.optionsKey]: {
144
+ thinking: { type: 'enabled' },
145
+ reasoningEffort: toZhipuEffort(effort),
146
+ },
147
+ };
148
+ }
149
+ case 'openai-responses': {
150
+ if (effort === 'off') return undefined;
151
+ return {
152
+ openai: {
153
+ reasoningEffort: toZhipuEffort(effort),
154
+ ...COMPATIBLE_RESPONSES_OPTIONS,
155
+ },
156
+ };
157
+ }
158
+ default:
159
+ throw unsupportedProtocol(this, protocol);
160
+ }
161
+ }
162
+ }
163
+
164
+ /** 我们的档位 → 智谱原生三档 `low/high/max`。`max` 直通——用户选了最高档就该拿到最高档。 */
165
+ function toZhipuEffort(effort: ReasoningEffort): string {
166
+ if (effort === 'minimal' || effort === 'low') return 'low';
167
+ if (effort === 'max') return 'max';
168
+ return 'high';
169
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.