@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,164 @@
1
+ import { createGoogleGenerativeAI } from '@ai-sdk/google';
2
+ import { wrapLanguageModel, } from 'ai';
3
+ import { interactionsSignatureMiddleware } from './google-signature.js';
4
+ import { LlmVendorAdapter, unsupportedProtocol, } from './vendor-adapter.js';
5
+ /** `@ai-sdk/google` 两条协议的 providerOptions 命名空间都是 `google`。 */
6
+ const OPTIONS_KEY = 'google';
7
+ /**
8
+ * 认 `thinkingLevel: 'minimal'` 的模型(模型名前缀)。**只收探针 / 官方型号表
9
+ * 证实过的**:猜成「认」而它不认是 400「Thinking level MINIMAL is not supported
10
+ * for this model」,猜成「不认」只是退到 `low` 多想一点——所以未知模型(含
11
+ * `gemini-flash-latest` 这类别名)一律按不认处理。
12
+ *
13
+ * 2026-10-23 探针:3.6-flash / 3.5-flash-lite / 3-flash-preview 收 minimal 且
14
+ * `reasoningTokens: 0`;4-argon / 3.8-flash / 3.1-pro-preview / flash-latest 400。
15
+ * 型号表另列 3.1-flash-lite 系认 minimal。
16
+ */
17
+ const MINIMAL_LEVEL_MODELS = [
18
+ 'gemini-3-flash',
19
+ 'gemini-3.5-flash',
20
+ 'gemini-3.6-flash',
21
+ 'gemini-3.1-flash-lite',
22
+ ];
23
+ function supportsMinimal(modelId) {
24
+ return MINIMAL_LEVEL_MODELS.some(prefix => modelId.startsWith(prefix));
25
+ }
26
+ /**
27
+ * 我们的六档 → Gemini 的 `thinkingLevel`。
28
+ *
29
+ * - `off`:Gemini 3 起**没有关闭开关**(`thinkingBudget: 0` 在 3.8-flash 上照样
30
+ * 想 81 token、在 3.1-pro 上直接 400「only works in thinking mode」),能做到的
31
+ * 最少是 `minimal`(认它的模型上 `reasoningTokens: 0`),不认的退到 `low`。
32
+ * **不选「什么都不发」**:不发是模型默认档(medium / high),离「关」更远。
33
+ * - `minimal` 同上;`max` 压到 `high`(它的最高档)。
34
+ */
35
+ function thinkingLevelOf(modelId, effort) {
36
+ switch (effort) {
37
+ case 'off':
38
+ case 'minimal':
39
+ return supportsMinimal(modelId) ? 'minimal' : 'low';
40
+ case 'low':
41
+ case 'medium':
42
+ case 'high':
43
+ return effort;
44
+ case 'max':
45
+ return 'high';
46
+ }
47
+ }
48
+ /**
49
+ * Interactions 句柄每次调用必带 `store: false`:不发时服务端按自己的默认把这次
50
+ * 交互存在 Google 那边,而我们每轮都发全量历史、从不引用
51
+ * `previous_interaction_id`——存了只是让对话内容平白留在第三方。与推理无关,
52
+ * 所以放中间件而不是 `reasoning()`(没标 `reasoning` 能力的模型行不会被问推理
53
+ * 选项)。调用方显式给的同名选项优先。
54
+ */
55
+ const interactionsDefaultsMiddleware = {
56
+ specificationVersion: 'v4',
57
+ transformParams: ({ params }) => {
58
+ const google = params.providerOptions?.[OPTIONS_KEY] ?? {};
59
+ return Promise.resolve({
60
+ ...params,
61
+ providerOptions: {
62
+ ...params.providerOptions,
63
+ [OPTIONS_KEY]: { store: false, ...google },
64
+ },
65
+ });
66
+ },
67
+ };
68
+ /**
69
+ * Google(Gemini API)。承载包 `@ai-sdk/google`:`chat()` 走 `:generateContent`,
70
+ * `interactions()` 走 `/interactions`。全部判据来自 2026-10-23 真 key 探针:
71
+ *
72
+ * - **思考签名必须原样带回**。两种协议都把签名挂在一步里**第一个函数调用**上
73
+ * (SDK 放进 tool-call 的 `providerMetadata.google`,generateContent 叫
74
+ * `thoughtSignature`、Interactions 叫 `signature`),下一步不带回去:
75
+ * generateContent 400「Function call is missing a thought_signature」——SDK
76
+ * 4.0.104 会在缺签名时自己塞官方哑签名 `skip_thought_signature_validator`
77
+ * 兜住并打 warning,Google 说那样会降质;Interactions 没有这层兜底,直接
78
+ * 400。故 `replayedMetadataKeys = ['google']`,签名随 tool-call part 落库、
79
+ * 重放时原样发回。Interactions 的签名按协议属于 thought 步骤,流式时常常
80
+ * 只挂在那上面,由 `interactionsSignatureMiddleware` 补到 tool-call 上。**只看当前这一轮**:更早轮次里没有签名的调用(会话中途
81
+ * 从别家切过来)两种协议都放行。
82
+ * - **思考块不必回传**:只回带签名的函数调用,两种协议都 200(generateContent
83
+ * 官方允许;Interactions 文档写「必须原样回传 thought 块」但服务端不强制)。
84
+ * 所以 reasoning part 照全仓默认丢弃,不为这家开例外。
85
+ * - 推理档位见 `thinkingLevelOf`;思考摘要要显式要(generateContent
86
+ * `includeThoughts`、Interactions `thinkingSummaries: 'auto'`),否则对话页
87
+ * 没有思考过程可显示。
88
+ * - `gemini-2.5-*` 已不对新用户开放(404「no longer available to new users」)。
89
+ * - 目录 `GET {base}/models` 用 `x-goog-api-key`、回 `models[]`(`name` 带
90
+ * `models/` 前缀),不是 OpenAI 形状,故覆盖 `fetchCatalog`。
91
+ * - 国内直连不通,部署在国内要给这家选网络代理。
92
+ */
93
+ export class GoogleAdapter extends LlmVendorAdapter {
94
+ kind = 'google';
95
+ supportedProtocols = [
96
+ 'google-generate-content',
97
+ 'google-interactions',
98
+ ];
99
+ replayedMetadataKeys = [OPTIONS_KEY];
100
+ /**
101
+ * 2.5 系对新用户 404(探针原话「no longer available to new users」);3 系起总在
102
+ * 思考,不标「推理」就拿不到思考摘要、档位也不下发。
103
+ */
104
+ adviseModel(model) {
105
+ const out = [];
106
+ const id = model.modelId;
107
+ if (id.startsWith('gemini-2.5')) {
108
+ out.push({
109
+ severity: 'warn',
110
+ message: `「${id}」已不对新用户开放(调用报 404),请改用 gemini-3 及以上。`,
111
+ });
112
+ }
113
+ const major = /^gemini-(\d+)/.exec(id)?.[1];
114
+ if (major !== undefined &&
115
+ Number(major) >= 3 &&
116
+ !model.capabilities.includes('reasoning')) {
117
+ out.push({
118
+ severity: 'info',
119
+ message: `Gemini 3 起始终思考:未标记「推理」时无法获取思考摘要,推理档位也不会下发(按模型默认档)。`,
120
+ });
121
+ }
122
+ return out;
123
+ }
124
+ createModel(input) {
125
+ const { protocol, baseUrl, apiKey, modelId, fetch } = input;
126
+ const google = createGoogleGenerativeAI({
127
+ baseURL: baseUrl,
128
+ apiKey,
129
+ fetch,
130
+ });
131
+ switch (protocol) {
132
+ case 'google-generate-content':
133
+ return google.chat(modelId);
134
+ case 'google-interactions':
135
+ return wrapLanguageModel({
136
+ model: google.interactions(modelId),
137
+ middleware: [
138
+ interactionsDefaultsMiddleware,
139
+ interactionsSignatureMiddleware,
140
+ ],
141
+ });
142
+ default:
143
+ throw unsupportedProtocol(this, protocol);
144
+ }
145
+ }
146
+ reasoning(modelId, effort, protocol) {
147
+ const thinkingLevel = thinkingLevelOf(modelId, effort);
148
+ switch (protocol) {
149
+ case 'google-generate-content':
150
+ return {
151
+ [OPTIONS_KEY]: {
152
+ thinkingConfig: { thinkingLevel, includeThoughts: true },
153
+ },
154
+ };
155
+ case 'google-interactions':
156
+ return {
157
+ [OPTIONS_KEY]: { thinkingLevel, thinkingSummaries: 'auto' },
158
+ };
159
+ default:
160
+ throw unsupportedProtocol(this, protocol);
161
+ }
162
+ }
163
+ }
164
+ //# sourceMappingURL=google.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.adapter.js","sourceRoot":"","sources":["../../src/vendors/google.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { LlmVendorAdapter } from './vendor-adapter.js';
2
+ export { type AdviceModelView, type CreateModelInput, type EndpointModelView, type EndpointView, LlmVendorAdapter, type ModelAdvice, type ProviderOptions, type ReasoningEffort, type SamplingParams, type SamplingSupport, type VendorFetch, type VendorFileStore, } from './vendor-adapter.js';
3
+ /**
4
+ * 全部厂商适配器。零依赖的纯类,按 `kind` 查。
5
+ */
6
+ export declare const VENDOR_ADAPTERS: readonly LlmVendorAdapter[];
7
+ /** 未知 kind → undefined;调用方自行决定是抛还是降级。 */
8
+ export declare function findVendorAdapter(kind: string): LlmVendorAdapter | undefined;
9
+ /** 未知 kind 直接抛——造模型句柄时没有合理的降级。 */
10
+ export declare function getVendorAdapter(kind: string): LlmVendorAdapter;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vendors/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,gBAAgB,EAWtD,CAAC;AAIF,yCAAyC;AACzC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE5E;AAED,kCAAkC;AAClC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAI/D"}
@@ -0,0 +1,39 @@
1
+ import { AlibabaAdapter } from './alibaba.adapter.js';
2
+ import { DeepSeekAdapter } from './deepseek.adapter.js';
3
+ import { DotsAdapter } from './dots.adapter.js';
4
+ import { GenericAdapter } from './generic.adapter.js';
5
+ import { GoogleAdapter } from './google.adapter.js';
6
+ import { MiniMaxAdapter } from './minimax.adapter.js';
7
+ import { MoonshotAiAdapter } from './moonshotai.adapter.js';
8
+ import { OpenAiAdapter } from './openai.adapter.js';
9
+ import { VolcengineAdapter } from './volcengine.adapter.js';
10
+ import { ZhipuAdapter } from './zhipu.adapter.js';
11
+ export { LlmVendorAdapter, } from './vendor-adapter.js';
12
+ /**
13
+ * 全部厂商适配器。零依赖的纯类,按 `kind` 查。
14
+ */
15
+ export const VENDOR_ADAPTERS = [
16
+ new OpenAiAdapter(),
17
+ new GenericAdapter(),
18
+ new DeepSeekAdapter(),
19
+ new MoonshotAiAdapter(),
20
+ new AlibabaAdapter(),
21
+ new ZhipuAdapter(),
22
+ new VolcengineAdapter(),
23
+ new MiniMaxAdapter(),
24
+ new DotsAdapter(),
25
+ new GoogleAdapter(),
26
+ ];
27
+ const BY_KIND = new Map(VENDOR_ADAPTERS.map(a => [a.kind, a]));
28
+ /** 未知 kind → undefined;调用方自行决定是抛还是降级。 */
29
+ export function findVendorAdapter(kind) {
30
+ return BY_KIND.get(kind);
31
+ }
32
+ /** 未知 kind 直接抛——造模型句柄时没有合理的降级。 */
33
+ export function getVendorAdapter(kind) {
34
+ const adapter = findVendorAdapter(kind);
35
+ if (!adapter)
36
+ throw new Error(`unsupported LLM vendor kind: ${kind}`);
37
+ return adapter;
38
+ }
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vendors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAKL,gBAAgB,GAQjB,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAgC;IAC1D,IAAI,aAAa,EAAE;IACnB,IAAI,cAAc,EAAE;IACpB,IAAI,eAAe,EAAE;IACrB,IAAI,iBAAiB,EAAE;IACvB,IAAI,cAAc,EAAE;IACpB,IAAI,YAAY,EAAE;IAClB,IAAI,iBAAiB,EAAE;IACvB,IAAI,cAAc,EAAE;IACpB,IAAI,WAAW,EAAE;IACjB,IAAI,aAAa,EAAE;CACpB,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/D,yCAAyC;AACzC,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,IAAgC,CAAC,CAAC;AACvD,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { type LanguageModel } from 'ai';
2
+ import type { LlmProtocol } from '../types.js';
3
+ import { type CreateModelInput, LlmVendorAdapter, type ProviderOptions, type ReasoningEffort } from './vendor-adapter.js';
4
+ /**
5
+ * responses 协议下每次调用都必须带上的两项 providerOptions(挂法与方舟同一个
6
+ * 中间件,理由见 `responsesDefaultsMiddleware`):
7
+ *
8
+ * - **`store: false`**:文档的 `InputItem.type` 只有 `message / function_call /
9
+ * function_call_output / reasoning` 四种,**没有 `item_reference`**;SDK 在
10
+ * `store` 为 true(默认)时把上一轮带 itemId 的 assistant 正文发成
11
+ * `{type:'item_reference', id}`,多步工具回环第二步就会撞上它。
12
+ * - **`reasoningSummary: null`**:文档的 `reasoning` 对象只有 `effort` 一个键;
13
+ * SDK 对推理模型默认附带 `reasoning.summary:'detailed'`。它认不认未知键
14
+ * 没有探过,方舟对同一个键是 400——传 null 让 SDK 整个不发,反正推理正文
15
+ * 由垫片从 `content[{reasoning_text}]` 里取,`summary` 我们不需要。
16
+ */
17
+ export declare const MINIMAX_RESPONSES_DEFAULTS: {
18
+ readonly store: false;
19
+ readonly reasoningSummary: null;
20
+ };
21
+ /**
22
+ * chat-completions 每次请求都必须带 `reasoning_split: true`。
23
+ *
24
+ * MiniMax 的 OpenAI 兼容面默认把思考**塞进 `content`**、用 `<think>…</think>`
25
+ * 包着(文档 guides/text-m3-function-call「原生格式」一节):SDK 会把它当正文吐成
26
+ * text part,对话页里整段思考混在回答里、存下来的产出也会带着标签,而且投影层回传历史
27
+ * 时那段也跟着当正文发回去。开了这个开关,思考走 `reasoning_content`(SDK 原生
28
+ * 读的字段)+ `reasoning_details`(结构化,SDK 忽略)。**它不开关思考本身**,
29
+ * 只决定输出格式,所以与档位无关、与模型行有没有标 `reasoning` 也无关——
30
+ * 放在工厂的 `transformRequestBody` 里,而不是 `reasoning()`。
31
+ */
32
+ export declare function withReasoningSplit(body: Record<string, unknown>): Record<string, unknown>;
33
+ /**
34
+ * MiniMax(M 系:MiniMax-M3 / M2.7 / M2.5 / M2.1 / M2 及各 highspeed 版)。
35
+ *
36
+ * **AI SDK 没有它的官方 provider**(社区包跟不上大版本,不接)。承载包与智谱、方舟
37
+ * 同一套:chat-completions 走 `@ai-sdk/openai-compatible`(私有的 `thinking` /
38
+ * `reasoning_split` 靠它把未知键展开进请求体,`reasoning_content` 是它原生读的
39
+ * 字段),responses 走 `@ai-sdk/openai` + 「推理正文走 `reasoning_text`」的共享垫片。
40
+ * 文档还推荐 Anthropic 兼容面(`/anthropic`,支持 thinking 块与 interleaved
41
+ * thinking),本仓尚无 `anthropic-messages` 分支,先不接。
42
+ *
43
+ * 全部判据来自 2026-09-10 抓的官方文档(`platform.minimaxi.com/docs/llms.txt`
44
+ * 下 api-reference/text-chat-openai、responses-create、models/openai/list-models、
45
+ * guides/text-m3-function-call),**没有真 key 探针**——文档没写明的地方在各处注释
46
+ * 里标了「未探」,接真 key 后先跑一遍 `minimax.sdk-contract.spec.ts` 里列的探针项:
47
+ *
48
+ * - **chat 的推理开关只有开/关,没有档位**:`thinking:{type:'disabled'|'adaptive'}`,
49
+ * 省略 = adaptive(默认开着推理,「不发 ≠ 关闭」在这家同样成立)。M3 才关得掉,
50
+ * M2.x「thinking 无法关闭」——但 `disabled` 对 M2.x 是**被接受后忽略**(文档
51
+ * 原话「仍会保持开启」),不是 400,所以不按模型名分支。chat 面没有
52
+ * `reasoning_effort` 参数,我们的五个非 off 档位一律 adaptive(如实反映:
53
+ * 这家不提供推理深度控制)。
54
+ * - **responses 的默认值与 chat 相反**:`reasoning.effort` 省略 = `none`(关),
55
+ * `minimal/low/medium/high` 都收、但「不会调节推理深度」;M2.x 同样关不掉。
56
+ * `off` → `none` 是真正的关闭指令;`max` → `high`(它的枚举没有 max)。
57
+ * - 响应侧:chat 开了 `reasoning_split` 后是 `message.reasoning_content` /
58
+ * `delta.reasoning_content`(文档只给了非流式的字段说明,流式 delta 里叫什么
59
+ * **未探**,按各家通例假定同名);responses 的 reasoning item 是
60
+ * `content:[{type:'reasoning_text'}]` + `summary`(文档 OutputItem),与
61
+ * DeepSeek / 智谱同形,流式事件名文档没给(未探),垫片对原生 summary 事件
62
+ * 本就不动,两种形状都落得了位。
63
+ * - **交错思维链的回传**:文档要求把 `reasoning_details` 完整回传给下一轮,否则
64
+ * 思维链「被打断」;SDK 回传的是 `reasoning_content`(3.0.35 dist:284)。这家
65
+ * 认不认 `reasoning_content` 作为输入**未探**——认则零改动,不认也只是降质
66
+ * (文档说的是「发挥最佳性能」),不是失败。探明不认再在 `transformRequestBody`
67
+ * 里把它改写成 `reasoning_details:[{type:'reasoning.text', text}]`。
68
+ * - `temperature` 范围 chat `[0, 2]`、responses `(0, 1]`;`top_p` `[0, 1]`。
69
+ * `sampling` 只有「发不发」的粒度,responses 那条上限靠运营录参数时自觉。
70
+ * - `max_tokens` 已弃用、改 `max_completion_tokens`;本仓刻意不传输出上限,
71
+ * SDK 也就不会发旧参数。
72
+ * - `GET /v1/models` 是标准 OpenAI 形状(`{object:'list', data:[{id}]}`),
73
+ * 默认目录逻辑直接可用;文档没有余额接口(账户 FAQ 只讲充值与预警),
74
+ * 中心不查余额。
75
+ * - 错误在 200 里也可能带 `base_resp.status_code`(1004 鉴权 / 1008 余额不足 /
76
+ * 2013 参数错误…)——**未探**它对 OpenAI 兼容面是否改用标准 HTTP 状态码;
77
+ * 若真是 200 + base_resp,SDK 会当成一条空回复静默过去,那时要加响应垫片。
78
+ */
79
+ export declare class MiniMaxAdapter extends LlmVendorAdapter {
80
+ readonly kind: "minimax";
81
+ readonly supportedProtocols: readonly LlmProtocol[];
82
+ createModel(input: CreateModelInput): LanguageModel;
83
+ /**
84
+ * **chat-completions**:`off` 发显式的 `thinking:{type:'disabled'}`(它默认
85
+ * adaptive,「不发 ≠ 关闭」);非 off 一律 `thinking:{type:'adaptive'}`——这家
86
+ * 没有档位参数,五档压成一档是如实反映而不是漏了映射。绝不发 `reasoning_effort`:
87
+ * 它不在文档的参数表里,2013「参数错误」的风险不值得赌。
88
+ *
89
+ * **responses**:只发 `reasoning.effort`,`off`→`none`(文档:关闭推理输出,
90
+ * 也是它的默认值);`minimal/low/medium/high` 原生都收、直通;`max`→`high`。
91
+ * key 随承载包换成 `openai`,带 `COMPATIBLE_RESPONSES_OPTIONS`(不带则 SDK 按
92
+ * 模型名判成非推理模型、`reasoning` 整个不发——这家 responses 默认是关的,
93
+ * 所以后果是「档位调了没反应」而不是「关不掉」,同样静默)。`store:false` /
94
+ * `reasoningSummary:null` 由中间件兜底,这里不重复。
95
+ */
96
+ reasoning(_modelId: string, effort: ReasoningEffort, protocol: LlmProtocol): ProviderOptions;
97
+ }
98
+ //# sourceMappingURL=minimax.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax.adapter.d.ts","sourceRoot":"","sources":["../../src/vendors/minimax.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,IAAI,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/C,OAAO,EACL,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,eAAe,EAErB,MAAM,qBAAqB,CAAC;AAS7B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B;;;CAG7B,CAAC;AAEX;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,qBAAa,cAAe,SAAQ,gBAAgB;IAClD,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAEnC,SAAkB,kBAAkB,EAAE,SAAS,WAAW,EAAE,CAG1D;IAEF,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa;IAyBnD;;;;;;;;;;;;OAYG;IACM,SAAS,CAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,WAAW,GACpB,eAAe;CAmBnB"}
@@ -0,0 +1,163 @@
1
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
2
+ import { wrapLanguageModel } from 'ai';
3
+ import { COMPATIBLE_RESPONSES_OPTIONS, createResponsesModel, responsesDefaultsMiddleware, } from './openai-responses.js';
4
+ import { withReasoningTextResponsesShim } from './responses-reasoning-text-shim.js';
5
+ import { LlmVendorAdapter, unsupportedProtocol, } from './vendor-adapter.js';
6
+ /**
7
+ * 工厂 `name`。决定 provider id(`minimax.chat`)与 providerOptions 的命名空间
8
+ * key(单词无连字符,`name` 与 `toCamelCase(name)` 相同),恰好等于 `kind`,
9
+ * 基类默认的 `optionsKey` 直接可用。
10
+ */
11
+ const FACTORY_NAME = 'minimax';
12
+ /**
13
+ * responses 协议下每次调用都必须带上的两项 providerOptions(挂法与方舟同一个
14
+ * 中间件,理由见 `responsesDefaultsMiddleware`):
15
+ *
16
+ * - **`store: false`**:文档的 `InputItem.type` 只有 `message / function_call /
17
+ * function_call_output / reasoning` 四种,**没有 `item_reference`**;SDK 在
18
+ * `store` 为 true(默认)时把上一轮带 itemId 的 assistant 正文发成
19
+ * `{type:'item_reference', id}`,多步工具回环第二步就会撞上它。
20
+ * - **`reasoningSummary: null`**:文档的 `reasoning` 对象只有 `effort` 一个键;
21
+ * SDK 对推理模型默认附带 `reasoning.summary:'detailed'`。它认不认未知键
22
+ * 没有探过,方舟对同一个键是 400——传 null 让 SDK 整个不发,反正推理正文
23
+ * 由垫片从 `content[{reasoning_text}]` 里取,`summary` 我们不需要。
24
+ */
25
+ export const MINIMAX_RESPONSES_DEFAULTS = {
26
+ store: false,
27
+ reasoningSummary: null,
28
+ };
29
+ /**
30
+ * chat-completions 每次请求都必须带 `reasoning_split: true`。
31
+ *
32
+ * MiniMax 的 OpenAI 兼容面默认把思考**塞进 `content`**、用 `<think>…</think>`
33
+ * 包着(文档 guides/text-m3-function-call「原生格式」一节):SDK 会把它当正文吐成
34
+ * text part,对话页里整段思考混在回答里、存下来的产出也会带着标签,而且投影层回传历史
35
+ * 时那段也跟着当正文发回去。开了这个开关,思考走 `reasoning_content`(SDK 原生
36
+ * 读的字段)+ `reasoning_details`(结构化,SDK 忽略)。**它不开关思考本身**,
37
+ * 只决定输出格式,所以与档位无关、与模型行有没有标 `reasoning` 也无关——
38
+ * 放在工厂的 `transformRequestBody` 里,而不是 `reasoning()`。
39
+ */
40
+ export function withReasoningSplit(body) {
41
+ return { ...body, reasoning_split: true };
42
+ }
43
+ /**
44
+ * MiniMax(M 系:MiniMax-M3 / M2.7 / M2.5 / M2.1 / M2 及各 highspeed 版)。
45
+ *
46
+ * **AI SDK 没有它的官方 provider**(社区包跟不上大版本,不接)。承载包与智谱、方舟
47
+ * 同一套:chat-completions 走 `@ai-sdk/openai-compatible`(私有的 `thinking` /
48
+ * `reasoning_split` 靠它把未知键展开进请求体,`reasoning_content` 是它原生读的
49
+ * 字段),responses 走 `@ai-sdk/openai` + 「推理正文走 `reasoning_text`」的共享垫片。
50
+ * 文档还推荐 Anthropic 兼容面(`/anthropic`,支持 thinking 块与 interleaved
51
+ * thinking),本仓尚无 `anthropic-messages` 分支,先不接。
52
+ *
53
+ * 全部判据来自 2026-09-10 抓的官方文档(`platform.minimaxi.com/docs/llms.txt`
54
+ * 下 api-reference/text-chat-openai、responses-create、models/openai/list-models、
55
+ * guides/text-m3-function-call),**没有真 key 探针**——文档没写明的地方在各处注释
56
+ * 里标了「未探」,接真 key 后先跑一遍 `minimax.sdk-contract.spec.ts` 里列的探针项:
57
+ *
58
+ * - **chat 的推理开关只有开/关,没有档位**:`thinking:{type:'disabled'|'adaptive'}`,
59
+ * 省略 = adaptive(默认开着推理,「不发 ≠ 关闭」在这家同样成立)。M3 才关得掉,
60
+ * M2.x「thinking 无法关闭」——但 `disabled` 对 M2.x 是**被接受后忽略**(文档
61
+ * 原话「仍会保持开启」),不是 400,所以不按模型名分支。chat 面没有
62
+ * `reasoning_effort` 参数,我们的五个非 off 档位一律 adaptive(如实反映:
63
+ * 这家不提供推理深度控制)。
64
+ * - **responses 的默认值与 chat 相反**:`reasoning.effort` 省略 = `none`(关),
65
+ * `minimal/low/medium/high` 都收、但「不会调节推理深度」;M2.x 同样关不掉。
66
+ * `off` → `none` 是真正的关闭指令;`max` → `high`(它的枚举没有 max)。
67
+ * - 响应侧:chat 开了 `reasoning_split` 后是 `message.reasoning_content` /
68
+ * `delta.reasoning_content`(文档只给了非流式的字段说明,流式 delta 里叫什么
69
+ * **未探**,按各家通例假定同名);responses 的 reasoning item 是
70
+ * `content:[{type:'reasoning_text'}]` + `summary`(文档 OutputItem),与
71
+ * DeepSeek / 智谱同形,流式事件名文档没给(未探),垫片对原生 summary 事件
72
+ * 本就不动,两种形状都落得了位。
73
+ * - **交错思维链的回传**:文档要求把 `reasoning_details` 完整回传给下一轮,否则
74
+ * 思维链「被打断」;SDK 回传的是 `reasoning_content`(3.0.35 dist:284)。这家
75
+ * 认不认 `reasoning_content` 作为输入**未探**——认则零改动,不认也只是降质
76
+ * (文档说的是「发挥最佳性能」),不是失败。探明不认再在 `transformRequestBody`
77
+ * 里把它改写成 `reasoning_details:[{type:'reasoning.text', text}]`。
78
+ * - `temperature` 范围 chat `[0, 2]`、responses `(0, 1]`;`top_p` `[0, 1]`。
79
+ * `sampling` 只有「发不发」的粒度,responses 那条上限靠运营录参数时自觉。
80
+ * - `max_tokens` 已弃用、改 `max_completion_tokens`;本仓刻意不传输出上限,
81
+ * SDK 也就不会发旧参数。
82
+ * - `GET /v1/models` 是标准 OpenAI 形状(`{object:'list', data:[{id}]}`),
83
+ * 默认目录逻辑直接可用;文档没有余额接口(账户 FAQ 只讲充值与预警),
84
+ * 中心不查余额。
85
+ * - 错误在 200 里也可能带 `base_resp.status_code`(1004 鉴权 / 1008 余额不足 /
86
+ * 2013 参数错误…)——**未探**它对 OpenAI 兼容面是否改用标准 HTTP 状态码;
87
+ * 若真是 200 + base_resp,SDK 会当成一条空回复静默过去,那时要加响应垫片。
88
+ */
89
+ export class MiniMaxAdapter extends LlmVendorAdapter {
90
+ kind = 'minimax';
91
+ supportedProtocols = [
92
+ 'openai-chat-completions',
93
+ 'openai-responses',
94
+ ];
95
+ createModel(input) {
96
+ switch (input.protocol) {
97
+ case 'openai-chat-completions': {
98
+ const { baseUrl, apiKey, modelId, fetch } = input;
99
+ return createOpenAICompatible({
100
+ name: FACTORY_NAME,
101
+ baseURL: baseUrl,
102
+ apiKey,
103
+ fetch,
104
+ transformRequestBody: withReasoningSplit,
105
+ })(modelId);
106
+ }
107
+ case 'openai-responses':
108
+ return wrapLanguageModel({
109
+ model: createResponsesModel(input, withReasoningTextResponsesShim(input.fetch)),
110
+ middleware: responsesDefaultsMiddleware(MINIMAX_RESPONSES_DEFAULTS),
111
+ });
112
+ default:
113
+ throw unsupportedProtocol(this, input.protocol);
114
+ }
115
+ }
116
+ /**
117
+ * **chat-completions**:`off` 发显式的 `thinking:{type:'disabled'}`(它默认
118
+ * adaptive,「不发 ≠ 关闭」);非 off 一律 `thinking:{type:'adaptive'}`——这家
119
+ * 没有档位参数,五档压成一档是如实反映而不是漏了映射。绝不发 `reasoning_effort`:
120
+ * 它不在文档的参数表里,2013「参数错误」的风险不值得赌。
121
+ *
122
+ * **responses**:只发 `reasoning.effort`,`off`→`none`(文档:关闭推理输出,
123
+ * 也是它的默认值);`minimal/low/medium/high` 原生都收、直通;`max`→`high`。
124
+ * key 随承载包换成 `openai`,带 `COMPATIBLE_RESPONSES_OPTIONS`(不带则 SDK 按
125
+ * 模型名判成非推理模型、`reasoning` 整个不发——这家 responses 默认是关的,
126
+ * 所以后果是「档位调了没反应」而不是「关不掉」,同样静默)。`store:false` /
127
+ * `reasoningSummary:null` 由中间件兜底,这里不重复。
128
+ */
129
+ reasoning(_modelId, effort, protocol) {
130
+ switch (protocol) {
131
+ case 'openai-chat-completions':
132
+ return {
133
+ [this.optionsKey]: {
134
+ thinking: { type: effort === 'off' ? 'disabled' : 'adaptive' },
135
+ },
136
+ };
137
+ case 'openai-responses':
138
+ return {
139
+ openai: {
140
+ reasoningEffort: toMiniMaxEffort(effort),
141
+ ...COMPATIBLE_RESPONSES_OPTIONS,
142
+ },
143
+ };
144
+ default:
145
+ throw unsupportedProtocol(this, protocol);
146
+ }
147
+ }
148
+ }
149
+ /** 我们的六档 → 它 responses 面文档化的 `none/minimal/low/medium/high`。 */
150
+ function toMiniMaxEffort(effort) {
151
+ switch (effort) {
152
+ case 'off':
153
+ return 'none';
154
+ case 'minimal':
155
+ case 'low':
156
+ case 'medium':
157
+ case 'high':
158
+ return effort;
159
+ case 'max':
160
+ return 'high';
161
+ }
162
+ }
163
+ //# sourceMappingURL=minimax.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax.adapter.js","sourceRoot":"","sources":["../../src/vendors/minimax.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import type { LlmProtocol } from '../types.js';
3
+ import { type CreateModelInput, LlmVendorAdapter, type ProviderOptions, type ReasoningEffort, type SamplingSupport } from './vendor-adapter.js';
4
+ /**
5
+ * Kimi 的推理开关是**模型级**的三种互斥形态,判据只住在这里
6
+ * (`referenes/kimi-request.md` 的分模型对照表):
7
+ *
8
+ * - `effort`:K3 专属。不支持 `thinking`,传入报错;只认顶层 `reasoning_effort`。
9
+ * - `forced`:k2.7-code 系列。思考强制开启,传 `thinking:{type:'disabled'}` 报错。
10
+ * - `toggle`:k2.5 / k2.6。`thinking` 的 `enabled`/`disabled` 都合法。
11
+ *
12
+ * 模型名换了就改这一个函数。`moonshot-v1-*` 那批老模型本就没有推理能力,
13
+ * 走不到这里(resolver 只对标了 `reasoning` 能力的模型问推理选项)。
14
+ */
15
+ type ThinkingStyle = 'effort' | 'forced' | 'toggle';
16
+ export declare function moonshotThinkingStyle(modelId: string): ThinkingStyle;
17
+ export declare class MoonshotAiAdapter extends LlmVendorAdapter {
18
+ readonly kind: "moonshotai";
19
+ /**
20
+ * **Kimi 全系禁止 temperature/top_p,传参直接返回参数非法**
21
+ * (`referenes/kimi-request.md` 避坑提示第 1 条;实际值固定 1.0,
22
+ * k2.5/k2.6 非思考模式为 0.6)。AI SDK 不会替我们挡——实测
23
+ * `generateText({temperature:0.7})` 会原样发出 `"temperature":0.7`,
24
+ * 所以这道声明就是唯一的防线。
25
+ */
26
+ readonly sampling: SamplingSupport;
27
+ createModel(input: CreateModelInput): LanguageModel;
28
+ reasoning(modelId: string, effort: ReasoningEffort, _protocol: LlmProtocol): ProviderOptions | undefined;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=moonshotai.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moonshotai.adapter.d.ts","sourceRoot":"","sources":["../../src/vendors/moonshotai.adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAEL,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;GAUG;AACH,KAAK,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAKpE;AAED,qBAAa,iBAAkB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IAEtC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAuC;IAEzE,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa;IAM1C,SAAS,CAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,WAAW,GACrB,eAAe,GAAG,SAAS;CAkB/B"}
@@ -0,0 +1,57 @@
1
+ import { createMoonshotAI } from '@ai-sdk/moonshotai';
2
+ import { assertChatCompletions, LlmVendorAdapter, } from './vendor-adapter.js';
3
+ export function moonshotThinkingStyle(modelId) {
4
+ const id = modelId.toLowerCase();
5
+ if (id.startsWith('kimi-k3'))
6
+ return 'effort';
7
+ if (id.includes('k2.7-code'))
8
+ return 'forced';
9
+ return 'toggle';
10
+ }
11
+ export class MoonshotAiAdapter extends LlmVendorAdapter {
12
+ kind = 'moonshotai';
13
+ /**
14
+ * **Kimi 全系禁止 temperature/top_p,传参直接返回参数非法**
15
+ * (`referenes/kimi-request.md` 避坑提示第 1 条;实际值固定 1.0,
16
+ * k2.5/k2.6 非思考模式为 0.6)。AI SDK 不会替我们挡——实测
17
+ * `generateText({temperature:0.7})` 会原样发出 `"temperature":0.7`,
18
+ * 所以这道声明就是唯一的防线。
19
+ */
20
+ sampling = { temperature: false, topP: false };
21
+ createModel(input) {
22
+ assertChatCompletions(this, input.protocol);
23
+ const { baseUrl, apiKey, modelId, fetch } = input;
24
+ return createMoonshotAI({ baseURL: baseUrl, apiKey, fetch })(modelId);
25
+ }
26
+ reasoning(modelId, effort, _protocol) {
27
+ switch (moonshotThinkingStyle(modelId)) {
28
+ case 'effort':
29
+ // K3 **没有关闭开关**(`reasoning_effort` 只有 low/high/max,默认 max),
30
+ // 故 off 只能不发——这是如实反映厂商限制,不是漏了关闭指令。
31
+ if (effort === 'off')
32
+ return undefined;
33
+ return { moonshotai: { reasoningEffort: toK3Effort(effort) } };
34
+ case 'forced':
35
+ // 思考关不掉,而"开"就是默认值——发什么都是多余,发 disabled 还会报错。
36
+ return undefined;
37
+ case 'toggle':
38
+ return {
39
+ moonshotai: {
40
+ thinking: { type: effort === 'off' ? 'disabled' : 'enabled' },
41
+ },
42
+ };
43
+ }
44
+ }
45
+ }
46
+ /**
47
+ * 我们的档位 → K3 的原生三档 `low/high/max`(默认 max)。`max` 直通——
48
+ * 用户选了最高档就该拿到最高档,别替他降一级。
49
+ */
50
+ function toK3Effort(effort) {
51
+ if (effort === 'minimal' || effort === 'low')
52
+ return 'low';
53
+ if (effort === 'max')
54
+ return 'max';
55
+ return 'high';
56
+ }
57
+ //# sourceMappingURL=moonshotai.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moonshotai.adapter.js","sourceRoot":"","sources":["../../src/vendors/moonshotai.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,EACL,qBAAqB,EAErB,gBAAgB,GAIjB,MAAM,qBAAqB,CAAC;AAe7B,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,iBAAkB,SAAQ,gBAAgB;IAC5C,IAAI,GAAG,YAAqB,CAAC;IAEtC;;;;;;OAMG;IACM,QAAQ,GAAoB,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAEzE,WAAW,CAAC,KAAuB;QACjC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QAClD,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAEQ,SAAS,CAChB,OAAe,EACf,MAAuB,EACvB,SAAsB;QAEtB,QAAQ,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,KAAK,QAAQ;gBACX,4DAA4D;gBAC5D,mCAAmC;gBACnC,IAAI,MAAM,KAAK,KAAK;oBAAE,OAAO,SAAS,CAAC;gBACvC,OAAO,EAAE,UAAU,EAAE,EAAE,eAAe,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACjE,KAAK,QAAQ;gBACX,4CAA4C;gBAC5C,OAAO,SAAS,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO;oBACL,UAAU,EAAE;wBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE;qBAC9D;iBACF,CAAC;QACN,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,MAAuB;IACzC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC3D,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC"}