@archships/dim-agent-sdk 0.0.3 → 0.0.4
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/README.md +15 -2
- package/dist/dim-agent-sdk/src/agent-core/agent-types.d.ts +1 -1
- package/dist/dim-agent-sdk/src/agent-core/{Agent.d.ts → agent.d.ts} +2 -2
- package/dist/dim-agent-sdk/src/agent-core/index.d.ts +10 -10
- package/dist/dim-agent-sdk/src/agent-core/{LoopRunner.d.ts → loop-runner.d.ts} +5 -5
- package/dist/dim-agent-sdk/src/agent-core/notifications.d.ts +1 -1
- package/dist/dim-agent-sdk/src/agent-core/session-state.d.ts +1 -1
- package/dist/dim-agent-sdk/src/agent-core/{Session.d.ts → session.d.ts} +2 -2
- package/dist/dim-agent-sdk/src/agent-core/{ToolExecutor.d.ts → tool-executor.d.ts} +2 -2
- package/dist/dim-agent-sdk/src/context/{AutoContextManager.d.ts → auto-context-manager.d.ts} +1 -1
- package/dist/dim-agent-sdk/src/context/index.d.ts +2 -2
- package/dist/dim-agent-sdk/src/index.d.ts +6 -5
- package/dist/dim-agent-sdk/src/persistence/index.d.ts +5 -5
- package/dist/dim-agent-sdk/src/plugin-host/index.d.ts +2 -2
- package/dist/dim-agent-sdk/src/plugin-host/{PluginHost.d.ts → plugin-host.d.ts} +4 -4
- package/dist/dim-agent-sdk/src/providers/aihubmix/adapter.d.ts +17 -0
- package/dist/dim-agent-sdk/src/providers/aihubmix/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/aihubmix/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/aihubmix-responses/adapter.d.ts +17 -0
- package/dist/dim-agent-sdk/src/providers/aihubmix-responses/driver.d.ts +12 -0
- package/dist/dim-agent-sdk/src/providers/aihubmix-responses/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/aihubmix-responses/state.d.ts +7 -0
- package/dist/dim-agent-sdk/src/providers/anthropic/adapter.d.ts +15 -4
- package/dist/dim-agent-sdk/src/providers/anthropic/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/anthropic/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/anthropic/state.d.ts +6 -0
- package/dist/dim-agent-sdk/src/providers/core/create-provider-factory.d.ts +39 -0
- package/dist/dim-agent-sdk/src/providers/core/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/deepseek/adapter.d.ts +11 -0
- package/dist/dim-agent-sdk/src/providers/deepseek/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/deepseek/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/gemini/adapter.d.ts +3 -4
- package/dist/dim-agent-sdk/src/providers/gemini/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/gemini/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/gemini/state.d.ts +5 -0
- package/dist/dim-agent-sdk/src/providers/index.d.ts +22 -8
- package/dist/dim-agent-sdk/src/providers/moonshotai/adapter.d.ts +11 -0
- package/dist/dim-agent-sdk/src/providers/moonshotai/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/moonshotai/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/openai/adapter.d.ts +3 -4
- package/dist/dim-agent-sdk/src/providers/openai/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/openai/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/openai-responses/adapter.d.ts +3 -4
- package/dist/dim-agent-sdk/src/providers/openai-responses/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/openai-responses/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/openai-responses/state.d.ts +7 -0
- package/dist/dim-agent-sdk/src/providers/shared/ai-sdk-driver.d.ts +7 -0
- package/dist/dim-agent-sdk/src/providers/shared/auth-warning.d.ts +6 -0
- package/dist/dim-agent-sdk/src/providers/shared/fetch.d.ts +8 -0
- package/dist/dim-agent-sdk/src/providers/shared/http-error.d.ts +10 -0
- package/dist/dim-agent-sdk/src/providers/shared/prompt.d.ts +14 -0
- package/dist/dim-agent-sdk/src/providers/shared/reasoning.d.ts +30 -7
- package/dist/dim-agent-sdk/src/providers/shared/responses-state.d.ts +11 -0
- package/dist/dim-agent-sdk/src/providers/shared/usage.d.ts +4 -2
- package/dist/dim-agent-sdk/src/providers/xai/adapter.d.ts +11 -0
- package/dist/dim-agent-sdk/src/providers/xai/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/xai/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/xai-responses/adapter.d.ts +11 -0
- package/dist/dim-agent-sdk/src/providers/xai-responses/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/xai-responses/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/providers/xai-responses/state.d.ts +7 -0
- package/dist/dim-agent-sdk/src/providers/zenmux/adapter.d.ts +13 -0
- package/dist/dim-agent-sdk/src/providers/zenmux/driver.d.ts +3 -0
- package/dist/dim-agent-sdk/src/providers/zenmux/index.d.ts +2 -0
- package/dist/dim-agent-sdk/src/services/index.d.ts +6 -6
- package/dist/dim-agent-sdk/src/tools/builtins/{EditTool.d.ts → edit-tool.d.ts} +1 -1
- package/dist/dim-agent-sdk/src/tools/builtins/{ExecTool.d.ts → exec-tool.d.ts} +1 -1
- package/dist/dim-agent-sdk/src/tools/builtins/index.d.ts +4 -4
- package/dist/dim-agent-sdk/src/tools/builtins/{ReadTool.d.ts → read-tool.d.ts} +1 -1
- package/dist/dim-agent-sdk/src/tools/builtins/{WriteTool.d.ts → write-tool.d.ts} +1 -1
- package/dist/dim-agent-sdk/src/tools/index.d.ts +2 -2
- package/dist/{index.js → src/index.js} +4124 -3645
- package/dist/src/providers/aihubmix/index.js +636 -0
- package/dist/src/providers/aihubmix-responses/index.js +759 -0
- package/dist/src/providers/anthropic/index.js +743 -0
- package/dist/src/providers/core/index.js +92 -0
- package/dist/src/providers/deepseek/index.js +639 -0
- package/dist/src/providers/gemini/index.js +756 -0
- package/dist/src/providers/moonshotai/index.js +639 -0
- package/dist/src/providers/openai/index.js +499 -0
- package/dist/src/providers/openai-responses/index.js +727 -0
- package/dist/src/providers/xai/index.js +639 -0
- package/dist/src/providers/xai-responses/index.js +728 -0
- package/dist/src/providers/zenmux/index.js +642 -0
- package/package.json +74 -5
- package/dist/dim-agent-sdk/src/providers/anthropic/mapper.d.ts +0 -28
- package/dist/dim-agent-sdk/src/providers/gemini/mapper.d.ts +0 -30
- package/dist/dim-agent-sdk/src/providers/openai/mapper.d.ts +0 -15
- package/dist/dim-agent-sdk/src/providers/openai-responses/mapper.d.ts +0 -40
- /package/dist/dim-agent-sdk/src/agent-core/{createModel.d.ts → create-model.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/agent-core/{MessageFactory.d.ts → message-factory.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/agent-core/{ModelTurnCollector.d.ts → model-turn-collector.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/agent-core/{TerminationPolicy.d.ts → termination-policy.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/persistence/{FileStateStore.d.ts → file-state-store.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/persistence/{InMemoryStateStore.d.ts → in-memory-state-store.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/persistence/{SnapshotCodec.d.ts → snapshot-codec.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/plugin-host/{HookPipeline.d.ts → hook-pipeline.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/services/{ExecGateway.d.ts → exec-gateway.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/services/{FileSystemGateway.d.ts → file-system-gateway.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/services/{GitGateway.d.ts → git-gateway.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/services/{ModelGateway.d.ts → model-gateway.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/services/{NetworkGateway.d.ts → network-gateway.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/services/{PermissionGateway.d.ts → permission-gateway.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/tools/{BaseTool.d.ts → base-tool.d.ts} +0 -0
- /package/dist/dim-agent-sdk/src/tools/{ToolRegistry.d.ts → tool-registry.d.ts} +0 -0
|
@@ -0,0 +1,759 @@
|
|
|
1
|
+
// src/providers/core/create-provider-factory.ts
|
|
2
|
+
function createProviderFactory(definition) {
|
|
3
|
+
return function createConfiguredAdapter(options) {
|
|
4
|
+
const provider = options.provider ?? definition.defaultProvider;
|
|
5
|
+
const defaultModel = {
|
|
6
|
+
provider,
|
|
7
|
+
modelId: options.defaultModel
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
provider,
|
|
11
|
+
defaultModel,
|
|
12
|
+
async* stream(request) {
|
|
13
|
+
const requestId = request.requestId ?? crypto.randomUUID();
|
|
14
|
+
const model = request.model ?? defaultModel;
|
|
15
|
+
yield { type: "response_start", requestId, model };
|
|
16
|
+
const context = {
|
|
17
|
+
options,
|
|
18
|
+
provider,
|
|
19
|
+
defaultModel,
|
|
20
|
+
request: {
|
|
21
|
+
...request,
|
|
22
|
+
model
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
let result;
|
|
26
|
+
try {
|
|
27
|
+
result = await definition.driver.generate(context);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
const payload = definition.driver.normalizeError ? await definition.driver.normalizeError(error, context) : createFallbackErrorPayload(provider, error);
|
|
30
|
+
yield {
|
|
31
|
+
type: "error",
|
|
32
|
+
requestId,
|
|
33
|
+
error: payload,
|
|
34
|
+
terminal: true
|
|
35
|
+
};
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
for (const segment of result.content) {
|
|
39
|
+
if (segment.type === "text") {
|
|
40
|
+
if (segment.text.length > 0)
|
|
41
|
+
yield { type: "text_delta", requestId, delta: segment.text };
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (segment.type === "thinking") {
|
|
45
|
+
if (segment.text.length > 0)
|
|
46
|
+
yield { type: "thinking_delta", requestId, delta: segment.text };
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
yield {
|
|
50
|
+
type: "tool_call_start",
|
|
51
|
+
requestId,
|
|
52
|
+
callId: segment.callId,
|
|
53
|
+
toolName: segment.toolName
|
|
54
|
+
};
|
|
55
|
+
yield {
|
|
56
|
+
type: "tool_call_args_delta",
|
|
57
|
+
requestId,
|
|
58
|
+
callId: segment.callId,
|
|
59
|
+
delta: segment.argsText
|
|
60
|
+
};
|
|
61
|
+
yield {
|
|
62
|
+
type: "tool_call_end",
|
|
63
|
+
requestId,
|
|
64
|
+
callId: segment.callId
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
yield {
|
|
68
|
+
type: "response_end",
|
|
69
|
+
requestId,
|
|
70
|
+
stopReason: result.stopReason,
|
|
71
|
+
usage: result.usage,
|
|
72
|
+
assistantMetadata: result.assistantMetadata
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function createFallbackErrorPayload(provider, error) {
|
|
79
|
+
if (error instanceof Error) {
|
|
80
|
+
return {
|
|
81
|
+
code: `${provider}_request_error`,
|
|
82
|
+
message: error.message
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
code: `${provider}_request_error`,
|
|
87
|
+
message: String(error)
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/providers/aihubmix-responses/driver.ts
|
|
92
|
+
import { APICallError } from "@ai-sdk/provider";
|
|
93
|
+
import { createAihubmix } from "@aihubmix/ai-sdk-provider";
|
|
94
|
+
|
|
95
|
+
// src/utils/guards.ts
|
|
96
|
+
function isRecord(value) {
|
|
97
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
98
|
+
}
|
|
99
|
+
function isStringArray(value) {
|
|
100
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/providers/shared/usage.ts
|
|
104
|
+
function normalizeLanguageModelUsage(raw) {
|
|
105
|
+
if (!raw)
|
|
106
|
+
return;
|
|
107
|
+
const promptTokens = raw.inputTokens.total ?? 0;
|
|
108
|
+
const completionTokens = raw.outputTokens.total ?? 0;
|
|
109
|
+
const totalTokens = promptTokens + completionTokens;
|
|
110
|
+
if (promptTokens === 0 && completionTokens === 0 && totalTokens === 0)
|
|
111
|
+
return;
|
|
112
|
+
return {
|
|
113
|
+
promptTokens,
|
|
114
|
+
completionTokens,
|
|
115
|
+
totalTokens
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function mapLanguageModelFinishReason(reason) {
|
|
119
|
+
const raw = reason.raw?.toLowerCase();
|
|
120
|
+
if (raw === "cancelled" || raw === "canceled")
|
|
121
|
+
return "cancelled";
|
|
122
|
+
switch (reason.unified) {
|
|
123
|
+
case "tool-calls":
|
|
124
|
+
return "tool_call";
|
|
125
|
+
case "length":
|
|
126
|
+
return "length";
|
|
127
|
+
case "content-filter":
|
|
128
|
+
case "error":
|
|
129
|
+
return "error";
|
|
130
|
+
case "other":
|
|
131
|
+
return raw === "cancelled" || raw === "canceled" ? "cancelled" : "final";
|
|
132
|
+
case "stop":
|
|
133
|
+
default:
|
|
134
|
+
return "final";
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// src/providers/shared/ai-sdk-driver.ts
|
|
139
|
+
async function generateWithAiSdk(input) {
|
|
140
|
+
const result = await input.model.doGenerate(input.callOptions);
|
|
141
|
+
const content = [];
|
|
142
|
+
for (const part of result.content) {
|
|
143
|
+
if (part.type === "text") {
|
|
144
|
+
if (part.text.length > 0)
|
|
145
|
+
content.push({ type: "text", text: part.text });
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (part.type === "reasoning") {
|
|
149
|
+
if (part.text.length > 0)
|
|
150
|
+
content.push({ type: "thinking", text: part.text });
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (part.type === "tool-call") {
|
|
154
|
+
content.push({
|
|
155
|
+
type: "tool_call",
|
|
156
|
+
callId: part.toolCallId,
|
|
157
|
+
toolName: part.toolName,
|
|
158
|
+
argsText: part.input
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
content,
|
|
164
|
+
stopReason: mapLanguageModelFinishReason(result.finishReason),
|
|
165
|
+
usage: normalizeLanguageModelUsage(result.usage),
|
|
166
|
+
assistantMetadata: input.createAssistantMetadata?.(result)
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// src/providers/shared/auth-warning.ts
|
|
171
|
+
var warnedProviders = new Set;
|
|
172
|
+
function warnIfPlaceholderApiKey(input) {
|
|
173
|
+
if (!input.shouldWarn)
|
|
174
|
+
return;
|
|
175
|
+
if (false)
|
|
176
|
+
;
|
|
177
|
+
if (warnedProviders.has(input.provider))
|
|
178
|
+
return;
|
|
179
|
+
warnedProviders.add(input.provider);
|
|
180
|
+
const suffix = input.hint ? ` ${input.hint}` : "";
|
|
181
|
+
console.warn(`[dim-agent-sdk] ${input.provider} is using a placeholder API key because no apiKey or provider-native auth configuration was provided. ` + `If you rely on external authentication, ensure your custom fetch or provider-native headers add real credentials before the request is sent upstream.${suffix}`);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// src/providers/shared/fetch.ts
|
|
185
|
+
function createProviderFetch(input) {
|
|
186
|
+
const fetchImpl = input.fetch ?? globalThis.fetch;
|
|
187
|
+
if (!input.stripWhen || !input.stripHeaders || input.stripHeaders.length === 0)
|
|
188
|
+
return fetchImpl;
|
|
189
|
+
const headersToStrip = new Set(input.stripHeaders.map((header) => header.toLowerCase()));
|
|
190
|
+
const wrappedFetch = Object.assign((resource, init) => {
|
|
191
|
+
if (typeof resource === "string" || resource instanceof URL) {
|
|
192
|
+
const headers = new Headers(init?.headers);
|
|
193
|
+
for (const header of headersToStrip)
|
|
194
|
+
headers.delete(header);
|
|
195
|
+
return fetchImpl(resource, { ...init, headers });
|
|
196
|
+
}
|
|
197
|
+
const request = new Request(resource, init);
|
|
198
|
+
for (const header of headersToStrip)
|
|
199
|
+
request.headers.delete(header);
|
|
200
|
+
return fetchImpl(request);
|
|
201
|
+
}, {
|
|
202
|
+
preconnect: typeof fetchImpl.preconnect === "function" ? fetchImpl.preconnect.bind(fetchImpl) : (_url, _options) => {}
|
|
203
|
+
});
|
|
204
|
+
return wrappedFetch;
|
|
205
|
+
}
|
|
206
|
+
function hasHeader(headers, target) {
|
|
207
|
+
if (!headers)
|
|
208
|
+
return false;
|
|
209
|
+
const normalized = target.toLowerCase();
|
|
210
|
+
return Object.keys(headers).some((key) => key.toLowerCase() === normalized);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// src/providers/shared/http-error.ts
|
|
214
|
+
import { STATUS_CODES } from "node:http";
|
|
215
|
+
var MAX_TEXT_CHARS = 4000;
|
|
216
|
+
var MAX_JSON_DEPTH = 4;
|
|
217
|
+
var MAX_JSON_ARRAY_ITEMS = 20;
|
|
218
|
+
var MAX_JSON_OBJECT_KEYS = 40;
|
|
219
|
+
var TRUNCATED_SUFFIX = "...[truncated]";
|
|
220
|
+
function createApiCallErrorPayload(input) {
|
|
221
|
+
const responseBody = input.error.responseBody ? parseErrorBody(input.error.responseBody) : limitJsonValue(input.error.data);
|
|
222
|
+
return {
|
|
223
|
+
code: input.code,
|
|
224
|
+
message: `${input.provider} request failed${input.error.statusCode ? ` with status ${input.error.statusCode}` : ""}`,
|
|
225
|
+
status: input.error.statusCode,
|
|
226
|
+
retryable: input.error.isRetryable,
|
|
227
|
+
details: {
|
|
228
|
+
provider: input.provider,
|
|
229
|
+
endpoint: input.error.url,
|
|
230
|
+
...input.error.statusCode ? { statusText: STATUS_CODES[input.error.statusCode] ?? undefined } : {},
|
|
231
|
+
...responseBody === undefined ? {} : { responseBody }
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function createRequestErrorPayload(input) {
|
|
236
|
+
if (input.error instanceof Error) {
|
|
237
|
+
return {
|
|
238
|
+
code: input.code,
|
|
239
|
+
message: input.error.message
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
code: input.code,
|
|
244
|
+
message: String(input.error)
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function parseErrorBody(value) {
|
|
248
|
+
const normalized = value.trim();
|
|
249
|
+
if (!normalized)
|
|
250
|
+
return;
|
|
251
|
+
try {
|
|
252
|
+
return limitJsonValue(JSON.parse(normalized));
|
|
253
|
+
} catch {
|
|
254
|
+
return truncateText(normalized);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
function limitJsonValue(value, depth = 0) {
|
|
258
|
+
if (value === undefined)
|
|
259
|
+
return;
|
|
260
|
+
if (value === null || typeof value === "boolean" || typeof value === "number")
|
|
261
|
+
return value;
|
|
262
|
+
if (typeof value === "string")
|
|
263
|
+
return truncateText(value);
|
|
264
|
+
if (Array.isArray(value))
|
|
265
|
+
return value.slice(0, MAX_JSON_ARRAY_ITEMS).map((item) => limitJsonValue(item, depth + 1));
|
|
266
|
+
if (typeof value === "object") {
|
|
267
|
+
if (depth >= MAX_JSON_DEPTH)
|
|
268
|
+
return truncateText(JSON.stringify(value));
|
|
269
|
+
const limited = {};
|
|
270
|
+
for (const [key, child] of Object.entries(value).slice(0, MAX_JSON_OBJECT_KEYS))
|
|
271
|
+
limited[key] = limitJsonValue(child, depth + 1);
|
|
272
|
+
return limited;
|
|
273
|
+
}
|
|
274
|
+
return truncateText(String(value));
|
|
275
|
+
}
|
|
276
|
+
function truncateText(value) {
|
|
277
|
+
if (value.length <= MAX_TEXT_CHARS)
|
|
278
|
+
return value;
|
|
279
|
+
return `${value.slice(0, MAX_TEXT_CHARS)}${TRUNCATED_SUFFIX}`;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// src/contracts/content-normalize.ts
|
|
283
|
+
function isTextContent(value) {
|
|
284
|
+
return isRecord(value) && value.type === "text" && typeof value.text === "string" && (value.annotations === undefined || isRecord(value.annotations)) && (value._meta === undefined || isRecord(value._meta));
|
|
285
|
+
}
|
|
286
|
+
function isImageContent(value) {
|
|
287
|
+
return isRecord(value) && value.type === "image" && typeof value.data === "string" && typeof value.mimeType === "string" && (value.annotations === undefined || isRecord(value.annotations)) && (value._meta === undefined || isRecord(value._meta));
|
|
288
|
+
}
|
|
289
|
+
function isContentBlock(value) {
|
|
290
|
+
return isTextContent(value) || isImageContent(value);
|
|
291
|
+
}
|
|
292
|
+
function normalizeContent(input) {
|
|
293
|
+
if (typeof input === "string") {
|
|
294
|
+
return [{ type: "text", text: input }];
|
|
295
|
+
}
|
|
296
|
+
if (Array.isArray(input)) {
|
|
297
|
+
const blocks = input.filter((item) => item != null);
|
|
298
|
+
if (!blocks.every(isContentBlock))
|
|
299
|
+
throw new TypeError("Content array must contain only text or image blocks");
|
|
300
|
+
return blocks.map((block) => ({ ...block }));
|
|
301
|
+
}
|
|
302
|
+
if (!isContentBlock(input))
|
|
303
|
+
throw new TypeError("Content must be a string, content block, or content block array");
|
|
304
|
+
return [{ ...input }];
|
|
305
|
+
}
|
|
306
|
+
function contentToText(content) {
|
|
307
|
+
return content.filter((block) => block.type === "text").map((block) => block.text).join("");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// src/utils/json.ts
|
|
311
|
+
function isJsonSafeValue(value) {
|
|
312
|
+
if (value === null)
|
|
313
|
+
return true;
|
|
314
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
315
|
+
return true;
|
|
316
|
+
if (Array.isArray(value))
|
|
317
|
+
return value.every(isJsonSafeValue);
|
|
318
|
+
if (isRecord(value))
|
|
319
|
+
return Object.values(value).every(isJsonSafeValue);
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
function assertJsonSafeObject(value, label) {
|
|
323
|
+
if (!isRecord(value) || !isJsonSafeValue(value))
|
|
324
|
+
throw new TypeError(`${label} must be a JSON-safe object`);
|
|
325
|
+
}
|
|
326
|
+
function parseJsonObject(value, label) {
|
|
327
|
+
let parsed;
|
|
328
|
+
try {
|
|
329
|
+
parsed = JSON.parse(value);
|
|
330
|
+
} catch (error) {
|
|
331
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
332
|
+
throw new Error(`${label} must be valid JSON: ${message}`);
|
|
333
|
+
}
|
|
334
|
+
if (!isRecord(parsed))
|
|
335
|
+
throw new Error(`${label} must decode to a JSON object`);
|
|
336
|
+
return parsed;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// src/providers/shared/prompt.ts
|
|
340
|
+
function mapToolDefinitionsToLanguageModelTools(tools) {
|
|
341
|
+
if (!tools || tools.length === 0)
|
|
342
|
+
return;
|
|
343
|
+
return tools.map((tool) => ({
|
|
344
|
+
type: "function",
|
|
345
|
+
name: tool.name,
|
|
346
|
+
description: tool.description,
|
|
347
|
+
inputSchema: tool.inputSchema
|
|
348
|
+
}));
|
|
349
|
+
}
|
|
350
|
+
function messagesToLanguageModelPrompt(messages, options = {}) {
|
|
351
|
+
const prompt = [];
|
|
352
|
+
const systemContent = messages.filter((message) => message.role === "system").map((message) => contentToText(message.content)).filter(Boolean).join(`
|
|
353
|
+
|
|
354
|
+
`);
|
|
355
|
+
if (systemContent)
|
|
356
|
+
prompt.push({ role: "system", content: systemContent });
|
|
357
|
+
for (const message of messages) {
|
|
358
|
+
if (message.role === "system")
|
|
359
|
+
continue;
|
|
360
|
+
if (message.role === "tool") {
|
|
361
|
+
prompt.push(toolMessageToPrompt(message));
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (message.role === "assistant") {
|
|
365
|
+
const content = [
|
|
366
|
+
...options.assistantPrefixParts?.(message) ?? [],
|
|
367
|
+
...contentBlocksToPromptParts(message.content),
|
|
368
|
+
...toolCallsToPromptParts(message.toolCalls)
|
|
369
|
+
];
|
|
370
|
+
if (content.length > 0)
|
|
371
|
+
prompt.push({ role: "assistant", content });
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
prompt.push({
|
|
375
|
+
role: "user",
|
|
376
|
+
content: contentBlocksToPromptParts(message.content)
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
return prompt;
|
|
380
|
+
}
|
|
381
|
+
function contentBlocksToPromptParts(content) {
|
|
382
|
+
return content.map((block) => {
|
|
383
|
+
if (block.type === "text")
|
|
384
|
+
return { type: "text", text: block.text };
|
|
385
|
+
return {
|
|
386
|
+
type: "file",
|
|
387
|
+
data: block.data,
|
|
388
|
+
mediaType: block.mimeType
|
|
389
|
+
};
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
function toolCallsToPromptParts(toolCalls) {
|
|
393
|
+
if (!toolCalls || toolCalls.length === 0)
|
|
394
|
+
return [];
|
|
395
|
+
return toolCalls.map((toolCall) => ({
|
|
396
|
+
type: "tool-call",
|
|
397
|
+
toolCallId: toolCall.id,
|
|
398
|
+
toolName: toolCall.function.name,
|
|
399
|
+
input: toolCall.function.arguments
|
|
400
|
+
}));
|
|
401
|
+
}
|
|
402
|
+
function toolMessageToPrompt(message) {
|
|
403
|
+
return {
|
|
404
|
+
role: "tool",
|
|
405
|
+
content: [{
|
|
406
|
+
type: "tool-result",
|
|
407
|
+
toolCallId: message.toolCallId,
|
|
408
|
+
toolName: message.toolName,
|
|
409
|
+
output: toolMessageToOutput(message)
|
|
410
|
+
}]
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
function toolMessageToOutput(message) {
|
|
414
|
+
if (message.structuredContent) {
|
|
415
|
+
assertJsonSafeObject(message.structuredContent, "Tool structuredContent");
|
|
416
|
+
return {
|
|
417
|
+
type: "json",
|
|
418
|
+
value: message.structuredContent
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
const text = contentToText(message.content);
|
|
422
|
+
if (message.isError === true) {
|
|
423
|
+
return {
|
|
424
|
+
type: "json",
|
|
425
|
+
value: {
|
|
426
|
+
content: text,
|
|
427
|
+
isError: true
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
return {
|
|
432
|
+
type: "text",
|
|
433
|
+
value: text
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// src/providers/shared/reasoning.ts
|
|
438
|
+
function isRecord2(value) {
|
|
439
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
440
|
+
}
|
|
441
|
+
var LOW_HIGH_REASONING_EFFORT_MAP = {
|
|
442
|
+
none: "low",
|
|
443
|
+
minimal: "low",
|
|
444
|
+
low: "low",
|
|
445
|
+
medium: "high",
|
|
446
|
+
high: "high",
|
|
447
|
+
xhigh: "high"
|
|
448
|
+
};
|
|
449
|
+
var LOW_MEDIUM_HIGH_REASONING_EFFORT_MAP = {
|
|
450
|
+
none: "low",
|
|
451
|
+
minimal: "low",
|
|
452
|
+
low: "low",
|
|
453
|
+
medium: "medium",
|
|
454
|
+
high: "high",
|
|
455
|
+
xhigh: "high"
|
|
456
|
+
};
|
|
457
|
+
function normalizeReasoningConfig(reasoning) {
|
|
458
|
+
if (!isRecord2(reasoning))
|
|
459
|
+
return;
|
|
460
|
+
if (reasoning.enabled === false)
|
|
461
|
+
return;
|
|
462
|
+
return reasoning;
|
|
463
|
+
}
|
|
464
|
+
function resolveReasoningBudget(reasoning, fallback = 1024) {
|
|
465
|
+
const normalized = normalizeReasoningConfig(reasoning);
|
|
466
|
+
if (!normalized)
|
|
467
|
+
return;
|
|
468
|
+
for (const key of ["budgetTokens", "budget_tokens", "thinkingBudget"]) {
|
|
469
|
+
const value = normalized[key];
|
|
470
|
+
if (typeof value === "number" && Number.isFinite(value) && value > 0)
|
|
471
|
+
return Math.floor(value);
|
|
472
|
+
}
|
|
473
|
+
return fallback;
|
|
474
|
+
}
|
|
475
|
+
function resolveReasoningEffort(reasoning, allowedValues) {
|
|
476
|
+
const normalized = normalizeReasoningConfig(reasoning);
|
|
477
|
+
if (!normalized)
|
|
478
|
+
return;
|
|
479
|
+
const rawEffort = normalized.reasoningEffort ?? normalized.effort;
|
|
480
|
+
if (typeof rawEffort !== "string" || rawEffort.length === 0)
|
|
481
|
+
return;
|
|
482
|
+
if (!allowedValues || allowedValues.includes(rawEffort))
|
|
483
|
+
return rawEffort;
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
function resolveLowHighReasoningEffort(reasoning) {
|
|
487
|
+
const normalized = normalizeReasoningConfig(reasoning);
|
|
488
|
+
if (!normalized)
|
|
489
|
+
return;
|
|
490
|
+
const rawEffort = normalized.reasoningEffort ?? normalized.effort;
|
|
491
|
+
return typeof rawEffort === "string" ? LOW_HIGH_REASONING_EFFORT_MAP[rawEffort] : undefined;
|
|
492
|
+
}
|
|
493
|
+
function resolveLowMediumHighReasoningEffort(reasoning) {
|
|
494
|
+
const normalized = normalizeReasoningConfig(reasoning);
|
|
495
|
+
if (!normalized)
|
|
496
|
+
return;
|
|
497
|
+
const rawEffort = normalized.reasoningEffort ?? normalized.effort;
|
|
498
|
+
return typeof rawEffort === "string" ? LOW_MEDIUM_HIGH_REASONING_EFFORT_MAP[rawEffort] : undefined;
|
|
499
|
+
}
|
|
500
|
+
function buildOpenAIResponsesProviderOptions(reasoning) {
|
|
501
|
+
const normalized = normalizeReasoningConfig(reasoning);
|
|
502
|
+
if (!normalized)
|
|
503
|
+
return;
|
|
504
|
+
const next = {};
|
|
505
|
+
for (const [key, value] of Object.entries(normalized)) {
|
|
506
|
+
if (key === "enabled" || key === "budgetTokens" || key === "budget_tokens" || key === "thinkingBudget" || key === "includeThoughts")
|
|
507
|
+
continue;
|
|
508
|
+
if (key === "effort") {
|
|
509
|
+
next.reasoningEffort = value;
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
if (key === "summary") {
|
|
513
|
+
next.reasoningSummary = value;
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
next[key] = value;
|
|
517
|
+
}
|
|
518
|
+
if (next.reasoningSummary === undefined)
|
|
519
|
+
next.reasoningSummary = "auto";
|
|
520
|
+
return next;
|
|
521
|
+
}
|
|
522
|
+
function buildOpenAIResponsesRequestReasoning(reasoning) {
|
|
523
|
+
const options = buildOpenAIResponsesProviderOptions(reasoning);
|
|
524
|
+
if (!options)
|
|
525
|
+
return;
|
|
526
|
+
const next = {};
|
|
527
|
+
if (typeof options.reasoningEffort === "string")
|
|
528
|
+
next.effort = options.reasoningEffort;
|
|
529
|
+
if (typeof options.reasoningSummary === "string")
|
|
530
|
+
next.summary = options.reasoningSummary;
|
|
531
|
+
return next.effort || next.summary ? next : undefined;
|
|
532
|
+
}
|
|
533
|
+
function buildReasoningEffortProviderOptions(reasoning, allowedValues) {
|
|
534
|
+
const reasoningEffort = resolveReasoningEffort(reasoning, allowedValues);
|
|
535
|
+
return reasoningEffort ? { reasoningEffort } : undefined;
|
|
536
|
+
}
|
|
537
|
+
function buildAnthropicThinkingProviderOptions(reasoning) {
|
|
538
|
+
const budget = resolveReasoningBudget(reasoning);
|
|
539
|
+
if (!budget)
|
|
540
|
+
return { thinking: undefined, sendReasoning: undefined };
|
|
541
|
+
return {
|
|
542
|
+
thinking: {
|
|
543
|
+
type: "enabled",
|
|
544
|
+
budgetTokens: budget
|
|
545
|
+
},
|
|
546
|
+
sendReasoning: true
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
function buildGeminiThinkingProviderOptions(reasoning) {
|
|
550
|
+
const normalized = normalizeReasoningConfig(reasoning);
|
|
551
|
+
if (!normalized)
|
|
552
|
+
return;
|
|
553
|
+
return {
|
|
554
|
+
thinkingConfig: {
|
|
555
|
+
thinkingBudget: resolveReasoningBudget(normalized) ?? 1024,
|
|
556
|
+
includeThoughts: normalized.includeThoughts !== false
|
|
557
|
+
}
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
function buildMoonshotThinkingProviderOptions(reasoning) {
|
|
561
|
+
const budget = resolveReasoningBudget(reasoning);
|
|
562
|
+
if (!budget)
|
|
563
|
+
return;
|
|
564
|
+
return {
|
|
565
|
+
thinking: {
|
|
566
|
+
type: "enabled",
|
|
567
|
+
budgetTokens: budget
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
function buildDeepSeekThinkingProviderOptions(reasoning) {
|
|
572
|
+
return normalizeReasoningConfig(reasoning) ? { thinking: { type: "enabled" } } : undefined;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// src/providers/shared/provider-state.ts
|
|
576
|
+
var PROVIDER_STATE_METADATA_KEY = "_dimProviderState";
|
|
577
|
+
function attachProviderState(metadata, provider, state) {
|
|
578
|
+
if (!state || Object.keys(state).length === 0)
|
|
579
|
+
return metadata;
|
|
580
|
+
const nextMetadata = metadata ? structuredClone(metadata) : {};
|
|
581
|
+
const currentBag = isRecord3(nextMetadata[PROVIDER_STATE_METADATA_KEY]) ? nextMetadata[PROVIDER_STATE_METADATA_KEY] : {};
|
|
582
|
+
nextMetadata[PROVIDER_STATE_METADATA_KEY] = {
|
|
583
|
+
...currentBag,
|
|
584
|
+
[provider]: structuredClone(state)
|
|
585
|
+
};
|
|
586
|
+
return nextMetadata;
|
|
587
|
+
}
|
|
588
|
+
function readProviderState(message, provider) {
|
|
589
|
+
if (message.role !== "assistant" || !isRecord3(message.metadata))
|
|
590
|
+
return;
|
|
591
|
+
const bag = message.metadata[PROVIDER_STATE_METADATA_KEY];
|
|
592
|
+
if (!isRecord3(bag))
|
|
593
|
+
return;
|
|
594
|
+
const state = bag[provider];
|
|
595
|
+
return isRecord3(state) ? structuredClone(state) : undefined;
|
|
596
|
+
}
|
|
597
|
+
function isRecord3(value) {
|
|
598
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// src/providers/shared/responses-state.ts
|
|
602
|
+
function sliceMessagesForResponses(messages, stateKey) {
|
|
603
|
+
let previousResponseId;
|
|
604
|
+
let startIndex = 0;
|
|
605
|
+
for (let index = messages.length - 1;index >= 0; index -= 1) {
|
|
606
|
+
const state = readProviderState(messages[index], stateKey);
|
|
607
|
+
if (typeof state?.responseId === "string") {
|
|
608
|
+
previousResponseId = state.responseId;
|
|
609
|
+
startIndex = index + 1;
|
|
610
|
+
break;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
return {
|
|
614
|
+
messages: messages.slice(startIndex),
|
|
615
|
+
previousResponseId
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
function createResponsesAssistantMetadata(input) {
|
|
619
|
+
const responseId = resolveResponseId(input.result, input.providerMetadataKey);
|
|
620
|
+
if (!responseId)
|
|
621
|
+
return;
|
|
622
|
+
return attachProviderState(undefined, input.stateKey, { responseId });
|
|
623
|
+
}
|
|
624
|
+
function resolveResponseId(result, providerMetadataKey) {
|
|
625
|
+
const providerMetadata = providerMetadataKey ? result.providerMetadata?.[providerMetadataKey] : undefined;
|
|
626
|
+
if (isRecord(providerMetadata) && typeof providerMetadata.responseId === "string")
|
|
627
|
+
return providerMetadata.responseId;
|
|
628
|
+
if (typeof result.response?.id === "string")
|
|
629
|
+
return result.response.id;
|
|
630
|
+
return extractResponseIdFromBody(result.response?.body);
|
|
631
|
+
}
|
|
632
|
+
function extractResponseIdFromBody(body) {
|
|
633
|
+
if (isRecord(body) && typeof body.id === "string")
|
|
634
|
+
return body.id;
|
|
635
|
+
if (typeof body !== "string")
|
|
636
|
+
return;
|
|
637
|
+
try {
|
|
638
|
+
const parsed = JSON.parse(body);
|
|
639
|
+
return isRecord(parsed) && typeof parsed.id === "string" ? parsed.id : undefined;
|
|
640
|
+
} catch {
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
// src/providers/aihubmix-responses/state.ts
|
|
646
|
+
var AIHUBMIX_RESPONSES_STATE_KEY = "aihubmixResponses";
|
|
647
|
+
function sliceMessagesForAihubmixResponses(messages) {
|
|
648
|
+
return sliceMessagesForResponses(messages, AIHUBMIX_RESPONSES_STATE_KEY);
|
|
649
|
+
}
|
|
650
|
+
function createAihubmixResponsesAssistantMetadata(result) {
|
|
651
|
+
return createResponsesAssistantMetadata({
|
|
652
|
+
result,
|
|
653
|
+
stateKey: AIHUBMIX_RESPONSES_STATE_KEY,
|
|
654
|
+
providerMetadataKey: "aihubmix"
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
// src/providers/aihubmix-responses/driver.ts
|
|
659
|
+
var PLACEHOLDER_API_KEY = "dim-placeholder-key";
|
|
660
|
+
var aihubmixResponsesDriver = {
|
|
661
|
+
async generate(context) {
|
|
662
|
+
const requestReasoning = buildOpenAIResponsesRequestReasoning(context.request.reasoning);
|
|
663
|
+
const model = createProvider(context.options, requestReasoning).responses(context.request.model.modelId);
|
|
664
|
+
const { messages, previousResponseId } = sliceMessagesForAihubmixResponses(context.request.messages);
|
|
665
|
+
const aihubmixProviderOptions = {
|
|
666
|
+
...buildOpenAIResponsesProviderOptions(context.request.reasoning) ?? {},
|
|
667
|
+
...previousResponseId ? { previousResponseId } : {}
|
|
668
|
+
};
|
|
669
|
+
const callOptions = {
|
|
670
|
+
prompt: messagesToLanguageModelPrompt(messages),
|
|
671
|
+
tools: mapToolDefinitionsToLanguageModelTools(context.request.tools),
|
|
672
|
+
maxOutputTokens: context.request.maxOutputTokens,
|
|
673
|
+
temperature: context.request.temperature,
|
|
674
|
+
topP: context.request.topP,
|
|
675
|
+
stopSequences: context.request.stop,
|
|
676
|
+
abortSignal: context.request.signal,
|
|
677
|
+
...Object.keys(aihubmixProviderOptions).length > 0 ? { providerOptions: { openai: aihubmixProviderOptions } } : {}
|
|
678
|
+
};
|
|
679
|
+
return generateWithAiSdk({
|
|
680
|
+
model,
|
|
681
|
+
callOptions,
|
|
682
|
+
createAssistantMetadata: createAihubmixResponsesAssistantMetadata
|
|
683
|
+
});
|
|
684
|
+
},
|
|
685
|
+
normalizeError(error) {
|
|
686
|
+
if (APICallError.isInstance(error)) {
|
|
687
|
+
return createApiCallErrorPayload({
|
|
688
|
+
code: "aihubmix_responses_http_error",
|
|
689
|
+
provider: "AIHubMix Responses",
|
|
690
|
+
error
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
return createRequestErrorPayload({
|
|
694
|
+
code: "aihubmix_responses_request_error",
|
|
695
|
+
error
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
};
|
|
699
|
+
function createProvider(options, requestReasoning) {
|
|
700
|
+
const stripAuthorization = !options.apiKey;
|
|
701
|
+
warnIfPlaceholderApiKey({
|
|
702
|
+
provider: "AIHubMix Responses",
|
|
703
|
+
shouldWarn: stripAuthorization,
|
|
704
|
+
hint: "This adapter does not expose provider-native auth headers in its options, so external auth must be added inside custom fetch when apiKey is omitted."
|
|
705
|
+
});
|
|
706
|
+
return createAihubmix({
|
|
707
|
+
apiKey: options.apiKey ?? PLACEHOLDER_API_KEY,
|
|
708
|
+
compatibility: options.compatibility,
|
|
709
|
+
fetch: createReasoningAwareResponsesFetch({
|
|
710
|
+
fetch: options.fetch,
|
|
711
|
+
stripAuthorization,
|
|
712
|
+
requestReasoning
|
|
713
|
+
})
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
function createReasoningAwareResponsesFetch(input) {
|
|
717
|
+
const baseFetch = createProviderFetch({
|
|
718
|
+
fetch: input.fetch,
|
|
719
|
+
stripHeaders: ["authorization"],
|
|
720
|
+
stripWhen: input.stripAuthorization
|
|
721
|
+
});
|
|
722
|
+
if (!input.requestReasoning)
|
|
723
|
+
return baseFetch;
|
|
724
|
+
const wrappedFetch = Object.assign(async (resource, init) => {
|
|
725
|
+
if (!init?.body)
|
|
726
|
+
return baseFetch(resource, init);
|
|
727
|
+
const body = parseJsonBody(init.body);
|
|
728
|
+
if (!isRecord(body) || body.reasoning !== undefined)
|
|
729
|
+
return baseFetch(resource, init);
|
|
730
|
+
return baseFetch(resource, {
|
|
731
|
+
...init,
|
|
732
|
+
body: JSON.stringify({
|
|
733
|
+
...body,
|
|
734
|
+
reasoning: input.requestReasoning
|
|
735
|
+
})
|
|
736
|
+
});
|
|
737
|
+
}, {
|
|
738
|
+
preconnect: typeof baseFetch.preconnect === "function" ? baseFetch.preconnect.bind(baseFetch) : undefined
|
|
739
|
+
});
|
|
740
|
+
return wrappedFetch;
|
|
741
|
+
}
|
|
742
|
+
function parseJsonBody(body) {
|
|
743
|
+
if (typeof body !== "string")
|
|
744
|
+
return;
|
|
745
|
+
try {
|
|
746
|
+
return JSON.parse(body);
|
|
747
|
+
} catch {
|
|
748
|
+
return;
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
// src/providers/aihubmix-responses/adapter.ts
|
|
753
|
+
var createAihubmixResponsesAdapter = createProviderFactory({
|
|
754
|
+
defaultProvider: "aihubmix-responses",
|
|
755
|
+
driver: aihubmixResponsesDriver
|
|
756
|
+
});
|
|
757
|
+
export {
|
|
758
|
+
createAihubmixResponsesAdapter
|
|
759
|
+
};
|