File size: 8,063 Bytes
78e29c5
 
 
ba9d716
78e29c5
 
 
ba9d716
78e29c5
 
 
 
 
 
 
 
ba9d716
 
78e29c5
 
 
 
 
 
 
 
 
ba9d716
 
78e29c5
 
 
 
 
 
 
 
 
ba9d716
 
78e29c5
 
 
 
 
 
 
 
 
ba9d716
 
78e29c5
 
 
 
ba9d716
78e29c5
ba9d716
78e29c5
 
 
 
 
 
 
 
 
 
ba9d716
 
78e29c5
 
ba9d716
78e29c5
ba9d716
78e29c5
 
 
 
 
 
 
 
 
 
 
ba9d716
78e29c5
 
ba9d716
78e29c5
ba9d716
78e29c5
 
 
 
 
 
 
 
ba9d716
78e29c5
 
ba9d716
78e29c5
ba9d716
78e29c5
 
 
 
 
 
 
 
 
ba9d716
 
78e29c5
 
ba9d716
78e29c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba9d716
 
 
78e29c5
 
 
ba9d716
 
 
78e29c5
 
 
ba9d716
 
 
78e29c5
 
 
ba9d716
 
 
78e29c5
 
 
 
 
 
 
 
ba9d716
 
 
 
78e29c5
 
ba9d716
 
78e29c5
 
 
 
 
ba9d716
 
78e29c5
 
 
 
 
ba9d716
 
78e29c5
 
 
 
 
ba9d716
 
78e29c5
 
 
 
 
 
 
 
 
 
 
 
ba9d716
78e29c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
-- ============================================
-- 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;