What happened?
gbrain sync and gbrain embed ignore the Voyage AI embedding config specified in config.json and hardcode OpenAI (openai:text-embedding-3-large) for all embedding operations. When no OPENAI_API_KEY is set, all files fail with OpenAI embedding requires OPENAI_API_KEY. This blocks the entire sync pipeline — files are never imported because the embed step fails before import completes.
gbrain import
--no-embed works as a workaround to import files without embeddings, but gbrain embed --stale (run separately to create embeddings) also fails with the same OpenAI error, so embeddings can never be created.
What did you expect?
When config.json specifies "provider": "voyage" and VOYAGE_API_KEY is set in the env, both gbrain sync and gbrain embed should use Voyage AI for embeddings.
Steps to reproduce
- Configure gBrain with Voyage AI in ~/.gbrain/config.json: "provider": "voyage", "model": "voyage-4-large". Set VOYAGE_API_KEY in ~/.gbrain/.env. Do NOT set OPENAI_API_KEY.
- Run gbrain sync --full
- All files fail with OpenAI embedding requires OPENAI_API_KEY. — sync is blocked, no files are imported.
Environment
- gbrain version: 0.32.0
- OS: Linux 6.8.0-110-generic x86_64
- Bun version: 1.3.13
- Database: self-hosted Postgres (schema v50, pgvector)
gbrain doctor --json output
{"schema_version":2,"status":"warnings","health_score":90,"checks":[{"name":"sync_failures","status":"ok","message":"139 historical sync failure(s), all acknowledged [UNKNOWN=139]."},{"name":"connection","status":"ok","message":"Connected, 264 pages"},{"name":"pgvector","status":"ok","message":"Extension installed"},{"name":"embeddings","status":"ok","message":"100% coverage, 0 missing"},{"name":"embedding_provider","status":"ok","message":"Skipped (no provider credentials). Model: openai:text-embedding-3-large."},{"name":"alternative_providers","status":"ok","message":"Detected 1 alternative embedding provider ready to use: voyage. Run gbrain providers list to switch."},{"name":"brain_score","status":"ok","message":"Brain score 78/100 (embed 35/35, links 22/25, timeline 1/15, orphans 10/15, dead-links 10/10)"}]}
Key evidence from doctor:
- embedding_provider: Skipped (no provider credentials). Model: openai:text-embedding-3-large.
- alternative_providers: Detected 1 alternative embedding provider ready to use: voyage.
The doctor detects Voyage as ready including the API key but the sync/embed pipelines don't use it.
What happened?
gbrain sync and gbrain embed ignore the Voyage AI embedding config specified in config.json and hardcode OpenAI (openai:text-embedding-3-large) for all embedding operations. When no OPENAI_API_KEY is set, all files fail with OpenAI embedding requires OPENAI_API_KEY. This blocks the entire sync pipeline — files are never imported because the embed step fails before import completes.
gbrain import
--no-embed works as a workaround to import files without embeddings, but gbrain embed --stale (run separately to create embeddings) also fails with the same OpenAI error, so embeddings can never be created.What did you expect?
When config.json specifies "provider": "voyage" and VOYAGE_API_KEY is set in the env, both gbrain sync and gbrain embed should use Voyage AI for embeddings.
Steps to reproduce
Environment
gbrain doctor --jsonoutput{"schema_version":2,"status":"warnings","health_score":90,"checks":[{"name":"sync_failures","status":"ok","message":"139 historical sync failure(s), all acknowledged [UNKNOWN=139]."},{"name":"connection","status":"ok","message":"Connected, 264 pages"},{"name":"pgvector","status":"ok","message":"Extension installed"},{"name":"embeddings","status":"ok","message":"100% coverage, 0 missing"},{"name":"embedding_provider","status":"ok","message":"Skipped (no provider credentials). Model: openai:text-embedding-3-large."},{"name":"alternative_providers","status":"ok","message":"Detected 1 alternative embedding provider ready to use: voyage. Run gbrain providers list to switch."},{"name":"brain_score","status":"ok","message":"Brain score 78/100 (embed 35/35, links 22/25, timeline 1/15, orphans 10/15, dead-links 10/10)"}]} Key evidence from doctor: - embedding_provider: Skipped (no provider credentials). Model: openai:text-embedding-3-large. - alternative_providers: Detected 1 alternative embedding provider ready to use: voyage. The doctor detects Voyage as ready including the API key but the sync/embed pipelines don't use it.