diff --git a/src/adapter/openai-to-cli.ts b/src/adapter/openai-to-cli.ts index c8ecaa1..1c58510 100644 --- a/src/adapter/openai-to-cli.ts +++ b/src/adapter/openai-to-cli.ts @@ -2,7 +2,7 @@ * Converts OpenAI chat request format to Claude CLI input */ -import type { OpenAIChatRequest } from "../types/openai.js"; +import type { OpenAIChatRequest, OpenAIContentPart } from "../types/openai.js"; export type ClaudeModel = "opus" | "sonnet" | "haiku"; @@ -46,6 +46,28 @@ export function extractModel(model: string): ClaudeModel { return "opus"; } +/** + * Extract text from an OpenAI content field. + * + * The OpenAI Chat API accepts `content` as either a plain string or an array + * of content parts (e.g. `[{ type: "text", text: "hello" }]`). Many upstream + * callers (OpenClaw, LiteLLM, …) send the array form even for text-only + * messages. This helper normalises both representations to a single string. + */ +function extractContent(content: string | OpenAIContentPart[]): string { + if (typeof content === "string") { + return content; + } + if (Array.isArray(content)) { + return content + .filter((part): part is OpenAIContentPart & { text: string } => + part.type === "text" && typeof part.text === "string") + .map((part) => part.text) + .join("\n"); + } + return String(content ?? ""); +} + /** * Convert OpenAI messages array to a single prompt string for Claude CLI * @@ -56,20 +78,21 @@ export function messagesToPrompt(messages: OpenAIChatRequest["messages"]): strin const parts: string[] = []; for (const msg of messages) { + const text = extractContent(msg.content); switch (msg.role) { case "system": // System messages become context instructions - parts.push(`\n${msg.content}\n\n`); + parts.push(`\n${text}\n\n`); break; case "user": // User messages are the main prompt - parts.push(msg.content); + parts.push(text); break; case "assistant": // Previous assistant responses for context - parts.push(`\n${msg.content}\n\n`); + parts.push(`\n${text}\n\n`); break; } } diff --git a/src/types/openai.ts b/src/types/openai.ts index c116658..15360a4 100644 --- a/src/types/openai.ts +++ b/src/types/openai.ts @@ -3,9 +3,15 @@ * Used for Clawdbot integration */ +export interface OpenAIContentPart { + type: "text" | "image_url"; + text?: string; + image_url?: { url: string; detail?: string }; +} + export interface OpenAIChatMessage { role: "system" | "user" | "assistant"; - content: string; + content: string | OpenAIContentPart[]; } export interface OpenAIChatRequest {