litellm-proxy-extras 0.1.6__tar.gz → 0.1.8__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.
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/PKG-INFO +2 -3
- litellm_proxy_extras-0.1.8/litellm_proxy_extras/migrations/20250411215431_add_managed_file_table/migration.sql +18 -0
- litellm_proxy_extras-0.1.8/litellm_proxy_extras/migrations/20250415191926_add_daily_team_table/migration.sql +36 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/schema.prisma +11 -0
- litellm_proxy_extras-0.1.8/litellm_proxy_extras/utils.py +181 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/pyproject.toml +2 -2
- litellm_proxy_extras-0.1.6/litellm_proxy_extras/migrations/20250412075123_team_member_permissions/migration.sql +0 -411
- litellm_proxy_extras-0.1.6/litellm_proxy_extras/utils.py +0 -83
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/LICENSE +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/README.md +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/__init__.py +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/_logging.py +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/migrations/20250326162113_baseline/migration.sql +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/migrations/20250326171002_add_daily_user_table/migration.sql +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/migrations/20250327180120_add_api_requests_to_daily_user_table/migration.sql +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/migrations/20250329084805_new_cron_job_table/migration.sql +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/migrations/20250331215456_track_success_and_failed_requests_daily_agg_table/migration.sql +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/migrations/20250412081753_team_member_permissions/migration.sql +0 -0
- {litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/migrations/migration_lock.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: litellm-proxy-extras
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.8
|
|
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
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "LiteLLM_DailyTeamSpend" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"team_id" TEXT NOT NULL,
|
|
5
|
+
"date" TEXT NOT NULL,
|
|
6
|
+
"api_key" TEXT NOT NULL,
|
|
7
|
+
"model" TEXT NOT NULL,
|
|
8
|
+
"model_group" TEXT,
|
|
9
|
+
"custom_llm_provider" TEXT,
|
|
10
|
+
"prompt_tokens" INTEGER NOT NULL DEFAULT 0,
|
|
11
|
+
"completion_tokens" INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
"spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
|
|
13
|
+
"api_requests" INTEGER NOT NULL DEFAULT 0,
|
|
14
|
+
"successful_requests" INTEGER NOT NULL DEFAULT 0,
|
|
15
|
+
"failed_requests" INTEGER NOT NULL DEFAULT 0,
|
|
16
|
+
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
17
|
+
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
18
|
+
|
|
19
|
+
CONSTRAINT "LiteLLM_DailyTeamSpend_pkey" PRIMARY KEY ("id")
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
-- CreateIndex
|
|
23
|
+
CREATE INDEX "LiteLLM_DailyTeamSpend_date_idx" ON "LiteLLM_DailyTeamSpend"("date");
|
|
24
|
+
|
|
25
|
+
-- CreateIndex
|
|
26
|
+
CREATE INDEX "LiteLLM_DailyTeamSpend_team_id_idx" ON "LiteLLM_DailyTeamSpend"("team_id");
|
|
27
|
+
|
|
28
|
+
-- CreateIndex
|
|
29
|
+
CREATE INDEX "LiteLLM_DailyTeamSpend_api_key_idx" ON "LiteLLM_DailyTeamSpend"("api_key");
|
|
30
|
+
|
|
31
|
+
-- CreateIndex
|
|
32
|
+
CREATE INDEX "LiteLLM_DailyTeamSpend_model_idx" ON "LiteLLM_DailyTeamSpend"("model");
|
|
33
|
+
|
|
34
|
+
-- CreateIndex
|
|
35
|
+
CREATE UNIQUE INDEX "LiteLLM_DailyTeamSpend_team_id_date_api_key_model_custom_ll_key" ON "LiteLLM_DailyTeamSpend"("team_id", "date", "api_key", "model", "custom_llm_provider");
|
|
36
|
+
|
{litellm_proxy_extras-0.1.6 → litellm_proxy_extras-0.1.8}/litellm_proxy_extras/schema.prisma
RENAMED
|
@@ -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.
|
|
3
|
+
version = "0.1.8"
|
|
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.
|
|
25
|
+
version = "0.1.8"
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|