@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;" />
183 lines (181 loc) • 7.21 kB
JavaScript
require("reflect-metadata");
const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
let _copilotkit_shared = require("@copilotkit/shared");
let _langchain_core_messages = require("@langchain/core/messages");
let _langchain_core_tools = require("@langchain/core/tools");
//#region src/service-adapters/langchain/utils.ts
function convertMessageToLangChainMessage(message) {
if (message.isTextMessage()) {
if (message.role == "user") return new _langchain_core_messages.HumanMessage(message.content);
else if (message.role == "assistant") return new _langchain_core_messages.AIMessage(message.content);
else if (message.role === "system") return new _langchain_core_messages.SystemMessage(message.content);
} else if (message.isActionExecutionMessage()) return new _langchain_core_messages.AIMessage({
content: "",
tool_calls: [{
id: message.id,
args: message.arguments,
name: message.name
}]
});
else if (message.isResultMessage()) return new _langchain_core_messages.ToolMessage({
content: message.result,
tool_call_id: message.actionExecutionId
});
}
function convertActionInputToLangChainTool(actionInput) {
return new _langchain_core_tools.DynamicStructuredTool({
...actionInput,
name: actionInput.name,
description: actionInput.description,
schema: (0, _copilotkit_shared.convertJsonSchemaToZodSchema)(JSON.parse(actionInput.jsonSchema), true),
func: async () => {
return "";
}
});
}
function isAIMessage(message) {
return Object.prototype.toString.call(message) === "[object AIMessage]";
}
function isAIMessageChunk(message) {
return Object.prototype.toString.call(message) === "[object AIMessageChunk]";
}
function isBaseMessageChunk(message) {
return Object.prototype.toString.call(message) === "[object BaseMessageChunk]";
}
function maybeSendActionExecutionResultIsMessage(eventStream$, actionExecution) {
if (actionExecution) eventStream$.sendActionExecutionResult({
actionExecutionId: actionExecution.id,
actionName: actionExecution.name,
result: "Sending a message"
});
}
async function streamLangChainResponse({ result, eventStream$, actionExecution }) {
if (typeof result === "string") if (!actionExecution || actionExecution?.returnDirect) {
eventStream$.sendActionExecutionResult({
actionExecutionId: actionExecution.id,
actionName: actionExecution.name,
result
});
eventStream$.sendTextMessage((0, _copilotkit_shared.randomId)(), result);
} else eventStream$.sendActionExecutionResult({
actionExecutionId: actionExecution.id,
actionName: actionExecution.name,
result
});
else if (isAIMessage(result)) {
maybeSendActionExecutionResultIsMessage(eventStream$, actionExecution);
if (result.content) eventStream$.sendTextMessage((0, _copilotkit_shared.randomId)(), result.content);
for (const toolCall of result.tool_calls) eventStream$.sendActionExecution({
actionExecutionId: toolCall.id || (0, _copilotkit_shared.randomId)(),
actionName: toolCall.name,
args: JSON.stringify(toolCall.args)
});
} else if (isBaseMessageChunk(result)) {
maybeSendActionExecutionResultIsMessage(eventStream$, actionExecution);
if (result.lc_kwargs?.content) eventStream$.sendTextMessage((0, _copilotkit_shared.randomId)(), result.content);
if (result.lc_kwargs?.tool_calls) for (const toolCall of result.lc_kwargs?.tool_calls) eventStream$.sendActionExecution({
actionExecutionId: toolCall.id || (0, _copilotkit_shared.randomId)(),
actionName: toolCall.name,
args: JSON.stringify(toolCall.args)
});
} else if (result && "getReader" in result) {
maybeSendActionExecutionResultIsMessage(eventStream$, actionExecution);
let reader = result.getReader();
let mode = null;
let currentMessageId;
const toolCallDetails = {
name: null,
id: null,
index: null,
prevIndex: null
};
while (true) try {
const { done, value } = await reader.read();
let toolCallName = void 0;
let toolCallId = void 0;
let toolCallArgs = void 0;
let hasToolCall = false;
let content = "";
if (value && value.content) content = Array.isArray(value.content) ? value.content[0]?.text ?? "" : value.content;
if (isAIMessageChunk(value)) {
let chunk = value.tool_call_chunks?.[0];
toolCallArgs = chunk?.args;
hasToolCall = chunk != void 0;
if (chunk?.name) toolCallDetails.name = chunk.name;
if (chunk?.index != null) {
toolCallDetails.index = chunk.index;
if (toolCallDetails.prevIndex == null) toolCallDetails.prevIndex = chunk.index;
}
if (chunk?.id) toolCallDetails.id = chunk.index != null ? `${chunk.id}-idx-${chunk.index}` : chunk.id;
toolCallName = toolCallDetails.name;
toolCallId = toolCallDetails.id;
} else if (isBaseMessageChunk(value)) {
let chunk = value.additional_kwargs?.tool_calls?.[0];
toolCallName = chunk?.function?.name;
toolCallId = chunk?.id;
toolCallArgs = chunk?.function?.arguments;
hasToolCall = chunk?.function != void 0;
}
if (mode === "message" && (toolCallId || done)) {
mode = null;
eventStream$.sendTextMessageEnd({ messageId: currentMessageId });
} else if (mode === "function" && (!hasToolCall || done)) {
mode = null;
eventStream$.sendActionExecutionEnd({ actionExecutionId: toolCallId });
}
if (done) break;
if (mode === null) {
if (hasToolCall && toolCallId && toolCallName) {
mode = "function";
eventStream$.sendActionExecutionStart({
actionExecutionId: toolCallId,
actionName: toolCallName,
parentMessageId: value.lc_kwargs?.id
});
} else if (content) {
mode = "message";
currentMessageId = (0, _copilotkit_shared.randomId)();
eventStream$.sendTextMessageStart({ messageId: currentMessageId });
}
}
if (mode === "message" && content) eventStream$.sendTextMessageContent({
messageId: currentMessageId,
content
});
else if (mode === "function" && toolCallArgs) {
if (toolCallDetails.index !== toolCallDetails.prevIndex) {
eventStream$.sendActionExecutionEnd({ actionExecutionId: toolCallId });
eventStream$.sendActionExecutionStart({
actionExecutionId: toolCallId,
actionName: toolCallName,
parentMessageId: value.lc_kwargs?.id
});
toolCallDetails.prevIndex = toolCallDetails.index;
}
eventStream$.sendActionExecutionArgs({
actionExecutionId: toolCallId,
args: toolCallArgs
});
}
} catch (error) {
console.error("Error reading from stream", error);
break;
}
} else if (actionExecution) eventStream$.sendActionExecutionResult({
actionExecutionId: actionExecution.id,
actionName: actionExecution.name,
result: encodeResult(result)
});
else throw new Error("Invalid return type from LangChain function.");
eventStream$.complete();
}
function encodeResult(result) {
if (result === void 0) return "";
else if (typeof result === "string") return result;
else return JSON.stringify(result);
}
//#endregion
exports.convertActionInputToLangChainTool = convertActionInputToLangChainTool;
exports.convertMessageToLangChainMessage = convertMessageToLangChainMessage;
exports.streamLangChainResponse = streamLangChainResponse;
//# sourceMappingURL=utils.cjs.map