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 {