mirror of
https://github.com/garrytan/gbrain.git
synced 2026-07-28 06:23:01 +00:00
Addresses the report in #2662: buildGatewayConfig folded openai_api_key, anthropic_api_key, zeroentropy_api_key and openrouter_api_key from ~/.gbrain/config.json into the gateway env, but not voyage_api_key. In launchd/daemon/MCP contexts (no process-env export), multimodal/image embeds with Voyage failed silently even though config.json looked complete. - build-gateway-config.ts: fold voyage_api_key -> VOYAGE_API_KEY, mirroring the existing zeroentropy/openrouter fold (process.env still wins). - config.ts: add the voyage_api_key file-plane field to GBrainConfig and KNOWN_CONFIG_KEYS. - brain-score-recommendations.ts: HOSTED_EMBED_KEY_CONFIG now maps VOYAGE_API_KEY -> voyage_api_key so doctor/autopilot judge a config-keyed Voyage brain as usable instead of dispatching a doomed embed job. - autopilot.ts: the HOSTED_EMBED_KEY_CONFIG producer closure now resolves hosted keys via the same file-plane source (loadConfigFileOnly) doctor already uses, instead of the DB plane (engine.getConfig) - the DB plane is never threaded into buildGatewayConfig for these fields, so reading it here would let a DB-only key report "configured" while the gateway still has no key. This also tightens the pre-existing openai/zeroentropy path, not just voyage. - Tests: fold + env-precedence tests in build-gateway-config.test.ts, HOSTED_EMBED_KEY_CONFIG map test, and a real end-to-end regression in brain-score-recommendations.test.ts through loadConfigFileOnly() and buildGatewayConfig() with an actual temp config.json. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>