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;
}
}