FlowiseAI/Flowise · error · Error
Invalid JSON in the ChatOpenAI's BaseOptions: ${exception}
Error message
Invalid JSON in the ChatOpenAI's BaseOptions: ${exception} What it means
ChatOpenAI parses the BaseOptions input the same way as the other OpenAI-compatible nodes: if it is a string it is JSON.parse'd, and any SyntaxError is wrapped with this label. The parsed value becomes defaultHeaders under obj.configuration. An object input bypasses parsing.
Source
Thrown at packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts:285
delete obj.temperature
delete obj.stop
const reasoning: OpenAIClient.Reasoning = {}
if (reasoningEffort) {
reasoning.effort = reasoningEffort
}
if (reasoningSummary) {
reasoning.summary = reasoningSummary
}
obj.reasoning = reasoning
}
let parsedBaseOptions: any | undefined = undefined
if (baseOptions) {
try {
parsedBaseOptions = typeof baseOptions === 'object' ? baseOptions : JSON.parse(baseOptions)
} catch (exception) {
throw new Error("Invalid JSON in the ChatOpenAI's BaseOptions: " + exception)
}
}
if (basePath || parsedBaseOptions) {
obj.configuration = {
baseURL: basePath,
defaultHeaders: parsedBaseOptions
}
}
const multiModalOption: IMultiModalOption = {
image: {
allowImageUploads: allowImageUploads ?? false
}
}
const model = new ChatOpenAI(nodeData.id, obj)
model.setMultiModalOption(multiModalOption)View on GitHub (pinned to abe4a8601a)
Solutions
- Validate the BaseOptions string with a JSON parser before saving the node.
- Quote all keys/values with double quotes and drop trailing commas/comments.
- Prefer passing the node a plain object (the typeof === 'object' branch skips JSON.parse).
- Use a minimal example first ({"X-Custom":"value"}) and extend incrementally to isolate the bad token.
Example fix
// before
{ Authorization: "Bearer x", } // unquoted key + trailing comma -> throws [92]
// after
{ "Authorization": "Bearer x" } Defensive patterns
Strategy: validation
Validate before calling
function parseBaseOptions(raw) {
if (!raw) return undefined
if (typeof raw === 'object') return raw
try { return JSON.parse(raw) }
catch (e) { throw new Error(`ChatOpenAI BaseOptions JSON invalid: ${e.message}`) }
}
const parsedBaseOptions = parseBaseOptions(nodeData.inputs?.baseOptions) Type guard
function isHeadersObject(v: unknown): v is Record<string, string> {
if (typeof v !== 'object' || v === null || Array.isArray(v)) return false
return Object.values(v).every(x => typeof x === 'string')
} Try / catch
try {
return await initChatOpenAI(nodeData, options)
} catch (e) {
if (e.message.includes("Invalid JSON in the ChatOpenAI's BaseOptions")) {
throw new Error('Correct the BaseOptions JSON on the ChatOpenAI node, then redeploy.')
}
throw e
} Prevention
- JSON-lint header objects before saving.
- Use double quotes; no trailing commas; no comments.
- Pass an object literal when building the node in code.
- Keep BaseOptions minimal — only headers that OpenAI SDK does not natively accept.
When it happens
Trigger: The ChatOpenAI node's BaseOptions field holds invalid JSON — same shape of mistakes as [91] but on the primary ChatOpenAI node. The throw is reached only when baseOptions is a truthy string that fails to parse.
Common situations: Users configuring custom defaultHeaders (e.g. Helicone, Langfuse, OpenRouter passthrough) paste malformed JSON; copying header objects from Python dict syntax; trailing commas from a relaxed editor; smart quotes from a chat client.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- Invalid JSON in the ChatOpenAI's BaseOptions: ${exception}
- Invalid JSON in the ChatOpenRouter's BaseOptions: ${exceptio
- Invalid JSON in the ChatSambanova's BaseOptions: ${exception
- Invalid JSON in the BaseOptions: ${exception}
- Invalid JSON in the Chat NVIDIA NIM's baseOptions: ${excepti
AI-assisted analysis of FlowiseAI/Flowise@abe4a8601a (2026-08-12).
Data as JSON: /api/errors/6b27cf94f360b7ed.
Report an issue: GitHub.