refactor: remove standalone Lens integration

This commit is contained in:
moe-berri 2026-11-10 04:10:18 -08:00
parent 433163a8e2
commit 569a794de1
901 changed files with 15190 additions and 72753 deletions

View file

@ -20,7 +20,6 @@ on:
- backend/Dockerfile
- backend/main.py
- litellm-rust/**
- litellm/proxy/lens/**
- docker/component_entrypoint.sh
- docker/entrypoint.sh
- litellm/proxy/prisma_migration.py
@ -131,7 +130,7 @@ jobs:
persist-credentials: false
- name: Build runtime image
run: docker build --build-arg LITELLM_RELEASE_TAG=v0.0.0-lens-ci -f "${{ matrix.dockerfile }}" -t litellm-runtime-scan:${{ github.sha }} .
run: docker build --build-arg LITELLM_RELEASE_TAG=v0.0.0-ci -f "${{ matrix.dockerfile }}" -t litellm-runtime-scan:${{ github.sha }} .
- name: Tag the cached builder for Admin MCP schema setup
run: docker build --target builder -f "${{ matrix.dockerfile }}" -t litellm-admin-mcp-schema:${{ github.sha }} .

View file

@ -6,10 +6,6 @@ on:
- "litellm-rust/**"
- "model_prices_and_context_window.json"
- "litellm/rust_bridge/**"
- "scripts/generate_trace_types.py"
- "scripts/trace_codegen/**"
- "scripts/lens_assets/**"
- "litellm/tracing/**"
- "tests/test_litellm_rust/**"
- "litellm/integrations/custom_logger.py"
- "litellm/litellm_core_utils/litellm_logging.py"
@ -41,10 +37,6 @@ on:
- "litellm-rust/**"
- "model_prices_and_context_window.json"
- "litellm/rust_bridge/**"
- "scripts/generate_trace_types.py"
- "scripts/trace_codegen/**"
- "scripts/lens_assets/**"
- "litellm/tracing/**"
- "tests/test_litellm_rust/**"
- "litellm/integrations/custom_logger.py"
- "litellm/litellm_core_utils/litellm_logging.py"
@ -158,10 +150,6 @@ jobs:
with:
version: "v0.18.0"
- name: Check generated trace contracts
working-directory: .
run: uv run scripts/generate_trace_types.py --check
- run: cargo nextest run --workspace --locked
- run: cargo test --workspace --doc --locked

View file

@ -956,7 +956,6 @@ jobs:
- shard: endpoints-and-responses
test-path: |-
tests/unit/proxy/test_proxy_server_exception_mapping.py
tests/unit/proxy/lens
tests/unit/proxy/auth/test_models_fallback_endpoint.py
tests/unit/proxy/common_utils/test_check_batch_cost.py
tests/unit/proxy/common_utils/test_check_responses_cost.py
@ -979,16 +978,6 @@ jobs:
timeout-minutes: 15
job-timeout-minutes: 60
dist: loadscope
- shard: lens-python-310
test-path: >-
tests/unit/proxy/lens
python-version: "3.10"
workers: 0
reruns: 0
timeout-minutes: 5
job-timeout-minutes: 60
dist: loadscope
steps:
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
timeout-minutes: 3

View file

@ -86,9 +86,6 @@ BACKEND_PATH_PREFIXES: tuple[str, ...] = (
# Spend / analytics
"/spend/",
"/analytics/",
"/lens/",
"/v1/traces",
"/v1/logs",
"/global/",
"/user_agent",
"/usage/",
@ -153,7 +150,6 @@ BACKEND_EXACT_PATHS: frozenset[str] = frozenset(
{
"/",
"/routes",
"/lens",
"/openapi.json",
"/docs",
"/docs/oauth2-redirect",

View file

@ -70,10 +70,6 @@ flag_management:
carryforward: false
- name: responses-caching-types
carryforward: false
- name: lens-python-310
carryforward: false
- name: lens-postgres
carryforward: false
- name: proxy-db-key-generation
carryforward: false
- name: proxy-db-auth-checks

View file

@ -6563,87 +6563,6 @@
],
"title": "litellm_project_model_rate_limit_used_metric",
"type": "timeseries"
},
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 447
},
"id": 115,
"panels": [],
"title": "Agent tracing export (needs LITELLM_LENS_URL)",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"description": "Request records the Lens exporter delivered to the Lens service against the records it dropped before the service accepted them",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"drawStyle": "line",
"fillOpacity": 10,
"lineWidth": 1,
"showPoints": "never",
"spanNulls": false
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 448
},
"id": 116,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"expr": "sum(rate(litellm_lens_export_rows_written_total[$__rate_interval]))",
"legendFormat": "written",
"range": true,
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"expr": "sum(rate(litellm_lens_export_rows_dropped_total[$__rate_interval]))",
"legendFormat": "dropped",
"range": true,
"refId": "B"
}
],
"title": "litellm_lens_export_rows_written and litellm_lens_export_rows_dropped rate",
"type": "timeseries"
}
],
"preload": false,

View file

@ -1,10 +1,10 @@
# LiteLLM All Prometheus Metrics dashboard
Every `litellm_*` metric family the proxy can expose on `/metrics` (143 families across 98 panels), grouped into rows: proxy traffic, latency, spend and tokens, cache, LLM API deployments, key and team rate limits, budgets, guardrails, MCP, managed files and batches, users and teams, the Redis circuit breaker, the spend log cleanup job, the `prometheus_system` service callback metrics (per-service latency, request and failure rates, spend update queue sizes), project model rate limits, and the agent tracing export to Lens. Panel titles are the metric names so you can grep the JSON for the metric you care about
Every `litellm_*` metric family the proxy can expose on `/metrics`, grouped into rows: proxy traffic, latency, spend and tokens, cache, LLM API deployments, key and team rate limits, budgets, guardrails, MCP, managed files and batches, users and teams, the Redis circuit breaker, the spend log cleanup job, the `prometheus_system` service callback metrics (per-service latency, request and failure rates, spend update queue sizes), and project model rate limits. Panel titles are the metric names so you can grep the JSON for the metric you care about
Import `grafana_dashboard.json` from **Dashboards > New > Import** and pick your Prometheus data source when prompted (the `DS_PROMETHEUS` variable). Counters are plotted as `rate()` over `$__rate_interval`, histograms as p50 / p95 / p99, gauges as the raw value grouped by the most useful label. Every query names the metric exactly as the proxy emits it (counters carry the `_total` suffix the Prometheus client adds), and `tests/unit/integrations/test_prometheus_metric_name_consistency.py` fails if a metric is renamed without updating this dashboard
The first eleven rows and the project model rate limits row need only `callbacks: ["prometheus"]`. The other rows and the `litellm_admission_*` panels are emitted by other subsystems and stay empty until those are on: the service callback row needs `service_callback: ["prometheus_system"]` in `litellm_settings`, the circuit breaker row needs a Redis cache, the cleanup row needs spend log retention, the agent tracing export row needs `LITELLM_LENS_URL`, and admission control needs its middleware enabled. Within the base rows, many panels only fill in once the matching feature is in use: budgets need keys, teams, users or orgs with `max_budget` set, cache panels need caching on, guardrail and MCP panels need those features configured, deployment health needs the router with more than one deployment or a failure to record, and `litellm_in_flight_requests` needs traffic at scrape time. An empty panel for a feature you do not use is expected
The first eleven rows and the project model rate limits row need only `callbacks: ["prometheus"]`. The other rows and the `litellm_admission_*` panels are emitted by other subsystems and stay empty until those are on: the service callback row needs `service_callback: ["prometheus_system"]` in `litellm_settings`, the circuit breaker row needs a Redis cache, the cleanup row needs spend log retention, and admission control needs its middleware enabled. Within the base rows, many panels only fill in once the matching feature is in use: budgets need keys, teams, users or orgs with `max_budget` set, cache panels need caching on, guardrail and MCP panels need those features configured, deployment health needs the router with more than one deployment or a failure to record, and `litellm_in_flight_requests` needs traffic at scrape time. An empty panel for a feature you do not use is expected
## Pre-requisites

View file

@ -1,46 +0,0 @@
name: litellm-tracing
services:
litellm:
build:
context: ..
target: runtime
args:
LITELLM_RELEASE_TAG: ${LITELLM_RELEASE_TAG:-}
command: ["--config", "/app/tracing-config.yaml", "--port", "4000"]
environment:
LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY}
LITELLM_SALT_KEY: sk-local-tracing-salt-key
DATABASE_URL: postgresql://litellm:litellm@db:5432/litellm
STORE_MODEL_IN_DB: "True"
LITELLM_LENS_URL: ${LITELLM_LENS_URL:?set the Lens URL reachable from the gateway container}
LITELLM_LENS_PUBLIC_URL: ${LITELLM_LENS_PUBLIC_URL:?set the Lens URL reachable from your browser and agents}
LITELLM_LENS_SERVICE_TOKEN: ${LITELLM_LENS_SERVICE_TOKEN:?set LITELLM_LENS_SERVICE_TOKEN}
LENS_GATEWAY_SECRET: ${LENS_GATEWAY_SECRET:?set the same signing secret on Lens and the gateway}
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
volumes:
- ./tracing-config.yaml:/app/tracing-config.yaml:ro
ports:
- "127.0.0.1:4002:4000"
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
environment:
POSTGRES_DB: litellm
POSTGRES_USER: litellm
POSTGRES_PASSWORD: litellm
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "127.0.0.1:15432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U litellm -d litellm"]
interval: 5s
timeout: 5s
retries: 10
volumes:
postgres_data:

View file

@ -1,11 +0,0 @@
model_list:
- model_name: gpt-6.1-sol
litellm_params:
model: openai/gpt-6.1-sol
api_key: os.environ/OPENAI_API_KEY
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
tracing:
store:
type: lens

View file

@ -79,8 +79,6 @@ GATEWAY_PATH_PREFIXES: tuple[str, ...] = (
"/v1/containers",
"/containers",
"/v1/evals",
"/v1/traces",
"/v1/logs",
"/v1/memory",
"/queue/chat/",
# Google data plane (v1beta is the Google AI Studio version)

View file

@ -255,9 +255,9 @@ it would need to update the `config.yaml` file which is a exposed ConfigMap, and
therefore, read-only. This is a limitation of this helm chart, not the Admin UI
itself.
## Connect Lens
## Removed Lens configuration
This chart does not deploy Lens. Deploy Lens from [its own chart](https://github.com/BerriAI/lens/tree/main/helm/lens), then set `lens.enabled: true`, `lens.url`, `lens.publicUrl`, `lens.gatewaySecret.name` and `lens.serviceTokenSecret.name`. The secret keys default to `gateway-secret` and `service-token`. Set `lens.service.name` when that Lens runs in this release's namespace and the chart ingress should route `/lens-ingest` to it. The old `lensWorker` values are no longer read, and enabling them fails the render
The external Lens integration has been removed. Existing `lens` and `lensWorker` values are ignored with a warning in the release notes. Remove these obsolete values when updating your configuration.
## Shutdown accounting

View file

@ -20,4 +20,8 @@
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
{{- end }}
PDB: {{ if .Values.pdb.enabled }}enabled{{ else }}disabled{{ end }}. Configure via .Values.pdb.*
PDB: {{ if .Values.pdb.enabled }}enabled{{ else }}disabled{{ end }}. Configure via .Values.pdb.*
{{- if or (hasKey .Values "lens") (hasKey .Values "lensWorker") }}
WARNING: The Lens integration has been removed. lens and lensWorker values are ignored. Remove these obsolete values.
{{- end }}

View file

@ -371,29 +371,3 @@ shutdown drain window.
value: {{ .drainTimeoutSeconds | quote }}
{{- end }}
{{- end -}}
{{- define "litellm.lensConnectionEnv" -}}
{{- with .Values.lensWorker }}
{{- if or .enabled (and .mode (ne .mode "disabled")) }}
{{- fail "lensWorker was removed; deploy Lens from its own chart and set lens.* instead, see the chart README" }}
{{- end }}
{{- end }}
{{- with .Values.lens }}
{{- if .enabled }}
- name: LITELLM_LENS_URL
value: {{ required "lens.url is required when lens.enabled is true" .url | quote }}
- name: LITELLM_LENS_PUBLIC_URL
value: {{ required "lens.publicUrl is required when lens.enabled is true" .publicUrl | quote }}
- name: LENS_GATEWAY_SECRET
valueFrom:
secretKeyRef:
name: {{ required "lens.gatewaySecret.name is required when lens.enabled is true" .gatewaySecret.name | quote }}
key: {{ .gatewaySecret.key | quote }}
- name: LITELLM_LENS_SERVICE_TOKEN
valueFrom:
secretKeyRef:
name: {{ required "lens.serviceTokenSecret.name is required when lens.enabled is true" .serviceTokenSecret.name | quote }}
key: {{ .serviceTokenSecret.key | quote }}
{{- end }}
{{- end }}
{{- end -}}

View file

@ -56,7 +56,6 @@ spec:
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
{{- include "litellm.lensConnectionEnv" . | nindent 12 }}
{{- include "litellm.proxyEnv" . | nindent 12 }}
{{- if .Values.liteadmin.enabled }}
- name: LITELLM_ADMIN_AGENT_URL

View file

@ -44,20 +44,6 @@ spec:
- host: {{ .host | quote }}
http:
paths:
{{- if and $.Values.lens.enabled $.Values.lens.service.name }}
- path: /lens-ingest
pathType: Prefix
backend:
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
service:
name: {{ $.Values.lens.service.name }}
port:
number: {{ $.Values.lens.service.port }}
{{- else }}
serviceName: {{ $.Values.lens.service.name }}
servicePort: {{ $.Values.lens.service.port }}
{{- end }}
{{- end }}
{{- range .paths }}
- path: {{ .path }}
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}

View file

@ -1,128 +1,35 @@
suite: lens connection
suite: retired Lens configuration
templates:
- deployment.yaml
- configmap-litellm.yaml
- ingress.yaml
tests:
- it: connects the proxy to an external Lens
- it: renders deployment.yaml with ignored lens.enabled and no Lens secret references
template: deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- contains:
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_URL
value: http://lens.lens.svc:4318
- contains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_PUBLIC_URL
value: https://lens.example.com/lens-ingest
- contains:
any: true
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LENS_GATEWAY_SECRET
valueFrom:
secretKeyRef:
name: lens-gateway
key: gateway-secret
- contains:
any: true
- it: renders deployment.yaml with ignored lensWorker.enabled and no Lens secret references
template: deployment.yaml
set:
lensWorker.enabled: true
asserts:
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_SERVICE_TOKEN
valueFrom:
secretKeyRef:
name: lens-service
key: service-token
- it: requires lens.url when Lens is enabled
template: deployment.yaml
set:
lens.enabled: true
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- failedTemplate:
errorMessage: lens.url is required when lens.enabled is true
- it: requires lens.publicUrl when Lens is enabled
template: deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- failedTemplate:
errorMessage: lens.publicUrl is required when lens.enabled is true
- it: requires lens.gatewaySecret.name when Lens is enabled
template: deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.serviceTokenSecret.name: lens-service
asserts:
- failedTemplate:
errorMessage: lens.gatewaySecret.name is required when lens.enabled is true
- it: requires lens.serviceTokenSecret.name when Lens is enabled
template: deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
asserts:
- failedTemplate:
errorMessage: lens.serviceTokenSecret.name is required when lens.enabled is true
- it: routes /lens-ingest to the named Lens service ahead of the host paths
template: ingress.yaml
set:
ingress.enabled: true
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
lens.service.name: existing-lens
asserts:
- equal:
path: spec.rules[0].http.paths[0].path
value: /lens-ingest
- contains:
path: spec.rules[0].http.paths
content:
path: /lens-ingest
pathType: Prefix
backend:
service:
name: existing-lens
port:
number: 4318
- it: leaves /lens-ingest off the ingress without a Lens service name
template: ingress.yaml
set:
ingress.enabled: true
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- exists:
path: spec.rules[0].http.paths
- notContains:
path: spec.rules[0].http.paths
content:
path: /lens-ingest
name: LITELLM_LENS_URL
any: true
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LENS_GATEWAY_SECRET
any: true

View file

@ -660,17 +660,3 @@ serviceMonitor:
namespaceSelector:
matchNames: []
# - test-namespace
lens:
enabled: false
url: ""
publicUrl: ""
service:
name: ""
port: 4318
gatewaySecret:
name: ""
key: gateway-secret
serviceTokenSecret:
name: ""
key: service-token

View file

@ -2,7 +2,7 @@
This chart deploys separate gateway, backend and UI services
This chart does not deploy Lens. Deploy Lens from [its own chart](https://github.com/BerriAI/lens/tree/main/helm/lens), then set `lens.enabled: true`, `lens.url`, `lens.publicUrl`, `lens.gatewaySecret.name` and `lens.serviceTokenSecret.name`. The secret keys default to `gateway-secret` and `service-token`. Set `lens.service.name` when that Lens runs in this release's namespace and the chart ingress should route `/lens-ingest` to it. The old `lensWorker` values are no longer read, and enabling them fails the render
The external Lens integration has been removed. Existing `lens` and `lensWorker` values are ignored with a warning in the release notes. Remove these obsolete values when updating your configuration.
For an ingress with separate component hostnames, set all three `ingress.componentHosts` values, leave `ingress.host` and `ingress.extraPaths` empty, configure `ui.backendUrl` as the backend's public origin and `backend.gatewayUrl` as the gateway's public origin, and set `ui.publicUrl` to the browser-facing UI origin. The UI Deployment receives `LITELLM_BACKEND_URL` from `ui.backendUrl` only when `ingress.componentHosts` is configured.

View file

@ -56,3 +56,7 @@ Reminders:
- {component}.topologySpreadConstraints (standard k8s list, e.g. spread replicas across
topology.kubernetes.io/zone)
- Enable ingress.enabled=true to dispatch / → ui, gateway data-plane prefixes → gateway, and the catch-all → backend.
{{- if or (hasKey .Values "lens") (hasKey .Values "lensWorker") }}
WARNING: The Lens integration has been removed. lens and lensWorker values are ignored. Remove these obsolete values.
{{- end }}

View file

@ -600,29 +600,3 @@ shutdown drain window.
value: {{ .drainTimeoutSeconds | quote }}
{{- end }}
{{- end -}}
{{- define "litellm.lensConnectionEnv" -}}
{{- with .Values.lensWorker }}
{{- if or .enabled (and .mode (ne .mode "disabled")) }}
{{- fail "lensWorker was removed; deploy Lens from its own chart and set lens.* instead, see the chart README" }}
{{- end }}
{{- end }}
{{- with .Values.lens }}
{{- if .enabled }}
- name: LITELLM_LENS_URL
value: {{ required "lens.url is required when lens.enabled is true" .url | quote }}
- name: LITELLM_LENS_PUBLIC_URL
value: {{ required "lens.publicUrl is required when lens.enabled is true" .publicUrl | quote }}
- name: LENS_GATEWAY_SECRET
valueFrom:
secretKeyRef:
name: {{ required "lens.gatewaySecret.name is required when lens.enabled is true" .gatewaySecret.name | quote }}
key: {{ .gatewaySecret.key | quote }}
- name: LITELLM_LENS_SERVICE_TOKEN
valueFrom:
secretKeyRef:
name: {{ required "lens.serviceTokenSecret.name is required when lens.enabled is true" .serviceTokenSecret.name | quote }}
key: {{ .serviceTokenSecret.key | quote }}
{{- end }}
{{- end }}
{{- end -}}

View file

@ -59,7 +59,6 @@ spec:
containerPort: 4001
protocol: TCP
env:
{{- include "litellm.lensConnectionEnv" . | nindent 12 }}
{{- if .Values.ui.publicUrl }}
- name: LITELLM_CORS_ORIGINS
value: {{ include "litellm.ui.publicOrigin" . | quote }}

View file

@ -55,7 +55,6 @@ spec:
containerPort: 4000
protocol: TCP
env:
{{- include "litellm.lensConnectionEnv" . | nindent 12 }}
{{- if .Values.ui.publicUrl }}
- name: LITELLM_CORS_ORIGINS
value: {{ include "litellm.ui.publicOrigin" . | quote }}

View file

@ -166,15 +166,6 @@ spec:
- host: {{ $componentHosts.gateway | quote }}
http:
paths:
{{- if and .Values.lens.enabled .Values.lens.service.name }}
- path: /lens-ingest
pathType: Prefix
backend:
service:
name: {{ .Values.lens.service.name }}
port:
number: {{ .Values.lens.service.port }}
{{- end }}
- path: /
pathType: Prefix
backend:
@ -249,16 +240,6 @@ spec:
port:
number: {{ $gatewayPort }}
{{- end }}
{{- if and .Values.lens.enabled .Values.lens.service.name }}
{{- $builtinPathKeys = append $builtinPathKeys "/lens-ingest|Prefix" }}
- path: /lens-ingest
pathType: Prefix
backend:
service:
name: {{ .Values.lens.service.name }}
port:
number: {{ .Values.lens.service.port }}
{{- end }}
{{- /*
--- Operator-supplied extra paths (ingress.extraPaths) ---
Rendered after every built-in path so an entry can never take

View file

@ -73,7 +73,7 @@ tests:
port:
number: 4000
- it: keeps Lens ingestion ahead of the gateway catch-all
- it: keeps the gateway catch-all when obsolete Lens values are supplied
set:
ingress.enabled: true
ingress.componentHosts.ui: ui.example.com
@ -91,13 +91,10 @@ tests:
asserts:
- equal:
path: spec.rules[2].http.paths[0].path
value: /lens-ingest
value: /
- equal:
path: spec.rules[2].http.paths[0].backend.service.name
value: existing-lens
- equal:
path: spec.rules[2].http.paths[1].path
value: /
value: RELEASE-NAME-litellm-gateway
template: ingress.yaml
- it: rejects a partial component host configuration

View file

@ -1,166 +1,68 @@
suite: lens connection
suite: retired Lens configuration
templates:
- gateway/deployment.yaml
- backend/deployment.yaml
- gateway/configmap.yaml
- ingress.yaml
values:
- ./values/required.yaml
tests:
- it: connects the gateway to an external Lens
- it: renders gateway/deployment.yaml with ignored lens.enabled and no Lens secret references
template: gateway/deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- contains:
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_URL
value: http://lens.lens.svc:4318
- contains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_PUBLIC_URL
value: https://lens.example.com/lens-ingest
- contains:
any: true
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LENS_GATEWAY_SECRET
valueFrom:
secretKeyRef:
name: lens-gateway
key: gateway-secret
- contains:
any: true
- it: renders gateway/deployment.yaml with ignored lensWorker.enabled and no Lens secret references
template: gateway/deployment.yaml
set:
lensWorker.enabled: true
asserts:
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_SERVICE_TOKEN
valueFrom:
secretKeyRef:
name: lens-service
key: service-token
- it: connects the backend to an external Lens
name: LITELLM_LENS_URL
any: true
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LENS_GATEWAY_SECRET
any: true
- it: renders backend/deployment.yaml with ignored lens.enabled and no Lens secret references
template: backend/deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- contains:
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_URL
value: http://lens.lens.svc:4318
- contains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_PUBLIC_URL
value: https://lens.example.com/lens-ingest
- contains:
any: true
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LENS_GATEWAY_SECRET
valueFrom:
secretKeyRef:
name: lens-gateway
key: gateway-secret
- contains:
any: true
- it: renders backend/deployment.yaml with ignored lensWorker.enabled and no Lens secret references
template: backend/deployment.yaml
set:
lensWorker.enabled: true
asserts:
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LITELLM_LENS_SERVICE_TOKEN
valueFrom:
secretKeyRef:
name: lens-service
key: service-token
- it: requires lens.url when Lens is enabled
template: gateway/deployment.yaml
set:
lens.enabled: true
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- failedTemplate:
errorMessage: lens.url is required when lens.enabled is true
- it: requires lens.publicUrl when Lens is enabled
template: gateway/deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- failedTemplate:
errorMessage: lens.publicUrl is required when lens.enabled is true
- it: requires lens.gatewaySecret.name when Lens is enabled
template: gateway/deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.serviceTokenSecret.name: lens-service
asserts:
- failedTemplate:
errorMessage: lens.gatewaySecret.name is required when lens.enabled is true
- it: requires lens.serviceTokenSecret.name when Lens is enabled
template: gateway/deployment.yaml
set:
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
asserts:
- failedTemplate:
errorMessage: lens.serviceTokenSecret.name is required when lens.enabled is true
- it: routes /lens-ingest to the named Lens service on the single ingress host
template: ingress.yaml
set:
ingress.enabled: true
ingress.host: litellm.example.com
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
lens.service.name: existing-lens
asserts:
- contains:
path: spec.rules[0].http.paths
content:
path: /lens-ingest
pathType: Prefix
backend:
service:
name: existing-lens
port:
number: 4318
- it: leaves /lens-ingest off the ingress without a Lens service name
template: ingress.yaml
set:
ingress.enabled: true
ingress.host: litellm.example.com
lens.enabled: true
lens.url: http://lens.lens.svc:4318
lens.publicUrl: https://lens.example.com/lens-ingest
lens.gatewaySecret.name: lens-gateway
lens.serviceTokenSecret.name: lens-service
asserts:
- exists:
path: spec.rules[0].http.paths
- notContains:
path: spec.rules[0].http.paths
content:
path: /lens-ingest
name: LITELLM_LENS_URL
any: true
- notContains:
path: spec.template.spec.containers[0].env
content:
name: LENS_GATEWAY_SECRET
any: true

View file

@ -643,17 +643,3 @@ ui:
affinity: {}
# Same shape as gateway.topologySpreadConstraints.
topologySpreadConstraints: []
lens:
enabled: false
url: ""
publicUrl: ""
service:
name: ""
port: 4318
gatewaySecret:
name: ""
key: gateway-secret
serviceTokenSecret:
name: ""
key: service-token

View file

@ -4422,7 +4422,6 @@ dependencies = [
"litellm-storage-clickhouse",
"litellm-token-counter",
"litellm-tracing",
"prost",
"pyo3",
"pyo3-async-runtimes",
"reqwest",

View file

@ -64,7 +64,6 @@ litellm-model-catalog-refresh.workspace = true
litellm-token-counter = { path = "../token-counter", default-features = false }
indexmap = "2.14.0"
pyo3 = { workspace = true, features = ["indexmap"] }
prost.workspace = true
pyo3-async-runtimes.workspace = true
reqwest.workspace = true
serde_json.workspace = true

View file

@ -89,8 +89,6 @@ mod _native {
use crate::routes::responses::{ResponsesWebSocketConnection, aresponses, responses};
#[pymodule_export]
use crate::routes::token_counter::TokenCounter;
#[pymodule_export]
use crate::routes::traces::trace_encode_error;
#[cfg(feature = "huggingface")]
#[pymodule_export]
use crate::tokenizer::HuggingFaceEncoding;
@ -171,7 +169,6 @@ mod tests {
"NativeClickHouseSpendConfig",
"NativeClickHouseSpendStorage",
"NativeDatabase",
"trace_encode_error",
"bundled_model_cost_map",
"NativeModelCostMap",
"NativeModelCostMapState",

View file

@ -7,7 +7,6 @@ pub(crate) mod messages;
pub(crate) mod ocr;
pub(crate) mod responses;
pub(crate) mod token_counter;
pub(crate) mod traces;
use litellm_callbacks_legacy_python::{LegacyLogging, LoggingOperation, PublicCall};
use litellm_host::{call::HostedCompletion, machine::Machine, protocol::Protocol};

View file

@ -1,33 +0,0 @@
use prost::Message;
use pyo3::{prelude::*, types::PyBytes};
#[derive(Message)]
struct OtlpErrorStatus {
#[prost(int32, tag = "1")]
code: i32,
#[prost(string, tag = "2")]
message: String,
}
#[pyfunction]
pub fn trace_encode_error<'py>(py: Python<'py>, message: &str) -> Bound<'py, PyBytes> {
let status = OtlpErrorStatus {
code: 0,
message: message.to_owned(),
};
PyBytes::new(py, &status.encode_to_vec())
}
#[cfg(test)]
mod tests {
use super::*;
#[rstest::rstest]
fn error_status_preserves_otlp_wire_contract() {
Python::initialize();
Python::attach(|py| {
let encoded = trace_encode_error(py, "invalid trace");
assert_eq!(encoded.as_bytes(), b"\x12\x0dinvalid trace");
});
}
}

View file

@ -103,19 +103,6 @@ CLICKHOUSE_MAX_BUFFERED_ROWS: Final = get_env_int("CLICKHOUSE_MAX_BUFFERED_ROWS"
CLICKHOUSE_MAX_RETRIES: Final = get_env_int("CLICKHOUSE_MAX_RETRIES", 3)
DEFAULT_CLICKHOUSE_DATABASE: Final = "litellm"
DEFAULT_AGENT_TRACING_RETENTION_DAYS: Final = 14
OTLP_MAX_BODY_BYTES: Final = get_env_int("OTLP_MAX_BODY_BYTES", 16 * 1024 * 1024)
OTLP_MAX_ATTRIBUTE_VALUE_BYTES: Final = get_env_int("OTLP_MAX_ATTRIBUTE_VALUE_BYTES", 64 * 1024)
OTLP_RETRY_AFTER_SECONDS: Final = get_env_int("OTLP_RETRY_AFTER_SECONDS", 2)
TRACE_READ_RETRY_AFTER_SECONDS: Final = get_env_int("TRACE_READ_RETRY_AFTER_SECONDS", 2)
OTLP_MAX_CONCURRENT_INGESTS: Final = get_env_int("OTLP_MAX_CONCURRENT_INGESTS", 2)
AGENT_TRACING_INPUT_PREVIEW_CHARS: Final = get_env_int("AGENT_TRACING_INPUT_PREVIEW_CHARS", 240)
AGENT_TRACING_LIST_PAGE_SIZE: Final = get_env_int("AGENT_TRACING_LIST_PAGE_SIZE", 50)
AGENT_TRACING_AGENT_LIST_LIMIT: Final = get_env_int("AGENT_TRACING_AGENT_LIST_LIMIT", 500)
LENS_DATASET_MAX_CASES: Final = get_env_int("LENS_DATASET_MAX_CASES", 200)
LENS_DATASET_MAX_CASE_CHARS: Final = get_env_int("LENS_DATASET_MAX_CASE_CHARS", 20_000)
LENS_DATASET_TRACE_PAGE_SIZE: Final = 500
LENS_FEEDBACK_MAX_COMMENT_CHARS: Final = 10_000
LENS_FEEDBACK_MAX_SCORE: Final = 10
DEFAULT_S3_FLUSH_INTERVAL_SECONDS: Final = get_env_int("DEFAULT_S3_FLUSH_INTERVAL_SECONDS", 10)
DEFAULT_S3_BATCH_SIZE: Final = get_env_int("DEFAULT_S3_BATCH_SIZE", 512)
DEFAULT_S3_MAX_CONCURRENT_UPLOADS: Final = get_env_int("DEFAULT_S3_MAX_CONCURRENT_UPLOADS", 16)

View file

@ -18,13 +18,12 @@ import litellm
from litellm._logging import verbose_logger
from litellm.constants import ROUTER_USAGE_COUNTED_TOKENS_METADATA_KEY, USAGE_BASED_ROUTING_COUNTED_TOKENS_METADATA_KEY
from litellm.integrations.clickhouse.clickhouse_batch_logger import ClickHouseBatchLogger
from litellm.integrations.clickhouse.context import is_lens_analysis
from litellm.integrations.clickhouse.schema import SPEND_LOGS_TABLE
from litellm.integrations.clickhouse.types import SpendLogPayload, SpendLogRecord
from litellm.litellm_core_utils.core_helpers import require_attributes
from litellm.litellm_core_utils.internal_call_metadata import logged_event_key
from litellm.litellm_core_utils.llm_response_utils.get_headers import get_provider_request_id
from litellm.litellm_core_utils.sensitive_data_masker import redact_credentials_in_payload
from litellm.tracing.types import SpendLogPayload, SpendLogRecord
from litellm.types.utils import StandardLoggingPayload
# litellm_logging.py rewrites cache-hit ids as f"{id}_cache_hit{time.time()}"
@ -34,7 +33,6 @@ _CACHE_HIT_SUFFIX: Final = re.compile(r"_cache_hit[0-9.]*$")
_TRACEPARENT: Final = re.compile(r"^[0-9a-f]{2}-([0-9a-f]{32})-([0-9a-f]{16})-[0-9a-f]{2}$")
_INVALID_TRACE_ID: Final = "0" * 32
_INVALID_SPAN_ID: Final = "0" * 16
TRACE_INGEST_ROUTE: Final = "/v1/traces"
_METADATA_MAPPING: Final = TypeAdapter(Mapping[str, object])
_METADATA_VALUE: Final = TypeAdapter(JsonValue)
_INTERNAL_METADATA_KEYS: Final = frozenset(
@ -146,11 +144,6 @@ def _session_id(payload: StandardLoggingPayload | SpendLogPayload, kwargs: Mappi
)
def _is_trace_ingest(payload: StandardLoggingPayload) -> bool:
"""OTLP exports to POST /v1/traces are not LLM requests; don't write them as spend rows."""
return str(payload.get("call_type") or "").startswith(TRACE_INGEST_ROUTE)
def spend_log_row_from_payload(
payload: StandardLoggingPayload | SpendLogPayload, kwargs: Mapping[str, object]
) -> SpendLogRecord:
@ -224,7 +217,6 @@ def spend_log_row_from_payload(
{
**request_metadata,
**metadata,
"litellm_lens_internal": is_lens_analysis(),
**({} if track_end_user else {"user_api_key_end_user_id": None}),
}
)
@ -246,7 +238,7 @@ class ClickHouseSpendLogger(ClickHouseBatchLogger):
def _log(self, kwargs: Mapping[str, Any]) -> None:
try:
payload = kwargs.get("standard_logging_object")
if payload is None or _is_trace_ingest(payload):
if payload is None:
return
row: Final = spend_log_row_from_payload(payload, kwargs)
self.enqueue([dict(row)])

View file

@ -1,19 +0,0 @@
from collections.abc import Iterator
from contextlib import contextmanager
from contextvars import ContextVar
from typing import Final
_lens_analysis: Final = ContextVar("litellm_lens_analysis", default=False)
def is_lens_analysis() -> bool:
return _lens_analysis.get()
@contextmanager
def lens_analysis() -> Iterator[None]:
token: Final = _lens_analysis.set(True)
try:
yield
finally:
_lens_analysis.reset(token)

View file

@ -1,29 +1,7 @@
from collections.abc import Mapping, Sequence
from datetime import datetime
from pydantic import ConfigDict, Field
from typing_extensions import NotRequired, ReadOnly, TypedDict
from litellm.types.llms.base import LiteLLMBaseModel
class TraceAgent(LiteLLMBaseModel):
"""One agent seen in the caller's traces, for picking which agent's runs to look at."""
model_config = ConfigDict(frozen=True)
name: str
runs: int = Field(ge=0)
failed_runs: int = Field(ge=0)
last_seen: datetime
frameworks: tuple[str, ...] = ()
class TraceAgentList(LiteLLMBaseModel):
model_config = ConfigDict(frozen=True)
agents: tuple[TraceAgent, ...]
class SpendLogPayload(TypedDict, total=False):
id: ReadOnly[str | None]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,71 +1,72 @@
1:"$Sreact.fragment"
2:"/litellm-asset-prefix/_next/static/chunks/0a-rekt06v0sv.js"
3:"/litellm-asset-prefix/_next/static/chunks/2_9r2jeem0dh8.js"
4:"/litellm-asset-prefix/_next/static/chunks/0tx19jeq-wskb.js"
5:I[363178,["$2","$3","$4"],"ThemeProvider"]
6:I[12985,["$2","$3","$4"],"NuqsAdapter"]
7:I[867271,["$2","$3","$4"],"default"]
8:"TerminologyProvider"
9:I[283634,["$2","$3","$4"],"$8"]
a:I[656682,["$2","$3","$4"],"default"]
b:I[557951,["$2","$3","$4"],"AuthProvider"]
c:I[339756,["$2","$3","$4"],"default"]
d:I[837457,["$2","$3","$4"],"default"]
e:I[713354,["$2","$3","$4"],"Toaster"]
18:"ViewportBoundary"
19:I[897367,["$2","$3","$4"],"$18"]
1a:"MetadataBoundary"
1b:I[897367,["$2","$3","$4"],"$1a"]
1c:"$Sreact.suspense"
1d:I[27201,["$2","$3","$4"],"IconMark"]
3:"/litellm-asset-prefix/_next/static/chunks/20gytc00-r-nc.js"
4:"/litellm-asset-prefix/_next/static/chunks/0odk-2n8vmmr0.js"
5:"/litellm-asset-prefix/_next/static/chunks/0xssmzze50-z3.js"
6:I[419159,["$2","$3","$4","$5"],"default"]
7:I[363178,["$2","$3","$4","$5"],"ThemeProvider"]
8:I[12985,["$2","$3","$4","$5"],"NuqsAdapter"]
9:I[867271,["$2","$3","$4","$5"],"default"]
a:"TerminologyProvider"
b:I[283634,["$2","$3","$4","$5"],"$a"]
c:I[656682,["$2","$3","$4","$5"],"default"]
d:I[557951,["$2","$3","$4","$5"],"AuthProvider"]
e:I[339756,["$2","$3","$4","$5"],"default"]
f:I[837457,["$2","$3","$4","$5"],"default"]
10:I[713354,["$2","$3","$4","$5"],"Toaster"]
1a:"ViewportBoundary"
1b:I[897367,["$2","$3","$4","$5"],"$1a"]
1c:"MetadataBoundary"
1d:I[897367,["$2","$3","$4","$5"],"$1c"]
1e:"$Sreact.suspense"
1f:I[27201,["$2","$3","$4","$5"],"IconMark"]
:HL["/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","style"]
:HL["/litellm-asset-prefix/_next/static/chunks/0598zsj78ni2h.css","style"]
10:X
15:[["children",{"s":"__PAGE__","h":160,"d":{"r":"$L16","p":"$@17","v":null,"s":"$10"}}]]
11:[["children",{"s":"(dashboard)","h":96,"d":{"r":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/3tb8tug0et-f3.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/1zju-fgvhby-r.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/32d1uqn-sef7-.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/138wymdv6q3wy.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/44oxggpk8fep6.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/3s77-_umb2pas.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/39_9engqoezqp.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/1-f3yvj3y6lg8.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/45b8usrooa1la.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/2kd01k7_ccb0k.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/2j7hjtph8n74b.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/1rq-bi4a8voir.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0g3hfgh2z8the.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/14v3irtjifjt2.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/2l8ss800ubmmh.js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/13d402rvlr6kh.js","async":true}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/3t9yzf1l2_xau.js","async":true}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/2hk8n3azev--d.js","async":true}],["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/3cziaul2j05he.js","async":true}],"$L12"],"$L13"]}],"p":"$@14","v":null,"s":"$10"},"c":"$Q15"}]]
0:{"t":{"t":{"s":"","h":80,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0598zsj78ni2h.css","precedence":"next"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0a-rekt06v0sv.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2_9r2jeem0dh8.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0tx19jeq-wskb.js","async":true}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"OU16Qa_className","children":["$","$L5",null,{"attribute":"class","defaultTheme":"light","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L6",null,{"children":["$","$L7",null,{"children":[["$","$L9",null,{"children":["$","$La",null,{"children":["$","$Lb",null,{"children":["$","$Lc",null,{"parallelRouterKey":"children","template":["$","$Ld",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}],["$","$Le",null,{}]]}]}]}]}]}]]}],"p":"$@f","v":null,"s":"$10"},"c":"$Q11"},"h":{"r":["$","$1","h",{"children":[null,["$","$L19",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","$L1b",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$1c",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"LiteLLM Dashboard"}],["$","meta","1",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.34m4ev7_7ennf.ico","sizes":"48x48","type":"image/x-icon"}],["$","link","3",{"rel":"icon","href":"/get_favicon"}],["$","$L1d","4",{}]]}]}],null]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"p":"$@1e","v":null,"s":"$10"}},"a":"$@1f","u":"$@20","b":"gyn32IHLXvPl9GksQaEMb"}
21:"ClientSegmentRoot"
22:I[92825,["$2","$3","$4"],"$21"]
23:"/litellm-asset-prefix/_next/static/chunks/3tb8tug0et-f3.js"
24:"/litellm-asset-prefix/_next/static/chunks/1zju-fgvhby-r.js"
25:"/litellm-asset-prefix/_next/static/chunks/32d1uqn-sef7-.js"
26:"/litellm-asset-prefix/_next/static/chunks/138wymdv6q3wy.js"
27:"/litellm-asset-prefix/_next/static/chunks/44oxggpk8fep6.js"
28:"/litellm-asset-prefix/_next/static/chunks/3s77-_umb2pas.js"
29:"/litellm-asset-prefix/_next/static/chunks/39_9engqoezqp.js"
2a:"/litellm-asset-prefix/_next/static/chunks/1-f3yvj3y6lg8.js"
2b:"/litellm-asset-prefix/_next/static/chunks/45b8usrooa1la.js"
2c:"/litellm-asset-prefix/_next/static/chunks/2kd01k7_ccb0k.js"
2d:"/litellm-asset-prefix/_next/static/chunks/2j7hjtph8n74b.js"
2e:"/litellm-asset-prefix/_next/static/chunks/1rq-bi4a8voir.js"
2f:"/litellm-asset-prefix/_next/static/chunks/0g3hfgh2z8the.js"
30:"/litellm-asset-prefix/_next/static/chunks/14v3irtjifjt2.js"
31:"/litellm-asset-prefix/_next/static/chunks/2l8ss800ubmmh.js"
32:"/litellm-asset-prefix/_next/static/chunks/13d402rvlr6kh.js"
33:"/litellm-asset-prefix/_next/static/chunks/3t9yzf1l2_xau.js"
34:"/litellm-asset-prefix/_next/static/chunks/2hk8n3azev--d.js"
35:"/litellm-asset-prefix/_next/static/chunks/3cziaul2j05he.js"
36:"/litellm-asset-prefix/_next/static/chunks/2aatum0yo4cv8.js"
37:I[216370,["$2","$3","$4","$23","$24","$25","$26","$27","$28","$29","$2a","$2b","$2c","$2d","$2e","$2f","$30","$31","$32","$33","$34","$35","$36"],"default"]
39:I[347257,["$2","$3","$4"],"ClientPageRoot"]
3a:"/litellm-asset-prefix/_next/static/chunks/1avj5q5vr8i-4.js"
3b:"/litellm-asset-prefix/_next/static/chunks/2aqdbosnh_sy6.js"
3c:"/litellm-asset-prefix/_next/static/chunks/441rbmhkm7c36.js"
3d:"/litellm-asset-prefix/_next/static/chunks/0jodjixl6-lwk.js"
3e:I[871135,["$2","$3","$4","$23","$24","$25","$26","$27","$28","$29","$2a","$2b","$2c","$2d","$2e","$2f","$30","$31","$32","$33","$34","$35","$36","$3a","$3b","$3c","$3d"],"default"]
41:I[897367,["$2","$3","$4"],"OutletBoundary"]
12:["$","script","script-19",{"src":"/litellm-asset-prefix/_next/static/chunks/2aatum0yo4cv8.js","async":true}]
13:["$","$L22",null,{"Component":"$37","slots":{"children":["$","$Lc",null,{"parallelRouterKey":"children","template":["$","$Ld",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],[]]}]},"serverProvidedParams":{"params":{},"promises":["$@38"]}}]
16:["$","$1","c",{"children":[["$","$L39",null,{"Component":"$3e","serverProvidedParams":{"searchParams":{},"params":"$13:props:serverProvidedParams:params","promises":["$@3f","$@40"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/1avj5q5vr8i-4.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2aqdbosnh_sy6.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/441rbmhkm7c36.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0jodjixl6-lwk.js","async":true}]],["$","$L41",null,{"children":["$","$1c",null,{"name":"Next.MetadataOutlet","children":"$@42"}]}]]}]
10:300
38:"$13:props:serverProvidedParams:params"
3f:{}
40:"$13:props:serverProvidedParams:params"
42:null
20:true
10:C
1f:0
f:"$undefined"
1e:"$undefined"
17:"$undefined"
14:"$undefined"
:HL["/litellm-asset-prefix/_next/static/chunks/0g9hpx7z1_gky.css","style"]
12:X
17:[["children",{"s":"__PAGE__","h":160,"d":{"r":"$L18","p":"$@19","v":null,"s":"$12"}}]]
13:[["children",{"s":"(dashboard)","h":96,"d":{"r":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/1-3c9947d6njv.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0lr5ruj6-e2ww.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/2_imjfv5zb543.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0gnds1p4rb0qo.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/2kd01k7_ccb0k.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/16g5dfld66mn4.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0qqzu3qo72-ns.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/2l0xftac9qa6c.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/0q_1elji3f400.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/2idw84r9_kv3a.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/21h-q5fvi7-vd.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/0c55iw8mjlbxy.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/2w1i-97y2i59q.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/20w5f9f7td446.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/43478tu767641.js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/180wxh286_rq1.js","async":true}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/2t0v_roupcydp.js","async":true}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/2my29smwg2z6_.js","async":true}],"$L14"],"$L15"]}],"p":"$@16","v":null,"s":"$12"},"c":"$Q17"}]]
0:{"t":{"t":{"s":"","h":80,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0g9hpx7z1_gky.css","precedence":"next"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0a-rekt06v0sv.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/20gytc00-r-nc.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0odk-2n8vmmr0.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0xssmzze50-z3.js","async":true}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"OU16Qa_className","children":["$","$L6",null,{"children":["$","$L7",null,{"attribute":"class","defaultTheme":"light","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L8",null,{"children":["$","$L9",null,{"children":[["$","$Lb",null,{"children":["$","$Lc",null,{"children":["$","$Ld",null,{"children":["$","$Le",null,{"parallelRouterKey":"children","template":["$","$Lf",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}],["$","$L10",null,{}]]}]}]}]}]}]}]]}],"p":"$@11","v":null,"s":"$12"},"c":"$Q13"},"h":{"r":["$","$1","h",{"children":[null,["$","$L1b",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","$L1d",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$1e",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"LiteLLM Dashboard"}],["$","meta","1",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.34m4ev7_7ennf.ico","sizes":"48x48","type":"image/x-icon"}],["$","link","3",{"rel":"icon","href":"/get_favicon"}],["$","$L1f","4",{}]]}]}],null]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"p":"$@20","v":null,"s":"$12"}},"a":"$@21","u":"$@22","b":"-EHFOBemiW1d6QWCiXe70"}
23:"ClientSegmentRoot"
24:I[92825,["$2","$3","$4","$5"],"$23"]
25:"/litellm-asset-prefix/_next/static/chunks/1-3c9947d6njv.js"
26:"/litellm-asset-prefix/_next/static/chunks/0lr5ruj6-e2ww.js"
27:"/litellm-asset-prefix/_next/static/chunks/2_imjfv5zb543.js"
28:"/litellm-asset-prefix/_next/static/chunks/0gnds1p4rb0qo.js"
29:"/litellm-asset-prefix/_next/static/chunks/2kd01k7_ccb0k.js"
2a:"/litellm-asset-prefix/_next/static/chunks/16g5dfld66mn4.js"
2b:"/litellm-asset-prefix/_next/static/chunks/0qqzu3qo72-ns.js"
2c:"/litellm-asset-prefix/_next/static/chunks/2l0xftac9qa6c.js"
2d:"/litellm-asset-prefix/_next/static/chunks/0q_1elji3f400.js"
2e:"/litellm-asset-prefix/_next/static/chunks/2idw84r9_kv3a.js"
2f:"/litellm-asset-prefix/_next/static/chunks/21h-q5fvi7-vd.js"
30:"/litellm-asset-prefix/_next/static/chunks/0c55iw8mjlbxy.js"
31:"/litellm-asset-prefix/_next/static/chunks/2w1i-97y2i59q.js"
32:"/litellm-asset-prefix/_next/static/chunks/20w5f9f7td446.js"
33:"/litellm-asset-prefix/_next/static/chunks/43478tu767641.js"
34:"/litellm-asset-prefix/_next/static/chunks/180wxh286_rq1.js"
35:"/litellm-asset-prefix/_next/static/chunks/2t0v_roupcydp.js"
36:"/litellm-asset-prefix/_next/static/chunks/2my29smwg2z6_.js"
37:"/litellm-asset-prefix/_next/static/chunks/0yzw3bayigs9e.js"
38:I[216370,["$2","$3","$4","$5","$25","$26","$27","$28","$29","$2a","$2b","$2c","$2d","$2e","$2f","$30","$31","$32","$33","$34","$35","$36","$37"],"default"]
3a:I[347257,["$2","$3","$4","$5"],"ClientPageRoot"]
3b:"/litellm-asset-prefix/_next/static/chunks/1ke00a5rdne40.js"
3c:"/litellm-asset-prefix/_next/static/chunks/2s0jha-2xmxk8.js"
3d:"/litellm-asset-prefix/_next/static/chunks/0rqs8-i3s7j26.js"
3e:"/litellm-asset-prefix/_next/static/chunks/2-r1vwbl6-44z.js"
3f:I[871135,["$2","$3","$4","$5","$25","$26","$27","$28","$29","$2a","$2b","$2c","$2d","$2e","$2f","$30","$31","$32","$33","$34","$35","$36","$37","$3b","$3c","$3d","$3e"],"default"]
42:I[897367,["$2","$3","$4","$5"],"OutletBoundary"]
14:["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/0yzw3bayigs9e.js","async":true}]
15:["$","$L24",null,{"Component":"$38","slots":{"children":["$","$Le",null,{"parallelRouterKey":"children","template":["$","$Lf",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],[]]}]},"serverProvidedParams":{"params":{},"promises":["$@39"]}}]
18:["$","$1","c",{"children":[["$","$L3a",null,{"Component":"$3f","serverProvidedParams":{"searchParams":{},"params":"$15:props:serverProvidedParams:params","promises":["$@40","$@41"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/1ke00a5rdne40.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2s0jha-2xmxk8.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0rqs8-i3s7j26.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/2-r1vwbl6-44z.js","async":true}]],["$","$L42",null,{"children":["$","$1e",null,{"name":"Next.MetadataOutlet","children":"$@43"}]}]]}]
12:300
39:"$15:props:serverProvidedParams:params"
40:{}
41:"$15:props:serverProvidedParams:params"
43:null
22:true
12:C
21:0
11:"$undefined"
20:"$undefined"
19:"$undefined"
16:"$undefined"

View file

@ -1,68 +1,70 @@
1:"$Sreact.fragment"
2:"/litellm-asset-prefix/_next/static/chunks/0a-rekt06v0sv.js"
3:"/litellm-asset-prefix/_next/static/chunks/2_9r2jeem0dh8.js"
4:"/litellm-asset-prefix/_next/static/chunks/0tx19jeq-wskb.js"
5:I[363178,["$2","$3","$4"],"ThemeProvider"]
6:I[12985,["$2","$3","$4"],"NuqsAdapter"]
7:I[867271,["$2","$3","$4"],"default"]
8:"TerminologyProvider"
9:I[283634,["$2","$3","$4"],"$8"]
a:I[656682,["$2","$3","$4"],"default"]
b:I[557951,["$2","$3","$4"],"AuthProvider"]
c:I[339756,["$2","$3","$4"],"default"]
d:I[837457,["$2","$3","$4"],"default"]
e:I[713354,["$2","$3","$4"],"Toaster"]
16:"ViewportBoundary"
17:I[897367,["$2","$3","$4"],"$16"]
19:"MetadataBoundary"
1a:I[897367,["$2","$3","$4"],"$19"]
1b:"$Sreact.suspense"
1d:I[168027,["$2","$3","$4"],"default",1]
3:"/litellm-asset-prefix/_next/static/chunks/20gytc00-r-nc.js"
4:"/litellm-asset-prefix/_next/static/chunks/0odk-2n8vmmr0.js"
5:"/litellm-asset-prefix/_next/static/chunks/0xssmzze50-z3.js"
6:I[419159,["$2","$3","$4","$5"],"default"]
7:I[363178,["$2","$3","$4","$5"],"ThemeProvider"]
8:I[12985,["$2","$3","$4","$5"],"NuqsAdapter"]
9:I[867271,["$2","$3","$4","$5"],"default"]
a:"TerminologyProvider"
b:I[283634,["$2","$3","$4","$5"],"$a"]
c:I[656682,["$2","$3","$4","$5"],"default"]
d:I[557951,["$2","$3","$4","$5"],"AuthProvider"]
e:I[339756,["$2","$3","$4","$5"],"default"]
f:I[837457,["$2","$3","$4","$5"],"default"]
10:I[713354,["$2","$3","$4","$5"],"Toaster"]
19:"ViewportBoundary"
1a:I[897367,["$2","$3","$4","$5"],"$19"]
1c:"MetadataBoundary"
1d:I[897367,["$2","$3","$4","$5"],"$1c"]
1e:"$Sreact.suspense"
20:I[168027,["$2","$3","$4","$5"],"default",1]
:HL["/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","style"]
:HL["/litellm-asset-prefix/_next/static/chunks/0598zsj78ni2h.css","style"]
:HL["/litellm-asset-prefix/_next/static/chunks/0g9hpx7z1_gky.css","style"]
:HL["/litellm-asset-prefix/_next/static/media/83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
14:[["children",{"s":"__PAGE__","h":512,"d":{"r":"$L15","p":false,"v":null}}]]
f:[["children",{"s":"(dashboard)","h":512,"d":{"r":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/3tb8tug0et-f3.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/1zju-fgvhby-r.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/32d1uqn-sef7-.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/138wymdv6q3wy.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/44oxggpk8fep6.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/3s77-_umb2pas.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/39_9engqoezqp.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/1-f3yvj3y6lg8.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/45b8usrooa1la.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/2kd01k7_ccb0k.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/2j7hjtph8n74b.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/1rq-bi4a8voir.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0g3hfgh2z8the.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/14v3irtjifjt2.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/2l8ss800ubmmh.js","async":true,"nonce":"$undefined"}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/13d402rvlr6kh.js","async":true,"nonce":"$undefined"}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/3t9yzf1l2_xau.js","async":true,"nonce":"$undefined"}],"$L10","$L11","$L12"],"$L13"]}],"p":false,"v":null},"c":"$Q14"}]]
0:{"P":null,"c":["",""],"q":"","i":false,"t":{"t":{"s":"","h":528,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0598zsj78ni2h.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0a-rekt06v0sv.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2_9r2jeem0dh8.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0tx19jeq-wskb.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"OU16Qa_className","children":["$","$L5",null,{"attribute":"class","defaultTheme":"light","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L6",null,{"children":["$","$L7",null,{"children":[["$","$L9",null,{"children":["$","$La",null,{"children":["$","$Lb",null,{"children":["$","$Lc",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$Ld",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}],["$","$Le",null,{}]]}]}]}]}]}]]}],"p":false,"v":null},"c":"$Qf"},"h":{"r":["$","$1","h",{"children":[null,["$","$L17",null,{"children":"$L18"}],["$","$L1a",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$1b",null,{"name":"Next.Metadata","children":"$L1c"}]}],null]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"p":false,"v":null}},"m":"$undefined","G":["$1d",[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0598zsj78ni2h.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"gyn32IHLXvPl9GksQaEMb"}
1e:"ClientSegmentRoot"
1f:I[92825,["$2","$3","$4"],"$1e"]
20:"/litellm-asset-prefix/_next/static/chunks/3tb8tug0et-f3.js"
21:"/litellm-asset-prefix/_next/static/chunks/1zju-fgvhby-r.js"
22:"/litellm-asset-prefix/_next/static/chunks/32d1uqn-sef7-.js"
23:"/litellm-asset-prefix/_next/static/chunks/138wymdv6q3wy.js"
24:"/litellm-asset-prefix/_next/static/chunks/44oxggpk8fep6.js"
25:"/litellm-asset-prefix/_next/static/chunks/3s77-_umb2pas.js"
26:"/litellm-asset-prefix/_next/static/chunks/39_9engqoezqp.js"
27:"/litellm-asset-prefix/_next/static/chunks/1-f3yvj3y6lg8.js"
28:"/litellm-asset-prefix/_next/static/chunks/45b8usrooa1la.js"
29:"/litellm-asset-prefix/_next/static/chunks/2kd01k7_ccb0k.js"
2a:"/litellm-asset-prefix/_next/static/chunks/2j7hjtph8n74b.js"
2b:"/litellm-asset-prefix/_next/static/chunks/1rq-bi4a8voir.js"
2c:"/litellm-asset-prefix/_next/static/chunks/0g3hfgh2z8the.js"
2d:"/litellm-asset-prefix/_next/static/chunks/14v3irtjifjt2.js"
2e:"/litellm-asset-prefix/_next/static/chunks/2l8ss800ubmmh.js"
2f:"/litellm-asset-prefix/_next/static/chunks/13d402rvlr6kh.js"
30:"/litellm-asset-prefix/_next/static/chunks/3t9yzf1l2_xau.js"
31:"/litellm-asset-prefix/_next/static/chunks/2hk8n3azev--d.js"
32:"/litellm-asset-prefix/_next/static/chunks/3cziaul2j05he.js"
33:"/litellm-asset-prefix/_next/static/chunks/2aatum0yo4cv8.js"
34:I[216370,["$2","$3","$4","$20","$21","$22","$23","$24","$25","$26","$27","$28","$29","$2a","$2b","$2c","$2d","$2e","$2f","$30","$31","$32","$33"],"default"]
36:I[347257,["$2","$3","$4"],"ClientPageRoot"]
37:"/litellm-asset-prefix/_next/static/chunks/1avj5q5vr8i-4.js"
38:"/litellm-asset-prefix/_next/static/chunks/2aqdbosnh_sy6.js"
39:"/litellm-asset-prefix/_next/static/chunks/441rbmhkm7c36.js"
3a:"/litellm-asset-prefix/_next/static/chunks/0jodjixl6-lwk.js"
3b:I[871135,["$2","$3","$4","$20","$21","$22","$23","$24","$25","$26","$27","$28","$29","$2a","$2b","$2c","$2d","$2e","$2f","$30","$31","$32","$33","$37","$38","$39","$3a"],"default"]
3e:I[897367,["$2","$3","$4"],"OutletBoundary"]
10:["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/2hk8n3azev--d.js","async":true,"nonce":"$undefined"}]
11:["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/3cziaul2j05he.js","async":true,"nonce":"$undefined"}]
12:["$","script","script-19",{"src":"/litellm-asset-prefix/_next/static/chunks/2aatum0yo4cv8.js","async":true,"nonce":"$undefined"}]
13:["$","$L1f",null,{"Component":"$34","slots":{"children":["$","$Lc",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$Ld",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]},"serverProvidedParams":{"params":{},"promises":["$@35"]}}]
15:["$","$1","c",{"children":[["$","$L36",null,{"Component":"$3b","serverProvidedParams":{"searchParams":{},"params":"$13:props:serverProvidedParams:params","promises":["$@3c","$@3d"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/1avj5q5vr8i-4.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2aqdbosnh_sy6.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/441rbmhkm7c36.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0jodjixl6-lwk.js","async":true,"nonce":"$undefined"}]],["$","$L3e",null,{"children":["$","$1b",null,{"name":"Next.MetadataOutlet","children":"$@3f"}]}]]}]
35:"$13:props:serverProvidedParams:params"
3c:{}
3d:"$13:props:serverProvidedParams:params"
18:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
40:I[27201,["$2","$3","$4"],"IconMark"]
1c:[["$","title","0",{"children":"LiteLLM Dashboard"}],["$","meta","1",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.34m4ev7_7ennf.ico","sizes":"48x48","type":"image/x-icon"}],["$","link","3",{"rel":"icon","href":"/get_favicon"}],["$","$L40","4",{}]]
3f:null
17:[["children",{"s":"__PAGE__","h":512,"d":{"r":"$L18","p":false,"v":null}}]]
11:[["children",{"s":"(dashboard)","h":512,"d":{"r":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/1-3c9947d6njv.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0lr5ruj6-e2ww.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/2_imjfv5zb543.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0gnds1p4rb0qo.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/2kd01k7_ccb0k.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/16g5dfld66mn4.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0qqzu3qo72-ns.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/2l0xftac9qa6c.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/0q_1elji3f400.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/2idw84r9_kv3a.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/21h-q5fvi7-vd.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/0c55iw8mjlbxy.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/2w1i-97y2i59q.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/20w5f9f7td446.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/43478tu767641.js","async":true,"nonce":"$undefined"}],"$L12","$L13","$L14","$L15"],"$L16"]}],"p":false,"v":null},"c":"$Q17"}]]
0:{"P":null,"c":["",""],"q":"","i":false,"t":{"t":{"s":"","h":528,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0g9hpx7z1_gky.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0a-rekt06v0sv.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/20gytc00-r-nc.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0odk-2n8vmmr0.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0xssmzze50-z3.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"OU16Qa_className","children":["$","$L6",null,{"children":["$","$L7",null,{"attribute":"class","defaultTheme":"light","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L8",null,{"children":["$","$L9",null,{"children":[["$","$Lb",null,{"children":["$","$Lc",null,{"children":["$","$Ld",null,{"children":["$","$Le",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$Lf",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}],["$","$L10",null,{}]]}]}]}]}]}]}]]}],"p":false,"v":null},"c":"$Q11"},"h":{"r":["$","$1","h",{"children":[null,["$","$L1a",null,{"children":"$L1b"}],["$","$L1d",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$1e",null,{"name":"Next.Metadata","children":"$L1f"}]}],null]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"p":false,"v":null}},"m":"$undefined","G":["$20",[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0g9hpx7z1_gky.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"-EHFOBemiW1d6QWCiXe70"}
21:"ClientSegmentRoot"
22:I[92825,["$2","$3","$4","$5"],"$21"]
23:"/litellm-asset-prefix/_next/static/chunks/1-3c9947d6njv.js"
24:"/litellm-asset-prefix/_next/static/chunks/0lr5ruj6-e2ww.js"
25:"/litellm-asset-prefix/_next/static/chunks/2_imjfv5zb543.js"
26:"/litellm-asset-prefix/_next/static/chunks/0gnds1p4rb0qo.js"
27:"/litellm-asset-prefix/_next/static/chunks/2kd01k7_ccb0k.js"
28:"/litellm-asset-prefix/_next/static/chunks/16g5dfld66mn4.js"
29:"/litellm-asset-prefix/_next/static/chunks/0qqzu3qo72-ns.js"
2a:"/litellm-asset-prefix/_next/static/chunks/2l0xftac9qa6c.js"
2b:"/litellm-asset-prefix/_next/static/chunks/0q_1elji3f400.js"
2c:"/litellm-asset-prefix/_next/static/chunks/2idw84r9_kv3a.js"
2d:"/litellm-asset-prefix/_next/static/chunks/21h-q5fvi7-vd.js"
2e:"/litellm-asset-prefix/_next/static/chunks/0c55iw8mjlbxy.js"
2f:"/litellm-asset-prefix/_next/static/chunks/2w1i-97y2i59q.js"
30:"/litellm-asset-prefix/_next/static/chunks/20w5f9f7td446.js"
31:"/litellm-asset-prefix/_next/static/chunks/43478tu767641.js"
32:"/litellm-asset-prefix/_next/static/chunks/180wxh286_rq1.js"
33:"/litellm-asset-prefix/_next/static/chunks/2t0v_roupcydp.js"
34:"/litellm-asset-prefix/_next/static/chunks/2my29smwg2z6_.js"
35:"/litellm-asset-prefix/_next/static/chunks/0yzw3bayigs9e.js"
36:I[216370,["$2","$3","$4","$5","$23","$24","$25","$26","$27","$28","$29","$2a","$2b","$2c","$2d","$2e","$2f","$30","$31","$32","$33","$34","$35"],"default"]
38:I[347257,["$2","$3","$4","$5"],"ClientPageRoot"]
39:"/litellm-asset-prefix/_next/static/chunks/1ke00a5rdne40.js"
3a:"/litellm-asset-prefix/_next/static/chunks/2s0jha-2xmxk8.js"
3b:"/litellm-asset-prefix/_next/static/chunks/0rqs8-i3s7j26.js"
3c:"/litellm-asset-prefix/_next/static/chunks/2-r1vwbl6-44z.js"
3d:I[871135,["$2","$3","$4","$5","$23","$24","$25","$26","$27","$28","$29","$2a","$2b","$2c","$2d","$2e","$2f","$30","$31","$32","$33","$34","$35","$39","$3a","$3b","$3c"],"default"]
40:I[897367,["$2","$3","$4","$5"],"OutletBoundary"]
12:["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/180wxh286_rq1.js","async":true,"nonce":"$undefined"}]
13:["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/2t0v_roupcydp.js","async":true,"nonce":"$undefined"}]
14:["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/2my29smwg2z6_.js","async":true,"nonce":"$undefined"}]
15:["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/0yzw3bayigs9e.js","async":true,"nonce":"$undefined"}]
16:["$","$L22",null,{"Component":"$36","slots":{"children":["$","$Le",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$Lf",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:children:props:children:props:children:0:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]},"serverProvidedParams":{"params":{},"promises":["$@37"]}}]
18:["$","$1","c",{"children":[["$","$L38",null,{"Component":"$3d","serverProvidedParams":{"searchParams":{},"params":"$16:props:serverProvidedParams:params","promises":["$@3e","$@3f"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/1ke00a5rdne40.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2s0jha-2xmxk8.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0rqs8-i3s7j26.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/2-r1vwbl6-44z.js","async":true,"nonce":"$undefined"}]],["$","$L40",null,{"children":["$","$1e",null,{"name":"Next.MetadataOutlet","children":"$@41"}]}]]}]
37:"$16:props:serverProvidedParams:params"
3e:{}
3f:"$16:props:serverProvidedParams:params"
1b:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
42:I[27201,["$2","$3","$4","$5"],"IconMark"]
1f:[["$","title","0",{"children":"LiteLLM Dashboard"}],["$","meta","1",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.34m4ev7_7ennf.ico","sizes":"48x48","type":"image/x-icon"}],["$","link","3",{"rel":"icon","href":"/get_favicon"}],["$","$L42","4",{}]]
41:null

View file

@ -1,6 +1,6 @@
:HL["/litellm-asset-prefix/_next/static/chunks/1bnh8r0-prf7e.css","style"]
:HL["/litellm-asset-prefix/_next/static/chunks/0598zsj78ni2h.css","style"]
:HL["/litellm-asset-prefix/_next/static/chunks/0g9hpx7z1_gky.css","style"]
:HL["/litellm-asset-prefix/_next/static/media/83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
2:[["children",{"s":"__PAGE__","h":160}]]
1:[["children",{"s":"(dashboard)","h":96,"c":"$Q2"}]]
0:{"b":"gyn32IHLXvPl9GksQaEMb","t":{"t":{"s":"","h":80,"c":"$Q1"}}}
0:{"b":"-EHFOBemiW1d6QWCiXe70","t":{"t":{"s":"","h":80,"c":"$Q1"}}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,35440,e=>{"use strict";var a=e.i(843476),t=e.i(405033),s=e.i(271645),l=e.i(217923),d=e.i(266027),r=e.i(322831),i=e.i(602869),n=e.i(519455),o=e.i(302747);function u(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toLocaleString()}function c({data:e,maxVal:t}){let s=Math.max(2,Math.floor(200/Math.max(e.length,1)));return(0,a.jsx)("div",{className:"flex items-end gap-px",style:{height:48},children:e.map((e,l)=>{let d=t>0?Math.max(2,e/t*48):2;return(0,a.jsx)("div",{className:"bg-primary rounded-[1px]",style:{width:s,height:d,opacity:.7+e/Math.max(t,1)*.3}},l)})})}let m=[{value:"7d",label:"7d"},{value:"30d",label:"30d"},{value:"90d",label:"90d"}],x=({accessToken:e,userId:t})=>{let x,h,{t:g}=(0,r.f)(),[p,b]=(0,s.useState)("30d"),{start:v,end:f}=(x=new Date,(h=new Date).setDate(x.getDate()-("7d"===p?7:"30d"===p?30:90)),{start:h,end:x}),{data:j,isLoading:N}=(0,d.f)({queryKey:["chat-user-usage",e,t,p],queryFn:()=>(0,i.sg)("user",{accessToken:e,startTime:v,endTime:f,entityIds:t?[t]:null}),enabled:!!e}),_=j?.metadata,y=j?.results??[],P=y.map(e=>e.metrics.spend),q=y.map(e=>e.metrics.api_requests),w=Math.max(...P,0),k=Math.max(...q,0),M=_?[{label:g("chat.usagePanel.totalSpend"),value:`$${_.total_spend.toFixed(2)}`},{label:g("chat.usagePanel.apiRequests"),value:u(_.total_api_requests)},{label:g("chat.usagePanel.tokensUsed"),value:u(_.total_tokens),sub:g("chat.usagePanel.tokenSplit",{prompt:u(_.total_prompt_tokens),completion:u(_.total_completion_tokens)})},{label:g("chat.usagePanel.successRate"),value:_.total_api_requests>0?`${(_.total_successful_requests/_.total_api_requests*100).toFixed(1)}%`:g("chat.usagePanel.notApplicable"),sub:_.total_failed_requests>0?g("chat.usagePanel.failedCount",{failed:_.total_failed_requests}):void 0,subVariant:_.total_failed_requests>0?"error":void 0}]:[];return(0,a.jsxs)("div",{className:"w-full",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-base font-semibold text-foreground mb-0.5",children:g("chat.usagePanel.title")}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground m-0",children:g("chat.usagePanel.subtitle")})]}),(0,a.jsx)("div",{className:"flex gap-1",children:m.map(e=>(0,a.jsx)(n.K,{variant:p===e.value?"default":"outline",size:"sm",onClick:()=>b(e.value),children:e.label},e.value))})]}),N?(0,a.jsx)("div",{className:"grid grid-cols-2 gap-3",children:[void 0,void 0,void 0,void 0].map((e,t)=>(0,a.jsxs)("div",{className:"border rounded-lg p-4 bg-card flex flex-col gap-2",children:[(0,a.jsx)(o.f,{className:"h-3 w-1/2"}),(0,a.jsx)(o.f,{className:"h-5 w-2/3"})]},t))}):_&&0!==_.total_api_requests?(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"grid grid-cols-2 gap-3 mb-5",children:M.map(e=>(0,a.jsxs)("div",{className:"border rounded-lg p-4 bg-card",children:[(0,a.jsx)("div",{className:"text-xs text-muted-foreground mb-1",children:e.label}),(0,a.jsx)("div",{className:"text-xl font-semibold text-foreground",children:e.value}),e.sub&&(0,a.jsx)("div",{className:`text-xs mt-0.5 ${"error"===e.subVariant?"text-destructive":"text-muted-foreground"}`,children:e.sub})]},e.label))}),y.length>1&&(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsxs)("div",{className:"border rounded-lg p-4 bg-card",children:[(0,a.jsx)("div",{className:"text-xs text-muted-foreground mb-2",children:g("chat.usagePanel.dailySpend")}),(0,a.jsx)(c,{data:P,maxVal:w})]}),(0,a.jsxs)("div",{className:"border rounded-lg p-4 bg-card",children:[(0,a.jsx)("div",{className:"text-xs text-muted-foreground mb-2",children:g("chat.usagePanel.dailyRequests")}),(0,a.jsx)(c,{data:q,maxVal:k})]})]})]}):(0,a.jsxs)("div",{className:"text-center text-muted-foreground text-sm py-12 border border-dashed rounded-lg",children:[(0,a.jsx)(l.f,{className:"h-6 w-6 mb-3 mx-auto text-muted-foreground/50"}),g("chat.usagePanel.empty")]})]})};e.s(["default",0,function(){let{accessToken:e,userId:s}=(0,t.k)();return(0,a.jsx)("div",{className:"flex-1 min-h-0 overflow-auto w-full py-8 px-8",children:(0,a.jsx)(x,{accessToken:e,userId:s})})}],35440)}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
(()=>{"use strict";(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,35440,e=>{var s=e.i(843476),t=e.i(405033),a=e.i(271645),l=e.i(217923),d=e.i(266027),r=e.i(602869),i=e.i(519455),o=e.i(302747);function n(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toLocaleString()}function u({data:e,maxVal:t}){let a=Math.max(2,Math.floor(200/Math.max(e.length,1)));return(0,s.jsx)("div",{className:"flex items-end gap-px",style:{height:48},children:e.map((e,l)=>{let d=t>0?Math.max(2,e/t*48):2;return(0,s.jsx)("div",{className:"bg-primary rounded-[1px]",style:{width:a,height:d,opacity:.7+e/Math.max(t,1)*.3}},l)})})}let c=[{value:"7d",label:"7d"},{value:"30d",label:"30d"},{value:"90d",label:"90d"}],m=({accessToken:e,userId:t})=>{let m,x,[h,v]=(0,a.useState)("30d"),{start:b,end:g}=(m=new Date,(x=new Date).setDate(m.getDate()-("7d"===h?7:"30d"===h?30:90)),{start:x,end:m}),{data:p,isLoading:f}=(0,d.f)({queryKey:["chat-user-usage",e,t,h],queryFn:()=>(0,r.sh)("user",{accessToken:e,startTime:b,endTime:g,entityIds:t?[t]:null}),enabled:!!e}),j=p?.metadata,N=p?.results??[],_=N.map(e=>e.metrics.spend),y=N.map(e=>e.metrics.api_requests),q=Math.max(..._,0),w=Math.max(...y,0),T=j?[{label:"Total Spend",value:`$${j.total_spend.toFixed(2)}`},{label:"API Requests",value:n(j.total_api_requests)},{label:"Tokens Used",value:n(j.total_tokens),sub:`${n(j.total_prompt_tokens)} in / ${n(j.total_completion_tokens)} out`},{label:"Success Rate",value:j.total_api_requests>0?`${(j.total_successful_requests/j.total_api_requests*100).toFixed(1)}%`:"N/A",sub:j.total_failed_requests>0?`${j.total_failed_requests} failed`:void 0,subVariant:j.total_failed_requests>0?"error":void 0}]:[];return(0,s.jsxs)("div",{className:"w-full",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-base font-semibold text-foreground mb-0.5",children:"Your Usage"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground m-0",children:"Spend and request activity"})]}),(0,s.jsx)("div",{className:"flex gap-1",children:c.map(e=>(0,s.jsx)(i.K,{variant:h===e.value?"default":"outline",size:"sm",onClick:()=>v(e.value),children:e.label},e.value))})]}),f?(0,s.jsx)("div",{className:"grid grid-cols-2 gap-3",children:[void 0,void 0,void 0,void 0].map((e,t)=>(0,s.jsxs)("div",{className:"border rounded-lg p-4 bg-card flex flex-col gap-2",children:[(0,s.jsx)(o.f,{className:"h-3 w-1/2"}),(0,s.jsx)(o.f,{className:"h-5 w-2/3"})]},t))}):j&&0!==j.total_api_requests?(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"grid grid-cols-2 gap-3 mb-5",children:T.map(e=>(0,s.jsxs)("div",{className:"border rounded-lg p-4 bg-card",children:[(0,s.jsx)("div",{className:"text-xs text-muted-foreground mb-1",children:e.label}),(0,s.jsx)("div",{className:"text-xl font-semibold text-foreground",children:e.value}),e.sub&&(0,s.jsx)("div",{className:`text-xs mt-0.5 ${"error"===e.subVariant?"text-destructive":"text-muted-foreground"}`,children:e.sub})]},e.label))}),N.length>1&&(0,s.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,s.jsxs)("div",{className:"border rounded-lg p-4 bg-card",children:[(0,s.jsx)("div",{className:"text-xs text-muted-foreground mb-2",children:"Daily Spend"}),(0,s.jsx)(u,{data:_,maxVal:q})]}),(0,s.jsxs)("div",{className:"border rounded-lg p-4 bg-card",children:[(0,s.jsx)("div",{className:"text-xs text-muted-foreground mb-2",children:"Daily Requests"}),(0,s.jsx)(u,{data:y,maxVal:w})]})]})]}):(0,s.jsxs)("div",{className:"text-center text-muted-foreground text-sm py-12 border border-dashed rounded-lg",children:[(0,s.jsx)(l.f,{className:"h-6 w-6 mb-3 mx-auto text-muted-foreground/50"}),"No usage data for this period"]})]})};e.s(["default",0,function(){let{accessToken:e,userId:a}=(0,t.k)();return(0,s.jsx)("div",{className:"flex-1 min-h-0 overflow-auto w-full py-8 px-8",children:(0,s.jsx)(m,{accessToken:e,userId:a})})}],35440)},302747,e=>{var s=e.i(843476),t=e.i(196631);e.s(["f",0,function({className:e,...a}){return(0,s.jsx)("div",{"data-slot":"skeleton",className:(0,t.c)("animate-pulse rounded-md bg-muted",e),...a})}])}])})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more