UNPKG

@arizeai/phoenix-client

Version:

A client for the Phoenix API

336 lines 12.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.openAIToolDefinitionToVercelAI = exports.openAIToolDefinitionToAnthropic = exports.openAIToolChoiceToVercelAI = exports.openAIToolChoiceToAnthropic = exports.openAIToolCallToAnthropic = exports.openAIMessageToVercelAI = exports.openAIMessageToPhoenixPrompt = exports.openAIMessageToAnthropic = exports.openAIChatPartToAnthropic = void 0; const assertUnreachable_1 = require("../../../utils/assertUnreachable"); const isObject_1 = require("../../../utils/isObject"); const messagePartSchemas_1 = require("../phoenixPrompt/messagePartSchemas"); const messagePartSchemas_2 = require("./messagePartSchemas"); const messageSchemas_1 = require("./messageSchemas"); const toolCallSchemas_1 = require("./toolCallSchemas"); const toolChoiceSchemas_1 = require("./toolChoiceSchemas"); const toolSchemas_1 = require("./toolSchemas"); const tiny_invariant_1 = __importDefault(require("tiny-invariant")); exports.openAIChatPartToAnthropic = messagePartSchemas_2.openaiChatPartSchema.transform((openai) => { var _a, _b, _c; const type = openai.type; switch (type) { case "text": return { type: "text", text: openai.text }; case "image_url": { if (!openai.image_url.url.startsWith("data:image/")) { return null; } let mediaType = (_c = (_b = (_a = openai.image_url.url) === null || _a === void 0 ? void 0 : _a.split(";")) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.split("/")[1]; if (mediaType !== "jpeg" && mediaType !== "jpg" && mediaType !== "png" && mediaType !== "gif" && mediaType !== "webp") { return null; } if (mediaType === "jpg") { mediaType = "jpeg"; } return { type: "image", source: { data: openai.image_url.url, media_type: `image/${mediaType}`, type: "base64", }, }; } default: return (0, assertUnreachable_1.assertUnreachable)(type); } }); /** * Hub → Spoke: Convert an OpenAI message to Anthropic format */ exports.openAIMessageToAnthropic = messageSchemas_1.openAIMessageSchema.transform((openai) => { var _a, _b; let role = openai.role; const content = []; // convert all roles except assistant to user if (openai.role !== "assistant") { role = "user"; } (0, tiny_invariant_1.default)(role === "user" || role === "assistant", `Unexpected openai role: ${role}`); if (typeof openai.content === "string" && openai.role !== "tool") { content.push({ type: "text", text: openai.content }); } else if (Array.isArray(openai.content)) { openai.content.forEach((part) => { if (part.type === "text" || part.type === "image_url") { const parsedPart = exports.openAIChatPartToAnthropic.parse(part); if (parsedPart) { content.push(parsedPart); } } }); } let toolCallParts = []; if (openai.role === "assistant" && "tool_calls" in openai) { toolCallParts = (_b = (_a = openai.tool_calls) === null || _a === void 0 ? void 0 : _a.map((tc) => exports.openAIToolCallToAnthropic.parse(tc))) !== null && _b !== void 0 ? _b : []; } if (toolCallParts.length > 0) { toolCallParts.forEach((tc) => { content.push(tc); }); } if (openai.role === "tool") { content.push({ type: "tool_result", tool_use_id: openai.tool_call_id, content: openai.content, }); } return { role, content, }; }); /** * Hub → Spoke: Convert an OpenAI message to Prompt format */ exports.openAIMessageToPhoenixPrompt = messageSchemas_1.openAIMessageSchema.transform((openai) => { const content = []; // Special handling for tool messages if (openai.role === "tool" && openai.tool_call_id) { const toolResultPart = (0, messagePartSchemas_1.makeToolResultPart)(openai.tool_call_id, openai.content); if (toolResultPart) { content.push(toolResultPart); } return { role: "tool", content, }; } // Convert content to text part if it exists if (typeof openai.content === "string") { const textPart = (0, messagePartSchemas_1.makeTextPart)(openai.content); if (textPart) { content.push(textPart); } } else if (Array.isArray(openai.content)) { openai.content.forEach((part) => { if (part.type === "text") { const textPart = (0, messagePartSchemas_1.makeTextPart)(part.text); if (textPart) { content.push(textPart); } } }); } // Convert tool calls if they exist if (openai.role === "assistant" && openai.tool_calls) { openai.tool_calls.forEach((tc) => { const toolCallPart = { type: "tool_call", tool_call_id: tc.id, tool_call: { type: "function", name: tc.function.name, arguments: tc.function.arguments, }, }; if (toolCallPart) { content.push(toolCallPart); } }); } // Map roles const roleMap = { system: "SYSTEM", user: "USER", assistant: "AI", tool: "TOOL", developer: "SYSTEM", // Map developer to SYSTEM function: "TOOL", // Map function to TOOL }; return { role: roleMap[openai.role], content, }; }); /** * Spoke → Hub: Convert a Prompt message to AI format */ exports.openAIMessageToVercelAI = messageSchemas_1.openAIMessageSchema.transform((openai) => { var _a, _b; const role = openai.role; switch (role) { case "developer": case "system": // take the first text part, or use string content if it exists return { role: "system", content: typeof openai.content === "string" ? openai.content : ((_b = (_a = openai.content.find((part) => part.type === "text")) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : ""), }; case "user": // take text and image parts, ignore other parts return { role: "user", content: typeof openai.content === "string" ? openai.content : openai.content .filter((part) => part.type === "text" || part.type === "image_url") .map((part) => { if (part.type === "text") { return { type: "text", text: part.text, }; } if (part.type === "image_url") { return { type: "image", image: part.image_url.url, }; } return (0, assertUnreachable_1.assertUnreachable)(part); }), }; case "assistant": { // take text any parts, convert tool calls to tool call parts, ignore other parts const newContent = []; // take all text parts from openai message if (typeof openai.content === "string") { newContent.push({ type: "text", text: openai.content }); } else { openai.content.forEach((part) => { if (part.type === "text") { newContent.push({ type: "text", text: part.text }); } }); } // add any tool calls if (openai.tool_calls) { openai.tool_calls.forEach((tc) => { newContent.push({ type: "tool-call", toolCallId: tc.id, toolName: tc.function.name, input: tc.function.arguments, }); }); } return { role: "assistant", content: newContent, }; } case "tool": { const newContent = []; if (typeof openai.content === "string") { newContent.push({ type: "tool-result", toolCallId: openai.tool_call_id, toolName: "", // We don't have this?? output: { type: "text", value: openai.content }, }); } else { openai.content.forEach((part) => { if (part.type === "text") { newContent.push({ type: "tool-result", toolCallId: openai.tool_call_id, toolName: "", // We don't have this?? output: { type: "text", value: part.text, }, }); return; } (0, assertUnreachable_1.assertUnreachable)(part.type); }); } return { role: "tool", content: newContent, }; } case "function": // eslint-disable-next-line no-console console.warn("Function role not supported in Vercel AI SDK"); return { role: "tool", content: [], }; default: (0, assertUnreachable_1.assertUnreachable)(role); } }); /** * Parse incoming object as an OpenAI tool call and immediately convert to Anthropic format */ exports.openAIToolCallToAnthropic = toolCallSchemas_1.openAIToolCallSchema.transform((openai) => ({ id: openai.id, type: "tool_use", name: openai.function.name, input: openai.function.arguments, })); exports.openAIToolChoiceToAnthropic = toolChoiceSchemas_1.openAIToolChoiceSchema.transform((openAI) => { if ((0, isObject_1.isObject)(openAI)) { return { type: "tool", name: openAI.function.name }; } switch (openAI) { case "auto": return { type: "auto" }; case "none": return { type: "auto" }; case "required": return { type: "any" }; default: (0, assertUnreachable_1.assertUnreachable)(openAI); } }); exports.openAIToolChoiceToVercelAI = toolChoiceSchemas_1.openAIToolChoiceSchema.transform((openAI) => { if ((0, isObject_1.isObject)(openAI)) { return { type: "tool", toolName: openAI.function.name }; } switch (openAI) { case "auto": return "auto"; case "none": return "none"; case "required": return "required"; default: (0, assertUnreachable_1.assertUnreachable)(openAI); } }); /** * Parse incoming object as an OpenAI tool call and immediately convert to Anthropic format */ exports.openAIToolDefinitionToAnthropic = toolSchemas_1.openAIToolDefinitionSchema.transform((openai) => { var _a; return ({ name: openai.function.name, description: (_a = openai.function.description) !== null && _a !== void 0 ? _a : openai.function.name, input_schema: openai.function.parameters, }); }); /** * Parse incoming object as an OpenAI tool definition and immediately convert to Vercel AI format */ exports.openAIToolDefinitionToVercelAI = toolSchemas_1.openAIToolDefinitionSchema.transform((openai) => ({ type: "function", description: openai.function.description, inputSchema: { _type: undefined, jsonSchema: openai.function.parameters, validate: undefined, }, })); //# sourceMappingURL=converters.js.map