@codehz/ai 0.1.6 → 0.1.8
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/index.mjs +82 -74
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/adapters/messages.ts +11 -1
- package/src/helpers/usage-mapping.ts +6 -6
package/dist/index.mjs
CHANGED
|
@@ -1062,19 +1062,19 @@ function usageFromOpenAIResponses(raw) {
|
|
|
1062
1062
|
}
|
|
1063
1063
|
/** Anthropic Messages `usage`(message_start / message_delta) */
|
|
1064
1064
|
function usageFromAnthropicMessages(raw) {
|
|
1065
|
-
const
|
|
1065
|
+
const uncachedInputTokens = num(raw.input_tokens);
|
|
1066
1066
|
const outputTokens = num(raw.output_tokens);
|
|
1067
1067
|
const cacheWriteInputTokens = num(raw.cache_creation_input_tokens);
|
|
1068
1068
|
const cachedInputTokens = num(raw.cache_read_input_tokens);
|
|
1069
1069
|
const inputParts = [
|
|
1070
|
-
|
|
1070
|
+
uncachedInputTokens,
|
|
1071
1071
|
cacheWriteInputTokens,
|
|
1072
1072
|
cachedInputTokens
|
|
1073
1073
|
].filter((n) => n !== void 0);
|
|
1074
|
-
const
|
|
1075
|
-
const totalTokens =
|
|
1074
|
+
const inputTokens = inputParts.length > 0 ? inputParts.reduce((sum, n) => sum + n, 0) : void 0;
|
|
1075
|
+
const totalTokens = inputTokens !== void 0 && outputTokens !== void 0 ? inputTokens + outputTokens : void 0;
|
|
1076
1076
|
let billableInputTokens;
|
|
1077
|
-
if (
|
|
1077
|
+
if (uncachedInputTokens !== void 0 || cacheWriteInputTokens !== void 0) billableInputTokens = (uncachedInputTokens ?? 0) + (cacheWriteInputTokens ?? 0);
|
|
1078
1078
|
return record({
|
|
1079
1079
|
inputTokens,
|
|
1080
1080
|
outputTokens,
|
|
@@ -1539,78 +1539,86 @@ var MessagesAdapter = class extends AdapterBase {
|
|
|
1539
1539
|
buildRequest(request) {
|
|
1540
1540
|
const messages = [];
|
|
1541
1541
|
let systemPrompt;
|
|
1542
|
+
let pendingToolResultMessage;
|
|
1542
1543
|
if (request.instructions) systemPrompt = instructionsToMessagesText(request.instructions);
|
|
1543
|
-
for (const item of request.input)
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
role
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
role
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
content
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
thinking: contentBlocksToText(ensureMessagesReasoningBlocks(item.content, "reasoning content"))
|
|
1591
|
-
};
|
|
1592
|
-
const lastMsg = messages[messages.length - 1];
|
|
1593
|
-
if (lastMsg && lastMsg.role === "assistant" && typeof lastMsg.content !== "string") lastMsg.content.push(block);
|
|
1594
|
-
else messages.push({
|
|
1595
|
-
role: "assistant",
|
|
1596
|
-
content: [block]
|
|
1597
|
-
});
|
|
1598
|
-
break;
|
|
1599
|
-
}
|
|
1600
|
-
case "opaque":
|
|
1601
|
-
if (item.purpose === "replay" && typeof item.payload === "object" && item.payload !== null) {
|
|
1602
|
-
const payload = item.payload;
|
|
1603
|
-
if (payload.role === "assistant" && Array.isArray(payload.content)) {
|
|
1604
|
-
if (payload.content.every((b) => typeof b === "object" && b !== null && "type" in b && (b.type === "text" || b.type === "thinking" || b.type === "redacted_thinking" || b.type === "tool_use" || b.type === "tool_result"))) {
|
|
1605
|
-
rollbackTrailingAssistantMessages$2(messages);
|
|
1606
|
-
messages.push({
|
|
1607
|
-
role: "assistant",
|
|
1608
|
-
content: payload.content
|
|
1609
|
-
});
|
|
1610
|
-
}
|
|
1544
|
+
for (const item of request.input) {
|
|
1545
|
+
if (item.type !== "tool_result") pendingToolResultMessage = void 0;
|
|
1546
|
+
switch (item.type) {
|
|
1547
|
+
case "message": {
|
|
1548
|
+
const role = item.role === "user" ? "user" : "assistant";
|
|
1549
|
+
const supportedContent = ensureMessagesTextBlocks(item.content, `input message (${item.role}) content`);
|
|
1550
|
+
if (supportedContent.length === 1 && supportedContent[0]?.type === "text") messages.push({
|
|
1551
|
+
role,
|
|
1552
|
+
content: supportedContent[0].text
|
|
1553
|
+
});
|
|
1554
|
+
else messages.push({
|
|
1555
|
+
role,
|
|
1556
|
+
content: supportedContent.map(canonicalToMessagesBlock)
|
|
1557
|
+
});
|
|
1558
|
+
break;
|
|
1559
|
+
}
|
|
1560
|
+
case "tool_call": {
|
|
1561
|
+
const lastMsg = messages[messages.length - 1];
|
|
1562
|
+
const toolBlock = {
|
|
1563
|
+
type: "tool_use",
|
|
1564
|
+
id: item.id,
|
|
1565
|
+
name: item.name,
|
|
1566
|
+
input: item.argumentsJson ?? parseToolUseInput(item.argumentsText)
|
|
1567
|
+
};
|
|
1568
|
+
if (lastMsg && lastMsg.role === "assistant" && typeof lastMsg.content !== "string") lastMsg.content.push(toolBlock);
|
|
1569
|
+
else messages.push({
|
|
1570
|
+
role: "assistant",
|
|
1571
|
+
content: [toolBlock]
|
|
1572
|
+
});
|
|
1573
|
+
break;
|
|
1574
|
+
}
|
|
1575
|
+
case "tool_result": {
|
|
1576
|
+
assertMessagesToolResultOutcome(item.outcome);
|
|
1577
|
+
const content = ensureMessagesTextBlocks(item.content, `tool_result ${item.callId} content`).map(blockToText).join("\n");
|
|
1578
|
+
const block = {
|
|
1579
|
+
type: "tool_result",
|
|
1580
|
+
tool_use_id: item.callId,
|
|
1581
|
+
content,
|
|
1582
|
+
is_error: item.outcome === "error"
|
|
1583
|
+
};
|
|
1584
|
+
if (pendingToolResultMessage && typeof pendingToolResultMessage.content !== "string") pendingToolResultMessage.content.push(block);
|
|
1585
|
+
else {
|
|
1586
|
+
pendingToolResultMessage = {
|
|
1587
|
+
role: "user",
|
|
1588
|
+
content: [block]
|
|
1589
|
+
};
|
|
1590
|
+
messages.push(pendingToolResultMessage);
|
|
1611
1591
|
}
|
|
1592
|
+
break;
|
|
1612
1593
|
}
|
|
1613
|
-
|
|
1594
|
+
case "reasoning": {
|
|
1595
|
+
const block = {
|
|
1596
|
+
type: "thinking",
|
|
1597
|
+
thinking: contentBlocksToText(ensureMessagesReasoningBlocks(item.content, "reasoning content"))
|
|
1598
|
+
};
|
|
1599
|
+
const lastMsg = messages[messages.length - 1];
|
|
1600
|
+
if (lastMsg && lastMsg.role === "assistant" && typeof lastMsg.content !== "string") lastMsg.content.push(block);
|
|
1601
|
+
else messages.push({
|
|
1602
|
+
role: "assistant",
|
|
1603
|
+
content: [block]
|
|
1604
|
+
});
|
|
1605
|
+
break;
|
|
1606
|
+
}
|
|
1607
|
+
case "opaque":
|
|
1608
|
+
if (item.purpose === "replay" && typeof item.payload === "object" && item.payload !== null) {
|
|
1609
|
+
const payload = item.payload;
|
|
1610
|
+
if (payload.role === "assistant" && Array.isArray(payload.content)) {
|
|
1611
|
+
if (payload.content.every((b) => typeof b === "object" && b !== null && "type" in b && (b.type === "text" || b.type === "thinking" || b.type === "redacted_thinking" || b.type === "tool_use" || b.type === "tool_result"))) {
|
|
1612
|
+
rollbackTrailingAssistantMessages$2(messages);
|
|
1613
|
+
messages.push({
|
|
1614
|
+
role: "assistant",
|
|
1615
|
+
content: payload.content
|
|
1616
|
+
});
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
break;
|
|
1621
|
+
}
|
|
1614
1622
|
}
|
|
1615
1623
|
const body = {
|
|
1616
1624
|
model: request.model,
|