@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 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 inputTokens = num(raw.input_tokens);
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
- inputTokens,
1070
+ uncachedInputTokens,
1071
1071
  cacheWriteInputTokens,
1072
1072
  cachedInputTokens
1073
1073
  ].filter((n) => n !== void 0);
1074
- const summedInput = inputParts.length > 0 ? inputParts.reduce((sum, n) => sum + n, 0) : void 0;
1075
- const totalTokens = summedInput !== void 0 && outputTokens !== void 0 ? summedInput + outputTokens : void 0;
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 (inputTokens !== void 0 || cacheWriteInputTokens !== void 0) billableInputTokens = (inputTokens ?? 0) + (cacheWriteInputTokens ?? 0);
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) switch (item.type) {
1544
- case "message": {
1545
- const role = item.role === "user" ? "user" : "assistant";
1546
- const supportedContent = ensureMessagesTextBlocks(item.content, `input message (${item.role}) content`);
1547
- if (supportedContent.length === 1 && supportedContent[0]?.type === "text") messages.push({
1548
- role,
1549
- content: supportedContent[0].text
1550
- });
1551
- else messages.push({
1552
- role,
1553
- content: supportedContent.map(canonicalToMessagesBlock)
1554
- });
1555
- break;
1556
- }
1557
- case "tool_call": {
1558
- const lastMsg = messages[messages.length - 1];
1559
- const toolBlock = {
1560
- type: "tool_use",
1561
- id: item.id,
1562
- name: item.name,
1563
- input: item.argumentsJson ?? parseToolUseInput(item.argumentsText)
1564
- };
1565
- if (lastMsg && lastMsg.role === "assistant" && typeof lastMsg.content !== "string") lastMsg.content.push(toolBlock);
1566
- else messages.push({
1567
- role: "assistant",
1568
- content: [toolBlock]
1569
- });
1570
- break;
1571
- }
1572
- case "tool_result": {
1573
- assertMessagesToolResultOutcome(item.outcome);
1574
- const content = ensureMessagesTextBlocks(item.content, `tool_result ${item.callId} content`).map(blockToText).join("\n");
1575
- const block = {
1576
- type: "tool_result",
1577
- tool_use_id: item.callId,
1578
- content,
1579
- is_error: item.outcome === "error"
1580
- };
1581
- messages.push({
1582
- role: "user",
1583
- content: [block]
1584
- });
1585
- break;
1586
- }
1587
- case "reasoning": {
1588
- const block = {
1589
- type: "thinking",
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
- break;
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,