@code-yeongyu/senpi-ai 2026.9.3 → 2026.9.4-2
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/dist/api/anthropic-messages.d.ts +1 -1
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +130 -15
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/context-room.d.ts +20 -0
- package/dist/api/context-room.d.ts.map +1 -0
- package/dist/api/context-room.js +40 -0
- package/dist/api/context-room.js.map +1 -0
- package/dist/api/mistral-conversations.js +1 -1
- package/dist/api/mistral-conversations.js.map +1 -1
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +16 -1
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-responses.d.ts.map +1 -1
- package/dist/api/openai-responses.js +2 -1
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/pi-messages.d.ts +2 -0
- package/dist/api/pi-messages.d.ts.map +1 -1
- package/dist/api/pi-messages.js +6 -0
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts +1 -3
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +2 -16
- package/dist/api/simple-options.js.map +1 -1
- package/dist/api/warm-prompt-cache.js +1 -1
- package/dist/api/warm-prompt-cache.js.map +1 -1
- package/dist/auth/pool/slots.d.ts +16 -3
- package/dist/auth/pool/slots.d.ts.map +1 -1
- package/dist/auth/pool/slots.js +40 -6
- package/dist/auth/pool/slots.js.map +1 -1
- package/dist/compat/extension-oauth-types.d.ts +8 -0
- package/dist/compat/extension-oauth-types.d.ts.map +1 -1
- package/dist/compat/extension-oauth-types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +3 -2
- package/dist/models.js.map +1 -1
- package/dist/openai-responses-compat.d.ts +2 -0
- package/dist/openai-responses-compat.d.ts.map +1 -1
- package/dist/openai-responses-compat.js.map +1 -1
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/anthropic.json +1 -1
- package/dist/providers/data/azure-openai-responses.json +1 -1
- package/dist/providers/data/baseten.json +1 -1
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/github-copilot.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/nvidia.json +1 -1
- package/dist/providers/data/openai-codex.json +1 -1
- package/dist/providers/data/openai.json +1 -1
- package/dist/providers/data/opencode-go.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +8 -1
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/types.d.ts +14 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/drop-failed-assistant-turns.d.ts +23 -0
- package/dist/utils/drop-failed-assistant-turns.d.ts.map +1 -0
- package/dist/utils/drop-failed-assistant-turns.js +58 -0
- package/dist/utils/drop-failed-assistant-turns.js.map +1 -0
- package/dist/utils/node-http-proxy.d.ts.map +1 -1
- package/dist/utils/node-http-proxy.js +53 -12
- package/dist/utils/node-http-proxy.js.map +1 -1
- package/dist/utils/overflow.d.ts.map +1 -1
- package/dist/utils/overflow.js +2 -0
- package/dist/utils/overflow.js.map +1 -1
- package/dist/utils/prompt-cache-ttl.d.ts +4 -2
- package/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
- package/dist/utils/prompt-cache-ttl.js +3 -0
- package/dist/utils/prompt-cache-ttl.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
-
import type { MessageCreateParamsNonStreaming } from "@anthropic-ai/sdk/resources/messages.js";
|
|
2
|
+
import type { MessageCreateParamsNonStreaming } from "@anthropic-ai/sdk/resources/beta/messages/messages.js";
|
|
3
3
|
import type { AnthropicRefusalFallback, Context, Model, SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.ts";
|
|
4
4
|
export { getAnthropicCompat } from "../utils/prompt-cache-ttl.ts";
|
|
5
5
|
export type AnthropicEffort = "low" | "medium" | "high" | "xhigh" | "max";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAMX,+BAA+B,EAK/B,MAAM,uDAAuD,CAAC;AAG/D,OAAO,KAAK,EACX,wBAAwB,EAKxB,OAAO,EAGP,KAAK,EAGL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAOb,MAAM,aAAa,CAAC;AAqCrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA6JlE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1E,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,SAAS,CAAC;AA+FhE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACnB;AAo4BD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CA2czE,CAAC;AAyFF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CA+ClF,CAAC;AA6IF,wBAAgB,mCAAmC,CAClD,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACxB,+BAA+B,CAkBjC"}
|
|
@@ -179,6 +179,11 @@ const UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS = [
|
|
|
179
179
|
"opus-4.8",
|
|
180
180
|
];
|
|
181
181
|
const SERVER_SIDE_FALLBACK_BETA = "server-side-fallback-2026-07-01";
|
|
182
|
+
function shouldUseServerSideFallbackBeta(model) {
|
|
183
|
+
return (model.compat?.allowedFallbackModels?.length ?? 0) > 0;
|
|
184
|
+
}
|
|
185
|
+
const MID_CONVERSATION_OUTPUT_CONFIG_BETA = "mid-conversation-output-config-2026-07-01";
|
|
186
|
+
const THINKING_BINDING_CONTROLS_BETA = "thinking-binding-controls-2026-08-01";
|
|
182
187
|
// A provider can reject its own empty signatures. Learn that capability for one
|
|
183
188
|
// conversation without changing the shared model definition used by other sessions.
|
|
184
189
|
const unsignedThinkingTextReplayFallbacks = new Set();
|
|
@@ -953,12 +958,14 @@ async function* iterateAnthropicEvents(response, signal) {
|
|
|
953
958
|
export const stream = (model, context, options) => {
|
|
954
959
|
const stream = new AssistantMessageEventStream();
|
|
955
960
|
(async () => {
|
|
961
|
+
const providerThinkingLevel = model.compat?.supportsMidConvoEffort ? (options?.effort ?? "high") : undefined;
|
|
956
962
|
const output = {
|
|
957
963
|
role: "assistant",
|
|
958
964
|
content: [],
|
|
959
965
|
api: model.api,
|
|
960
966
|
provider: model.provider,
|
|
961
967
|
model: model.id,
|
|
968
|
+
...(providerThinkingLevel === undefined ? {} : { providerThinkingLevel }),
|
|
962
969
|
usage: {
|
|
963
970
|
input: 0,
|
|
964
971
|
output: 0,
|
|
@@ -978,6 +985,7 @@ export const stream = (model, context, options) => {
|
|
|
978
985
|
let client;
|
|
979
986
|
let isOAuth;
|
|
980
987
|
let usageModel = model;
|
|
988
|
+
let inputTransformations;
|
|
981
989
|
if (options?.client) {
|
|
982
990
|
client = options.client;
|
|
983
991
|
isOAuth = false;
|
|
@@ -1022,13 +1030,15 @@ export const stream = (model, context, options) => {
|
|
|
1022
1030
|
...(payloadRequestMetadata.headers ? { headers: payloadRequestMetadata.headers } : {}),
|
|
1023
1031
|
};
|
|
1024
1032
|
try {
|
|
1025
|
-
const response = await client.messages
|
|
1033
|
+
const response = await client.beta.messages
|
|
1034
|
+
.create({ ...params, stream: true }, requestOptions)
|
|
1035
|
+
.asResponse();
|
|
1026
1036
|
return { params, response };
|
|
1027
1037
|
}
|
|
1028
1038
|
catch (error) {
|
|
1029
1039
|
if (isForcedToolChoiceUnsupportedError(error, isForcedAnthropicToolChoice(params.tool_choice))) {
|
|
1030
1040
|
params = omitToolChoiceParam(params);
|
|
1031
|
-
const response = await client.messages
|
|
1041
|
+
const response = await client.beta.messages
|
|
1032
1042
|
.create({ ...params, stream: true }, requestOptions)
|
|
1033
1043
|
.asResponse();
|
|
1034
1044
|
return { params, response };
|
|
@@ -1060,6 +1070,9 @@ export const stream = (model, context, options) => {
|
|
|
1060
1070
|
for await (const event of iterateAnthropicEvents(response, requestSignal)) {
|
|
1061
1071
|
if (event.type === "message_start") {
|
|
1062
1072
|
output.responseId = event.message.id;
|
|
1073
|
+
const transformations = event.message.input_transformations;
|
|
1074
|
+
if (Array.isArray(transformations))
|
|
1075
|
+
inputTransformations = transformations;
|
|
1063
1076
|
output.model = event.message.model;
|
|
1064
1077
|
const fallback = output.model === model.id
|
|
1065
1078
|
? undefined
|
|
@@ -1089,6 +1102,9 @@ export const stream = (model, context, options) => {
|
|
|
1089
1102
|
}
|
|
1090
1103
|
}
|
|
1091
1104
|
else if (event.type === "content_block_start") {
|
|
1105
|
+
if (event.content_block.type === "fallback" && output.content.length > 0) {
|
|
1106
|
+
throw new Error("Anthropic performed an unsupported mid-output model fallback");
|
|
1107
|
+
}
|
|
1092
1108
|
const receipt = options?.abortServerSideFallback === true
|
|
1093
1109
|
? parseServerFallbackReceipt(event.content_block)
|
|
1094
1110
|
: undefined;
|
|
@@ -1251,6 +1267,9 @@ export const stream = (model, context, options) => {
|
|
|
1251
1267
|
}
|
|
1252
1268
|
}
|
|
1253
1269
|
else if (event.type === "message_delta") {
|
|
1270
|
+
const transformations = event.input_transformations;
|
|
1271
|
+
if (Array.isArray(transformations))
|
|
1272
|
+
inputTransformations = transformations;
|
|
1254
1273
|
if (event.delta.stop_reason) {
|
|
1255
1274
|
output.rawStopReason = event.delta.stop_reason;
|
|
1256
1275
|
const stopReasonResult = mapStopReason(event.delta.stop_reason, event.delta.stop_details);
|
|
@@ -1277,11 +1296,8 @@ export const stream = (model, context, options) => {
|
|
|
1277
1296
|
if (event.usage.cache_creation_input_tokens != null) {
|
|
1278
1297
|
output.usage.cacheWrite = event.usage.cache_creation_input_tokens;
|
|
1279
1298
|
}
|
|
1280
|
-
// Anthropic reports reasoning tokens
|
|
1281
|
-
|
|
1282
|
-
// its Usage type, so read it through a narrow cast. Verified against the live API.
|
|
1283
|
-
const thinkingTokens = event.usage
|
|
1284
|
-
.output_tokens_details?.thinking_tokens;
|
|
1299
|
+
// Anthropic reports reasoning tokens as a subset of output tokens.
|
|
1300
|
+
const thinkingTokens = event.usage.output_tokens_details?.thinking_tokens;
|
|
1285
1301
|
if (thinkingTokens != null) {
|
|
1286
1302
|
output.usage.reasoning = thinkingTokens;
|
|
1287
1303
|
}
|
|
@@ -1304,6 +1320,19 @@ export const stream = (model, context, options) => {
|
|
|
1304
1320
|
if (output.stopReason === "aborted" || output.stopReason === "error") {
|
|
1305
1321
|
throw new Error(output.errorMessage || "An unknown error occurred");
|
|
1306
1322
|
}
|
|
1323
|
+
if (inputTransformations && inputTransformations.length > 0) {
|
|
1324
|
+
appendAssistantMessageDiagnostic(output, {
|
|
1325
|
+
type: "anthropic_input_transformations",
|
|
1326
|
+
timestamp: Date.now(),
|
|
1327
|
+
details: {
|
|
1328
|
+
transformations: inputTransformations.map((transformation) => ({
|
|
1329
|
+
type: transformation.type ?? undefined,
|
|
1330
|
+
path: transformation.path ?? undefined,
|
|
1331
|
+
reason: transformation.reason ?? undefined,
|
|
1332
|
+
})),
|
|
1333
|
+
},
|
|
1334
|
+
});
|
|
1335
|
+
}
|
|
1307
1336
|
combinedAbort.cleanup();
|
|
1308
1337
|
stream.push({ type: "done", reason: output.stopReason, message: output });
|
|
1309
1338
|
stream.end();
|
|
@@ -1380,8 +1409,6 @@ function supportsNativeXhighEffort(model) {
|
|
|
1380
1409
|
function cannotDisableThinking(model, compat) {
|
|
1381
1410
|
if (!compat.supportsDisabledThinking)
|
|
1382
1411
|
return true;
|
|
1383
|
-
if (model.thinkingLevelMap?.off === null)
|
|
1384
|
-
return true;
|
|
1385
1412
|
return matchesModelMarker(model, DISABLED_THINKING_REJECTING_MODEL_MARKERS);
|
|
1386
1413
|
}
|
|
1387
1414
|
function disableThinkingForRequest(params, model, compat) {
|
|
@@ -1560,6 +1587,42 @@ export function buildAnthropicWarmPromptCacheParams(model, context, options) {
|
|
|
1560
1587
|
max_tokens: 0,
|
|
1561
1588
|
});
|
|
1562
1589
|
}
|
|
1590
|
+
function getBetaFeatures(model, context, isOAuthToken, options) {
|
|
1591
|
+
let configuredFeatures;
|
|
1592
|
+
for (const headers of [model.headers, options?.headers]) {
|
|
1593
|
+
for (const [name, value] of Object.entries(headers ?? {})) {
|
|
1594
|
+
if (name.toLowerCase() === "anthropic-beta")
|
|
1595
|
+
configuredFeatures = value;
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
if (configuredFeatures === null)
|
|
1599
|
+
return [];
|
|
1600
|
+
if (configuredFeatures !== undefined) {
|
|
1601
|
+
return [
|
|
1602
|
+
...new Set(configuredFeatures
|
|
1603
|
+
.split(",")
|
|
1604
|
+
.map((feature) => feature.trim())
|
|
1605
|
+
.filter(Boolean)),
|
|
1606
|
+
];
|
|
1607
|
+
}
|
|
1608
|
+
const features = [];
|
|
1609
|
+
if (isOAuthToken)
|
|
1610
|
+
features.push("claude-code-20250219", "oauth-2025-04-20");
|
|
1611
|
+
if (shouldUseFineGrainedToolStreamingBeta(model, context))
|
|
1612
|
+
features.push(FINE_GRAINED_TOOL_STREAMING_BETA);
|
|
1613
|
+
if (model.reasoning &&
|
|
1614
|
+
options?.thinkingEnabled === true &&
|
|
1615
|
+
(options.interleavedThinking ?? true) &&
|
|
1616
|
+
!supportsAdaptiveThinking(model)) {
|
|
1617
|
+
features.push(INTERLEAVED_THINKING_BETA);
|
|
1618
|
+
}
|
|
1619
|
+
if (shouldUseServerSideFallbackBeta(model))
|
|
1620
|
+
features.push(SERVER_SIDE_FALLBACK_BETA);
|
|
1621
|
+
if (model.compat?.supportsMidConvoEffort === true) {
|
|
1622
|
+
features.push(MID_CONVERSATION_OUTPUT_CONFIG_BETA, THINKING_BINDING_CONTROLS_BETA);
|
|
1623
|
+
}
|
|
1624
|
+
return [...new Set(features)];
|
|
1625
|
+
}
|
|
1563
1626
|
function buildParams(model, context, isOAuthToken, options, unsignedThinkingReplay = getAnthropicCompat(model).unsignedThinkingReplay) {
|
|
1564
1627
|
const compat = getAnthropicCompat(model);
|
|
1565
1628
|
const { cacheControl } = getCacheControl(model, options?.cacheRetention ?? model.cacheRetention, options?.env);
|
|
@@ -1581,11 +1644,28 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
|
|
|
1581
1644
|
deferredTools = [];
|
|
1582
1645
|
}
|
|
1583
1646
|
const deferredToolNames = new Set(deferredTools.map((tool) => normalizeToolName(tool.name)));
|
|
1647
|
+
const activeEffort = options?.effort ?? "high";
|
|
1648
|
+
const betaFeatures = getBetaFeatures(model, context, isOAuthToken, options);
|
|
1649
|
+
const convertedMessages = convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay, deferredToolNames, normalizeToolName, model.compat?.supportsMidConvoEffort === true ? model.provider : undefined);
|
|
1650
|
+
const messages = model.compat?.supportsMidConvoEffort === true
|
|
1651
|
+
? insertThinkingLevelMessages(convertedMessages, activeEffort)
|
|
1652
|
+
: convertedMessages.messages;
|
|
1653
|
+
// Effort markers are appended after history; re-run the fork's final-user cache checkpoint
|
|
1654
|
+
// against the actual last user/tool-result message so the marker cannot displace cache_control.
|
|
1655
|
+
if (model.compat?.supportsMidConvoEffort === true && cacheControl) {
|
|
1656
|
+
for (let index = messages.length - 1; index >= 0; index--) {
|
|
1657
|
+
if (messages[index].role === "user") {
|
|
1658
|
+
markUserMessageCacheCheckpoint(messages[index], cacheControl);
|
|
1659
|
+
break;
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
}
|
|
1584
1663
|
const params = {
|
|
1585
1664
|
model: model.id,
|
|
1586
|
-
messages
|
|
1665
|
+
messages,
|
|
1587
1666
|
max_tokens: options?.maxTokens ?? model.maxTokens,
|
|
1588
1667
|
stream: true,
|
|
1668
|
+
...(betaFeatures.length > 0 ? { betas: betaFeatures } : {}),
|
|
1589
1669
|
};
|
|
1590
1670
|
// For OAuth tokens, we MUST include Claude Code identity
|
|
1591
1671
|
if (isOAuthToken) {
|
|
@@ -1629,8 +1709,18 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
|
|
|
1629
1709
|
...convertTools(deferredTools, isOAuthToken, compat.supportsEagerToolInputStreaming, compat.supportsStrictTools, undefined, true),
|
|
1630
1710
|
];
|
|
1631
1711
|
}
|
|
1632
|
-
//
|
|
1633
|
-
|
|
1712
|
+
// Managed effort models always use adaptive thinking so prefix mismatches can
|
|
1713
|
+
// be dropped instead of surfacing as persistent 400 responses. Thinking-off is
|
|
1714
|
+
// handled before this managed branch because these models accept `disabled`.
|
|
1715
|
+
if (model.compat?.supportsMidConvoEffort === true && options?.thinkingEnabled !== false) {
|
|
1716
|
+
params.thinking = {
|
|
1717
|
+
type: "adaptive",
|
|
1718
|
+
display: options?.thinkingDisplay ?? "summarized",
|
|
1719
|
+
block_binding: { prefix_mismatch_behavior: "drop_block" },
|
|
1720
|
+
};
|
|
1721
|
+
params.output_config = { effort: "high" };
|
|
1722
|
+
}
|
|
1723
|
+
else if (model.reasoning) {
|
|
1634
1724
|
if (options?.thinkingEnabled) {
|
|
1635
1725
|
// Default to "summarized" so Opus 4.7 and Mythos Preview behave like
|
|
1636
1726
|
// older Claude 4 models (whose API default is also "summarized").
|
|
@@ -1684,7 +1774,9 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
|
|
|
1684
1774
|
}
|
|
1685
1775
|
applyExtraBodyToAnthropicParams(params, options?.extraBody);
|
|
1686
1776
|
if (options?.refusalFallbacks !== undefined) {
|
|
1687
|
-
|
|
1777
|
+
// AnthropicRefusalFallback models a readonly list; the SDK's BetaFallbacksParam
|
|
1778
|
+
// is mutable, so copy rather than widen the fork's public type.
|
|
1779
|
+
params.fallbacks = options.refusalFallbacks === "default" ? "default" : [...options.refusalFallbacks];
|
|
1688
1780
|
}
|
|
1689
1781
|
return params;
|
|
1690
1782
|
}
|
|
@@ -1746,8 +1838,9 @@ function convertToolResult(msg, isOAuthToken, deferredToolNames, loadedToolNames
|
|
|
1746
1838
|
: convertedContent,
|
|
1747
1839
|
};
|
|
1748
1840
|
}
|
|
1749
|
-
function convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay = "text", deferredToolNames = new Set(), normalizeToolName = (name) => name) {
|
|
1841
|
+
function convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay = "text", deferredToolNames = new Set(), normalizeToolName = (name) => name, managedProvider) {
|
|
1750
1842
|
const params = [];
|
|
1843
|
+
const assistantLevels = new Map();
|
|
1751
1844
|
const loadedToolNames = new Set();
|
|
1752
1845
|
// Tool calls from a declined pre-fallback attempt are dropped from their
|
|
1753
1846
|
// assistant turn below; drop their tool_results in lockstep so none dangle.
|
|
@@ -1896,10 +1989,17 @@ function convertMessages(transformedMessages, model, isOAuthToken, cacheControl,
|
|
|
1896
1989
|
}
|
|
1897
1990
|
if (blocks.length === 0)
|
|
1898
1991
|
continue;
|
|
1992
|
+
const messageIndex = params.length;
|
|
1899
1993
|
params.push({
|
|
1900
1994
|
role: "assistant",
|
|
1901
1995
|
content: blocks,
|
|
1902
1996
|
});
|
|
1997
|
+
if (managedProvider !== undefined &&
|
|
1998
|
+
msg.api === "anthropic-messages" &&
|
|
1999
|
+
msg.provider === managedProvider &&
|
|
2000
|
+
isAnthropicEffort(msg.providerThinkingLevel)) {
|
|
2001
|
+
assistantLevels.set(messageIndex, msg.providerThinkingLevel);
|
|
2002
|
+
}
|
|
1903
2003
|
}
|
|
1904
2004
|
else if (msg.role === "toolResult") {
|
|
1905
2005
|
// Collect all consecutive toolResult messages, needed for z.ai Anthropic endpoint.
|
|
@@ -1933,7 +2033,22 @@ function convertMessages(transformedMessages, model, isOAuthToken, cacheControl,
|
|
|
1933
2033
|
}
|
|
1934
2034
|
}
|
|
1935
2035
|
}
|
|
1936
|
-
return params;
|
|
2036
|
+
return { messages: params, assistantLevels };
|
|
2037
|
+
}
|
|
2038
|
+
function isAnthropicEffort(value) {
|
|
2039
|
+
return value === "low" || value === "medium" || value === "high" || value === "xhigh" || value === "max";
|
|
2040
|
+
}
|
|
2041
|
+
function insertThinkingLevelMessages(converted, activeEffort) {
|
|
2042
|
+
const messages = [];
|
|
2043
|
+
for (let index = 0; index < converted.messages.length; index++) {
|
|
2044
|
+
const historicalEffort = converted.assistantLevels.get(index);
|
|
2045
|
+
if (historicalEffort !== undefined) {
|
|
2046
|
+
messages.push({ role: "system", content: [], output_config: { effort: historicalEffort } });
|
|
2047
|
+
}
|
|
2048
|
+
messages.push(converted.messages[index]);
|
|
2049
|
+
}
|
|
2050
|
+
messages.push({ role: "system", content: [], output_config: { effort: activeEffort } });
|
|
2051
|
+
return messages;
|
|
1937
2052
|
}
|
|
1938
2053
|
function shouldUseFineGrainedToolStreamingBeta(model, context) {
|
|
1939
2054
|
return !!context.tools?.length && !getAnthropicCompat(model).supportsEagerToolInputStreaming;
|