can1357/oh-my-pi · error · Error

${response.errorMessage ?? "provider error"}

Error message

${response.errorMessage ?? "provider error"}

What it means

generateChangelogEntries() calls the LLM to draft changelog entries; if the response's stopReason is "error", the raw provider error message is rethrown as an Error (defaulting to "provider error" when errorMessage is absent). This propagates transport/auth/model failures from the changelog-generation call.

Source

Thrown at packages/coding-agent/src/commit/changelog/generate.ts:71

		is_package_changelog: isPackageChangelog,
		existing_entries: existingEntries,
		stat,
		diff,
	});
	const response = await retryTransientCompletion(() =>
		completeSimple(
			model,
			{
				systemPrompt: [prompt.render(changelogSystemPrompt)],
				messages: [{ role: "user", content: userContent, timestamp: Date.now() }],
				tools: [changelogTool],
			},
			{ apiKey, maxTokens: 1200, reasoning: toReasoningEffort(thinkingLevel) },
		),
	);

	if (response.stopReason === "error") {
		throw new Error(response.errorMessage ?? "provider error");
	}

	const parsed = parseChangelogResponse(response);
	return { entries: dedupeEntries(parsed.entries) };
}

function parseChangelogResponse(message: AssistantMessage): ChangelogGenerationResult {
	const toolCall = extractToolCall(message, "create_changelog_entries");
	if (toolCall) {
		const parsed = validateToolCall([changelogTool], toolCall) as typeof changelogTool.parameters.infer;
		return { entries: parsed.entries ?? {} };
	}

	const text = extractTextContent(message);
	const parsed = parseJsonPayload(text) as ChangelogGenerationResult;
	return { entries: parsed.entries ?? {} };
}

View on GitHub (pinned to 9690622007)

Solutions

  1. Read the embedded errorMessage — it names the provider-side cause (auth, 429, model id)
  2. Verify the provider API key is set and valid
  3. Retry — rate-limit and transient network errors are often temporary
  4. Use --no-changelog or a different model to bypass changelog generation

Example fix

// before
const apiKey = process.env.PI_API_KEY; // undefined -> provider error
// after
if (!apiKey) throw new Error("Set PI_API_KEY before generating changelog");
Defensive patterns

Strategy: retry

Validate before calling

if (!apiKey) throw new Error("Changelog generation skipped: no API key configured");

Try / catch

try {
  const { entries } = await generateChangelogEntries(...);
} catch (err) {
  logger.warn("Changelog generation failed", { cause: err.message });
  // proceed without changelog or run with --no-changelog
}

Prevention

When it happens

Trigger: The changelog LLM request completes with stopReason === "error" — invalid/missing apiKey, network failure, model not found, rate limit, or context overflow with maxTokens: 1200.

Common situations: Expired or unset provider API key; network outage; selected model unavailable; request exceeding provider rate limits during bulk commits.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/f32aa61b22e2fd00. Report an issue: GitHub.