v1.0
Production-Ready: BYOK LLM Keys, Three New Connectors, SDK 1.4, and Security Hardening
Added
- Per-org LLM API key (BYOK): organizations can now add and rotate their own OpenAI API key in Organization Settings. Keys are encrypted at rest with KMS envelope encryption (AES-256-GCM, per-tenant context binding). Paid tiers (Team/Growth/Enterprise) receive 100 lifetime fallback synthesis calls on Gateco's shared key; free-tier orgs must configure their own key.
- Milvus, Chroma, and OpenSearch connector guides added: setup documentation now covers all 12 supported vector databases.
- Azure AI Search connector guide: step-by-step setup for Microsoft Azure Cognitive Search with RRF hybrid search and ranked BM25 keyword search.
- Vertex AI Vector Search and Vertex AI Search connector guides: covers Google Cloud's two distinct vector search products with capability comparison.
- Stripe subscription re-sync: "Plan not updated? Verify now" button on the Usage & Billing page triggers a manual subscription re-check for cases where a Stripe webhook was missed.
- Batch Access Simulator: test up to 5 principals simultaneously against a connector in a single preview run. Matrix view shows allow/deny per principal.
- Dashboard 7-day policy coverage sparkline now reflects real coverage snapshot data (previously flat-line placeholder).
- TypeScript SDK 1.4.0: new root-level exports: OrgSettings, UpdateOrgSettingsRequest, UsersResource, RelationshipsResource.
- Python and TypeScript SDK 1.2.0: major new methods: client.users.getOrgSettings/updateOrgSettings, client.billing.getSubscription/createPortal/syncSubscription, client.simulator.runPreview/runBatchPreview, client.policies.listVersions/restoreVersion, client.identity_providers.generateScimToken/revokeScimToken/suggestPolicies/applyPolicySuggestions, client.principals.resolve, client.api_keys.rotate.
- OpenAPI contract CI gate: .github/workflows/openapi-contract.yml fails the build if SDK method coverage drifts from the spec.
Changed
- POST /api/pipelines/{id}/run now returns 501 NOT_IMPLEMENTED instead of silently pretending to succeed. Use POST /api/ingest/document or the batch ingest endpoint for ingestion workflows.
- GET /api/organization/settings now requires org_admin role (previously accessible to all org members). Member-safe fields remain available on GET /api/users/me.
- Startup validation added for production Stripe price IDs: when STRIPE_SECRET_KEY starts with sk_live_, all six STRIPE_*_PRICE_ID environment variables are required at boot. Unknown price IDs in webhooks now return 500 (triggers Stripe retry) and emit a stripe_price_unrecognized audit event.
- check_resource_limit now takes a PostgreSQL advisory transaction lock before counting, closing a TOCTOU race where concurrent creates could both pass the limit check.
- Rate limiter upgraded to Redis-backed INCR+EXPIRE for cross-instance consistency. Falls back to in-memory when REDIS_URL is unset.
Fixed
- OpenAI API errors in the embedding and answer synthesis paths no longer leak raw API keys (sk-...) into server logs or HTTP responses. All vendor exceptions are sanitized via sanitize_vendor_error() before logging.
- Ingestion batch errors now run through _redact_string() before being surfaced in the batch error response: prevents credential leakage in error detail fields.
- Log redaction patterns expanded: OpenAI sk-..., Anthropic sk-ant-..., GitHub PAT (ghp_/ghs_/gho_), Google OAuth (GOCSPX-), and Slack tokens (xoxb-/xoxp-/xoxe-) are now scrubbed from all log output.
- no_access answer path now returns all 17 contract fields: cap_reached, is_partial, chunks_available, chunks_used_initial, chunks_used_final, retry_used, llm_calls: matching the shape of a successful synthesis response.
- Timing-attack resistance test hardened against OS scheduler jitter: 50 samples (was 20), top/bottom 10% trimmed, CV threshold raised from 1.0 to 3.0.