@copilotkit/runtime
Version:
<img src="https://github.com/user-attachments/assets/0a6b64d9-e193-4940-a3f6-60334ac34084" alt="banner" style="border-radius: 12px; border: 2px solid #d6d4fa;" />
142 lines (140 loc) • 4.43 kB
JavaScript
require("reflect-metadata");
//#region src/service-adapters/anthropic/utils.ts
function limitMessagesToTokenCount(messages, tools, model, maxTokens) {
maxTokens ||= MAX_TOKENS;
const result = [];
const toolsNumTokens = countToolsTokens(model, tools);
if (toolsNumTokens > maxTokens) throw new Error(`Too many tokens in function definitions: ${toolsNumTokens} > ${maxTokens}`);
maxTokens -= toolsNumTokens;
for (const message of messages) if (message.role === "system") {
const numTokens = countMessageTokens(model, message);
maxTokens -= numTokens;
if (maxTokens < 0) throw new Error("Not enough tokens for system message.");
}
let cutoff = false;
const reversedMessages = [...messages].toReversed();
for (const message of reversedMessages) {
if (message.role === "system") {
result.unshift(message);
continue;
} else if (cutoff) continue;
let numTokens = countMessageTokens(model, message);
if (maxTokens < numTokens) {
cutoff = true;
continue;
}
result.unshift(message);
maxTokens -= numTokens;
}
const toolUseIds = /* @__PURE__ */ new Set();
for (const msg of result) if (msg.role === "assistant" && Array.isArray(msg.content)) {
for (const block of msg.content) if (block.type === "tool_use") toolUseIds.add(block.id);
}
const toolResultIds = /* @__PURE__ */ new Set();
for (const msg of result) if (msg.role === "user" && Array.isArray(msg.content)) {
for (const block of msg.content) if (block.type === "tool_result") toolResultIds.add(block.tool_use_id);
}
const filtered = [];
for (const msg of result) if (msg.role === "user" && Array.isArray(msg.content)) {
const remaining = msg.content.filter((block) => block.type !== "tool_result" || toolUseIds.has(block.tool_use_id));
if (remaining.length === 0) continue;
if (remaining.length !== msg.content.length) filtered.push({
...msg,
content: remaining
});
else filtered.push(msg);
} else if (msg.role === "assistant" && Array.isArray(msg.content)) {
const remaining = msg.content.filter((block) => block.type !== "tool_use" || toolResultIds.has(block.id));
if (remaining.length === 0) continue;
if (remaining.length !== msg.content.length) filtered.push({
...msg,
content: remaining
});
else filtered.push(msg);
} else filtered.push(msg);
return filtered;
}
const MAX_TOKENS = 128e3;
function countToolsTokens(model, tools) {
if (tools.length === 0) return 0;
return countTokens(model, JSON.stringify(tools));
}
function countMessageTokens(model, message) {
return countTokens(model, JSON.stringify(message.content) || "");
}
function countTokens(model, text) {
return text.length / 3;
}
function convertActionInputToAnthropicTool(action) {
return {
name: action.name,
description: action.description,
input_schema: JSON.parse(action.jsonSchema)
};
}
function convertMessageToAnthropicMessage(message) {
if (message.isTextMessage()) if (message.role === "system") return {
role: "assistant",
content: [{
type: "text",
text: "THE FOLLOWING MESSAGE IS A SYSTEM MESSAGE: " + message.content
}]
};
else return {
role: message.role === "user" ? "user" : "assistant",
content: [{
type: "text",
text: message.content
}]
};
else if (message.isImageMessage()) {
let mediaType;
switch (message.format) {
case "jpeg":
mediaType = "image/jpeg";
break;
case "png":
mediaType = "image/png";
break;
case "webp":
mediaType = "image/webp";
break;
case "gif":
mediaType = "image/gif";
break;
default: throw new Error(`Unsupported image format: ${message.format}`);
}
return {
role: "user",
content: [{
type: "image",
source: {
type: "base64",
media_type: mediaType,
data: message.bytes
}
}]
};
} else if (message.isActionExecutionMessage()) return {
role: "assistant",
content: [{
id: message.id,
type: "tool_use",
input: message.arguments,
name: message.name
}]
};
else if (message.isResultMessage()) return {
role: "user",
content: [{
type: "tool_result",
content: message.result || "Action completed successfully",
tool_use_id: message.actionExecutionId
}]
};
}
//#endregion
exports.convertActionInputToAnthropicTool = convertActionInputToAnthropicTool;
exports.convertMessageToAnthropicMessage = convertMessageToAnthropicMessage;
exports.limitMessagesToTokenCount = limitMessagesToTokenCount;
//# sourceMappingURL=utils.cjs.map