diff --git a/src/adapter/openai-to-cli.ts b/src/adapter/openai-to-cli.ts index c8ecaa1..89a80da 100644 --- a/src/adapter/openai-to-cli.ts +++ b/src/adapter/openai-to-cli.ts @@ -46,6 +46,27 @@ export function extractModel(model: string): ClaudeModel { return "opus"; } +/** + * Extract text content from OpenAI message content. + * + * OpenAI API supports both string content and array-style content blocks + * (e.g. [{"type": "text", "text": "..."}]). When content is an array, + * naive string interpolation produces "[object Object]". This helper + * extracts the actual text from both formats. + */ +function extractContent(content: string | Array<{type: string; text?: string}>): string { + if (typeof content === "string") { + return content; + } + if (Array.isArray(content)) { + return content + .filter((block) => block.type === "text") + .map((block) => block.text ?? "") + .join("\n"); + } + return String(content ?? ""); +} + /** * Convert OpenAI messages array to a single prompt string for Claude CLI * @@ -59,17 +80,17 @@ export function messagesToPrompt(messages: OpenAIChatRequest["messages"]): strin switch (msg.role) { case "system": // System messages become context instructions - parts.push(`\n${msg.content}\n\n`); + parts.push(`\n${extractContent(msg.content)}\n\n`); break; case "user": // User messages are the main prompt - parts.push(msg.content); + parts.push(extractContent(msg.content)); break; case "assistant": // Previous assistant responses for context - parts.push(`\n${msg.content}\n\n`); + parts.push(`\n${extractContent(msg.content)}\n\n`); break; } }