@arizeai/phoenix-client
Version:
A client for the Phoenix API
336 lines • 12.7 kB
JavaScript
;
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