-- ============================================ -- K-AI API Gateway - Complete Supabase SQL Setup -- ============================================ -- This script handles both creating tables with kaiapi_ prefix -- and migrating data from old tables (if they exist) -- ============================================ -- STEP 1: Rename existing tables to add kaiapi_ prefix -- ============================================ -- Rename api_keys table if it exists DO $$ BEGIN IF EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'api_keys') THEN ALTER TABLE api_keys RENAME TO kaiapi_api_keys; RAISE NOTICE 'Renamed api_keys to kaiapi_api_keys'; END IF; END $$; -- Rename model_stats table if it exists DO $$ BEGIN IF EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'model_stats') THEN ALTER TABLE model_stats RENAME TO kaiapi_model_stats; RAISE NOTICE 'Renamed model_stats to kaiapi_model_stats'; END IF; END $$; -- Rename provider_sessions table if it exists DO $$ BEGIN IF EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'provider_sessions') THEN ALTER TABLE provider_sessions RENAME TO kaiapi_provider_sessions; RAISE NOTICE 'Renamed provider_sessions to kaiapi_provider_sessions'; END IF; END $$; -- Rename provider_states table if it exists (for consistency) DO $$ BEGIN IF EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'provider_states') THEN ALTER TABLE provider_states RENAME TO kaiapi_provider_states; RAISE NOTICE 'Renamed provider_states to kaiapi_provider_states'; END IF; END $$; -- ============================================ -- STEP 2: Create kaiapi_api_keys table (if not exists) -- ============================================ CREATE TABLE IF NOT EXISTS kaiapi_api_keys ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, token VARCHAR(255) UNIQUE NOT NULL, usage_tokens INTEGER NOT NULL DEFAULT 0, limit_tokens INTEGER NOT NULL DEFAULT 1000000, is_active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_kaiapi_api_keys_token ON kaiapi_api_keys(token); CREATE INDEX IF NOT EXISTS idx_kaiapi_api_keys_is_active ON kaiapi_api_keys(is_active); -- ============================================ -- STEP 3: Create kaiapi_model_stats table (if not exists) -- ============================================ CREATE TABLE IF NOT EXISTS kaiapi_model_stats ( id VARCHAR(255) PRIMARY KEY, success INTEGER NOT NULL DEFAULT 0, failure INTEGER NOT NULL DEFAULT 0, consecutive_failures INTEGER NOT NULL DEFAULT 0, avg_time_ms FLOAT NOT NULL DEFAULT 0, total_time_ms FLOAT NOT NULL DEFAULT 0, count_samples INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_kaiapi_model_stats_id ON kaiapi_model_stats(id); -- ============================================ -- STEP 4: Create kaiapi_provider_sessions table (if not exists) -- ============================================ CREATE TABLE IF NOT EXISTS kaiapi_provider_sessions ( id SERIAL PRIMARY KEY, provider VARCHAR(50) UNIQUE NOT NULL, cookies JSONB, session_data JSONB, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_kaiapi_provider_sessions_provider ON kaiapi_provider_sessions(provider); -- ============================================ -- STEP 5: Create kaiapi_provider_states table (NEW - for toggle management) -- ============================================ CREATE TABLE IF NOT EXISTS kaiapi_provider_states ( id SERIAL PRIMARY KEY, provider_id VARCHAR(50) UNIQUE NOT NULL, name VARCHAR(100) NOT NULL, type VARCHAR(20) NOT NULL DEFAULT 'api', enabled BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_kaiapi_provider_states_provider_id ON kaiapi_provider_states(provider_id); CREATE INDEX IF NOT EXISTS idx_kaiapi_provider_states_enabled ON kaiapi_provider_states(enabled); -- Insert default providers (if table is empty) INSERT INTO kaiapi_provider_states (provider_id, name, type, enabled) VALUES ('g4f', 'G4F (Free GPT-4)', 'api', true), ('zai', 'Z.ai (GLM-5)', 'api', true), ('gemini', 'Google Gemini', 'api', true), ('pollinations', 'Pollinations', 'api', true), ('huggingchat', 'HuggingChat', 'browser', true), ('copilot', 'Microsoft Copilot', 'browser', false), ('chatgpt', 'ChatGPT', 'browser', false) ON CONFLICT (provider_id) DO NOTHING; -- ============================================ -- STEP 6: Create helper functions and triggers -- ============================================ -- Create updated_at trigger function CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ language 'plpgsql'; -- Create triggers for all tables DROP TRIGGER IF EXISTS update_kaiapi_api_keys_updated_at ON kaiapi_api_keys; CREATE TRIGGER update_kaiapi_api_keys_updated_at BEFORE UPDATE ON kaiapi_api_keys FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); DROP TRIGGER IF EXISTS update_kaiapi_model_stats_updated_at ON kaiapi_model_stats; CREATE TRIGGER update_kaiapi_model_stats_updated_at BEFORE UPDATE ON kaiapi_model_stats FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); DROP TRIGGER IF EXISTS update_kaiapi_provider_sessions_updated_at ON kaiapi_provider_sessions; CREATE TRIGGER update_kaiapi_provider_sessions_updated_at BEFORE UPDATE ON kaiapi_provider_sessions FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); DROP TRIGGER IF EXISTS update_kaiapi_provider_states_updated_at ON kaiapi_provider_states; CREATE TRIGGER update_kaiapi_provider_states_updated_at BEFORE UPDATE ON kaiapi_provider_states FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- ============================================ -- STEP 7: Enable Row Level Security (Optional) -- ============================================ -- Uncomment the following lines if you want to enable RLS -- ALTER TABLE kaiapi_api_keys ENABLE ROW LEVEL SECURITY; -- ALTER TABLE kaiapi_model_stats ENABLE ROW LEVEL SECURITY; -- ALTER TABLE kaiapi_provider_sessions ENABLE ROW LEVEL SECURITY; -- ALTER TABLE kaiapi_provider_states ENABLE ROW LEVEL SECURITY; -- Create policy to allow all operations (adjust as needed) -- CREATE POLICY "Allow all operations on kaiapi_api_keys" -- ON kaiapi_api_keys -- FOR ALL -- TO anon, authenticated -- USING (true) -- WITH CHECK (true); -- CREATE POLICY "Allow all operations on kaiapi_model_stats" -- ON kaiapi_model_stats -- FOR ALL -- TO anon, authenticated -- USING (true) -- WITH CHECK (true); -- CREATE POLICY "Allow all operations on kaiapi_provider_sessions" -- ON kaiapi_provider_sessions -- FOR ALL -- TO anon, authenticated -- USING (true) -- WITH CHECK (true); -- CREATE POLICY "Allow all operations on kaiapi_provider_states" -- ON kaiapi_provider_states -- FOR ALL -- TO anon, authenticated -- USING (true) -- WITH CHECK (true); -- ============================================ -- VERIFICATION: Check all created tables -- ============================================ SELECT 'Tables created successfully:' as message; SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_name LIKE 'kaiapi_%' ORDER BY table_name;