diff --git a/.circleci/requirements.txt b/.circleci/requirements.txt
index 2294c84813c..193035a13e5 100644
--- a/.circleci/requirements.txt
+++ b/.circleci/requirements.txt
@@ -9,9 +9,10 @@ redisvl==0.4.1
anthropic
orjson==3.10.12 # fast /embedding responses
pydantic==2.10.2
+typing-extensions>=4.14.1 # required by pydantic-core
google-cloud-aiplatform==1.43.0
google-cloud-iam==2.19.1
-fastapi-sso==0.16.0
+fastapi-sso==0.19.0 # updated to fix GHSA-hp6r-r9vc-q8wx
uvloop==0.21.0
mcp==1.10.1 # for MCP server
semantic_router==0.1.10 # for auto-routing with litellm
diff --git a/.gitguardian.yaml b/.gitguardian.yaml
new file mode 100644
index 00000000000..f6976da6297
--- /dev/null
+++ b/.gitguardian.yaml
@@ -0,0 +1,112 @@
+version: 2
+
+secret:
+ ignored_paths:
+ - "**/*.whl"
+ - "**/*.pyc"
+ - "**/__pycache__/**"
+ - "**/node_modules/**"
+ - "**/dist/**"
+ - "**/build/**"
+ - "**/.git/**"
+ - "**/venv/**"
+ - "**/.venv/**"
+
+ # Large data/metadata files that don't need scanning
+ - "**/model_prices_and_context_window*.json"
+ - "**/*_metadata/*.txt"
+ - "**/tokenizers/*.json"
+ - "**/tokenizers/*"
+ - "miniconda.sh"
+
+ # Build outputs and static assets
+ - "litellm/proxy/_experimental/out/**"
+ - "ui/litellm-dashboard/public/**"
+ - "**/swagger/*.js"
+ - "**/*.woff"
+ - "**/*.woff2"
+ - "**/*.avif"
+ - "**/*.webp"
+
+ # Test files and fixtures
+ - "**/tests/**/*.py"
+ - "**/test_*.py"
+ - "**/*_test.py"
+ - "**/*.test.tsx"
+ - "**/*.test.ts"
+ - "**/*.spec.tsx"
+ - "**/*.spec.ts"
+ - "**/tests/**/data_map.txt"
+ - "tests/**/*.txt"
+
+ # Example and documentation files
+ - "cookbook/**/*.ipynb"
+ - "litellm/proxy/_super_secret_config.yaml"
+ - "docs/**"
+ - "**/*.md"
+ - "**/*.lock"
+ - "poetry.lock"
+ - "package-lock.json"
+
+ # Ignore false positives by SHA256 hash or pattern
+ ignored_matches:
+ # Specific false positives (SHA256-based)
+ - name: GCS pub/sub test folder name
+ match: 75f377c456eede69e5f6e47399ccee6016a2a93cc5dd11db09cc5b1359ae569a
+
+ - name: Environment variable reference APORIA_API_KEY_1
+ match: e2ddeb8b88eca97a402559a2be2117764e11c074d86159ef9ad2375dea188094
+
+ - name: Environment variable reference APORIA_API_KEY_2
+ match: 09aa39a29e050b86603aa55138af1ff08fb86a4582aa965c1bd0672e1575e052
+
+ - name: OIDC CircleCI test path
+ match: feb3475e1f89a65b7b7815ac4ec597e18a9ec1847742ad445c36ca617b536e15
+
+ - name: OpenAI model identifier
+ match: c489000cf6c7600cee0eefb80ad0965f82921cfb47ece880930eb7e7635cf1f1
+
+ - name: Test Base64 Basic Auth header
+ match: 61bac0491f395040617df7ef6d06029eac4d92a4457ac784978db80d97be1ae0
+
+ - name: Test PostgreSQL password
+ match: 6e0d657eb1f0fbc40cf0b8f3c3873ef627cc9cb7c4108d1c07d979c04bc8a4bb
+
+ - name: Test Bearer token in load test
+ match: 2a0abc2b0c3c1760a51ffcdf8d6b1d384cef69af740504b1cfa82dd70cdc7ff9
+
+ - name: Inkeep API key in documentation
+ match: c366657791bfb5fc69045ec11d49452f09a0aebbc8648f94e2469b4025e29a75
+
+ - name: Langfuse test credentials
+ match: c39310f68cc3d3e22f7b298bb6353c4f45759adcc37080d8b7f4e535d3cfd7f4
+
+ - name: Test password in e2e fixtures
+ match: ce32b547202e209ec1dd50107b64be4cfcf2eb15c3b4f8e9dc611ef747af634f
+
+ # Test API key patterns
+ - name: Test API keys with sk-test prefix
+ match: sk-test-
+
+ - name: Mock API keys with sk-mock prefix
+ match: sk-mock-
+
+ - name: Fake API keys with sk-fake prefix
+ match: sk-fake-
+
+ - name: Generic test API key pattern
+ match: test-api-key
+
+ # Common test fixtures
+ - name: Test API key fixture 88dc28d0f03
+ match: 88dc28d0f030c55ed4ab77ed8faf098196cb1c05df778539800c9f1243fe6b4b
+
+ - name: Test API key fixture 40b7608ea43
+ match: 40b7608ea43423400d5b82bb5ee11042bfb2ed4655f05b5992b5abbc2f294931
+
+ - name: SHA256 empty string (test fixture)
+ match: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+
+ - name: Test JWT token pattern
+ match: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
+
diff --git a/ci_cd/security_scans.sh b/ci_cd/security_scans.sh
index 6950880320b..5242f980f9c 100755
--- a/ci_cd/security_scans.sh
+++ b/ci_cd/security_scans.sh
@@ -26,6 +26,56 @@ install_grype() {
echo "Grype installed successfully"
}
+# Function to install ggshield
+install_ggshield() {
+ echo "Installing ggshield..."
+ pip3 install --upgrade pip
+ pip3 install ggshield
+ echo "ggshield installed successfully"
+}
+
+# Function to run secret detection scans
+run_secret_detection() {
+ echo "Running secret detection scans..."
+
+ if ! command -v ggshield &> /dev/null; then
+ install_ggshield
+ fi
+
+ # Check if GITGUARDIAN_API_KEY is set (required for CI/CD)
+ if [ -z "$GITGUARDIAN_API_KEY" ]; then
+ echo "Warning: GITGUARDIAN_API_KEY environment variable is not set."
+ echo "ggshield requires a GitGuardian API key to scan for secrets."
+ echo "Please set GITGUARDIAN_API_KEY in your CI/CD environment variables."
+ exit 1
+ fi
+
+ echo "Scanning codebase for secrets..."
+ echo "Note: Large codebases may take several minutes due to API rate limits (50 requests/minute on free plan)"
+ echo "ggshield will automatically handle rate limits and retry as needed."
+ echo "Binary files, cache files, and build artifacts are excluded via .gitguardian.yaml"
+
+ # Use --recursive for directory scanning and auto-confirm if prompted
+ # .gitguardian.yaml will automatically exclude binary files, wheel files, etc.
+ # GITGUARDIAN_API_KEY environment variable will be used for authentication
+ echo y | ggshield secret scan path . --recursive || {
+ echo ""
+ echo "=========================================="
+ echo "ERROR: Secret Detection Failed"
+ echo "=========================================="
+ echo "ggshield has detected secrets in the codebase."
+ echo "Please review discovered secrets above, revoke any actively used secrets"
+ echo "from underlying systems and make changes to inject secrets dynamically at runtime."
+ echo ""
+ echo "For more information, see: https://docs.gitguardian.com/secrets-detection/"
+ echo "=========================================="
+ echo ""
+ exit 1
+ }
+
+ echo "Secret detection scans completed successfully"
+}
+
# Function to run Trivy scans
run_trivy_scans() {
echo "Running Trivy scans..."
@@ -78,6 +128,7 @@ run_grype_scans() {
"GHSA-5j98-mcp5-4vw2"
"CVE-2025-13836" # Python 3.13 HTTP response reading OOM/DoS - no fix available in base image
"CVE-2025-12084" # Python 3.13 xml.dom.minidom quadratic algorithm - no fix available in base image
+ "CVE-2025-60876" # BusyBox wget HTTP request splitting - no fix available in Chainguard Wolfi base image
)
# Build JSON array of allowlisted CVE IDs for jq
@@ -157,6 +208,10 @@ main() {
echo "Installing security scanning tools..."
install_trivy
install_grype
+ install_ggshield
+
+ echo "Running secret detection scans..."
+ run_secret_detection
echo "Running filesystem vulnerability scans..."
run_trivy_scans
diff --git a/deploy/migrations/20260106081922_initial/README.md b/deploy/migrations/20260106081922_initial/README.md
new file mode 100644
index 00000000000..108c41a0db6
--- /dev/null
+++ b/deploy/migrations/20260106081922_initial/README.md
@@ -0,0 +1 @@
+Initial migration generated at Tue Jan 6 08:19:28 UTC 2026
diff --git a/deploy/migrations/20260106081922_initial/migration.sql b/deploy/migrations/20260106081922_initial/migration.sql
new file mode 100644
index 00000000000..dc44ca166be
--- /dev/null
+++ b/deploy/migrations/20260106081922_initial/migration.sql
@@ -0,0 +1,872 @@
+-- CreateEnum
+CREATE TYPE "JobStatus" AS ENUM ('ACTIVE', 'INACTIVE');
+
+-- CreateTable
+CREATE TABLE "LiteLLM_BudgetTable" (
+ "budget_id" TEXT NOT NULL,
+ "max_budget" DOUBLE PRECISION,
+ "soft_budget" DOUBLE PRECISION,
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "model_max_budget" JSONB,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_BudgetTable_pkey" PRIMARY KEY ("budget_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CredentialsTable" (
+ "credential_id" TEXT NOT NULL,
+ "credential_name" TEXT NOT NULL,
+ "credential_values" JSONB NOT NULL,
+ "credential_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_CredentialsTable_pkey" PRIMARY KEY ("credential_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ProxyModelTable" (
+ "model_id" TEXT NOT NULL,
+ "model_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "model_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_ProxyModelTable_pkey" PRIMARY KEY ("model_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_AgentsTable" (
+ "agent_id" TEXT NOT NULL,
+ "agent_name" TEXT NOT NULL,
+ "litellm_params" JSONB,
+ "agent_card_params" JSONB NOT NULL,
+ "agent_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_AgentsTable_pkey" PRIMARY KEY ("agent_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_OrganizationTable" (
+ "organization_id" TEXT NOT NULL,
+ "organization_alias" TEXT NOT NULL,
+ "budget_id" TEXT NOT NULL,
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "models" TEXT[],
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "object_permission_id" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_OrganizationTable_pkey" PRIMARY KEY ("organization_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ModelTable" (
+ "id" SERIAL NOT NULL,
+ "aliases" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_ModelTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TeamTable" (
+ "team_id" TEXT NOT NULL,
+ "team_alias" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "admins" TEXT[],
+ "members" TEXT[],
+ "members_with_roles" JSONB NOT NULL DEFAULT '{}',
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "max_budget" DOUBLE PRECISION,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "models" TEXT[],
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "blocked" BOOLEAN NOT NULL DEFAULT false,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "team_member_permissions" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_id" INTEGER,
+
+ CONSTRAINT "LiteLLM_TeamTable_pkey" PRIMARY KEY ("team_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_UserTable" (
+ "user_id" TEXT NOT NULL,
+ "user_alias" TEXT,
+ "team_id" TEXT,
+ "sso_user_id" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "password" TEXT,
+ "teams" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "user_role" TEXT,
+ "max_budget" DOUBLE PRECISION,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "user_email" TEXT,
+ "models" TEXT[],
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_UserTable_pkey" PRIMARY KEY ("user_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ObjectPermissionTable" (
+ "object_permission_id" TEXT NOT NULL,
+ "mcp_servers" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "mcp_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "mcp_tool_permissions" JSONB,
+ "vector_stores" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "agents" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "agent_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+
+ CONSTRAINT "LiteLLM_ObjectPermissionTable_pkey" PRIMARY KEY ("object_permission_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_MCPServerTable" (
+ "server_id" TEXT NOT NULL,
+ "server_name" TEXT,
+ "alias" TEXT,
+ "description" TEXT,
+ "url" TEXT,
+ "transport" TEXT NOT NULL DEFAULT 'sse',
+ "auth_type" TEXT,
+ "credentials" JSONB DEFAULT '{}',
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT,
+ "mcp_info" JSONB DEFAULT '{}',
+ "mcp_access_groups" TEXT[],
+ "allowed_tools" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "extra_headers" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "static_headers" JSONB DEFAULT '{}',
+ "status" TEXT DEFAULT 'unknown',
+ "last_health_check" TIMESTAMP(3),
+ "health_check_error" TEXT,
+ "command" TEXT,
+ "args" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "env" JSONB DEFAULT '{}',
+
+ CONSTRAINT "LiteLLM_MCPServerTable_pkey" PRIMARY KEY ("server_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_VerificationToken" (
+ "token" TEXT NOT NULL,
+ "key_name" TEXT,
+ "key_alias" TEXT,
+ "soft_budget_cooldown" BOOLEAN NOT NULL DEFAULT false,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "expires" TIMESTAMP(3),
+ "models" TEXT[],
+ "aliases" JSONB NOT NULL DEFAULT '{}',
+ "config" JSONB NOT NULL DEFAULT '{}',
+ "user_id" TEXT,
+ "team_id" TEXT,
+ "permissions" JSONB NOT NULL DEFAULT '{}',
+ "max_parallel_requests" INTEGER,
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "blocked" BOOLEAN,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "max_budget" DOUBLE PRECISION,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "allowed_routes" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "budget_id" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT,
+ "rotation_count" INTEGER DEFAULT 0,
+ "auto_rotate" BOOLEAN DEFAULT false,
+ "rotation_interval" TEXT,
+ "last_rotation_at" TIMESTAMP(3),
+ "key_rotation_at" TIMESTAMP(3),
+
+ CONSTRAINT "LiteLLM_VerificationToken_pkey" PRIMARY KEY ("token")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_EndUserTable" (
+ "user_id" TEXT NOT NULL,
+ "alias" TEXT,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "allowed_model_region" TEXT,
+ "default_model" TEXT,
+ "budget_id" TEXT,
+ "blocked" BOOLEAN NOT NULL DEFAULT false,
+
+ CONSTRAINT "LiteLLM_EndUserTable_pkey" PRIMARY KEY ("user_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TagTable" (
+ "tag_name" TEXT NOT NULL,
+ "description" TEXT,
+ "models" TEXT[],
+ "model_info" JSONB,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "budget_id" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_TagTable_pkey" PRIMARY KEY ("tag_name")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_Config" (
+ "param_name" TEXT NOT NULL,
+ "param_value" JSONB,
+
+ CONSTRAINT "LiteLLM_Config_pkey" PRIMARY KEY ("param_name")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SpendLogs" (
+ "request_id" TEXT NOT NULL,
+ "call_type" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL DEFAULT '',
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "total_tokens" INTEGER NOT NULL DEFAULT 0,
+ "prompt_tokens" INTEGER NOT NULL DEFAULT 0,
+ "completion_tokens" INTEGER NOT NULL DEFAULT 0,
+ "startTime" TIMESTAMP(3) NOT NULL,
+ "endTime" TIMESTAMP(3) NOT NULL,
+ "completionStartTime" TIMESTAMP(3),
+ "model" TEXT NOT NULL DEFAULT '',
+ "model_id" TEXT DEFAULT '',
+ "model_group" TEXT DEFAULT '',
+ "custom_llm_provider" TEXT DEFAULT '',
+ "api_base" TEXT DEFAULT '',
+ "user" TEXT DEFAULT '',
+ "metadata" JSONB DEFAULT '{}',
+ "cache_hit" TEXT DEFAULT '',
+ "cache_key" TEXT DEFAULT '',
+ "request_tags" JSONB DEFAULT '[]',
+ "team_id" TEXT,
+ "organization_id" TEXT,
+ "end_user" TEXT,
+ "requester_ip_address" TEXT,
+ "messages" JSONB DEFAULT '{}',
+ "response" JSONB DEFAULT '{}',
+ "session_id" TEXT,
+ "status" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "proxy_server_request" JSONB DEFAULT '{}',
+
+ CONSTRAINT "LiteLLM_SpendLogs_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ErrorLogs" (
+ "request_id" TEXT NOT NULL,
+ "startTime" TIMESTAMP(3) NOT NULL,
+ "endTime" TIMESTAMP(3) NOT NULL,
+ "api_base" TEXT NOT NULL DEFAULT '',
+ "model_group" TEXT NOT NULL DEFAULT '',
+ "litellm_model_name" TEXT NOT NULL DEFAULT '',
+ "model_id" TEXT NOT NULL DEFAULT '',
+ "request_kwargs" JSONB NOT NULL DEFAULT '{}',
+ "exception_type" TEXT NOT NULL DEFAULT '',
+ "exception_string" TEXT NOT NULL DEFAULT '',
+ "status_code" TEXT NOT NULL DEFAULT '',
+
+ CONSTRAINT "LiteLLM_ErrorLogs_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_UserNotifications" (
+ "request_id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "models" TEXT[],
+ "justification" TEXT NOT NULL,
+ "status" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_UserNotifications_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TeamMembership" (
+ "user_id" TEXT NOT NULL,
+ "team_id" TEXT NOT NULL,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "budget_id" TEXT,
+
+ CONSTRAINT "LiteLLM_TeamMembership_pkey" PRIMARY KEY ("user_id","team_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_OrganizationMembership" (
+ "user_id" TEXT NOT NULL,
+ "organization_id" TEXT NOT NULL,
+ "user_role" TEXT,
+ "spend" DOUBLE PRECISION DEFAULT 0.0,
+ "budget_id" TEXT,
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_OrganizationMembership_pkey" PRIMARY KEY ("user_id","organization_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_InvitationLink" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "is_accepted" BOOLEAN NOT NULL DEFAULT false,
+ "accepted_at" TIMESTAMP(3),
+ "expires_at" TIMESTAMP(3) NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_InvitationLink_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_AuditLog" (
+ "id" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "changed_by" TEXT NOT NULL DEFAULT '',
+ "changed_by_api_key" TEXT NOT NULL DEFAULT '',
+ "action" TEXT NOT NULL,
+ "table_name" TEXT NOT NULL,
+ "object_id" TEXT NOT NULL,
+ "before_value" JSONB,
+ "updated_values" JSONB,
+
+ CONSTRAINT "LiteLLM_AuditLog_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyUserSpend" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyUserSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyOrganizationSpend" (
+ "id" TEXT NOT NULL,
+ "organization_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyOrganizationSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyEndUserSpend" (
+ "id" TEXT NOT NULL,
+ "end_user_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyEndUserSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyTeamSpend" (
+ "id" TEXT NOT NULL,
+ "team_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyTeamSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyTagSpend" (
+ "id" TEXT NOT NULL,
+ "request_id" TEXT,
+ "tag" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyTagSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CronJob" (
+ "cronjob_id" TEXT NOT NULL,
+ "pod_id" TEXT NOT NULL,
+ "status" "JobStatus" NOT NULL DEFAULT 'INACTIVE',
+ "last_updated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "ttl" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_CronJob_pkey" PRIMARY KEY ("cronjob_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedFileTable" (
+ "id" TEXT NOT NULL,
+ "unified_file_id" TEXT NOT NULL,
+ "file_object" JSONB,
+ "model_mappings" JSONB NOT NULL,
+ "flat_model_file_ids" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedFileTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedObjectTable" (
+ "id" TEXT NOT NULL,
+ "unified_object_id" TEXT NOT NULL,
+ "model_object_id" TEXT NOT NULL,
+ "file_object" JSONB NOT NULL,
+ "file_purpose" TEXT NOT NULL,
+ "status" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedObjectTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedVectorStoresTable" (
+ "vector_store_id" TEXT NOT NULL,
+ "custom_llm_provider" TEXT NOT NULL,
+ "vector_store_name" TEXT,
+ "vector_store_description" TEXT,
+ "vector_store_metadata" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "litellm_credential_name" TEXT,
+ "litellm_params" JSONB,
+
+ CONSTRAINT "LiteLLM_ManagedVectorStoresTable_pkey" PRIMARY KEY ("vector_store_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_GuardrailsTable" (
+ "guardrail_id" TEXT NOT NULL,
+ "guardrail_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "guardrail_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_GuardrailsTable_pkey" PRIMARY KEY ("guardrail_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_PromptTable" (
+ "id" TEXT NOT NULL,
+ "prompt_id" TEXT NOT NULL,
+ "version" INTEGER NOT NULL DEFAULT 1,
+ "litellm_params" JSONB NOT NULL,
+ "prompt_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_PromptTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_HealthCheckTable" (
+ "health_check_id" TEXT NOT NULL,
+ "model_name" TEXT NOT NULL,
+ "model_id" TEXT,
+ "status" TEXT NOT NULL,
+ "healthy_count" INTEGER NOT NULL DEFAULT 0,
+ "unhealthy_count" INTEGER NOT NULL DEFAULT 0,
+ "error_message" TEXT,
+ "response_time_ms" DOUBLE PRECISION,
+ "details" JSONB,
+ "checked_by" TEXT,
+ "checked_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_HealthCheckTable_pkey" PRIMARY KEY ("health_check_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SearchToolsTable" (
+ "search_tool_id" TEXT NOT NULL,
+ "search_tool_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "search_tool_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_SearchToolsTable_pkey" PRIMARY KEY ("search_tool_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SSOConfig" (
+ "id" TEXT NOT NULL DEFAULT 'sso_config',
+ "sso_settings" JSONB NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_SSOConfig_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedVectorStoreIndexTable" (
+ "id" TEXT NOT NULL,
+ "index_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "index_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedVectorStoreIndexTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CacheConfig" (
+ "id" TEXT NOT NULL DEFAULT 'cache_config',
+ "cache_settings" JSONB NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_CacheConfig_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_CredentialsTable_credential_name_key" ON "LiteLLM_CredentialsTable"("credential_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_AgentsTable_agent_name_key" ON "LiteLLM_AgentsTable"("agent_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_TeamTable_model_id_key" ON "LiteLLM_TeamTable"("model_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_UserTable_sso_user_id_key" ON "LiteLLM_UserTable"("sso_user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_startTime_idx" ON "LiteLLM_SpendLogs"("startTime");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_end_user_idx" ON "LiteLLM_SpendLogs"("end_user");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_session_id_idx" ON "LiteLLM_SpendLogs"("session_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_OrganizationMembership_user_id_organization_id_key" ON "LiteLLM_OrganizationMembership"("user_id", "organization_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_date_idx" ON "LiteLLM_DailyUserSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_user_id_idx" ON "LiteLLM_DailyUserSpend"("user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_api_key_idx" ON "LiteLLM_DailyUserSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_model_idx" ON "LiteLLM_DailyUserSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyUserSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+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", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_date_idx" ON "LiteLLM_DailyOrganizationSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_idx" ON "LiteLLM_DailyOrganizationSpend"("organization_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_api_key_idx" ON "LiteLLM_DailyOrganizationSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_model_idx" ON "LiteLLM_DailyOrganizationSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyOrganizationSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_date_api_key_key" ON "LiteLLM_DailyOrganizationSpend"("organization_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_date_idx" ON "LiteLLM_DailyEndUserSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_idx" ON "LiteLLM_DailyEndUserSpend"("end_user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_api_key_idx" ON "LiteLLM_DailyEndUserSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_model_idx" ON "LiteLLM_DailyEndUserSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyEndUserSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_date_api_key_model_cu_key" ON "LiteLLM_DailyEndUserSpend"("end_user_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_date_idx" ON "LiteLLM_DailyTeamSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_team_id_idx" ON "LiteLLM_DailyTeamSpend"("team_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_api_key_idx" ON "LiteLLM_DailyTeamSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_model_idx" ON "LiteLLM_DailyTeamSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyTeamSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+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", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_date_idx" ON "LiteLLM_DailyTagSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_tag_idx" ON "LiteLLM_DailyTagSpend"("tag");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_api_key_idx" ON "LiteLLM_DailyTagSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_model_idx" ON "LiteLLM_DailyTagSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyTagSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyTagSpend_tag_date_api_key_model_custom_llm_pro_key" ON "LiteLLM_DailyTagSpend"("tag", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedFileTable_unified_file_id_key" ON "LiteLLM_ManagedFileTable"("unified_file_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedFileTable_unified_file_id_idx" ON "LiteLLM_ManagedFileTable"("unified_file_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedObjectTable_unified_object_id_key" ON "LiteLLM_ManagedObjectTable"("unified_object_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedObjectTable_model_object_id_key" ON "LiteLLM_ManagedObjectTable"("model_object_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedObjectTable_unified_object_id_idx" ON "LiteLLM_ManagedObjectTable"("unified_object_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedObjectTable_model_object_id_idx" ON "LiteLLM_ManagedObjectTable"("model_object_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_GuardrailsTable_guardrail_name_key" ON "LiteLLM_GuardrailsTable"("guardrail_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_PromptTable_prompt_id_idx" ON "LiteLLM_PromptTable"("prompt_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_PromptTable_prompt_id_version_key" ON "LiteLLM_PromptTable"("prompt_id", "version");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_model_name_idx" ON "LiteLLM_HealthCheckTable"("model_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_checked_at_idx" ON "LiteLLM_HealthCheckTable"("checked_at");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_status_idx" ON "LiteLLM_HealthCheckTable"("status");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_SearchToolsTable_search_tool_name_key" ON "LiteLLM_SearchToolsTable"("search_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedVectorStoreIndexTable_index_name_key" ON "LiteLLM_ManagedVectorStoreIndexTable"("index_name");
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_OrganizationTable" ADD CONSTRAINT "LiteLLM_OrganizationTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_TeamTable" ADD CONSTRAINT "LiteLLM_TeamTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_UserTable" ADD CONSTRAINT "LiteLLM_UserTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_VerificationToken" ADD CONSTRAINT "LiteLLM_VerificationToken_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_TagTable" ADD CONSTRAINT "LiteLLM_TagTable_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
diff --git a/deploy/migrations/20260106081922_initial/raw_migration.sql b/deploy/migrations/20260106081922_initial/raw_migration.sql
new file mode 100644
index 00000000000..13aada6cffe
--- /dev/null
+++ b/deploy/migrations/20260106081922_initial/raw_migration.sql
@@ -0,0 +1,873 @@
+Installing Prisma CLI
+-- CreateEnum
+CREATE TYPE "JobStatus" AS ENUM ('ACTIVE', 'INACTIVE');
+
+-- CreateTable
+CREATE TABLE "LiteLLM_BudgetTable" (
+ "budget_id" TEXT NOT NULL,
+ "max_budget" DOUBLE PRECISION,
+ "soft_budget" DOUBLE PRECISION,
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "model_max_budget" JSONB,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_BudgetTable_pkey" PRIMARY KEY ("budget_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CredentialsTable" (
+ "credential_id" TEXT NOT NULL,
+ "credential_name" TEXT NOT NULL,
+ "credential_values" JSONB NOT NULL,
+ "credential_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_CredentialsTable_pkey" PRIMARY KEY ("credential_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ProxyModelTable" (
+ "model_id" TEXT NOT NULL,
+ "model_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "model_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_ProxyModelTable_pkey" PRIMARY KEY ("model_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_AgentsTable" (
+ "agent_id" TEXT NOT NULL,
+ "agent_name" TEXT NOT NULL,
+ "litellm_params" JSONB,
+ "agent_card_params" JSONB NOT NULL,
+ "agent_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_AgentsTable_pkey" PRIMARY KEY ("agent_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_OrganizationTable" (
+ "organization_id" TEXT NOT NULL,
+ "organization_alias" TEXT NOT NULL,
+ "budget_id" TEXT NOT NULL,
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "models" TEXT[],
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "object_permission_id" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_OrganizationTable_pkey" PRIMARY KEY ("organization_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ModelTable" (
+ "id" SERIAL NOT NULL,
+ "aliases" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_ModelTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TeamTable" (
+ "team_id" TEXT NOT NULL,
+ "team_alias" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "admins" TEXT[],
+ "members" TEXT[],
+ "members_with_roles" JSONB NOT NULL DEFAULT '{}',
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "max_budget" DOUBLE PRECISION,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "models" TEXT[],
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "blocked" BOOLEAN NOT NULL DEFAULT false,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "team_member_permissions" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_id" INTEGER,
+
+ CONSTRAINT "LiteLLM_TeamTable_pkey" PRIMARY KEY ("team_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_UserTable" (
+ "user_id" TEXT NOT NULL,
+ "user_alias" TEXT,
+ "team_id" TEXT,
+ "sso_user_id" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "password" TEXT,
+ "teams" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "user_role" TEXT,
+ "max_budget" DOUBLE PRECISION,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "user_email" TEXT,
+ "models" TEXT[],
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_UserTable_pkey" PRIMARY KEY ("user_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ObjectPermissionTable" (
+ "object_permission_id" TEXT NOT NULL,
+ "mcp_servers" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "mcp_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "mcp_tool_permissions" JSONB,
+ "vector_stores" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "agents" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "agent_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+
+ CONSTRAINT "LiteLLM_ObjectPermissionTable_pkey" PRIMARY KEY ("object_permission_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_MCPServerTable" (
+ "server_id" TEXT NOT NULL,
+ "server_name" TEXT,
+ "alias" TEXT,
+ "description" TEXT,
+ "url" TEXT,
+ "transport" TEXT NOT NULL DEFAULT 'sse',
+ "auth_type" TEXT,
+ "credentials" JSONB DEFAULT '{}',
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT,
+ "mcp_info" JSONB DEFAULT '{}',
+ "mcp_access_groups" TEXT[],
+ "allowed_tools" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "extra_headers" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "static_headers" JSONB DEFAULT '{}',
+ "status" TEXT DEFAULT 'unknown',
+ "last_health_check" TIMESTAMP(3),
+ "health_check_error" TEXT,
+ "command" TEXT,
+ "args" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "env" JSONB DEFAULT '{}',
+
+ CONSTRAINT "LiteLLM_MCPServerTable_pkey" PRIMARY KEY ("server_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_VerificationToken" (
+ "token" TEXT NOT NULL,
+ "key_name" TEXT,
+ "key_alias" TEXT,
+ "soft_budget_cooldown" BOOLEAN NOT NULL DEFAULT false,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "expires" TIMESTAMP(3),
+ "models" TEXT[],
+ "aliases" JSONB NOT NULL DEFAULT '{}',
+ "config" JSONB NOT NULL DEFAULT '{}',
+ "user_id" TEXT,
+ "team_id" TEXT,
+ "permissions" JSONB NOT NULL DEFAULT '{}',
+ "max_parallel_requests" INTEGER,
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "blocked" BOOLEAN,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "max_budget" DOUBLE PRECISION,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "allowed_routes" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "budget_id" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT,
+ "rotation_count" INTEGER DEFAULT 0,
+ "auto_rotate" BOOLEAN DEFAULT false,
+ "rotation_interval" TEXT,
+ "last_rotation_at" TIMESTAMP(3),
+ "key_rotation_at" TIMESTAMP(3),
+
+ CONSTRAINT "LiteLLM_VerificationToken_pkey" PRIMARY KEY ("token")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_EndUserTable" (
+ "user_id" TEXT NOT NULL,
+ "alias" TEXT,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "allowed_model_region" TEXT,
+ "default_model" TEXT,
+ "budget_id" TEXT,
+ "blocked" BOOLEAN NOT NULL DEFAULT false,
+
+ CONSTRAINT "LiteLLM_EndUserTable_pkey" PRIMARY KEY ("user_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TagTable" (
+ "tag_name" TEXT NOT NULL,
+ "description" TEXT,
+ "models" TEXT[],
+ "model_info" JSONB,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "budget_id" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_TagTable_pkey" PRIMARY KEY ("tag_name")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_Config" (
+ "param_name" TEXT NOT NULL,
+ "param_value" JSONB,
+
+ CONSTRAINT "LiteLLM_Config_pkey" PRIMARY KEY ("param_name")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SpendLogs" (
+ "request_id" TEXT NOT NULL,
+ "call_type" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL DEFAULT '',
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "total_tokens" INTEGER NOT NULL DEFAULT 0,
+ "prompt_tokens" INTEGER NOT NULL DEFAULT 0,
+ "completion_tokens" INTEGER NOT NULL DEFAULT 0,
+ "startTime" TIMESTAMP(3) NOT NULL,
+ "endTime" TIMESTAMP(3) NOT NULL,
+ "completionStartTime" TIMESTAMP(3),
+ "model" TEXT NOT NULL DEFAULT '',
+ "model_id" TEXT DEFAULT '',
+ "model_group" TEXT DEFAULT '',
+ "custom_llm_provider" TEXT DEFAULT '',
+ "api_base" TEXT DEFAULT '',
+ "user" TEXT DEFAULT '',
+ "metadata" JSONB DEFAULT '{}',
+ "cache_hit" TEXT DEFAULT '',
+ "cache_key" TEXT DEFAULT '',
+ "request_tags" JSONB DEFAULT '[]',
+ "team_id" TEXT,
+ "organization_id" TEXT,
+ "end_user" TEXT,
+ "requester_ip_address" TEXT,
+ "messages" JSONB DEFAULT '{}',
+ "response" JSONB DEFAULT '{}',
+ "session_id" TEXT,
+ "status" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "proxy_server_request" JSONB DEFAULT '{}',
+
+ CONSTRAINT "LiteLLM_SpendLogs_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ErrorLogs" (
+ "request_id" TEXT NOT NULL,
+ "startTime" TIMESTAMP(3) NOT NULL,
+ "endTime" TIMESTAMP(3) NOT NULL,
+ "api_base" TEXT NOT NULL DEFAULT '',
+ "model_group" TEXT NOT NULL DEFAULT '',
+ "litellm_model_name" TEXT NOT NULL DEFAULT '',
+ "model_id" TEXT NOT NULL DEFAULT '',
+ "request_kwargs" JSONB NOT NULL DEFAULT '{}',
+ "exception_type" TEXT NOT NULL DEFAULT '',
+ "exception_string" TEXT NOT NULL DEFAULT '',
+ "status_code" TEXT NOT NULL DEFAULT '',
+
+ CONSTRAINT "LiteLLM_ErrorLogs_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_UserNotifications" (
+ "request_id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "models" TEXT[],
+ "justification" TEXT NOT NULL,
+ "status" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_UserNotifications_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TeamMembership" (
+ "user_id" TEXT NOT NULL,
+ "team_id" TEXT NOT NULL,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "budget_id" TEXT,
+
+ CONSTRAINT "LiteLLM_TeamMembership_pkey" PRIMARY KEY ("user_id","team_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_OrganizationMembership" (
+ "user_id" TEXT NOT NULL,
+ "organization_id" TEXT NOT NULL,
+ "user_role" TEXT,
+ "spend" DOUBLE PRECISION DEFAULT 0.0,
+ "budget_id" TEXT,
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_OrganizationMembership_pkey" PRIMARY KEY ("user_id","organization_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_InvitationLink" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "is_accepted" BOOLEAN NOT NULL DEFAULT false,
+ "accepted_at" TIMESTAMP(3),
+ "expires_at" TIMESTAMP(3) NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_InvitationLink_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_AuditLog" (
+ "id" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "changed_by" TEXT NOT NULL DEFAULT '',
+ "changed_by_api_key" TEXT NOT NULL DEFAULT '',
+ "action" TEXT NOT NULL,
+ "table_name" TEXT NOT NULL,
+ "object_id" TEXT NOT NULL,
+ "before_value" JSONB,
+ "updated_values" JSONB,
+
+ CONSTRAINT "LiteLLM_AuditLog_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyUserSpend" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyUserSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyOrganizationSpend" (
+ "id" TEXT NOT NULL,
+ "organization_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyOrganizationSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyEndUserSpend" (
+ "id" TEXT NOT NULL,
+ "end_user_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyEndUserSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyTeamSpend" (
+ "id" TEXT NOT NULL,
+ "team_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyTeamSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyTagSpend" (
+ "id" TEXT NOT NULL,
+ "request_id" TEXT,
+ "tag" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyTagSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CronJob" (
+ "cronjob_id" TEXT NOT NULL,
+ "pod_id" TEXT NOT NULL,
+ "status" "JobStatus" NOT NULL DEFAULT 'INACTIVE',
+ "last_updated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "ttl" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_CronJob_pkey" PRIMARY KEY ("cronjob_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedFileTable" (
+ "id" TEXT NOT NULL,
+ "unified_file_id" TEXT NOT NULL,
+ "file_object" JSONB,
+ "model_mappings" JSONB NOT NULL,
+ "flat_model_file_ids" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedFileTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedObjectTable" (
+ "id" TEXT NOT NULL,
+ "unified_object_id" TEXT NOT NULL,
+ "model_object_id" TEXT NOT NULL,
+ "file_object" JSONB NOT NULL,
+ "file_purpose" TEXT NOT NULL,
+ "status" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedObjectTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedVectorStoresTable" (
+ "vector_store_id" TEXT NOT NULL,
+ "custom_llm_provider" TEXT NOT NULL,
+ "vector_store_name" TEXT,
+ "vector_store_description" TEXT,
+ "vector_store_metadata" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "litellm_credential_name" TEXT,
+ "litellm_params" JSONB,
+
+ CONSTRAINT "LiteLLM_ManagedVectorStoresTable_pkey" PRIMARY KEY ("vector_store_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_GuardrailsTable" (
+ "guardrail_id" TEXT NOT NULL,
+ "guardrail_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "guardrail_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_GuardrailsTable_pkey" PRIMARY KEY ("guardrail_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_PromptTable" (
+ "id" TEXT NOT NULL,
+ "prompt_id" TEXT NOT NULL,
+ "version" INTEGER NOT NULL DEFAULT 1,
+ "litellm_params" JSONB NOT NULL,
+ "prompt_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_PromptTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_HealthCheckTable" (
+ "health_check_id" TEXT NOT NULL,
+ "model_name" TEXT NOT NULL,
+ "model_id" TEXT,
+ "status" TEXT NOT NULL,
+ "healthy_count" INTEGER NOT NULL DEFAULT 0,
+ "unhealthy_count" INTEGER NOT NULL DEFAULT 0,
+ "error_message" TEXT,
+ "response_time_ms" DOUBLE PRECISION,
+ "details" JSONB,
+ "checked_by" TEXT,
+ "checked_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_HealthCheckTable_pkey" PRIMARY KEY ("health_check_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SearchToolsTable" (
+ "search_tool_id" TEXT NOT NULL,
+ "search_tool_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "search_tool_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_SearchToolsTable_pkey" PRIMARY KEY ("search_tool_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SSOConfig" (
+ "id" TEXT NOT NULL DEFAULT 'sso_config',
+ "sso_settings" JSONB NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_SSOConfig_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedVectorStoreIndexTable" (
+ "id" TEXT NOT NULL,
+ "index_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "index_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedVectorStoreIndexTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CacheConfig" (
+ "id" TEXT NOT NULL DEFAULT 'cache_config',
+ "cache_settings" JSONB NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_CacheConfig_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_CredentialsTable_credential_name_key" ON "LiteLLM_CredentialsTable"("credential_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_AgentsTable_agent_name_key" ON "LiteLLM_AgentsTable"("agent_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_TeamTable_model_id_key" ON "LiteLLM_TeamTable"("model_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_UserTable_sso_user_id_key" ON "LiteLLM_UserTable"("sso_user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_startTime_idx" ON "LiteLLM_SpendLogs"("startTime");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_end_user_idx" ON "LiteLLM_SpendLogs"("end_user");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_session_id_idx" ON "LiteLLM_SpendLogs"("session_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_OrganizationMembership_user_id_organization_id_key" ON "LiteLLM_OrganizationMembership"("user_id", "organization_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_date_idx" ON "LiteLLM_DailyUserSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_user_id_idx" ON "LiteLLM_DailyUserSpend"("user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_api_key_idx" ON "LiteLLM_DailyUserSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_model_idx" ON "LiteLLM_DailyUserSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyUserSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+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", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_date_idx" ON "LiteLLM_DailyOrganizationSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_idx" ON "LiteLLM_DailyOrganizationSpend"("organization_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_api_key_idx" ON "LiteLLM_DailyOrganizationSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_model_idx" ON "LiteLLM_DailyOrganizationSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyOrganizationSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_date_api_key_key" ON "LiteLLM_DailyOrganizationSpend"("organization_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_date_idx" ON "LiteLLM_DailyEndUserSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_idx" ON "LiteLLM_DailyEndUserSpend"("end_user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_api_key_idx" ON "LiteLLM_DailyEndUserSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_model_idx" ON "LiteLLM_DailyEndUserSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyEndUserSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_date_api_key_model_cu_key" ON "LiteLLM_DailyEndUserSpend"("end_user_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_date_idx" ON "LiteLLM_DailyTeamSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_team_id_idx" ON "LiteLLM_DailyTeamSpend"("team_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_api_key_idx" ON "LiteLLM_DailyTeamSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_model_idx" ON "LiteLLM_DailyTeamSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyTeamSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+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", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_date_idx" ON "LiteLLM_DailyTagSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_tag_idx" ON "LiteLLM_DailyTagSpend"("tag");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_api_key_idx" ON "LiteLLM_DailyTagSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_model_idx" ON "LiteLLM_DailyTagSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyTagSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyTagSpend_tag_date_api_key_model_custom_llm_pro_key" ON "LiteLLM_DailyTagSpend"("tag", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedFileTable_unified_file_id_key" ON "LiteLLM_ManagedFileTable"("unified_file_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedFileTable_unified_file_id_idx" ON "LiteLLM_ManagedFileTable"("unified_file_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedObjectTable_unified_object_id_key" ON "LiteLLM_ManagedObjectTable"("unified_object_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedObjectTable_model_object_id_key" ON "LiteLLM_ManagedObjectTable"("model_object_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedObjectTable_unified_object_id_idx" ON "LiteLLM_ManagedObjectTable"("unified_object_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedObjectTable_model_object_id_idx" ON "LiteLLM_ManagedObjectTable"("model_object_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_GuardrailsTable_guardrail_name_key" ON "LiteLLM_GuardrailsTable"("guardrail_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_PromptTable_prompt_id_idx" ON "LiteLLM_PromptTable"("prompt_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_PromptTable_prompt_id_version_key" ON "LiteLLM_PromptTable"("prompt_id", "version");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_model_name_idx" ON "LiteLLM_HealthCheckTable"("model_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_checked_at_idx" ON "LiteLLM_HealthCheckTable"("checked_at");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_status_idx" ON "LiteLLM_HealthCheckTable"("status");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_SearchToolsTable_search_tool_name_key" ON "LiteLLM_SearchToolsTable"("search_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedVectorStoreIndexTable_index_name_key" ON "LiteLLM_ManagedVectorStoreIndexTable"("index_name");
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_OrganizationTable" ADD CONSTRAINT "LiteLLM_OrganizationTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_TeamTable" ADD CONSTRAINT "LiteLLM_TeamTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_UserTable" ADD CONSTRAINT "LiteLLM_UserTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_VerificationToken" ADD CONSTRAINT "LiteLLM_VerificationToken_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_TagTable" ADD CONSTRAINT "LiteLLM_TagTable_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
diff --git a/deploy/migrations/20260106081928_schema_update/README.md b/deploy/migrations/20260106081928_schema_update/README.md
new file mode 100644
index 00000000000..acf6f476ee9
--- /dev/null
+++ b/deploy/migrations/20260106081928_schema_update/README.md
@@ -0,0 +1 @@
+Migration generated at Tue Jan 6 08:19:29 UTC 2026
diff --git a/deploy/migrations/20260106081928_schema_update/migration.sql b/deploy/migrations/20260106081928_schema_update/migration.sql
new file mode 100644
index 00000000000..2f725d83806
--- /dev/null
+++ b/deploy/migrations/20260106081928_schema_update/migration.sql
@@ -0,0 +1,2 @@
+-- This is an empty migration.
+
diff --git a/deploy/migrations/migration_lock.toml b/deploy/migrations/migration_lock.toml
new file mode 100644
index 00000000000..2fe25d87cc3
--- /dev/null
+++ b/deploy/migrations/migration_lock.toml
@@ -0,0 +1 @@
+provider = "postgresql"
diff --git a/docs/my-website/blog/gemini_3_flash/index.md b/docs/my-website/blog/gemini_3_flash/index.md
new file mode 100644
index 00000000000..730029b1af8
--- /dev/null
+++ b/docs/my-website/blog/gemini_3_flash/index.md
@@ -0,0 +1,222 @@
+---
+slug: gemini_3_flash
+title: "DAY 0 Support: Gemini 3 Flash on LiteLLM"
+date: 2025-12-17T10:00:00
+authors:
+ - name: Sameer Kankute
+ title: SWE @ LiteLLM (LLM Translation)
+ url: https://www.linkedin.com/in/sameer-kankute/
+ image_url: https://media.licdn.com/dms/image/v2/D4D03AQHB_loQYd5gjg/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1719137160975?e=1765411200&v=beta&t=c8396f--_lH6Fb_pVvx_jGholPfcl0bvwmNynbNdnII
+ - name: Krrish Dholakia
+ title: "CEO, LiteLLM"
+ url: https://www.linkedin.com/in/krish-d/
+ image_url: https://pbs.twimg.com/profile_images/1298587542745358340/DZv3Oj-h_400x400.jpg
+ - name: Ishaan Jaff
+ title: "CTO, LiteLLM"
+ url: https://www.linkedin.com/in/reffajnaahsi/
+ image_url: https://pbs.twimg.com/profile_images/1613813310264340481/lz54oEiB_400x400.jpg
+tags: [gemini, day 0 support, llms]
+hide_table_of_contents: false
+---
+
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Gemini 3 Flash Day 0 Support
+
+LiteLLM now supports `gemini-3-flash-preview` and all the new API changes along with it.
+
+## What's New
+
+### 1. New Thinking Levels: `thinkingLevel` with MINIMAL & MEDIUM
+
+Gemini 3 Flash introduces granular thinking control with `thinkingLevel` instead of `thinkingBudget`.
+- **MINIMAL**: Ultra-lightweight thinking for fast responses
+- **MEDIUM**: Balanced thinking for complex reasoning
+- **HIGH**: Maximum reasoning depth
+
+LiteLLM automatically maps the OpenAI `reasoning_effort` parameter to Gemini's `thinkingLevel`, so you can use familiar `reasoning_effort` values (`minimal`, `low`, `medium`, `high`) without changing your code!
+
+### 2. Thought Signatures
+
+Like `gemini-3-pro`, this model also includes thought signatures for tool calls. LiteLLM handles signature extraction and embedding internally. [Learn more about thought signatures](../gemini_3/index.md#thought-signatures).
+
+**Edge Case Handling**: If thought signatures are missing in the request, LiteLLM adds a dummy signature ensuring the API call doesn't break
+
+---
+## Supported Endpoints
+
+LiteLLM provides **full end-to-end support** for Gemini 3 Flash on:
+
+- ✅ `/v1/chat/completions` - OpenAI-compatible chat completions endpoint
+- ✅ `/v1/responses` - OpenAI Responses API endpoint (streaming and non-streaming)
+- ✅ [`/v1/messages`](../../docs/anthropic_unified) - Anthropic-compatible messages endpoint
+- ✅ `/v1/generateContent` – [Google Gemini API](../../docs/generateContent.md) compatible endpoint
+All endpoints support:
+- Streaming and non-streaming responses
+- Function calling with thought signatures
+- Multi-turn conversations
+- All Gemini 3-specific features
+- Converstion of provider specific thinking related param to thinkingLevel
+
+## Quick Start
+
+
+
+
+**Basic Usage with MEDIUM thinking (NEW)**
+
+```python
+from litellm import completion
+
+# No need to make any changes to your code as we map openai reasoning param to thinkingLevel
+response = completion(
+ model="gemini/gemini-3-flash-preview",
+ messages=[{"role": "user", "content": "Solve this complex math problem: 25 * 4 + 10"}],
+ reasoning_effort="medium", # NEW: MEDIUM thinking level
+)
+
+print(response.choices[0].message.content)
+```
+
+
+
+
+
+**1. Setup config.yaml**
+
+```yaml
+model_list:
+ - model_name: gemini-3-flash
+ litellm_params:
+ model: gemini/gemini-3-flash-preview
+ api_key: os.environ/GEMINI_API_KEY
+```
+
+**2. Start proxy**
+
+```bash
+litellm --config /path/to/config.yaml
+```
+
+**3. Call with MEDIUM thinking**
+
+```bash
+curl -X POST http://localhost:4000/v1/chat/completions \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Bearer " \
+ -d '{
+ "model": "gemini-3-flash",
+ "messages": [{"role": "user", "content": "Complex reasoning task"}],
+ "reasoning_effort": "medium"
+ }'
+``'
+
+
+
+
+---
+
+## All `reasoning_effort` Levels
+
+
+
+
+**Ultra-fast, minimal reasoning**
+
+```python
+from litellm import completion
+
+response = completion(
+ model="gemini/gemini-3-flash-preview",
+ messages=[{"role": "user", "content": "What's 2+2?"}],
+ reasoning_effort="minimal",
+)
+```
+
+
+
+
+
+**Simple instruction following**
+
+```python
+response = completion(
+ model="gemini/gemini-3-flash-preview",
+ messages=[{"role": "user", "content": "Write a haiku about coding"}],
+ reasoning_effort="low",
+)
+```
+
+
+
+
+
+**Balanced reasoning for complex tasks** ✨
+
+```python
+response = completion(
+ model="gemini/gemini-3-flash-preview",
+ messages=[{"role": "user", "content": "Analyze this dataset and find patterns"}],
+ reasoning_effort="medium", # NEW!
+)
+```
+
+
+
+
+
+**Maximum reasoning depth**
+
+```python
+response = completion(
+ model="gemini/gemini-3-flash-preview",
+ messages=[{"role": "user", "content": "Prove this mathematical theorem"}],
+ reasoning_effort="high",
+)
+```
+
+
+
+
+---
+
+## Key Features
+
+✅ **Thinking Levels**: MINIMAL, LOW, MEDIUM, HIGH
+✅ **Thought Signatures**: Track reasoning with unique identifiers
+✅ **Seamless Integration**: Works with existing OpenAI-compatible client
+✅ **Backward Compatible**: Gemini 2.5 models continue using `thinkingBudget`
+
+---
+
+## Installation
+
+```bash
+pip install litellm --upgrade
+```
+
+```python
+import litellm
+from litellm import completion
+
+response = completion(
+ model="gemini/gemini-3-flash-preview",
+ messages=[{"role": "user", "content": "Your question here"}],
+ reasoning_effort="medium", # Use MEDIUM thinking
+)
+print(response)
+```
+
+## `reasoning_effort` Mapping for Gemini 3+
+
+| reasoning_effort | thinking_level |
+|------------------|----------------|
+| `minimal` | `minimal` |
+| `low` | `low` |
+| `medium` | `medium` |
+| `high` | `high` |
+| `disable` | `minimal` |
+| `none` | `minimal` |
+
diff --git a/docs/my-website/package-lock.json b/docs/my-website/package-lock.json
index a48056491f4..c5f15ebd5f8 100644
--- a/docs/my-website/package-lock.json
+++ b/docs/my-website/package-lock.json
@@ -180,6 +180,7 @@
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.44.0.tgz",
"integrity": "sha512-/FRKUM1G4xn3vV8+9xH1WJ9XknU8rkBGlefruq9jDhYUAvYozKimhrmC2pRqw/RyHhPivmgZCRuC8jHP8piz4Q==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@algolia/client-common": "5.44.0",
"@algolia/requester-browser-xhr": "5.44.0",
@@ -327,6 +328,7 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
@@ -2161,6 +2163,7 @@
}
],
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=18"
},
@@ -2183,6 +2186,7 @@
}
],
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -2292,6 +2296,7 @@
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -2713,6 +2718,7 @@
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -3589,6 +3595,7 @@
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz",
"integrity": "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@docusaurus/core": "3.8.1",
"@docusaurus/logger": "3.8.1",
@@ -4627,6 +4634,7 @@
"resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz",
"integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/mdx": "^2.0.0"
},
@@ -7183,6 +7191,7 @@
"resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
"integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/core": "^7.21.3",
"@svgr/babel-preset": "8.1.0",
@@ -7840,6 +7849,7 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.6.tgz",
"integrity": "sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -8264,6 +8274,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -8343,6 +8354,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -8388,6 +8400,7 @@
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.44.0.tgz",
"integrity": "sha512-f8IpsbdQjzTjr/4mJ/jv5UplrtyMnnciGax6/B0OnLCs2/GJTK13O4Y7Ff1AvJVAaztanH+m5nzPoUq6EAy+aA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@algolia/abtesting": "1.10.0",
"@algolia/client-abtesting": "5.44.0",
@@ -8421,9 +8434,9 @@
}
},
"node_modules/altcha-lib": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/altcha-lib/-/altcha-lib-1.3.0.tgz",
- "integrity": "sha512-PpFg/JPuR+Jiud7Vs54XSDqDxvylcp+0oDa/i1ARxBA/iKDqLeNlO8PorQbfuDTMVLYRypAa/2VDK3nbBTAu5A==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/altcha-lib/-/altcha-lib-1.4.1.tgz",
+ "integrity": "sha512-MAXP9tkQOA2SE9Gwoe3LAcZbcDpp3XzYc5GDVej/y3eMNaFG/eVnRY1/7SGFW0RPsViEjPf+hi5eANjuZrH1xA==",
"license": "MIT"
},
"node_modules/ansi-align": {
@@ -8891,23 +8904,23 @@
"license": "ISC"
},
"node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "version": "1.20.4",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
+ "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
"license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
+ "bytes": "~3.1.2",
"content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.14.0",
+ "raw-body": "~2.5.3",
"type-is": "~1.6.18",
- "unpipe": "1.0.0"
+ "unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8",
@@ -8932,6 +8945,26 @@
"ms": "2.0.0"
}
},
+ "node_modules/body-parser/node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/body-parser/node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -8944,12 +8977,27 @@
"node": ">=0.10.0"
}
},
+ "node_modules/body-parser/node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
"node_modules/body-parser/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
+ "node_modules/body-parser/node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/bonjour-service": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
@@ -9029,6 +9077,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.25",
"caniuse-lite": "^1.0.30001754",
@@ -9364,6 +9413,7 @@
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz",
"integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"@chevrotain/cst-dts-gen": "11.0.3",
"@chevrotain/gast": "11.0.3",
@@ -10127,6 +10177,7 @@
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -10446,6 +10497,7 @@
"resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz",
"integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10"
}
@@ -10855,6 +10907,7 @@
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"license": "ISC",
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -11855,39 +11908,39 @@
}
},
"node_modules/express": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
- "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
+ "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
+ "body-parser": "~1.20.3",
+ "content-disposition": "~0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
+ "cookie": "~0.7.1",
+ "cookie-signature": "~1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
+ "finalhandler": "~1.3.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.0",
"merge-descriptors": "1.0.3",
"methods": "~1.1.2",
- "on-finished": "2.4.1",
+ "on-finished": "~2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.12",
+ "path-to-regexp": "~0.1.12",
"proxy-addr": "~2.0.7",
- "qs": "6.13.0",
+ "qs": "~6.14.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
+ "send": "~0.19.0",
+ "serve-static": "~1.16.2",
"setprototypeof": "1.2.0",
- "statuses": "2.0.1",
+ "statuses": "~2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
@@ -12111,6 +12164,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -16990,6 +17044,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -17610,6 +17665,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -18513,6 +18569,7 @@
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -19259,12 +19316,12 @@
}
},
"node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "version": "6.14.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
+ "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
"license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -19340,15 +19397,15 @@
}
},
"node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
"license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
@@ -19363,6 +19420,26 @@
"node": ">= 0.8"
}
},
+ "node_modules/raw-body/node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/raw-body/node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -19375,6 +19452,21 @@
"node": ">=0.10.0"
}
},
+ "node_modules/raw-body/node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/raw-body/node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
@@ -19404,6 +19496,7 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
"integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -19413,6 +19506,7 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
"integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -19496,6 +19590,7 @@
"resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz",
"integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/react": "*"
},
@@ -19597,6 +19692,7 @@
"resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz",
"integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/runtime": "^7.12.13",
"history": "^4.9.0",
@@ -21615,7 +21711,8 @@
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
+ "license": "0BSD",
+ "peer": true
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
@@ -22002,6 +22099,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -22353,6 +22451,7 @@
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.103.0.tgz",
"integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8",
diff --git a/docs/my-website/package.json b/docs/my-website/package.json
index e532f7c2cb5..d2e3c50d7e2 100644
--- a/docs/my-website/package.json
+++ b/docs/my-website/package.json
@@ -53,7 +53,9 @@
"form-data": ">=4.0.4",
"mermaid": ">=11.10.0",
"gray-matter": "4.0.3",
- "node-forge": ">=1.3.2"
+ "node-forge": ">=1.3.2",
+ "altcha-lib": ">=1.4.1",
+ "qs": ">=6.14.1"
},
"overrides": {
"webpack-dev-server": ">=5.2.1",
@@ -62,6 +64,8 @@
"gray-matter": "4.0.3",
"glob": ">=11.1.0",
"node-forge": ">=1.3.2",
- "mdast-util-to-hast": ">=13.2.1"
+ "mdast-util-to-hast": ">=13.2.1",
+ "altcha-lib": ">=1.4.1",
+ "qs": ">=6.14.1"
}
}
\ No newline at end of file
diff --git a/litellm/llms/gemini/google_genai/transformation.py b/litellm/llms/gemini/google_genai/transformation.py
index 2d585769029..fc05ed7e910 100644
--- a/litellm/llms/gemini/google_genai/transformation.py
+++ b/litellm/llms/gemini/google_genai/transformation.py
@@ -75,6 +75,7 @@ def get_supported_generate_content_optional_params(self, model: str) -> List[str
"seed",
"response_mime_type",
"response_schema",
+ "response_json_schema",
"routing_config",
"model_selection_config",
"safety_settings",
@@ -105,13 +106,37 @@ def map_generate_content_optional_params(
Returns:
Mapped parameters for the provider
"""
+ from litellm.llms.vertex_ai.gemini.transformation import (
+ _camel_to_snake,
+ _snake_to_camel,
+ )
+
_generate_content_config_dict: Dict[str, Any] = {}
supported_google_genai_params = (
self.get_supported_generate_content_optional_params(model)
)
+ # Create a set with both camelCase and snake_case versions for faster lookup
+ supported_params_set = set(supported_google_genai_params)
+ supported_params_set.update(_snake_to_camel(p) for p in supported_google_genai_params)
+ supported_params_set.update(_camel_to_snake(p) for p in supported_google_genai_params if "_" not in p)
+
for param, value in generate_content_config_dict.items():
- if param in supported_google_genai_params:
- _generate_content_config_dict[param] = value
+ # Google GenAI API expects camelCase, so we'll always output in camelCase
+ # Check if param (or its variants) is supported
+ param_snake = _camel_to_snake(param)
+ param_camel = _snake_to_camel(param)
+
+ # Check if param is supported in any format
+ is_supported = (
+ param in supported_google_genai_params or
+ param_snake in supported_google_genai_params or
+ param_camel in supported_google_genai_params
+ )
+
+ if is_supported:
+ # Always output in camelCase for Google GenAI API
+ output_key = param_camel if param != param_camel else param
+ _generate_content_config_dict[output_key] = value
return _generate_content_config_dict
def validate_environment(
diff --git a/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py b/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py
index 106074811f6..64f57f0376e 100644
--- a/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py
+++ b/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py
@@ -228,12 +228,13 @@ def _is_gemini_3_or_newer(model: str) -> bool:
Gemini 3 models include:
- gemini-3-pro-preview
+ - gemini-3-flash
+ - gemini-3-flash-preview (Gemini 3 Flash)
- Any future Gemini 3.x models
"""
# Check for Gemini 3 models
if "gemini-3" in model:
return True
-
return False
def _supports_penalty_parameters(self, model: str) -> bool:
@@ -626,22 +627,40 @@ def _map_reasoning_effort_to_thinking_level(
Returns:
GeminiThinkingConfig with thinkingLevel and includeThoughts
"""
+ # Check if this is gemini-3-flash which supports MINIMAL thinking level
+ is_gemini3flash= model and (
+ "gemini-3-flash-preview" in model.lower() or "gemini-3-flash" in model.lower()
+ )
if reasoning_effort == "minimal":
- return {"thinkingLevel": "low", "includeThoughts": True}
+ if is_gemini3flash:
+ return {"thinkingLevel": "minimal", "includeThoughts": True}
+ else:
+ return {"thinkingLevel": "low", "includeThoughts": True}
elif reasoning_effort == "low":
return {"thinkingLevel": "low", "includeThoughts": True}
elif reasoning_effort == "medium":
- return {
- "thinkingLevel": "high",
- "includeThoughts": True,
- } # medium is not out yet
+ # For gemini-3-flash-preview, medium maps to "medium", otherwise "high"
+ if is_gemini3flash:
+ return {"thinkingLevel": "medium", "includeThoughts": True}
+ else:
+ return {
+ "thinkingLevel": "high",
+ "includeThoughts": True,
+ } # medium is not out yet for other models
elif reasoning_effort == "high":
return {"thinkingLevel": "high", "includeThoughts": True}
elif reasoning_effort == "disable":
- # Gemini 3 cannot fully disable thinking, so we use "low" but hide thoughts
- return {"thinkingLevel": "low", "includeThoughts": False}
+ # Gemini 3 cannot fully disable thinking, so we use "minimal" for gemini-3-flash-preview, "low" for others
+ if is_gemini3flash:
+ return {"thinkingLevel": "minimal", "includeThoughts": False}
+ else:
+ return {"thinkingLevel": "low", "includeThoughts": False}
elif reasoning_effort == "none":
- return {"thinkingLevel": "low", "includeThoughts": False}
+ # For gemini-3-flash-preview, use "minimal" instead of "low"
+ if is_gemini3flash:
+ return {"thinkingLevel": "minimal", "includeThoughts": False}
+ else:
+ return {"thinkingLevel": "low", "includeThoughts": False}
else:
raise ValueError(f"Invalid reasoning effort: {reasoning_effort}")
@@ -692,17 +711,38 @@ def _validate_thinking_level_conflicts(
@staticmethod
def _map_thinking_param(
thinking_param: AnthropicThinkingParam,
+ model: Optional[str] = None,
) -> GeminiThinkingConfig:
thinking_enabled = thinking_param.get("type") == "enabled"
thinking_budget = thinking_param.get("budget_tokens")
params: GeminiThinkingConfig = {}
- if thinking_enabled and not VertexGeminiConfig._is_thinking_budget_zero(
- thinking_budget
- ):
- params["includeThoughts"] = True
- if thinking_budget is not None and isinstance(thinking_budget, int):
- params["thinkingBudget"] = thinking_budget
+
+ # For Gemini 3+ models, use thinkingLevel instead of thinkingBudget
+ if model and VertexGeminiConfig._is_gemini_3_or_newer(model):
+ if thinking_enabled:
+ if thinking_budget is None or thinking_budget == 0:
+ params["includeThoughts"] = False
+ else:
+ params["includeThoughts"] = True
+ if thinking_budget >= 10000:
+ is_gemini3flash = "gemini-3-flash-preview" in model.lower() or "gemini-3-flash" in model.lower()
+ params["thinkingLevel"] = "minimal" if is_gemini3flash else "low"
+ else:
+ is_gemini3flash = "gemini-3-flash-preview" in model.lower() or "gemini-3-flash" in model.lower()
+ params["thinkingLevel"] = "minimal" if is_gemini3flash else "low"
+ else:
+ # Thinking disabled
+ params["includeThoughts"] = False
+ else:
+ # For older Gemini models, use thinkingBudget
+ if thinking_enabled and not VertexGeminiConfig._is_thinking_budget_zero(
+ thinking_budget
+ ):
+ params["includeThoughts"] = True
+ if thinking_budget is not None and isinstance(thinking_budget, int):
+ params["thinkingBudget"] = thinking_budget
+
return params
def map_response_modalities(self, value: list) -> list:
@@ -879,7 +919,8 @@ def map_openai_params( # noqa: PLR0915
optional_params[
"thinkingConfig"
] = VertexGeminiConfig._map_thinking_param(
- cast(AnthropicThinkingParam, value)
+ cast(AnthropicThinkingParam, value),
+ model=model,
)
elif param == "modalities" and isinstance(value, list):
response_modalities = self.map_response_modalities(value)
@@ -911,7 +952,10 @@ def map_openai_params( # noqa: PLR0915
"thinkingLevel" not in thinking_config
and "thinkingBudget" not in thinking_config
):
- thinking_config["thinkingLevel"] = "low"
+ # For gemini-3-flash-preview, default to "minimal" to match Gemini 2.5 Flash behavior
+ # For other Gemini 3 models, default to "low"
+ is_gemini3flash = "gemini-3-flash-preview" in model.lower() or "gemini-3-flash" in model.lower()
+ thinking_config["thinkingLevel"] = "minimal" if is_gemini3flash else "low"
optional_params["thinkingConfig"] = thinking_config
return optional_params
diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json
index 79a6d2de06a..773189c596d 100644
--- a/litellm/model_prices_and_context_window_backup.json
+++ b/litellm/model_prices_and_context_window_backup.json
@@ -14416,6 +14416,98 @@
"supports_web_search": true,
"tpm": 800000
},
+ "gemini/gemini-3-flash-preview": {
+ "cache_read_input_token_cost": 5e-08,
+ "input_cost_per_audio_token": 1e-06,
+ "input_cost_per_token": 5e-07,
+ "litellm_provider": "gemini",
+ "max_audio_length_hours": 8.4,
+ "max_audio_per_prompt": 1,
+ "max_images_per_prompt": 3000,
+ "max_input_tokens": 1048576,
+ "max_output_tokens": 65535,
+ "max_pdf_size_mb": 30,
+ "max_tokens": 65535,
+ "max_video_length": 1,
+ "max_videos_per_prompt": 10,
+ "mode": "chat",
+ "output_cost_per_reasoning_token": 3e-06,
+ "output_cost_per_token": 3e-06,
+ "rpm": 2000,
+ "source": "https://ai.google.dev/pricing/gemini-3",
+ "supported_endpoints": [
+ "/v1/chat/completions",
+ "/v1/completions",
+ "/v1/batch"
+ ],
+ "supported_modalities": [
+ "text",
+ "image",
+ "audio",
+ "video"
+ ],
+ "supported_output_modalities": [
+ "text"
+ ],
+ "supports_audio_output": false,
+ "supports_function_calling": true,
+ "supports_parallel_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_system_messages": true,
+ "supports_tool_choice": true,
+ "supports_url_context": true,
+ "supports_vision": true,
+ "supports_web_search": true,
+ "tpm": 800000
+ },
+ "gemini-3-flash-preview": {
+ "cache_read_input_token_cost": 5e-08,
+ "input_cost_per_audio_token": 1e-06,
+ "input_cost_per_token": 5e-07,
+ "litellm_provider": "vertex_ai-language-models",
+ "max_audio_length_hours": 8.4,
+ "max_audio_per_prompt": 1,
+ "max_images_per_prompt": 3000,
+ "max_input_tokens": 1048576,
+ "max_output_tokens": 65535,
+ "max_pdf_size_mb": 30,
+ "max_tokens": 65535,
+ "max_video_length": 1,
+ "max_videos_per_prompt": 10,
+ "mode": "chat",
+ "output_cost_per_reasoning_token": 3e-06,
+ "output_cost_per_token": 3e-06,
+ "source": "https://ai.google.dev/pricing/gemini-3",
+ "supported_endpoints": [
+ "/v1/chat/completions",
+ "/v1/completions",
+ "/v1/batch"
+ ],
+ "supported_modalities": [
+ "text",
+ "image",
+ "audio",
+ "video"
+ ],
+ "supported_output_modalities": [
+ "text"
+ ],
+ "supports_audio_output": false,
+ "supports_function_calling": true,
+ "supports_parallel_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_system_messages": true,
+ "supports_tool_choice": true,
+ "supports_url_context": true,
+ "supports_vision": true,
+ "supports_web_search": true
+ },
"gemini/gemini-2.5-pro-exp-03-25": {
"cache_read_input_token_cost": 0.0,
"input_cost_per_token": 0.0,
diff --git a/litellm/proxy/credential_endpoints/endpoints.py b/litellm/proxy/credential_endpoints/endpoints.py
index d774c1e765d..647abb73648 100644
--- a/litellm/proxy/credential_endpoints/endpoints.py
+++ b/litellm/proxy/credential_endpoints/endpoints.py
@@ -24,10 +24,16 @@ class CredentialHelperUtils:
def encrypt_credential_values(credential: CredentialItem) -> CredentialItem:
"""Encrypt values in credential.credential_values and add to DB"""
encrypted_credential_values = {}
- for key, value in credential.credential_values.items():
+ for key, value in (credential.credential_values or {}).items():
encrypted_credential_values[key] = encrypt_value_helper(value)
- credential.credential_values = encrypted_credential_values
- return credential
+
+ # Return a new object to avoid mutating the caller's credential, which
+ # is kept in memory and should remain unencrypted.
+ return CredentialItem(
+ credential_name=credential.credential_name,
+ credential_values=encrypted_credential_values,
+ credential_info=credential.credential_info or {},
+ )
@router.post(
diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py
index da44bda791d..4da4d54546c 100644
--- a/litellm/proxy/management_endpoints/key_management_endpoints.py
+++ b/litellm/proxy/management_endpoints/key_management_endpoints.py
@@ -1917,7 +1917,7 @@ async def info_key_fn(
Example Curl - if no key is passed, it will use the Key Passed in Authorization Header
```
curl -X GET "http://0.0.0.0:4000/key/info" \
--H "Authorization: Bearer sk-02Wr4IAlN3NvPXvL5JVvDA"
+-H "Authorization: Bearer sk-example-1234567890abcdef"
```
"""
from litellm.proxy.proxy_server import prisma_client
diff --git a/litellm/proxy/spend_tracking/spend_management_endpoints.py b/litellm/proxy/spend_tracking/spend_management_endpoints.py
index 5be9d9bab3c..4eca480375e 100644
--- a/litellm/proxy/spend_tracking/spend_management_endpoints.py
+++ b/litellm/proxy/spend_tracking/spend_management_endpoints.py
@@ -1938,7 +1938,7 @@ async def view_spend_logs( # noqa: PLR0915
Example Request for specific api_key
```
- curl -X GET "http://0.0.0.0:8000/spend/logs?api_key=sk-Fn8Ej39NkBQmUagFEoUWPQ" \
+ curl -X GET "http://0.0.0.0:8000/spend/logs?api_key=sk-example-1234567890abcdef" \
-H "Authorization: Bearer sk-1234"
```
diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py
index 9359c20c67e..cc1079ca6b8 100644
--- a/litellm/responses/litellm_completion_transformation/transformation.py
+++ b/litellm/responses/litellm_completion_transformation/transformation.py
@@ -86,6 +86,7 @@ def get_supported_openai_params(model: str) -> list:
"metadata",
"parallel_tool_calls",
"previous_response_id",
+ "reasoning",
"stream",
"temperature",
"text",
@@ -122,6 +123,17 @@ def transform_responses_api_request_to_chat_completion_request(
text_param
)
+ # Extract reasoning_effort from reasoning parameter
+ reasoning_effort = None
+ reasoning_param = responses_api_request.get("reasoning")
+ if reasoning_param:
+ if isinstance(reasoning_param, dict):
+ # reasoning can be {"effort": "low|medium|high"}
+ reasoning_effort = reasoning_param.get("effort")
+ elif isinstance(reasoning_param, str):
+ # reasoning could be a string directly
+ reasoning_effort = reasoning_param
+
litellm_completion_request: dict = {
"messages": LiteLLMCompletionResponsesConfig.transform_responses_api_input_to_messages(
input=input,
@@ -140,6 +152,7 @@ def transform_responses_api_request_to_chat_completion_request(
"service_tier": kwargs.get("service_tier"),
"web_search_options": web_search_options,
"response_format": response_format,
+ "reasoning_effort": reasoning_effort,
# litellm specific params
"custom_llm_provider": custom_llm_provider,
"extra_headers": extra_headers,
@@ -161,7 +174,6 @@ def transform_responses_api_request_to_chat_completion_request(
litellm_completion_request = {
k: v for k, v in litellm_completion_request.items() if v is not None
}
-
return litellm_completion_request
@staticmethod
diff --git a/litellm/types/llms/vertex_ai.py b/litellm/types/llms/vertex_ai.py
index e4c5360ae3b..6a3dfb74ce1 100644
--- a/litellm/types/llms/vertex_ai.py
+++ b/litellm/types/llms/vertex_ai.py
@@ -176,7 +176,7 @@ class SafetSettingsConfig(TypedDict, total=False):
class GeminiThinkingConfig(TypedDict, total=False):
includeThoughts: bool
thinkingBudget: int
- thinkingLevel: Literal["low", "medium", "high"]
+ thinkingLevel: Literal["minimal", "low", "medium", "high"]
GeminiResponseModalities = Literal["TEXT", "IMAGE", "AUDIO", "VIDEO"]
diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json
index 79a6d2de06a..773189c596d 100644
--- a/model_prices_and_context_window.json
+++ b/model_prices_and_context_window.json
@@ -14416,6 +14416,98 @@
"supports_web_search": true,
"tpm": 800000
},
+ "gemini/gemini-3-flash-preview": {
+ "cache_read_input_token_cost": 5e-08,
+ "input_cost_per_audio_token": 1e-06,
+ "input_cost_per_token": 5e-07,
+ "litellm_provider": "gemini",
+ "max_audio_length_hours": 8.4,
+ "max_audio_per_prompt": 1,
+ "max_images_per_prompt": 3000,
+ "max_input_tokens": 1048576,
+ "max_output_tokens": 65535,
+ "max_pdf_size_mb": 30,
+ "max_tokens": 65535,
+ "max_video_length": 1,
+ "max_videos_per_prompt": 10,
+ "mode": "chat",
+ "output_cost_per_reasoning_token": 3e-06,
+ "output_cost_per_token": 3e-06,
+ "rpm": 2000,
+ "source": "https://ai.google.dev/pricing/gemini-3",
+ "supported_endpoints": [
+ "/v1/chat/completions",
+ "/v1/completions",
+ "/v1/batch"
+ ],
+ "supported_modalities": [
+ "text",
+ "image",
+ "audio",
+ "video"
+ ],
+ "supported_output_modalities": [
+ "text"
+ ],
+ "supports_audio_output": false,
+ "supports_function_calling": true,
+ "supports_parallel_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_system_messages": true,
+ "supports_tool_choice": true,
+ "supports_url_context": true,
+ "supports_vision": true,
+ "supports_web_search": true,
+ "tpm": 800000
+ },
+ "gemini-3-flash-preview": {
+ "cache_read_input_token_cost": 5e-08,
+ "input_cost_per_audio_token": 1e-06,
+ "input_cost_per_token": 5e-07,
+ "litellm_provider": "vertex_ai-language-models",
+ "max_audio_length_hours": 8.4,
+ "max_audio_per_prompt": 1,
+ "max_images_per_prompt": 3000,
+ "max_input_tokens": 1048576,
+ "max_output_tokens": 65535,
+ "max_pdf_size_mb": 30,
+ "max_tokens": 65535,
+ "max_video_length": 1,
+ "max_videos_per_prompt": 10,
+ "mode": "chat",
+ "output_cost_per_reasoning_token": 3e-06,
+ "output_cost_per_token": 3e-06,
+ "source": "https://ai.google.dev/pricing/gemini-3",
+ "supported_endpoints": [
+ "/v1/chat/completions",
+ "/v1/completions",
+ "/v1/batch"
+ ],
+ "supported_modalities": [
+ "text",
+ "image",
+ "audio",
+ "video"
+ ],
+ "supported_output_modalities": [
+ "text"
+ ],
+ "supports_audio_output": false,
+ "supports_function_calling": true,
+ "supports_parallel_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_system_messages": true,
+ "supports_tool_choice": true,
+ "supports_url_context": true,
+ "supports_vision": true,
+ "supports_web_search": true
+ },
"gemini/gemini-2.5-pro-exp-03-25": {
"cache_read_input_token_cost": 0.0,
"input_cost_per_token": 0.0,
diff --git a/proxy_server_config.yaml b/proxy_server_config.yaml
index df3a08a143b..ee2852cc841 100644
--- a/proxy_server_config.yaml
+++ b/proxy_server_config.yaml
@@ -227,4 +227,4 @@ general_settings:
# settings for using redis caching
# REDIS_HOST: redis-16337.c322.us-east-1-2.ec2.cloud.redislabs.com
# REDIS_PORT: "16337"
- # REDIS_PASSWORD:
+ # REDIS_PASSWORD:
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index b8096d8ae9a..97370ccc805 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -32,6 +32,7 @@ jinja2 = "^3.1.2"
aiohttp = ">=3.10"
pydantic = "^2.5.0"
jsonschema = "^4.22.0"
+typing-extensions = ">=4.14.1"
numpydoc = {version = "*", optional = true} # used in utils.py
uvicorn = {version = "^0.31.1", optional = true}
@@ -43,7 +44,7 @@ pyyaml = {version = "^6.0.1", optional = true}
rq = {version = "*", optional = true}
orjson = {version = "^3.9.7", optional = true}
apscheduler = {version = "^3.10.4", optional = true}
-fastapi-sso = { version = "^0.16.0", optional = true }
+fastapi-sso = { version = "^0.19.0", optional = true }
PyJWT = { version = "^2.10.1", optional = true, python = ">=3.9" }
python-multipart = { version = "^0.0.18", optional = true}
cryptography = {version = "*", optional = true}
diff --git a/requirements.txt b/requirements.txt
index 0db5e5fe735..c659de04b31 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -28,7 +28,7 @@ ddtrace==2.19.0 # for advanced DD tracing / profiling
orjson==3.11.2 # fast /embedding responses
polars==1.31.0 # for data processing
apscheduler==3.10.4 # for resetting budget in background
-fastapi-sso==0.16.0 # admin UI, SSO
+fastapi-sso==0.19.0 # admin UI, SSO
pyjwt[crypto]==2.10.1 ; python_version >= "3.9"
python-multipart==0.0.18 # admin UI
Pillow==11.0.0
@@ -57,6 +57,7 @@ aiohttp==3.12.14 # for network calls
aioboto3==13.4.0 # for async sagemaker calls
tenacity==8.5.0 # for retrying requests, when litellm.num_retries set
pydantic>=2.11,<3 # proxy + openai req. + mcp
+typing-extensions>=4.14.1 # required by pydantic-core
jsonschema==4.22.0 # validating json schema
websockets==13.1.0 # for realtime API
soundfile==0.12.1 # for audio file processing
diff --git a/temp_migrations/20260106081922_initial/README.md b/temp_migrations/20260106081922_initial/README.md
new file mode 100644
index 00000000000..108c41a0db6
--- /dev/null
+++ b/temp_migrations/20260106081922_initial/README.md
@@ -0,0 +1 @@
+Initial migration generated at Tue Jan 6 08:19:28 UTC 2026
diff --git a/temp_migrations/20260106081922_initial/migration.sql b/temp_migrations/20260106081922_initial/migration.sql
new file mode 100644
index 00000000000..dc44ca166be
--- /dev/null
+++ b/temp_migrations/20260106081922_initial/migration.sql
@@ -0,0 +1,872 @@
+-- CreateEnum
+CREATE TYPE "JobStatus" AS ENUM ('ACTIVE', 'INACTIVE');
+
+-- CreateTable
+CREATE TABLE "LiteLLM_BudgetTable" (
+ "budget_id" TEXT NOT NULL,
+ "max_budget" DOUBLE PRECISION,
+ "soft_budget" DOUBLE PRECISION,
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "model_max_budget" JSONB,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_BudgetTable_pkey" PRIMARY KEY ("budget_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CredentialsTable" (
+ "credential_id" TEXT NOT NULL,
+ "credential_name" TEXT NOT NULL,
+ "credential_values" JSONB NOT NULL,
+ "credential_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_CredentialsTable_pkey" PRIMARY KEY ("credential_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ProxyModelTable" (
+ "model_id" TEXT NOT NULL,
+ "model_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "model_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_ProxyModelTable_pkey" PRIMARY KEY ("model_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_AgentsTable" (
+ "agent_id" TEXT NOT NULL,
+ "agent_name" TEXT NOT NULL,
+ "litellm_params" JSONB,
+ "agent_card_params" JSONB NOT NULL,
+ "agent_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_AgentsTable_pkey" PRIMARY KEY ("agent_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_OrganizationTable" (
+ "organization_id" TEXT NOT NULL,
+ "organization_alias" TEXT NOT NULL,
+ "budget_id" TEXT NOT NULL,
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "models" TEXT[],
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "object_permission_id" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_OrganizationTable_pkey" PRIMARY KEY ("organization_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ModelTable" (
+ "id" SERIAL NOT NULL,
+ "aliases" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_ModelTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TeamTable" (
+ "team_id" TEXT NOT NULL,
+ "team_alias" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "admins" TEXT[],
+ "members" TEXT[],
+ "members_with_roles" JSONB NOT NULL DEFAULT '{}',
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "max_budget" DOUBLE PRECISION,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "models" TEXT[],
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "blocked" BOOLEAN NOT NULL DEFAULT false,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "team_member_permissions" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_id" INTEGER,
+
+ CONSTRAINT "LiteLLM_TeamTable_pkey" PRIMARY KEY ("team_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_UserTable" (
+ "user_id" TEXT NOT NULL,
+ "user_alias" TEXT,
+ "team_id" TEXT,
+ "sso_user_id" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "password" TEXT,
+ "teams" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "user_role" TEXT,
+ "max_budget" DOUBLE PRECISION,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "user_email" TEXT,
+ "models" TEXT[],
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_UserTable_pkey" PRIMARY KEY ("user_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ObjectPermissionTable" (
+ "object_permission_id" TEXT NOT NULL,
+ "mcp_servers" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "mcp_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "mcp_tool_permissions" JSONB,
+ "vector_stores" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "agents" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "agent_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+
+ CONSTRAINT "LiteLLM_ObjectPermissionTable_pkey" PRIMARY KEY ("object_permission_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_MCPServerTable" (
+ "server_id" TEXT NOT NULL,
+ "server_name" TEXT,
+ "alias" TEXT,
+ "description" TEXT,
+ "url" TEXT,
+ "transport" TEXT NOT NULL DEFAULT 'sse',
+ "auth_type" TEXT,
+ "credentials" JSONB DEFAULT '{}',
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT,
+ "mcp_info" JSONB DEFAULT '{}',
+ "mcp_access_groups" TEXT[],
+ "allowed_tools" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "extra_headers" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "static_headers" JSONB DEFAULT '{}',
+ "status" TEXT DEFAULT 'unknown',
+ "last_health_check" TIMESTAMP(3),
+ "health_check_error" TEXT,
+ "command" TEXT,
+ "args" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "env" JSONB DEFAULT '{}',
+
+ CONSTRAINT "LiteLLM_MCPServerTable_pkey" PRIMARY KEY ("server_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_VerificationToken" (
+ "token" TEXT NOT NULL,
+ "key_name" TEXT,
+ "key_alias" TEXT,
+ "soft_budget_cooldown" BOOLEAN NOT NULL DEFAULT false,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "expires" TIMESTAMP(3),
+ "models" TEXT[],
+ "aliases" JSONB NOT NULL DEFAULT '{}',
+ "config" JSONB NOT NULL DEFAULT '{}',
+ "user_id" TEXT,
+ "team_id" TEXT,
+ "permissions" JSONB NOT NULL DEFAULT '{}',
+ "max_parallel_requests" INTEGER,
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "blocked" BOOLEAN,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "max_budget" DOUBLE PRECISION,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "allowed_routes" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "budget_id" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT,
+ "rotation_count" INTEGER DEFAULT 0,
+ "auto_rotate" BOOLEAN DEFAULT false,
+ "rotation_interval" TEXT,
+ "last_rotation_at" TIMESTAMP(3),
+ "key_rotation_at" TIMESTAMP(3),
+
+ CONSTRAINT "LiteLLM_VerificationToken_pkey" PRIMARY KEY ("token")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_EndUserTable" (
+ "user_id" TEXT NOT NULL,
+ "alias" TEXT,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "allowed_model_region" TEXT,
+ "default_model" TEXT,
+ "budget_id" TEXT,
+ "blocked" BOOLEAN NOT NULL DEFAULT false,
+
+ CONSTRAINT "LiteLLM_EndUserTable_pkey" PRIMARY KEY ("user_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TagTable" (
+ "tag_name" TEXT NOT NULL,
+ "description" TEXT,
+ "models" TEXT[],
+ "model_info" JSONB,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "budget_id" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_TagTable_pkey" PRIMARY KEY ("tag_name")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_Config" (
+ "param_name" TEXT NOT NULL,
+ "param_value" JSONB,
+
+ CONSTRAINT "LiteLLM_Config_pkey" PRIMARY KEY ("param_name")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SpendLogs" (
+ "request_id" TEXT NOT NULL,
+ "call_type" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL DEFAULT '',
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "total_tokens" INTEGER NOT NULL DEFAULT 0,
+ "prompt_tokens" INTEGER NOT NULL DEFAULT 0,
+ "completion_tokens" INTEGER NOT NULL DEFAULT 0,
+ "startTime" TIMESTAMP(3) NOT NULL,
+ "endTime" TIMESTAMP(3) NOT NULL,
+ "completionStartTime" TIMESTAMP(3),
+ "model" TEXT NOT NULL DEFAULT '',
+ "model_id" TEXT DEFAULT '',
+ "model_group" TEXT DEFAULT '',
+ "custom_llm_provider" TEXT DEFAULT '',
+ "api_base" TEXT DEFAULT '',
+ "user" TEXT DEFAULT '',
+ "metadata" JSONB DEFAULT '{}',
+ "cache_hit" TEXT DEFAULT '',
+ "cache_key" TEXT DEFAULT '',
+ "request_tags" JSONB DEFAULT '[]',
+ "team_id" TEXT,
+ "organization_id" TEXT,
+ "end_user" TEXT,
+ "requester_ip_address" TEXT,
+ "messages" JSONB DEFAULT '{}',
+ "response" JSONB DEFAULT '{}',
+ "session_id" TEXT,
+ "status" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "proxy_server_request" JSONB DEFAULT '{}',
+
+ CONSTRAINT "LiteLLM_SpendLogs_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ErrorLogs" (
+ "request_id" TEXT NOT NULL,
+ "startTime" TIMESTAMP(3) NOT NULL,
+ "endTime" TIMESTAMP(3) NOT NULL,
+ "api_base" TEXT NOT NULL DEFAULT '',
+ "model_group" TEXT NOT NULL DEFAULT '',
+ "litellm_model_name" TEXT NOT NULL DEFAULT '',
+ "model_id" TEXT NOT NULL DEFAULT '',
+ "request_kwargs" JSONB NOT NULL DEFAULT '{}',
+ "exception_type" TEXT NOT NULL DEFAULT '',
+ "exception_string" TEXT NOT NULL DEFAULT '',
+ "status_code" TEXT NOT NULL DEFAULT '',
+
+ CONSTRAINT "LiteLLM_ErrorLogs_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_UserNotifications" (
+ "request_id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "models" TEXT[],
+ "justification" TEXT NOT NULL,
+ "status" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_UserNotifications_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TeamMembership" (
+ "user_id" TEXT NOT NULL,
+ "team_id" TEXT NOT NULL,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "budget_id" TEXT,
+
+ CONSTRAINT "LiteLLM_TeamMembership_pkey" PRIMARY KEY ("user_id","team_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_OrganizationMembership" (
+ "user_id" TEXT NOT NULL,
+ "organization_id" TEXT NOT NULL,
+ "user_role" TEXT,
+ "spend" DOUBLE PRECISION DEFAULT 0.0,
+ "budget_id" TEXT,
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_OrganizationMembership_pkey" PRIMARY KEY ("user_id","organization_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_InvitationLink" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "is_accepted" BOOLEAN NOT NULL DEFAULT false,
+ "accepted_at" TIMESTAMP(3),
+ "expires_at" TIMESTAMP(3) NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_InvitationLink_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_AuditLog" (
+ "id" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "changed_by" TEXT NOT NULL DEFAULT '',
+ "changed_by_api_key" TEXT NOT NULL DEFAULT '',
+ "action" TEXT NOT NULL,
+ "table_name" TEXT NOT NULL,
+ "object_id" TEXT NOT NULL,
+ "before_value" JSONB,
+ "updated_values" JSONB,
+
+ CONSTRAINT "LiteLLM_AuditLog_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyUserSpend" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyUserSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyOrganizationSpend" (
+ "id" TEXT NOT NULL,
+ "organization_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyOrganizationSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyEndUserSpend" (
+ "id" TEXT NOT NULL,
+ "end_user_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyEndUserSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyTeamSpend" (
+ "id" TEXT NOT NULL,
+ "team_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyTeamSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyTagSpend" (
+ "id" TEXT NOT NULL,
+ "request_id" TEXT,
+ "tag" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyTagSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CronJob" (
+ "cronjob_id" TEXT NOT NULL,
+ "pod_id" TEXT NOT NULL,
+ "status" "JobStatus" NOT NULL DEFAULT 'INACTIVE',
+ "last_updated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "ttl" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_CronJob_pkey" PRIMARY KEY ("cronjob_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedFileTable" (
+ "id" TEXT NOT NULL,
+ "unified_file_id" TEXT NOT NULL,
+ "file_object" JSONB,
+ "model_mappings" JSONB NOT NULL,
+ "flat_model_file_ids" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedFileTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedObjectTable" (
+ "id" TEXT NOT NULL,
+ "unified_object_id" TEXT NOT NULL,
+ "model_object_id" TEXT NOT NULL,
+ "file_object" JSONB NOT NULL,
+ "file_purpose" TEXT NOT NULL,
+ "status" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedObjectTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedVectorStoresTable" (
+ "vector_store_id" TEXT NOT NULL,
+ "custom_llm_provider" TEXT NOT NULL,
+ "vector_store_name" TEXT,
+ "vector_store_description" TEXT,
+ "vector_store_metadata" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "litellm_credential_name" TEXT,
+ "litellm_params" JSONB,
+
+ CONSTRAINT "LiteLLM_ManagedVectorStoresTable_pkey" PRIMARY KEY ("vector_store_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_GuardrailsTable" (
+ "guardrail_id" TEXT NOT NULL,
+ "guardrail_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "guardrail_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_GuardrailsTable_pkey" PRIMARY KEY ("guardrail_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_PromptTable" (
+ "id" TEXT NOT NULL,
+ "prompt_id" TEXT NOT NULL,
+ "version" INTEGER NOT NULL DEFAULT 1,
+ "litellm_params" JSONB NOT NULL,
+ "prompt_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_PromptTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_HealthCheckTable" (
+ "health_check_id" TEXT NOT NULL,
+ "model_name" TEXT NOT NULL,
+ "model_id" TEXT,
+ "status" TEXT NOT NULL,
+ "healthy_count" INTEGER NOT NULL DEFAULT 0,
+ "unhealthy_count" INTEGER NOT NULL DEFAULT 0,
+ "error_message" TEXT,
+ "response_time_ms" DOUBLE PRECISION,
+ "details" JSONB,
+ "checked_by" TEXT,
+ "checked_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_HealthCheckTable_pkey" PRIMARY KEY ("health_check_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SearchToolsTable" (
+ "search_tool_id" TEXT NOT NULL,
+ "search_tool_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "search_tool_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_SearchToolsTable_pkey" PRIMARY KEY ("search_tool_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SSOConfig" (
+ "id" TEXT NOT NULL DEFAULT 'sso_config',
+ "sso_settings" JSONB NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_SSOConfig_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedVectorStoreIndexTable" (
+ "id" TEXT NOT NULL,
+ "index_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "index_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedVectorStoreIndexTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CacheConfig" (
+ "id" TEXT NOT NULL DEFAULT 'cache_config',
+ "cache_settings" JSONB NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_CacheConfig_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_CredentialsTable_credential_name_key" ON "LiteLLM_CredentialsTable"("credential_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_AgentsTable_agent_name_key" ON "LiteLLM_AgentsTable"("agent_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_TeamTable_model_id_key" ON "LiteLLM_TeamTable"("model_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_UserTable_sso_user_id_key" ON "LiteLLM_UserTable"("sso_user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_startTime_idx" ON "LiteLLM_SpendLogs"("startTime");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_end_user_idx" ON "LiteLLM_SpendLogs"("end_user");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_session_id_idx" ON "LiteLLM_SpendLogs"("session_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_OrganizationMembership_user_id_organization_id_key" ON "LiteLLM_OrganizationMembership"("user_id", "organization_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_date_idx" ON "LiteLLM_DailyUserSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_user_id_idx" ON "LiteLLM_DailyUserSpend"("user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_api_key_idx" ON "LiteLLM_DailyUserSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_model_idx" ON "LiteLLM_DailyUserSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyUserSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+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", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_date_idx" ON "LiteLLM_DailyOrganizationSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_idx" ON "LiteLLM_DailyOrganizationSpend"("organization_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_api_key_idx" ON "LiteLLM_DailyOrganizationSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_model_idx" ON "LiteLLM_DailyOrganizationSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyOrganizationSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_date_api_key_key" ON "LiteLLM_DailyOrganizationSpend"("organization_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_date_idx" ON "LiteLLM_DailyEndUserSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_idx" ON "LiteLLM_DailyEndUserSpend"("end_user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_api_key_idx" ON "LiteLLM_DailyEndUserSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_model_idx" ON "LiteLLM_DailyEndUserSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyEndUserSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_date_api_key_model_cu_key" ON "LiteLLM_DailyEndUserSpend"("end_user_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_date_idx" ON "LiteLLM_DailyTeamSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_team_id_idx" ON "LiteLLM_DailyTeamSpend"("team_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_api_key_idx" ON "LiteLLM_DailyTeamSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_model_idx" ON "LiteLLM_DailyTeamSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyTeamSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+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", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_date_idx" ON "LiteLLM_DailyTagSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_tag_idx" ON "LiteLLM_DailyTagSpend"("tag");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_api_key_idx" ON "LiteLLM_DailyTagSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_model_idx" ON "LiteLLM_DailyTagSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyTagSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyTagSpend_tag_date_api_key_model_custom_llm_pro_key" ON "LiteLLM_DailyTagSpend"("tag", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedFileTable_unified_file_id_key" ON "LiteLLM_ManagedFileTable"("unified_file_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedFileTable_unified_file_id_idx" ON "LiteLLM_ManagedFileTable"("unified_file_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedObjectTable_unified_object_id_key" ON "LiteLLM_ManagedObjectTable"("unified_object_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedObjectTable_model_object_id_key" ON "LiteLLM_ManagedObjectTable"("model_object_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedObjectTable_unified_object_id_idx" ON "LiteLLM_ManagedObjectTable"("unified_object_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedObjectTable_model_object_id_idx" ON "LiteLLM_ManagedObjectTable"("model_object_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_GuardrailsTable_guardrail_name_key" ON "LiteLLM_GuardrailsTable"("guardrail_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_PromptTable_prompt_id_idx" ON "LiteLLM_PromptTable"("prompt_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_PromptTable_prompt_id_version_key" ON "LiteLLM_PromptTable"("prompt_id", "version");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_model_name_idx" ON "LiteLLM_HealthCheckTable"("model_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_checked_at_idx" ON "LiteLLM_HealthCheckTable"("checked_at");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_status_idx" ON "LiteLLM_HealthCheckTable"("status");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_SearchToolsTable_search_tool_name_key" ON "LiteLLM_SearchToolsTable"("search_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedVectorStoreIndexTable_index_name_key" ON "LiteLLM_ManagedVectorStoreIndexTable"("index_name");
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_OrganizationTable" ADD CONSTRAINT "LiteLLM_OrganizationTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_TeamTable" ADD CONSTRAINT "LiteLLM_TeamTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_UserTable" ADD CONSTRAINT "LiteLLM_UserTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_VerificationToken" ADD CONSTRAINT "LiteLLM_VerificationToken_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_TagTable" ADD CONSTRAINT "LiteLLM_TagTable_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
diff --git a/temp_migrations/20260106081922_initial/raw_migration.sql b/temp_migrations/20260106081922_initial/raw_migration.sql
new file mode 100644
index 00000000000..13aada6cffe
--- /dev/null
+++ b/temp_migrations/20260106081922_initial/raw_migration.sql
@@ -0,0 +1,873 @@
+Installing Prisma CLI
+-- CreateEnum
+CREATE TYPE "JobStatus" AS ENUM ('ACTIVE', 'INACTIVE');
+
+-- CreateTable
+CREATE TABLE "LiteLLM_BudgetTable" (
+ "budget_id" TEXT NOT NULL,
+ "max_budget" DOUBLE PRECISION,
+ "soft_budget" DOUBLE PRECISION,
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "model_max_budget" JSONB,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_BudgetTable_pkey" PRIMARY KEY ("budget_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CredentialsTable" (
+ "credential_id" TEXT NOT NULL,
+ "credential_name" TEXT NOT NULL,
+ "credential_values" JSONB NOT NULL,
+ "credential_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_CredentialsTable_pkey" PRIMARY KEY ("credential_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ProxyModelTable" (
+ "model_id" TEXT NOT NULL,
+ "model_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "model_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_ProxyModelTable_pkey" PRIMARY KEY ("model_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_AgentsTable" (
+ "agent_id" TEXT NOT NULL,
+ "agent_name" TEXT NOT NULL,
+ "litellm_params" JSONB,
+ "agent_card_params" JSONB NOT NULL,
+ "agent_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_AgentsTable_pkey" PRIMARY KEY ("agent_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_OrganizationTable" (
+ "organization_id" TEXT NOT NULL,
+ "organization_alias" TEXT NOT NULL,
+ "budget_id" TEXT NOT NULL,
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "models" TEXT[],
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "object_permission_id" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_OrganizationTable_pkey" PRIMARY KEY ("organization_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ModelTable" (
+ "id" SERIAL NOT NULL,
+ "aliases" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_ModelTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TeamTable" (
+ "team_id" TEXT NOT NULL,
+ "team_alias" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "admins" TEXT[],
+ "members" TEXT[],
+ "members_with_roles" JSONB NOT NULL DEFAULT '{}',
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "max_budget" DOUBLE PRECISION,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "models" TEXT[],
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "blocked" BOOLEAN NOT NULL DEFAULT false,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "team_member_permissions" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_id" INTEGER,
+
+ CONSTRAINT "LiteLLM_TeamTable_pkey" PRIMARY KEY ("team_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_UserTable" (
+ "user_id" TEXT NOT NULL,
+ "user_alias" TEXT,
+ "team_id" TEXT,
+ "sso_user_id" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "password" TEXT,
+ "teams" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "user_role" TEXT,
+ "max_budget" DOUBLE PRECISION,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "user_email" TEXT,
+ "models" TEXT[],
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "max_parallel_requests" INTEGER,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_UserTable_pkey" PRIMARY KEY ("user_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ObjectPermissionTable" (
+ "object_permission_id" TEXT NOT NULL,
+ "mcp_servers" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "mcp_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "mcp_tool_permissions" JSONB,
+ "vector_stores" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "agents" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "agent_access_groups" TEXT[] DEFAULT ARRAY[]::TEXT[],
+
+ CONSTRAINT "LiteLLM_ObjectPermissionTable_pkey" PRIMARY KEY ("object_permission_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_MCPServerTable" (
+ "server_id" TEXT NOT NULL,
+ "server_name" TEXT,
+ "alias" TEXT,
+ "description" TEXT,
+ "url" TEXT,
+ "transport" TEXT NOT NULL DEFAULT 'sse',
+ "auth_type" TEXT,
+ "credentials" JSONB DEFAULT '{}',
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT,
+ "mcp_info" JSONB DEFAULT '{}',
+ "mcp_access_groups" TEXT[],
+ "allowed_tools" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "extra_headers" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "static_headers" JSONB DEFAULT '{}',
+ "status" TEXT DEFAULT 'unknown',
+ "last_health_check" TIMESTAMP(3),
+ "health_check_error" TEXT,
+ "command" TEXT,
+ "args" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "env" JSONB DEFAULT '{}',
+
+ CONSTRAINT "LiteLLM_MCPServerTable_pkey" PRIMARY KEY ("server_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_VerificationToken" (
+ "token" TEXT NOT NULL,
+ "key_name" TEXT,
+ "key_alias" TEXT,
+ "soft_budget_cooldown" BOOLEAN NOT NULL DEFAULT false,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "expires" TIMESTAMP(3),
+ "models" TEXT[],
+ "aliases" JSONB NOT NULL DEFAULT '{}',
+ "config" JSONB NOT NULL DEFAULT '{}',
+ "user_id" TEXT,
+ "team_id" TEXT,
+ "permissions" JSONB NOT NULL DEFAULT '{}',
+ "max_parallel_requests" INTEGER,
+ "metadata" JSONB NOT NULL DEFAULT '{}',
+ "blocked" BOOLEAN,
+ "tpm_limit" BIGINT,
+ "rpm_limit" BIGINT,
+ "max_budget" DOUBLE PRECISION,
+ "budget_duration" TEXT,
+ "budget_reset_at" TIMESTAMP(3),
+ "allowed_cache_controls" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "allowed_routes" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "model_spend" JSONB NOT NULL DEFAULT '{}',
+ "model_max_budget" JSONB NOT NULL DEFAULT '{}',
+ "budget_id" TEXT,
+ "organization_id" TEXT,
+ "object_permission_id" TEXT,
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_by" TEXT,
+ "rotation_count" INTEGER DEFAULT 0,
+ "auto_rotate" BOOLEAN DEFAULT false,
+ "rotation_interval" TEXT,
+ "last_rotation_at" TIMESTAMP(3),
+ "key_rotation_at" TIMESTAMP(3),
+
+ CONSTRAINT "LiteLLM_VerificationToken_pkey" PRIMARY KEY ("token")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_EndUserTable" (
+ "user_id" TEXT NOT NULL,
+ "alias" TEXT,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "allowed_model_region" TEXT,
+ "default_model" TEXT,
+ "budget_id" TEXT,
+ "blocked" BOOLEAN NOT NULL DEFAULT false,
+
+ CONSTRAINT "LiteLLM_EndUserTable_pkey" PRIMARY KEY ("user_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TagTable" (
+ "tag_name" TEXT NOT NULL,
+ "description" TEXT,
+ "models" TEXT[],
+ "model_info" JSONB,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "budget_id" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_TagTable_pkey" PRIMARY KEY ("tag_name")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_Config" (
+ "param_name" TEXT NOT NULL,
+ "param_value" JSONB,
+
+ CONSTRAINT "LiteLLM_Config_pkey" PRIMARY KEY ("param_name")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SpendLogs" (
+ "request_id" TEXT NOT NULL,
+ "call_type" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL DEFAULT '',
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "total_tokens" INTEGER NOT NULL DEFAULT 0,
+ "prompt_tokens" INTEGER NOT NULL DEFAULT 0,
+ "completion_tokens" INTEGER NOT NULL DEFAULT 0,
+ "startTime" TIMESTAMP(3) NOT NULL,
+ "endTime" TIMESTAMP(3) NOT NULL,
+ "completionStartTime" TIMESTAMP(3),
+ "model" TEXT NOT NULL DEFAULT '',
+ "model_id" TEXT DEFAULT '',
+ "model_group" TEXT DEFAULT '',
+ "custom_llm_provider" TEXT DEFAULT '',
+ "api_base" TEXT DEFAULT '',
+ "user" TEXT DEFAULT '',
+ "metadata" JSONB DEFAULT '{}',
+ "cache_hit" TEXT DEFAULT '',
+ "cache_key" TEXT DEFAULT '',
+ "request_tags" JSONB DEFAULT '[]',
+ "team_id" TEXT,
+ "organization_id" TEXT,
+ "end_user" TEXT,
+ "requester_ip_address" TEXT,
+ "messages" JSONB DEFAULT '{}',
+ "response" JSONB DEFAULT '{}',
+ "session_id" TEXT,
+ "status" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "proxy_server_request" JSONB DEFAULT '{}',
+
+ CONSTRAINT "LiteLLM_SpendLogs_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ErrorLogs" (
+ "request_id" TEXT NOT NULL,
+ "startTime" TIMESTAMP(3) NOT NULL,
+ "endTime" TIMESTAMP(3) NOT NULL,
+ "api_base" TEXT NOT NULL DEFAULT '',
+ "model_group" TEXT NOT NULL DEFAULT '',
+ "litellm_model_name" TEXT NOT NULL DEFAULT '',
+ "model_id" TEXT NOT NULL DEFAULT '',
+ "request_kwargs" JSONB NOT NULL DEFAULT '{}',
+ "exception_type" TEXT NOT NULL DEFAULT '',
+ "exception_string" TEXT NOT NULL DEFAULT '',
+ "status_code" TEXT NOT NULL DEFAULT '',
+
+ CONSTRAINT "LiteLLM_ErrorLogs_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_UserNotifications" (
+ "request_id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "models" TEXT[],
+ "justification" TEXT NOT NULL,
+ "status" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_UserNotifications_pkey" PRIMARY KEY ("request_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_TeamMembership" (
+ "user_id" TEXT NOT NULL,
+ "team_id" TEXT NOT NULL,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "budget_id" TEXT,
+
+ CONSTRAINT "LiteLLM_TeamMembership_pkey" PRIMARY KEY ("user_id","team_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_OrganizationMembership" (
+ "user_id" TEXT NOT NULL,
+ "organization_id" TEXT NOT NULL,
+ "user_role" TEXT,
+ "spend" DOUBLE PRECISION DEFAULT 0.0,
+ "budget_id" TEXT,
+ "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "LiteLLM_OrganizationMembership_pkey" PRIMARY KEY ("user_id","organization_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_InvitationLink" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "is_accepted" BOOLEAN NOT NULL DEFAULT false,
+ "accepted_at" TIMESTAMP(3),
+ "expires_at" TIMESTAMP(3) NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL,
+ "created_by" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT NOT NULL,
+
+ CONSTRAINT "LiteLLM_InvitationLink_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_AuditLog" (
+ "id" TEXT NOT NULL,
+ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "changed_by" TEXT NOT NULL DEFAULT '',
+ "changed_by_api_key" TEXT NOT NULL DEFAULT '',
+ "action" TEXT NOT NULL,
+ "table_name" TEXT NOT NULL,
+ "object_id" TEXT NOT NULL,
+ "before_value" JSONB,
+ "updated_values" JSONB,
+
+ CONSTRAINT "LiteLLM_AuditLog_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyUserSpend" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyUserSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyOrganizationSpend" (
+ "id" TEXT NOT NULL,
+ "organization_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyOrganizationSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyEndUserSpend" (
+ "id" TEXT NOT NULL,
+ "end_user_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyEndUserSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyTeamSpend" (
+ "id" TEXT NOT NULL,
+ "team_id" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyTeamSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_DailyTagSpend" (
+ "id" TEXT NOT NULL,
+ "request_id" TEXT,
+ "tag" TEXT,
+ "date" TEXT NOT NULL,
+ "api_key" TEXT NOT NULL,
+ "model" TEXT,
+ "model_group" TEXT,
+ "custom_llm_provider" TEXT,
+ "mcp_namespaced_tool_name" TEXT,
+ "prompt_tokens" BIGINT NOT NULL DEFAULT 0,
+ "completion_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_read_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "cache_creation_input_tokens" BIGINT NOT NULL DEFAULT 0,
+ "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0,
+ "api_requests" BIGINT NOT NULL DEFAULT 0,
+ "successful_requests" BIGINT NOT NULL DEFAULT 0,
+ "failed_requests" BIGINT NOT NULL DEFAULT 0,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_DailyTagSpend_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CronJob" (
+ "cronjob_id" TEXT NOT NULL,
+ "pod_id" TEXT NOT NULL,
+ "status" "JobStatus" NOT NULL DEFAULT 'INACTIVE',
+ "last_updated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "ttl" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_CronJob_pkey" PRIMARY KEY ("cronjob_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedFileTable" (
+ "id" TEXT NOT NULL,
+ "unified_file_id" TEXT NOT NULL,
+ "file_object" JSONB,
+ "model_mappings" JSONB NOT NULL,
+ "flat_model_file_ids" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedFileTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedObjectTable" (
+ "id" TEXT NOT NULL,
+ "unified_object_id" TEXT NOT NULL,
+ "model_object_id" TEXT NOT NULL,
+ "file_object" JSONB NOT NULL,
+ "file_purpose" TEXT NOT NULL,
+ "status" TEXT,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedObjectTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedVectorStoresTable" (
+ "vector_store_id" TEXT NOT NULL,
+ "custom_llm_provider" TEXT NOT NULL,
+ "vector_store_name" TEXT,
+ "vector_store_description" TEXT,
+ "vector_store_metadata" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "litellm_credential_name" TEXT,
+ "litellm_params" JSONB,
+
+ CONSTRAINT "LiteLLM_ManagedVectorStoresTable_pkey" PRIMARY KEY ("vector_store_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_GuardrailsTable" (
+ "guardrail_id" TEXT NOT NULL,
+ "guardrail_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "guardrail_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_GuardrailsTable_pkey" PRIMARY KEY ("guardrail_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_PromptTable" (
+ "id" TEXT NOT NULL,
+ "prompt_id" TEXT NOT NULL,
+ "version" INTEGER NOT NULL DEFAULT 1,
+ "litellm_params" JSONB NOT NULL,
+ "prompt_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_PromptTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_HealthCheckTable" (
+ "health_check_id" TEXT NOT NULL,
+ "model_name" TEXT NOT NULL,
+ "model_id" TEXT,
+ "status" TEXT NOT NULL,
+ "healthy_count" INTEGER NOT NULL DEFAULT 0,
+ "unhealthy_count" INTEGER NOT NULL DEFAULT 0,
+ "error_message" TEXT,
+ "response_time_ms" DOUBLE PRECISION,
+ "details" JSONB,
+ "checked_by" TEXT,
+ "checked_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_HealthCheckTable_pkey" PRIMARY KEY ("health_check_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SearchToolsTable" (
+ "search_tool_id" TEXT NOT NULL,
+ "search_tool_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "search_tool_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_SearchToolsTable_pkey" PRIMARY KEY ("search_tool_id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_SSOConfig" (
+ "id" TEXT NOT NULL DEFAULT 'sso_config',
+ "sso_settings" JSONB NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_SSOConfig_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_ManagedVectorStoreIndexTable" (
+ "id" TEXT NOT NULL,
+ "index_name" TEXT NOT NULL,
+ "litellm_params" JSONB NOT NULL,
+ "index_info" JSONB,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "created_by" TEXT,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+ "updated_by" TEXT,
+
+ CONSTRAINT "LiteLLM_ManagedVectorStoreIndexTable_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "LiteLLM_CacheConfig" (
+ "id" TEXT NOT NULL DEFAULT 'cache_config',
+ "cache_settings" JSONB NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "LiteLLM_CacheConfig_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_CredentialsTable_credential_name_key" ON "LiteLLM_CredentialsTable"("credential_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_AgentsTable_agent_name_key" ON "LiteLLM_AgentsTable"("agent_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_TeamTable_model_id_key" ON "LiteLLM_TeamTable"("model_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_UserTable_sso_user_id_key" ON "LiteLLM_UserTable"("sso_user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_startTime_idx" ON "LiteLLM_SpendLogs"("startTime");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_end_user_idx" ON "LiteLLM_SpendLogs"("end_user");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_SpendLogs_session_id_idx" ON "LiteLLM_SpendLogs"("session_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_OrganizationMembership_user_id_organization_id_key" ON "LiteLLM_OrganizationMembership"("user_id", "organization_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_date_idx" ON "LiteLLM_DailyUserSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_user_id_idx" ON "LiteLLM_DailyUserSpend"("user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_api_key_idx" ON "LiteLLM_DailyUserSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_model_idx" ON "LiteLLM_DailyUserSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyUserSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyUserSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+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", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_date_idx" ON "LiteLLM_DailyOrganizationSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_idx" ON "LiteLLM_DailyOrganizationSpend"("organization_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_api_key_idx" ON "LiteLLM_DailyOrganizationSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_model_idx" ON "LiteLLM_DailyOrganizationSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyOrganizationSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyOrganizationSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_date_api_key_key" ON "LiteLLM_DailyOrganizationSpend"("organization_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_date_idx" ON "LiteLLM_DailyEndUserSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_idx" ON "LiteLLM_DailyEndUserSpend"("end_user_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_api_key_idx" ON "LiteLLM_DailyEndUserSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_model_idx" ON "LiteLLM_DailyEndUserSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyEndUserSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyEndUserSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_date_api_key_model_cu_key" ON "LiteLLM_DailyEndUserSpend"("end_user_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_date_idx" ON "LiteLLM_DailyTeamSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_team_id_idx" ON "LiteLLM_DailyTeamSpend"("team_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_api_key_idx" ON "LiteLLM_DailyTeamSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_model_idx" ON "LiteLLM_DailyTeamSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTeamSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyTeamSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+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", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_date_idx" ON "LiteLLM_DailyTagSpend"("date");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_tag_idx" ON "LiteLLM_DailyTagSpend"("tag");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_api_key_idx" ON "LiteLLM_DailyTagSpend"("api_key");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_model_idx" ON "LiteLLM_DailyTagSpend"("model");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_DailyTagSpend_mcp_namespaced_tool_name_idx" ON "LiteLLM_DailyTagSpend"("mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_DailyTagSpend_tag_date_api_key_model_custom_llm_pro_key" ON "LiteLLM_DailyTagSpend"("tag", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedFileTable_unified_file_id_key" ON "LiteLLM_ManagedFileTable"("unified_file_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedFileTable_unified_file_id_idx" ON "LiteLLM_ManagedFileTable"("unified_file_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedObjectTable_unified_object_id_key" ON "LiteLLM_ManagedObjectTable"("unified_object_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedObjectTable_model_object_id_key" ON "LiteLLM_ManagedObjectTable"("model_object_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedObjectTable_unified_object_id_idx" ON "LiteLLM_ManagedObjectTable"("unified_object_id");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_ManagedObjectTable_model_object_id_idx" ON "LiteLLM_ManagedObjectTable"("model_object_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_GuardrailsTable_guardrail_name_key" ON "LiteLLM_GuardrailsTable"("guardrail_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_PromptTable_prompt_id_idx" ON "LiteLLM_PromptTable"("prompt_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_PromptTable_prompt_id_version_key" ON "LiteLLM_PromptTable"("prompt_id", "version");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_model_name_idx" ON "LiteLLM_HealthCheckTable"("model_name");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_checked_at_idx" ON "LiteLLM_HealthCheckTable"("checked_at");
+
+-- CreateIndex
+CREATE INDEX "LiteLLM_HealthCheckTable_status_idx" ON "LiteLLM_HealthCheckTable"("status");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_SearchToolsTable_search_tool_name_key" ON "LiteLLM_SearchToolsTable"("search_tool_name");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "LiteLLM_ManagedVectorStoreIndexTable_index_name_key" ON "LiteLLM_ManagedVectorStoreIndexTable"("index_name");
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_OrganizationTable" ADD CONSTRAINT "LiteLLM_OrganizationTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_TeamTable" ADD CONSTRAINT "LiteLLM_TeamTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_UserTable" ADD CONSTRAINT "LiteLLM_UserTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_VerificationToken" ADD CONSTRAINT "LiteLLM_VerificationToken_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+ALTER TABLE "LiteLLM_TagTable" ADD CONSTRAINT "LiteLLM_TagTable_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
+-- AddForeignKey
+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;
+
diff --git a/temp_migrations/migration_lock.toml b/temp_migrations/migration_lock.toml
new file mode 100644
index 00000000000..2fe25d87cc3
--- /dev/null
+++ b/temp_migrations/migration_lock.toml
@@ -0,0 +1 @@
+provider = "postgresql"
diff --git a/tests/llm_translation/test_gemini.py b/tests/llm_translation/test_gemini.py
index 57667085c00..c6935d50045 100644
--- a/tests/llm_translation/test_gemini.py
+++ b/tests/llm_translation/test_gemini.py
@@ -1224,3 +1224,175 @@ def test_gemini_function_args_preserve_unicode():
assert parsed_args["recipient"] == "José"
assert "\\u" not in arguments_str
assert "José" in arguments_str
+
+
+def test_anthropic_thinking_param_to_gemini_3_thinkingLevel():
+ """
+ Test that Anthropic thinking parameters are correctly transformed to Gemini 3 thinkingLevel
+ instead of thinkingBudget.
+
+ For Gemini 3+ models (gemini-3-flash, gemini-3-pro, gemini-3-flash-preview):
+ - Should use thinkingLevel instead of thinkingBudget
+ - budget_tokens should map to thinkingLevel
+
+ Related issue: https://github.com/BerriAI/litellm/issues/XXXX
+ """
+ from litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_gemini import (
+ VertexGeminiConfig,
+ )
+ from litellm.types.llms.anthropic import AnthropicThinkingParam
+
+ # Test 1: Anthropic thinking enabled with budget_tokens for Gemini 3 model
+ thinking_param: AnthropicThinkingParam = {
+ "type": "enabled",
+ "budget_tokens": 10000,
+ }
+
+ result = VertexGeminiConfig._map_thinking_param(
+ thinking_param=thinking_param,
+ model="gemini-3-flash",
+ )
+
+ # For Gemini 3, should use thinkingLevel, not thinkingBudget
+ assert "thinkingLevel" in result, "Should have thinkingLevel for Gemini 3"
+ assert "thinkingBudget" not in result, "Should NOT have thinkingBudget for Gemini 3"
+ assert result["includeThoughts"] is True
+ assert result["thinkingLevel"] in ["minimal", "low"], "thinkingLevel should be 'minimal' or 'low'"
+
+ # Test 2: Anthropic thinking disabled for Gemini 3
+ thinking_param_disabled: AnthropicThinkingParam = {
+ "type": "disabled",
+ "budget_tokens": None,
+ }
+
+ result_disabled = VertexGeminiConfig._map_thinking_param(
+ thinking_param=thinking_param_disabled,
+ model="gemini-3-pro-preview",
+ )
+
+ assert result_disabled.get("includeThoughts") is False
+ assert "thinkingLevel" not in result_disabled or result_disabled.get("thinkingLevel") is None
+
+ # Test 3: Budget tokens = 0 for Gemini 3
+ thinking_param_zero: AnthropicThinkingParam = {
+ "type": "enabled",
+ "budget_tokens": 0,
+ }
+
+ result_zero = VertexGeminiConfig._map_thinking_param(
+ thinking_param=thinking_param_zero,
+ model="gemini-3-flash",
+ )
+
+ assert result_zero["includeThoughts"] is False
+ assert "thinkingLevel" not in result_zero or result_zero.get("thinkingLevel") is None
+
+ # Test 4: Fiercefalcon model (Gemini 3 Flash checkpoint) should use thinkingLevel
+ result_gemini3flashpreview = VertexGeminiConfig._map_thinking_param(
+ thinking_param=thinking_param,
+ model="gemini-3-flash-preview",
+ )
+
+ assert "thinkingLevel" in result_gemini3flashpreview, "Should have thinkingLevel for gemini-3-flash-preview"
+ assert "thinkingBudget" not in result_gemini3flashpreview, "Should NOT have thinkingBudget for gemini-3-flash-preview"
+ assert result_gemini3flashpreview["includeThoughts"] is True
+
+
+def test_anthropic_thinking_param_to_gemini_2_thinkingBudget():
+ """
+ Test that Anthropic thinking parameters are correctly transformed to Gemini 2 thinkingBudget
+ (not thinkingLevel).
+
+ For Gemini 2.x models (gemini-2.5-flash, gemini-2.0-flash):
+ - Should continue using thinkingBudget
+ - thinkingLevel should NOT be used
+
+ Related issue: https://github.com/BerriAI/litellm/issues/XXXX
+ """
+ from litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_gemini import (
+ VertexGeminiConfig,
+ )
+ from litellm.types.llms.anthropic import AnthropicThinkingParam
+
+ # Test 1: Anthropic thinking enabled with budget_tokens for Gemini 2 model
+ thinking_param: AnthropicThinkingParam = {
+ "type": "enabled",
+ "budget_tokens": 10000,
+ }
+
+ result = VertexGeminiConfig._map_thinking_param(
+ thinking_param=thinking_param,
+ model="gemini-2.5-flash",
+ )
+
+ # For Gemini 2, should use thinkingBudget, not thinkingLevel
+ assert "thinkingBudget" in result, "Should have thinkingBudget for Gemini 2"
+ assert "thinkingLevel" not in result, "Should NOT have thinkingLevel for Gemini 2"
+ assert result["includeThoughts"] is True
+ assert result["thinkingBudget"] == 10000
+
+ # Test 2: Anthropic thinking enabled for gemini-2.0-flash model
+ result_gemini2 = VertexGeminiConfig._map_thinking_param(
+ thinking_param=thinking_param,
+ model="gemini-2.0-flash-thinking-exp-01-21",
+ )
+
+ assert "thinkingBudget" in result_gemini2, "Should have thinkingBudget for Gemini 2"
+ assert "thinkingLevel" not in result_gemini2, "Should NOT have thinkingLevel for Gemini 2"
+ assert result_gemini2["includeThoughts"] is True
+ assert result_gemini2["thinkingBudget"] == 10000
+
+
+def test_anthropic_thinking_param_via_map_openai_params():
+ """
+ Test that the thinking parameter is correctly transformed through the full map_openai_params flow
+ for Gemini 3 models, resulting in thinkingConfig with thinkingLevel.
+
+ This tests the full integration from Anthropic API format to Gemini format.
+ """
+ from litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_gemini import (
+ VertexGeminiConfig,
+ )
+ from litellm.types.llms.anthropic import AnthropicThinkingParam
+
+ config = VertexGeminiConfig()
+
+ # Test with Gemini 3 model
+ non_default_params = {
+ "thinking": {
+ "type": "enabled",
+ "budget_tokens": 10000,
+ }
+ }
+ optional_params: dict = {}
+
+ result = config.map_openai_params(
+ non_default_params=non_default_params,
+ optional_params=optional_params,
+ model="gemini-3-flash",
+ drop_params=False,
+ )
+
+ # Check that thinkingConfig was created with thinkingLevel
+ assert "thinkingConfig" in result, "Should have thinkingConfig in optional_params"
+ thinking_config = result["thinkingConfig"]
+ assert "thinkingLevel" in thinking_config, "Should have thinkingLevel for Gemini 3"
+ assert "thinkingBudget" not in thinking_config, "Should NOT have thinkingBudget for Gemini 3"
+ assert thinking_config["includeThoughts"] is True
+
+ # Test with Gemini 2 model
+ optional_params_2 = {}
+ result_2 = config.map_openai_params(
+ non_default_params=non_default_params,
+ optional_params=optional_params_2,
+ model="gemini-2.5-flash",
+ drop_params=False,
+ )
+
+ # Check that thinkingConfig was created with thinkingBudget
+ assert "thinkingConfig" in result_2, "Should have thinkingConfig in optional_params"
+ thinking_config_2 = result_2["thinkingConfig"]
+ assert "thinkingBudget" in thinking_config_2, "Should have thinkingBudget for Gemini 2"
+ assert "thinkingLevel" not in thinking_config_2, "Should NOT have thinkingLevel for Gemini 2"
+ assert thinking_config_2["includeThoughts"] is True
+ assert thinking_config_2["thinkingBudget"] == 10000
diff --git a/tests/test_litellm/google_genai/test_google_genai_transformation.py b/tests/test_litellm/google_genai/test_google_genai_transformation.py
new file mode 100644
index 00000000000..c953a504a38
--- /dev/null
+++ b/tests/test_litellm/google_genai/test_google_genai_transformation.py
@@ -0,0 +1,249 @@
+#!/usr/bin/env python3
+"""
+Test to verify the Google GenAI transformation logic for generateContent parameters
+"""
+import os
+import sys
+
+sys.path.insert(
+ 0, os.path.abspath("../../..")
+) # Adds the parent directory to the system path
+
+import pytest
+
+from litellm.llms.gemini.google_genai.transformation import GoogleGenAIConfig
+from litellm.responses.litellm_completion_transformation.transformation import (
+ LiteLLMCompletionResponsesConfig,
+)
+
+
+def test_map_generate_content_optional_params_response_json_schema_camelcase():
+ """Test that responseJsonSchema (camelCase) is passed through correctly"""
+ config = GoogleGenAIConfig()
+
+ generate_content_config_dict = {
+ "responseJsonSchema": {
+ "type": "object",
+ "properties": {
+ "recipe_name": {"type": "string"}
+ }
+ },
+ "temperature": 1.0
+ }
+
+ result = config.map_generate_content_optional_params(
+ generate_content_config_dict=generate_content_config_dict,
+ model="gemini/gemini-3-flash-preview"
+ )
+
+ # responseJsonSchema should be in the result (camelCase format for Google GenAI API)
+ assert "responseJsonSchema" in result
+ assert result["responseJsonSchema"] == generate_content_config_dict["responseJsonSchema"]
+ assert "temperature" in result
+ assert result["temperature"] == 1.0
+
+
+def test_map_generate_content_optional_params_response_schema_snakecase():
+ """Test that response_schema (snake_case) is converted to responseJsonSchema (camelCase)"""
+ config = GoogleGenAIConfig()
+
+ generate_content_config_dict = {
+ "response_json_schema": {
+ "type": "object",
+ "properties": {
+ "recipe_name": {"type": "string"}
+ }
+ },
+ "temperature": 1.0
+ }
+
+ result = config.map_generate_content_optional_params(
+ generate_content_config_dict=generate_content_config_dict,
+ model="gemini/gemini-3-flash-preview"
+ )
+
+ # response_schema should be converted to responseJsonSchema (camelCase)
+ assert "responseJsonSchema" in result
+ assert result["responseJsonSchema"] == generate_content_config_dict["response_json_schema"]
+ assert "temperature" in result
+
+
+def test_map_generate_content_optional_params_thinking_config_camelcase():
+ """Test that thinkingConfig (camelCase) is passed through correctly"""
+ config = GoogleGenAIConfig()
+
+ generate_content_config_dict = {
+ "thinkingConfig": {
+ "thinkingLevel": "minimal",
+ "includeThoughts": True
+ },
+ "temperature": 1.0
+ }
+
+ result = config.map_generate_content_optional_params(
+ generate_content_config_dict=generate_content_config_dict,
+ model="gemini/gemini-3-flash-preview"
+ )
+
+ # thinkingConfig should be in the result (camelCase format for Google GenAI API)
+ assert "thinkingConfig" in result
+ assert result["thinkingConfig"]["thinkingLevel"] == "minimal"
+ assert result["thinkingConfig"]["includeThoughts"] is True
+ assert "temperature" in result
+
+
+def test_map_generate_content_optional_params_thinking_config_snakecase():
+ """Test that thinking_config (snake_case) is converted to thinkingConfig (camelCase)"""
+ config = GoogleGenAIConfig()
+
+ generate_content_config_dict = {
+ "thinking_config": {
+ "thinkingLevel": "medium",
+ "includeThoughts": True
+ },
+ "temperature": 1.0
+ }
+
+ result = config.map_generate_content_optional_params(
+ generate_content_config_dict=generate_content_config_dict,
+ model="gemini/gemini-3-flash-preview"
+ )
+
+ # thinking_config should be converted to thinkingConfig (camelCase)
+ assert "thinkingConfig" in result
+ assert result["thinkingConfig"]["thinkingLevel"] == "medium"
+ assert result["thinkingConfig"]["includeThoughts"] is True
+ assert "thinking_config" not in result # Should not be in snake_case format
+ assert "temperature" in result
+
+
+def test_map_generate_content_optional_params_mixed_formats():
+ """Test that both camelCase and snake_case parameters work together"""
+ config = GoogleGenAIConfig()
+
+ generate_content_config_dict = {
+ "responseJsonSchema": {
+ "type": "object",
+ "properties": {
+ "recipe_name": {"type": "string"}
+ }
+ },
+ "thinking_config": {
+ "thinkingLevel": "low",
+ "includeThoughts": True
+ },
+ "temperature": 1.0,
+ "max_output_tokens": 100
+ }
+
+ result = config.map_generate_content_optional_params(
+ generate_content_config_dict=generate_content_config_dict,
+ model="gemini/gemini-3-flash-preview"
+ )
+
+ # All parameters should be converted to camelCase
+ assert "responseJsonSchema" in result
+ assert "thinkingConfig" in result
+ assert result["thinkingConfig"]["thinkingLevel"] == "low"
+ assert "temperature" in result
+ assert "maxOutputTokens" in result # This one stays as-is if it's in supported list
+
+
+def test_map_generate_content_optional_params_response_mime_type():
+ """Test that responseMimeType is handled correctly"""
+ config = GoogleGenAIConfig()
+
+ generate_content_config_dict = {
+ "responseMimeType": "application/json",
+ "responseJsonSchema": {
+ "type": "object",
+ "properties": {
+ "recipe_name": {"type": "string"}
+ }
+ }
+ }
+
+ result = config.map_generate_content_optional_params(
+ generate_content_config_dict=generate_content_config_dict,
+ model="gemini/gemini-3-flash-preview"
+ )
+
+ # responseMimeType should be passed through (it's already camelCase)
+ assert "responseMimeType" in result or "response_mime_type" in result
+ assert "responseJsonSchema" in result
+
+
+def test_responses_api_reasoning_dict_format():
+ """Test that reasoning parameter with dict format is mapped to reasoning_effort"""
+ from litellm.types.llms.openai import ResponsesAPIOptionalRequestParams
+
+ responses_api_request: ResponsesAPIOptionalRequestParams = {
+ "reasoning": {"effort": "high"},
+ "temperature": 1.0,
+ }
+
+ result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request(
+ model="gemini/2.5-pro",
+ input="Hello, what is the capital of France?",
+ responses_api_request=responses_api_request,
+ )
+
+ # reasoning_effort should be extracted from reasoning dict
+ assert "reasoning_effort" in result
+ assert result["reasoning_effort"] == "high"
+
+
+def test_responses_api_reasoning_string_format():
+ """Test that reasoning parameter with string format is mapped to reasoning_effort"""
+ from litellm.types.llms.openai import ResponsesAPIOptionalRequestParams
+
+ responses_api_request: ResponsesAPIOptionalRequestParams = {
+ "reasoning": "medium", # Could be a string directly
+ "temperature": 1.0,
+ }
+
+ result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request(
+ model="gemini/2.5-pro",
+ input="Hello, what is the capital of France?",
+ responses_api_request=responses_api_request,
+ )
+
+ # reasoning_effort should be extracted from reasoning string
+ assert "reasoning_effort" in result
+ assert result["reasoning_effort"] == "medium"
+
+
+def test_responses_api_reasoning_low_effort():
+ """Test that low reasoning effort is correctly mapped"""
+ from litellm.types.llms.openai import ResponsesAPIOptionalRequestParams
+
+ responses_api_request: ResponsesAPIOptionalRequestParams = {
+ "reasoning": {"effort": "low"},
+ }
+
+ result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request(
+ model="gemini/2.5-pro",
+ input="Test",
+ responses_api_request=responses_api_request,
+ )
+
+ assert "reasoning_effort" in result
+ assert result["reasoning_effort"] == "low"
+
+
+def test_responses_api_no_reasoning():
+ """Test that no reasoning_effort is included when reasoning is not provided"""
+ from litellm.types.llms.openai import ResponsesAPIOptionalRequestParams
+
+ responses_api_request: ResponsesAPIOptionalRequestParams = {
+ "temperature": 1.0,
+ }
+
+ result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request(
+ model="gemini/2.5-pro",
+ input="Test",
+ responses_api_request=responses_api_request,
+ )
+
+ # reasoning_effort should not be in result if not provided (filtered out as None)
+ assert "reasoning_effort" not in result or result.get("reasoning_effort") is None
diff --git a/tests/test_litellm/proxy/client/test_credentials.py b/tests/test_litellm/proxy/client/test_credentials.py
index 580bbb39dc0..72c643467b2 100644
--- a/tests/test_litellm/proxy/client/test_credentials.py
+++ b/tests/test_litellm/proxy/client/test_credentials.py
@@ -13,6 +13,8 @@
from litellm.proxy.client.credentials import CredentialsManagementClient
from litellm.proxy.client.exceptions import UnauthorizedError
+from litellm.proxy.credential_endpoints.endpoints import CredentialHelperUtils
+from litellm.types.utils import CredentialItem
@pytest.fixture
@@ -263,3 +265,19 @@ def test_get_unauthorized_error(client):
with pytest.raises(UnauthorizedError):
client.get(credential_name="azure1")
+
+
+def test_encrypt_credential_values_does_not_mutate_original(monkeypatch):
+ """Ensure encrypt_credential_values returns a new encrypted object"""
+ monkeypatch.setenv("LITELLM_SALT_KEY", "test-key")
+ credential = CredentialItem(
+ credential_name="azure1",
+ credential_values={"api_key": "sk-123"},
+ credential_info={"api_type": "azure"},
+ )
+
+ encrypted = CredentialHelperUtils.encrypt_credential_values(credential)
+
+ assert encrypted.credential_values["api_key"] != "sk-123"
+ assert credential.credential_values["api_key"] == "sk-123"
+ assert encrypted.credential_name == credential.credential_name
diff --git a/ui/litellm-dashboard/package-lock.json b/ui/litellm-dashboard/package-lock.json
index 641db8b107d..3ceeb9a5d61 100644
--- a/ui/litellm-dashboard/package-lock.json
+++ b/ui/litellm-dashboard/package-lock.json
@@ -26,7 +26,7 @@
"jwt-decode": "^4.0.0",
"lucide-react": "^0.513.0",
"moment": "^2.30.1",
- "next": "^14.2.32",
+ "next": "^14.2.35",
"openai": "^4.93.0",
"papaparse": "^5.5.2",
"react": "^18",
@@ -4779,9 +4779,9 @@
}
},
"node_modules/@next/env": {
- "version": "14.2.33",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.33.tgz",
- "integrity": "sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA==",
+ "version": "14.2.35",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz",
+ "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==",
"license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
@@ -18237,12 +18237,12 @@
"license": "MIT"
},
"node_modules/next": {
- "version": "14.2.33",
- "resolved": "https://registry.npmjs.org/next/-/next-14.2.33.tgz",
- "integrity": "sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==",
+ "version": "14.2.35",
+ "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz",
+ "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==",
"license": "MIT",
"dependencies": {
- "@next/env": "14.2.33",
+ "@next/env": "14.2.35",
"@swc/helpers": "0.5.5",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001579",
@@ -21073,12 +21073,12 @@
}
},
"node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "version": "6.14.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
+ "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
"license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
diff --git a/ui/litellm-dashboard/package.json b/ui/litellm-dashboard/package.json
index e366b4febff..8ebdf3f35e2 100644
--- a/ui/litellm-dashboard/package.json
+++ b/ui/litellm-dashboard/package.json
@@ -31,7 +31,7 @@
"jwt-decode": "^4.0.0",
"lucide-react": "^0.513.0",
"moment": "^2.30.1",
- "next": "^14.2.32",
+ "next": "^14.2.35",
"openai": "^4.93.0",
"papaparse": "^5.5.2",
"react": "^18",
@@ -79,7 +79,8 @@
"mermaid": ">=11.10.0",
"js-yaml": ">=4.1.1",
"glob": ">=11.1.0",
- "node-forge": ">=1.3.2"
+ "node-forge": ">=1.3.2",
+ "qs": ">=6.14.1"
},
"engines": {
"node": ">=18.17.0",
diff --git a/ui/litellm-dashboard/src/components/cache_dashboard.tsx b/ui/litellm-dashboard/src/components/cache_dashboard.tsx
index 38c0f1a8f41..895388016a0 100644
--- a/ui/litellm-dashboard/src/components/cache_dashboard.tsx
+++ b/ui/litellm-dashboard/src/components/cache_dashboard.tsx
@@ -162,13 +162,13 @@ const CacheDashboard: React.FC = ({ accessToken, token, userRole
/*
Data looks like this
- [{"api_key":"147dba2181f28914eea90eb484926c293cdcf7f5b5c9c3dd6a004d9e0f9fdb21","call_type":"acompletion","model":"llama3-8b-8192","total_rows":13,"cache_hit_true_rows":0},
- {"api_key":"8c23f021d0535c2e59abb7d83d0e03ccfb8db1b90e231ff082949d95df419e86","call_type":"None","model":"chatgpt-v-2","total_rows":1,"cache_hit_true_rows":0},
- {"api_key":"88dc28d0f030c55ed4ab77ed8faf098196cb1c05df778539800c9f1243fe6b4b","call_type":"acompletion","model":"gpt-3.5-turbo","total_rows":19,"cache_hit_true_rows":0},
- {"api_key":"88dc28d0f030c55ed4ab77ed8faf098196cb1c05df778539800c9f1243fe6b4b","call_type":"aimage_generation","model":"","total_rows":3,"cache_hit_true_rows":0},
- {"api_key":"0ad4b3c03dcb6de0b5b8f761db798c6a8ae80be3fd1e2ea30c07ce6d5e3bf870","call_type":"None","model":"chatgpt-v-2","total_rows":1,"cache_hit_true_rows":0},
- {"api_key":"034224b36e9769bc50e2190634abc3f97cad789b17ca80ac43b82f46cd5579b3","call_type":"","model":"chatgpt-v-2","total_rows":1,"cache_hit_true_rows":0},
- {"api_key":"4f9c71cce0a2bb9a0b62ce6f0ebb3245b682702a8851d26932fa7e3b8ebfc755","call_type":"","model":"chatgpt-v-2","total_rows":1,"cache_hit_true_rows":0},
+ [{"api_key":"sk-example-1234567890abcdef","call_type":"acompletion","model":"llama3-8b-8192","total_rows":13,"cache_hit_true_rows":0},
+ {"api_key":"sk-example-1234567890abcdef","call_type":"None","model":"chatgpt-v-2","total_rows":1,"cache_hit_true_rows":0},
+ {"api_key":"sk-example-1234567890abcdef","call_type":"acompletion","model":"gpt-3.5-turbo","total_rows":19,"cache_hit_true_rows":0},
+ {"api_key":"sk-example-1234567890abcdef","call_type":"aimage_generation","model":"","total_rows":3,"cache_hit_true_rows":0},
+ {"api_key":"sk-example-1234567890abcdef","call_type":"None","model":"chatgpt-v-2","total_rows":1,"cache_hit_true_rows":0},
+ {"api_key":"sk-example-1234567890abcdef","call_type":"","model":"chatgpt-v-2","total_rows":1,"cache_hit_true_rows":0},
+ {"api_key":"sk-example-1234567890abcdef","call_type":"","model":"chatgpt-v-2","total_rows":1,"cache_hit_true_rows":0},
*/
// What data we need for bar chat