earendil-works/pi · error

Invalid Mistral streaming event

Error message

Invalid Mistral streaming event

What it means

Error "Invalid Mistral streaming event" thrown in earendil-works/pi.

Source

Thrown at packages/ai/src/api/mistral-conversations.ts:498

function findMistralEventBoundary(buffer: string): { index: number; length: number } | undefined {
	const match = /\r\n\r\n|\r\n\r|\r\n\n|\r\r\n|\n\r\n|\r\r|\n\r|\n\n/u.exec(buffer);
	return match?.index === undefined ? undefined : { index: match.index, length: match[0].length };
}

function parseMistralEvent(raw: string): MistralCompletionEvent | typeof MISTRAL_STREAM_DONE | undefined {
	const data = raw
		.split(/\r\n|\r|\n/u)
		.filter((line) => line.startsWith("data:"))
		.map((line) => line.slice(5).trimStart())
		.join("\n")
		.trim();
	if (!data) return undefined;
	if (data === "[DONE]") return MISTRAL_STREAM_DONE;

	const parsed: unknown = JSON.parse(data);
	if (!isMistralRecord(parsed) || !Array.isArray(parsed.choices)) {
		throw new Error("Invalid Mistral streaming event");
	}
	return { data: parsed as MistralCompletionEvent["data"] };
}

function buildChatPayload(
	model: Model<"mistral-conversations">,
	context: Context,
	messages: Message[],
	options?: MistralOptions,
): MistralChatPayload {
	const payload: MistralChatPayload = {
		model: model.id,
		stream: true,
		messages: toChatMessages(messages, model.input.includes("image")),
	};

	if (context.tools?.length) payload.tools = toFunctionTools(context.tools);
	if (options?.temperature !== undefined) payload.temperature = options.temperature;

View on GitHub (pinned to 4af9d21d3b)

Solutions

  1. Log the raw event; update the parser if Mistral changed the streaming event shape.

When it happens

Trigger: Thrown at packages/ai/src/api/mistral-conversations.ts:498 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of earendil-works/pi@4af9d21d3b (2026-08-24). Data as JSON: /api/errors/bf9da07291490058. Report an issue: GitHub.