mirror of
https://github.com/BerriAI/litellm.git
synced 2026-11-13 08:52:02 +00:00
refactor: remove standalone Lens integration
This commit is contained in:
parent
433163a8e2
commit
569a794de1
901 changed files with 15190 additions and 72753 deletions
3
.github/workflows/image-scan.yml
vendored
3
.github/workflows/image-scan.yml
vendored
|
|
@ -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 }} .
|
||||
|
|
|
|||
12
.github/workflows/test-rust.yml
vendored
12
.github/workflows/test-rust.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
11
.github/workflows/test-unit.yml
vendored
11
.github/workflows/test-unit.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
|
|
|
|||
|
|
@ -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 -}}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) }}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
|
|
|
|||
|
|
@ -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 -}}
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
1
litellm-rust/Cargo.lock
generated
1
litellm-rust/Cargo.lock
generated
|
|
@ -4422,7 +4422,6 @@ dependencies = [
|
|||
"litellm-storage-clickhouse",
|
||||
"litellm-token-counter",
|
||||
"litellm-tracing",
|
||||
"prost",
|
||||
"pyo3",
|
||||
"pyo3-async-runtimes",
|
||||
"reqwest",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)])
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
|
@ -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
Loading…
Add table
Reference in a new issue