litellm-proxy-extras 0.1.6__tar.gz → 0.1.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of litellm-proxy-extras might be problematic. Click here for more details.

Files changed (18) hide show
  1. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/PKG-INFO +2 -3
  2. litellm_proxy_extras-0.1.7/litellm_proxy_extras/migrations/20250411215431_add_managed_file_table/migration.sql +18 -0
  3. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/schema.prisma +11 -0
  4. litellm_proxy_extras-0.1.7/litellm_proxy_extras/utils.py +181 -0
  5. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/pyproject.toml +2 -2
  6. litellm_proxy_extras-0.1.6/litellm_proxy_extras/migrations/20250412075123_team_member_permissions/migration.sql +0 -411
  7. litellm_proxy_extras-0.1.6/litellm_proxy_extras/utils.py +0 -83
  8. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/LICENSE +0 -0
  9. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/README.md +0 -0
  10. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/__init__.py +0 -0
  11. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/_logging.py +0 -0
  12. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/migrations/20250326162113_baseline/migration.sql +0 -0
  13. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/migrations/20250326171002_add_daily_user_table/migration.sql +0 -0
  14. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/migrations/20250327180120_add_api_requests_to_daily_user_table/migration.sql +0 -0
  15. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/migrations/20250329084805_new_cron_job_table/migration.sql +0 -0
  16. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/migrations/20250331215456_track_success_and_failed_requests_daily_agg_table/migration.sql +0 -0
  17. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/migrations/20250412081753_team_member_permissions/migration.sql +0 -0
  18. {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.7}/litellm_proxy_extras/migrations/migration_lock.toml +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: litellm-proxy-extras
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package.
5
5
  Author: BerriAI
6
6
  Requires-Python: >=3.8, !=2.7.*, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*, !=3.7.*
@@ -9,7 +9,6 @@ Classifier: Programming Language :: Python :: 3.9
9
9
  Classifier: Programming Language :: Python :: 3.10
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
- Classifier: Programming Language :: Python :: 3.13
13
12
  Project-URL: Documentation, https://docs.litellm.ai
14
13
  Project-URL: Homepage, https://litellm.ai
15
14
  Project-URL: Repository, https://github.com/BerriAI/litellm
@@ -0,0 +1,18 @@
1
+ -- CreateTable
2
+ CREATE TABLE "LiteLLM_ManagedFileTable" (
3
+ "id" TEXT NOT NULL,
4
+ "unified_file_id" TEXT NOT NULL,
5
+ "file_object" JSONB NOT NULL,
6
+ "model_mappings" JSONB NOT NULL,
7
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
8
+ "updated_at" TIMESTAMP(3) NOT NULL,
9
+
10
+ CONSTRAINT "LiteLLM_ManagedFileTable_pkey" PRIMARY KEY ("id")
11
+ );
12
+
13
+ -- CreateIndex
14
+ CREATE UNIQUE INDEX "LiteLLM_ManagedFileTable_unified_file_id_key" ON "LiteLLM_ManagedFileTable"("unified_file_id");
15
+
16
+ -- CreateIndex
17
+ CREATE INDEX "LiteLLM_ManagedFileTable_unified_file_id_idx" ON "LiteLLM_ManagedFileTable"("unified_file_id");
18
+
@@ -355,3 +355,14 @@ enum JobStatus {
355
355
  INACTIVE
356
356
  }
357
357
 
358
+ model LiteLLM_ManagedFileTable {
359
+ id String @id @default(uuid())
360
+ unified_file_id String @unique // The base64 encoded unified file ID
361
+ file_object Json // Stores the OpenAIFileObject
362
+ model_mappings Json // Stores the mapping of model_id -> provider_file_id
363
+ created_at DateTime @default(now())
364
+ updated_at DateTime @updatedAt
365
+
366
+ @@index([unified_file_id])
367
+ }
368
+
@@ -0,0 +1,181 @@
1
+ import glob
2
+ import os
3
+ import random
4
+ import subprocess
5
+ import time
6
+ from pathlib import Path
7
+ from typing import Optional
8
+
9
+ from litellm_proxy_extras._logging import logger
10
+
11
+
12
+ def str_to_bool(value: Optional[str]) -> bool:
13
+ if value is None:
14
+ return False
15
+ return value.lower() in ("true", "1", "t", "y", "yes")
16
+
17
+
18
+ class ProxyExtrasDBManager:
19
+ @staticmethod
20
+ def _get_prisma_dir() -> str:
21
+ """Get the path to the migrations directory"""
22
+ migrations_dir = os.path.dirname(__file__)
23
+ return migrations_dir
24
+
25
+ @staticmethod
26
+ def _create_baseline_migration(schema_path: str) -> bool:
27
+ """Create a baseline migration for an existing database"""
28
+ prisma_dir = ProxyExtrasDBManager._get_prisma_dir()
29
+ prisma_dir_path = Path(prisma_dir)
30
+ init_dir = prisma_dir_path / "migrations" / "0_init"
31
+
32
+ # Create migrations/0_init directory
33
+ init_dir.mkdir(parents=True, exist_ok=True)
34
+
35
+ # Generate migration SQL file
36
+ migration_file = init_dir / "migration.sql"
37
+
38
+ try:
39
+ # Generate migration diff with increased timeout
40
+ subprocess.run(
41
+ [
42
+ "prisma",
43
+ "migrate",
44
+ "diff",
45
+ "--from-empty",
46
+ "--to-schema-datamodel",
47
+ str(schema_path),
48
+ "--script",
49
+ ],
50
+ stdout=open(migration_file, "w"),
51
+ check=True,
52
+ timeout=30,
53
+ ) # 30 second timeout
54
+
55
+ # Mark migration as applied with increased timeout
56
+ subprocess.run(
57
+ [
58
+ "prisma",
59
+ "migrate",
60
+ "resolve",
61
+ "--applied",
62
+ "0_init",
63
+ ],
64
+ check=True,
65
+ timeout=30,
66
+ )
67
+
68
+ return True
69
+ except subprocess.TimeoutExpired:
70
+ logger.warning(
71
+ "Migration timed out - the database might be under heavy load."
72
+ )
73
+ return False
74
+ except subprocess.CalledProcessError as e:
75
+ logger.warning(f"Error creating baseline migration: {e}")
76
+ return False
77
+
78
+ @staticmethod
79
+ def _get_migration_names(migrations_dir: str) -> list:
80
+ """Get all migration directory names from the migrations folder"""
81
+ migration_paths = glob.glob(f"{migrations_dir}/migrations/*/migration.sql")
82
+ logger.info(f"Found {len(migration_paths)} migrations at {migrations_dir}")
83
+ return [Path(p).parent.name for p in migration_paths]
84
+
85
+ @staticmethod
86
+ def _resolve_all_migrations(migrations_dir: str):
87
+ """Mark all existing migrations as applied"""
88
+ migration_names = ProxyExtrasDBManager._get_migration_names(migrations_dir)
89
+ logger.info(f"Resolving {len(migration_names)} migrations")
90
+ for migration_name in migration_names:
91
+ try:
92
+ logger.info(f"Resolving migration: {migration_name}")
93
+ subprocess.run(
94
+ ["prisma", "migrate", "resolve", "--applied", migration_name],
95
+ timeout=60,
96
+ check=True,
97
+ capture_output=True,
98
+ text=True,
99
+ )
100
+ logger.debug(f"Resolved migration: {migration_name}")
101
+ except subprocess.CalledProcessError as e:
102
+ if "is already recorded as applied in the database." not in e.stderr:
103
+ logger.warning(
104
+ f"Failed to resolve migration {migration_name}: {e.stderr}"
105
+ )
106
+
107
+ @staticmethod
108
+ def setup_database(schema_path: str, use_migrate: bool = False) -> bool:
109
+ """
110
+ Set up the database using either prisma migrate or prisma db push
111
+ Uses migrations from litellm-proxy-extras package
112
+
113
+ Args:
114
+ schema_path (str): Path to the Prisma schema file
115
+ use_migrate (bool): Whether to use prisma migrate instead of db push
116
+
117
+ Returns:
118
+ bool: True if setup was successful, False otherwise
119
+ """
120
+ use_migrate = str_to_bool(os.getenv("USE_PRISMA_MIGRATE")) or use_migrate
121
+ for attempt in range(4):
122
+ original_dir = os.getcwd()
123
+ migrations_dir = ProxyExtrasDBManager._get_prisma_dir()
124
+ os.chdir(migrations_dir)
125
+
126
+ try:
127
+ if use_migrate:
128
+ logger.info("Running prisma migrate deploy")
129
+ try:
130
+ # Set migrations directory for Prisma
131
+ result = subprocess.run(
132
+ ["prisma", "migrate", "deploy"],
133
+ timeout=60,
134
+ check=True,
135
+ capture_output=True,
136
+ text=True,
137
+ )
138
+ logger.info(f"prisma migrate deploy stdout: {result.stdout}")
139
+
140
+ logger.info("prisma migrate deploy completed")
141
+ return True
142
+ except subprocess.CalledProcessError as e:
143
+ logger.info(f"prisma db error: {e.stderr}, e: {e.stdout}")
144
+ if (
145
+ "P3005" in e.stderr
146
+ and "database schema is not empty" in e.stderr
147
+ ):
148
+ logger.info(
149
+ "Database schema is not empty, creating baseline migration"
150
+ )
151
+ ProxyExtrasDBManager._create_baseline_migration(schema_path)
152
+ logger.info(
153
+ "Baseline migration created, resolving all migrations"
154
+ )
155
+ ProxyExtrasDBManager._resolve_all_migrations(migrations_dir)
156
+ logger.info("✅ All migrations resolved.")
157
+ return True
158
+ else:
159
+ # Use prisma db push with increased timeout
160
+ subprocess.run(
161
+ ["prisma", "db", "push", "--accept-data-loss"],
162
+ timeout=60,
163
+ check=True,
164
+ )
165
+ return True
166
+ except subprocess.TimeoutExpired:
167
+ logger.info(f"Attempt {attempt + 1} timed out")
168
+ time.sleep(random.randrange(5, 15))
169
+ except subprocess.CalledProcessError as e:
170
+ attempts_left = 3 - attempt
171
+ retry_msg = (
172
+ f" Retrying... ({attempts_left} attempts left)"
173
+ if attempts_left > 0
174
+ else ""
175
+ )
176
+ logger.info(f"The process failed to execute. Details: {e}.{retry_msg}")
177
+ time.sleep(random.randrange(5, 15))
178
+ finally:
179
+ os.chdir(original_dir)
180
+ pass
181
+ return False
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "litellm-proxy-extras"
3
- version = "0.1.6"
3
+ version = "0.1.7"
4
4
  description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package."
5
5
  authors = ["BerriAI"]
6
6
  readme = "README.md"
@@ -22,7 +22,7 @@ requires = ["poetry-core"]
22
22
  build-backend = "poetry.core.masonry.api"
23
23
 
24
24
  [tool.commitizen]
25
- version = "0.1.6"
25
+ version = "0.1.7"
26
26
  version_files = [
27
27
  "pyproject.toml:version",
28
28
  "../requirements.txt:litellm-proxy-extras==",
@@ -1,411 +0,0 @@
1
- -- CreateEnum
2
- CREATE TYPE "JobStatus" AS ENUM ('ACTIVE', 'INACTIVE');
3
-
4
- -- CreateTable
5
- CREATE TABLE "LiteLLM_BudgetTable" (
6
- "budget_id" TEXT NOT NULL,
7
- "max_budget" DOUBLE PRECISION,
8
- "soft_budget" DOUBLE PRECISION,
9
- "max_parallel_requests" INTEGER,
10
- "tpm_limit" BIGINT,
11
- "rpm_limit" BIGINT,
12
- "model_max_budget" JSONB,
13
- "budget_duration" TEXT,
14
- "budget_reset_at" TIMESTAMP(3),
15
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
16
- "created_by" TEXT NOT NULL,
17
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
18
- "updated_by" TEXT NOT NULL,
19
-
20
- CONSTRAINT "LiteLLM_BudgetTable_pkey" PRIMARY KEY ("budget_id")
21
- );
22
-
23
- -- CreateTable
24
- CREATE TABLE "LiteLLM_CredentialsTable" (
25
- "credential_id" TEXT NOT NULL,
26
- "credential_name" TEXT NOT NULL,
27
- "credential_values" JSONB NOT NULL,
28
- "credential_info" JSONB,
29
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
30
- "created_by" TEXT NOT NULL,
31
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
32
- "updated_by" TEXT NOT NULL,
33
-
34
- CONSTRAINT "LiteLLM_CredentialsTable_pkey" PRIMARY KEY ("credential_id")
35
- );
36
-
37
- -- CreateTable
38
- CREATE TABLE "LiteLLM_ProxyModelTable" (
39
- "model_id" TEXT NOT NULL,
40
- "model_name" TEXT NOT NULL,
41
- "litellm_params" JSONB NOT NULL,
42
- "model_info" JSONB,
43
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
44
- "created_by" TEXT NOT NULL,
45
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
46
- "updated_by" TEXT NOT NULL,
47
-
48
- CONSTRAINT "LiteLLM_ProxyModelTable_pkey" PRIMARY KEY ("model_id")
49
- );
50
-
51
- -- CreateTable
52
- CREATE TABLE "LiteLLM_OrganizationTable" (
53
- "organization_id" TEXT NOT NULL,
54
- "organization_alias" TEXT NOT NULL,
55
- "budget_id" TEXT NOT NULL,
56
- "metadata" JSONB NOT NULL DEFAULT '{}',
57
- "models" TEXT[],
58
- "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
59
- "model_spend" JSONB NOT NULL DEFAULT '{}',
60
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
61
- "created_by" TEXT NOT NULL,
62
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
63
- "updated_by" TEXT NOT NULL,
64
-
65
- CONSTRAINT "LiteLLM_OrganizationTable_pkey" PRIMARY KEY ("organization_id")
66
- );
67
-
68
- -- CreateTable
69
- CREATE TABLE "LiteLLM_ModelTable" (
70
- "id" SERIAL NOT NULL,
71
- "aliases" JSONB,
72
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
73
- "created_by" TEXT NOT NULL,
74
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
75
- "updated_by" TEXT NOT NULL,
76
-
77
- CONSTRAINT "LiteLLM_ModelTable_pkey" PRIMARY KEY ("id")
78
- );
79
-
80
- -- CreateTable
81
- CREATE TABLE "LiteLLM_TeamTable" (
82
- "team_id" TEXT NOT NULL,
83
- "team_alias" TEXT,
84
- "organization_id" TEXT,
85
- "admins" TEXT[],
86
- "members" TEXT[],
87
- "members_with_roles" JSONB NOT NULL DEFAULT '{}',
88
- "metadata" JSONB NOT NULL DEFAULT '{}',
89
- "max_budget" DOUBLE PRECISION,
90
- "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
91
- "models" TEXT[],
92
- "max_parallel_requests" INTEGER,
93
- "tpm_limit" BIGINT,
94
- "rpm_limit" BIGINT,
95
- "budget_duration" TEXT,
96
- "budget_reset_at" TIMESTAMP(3),
97
- "blocked" BOOLEAN NOT NULL DEFAULT false,
98
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
99
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
100
- "model_spend" JSONB NOT NULL DEFAULT '{}',
101
- "model_max_budget" JSONB NOT NULL DEFAULT '{}',
102
- "team_member_permissions" TEXT[] DEFAULT ARRAY[]::TEXT[],
103
- "model_id" INTEGER,
104
-
105
- CONSTRAINT "LiteLLM_TeamTable_pkey" PRIMARY KEY ("team_id")
106
- );
107
-
108
- -- CreateTable
109
- CREATE TABLE "LiteLLM_UserTable" (
110
- "user_id" TEXT NOT NULL,
111
- "user_alias" TEXT,
112
- "team_id" TEXT,
113
- "sso_user_id" TEXT,
114
- "organization_id" TEXT,
115
- "password" TEXT,
116
- "teams" TEXT[] DEFAULT ARRAY[]::TEXT[],
117
- "user_role" TEXT,
118
- "max_budget" DOUBLE PRECISION,
119
- "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
120
- "user_email" TEXT,
121
- "models" TEXT[],
122
- "metadata" JSONB NOT NULL DEFAULT '{}',
123
- "max_parallel_requests" INTEGER,
124
- "tpm_limit" BIGINT,
125
- "rpm_limit" BIGINT,
126
- "budget_duration" TEXT,
127
- "budget_reset_at" TIMESTAMP(3),
128
- "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
129
- "model_spend" JSONB NOT NULL DEFAULT '{}',
130
- "model_max_budget" JSONB NOT NULL DEFAULT '{}',
131
- "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
132
- "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
133
-
134
- CONSTRAINT "LiteLLM_UserTable_pkey" PRIMARY KEY ("user_id")
135
- );
136
-
137
- -- CreateTable
138
- CREATE TABLE "LiteLLM_VerificationToken" (
139
- "token" TEXT NOT NULL,
140
- "key_name" TEXT,
141
- "key_alias" TEXT,
142
- "soft_budget_cooldown" BOOLEAN NOT NULL DEFAULT false,
143
- "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
144
- "expires" TIMESTAMP(3),
145
- "models" TEXT[],
146
- "aliases" JSONB NOT NULL DEFAULT '{}',
147
- "config" JSONB NOT NULL DEFAULT '{}',
148
- "user_id" TEXT,
149
- "team_id" TEXT,
150
- "permissions" JSONB NOT NULL DEFAULT '{}',
151
- "max_parallel_requests" INTEGER,
152
- "metadata" JSONB NOT NULL DEFAULT '{}',
153
- "blocked" BOOLEAN,
154
- "tpm_limit" BIGINT,
155
- "rpm_limit" BIGINT,
156
- "max_budget" DOUBLE PRECISION,
157
- "budget_duration" TEXT,
158
- "budget_reset_at" TIMESTAMP(3),
159
- "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
160
- "model_spend" JSONB NOT NULL DEFAULT '{}',
161
- "model_max_budget" JSONB NOT NULL DEFAULT '{}',
162
- "budget_id" TEXT,
163
- "organization_id" TEXT,
164
- "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
165
- "created_by" TEXT,
166
- "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
167
- "updated_by" TEXT,
168
-
169
- CONSTRAINT "LiteLLM_VerificationToken_pkey" PRIMARY KEY ("token")
170
- );
171
-
172
- -- CreateTable
173
- CREATE TABLE "LiteLLM_EndUserTable" (
174
- "user_id" TEXT NOT NULL,
175
- "alias" TEXT,
176
- "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
177
- "allowed_model_region" TEXT,
178
- "default_model" TEXT,
179
- "budget_id" TEXT,
180
- "blocked" BOOLEAN NOT NULL DEFAULT false,
181
-
182
- CONSTRAINT "LiteLLM_EndUserTable_pkey" PRIMARY KEY ("user_id")
183
- );
184
-
185
- -- CreateTable
186
- CREATE TABLE "LiteLLM_Config" (
187
- "param_name" TEXT NOT NULL,
188
- "param_value" JSONB,
189
-
190
- CONSTRAINT "LiteLLM_Config_pkey" PRIMARY KEY ("param_name")
191
- );
192
-
193
- -- CreateTable
194
- CREATE TABLE "LiteLLM_SpendLogs" (
195
- "request_id" TEXT NOT NULL,
196
- "call_type" TEXT NOT NULL,
197
- "api_key" TEXT NOT NULL DEFAULT '',
198
- "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
199
- "total_tokens" INTEGER NOT NULL DEFAULT 0,
200
- "prompt_tokens" INTEGER NOT NULL DEFAULT 0,
201
- "completion_tokens" INTEGER NOT NULL DEFAULT 0,
202
- "startTime" TIMESTAMP(3) NOT NULL,
203
- "endTime" TIMESTAMP(3) NOT NULL,
204
- "completionStartTime" TIMESTAMP(3),
205
- "model" TEXT NOT NULL DEFAULT '',
206
- "model_id" TEXT DEFAULT '',
207
- "model_group" TEXT DEFAULT '',
208
- "custom_llm_provider" TEXT DEFAULT '',
209
- "api_base" TEXT DEFAULT '',
210
- "user" TEXT DEFAULT '',
211
- "metadata" JSONB DEFAULT '{}',
212
- "cache_hit" TEXT DEFAULT '',
213
- "cache_key" TEXT DEFAULT '',
214
- "request_tags" JSONB DEFAULT '[]',
215
- "team_id" TEXT,
216
- "end_user" TEXT,
217
- "requester_ip_address" TEXT,
218
- "messages" JSONB DEFAULT '{}',
219
- "response" JSONB DEFAULT '{}',
220
-
221
- CONSTRAINT "LiteLLM_SpendLogs_pkey" PRIMARY KEY ("request_id")
222
- );
223
-
224
- -- CreateTable
225
- CREATE TABLE "LiteLLM_ErrorLogs" (
226
- "request_id" TEXT NOT NULL,
227
- "startTime" TIMESTAMP(3) NOT NULL,
228
- "endTime" TIMESTAMP(3) NOT NULL,
229
- "api_base" TEXT NOT NULL DEFAULT '',
230
- "model_group" TEXT NOT NULL DEFAULT '',
231
- "litellm_model_name" TEXT NOT NULL DEFAULT '',
232
- "model_id" TEXT NOT NULL DEFAULT '',
233
- "request_kwargs" JSONB NOT NULL DEFAULT '{}',
234
- "exception_type" TEXT NOT NULL DEFAULT '',
235
- "exception_string" TEXT NOT NULL DEFAULT '',
236
- "status_code" TEXT NOT NULL DEFAULT '',
237
-
238
- CONSTRAINT "LiteLLM_ErrorLogs_pkey" PRIMARY KEY ("request_id")
239
- );
240
-
241
- -- CreateTable
242
- CREATE TABLE "LiteLLM_UserNotifications" (
243
- "request_id" TEXT NOT NULL,
244
- "user_id" TEXT NOT NULL,
245
- "models" TEXT[],
246
- "justification" TEXT NOT NULL,
247
- "status" TEXT NOT NULL,
248
-
249
- CONSTRAINT "LiteLLM_UserNotifications_pkey" PRIMARY KEY ("request_id")
250
- );
251
-
252
- -- CreateTable
253
- CREATE TABLE "LiteLLM_TeamMembership" (
254
- "user_id" TEXT NOT NULL,
255
- "team_id" TEXT NOT NULL,
256
- "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
257
- "budget_id" TEXT,
258
-
259
- CONSTRAINT "LiteLLM_TeamMembership_pkey" PRIMARY KEY ("user_id","team_id")
260
- );
261
-
262
- -- CreateTable
263
- CREATE TABLE "LiteLLM_OrganizationMembership" (
264
- "user_id" TEXT NOT NULL,
265
- "organization_id" TEXT NOT NULL,
266
- "user_role" TEXT,
267
- "spend" DOUBLE PRECISION DEFAULT 0.0,
268
- "budget_id" TEXT,
269
- "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
270
- "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
271
-
272
- CONSTRAINT "LiteLLM_OrganizationMembership_pkey" PRIMARY KEY ("user_id","organization_id")
273
- );
274
-
275
- -- CreateTable
276
- CREATE TABLE "LiteLLM_InvitationLink" (
277
- "id" TEXT NOT NULL,
278
- "user_id" TEXT NOT NULL,
279
- "is_accepted" BOOLEAN NOT NULL DEFAULT false,
280
- "accepted_at" TIMESTAMP(3),
281
- "expires_at" TIMESTAMP(3) NOT NULL,
282
- "created_at" TIMESTAMP(3) NOT NULL,
283
- "created_by" TEXT NOT NULL,
284
- "updated_at" TIMESTAMP(3) NOT NULL,
285
- "updated_by" TEXT NOT NULL,
286
-
287
- CONSTRAINT "LiteLLM_InvitationLink_pkey" PRIMARY KEY ("id")
288
- );
289
-
290
- -- CreateTable
291
- CREATE TABLE "LiteLLM_AuditLog" (
292
- "id" TEXT NOT NULL,
293
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
294
- "changed_by" TEXT NOT NULL DEFAULT '',
295
- "changed_by_api_key" TEXT NOT NULL DEFAULT '',
296
- "action" TEXT NOT NULL,
297
- "table_name" TEXT NOT NULL,
298
- "object_id" TEXT NOT NULL,
299
- "before_value" JSONB,
300
- "updated_values" JSONB,
301
-
302
- CONSTRAINT "LiteLLM_AuditLog_pkey" PRIMARY KEY ("id")
303
- );
304
-
305
- -- CreateTable
306
- CREATE TABLE "LiteLLM_DailyUserSpend" (
307
- "id" TEXT NOT NULL,
308
- "user_id" TEXT NOT NULL,
309
- "date" TEXT NOT NULL,
310
- "api_key" TEXT NOT NULL,
311
- "model" TEXT NOT NULL,
312
- "model_group" TEXT,
313
- "custom_llm_provider" TEXT,
314
- "prompt_tokens" INTEGER NOT NULL DEFAULT 0,
315
- "completion_tokens" INTEGER NOT NULL DEFAULT 0,
316
- "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
317
- "api_requests" INTEGER NOT NULL DEFAULT 0,
318
- "successful_requests" INTEGER NOT NULL DEFAULT 0,
319
- "failed_requests" INTEGER NOT NULL DEFAULT 0,
320
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
321
- "updated_at" TIMESTAMP(3) NOT NULL,
322
-
323
- CONSTRAINT "LiteLLM_DailyUserSpend_pkey" PRIMARY KEY ("id")
324
- );
325
-
326
- -- CreateTable
327
- CREATE TABLE "LiteLLM_CronJob" (
328
- "cronjob_id" TEXT NOT NULL,
329
- "pod_id" TEXT NOT NULL,
330
- "status" "JobStatus" NOT NULL DEFAULT 'INACTIVE',
331
- "last_updated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
332
- "ttl" TIMESTAMP(3) NOT NULL,
333
-
334
- CONSTRAINT "LiteLLM_CronJob_pkey" PRIMARY KEY ("cronjob_id")
335
- );
336
-
337
- -- CreateIndex
338
- CREATE UNIQUE INDEX "LiteLLM_CredentialsTable_credential_name_key" ON "LiteLLM_CredentialsTable"("credential_name");
339
-
340
- -- CreateIndex
341
- CREATE UNIQUE INDEX "LiteLLM_TeamTable_model_id_key" ON "LiteLLM_TeamTable"("model_id");
342
-
343
- -- CreateIndex
344
- CREATE UNIQUE INDEX "LiteLLM_UserTable_sso_user_id_key" ON "LiteLLM_UserTable"("sso_user_id");
345
-
346
- -- CreateIndex
347
- CREATE INDEX "LiteLLM_SpendLogs_startTime_idx" ON "LiteLLM_SpendLogs"("startTime");
348
-
349
- -- CreateIndex
350
- CREATE INDEX "LiteLLM_SpendLogs_end_user_idx" ON "LiteLLM_SpendLogs"("end_user");
351
-
352
- -- CreateIndex
353
- CREATE UNIQUE INDEX "LiteLLM_OrganizationMembership_user_id_organization_id_key" ON "LiteLLM_OrganizationMembership"("user_id", "organization_id");
354
-
355
- -- CreateIndex
356
- CREATE INDEX "LiteLLM_DailyUserSpend_date_idx" ON "LiteLLM_DailyUserSpend"("date");
357
-
358
- -- CreateIndex
359
- CREATE INDEX "LiteLLM_DailyUserSpend_user_id_idx" ON "LiteLLM_DailyUserSpend"("user_id");
360
-
361
- -- CreateIndex
362
- CREATE INDEX "LiteLLM_DailyUserSpend_api_key_idx" ON "LiteLLM_DailyUserSpend"("api_key");
363
-
364
- -- CreateIndex
365
- CREATE INDEX "LiteLLM_DailyUserSpend_model_idx" ON "LiteLLM_DailyUserSpend"("model");
366
-
367
- -- CreateIndex
368
- CREATE UNIQUE INDEX "LiteLLM_DailyUserSpend_user_id_date_api_key_model_custom_ll_key" ON "LiteLLM_DailyUserSpend"("user_id", "date", "api_key", "model", "custom_llm_provider");
369
-
370
- -- AddForeignKey
371
- ALTER TABLE "LiteLLM_OrganizationTable" ADD CONSTRAINT "LiteLLM_OrganizationTable_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE RESTRICT ON UPDATE CASCADE;
372
-
373
- -- AddForeignKey
374
- ALTER TABLE "LiteLLM_TeamTable" ADD CONSTRAINT "LiteLLM_TeamTable_organization_id_fkey" FOREIGN KEY ("organization_id") REFERENCES "LiteLLM_OrganizationTable"("organization_id") ON DELETE SET NULL ON UPDATE CASCADE;
375
-
376
- -- AddForeignKey
377
- ALTER TABLE "LiteLLM_TeamTable" ADD CONSTRAINT "LiteLLM_TeamTable_model_id_fkey" FOREIGN KEY ("model_id") REFERENCES "LiteLLM_ModelTable"("id") ON DELETE SET NULL ON UPDATE CASCADE;
378
-
379
- -- AddForeignKey
380
- ALTER TABLE "LiteLLM_UserTable" ADD CONSTRAINT "LiteLLM_UserTable_organization_id_fkey" FOREIGN KEY ("organization_id") REFERENCES "LiteLLM_OrganizationTable"("organization_id") ON DELETE SET NULL ON UPDATE CASCADE;
381
-
382
- -- AddForeignKey
383
- ALTER TABLE "LiteLLM_VerificationToken" ADD CONSTRAINT "LiteLLM_VerificationToken_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE;
384
-
385
- -- AddForeignKey
386
- ALTER TABLE "LiteLLM_VerificationToken" ADD CONSTRAINT "LiteLLM_VerificationToken_organization_id_fkey" FOREIGN KEY ("organization_id") REFERENCES "LiteLLM_OrganizationTable"("organization_id") ON DELETE SET NULL ON UPDATE CASCADE;
387
-
388
- -- AddForeignKey
389
- ALTER TABLE "LiteLLM_EndUserTable" ADD CONSTRAINT "LiteLLM_EndUserTable_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE;
390
-
391
- -- AddForeignKey
392
- ALTER TABLE "LiteLLM_TeamMembership" ADD CONSTRAINT "LiteLLM_TeamMembership_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE;
393
-
394
- -- AddForeignKey
395
- ALTER TABLE "LiteLLM_OrganizationMembership" ADD CONSTRAINT "LiteLLM_OrganizationMembership_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "LiteLLM_UserTable"("user_id") ON DELETE RESTRICT ON UPDATE CASCADE;
396
-
397
- -- AddForeignKey
398
- ALTER TABLE "LiteLLM_OrganizationMembership" ADD CONSTRAINT "LiteLLM_OrganizationMembership_organization_id_fkey" FOREIGN KEY ("organization_id") REFERENCES "LiteLLM_OrganizationTable"("organization_id") ON DELETE RESTRICT ON UPDATE CASCADE;
399
-
400
- -- AddForeignKey
401
- ALTER TABLE "LiteLLM_OrganizationMembership" ADD CONSTRAINT "LiteLLM_OrganizationMembership_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE;
402
-
403
- -- AddForeignKey
404
- ALTER TABLE "LiteLLM_InvitationLink" ADD CONSTRAINT "LiteLLM_InvitationLink_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "LiteLLM_UserTable"("user_id") ON DELETE RESTRICT ON UPDATE CASCADE;
405
-
406
- -- AddForeignKey
407
- ALTER TABLE "LiteLLM_InvitationLink" ADD CONSTRAINT "LiteLLM_InvitationLink_created_by_fkey" FOREIGN KEY ("created_by") REFERENCES "LiteLLM_UserTable"("user_id") ON DELETE RESTRICT ON UPDATE CASCADE;
408
-
409
- -- AddForeignKey
410
- ALTER TABLE "LiteLLM_InvitationLink" ADD CONSTRAINT "LiteLLM_InvitationLink_updated_by_fkey" FOREIGN KEY ("updated_by") REFERENCES "LiteLLM_UserTable"("user_id") ON DELETE RESTRICT ON UPDATE CASCADE;
411
-
@@ -1,83 +0,0 @@
1
- import os
2
- import random
3
- import subprocess
4
- import time
5
- from typing import Optional
6
-
7
- from litellm_proxy_extras._logging import logger
8
-
9
-
10
- def str_to_bool(value: Optional[str]) -> bool:
11
- if value is None:
12
- return False
13
- return value.lower() in ("true", "1", "t", "y", "yes")
14
-
15
-
16
- class ProxyExtrasDBManager:
17
- @staticmethod
18
- def setup_database(schema_path: str, use_migrate: bool = False) -> bool:
19
- """
20
- Set up the database using either prisma migrate or prisma db push
21
- Uses migrations from litellm-proxy-extras package
22
-
23
- Args:
24
- schema_path (str): Path to the Prisma schema file
25
- use_migrate (bool): Whether to use prisma migrate instead of db push
26
-
27
- Returns:
28
- bool: True if setup was successful, False otherwise
29
- """
30
- use_migrate = str_to_bool(os.getenv("USE_PRISMA_MIGRATE")) or use_migrate
31
- for attempt in range(4):
32
- original_dir = os.getcwd()
33
- migrations_dir = os.path.dirname(__file__)
34
- os.chdir(migrations_dir)
35
-
36
- try:
37
- if use_migrate:
38
- logger.info("Running prisma migrate deploy")
39
- try:
40
- # Set migrations directory for Prisma
41
- result = subprocess.run(
42
- ["prisma", "migrate", "deploy"],
43
- timeout=60,
44
- check=True,
45
- capture_output=True,
46
- text=True,
47
- )
48
- logger.info(f"prisma migrate deploy stdout: {result.stdout}")
49
-
50
- logger.info("prisma migrate deploy completed")
51
- return True
52
- except subprocess.CalledProcessError as e:
53
- logger.info(f"prisma db error: {e.stderr}, e: {e.stdout}")
54
- if (
55
- "P3005" in e.stderr
56
- and "database schema is not empty" in e.stderr
57
- ):
58
- logger.info("Error: Database schema is not empty")
59
- return False
60
- else:
61
- # Use prisma db push with increased timeout
62
- subprocess.run(
63
- ["prisma", "db", "push", "--accept-data-loss"],
64
- timeout=60,
65
- check=True,
66
- )
67
- return True
68
- except subprocess.TimeoutExpired:
69
- logger.info(f"Attempt {attempt + 1} timed out")
70
- time.sleep(random.randrange(5, 15))
71
- except subprocess.CalledProcessError as e:
72
- attempts_left = 3 - attempt
73
- retry_msg = (
74
- f" Retrying... ({attempts_left} attempts left)"
75
- if attempts_left > 0
76
- else ""
77
- )
78
- logger.info(f"The process failed to execute. Details: {e}.{retry_msg}")
79
- time.sleep(random.randrange(5, 15))
80
- finally:
81
- os.chdir(original_dir)
82
- pass
83
- return False