Summary
When the harness is Goose and the provider is OpenAI-compatible, Buzz passes its own internal provider identifier straight through as GOOSE_PROVIDER:
GOOSE_PROVIDER=openai-compat
Goose has no such provider. Its engine identifiers are openai, openai_compatible, anthropic, anthropic_compatible, ollama, ollama_compatible — underscored and unabbreviated. Critically, the env var also overrides whatever is configured in ~/.config/goose/config.yaml, so a working Goose install stops working the moment Buzz drives it.
Symptom
Every turn fails with a message about a completely different tool:
Turn error · error: The agent's harness reported an internal error. For Codex agents this can mean the configured model isn't supported by your installed codex-acp — check the model in ~/.codex/config.toml or upgrade the adapter (brew upgrade codex-acp).
codex-acp was not installed on this machine and the harness was Goose. In the agent log it appears only as:
WARN buzz_acp: agent_returned (application error — pipe intact) agent=0 outcome="error"
configured_model=glm-5.2 error=Agent reported error (code -32603): Internal error
Reproduce
GOOSE_PROVIDER=openai-compat GOOSE_MODEL=<model> goose run -t "say hi"
# error: Error Unknown provider: openai-compat.
GOOSE_PROVIDER=zai GOOSE_MODEL=<model> goose run -t "say hi"
# Hi there! 👋 How can I help you today?
Goose itself works standalone with its own config; it fails only under Buzz, because of the injected variable.
Diagnosis
Not visible from the UI or logs. I had to replace the Goose binary with a shim that tee'd the spawned process's environment, which showed GOOSE_PROVIDER=openai-compat being injected.
Note BUZZ_ACP_AGENT_COMMAND is forwarded to the child but not acted on — Buzz manages its own Goose binary — so it cannot be used to interpose a wrapper.
Suggested fix
Translate Buzz's internal provider id to the target harness's vocabulary before injecting it, or omit GOOSE_PROVIDER entirely and let Goose use its own configured active_provider. The current behaviour silently overrides a valid local configuration with an invalid value.
Impact
Anyone selecting OpenAI-compatible with the Goose harness — i.e. any third-party or self-hosted model endpoint. The error text actively misdirects toward Codex.
Environment
- Buzz Desktop 0.5.x, macOS arm64
- Goose 1.45.0
- Relay: self-hosted, built from source
Related
Same family as #3636, #4278 and #3824 — internally-known information that never reaches the operator.
Summary
When the harness is Goose and the provider is OpenAI-compatible, Buzz passes its own internal provider identifier straight through as
GOOSE_PROVIDER:Goose has no such provider. Its engine identifiers are
openai,openai_compatible,anthropic,anthropic_compatible,ollama,ollama_compatible— underscored and unabbreviated. Critically, the env var also overrides whatever is configured in~/.config/goose/config.yaml, so a working Goose install stops working the moment Buzz drives it.Symptom
Every turn fails with a message about a completely different tool:
codex-acpwas not installed on this machine and the harness was Goose. In the agent log it appears only as:Reproduce
Goose itself works standalone with its own config; it fails only under Buzz, because of the injected variable.
Diagnosis
Not visible from the UI or logs. I had to replace the Goose binary with a shim that tee'd the spawned process's environment, which showed
GOOSE_PROVIDER=openai-compatbeing injected.Note
BUZZ_ACP_AGENT_COMMANDis forwarded to the child but not acted on — Buzz manages its own Goose binary — so it cannot be used to interpose a wrapper.Suggested fix
Translate Buzz's internal provider id to the target harness's vocabulary before injecting it, or omit
GOOSE_PROVIDERentirely and let Goose use its own configuredactive_provider. The current behaviour silently overrides a valid local configuration with an invalid value.Impact
Anyone selecting OpenAI-compatible with the Goose harness — i.e. any third-party or self-hosted model endpoint. The error text actively misdirects toward Codex.
Environment
Related
Same family as #3636, #4278 and #3824 — internally-known information that never reaches the operator.