-- Migration 005: Provider Capabilities & Custom Headers -- -- Adds provider-level configuration (custom headers, provider-specific settings) -- and expands model capabilities to include output token limits. -- This eliminates hardcoded max_tokens defaults throughout the system. -- ── api_configs: custom headers and global flag ── ALTER TABLE api_configs ADD COLUMN IF NOT EXISTS custom_headers JSONB DEFAULT '{}'::jsonb, ADD COLUMN IF NOT EXISTS provider_settings JSONB DEFAULT '{}'::jsonb, ADD COLUMN IF NOT EXISTS is_global BOOLEAN DEFAULT false; COMMENT ON COLUMN api_configs.custom_headers IS 'Extra HTTP headers sent with every request (e.g. OpenRouter HTTP-Referer)'; COMMENT ON COLUMN api_configs.provider_settings IS 'Provider-specific params (e.g. Venice web_search, OpenRouter route)'; COMMENT ON COLUMN api_configs.is_global IS 'Admin-managed configs visible to all users'; -- Backfill: existing admin-created configs (user_id IS NULL) are global UPDATE api_configs SET is_global = true WHERE user_id IS NULL; -- ── model_configs: richer capabilities ── -- The existing capabilities JSONB gets richer fields. -- No schema change needed (it's JSONB), but let's update existing rows -- that have the old minimal shape to include the new fields. -- New canonical shape: -- { -- "streaming": true, -- "tool_calling": false, -- "vision": false, -- "thinking": false, -- "reasoning": false, -- "code_optimized": false, -- "max_context": 0, -- "max_output_tokens": 0, -- "web_search": false -- } -- max_output_tokens = 0 means "not set, use provider/heuristic default" -- Migrate old "tool" key to "tool_calling" for consistency UPDATE model_configs SET capabilities = capabilities - 'tool' || jsonb_build_object('tool_calling', COALESCE(capabilities->>'tool', 'false')::boolean) WHERE capabilities ? 'tool' AND NOT capabilities ? 'tool_calling'; -- Migrate old "code" key to "code_optimized" UPDATE model_configs SET capabilities = capabilities - 'code' || jsonb_build_object('code_optimized', COALESCE(capabilities->>'code', 'false')::boolean) WHERE capabilities ? 'code' AND NOT capabilities ? 'code_optimized'; -- ── user_model_preferences ── -- Users can enable/disable models from global providers for personal use. CREATE TABLE IF NOT EXISTS user_model_preferences ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, model_config_id UUID NOT NULL REFERENCES model_configs(id) ON DELETE CASCADE, is_enabled BOOLEAN DEFAULT true, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), UNIQUE(user_id, model_config_id) ); CREATE INDEX IF NOT EXISTS idx_user_model_prefs_user ON user_model_preferences(user_id);