diff --git a/LITELLM-KEY-DISTRIBUTION.md b/LITELLM-KEY-DISTRIBUTION.md new file mode 100644 index 0000000..5d6812a --- /dev/null +++ b/LITELLM-KEY-DISTRIBUTION.md @@ -0,0 +1,56 @@ +# LiteLLM Virtual Key Distribution — Phase 2 Cutover +## Syslog Solution LLC — July 1, 2026 (keys regenerated) + +### Active Agent Keys (Update agent configs with these) + +| Agent | LiteLLM Virtual Key | Tier | Budget | Models | Verified | +|-------|-------------------|------|--------|--------|----------| +| **Abiba** | `sk-i7F7rCfgpS0oouOTA2LgMw` | enterprise | $1,000 | All 4 | ✅ Jul 1 | +| **Mumuni** | `sk-XY2aUfvy2BIs6kp1ZPh6VA` | enterprise | $1,000 | All 4 | ✅ Jul 1 | +| **Tanko** | `sk-3ZsdWJbbNSo9zSnJN2OsJw` | enterprise | $1,000 | All 4 | ✅ Jul 1 | +| **Kagenz0** | `sk-VYKRAVYEG1rKVEMDKEUggg` | enterprise | $1,000 | All 4 | ✅ Jul 1 | +| **Koby** | `sk-gWDaPAp-FavgKdqKJpzqhQ` | professional | $500 | All 4 | ✅ Jul 1 | +| **Koonimo** | `sk-1kLC8ZxW-tEZueV3NU4rCQ` | professional | $500 | All 4 | ✅ Jul 1 | + +### Configuration Changes Required Per Agent + +Each agent must update their `OPENAI_API_BASE` and `OPENAI_API_KEY`: + +``` +OPENAI_API_BASE=http://192.168.68.116/v1 +OPENAI_API_KEY= +``` + +### LiteLLM Admin Access + +| Resource | Key | +|----------|-----| +| LiteLLM Admin UI | http://192.168.68.116/ui/ (Authentik SSO — pending) | +| LiteLLM Master Key | `sk-litellm-7f96080dd99b15c36bd4b333b58a6796` | +| Router Admin Key | `sk-admin-ee09fffd04978b61a1569ac670c68814` | + +### Fallback (if LiteLLM fails) + +If LiteLLM is down, NGINX automatically falls back to the router on :9000. +In that case, agents can also directly use: +``` +OPENAI_API_BASE=http://192.168.68.116/v1 +OPENAI_API_KEY= +``` +(Only works when NGINX @router_fallback is active) + +### Deprecated Router Keys + +These keys still work through the @router_fallback but NOT through LiteLLM: +- sk-syslog-abiba, sk-syslog-mumuni, sk-syslog-tanko +- sk-syslog-kagenz0, sk-syslog-koby, sk-syslog-koonimo +- sk-starter-abc123, sk-professional-xyz789 +- sk-syslog-local-master-key + +These have been fully revoked as of July 1, 2026. + +### Key Rotation History + +- **2026-07-01**: Keys regenerated for Abiba, Kagenz0, Koby, Koonimo (old values unrecoverable). + Mumuni and Tanko keys confirmed working, left unchanged. All blocked/stale keys purged. +- **2026-06-17**: Initial key creation (values in this doc were placeholder/incorrect). diff --git a/dashboard/gpu-monitor.html b/dashboard/gpu-monitor.html deleted file mode 100644 index 80f32fe..0000000 --- a/dashboard/gpu-monitor.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -Syslog GPU Monitor - - - -

⚡ Syslog GPU Monitor

-

Real-time GPU health — loading...

- -
-
-
GPUs Online
-
-
Active Requests
-
-
Circuit Trips
-
-
Slots Used
-
- -
- -
Syslog Solution LLC — Auto-refreshes every 5s ·
- - - - diff --git a/docker-compose.yml b/docker-compose.yml index 96278eb..2add58e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: "3.8" +version: '3.8' services: redis: @@ -16,37 +16,18 @@ services: timeout: 3s retries: 5 - postgres: - image: postgres:16-alpine - container_name: harness-postgres - restart: unless-stopped - ports: - - "127.0.0.1:5432:5432" - environment: - - POSTGRES_DB=litellm - - POSTGRES_USER=litellm - - POSTGRES_PASSWORD=d9fc143e3dc1a7a8e672c359fea95c5e - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U litellm"] - interval: 5s - timeout: 3s - retries: 5 - router: build: ./router container_name: harness-router restart: unless-stopped - ports: - - "127.0.0.1:9000:9000" + network_mode: host environment: - - REDIS_URL=redis://redis:6379 + - REDIS_URL=redis://127.0.0.1:6379 - GPU_MOE_URL=http://192.168.68.15:8080/v1 - GPU_DENSE_URL=http://192.168.68.8:8080/v1 - GPU_LIGHT_URL=http://192.168.68.110:8080/v1 - - API_KEYS={"sk-syslog-local-master-key":{"tier":"enterprise","agent":"admin","deprecated":true},"sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64":{"tier":"enterprise","agent":"admin"},"sk-syslog-abiba":{"tier":"enterprise","agent":"Abiba","deprecated":true},"sk-856ffb0bbb-e5aaf78b10054eca608f8fbcbd73a889":{"tier":"enterprise","agent":"Abiba"},"sk-syslog-mumuni":{"tier":"enterprise","agent":"Mumuni","deprecated":true},"sk-b57e6e042e-47573660114f3138c852c47f62da807e":{"tier":"enterprise","agent":"Mumuni"},"sk-syslog-tanko":{"tier":"enterprise","agent":"Tanko","deprecated":true},"sk-620a05e95a-e93d875476b650a4d1137249ead8eaa7":{"tier":"enterprise","agent":"Tanko"},"sk-syslog-koby":{"tier":"enterprise","agent":"Koby","deprecated":true},"sk-eb3e6fc1c0-de1bf2edf35a53cb3749a2400483fdee":{"tier":"enterprise","agent":"Koby"},"sk-syslog-kagenz0":{"tier":"enterprise","agent":"Kagenz0","deprecated":true},"sk-12b66b3392-b548aed9138aeb6f698e8e521650ed9b":{"tier":"enterprise","agent":"Kagenz0"},"sk-syslog-koonimo":{"tier":"enterprise","agent":"Koonimo","deprecated":true},"sk-680d06686c-00ee8bf9dc3c93b276af122d49a14dfe":{"tier":"enterprise","agent":"Koonimo"},"sk-starter-abc123":{"tier":"starter","agent":"test-starter","deprecated":true},"sk-55da55907a-1bd7ff344e26feda50e9ac2219697860":{"tier":"starter","agent":"test-starter"},"sk-professional-xyz789":{"tier":"professional","agent":"test-pro","deprecated":true},"sk-b5159863e6-8df3ae52fb958cfe76cc2888c8c8e676":{"tier":"professional","agent":"test-pro"}} - - ADMIN_KEY=sk-admin-ee09fffd04978b61a1569ac670c68814 + - API_KEYS={"sk-sys...-key":{"tier":"enterprise","agent":"admin","deprecated":true},"sk-9e6...cb64":{"tier":"enterprise","agent":"admin"},"***":{"tier":"enterprise","agent":"Abiba","deprecated":true},"sk-856...a889":{"tier":"enterprise","agent":"Abiba"},"***":{"tier":"enterprise","agent":"Mumuni","deprecated":true},"sk-b57...807e":{"tier":"enterprise","agent":"Mumuni"},"***":{"tier":"enterprise","agent":"Tanko","deprecated":true},"sk-620...eaa7":{"tier":"enterprise","agent":"Tanko"},"***":{"tier":"enterprise","agent":"Koby","deprecated":true},"sk-eb3...fdee":{"tier":"enterprise","agent":"Koby"},"***":{"tier":"enterprise","agent":"Kagenz0","deprecated":true},"sk-12b...ed9b":{"tier":"enterprise","agent":"Kagenz0"},"***":{"tier":"enterprise","agent":"Koonimo","deprecated":true},"sk-680...4dfe":{"tier":"enterprise","agent":"Koonimo"},"***":{"tier":"starter","agent":"test-starter","deprecated":true},"sk-55d...7860":{"tier":"starter","agent":"test-starter"},"sk-pro...z789":{"tier":"professional","agent":"test-pro","deprecated":true},"sk-b51...e676":{"tier":"professional","agent":"test-pro"}} + - ADMIN_KEY=sk-adm...8814 healthcheck: test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/health')"] interval: 30s @@ -57,47 +38,24 @@ services: condition: service_healthy litellm: - image: docker.litellm.ai/berriai/litellm:1.90.0-rc.1 + image: ghcr.io/berriai/litellm:main-stable command: ["--config", "/app/config.yaml", "--port", "4000"] container_name: harness-litellm restart: unless-stopped ports: - - "4001:4000" + - "127.0.0.1:8081:4000" volumes: - ./litellm_config.yaml:/app/config.yaml - - /opt/combined-ca-bundle.pem:/etc/ssl/certs/ca-certificates.crt:ro environment: - - LITELLM_MASTER_KEY=sk-litellm-7f96080dd99b15c36bd4b333b58a6796 - - ROUTER_API_KEY=sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64 - - DATABASE_URL=postgresql://litellm:d9fc143e3dc1a7a8e672c359fea95c5e@postgres:5432/litellm - - STORE_MODEL_IN_DB=True - - LITELLM_UI_USERNAME=admin - - LITELLM_UI_PASSWORD=syslog-admin-2026 - - UI_USERNAME=admin - - UI_PASSWORD=syslog-admin-2026 - - OPENAI_API_KEY=not-used - - PROXY_BASE_URL=https://litellm.sysloggh.net - - DOCS_URL=/docs - - ANTHROPIC_API_KEY=not-used - - GENERIC_CLIENT_ID=FHd7bs9dP5gHad2Ki23iUL5kQvFa0GRaj3nlLnNU - - GENERIC_CLIENT_SECRET=aDkXQx82duqpxc98xxqp0quzzUf1mawsnOTqj7sx1acaS7rWSt02N5ksBCi92n8ZilRavigoYME6fLakP20Ixc9H2pxnSZFiOqQLb7BPi8UtsvfxmzXklD0HJIdbKFxe - - GENERIC_AUTHORIZATION_ENDPOINT=https://auth.sysloggh.net/application/o/authorize/ - - GENERIC_TOKEN_ENDPOINT=http://harness-nginx/application/o/token/ - - GENERIC_USERINFO_ENDPOINT=http://harness-nginx/application/o/userinfo/ - - GENERIC_SCOPE=openid email profile - - GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE=proxy_admin - - SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt + - LITELLM_MASTER_KEY=sk-sys...-key extra_hosts: - "host.docker.internal:host-gateway" - - "auth.sysloggh.net:192.168.68.11" healthcheck: test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"] interval: 15s timeout: 5s retries: 3 depends_on: - postgres: - condition: service_healthy redis: condition: service_healthy @@ -111,7 +69,7 @@ services: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./dashboard:/opt/inference-harness/dashboard:ro extra_hosts: - - "auth.sysloggh.net:192.168.68.11" + - "host.docker.internal:host-gateway" healthcheck: test: ["CMD", "curl", "-f", "http://127.0.0.1/health"] interval: 30s @@ -128,7 +86,7 @@ services: ports: - "127.0.0.1:3000:3000" environment: - - REDIS_URL=redis://redis:6379 + - REDIS_URL=redis://127.0.0.1:6379 - GPU_SIDECARS=192.168.68.15:8090,192.168.68.8:8090,192.168.68.110:8090 healthcheck: test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] @@ -140,4 +98,6 @@ services: volumes: redis-data: - pgdata: + +# LiteLLM command override to load config +# (appended to fix config loading issue) diff --git a/docker-compose.yml.bak.20260616-215242 b/docker-compose.yml.bak.20260616-215242 deleted file mode 100644 index 5823ca4..0000000 --- a/docker-compose.yml.bak.20260616-215242 +++ /dev/null @@ -1,102 +0,0 @@ -version: '3.8' - -services: - redis: - image: redis:7-alpine - container_name: harness-redis - restart: unless-stopped - ports: - - "127.0.0.1:6379:6379" - volumes: - - redis-data:/data - command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 3s - retries: 5 - - router: - build: ./router - container_name: harness-router - restart: unless-stopped - ports: - - "127.0.0.1:9000:9000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_MOE_URL=http://192.168.68.15:8080/v1 - - GPU_DENSE_URL=http://192.168.68.8:8080/v1 - - GPU_LIGHT_URL=http://192.168.68.110:8080/v1 - - API_KEYS={"sk-syslog-local-master-key":{"tier":"enterprise","agent":"admin","deprecated":true},"sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64":{"tier":"enterprise","agent":"admin"},"sk-syslog-abiba":{"tier":"enterprise","agent":"Abiba","deprecated":true},"sk-856ffb0bbb-e5aaf78b10054eca608f8fbcbd73a889":{"tier":"enterprise","agent":"Abiba"},"sk-syslog-mumuni":{"tier":"enterprise","agent":"Mumuni","deprecated":true},"sk-b57e6e042e-47573660114f3138c852c47f62da807e":{"tier":"enterprise","agent":"Mumuni"},"sk-syslog-tanko":{"tier":"enterprise","agent":"Tanko","deprecated":true},"sk-620a05e95a-e93d875476b650a4d1137249ead8eaa7":{"tier":"enterprise","agent":"Tanko"},"sk-syslog-koby":{"tier":"enterprise","agent":"Koby","deprecated":true},"sk-eb3e6fc1c0-de1bf2edf35a53cb3749a2400483fdee":{"tier":"enterprise","agent":"Koby"},"sk-syslog-kagenz0":{"tier":"enterprise","agent":"Kagenz0","deprecated":true},"sk-12b66b3392-b548aed9138aeb6f698e8e521650ed9b":{"tier":"enterprise","agent":"Kagenz0"},"sk-syslog-koonimo":{"tier":"enterprise","agent":"Koonimo","deprecated":true},"sk-680d06686c-00ee8bf9dc3c93b276af122d49a14dfe":{"tier":"enterprise","agent":"Koonimo"},"sk-starter-abc123":{"tier":"starter","agent":"test-starter","deprecated":true},"sk-55da55907a-1bd7ff344e26feda50e9ac2219697860":{"tier":"starter","agent":"test-starter"},"sk-professional-xyz789":{"tier":"professional","agent":"test-pro","deprecated":true},"sk-b5159863e6-8df3ae52fb958cfe76cc2888c8c8e676":{"tier":"professional","agent":"test-pro"}} - - ADMIN_KEY=sk-admin-ee09fffd04978b61a1569ac670c68814 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/health')"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - redis: - condition: service_healthy - - litellm: - image: ghcr.io/berriai/litellm:main-stable - command: ["--config", "/app/config.yaml", "--port", "4000"] - container_name: harness-litellm - restart: unless-stopped - ports: - - "127.0.0.1:8081:4000" - volumes: - - ./litellm_config.yaml:/app/config.yaml - environment: - - LITELLM_MASTER_KEY=sk-sys...-key - extra_hosts: - - "host.docker.internal:host-gateway" - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - redis: - condition: service_healthy - - nginx: - image: nginx:alpine - container_name: harness-nginx - restart: unless-stopped - ports: - - "80:80" - volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./dashboard:/opt/inference-harness/dashboard:ro - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1/health"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - - litellm - - dashboard - - dashboard: - build: ./dashboard - container_name: harness-dashboard - restart: unless-stopped - ports: - - "127.0.0.1:3000:3000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_SIDECARS=192.168.68.15:8090,192.168.68.8:8090,192.168.68.110:8090 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - - redis - -volumes: - redis-data: - -# LiteLLM command override to load config -# (appended to fix config loading issue) diff --git a/docker-compose.yml.bak.20260617-104030 b/docker-compose.yml.bak.20260617-104030 deleted file mode 100644 index 497d407..0000000 --- a/docker-compose.yml.bak.20260617-104030 +++ /dev/null @@ -1,131 +0,0 @@ -version: "3.8" - -services: - redis: - image: redis:7-alpine - container_name: harness-redis - restart: unless-stopped - ports: - - "127.0.0.1:6379:6379" - volumes: - - redis-data:/data - command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 3s - retries: 5 - - postgres: - image: postgres:16-alpine - container_name: harness-postgres - restart: unless-stopped - ports: - - "127.0.0.1:5432:5432" - environment: - - POSTGRES_DB=litellm - - POSTGRES_USER=litellm - - POSTGRES_PASSWORD=d9fc143e3dc1a7a8e672c359fea95c5e - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U litellm"] - interval: 5s - timeout: 3s - retries: 5 - - router: - build: ./router - container_name: harness-router - restart: unless-stopped - ports: - - "127.0.0.1:9000:9000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_MOE_URL=http://192.168.68.15:8080/v1 - - GPU_DENSE_URL=http://192.168.68.8:8080/v1 - - GPU_LIGHT_URL=http://192.168.68.110:8080/v1 - - API_KEYS={"sk-syslog-local-master-key":{"tier":"enterprise","agent":"admin","deprecated":true},"sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64":{"tier":"enterprise","agent":"admin"},"sk-syslog-abiba":{"tier":"enterprise","agent":"Abiba","deprecated":true},"sk-856ffb0bbb-e5aaf78b10054eca608f8fbcbd73a889":{"tier":"enterprise","agent":"Abiba"},"sk-syslog-mumuni":{"tier":"enterprise","agent":"Mumuni","deprecated":true},"sk-b57e6e042e-47573660114f3138c852c47f62da807e":{"tier":"enterprise","agent":"Mumuni"},"sk-syslog-tanko":{"tier":"enterprise","agent":"Tanko","deprecated":true},"sk-620a05e95a-e93d875476b650a4d1137249ead8eaa7":{"tier":"enterprise","agent":"Tanko"},"sk-syslog-koby":{"tier":"enterprise","agent":"Koby","deprecated":true},"sk-eb3e6fc1c0-de1bf2edf35a53cb3749a2400483fdee":{"tier":"enterprise","agent":"Koby"},"sk-syslog-kagenz0":{"tier":"enterprise","agent":"Kagenz0","deprecated":true},"sk-12b66b3392-b548aed9138aeb6f698e8e521650ed9b":{"tier":"enterprise","agent":"Kagenz0"},"sk-syslog-koonimo":{"tier":"enterprise","agent":"Koonimo","deprecated":true},"sk-680d06686c-00ee8bf9dc3c93b276af122d49a14dfe":{"tier":"enterprise","agent":"Koonimo"},"sk-starter-abc123":{"tier":"starter","agent":"test-starter","deprecated":true},"sk-55da55907a-1bd7ff344e26feda50e9ac2219697860":{"tier":"starter","agent":"test-starter"},"sk-professional-xyz789":{"tier":"professional","agent":"test-pro","deprecated":true},"sk-b5159863e6-8df3ae52fb958cfe76cc2888c8c8e676":{"tier":"professional","agent":"test-pro"}} - - ADMIN_KEY=sk-admin-ee09fffd04978b61a1569ac670c68814 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/health')"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - redis: - condition: service_healthy - - litellm: - image: ghcr.io/berriai/litellm:main-stable - command: ["--config", "/app/config.yaml", "--port", "4000"] - container_name: harness-litellm - restart: unless-stopped - ports: - - "4000:4000" - volumes: - - ./litellm_config.yaml:/app/config.yaml - environment: - - LITELLM_MASTER_KEY=sk-litellm-7f96080dd99b15c36bd4b333b58a6796 - - ROUTER_API_KEY=sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64 - - DATABASE_URL=postgresql://litellm:d9fc143e3dc1a7a8e672c359fea95c5e@postgres:5432/litellm - - STORE_MODEL_IN_DB=True - - LITELLM_UI_USERNAME=admin - - LITELLM_UI_PASSWORD=syslog-admin-2026 - - OPENAI_API_KEY=not-used - - PROXY_BASE_URL=http://192.168.68.116/litellm - - ANTHROPIC_API_KEY=not-used - extra_hosts: - - "host.docker.internal:host-gateway" - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - - nginx: - image: nginx:alpine - container_name: harness-nginx - restart: unless-stopped - ports: - - "80:80" - volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./dashboard:/opt/inference-harness/dashboard:ro - extra_hosts: - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1/health"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - - litellm - - dashboard - - dashboard: - build: ./dashboard - container_name: harness-dashboard - restart: unless-stopped - ports: - - "127.0.0.1:3000:3000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_SIDECARS=192.168.68.15:8090,192.168.68.8:8090,192.168.68.110:8090 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - - redis - -volumes: - redis-data: - pgdata: diff --git a/docker-compose.yml.bak.20260625-192313-fix b/docker-compose.yml.bak.20260625-192313-fix deleted file mode 100644 index 97d7be9..0000000 --- a/docker-compose.yml.bak.20260625-192313-fix +++ /dev/null @@ -1,142 +0,0 @@ -version: "3.8" - -services: - redis: - image: redis:7-alpine - container_name: harness-redis - restart: unless-stopped - ports: - - "127.0.0.1:6379:6379" - volumes: - - redis-data:/data - command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 3s - retries: 5 - - postgres: - image: postgres:16-alpine - container_name: harness-postgres - restart: unless-stopped - ports: - - "127.0.0.1:5432:5432" - environment: - - POSTGRES_DB=litellm - - POSTGRES_USER=litellm - - POSTGRES_PASSWORD=d9fc143e3dc1a7a8e672c359fea95c5e - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U litellm"] - interval: 5s - timeout: 3s - retries: 5 - - router: - build: ./router - container_name: harness-router - restart: unless-stopped - ports: - - "127.0.0.1:9000:9000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_MOE_URL=http://192.168.68.15:8080/v1 - - GPU_DENSE_URL=http://192.168.68.8:8080/v1 - - GPU_LIGHT_URL=http://192.168.68.110:8080/v1 - - API_KEYS={"sk-syslog-local-master-key":{"tier":"enterprise","agent":"admin","deprecated":true},"sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64":{"tier":"enterprise","agent":"admin"},"sk-syslog-abiba":{"tier":"enterprise","agent":"Abiba","deprecated":true},"sk-856ffb0bbb-e5aaf78b10054eca608f8fbcbd73a889":{"tier":"enterprise","agent":"Abiba"},"sk-syslog-mumuni":{"tier":"enterprise","agent":"Mumuni","deprecated":true},"sk-b57e6e042e-47573660114f3138c852c47f62da807e":{"tier":"enterprise","agent":"Mumuni"},"sk-syslog-tanko":{"tier":"enterprise","agent":"Tanko","deprecated":true},"sk-620a05e95a-e93d875476b650a4d1137249ead8eaa7":{"tier":"enterprise","agent":"Tanko"},"sk-syslog-koby":{"tier":"enterprise","agent":"Koby","deprecated":true},"sk-eb3e6fc1c0-de1bf2edf35a53cb3749a2400483fdee":{"tier":"enterprise","agent":"Koby"},"sk-syslog-kagenz0":{"tier":"enterprise","agent":"Kagenz0","deprecated":true},"sk-12b66b3392-b548aed9138aeb6f698e8e521650ed9b":{"tier":"enterprise","agent":"Kagenz0"},"sk-syslog-koonimo":{"tier":"enterprise","agent":"Koonimo","deprecated":true},"sk-680d06686c-00ee8bf9dc3c93b276af122d49a14dfe":{"tier":"enterprise","agent":"Koonimo"},"sk-starter-abc123":{"tier":"starter","agent":"test-starter","deprecated":true},"sk-55da55907a-1bd7ff344e26feda50e9ac2219697860":{"tier":"starter","agent":"test-starter"},"sk-professional-xyz789":{"tier":"professional","agent":"test-pro","deprecated":true},"sk-b5159863e6-8df3ae52fb958cfe76cc2888c8c8e676":{"tier":"professional","agent":"test-pro"}} - - ADMIN_KEY=sk-admin-ee09fffd04978b61a1569ac670c68814 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/health')"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - redis: - condition: service_healthy - - litellm: - image: docker.litellm.ai/berriai/litellm:1.90.0-rc.1 - command: ["--config", "/app/config.yaml", "--port", "4000"] - container_name: harness-litellm - restart: unless-stopped - ports: - - "4001:4000" - volumes: - - ./litellm_config.yaml:/app/config.yaml - - /opt/combined-ca-bundle.pem:/etc/ssl/certs/ca-certificates.crt:ro - environment: - - LITELLM_MASTER_KEY=sk-litellm-7f96080dd99b15c36bd4b333b58a6796 - - ROUTER_API_KEY=sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64 - - DATABASE_URL=postgresql://litellm:d9fc143e3dc1a7a8e672c359fea95c5e@postgres:5432/litellm - - STORE_MODEL_IN_DB=True - - LITELLM_UI_USERNAME=admin - - LITELLM_UI_PASSWORD=syslog-admin-2026 - - UI_USERNAME=admin - - UI_PASSWORD=syslog-admin-2026 - - OPENAI_API_KEY=not-used - - PROXY_BASE_URL=https://litellm.sysloggh.net - - DOCS_URL=/litellm/docs - - ANTHROPIC_API_KEY=not-used - - GENERIC_CLIENT_ID=FHd7bs9dP5gHad2Ki23iUL5kQvFa0GRaj3nlLnNU - - GENERIC_CLIENT_SECRET=aDkXQx82duqpxc98xxqp0quzzUf1mawsnOTqj7sx1acaS7rWSt02N5ksBCi92n8ZilRavigoYME6fLakP20Ixc9H2pxnSZFiOqQLb7BPi8UtsvfxmzXklD0HJIdbKFxe - - GENERIC_AUTHORIZATION_ENDPOINT=https://auth.sysloggh.net/application/o/authorize/ - - GENERIC_TOKEN_ENDPOINT=https://auth.sysloggh.net/application/o/token/ - - GENERIC_USERINFO_ENDPOINT=https://auth.sysloggh.net/application/o/userinfo/ - - GENERIC_SCOPE=openid email profile - - GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE=proxy_admin - - SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt - extra_hosts: - - "host.docker.internal:host-gateway" - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - - nginx: - image: nginx:alpine - container_name: harness-nginx - restart: unless-stopped - ports: - - "80:80" - volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./dashboard:/opt/inference-harness/dashboard:ro - extra_hosts: - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1/health"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - - litellm - - dashboard - - dashboard: - build: ./dashboard - container_name: harness-dashboard - restart: unless-stopped - ports: - - "127.0.0.1:3000:3000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_SIDECARS=192.168.68.15:8090,192.168.68.8:8090,192.168.68.110:8090 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - - redis - -volumes: - redis-data: - pgdata: diff --git a/docker-compose.yml.bak.20260625-195716-remove-docs-url b/docker-compose.yml.bak.20260625-195716-remove-docs-url deleted file mode 100644 index 209addd..0000000 --- a/docker-compose.yml.bak.20260625-195716-remove-docs-url +++ /dev/null @@ -1,143 +0,0 @@ -version: "3.8" - -services: - redis: - image: redis:7-alpine - container_name: harness-redis - restart: unless-stopped - ports: - - "127.0.0.1:6379:6379" - volumes: - - redis-data:/data - command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 3s - retries: 5 - - postgres: - image: postgres:16-alpine - container_name: harness-postgres - restart: unless-stopped - ports: - - "127.0.0.1:5432:5432" - environment: - - POSTGRES_DB=litellm - - POSTGRES_USER=litellm - - POSTGRES_PASSWORD=d9fc143e3dc1a7a8e672c359fea95c5e - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U litellm"] - interval: 5s - timeout: 3s - retries: 5 - - router: - build: ./router - container_name: harness-router - restart: unless-stopped - ports: - - "127.0.0.1:9000:9000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_MOE_URL=http://192.168.68.15:8080/v1 - - GPU_DENSE_URL=http://192.168.68.8:8080/v1 - - GPU_LIGHT_URL=http://192.168.68.110:8080/v1 - - API_KEYS={"sk-syslog-local-master-key":{"tier":"enterprise","agent":"admin","deprecated":true},"sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64":{"tier":"enterprise","agent":"admin"},"sk-syslog-abiba":{"tier":"enterprise","agent":"Abiba","deprecated":true},"sk-856ffb0bbb-e5aaf78b10054eca608f8fbcbd73a889":{"tier":"enterprise","agent":"Abiba"},"sk-syslog-mumuni":{"tier":"enterprise","agent":"Mumuni","deprecated":true},"sk-b57e6e042e-47573660114f3138c852c47f62da807e":{"tier":"enterprise","agent":"Mumuni"},"sk-syslog-tanko":{"tier":"enterprise","agent":"Tanko","deprecated":true},"sk-620a05e95a-e93d875476b650a4d1137249ead8eaa7":{"tier":"enterprise","agent":"Tanko"},"sk-syslog-koby":{"tier":"enterprise","agent":"Koby","deprecated":true},"sk-eb3e6fc1c0-de1bf2edf35a53cb3749a2400483fdee":{"tier":"enterprise","agent":"Koby"},"sk-syslog-kagenz0":{"tier":"enterprise","agent":"Kagenz0","deprecated":true},"sk-12b66b3392-b548aed9138aeb6f698e8e521650ed9b":{"tier":"enterprise","agent":"Kagenz0"},"sk-syslog-koonimo":{"tier":"enterprise","agent":"Koonimo","deprecated":true},"sk-680d06686c-00ee8bf9dc3c93b276af122d49a14dfe":{"tier":"enterprise","agent":"Koonimo"},"sk-starter-abc123":{"tier":"starter","agent":"test-starter","deprecated":true},"sk-55da55907a-1bd7ff344e26feda50e9ac2219697860":{"tier":"starter","agent":"test-starter"},"sk-professional-xyz789":{"tier":"professional","agent":"test-pro","deprecated":true},"sk-b5159863e6-8df3ae52fb958cfe76cc2888c8c8e676":{"tier":"professional","agent":"test-pro"}} - - ADMIN_KEY=sk-admin-ee09fffd04978b61a1569ac670c68814 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/health')"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - redis: - condition: service_healthy - - litellm: - image: docker.litellm.ai/berriai/litellm:1.90.0-rc.1 - command: ["--config", "/app/config.yaml", "--port", "4000"] - container_name: harness-litellm - restart: unless-stopped - ports: - - "4001:4000" - volumes: - - ./litellm_config.yaml:/app/config.yaml - - /opt/combined-ca-bundle.pem:/etc/ssl/certs/ca-certificates.crt:ro - environment: - - LITELLM_MASTER_KEY=sk-litellm-7f96080dd99b15c36bd4b333b58a6796 - - ROUTER_API_KEY=sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64 - - DATABASE_URL=postgresql://litellm:d9fc143e3dc1a7a8e672c359fea95c5e@postgres:5432/litellm - - STORE_MODEL_IN_DB=True - - LITELLM_UI_USERNAME=admin - - LITELLM_UI_PASSWORD=syslog-admin-2026 - - UI_USERNAME=admin - - UI_PASSWORD=syslog-admin-2026 - - OPENAI_API_KEY=not-used - - PROXY_BASE_URL=https://litellm.sysloggh.net - - DOCS_URL=/litellm/docs - - ANTHROPIC_API_KEY=not-used - - GENERIC_CLIENT_ID=FHd7bs9dP5gHad2Ki23iUL5kQvFa0GRaj3nlLnNU - - GENERIC_CLIENT_SECRET=aDkXQx82duqpxc98xxqp0quzzUf1mawsnOTqj7sx1acaS7rWSt02N5ksBCi92n8ZilRavigoYME6fLakP20Ixc9H2pxnSZFiOqQLb7BPi8UtsvfxmzXklD0HJIdbKFxe - - GENERIC_AUTHORIZATION_ENDPOINT=https://auth.sysloggh.net/application/o/authorize/ - - GENERIC_TOKEN_ENDPOINT=https://auth.sysloggh.net/application/o/token/ - - GENERIC_USERINFO_ENDPOINT=https://auth.sysloggh.net/application/o/userinfo/ - - GENERIC_SCOPE=openid email profile - - GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE=proxy_admin - - SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt - extra_hosts: - - "host.docker.internal:host-gateway" - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - - nginx: - image: nginx:alpine - container_name: harness-nginx - restart: unless-stopped - ports: - - "80:80" - volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./dashboard:/opt/inference-harness/dashboard:ro - extra_hosts: - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1/health"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - - litellm - - dashboard - - dashboard: - build: ./dashboard - container_name: harness-dashboard - restart: unless-stopped - ports: - - "127.0.0.1:3000:3000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_SIDECARS=192.168.68.15:8090,192.168.68.8:8090,192.168.68.110:8090 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - - redis - -volumes: - redis-data: - pgdata: diff --git a/docker-compose.yml.bak.20260625-195847-set-docs b/docker-compose.yml.bak.20260625-195847-set-docs deleted file mode 100644 index aa7d965..0000000 --- a/docker-compose.yml.bak.20260625-195847-set-docs +++ /dev/null @@ -1,142 +0,0 @@ -version: "3.8" - -services: - redis: - image: redis:7-alpine - container_name: harness-redis - restart: unless-stopped - ports: - - "127.0.0.1:6379:6379" - volumes: - - redis-data:/data - command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 3s - retries: 5 - - postgres: - image: postgres:16-alpine - container_name: harness-postgres - restart: unless-stopped - ports: - - "127.0.0.1:5432:5432" - environment: - - POSTGRES_DB=litellm - - POSTGRES_USER=litellm - - POSTGRES_PASSWORD=d9fc143e3dc1a7a8e672c359fea95c5e - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U litellm"] - interval: 5s - timeout: 3s - retries: 5 - - router: - build: ./router - container_name: harness-router - restart: unless-stopped - ports: - - "127.0.0.1:9000:9000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_MOE_URL=http://192.168.68.15:8080/v1 - - GPU_DENSE_URL=http://192.168.68.8:8080/v1 - - GPU_LIGHT_URL=http://192.168.68.110:8080/v1 - - API_KEYS={"sk-syslog-local-master-key":{"tier":"enterprise","agent":"admin","deprecated":true},"sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64":{"tier":"enterprise","agent":"admin"},"sk-syslog-abiba":{"tier":"enterprise","agent":"Abiba","deprecated":true},"sk-856ffb0bbb-e5aaf78b10054eca608f8fbcbd73a889":{"tier":"enterprise","agent":"Abiba"},"sk-syslog-mumuni":{"tier":"enterprise","agent":"Mumuni","deprecated":true},"sk-b57e6e042e-47573660114f3138c852c47f62da807e":{"tier":"enterprise","agent":"Mumuni"},"sk-syslog-tanko":{"tier":"enterprise","agent":"Tanko","deprecated":true},"sk-620a05e95a-e93d875476b650a4d1137249ead8eaa7":{"tier":"enterprise","agent":"Tanko"},"sk-syslog-koby":{"tier":"enterprise","agent":"Koby","deprecated":true},"sk-eb3e6fc1c0-de1bf2edf35a53cb3749a2400483fdee":{"tier":"enterprise","agent":"Koby"},"sk-syslog-kagenz0":{"tier":"enterprise","agent":"Kagenz0","deprecated":true},"sk-12b66b3392-b548aed9138aeb6f698e8e521650ed9b":{"tier":"enterprise","agent":"Kagenz0"},"sk-syslog-koonimo":{"tier":"enterprise","agent":"Koonimo","deprecated":true},"sk-680d06686c-00ee8bf9dc3c93b276af122d49a14dfe":{"tier":"enterprise","agent":"Koonimo"},"sk-starter-abc123":{"tier":"starter","agent":"test-starter","deprecated":true},"sk-55da55907a-1bd7ff344e26feda50e9ac2219697860":{"tier":"starter","agent":"test-starter"},"sk-professional-xyz789":{"tier":"professional","agent":"test-pro","deprecated":true},"sk-b5159863e6-8df3ae52fb958cfe76cc2888c8c8e676":{"tier":"professional","agent":"test-pro"}} - - ADMIN_KEY=sk-admin-ee09fffd04978b61a1569ac670c68814 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/health')"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - redis: - condition: service_healthy - - litellm: - image: docker.litellm.ai/berriai/litellm:1.90.0-rc.1 - command: ["--config", "/app/config.yaml", "--port", "4000"] - container_name: harness-litellm - restart: unless-stopped - ports: - - "4001:4000" - volumes: - - ./litellm_config.yaml:/app/config.yaml - - /opt/combined-ca-bundle.pem:/etc/ssl/certs/ca-certificates.crt:ro - environment: - - LITELLM_MASTER_KEY=sk-litellm-7f96080dd99b15c36bd4b333b58a6796 - - ROUTER_API_KEY=sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64 - - DATABASE_URL=postgresql://litellm:d9fc143e3dc1a7a8e672c359fea95c5e@postgres:5432/litellm - - STORE_MODEL_IN_DB=True - - LITELLM_UI_USERNAME=admin - - LITELLM_UI_PASSWORD=syslog-admin-2026 - - UI_USERNAME=admin - - UI_PASSWORD=syslog-admin-2026 - - OPENAI_API_KEY=not-used - - PROXY_BASE_URL=https://litellm.sysloggh.net - - ANTHROPIC_API_KEY=not-used - - GENERIC_CLIENT_ID=FHd7bs9dP5gHad2Ki23iUL5kQvFa0GRaj3nlLnNU - - GENERIC_CLIENT_SECRET=aDkXQx82duqpxc98xxqp0quzzUf1mawsnOTqj7sx1acaS7rWSt02N5ksBCi92n8ZilRavigoYME6fLakP20Ixc9H2pxnSZFiOqQLb7BPi8UtsvfxmzXklD0HJIdbKFxe - - GENERIC_AUTHORIZATION_ENDPOINT=https://auth.sysloggh.net/application/o/authorize/ - - GENERIC_TOKEN_ENDPOINT=https://auth.sysloggh.net/application/o/token/ - - GENERIC_USERINFO_ENDPOINT=https://auth.sysloggh.net/application/o/userinfo/ - - GENERIC_SCOPE=openid email profile - - GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE=proxy_admin - - SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt - extra_hosts: - - "host.docker.internal:host-gateway" - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - - nginx: - image: nginx:alpine - container_name: harness-nginx - restart: unless-stopped - ports: - - "80:80" - volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./dashboard:/opt/inference-harness/dashboard:ro - extra_hosts: - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1/health"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - - litellm - - dashboard - - dashboard: - build: ./dashboard - container_name: harness-dashboard - restart: unless-stopped - ports: - - "127.0.0.1:3000:3000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_SIDECARS=192.168.68.15:8090,192.168.68.8:8090,192.168.68.110:8090 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - - redis - -volumes: - redis-data: - pgdata: diff --git a/docker-compose.yml.bak.20260625-202429-auth-proxy b/docker-compose.yml.bak.20260625-202429-auth-proxy deleted file mode 100644 index b003a0a..0000000 --- a/docker-compose.yml.bak.20260625-202429-auth-proxy +++ /dev/null @@ -1,143 +0,0 @@ -version: "3.8" - -services: - redis: - image: redis:7-alpine - container_name: harness-redis - restart: unless-stopped - ports: - - "127.0.0.1:6379:6379" - volumes: - - redis-data:/data - command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 3s - retries: 5 - - postgres: - image: postgres:16-alpine - container_name: harness-postgres - restart: unless-stopped - ports: - - "127.0.0.1:5432:5432" - environment: - - POSTGRES_DB=litellm - - POSTGRES_USER=litellm - - POSTGRES_PASSWORD=d9fc143e3dc1a7a8e672c359fea95c5e - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U litellm"] - interval: 5s - timeout: 3s - retries: 5 - - router: - build: ./router - container_name: harness-router - restart: unless-stopped - ports: - - "127.0.0.1:9000:9000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_MOE_URL=http://192.168.68.15:8080/v1 - - GPU_DENSE_URL=http://192.168.68.8:8080/v1 - - GPU_LIGHT_URL=http://192.168.68.110:8080/v1 - - API_KEYS={"sk-syslog-local-master-key":{"tier":"enterprise","agent":"admin","deprecated":true},"sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64":{"tier":"enterprise","agent":"admin"},"sk-syslog-abiba":{"tier":"enterprise","agent":"Abiba","deprecated":true},"sk-856ffb0bbb-e5aaf78b10054eca608f8fbcbd73a889":{"tier":"enterprise","agent":"Abiba"},"sk-syslog-mumuni":{"tier":"enterprise","agent":"Mumuni","deprecated":true},"sk-b57e6e042e-47573660114f3138c852c47f62da807e":{"tier":"enterprise","agent":"Mumuni"},"sk-syslog-tanko":{"tier":"enterprise","agent":"Tanko","deprecated":true},"sk-620a05e95a-e93d875476b650a4d1137249ead8eaa7":{"tier":"enterprise","agent":"Tanko"},"sk-syslog-koby":{"tier":"enterprise","agent":"Koby","deprecated":true},"sk-eb3e6fc1c0-de1bf2edf35a53cb3749a2400483fdee":{"tier":"enterprise","agent":"Koby"},"sk-syslog-kagenz0":{"tier":"enterprise","agent":"Kagenz0","deprecated":true},"sk-12b66b3392-b548aed9138aeb6f698e8e521650ed9b":{"tier":"enterprise","agent":"Kagenz0"},"sk-syslog-koonimo":{"tier":"enterprise","agent":"Koonimo","deprecated":true},"sk-680d06686c-00ee8bf9dc3c93b276af122d49a14dfe":{"tier":"enterprise","agent":"Koonimo"},"sk-starter-abc123":{"tier":"starter","agent":"test-starter","deprecated":true},"sk-55da55907a-1bd7ff344e26feda50e9ac2219697860":{"tier":"starter","agent":"test-starter"},"sk-professional-xyz789":{"tier":"professional","agent":"test-pro","deprecated":true},"sk-b5159863e6-8df3ae52fb958cfe76cc2888c8c8e676":{"tier":"professional","agent":"test-pro"}} - - ADMIN_KEY=sk-admin-ee09fffd04978b61a1569ac670c68814 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/health')"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - redis: - condition: service_healthy - - litellm: - image: docker.litellm.ai/berriai/litellm:1.90.0-rc.1 - command: ["--config", "/app/config.yaml", "--port", "4000"] - container_name: harness-litellm - restart: unless-stopped - ports: - - "4001:4000" - volumes: - - ./litellm_config.yaml:/app/config.yaml - - /opt/combined-ca-bundle.pem:/etc/ssl/certs/ca-certificates.crt:ro - environment: - - LITELLM_MASTER_KEY=sk-litellm-7f96080dd99b15c36bd4b333b58a6796 - - ROUTER_API_KEY=sk-9e65b69a67-e54af421c1b09fb8bd4f75dacb38cb64 - - DATABASE_URL=postgresql://litellm:d9fc143e3dc1a7a8e672c359fea95c5e@postgres:5432/litellm - - STORE_MODEL_IN_DB=True - - LITELLM_UI_USERNAME=admin - - LITELLM_UI_PASSWORD=syslog-admin-2026 - - UI_USERNAME=admin - - UI_PASSWORD=syslog-admin-2026 - - OPENAI_API_KEY=not-used - - PROXY_BASE_URL=https://litellm.sysloggh.net - - DOCS_URL=/docs - - ANTHROPIC_API_KEY=not-used - - GENERIC_CLIENT_ID=FHd7bs9dP5gHad2Ki23iUL5kQvFa0GRaj3nlLnNU - - GENERIC_CLIENT_SECRET=aDkXQx82duqpxc98xxqp0quzzUf1mawsnOTqj7sx1acaS7rWSt02N5ksBCi92n8ZilRavigoYME6fLakP20Ixc9H2pxnSZFiOqQLb7BPi8UtsvfxmzXklD0HJIdbKFxe - - GENERIC_AUTHORIZATION_ENDPOINT=https://auth.sysloggh.net/application/o/authorize/ - - GENERIC_TOKEN_ENDPOINT=https://auth.sysloggh.net/application/o/token/ - - GENERIC_USERINFO_ENDPOINT=https://auth.sysloggh.net/application/o/userinfo/ - - GENERIC_SCOPE=openid email profile - - GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE=proxy_admin - - SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt - extra_hosts: - - "host.docker.internal:host-gateway" - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - - nginx: - image: nginx:alpine - container_name: harness-nginx - restart: unless-stopped - ports: - - "80:80" - volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./dashboard:/opt/inference-harness/dashboard:ro - extra_hosts: - - "auth.sysloggh.net:192.168.68.11" - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1/health"] - interval: 30s - timeout: 15s - retries: 3 - depends_on: - - litellm - - dashboard - - dashboard: - build: ./dashboard - container_name: harness-dashboard - restart: unless-stopped - ports: - - "127.0.0.1:3000:3000" - environment: - - REDIS_URL=redis://redis:6379 - - GPU_SIDECARS=192.168.68.15:8090,192.168.68.8:8090,192.168.68.110:8090 - healthcheck: - test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] - interval: 15s - timeout: 5s - retries: 3 - depends_on: - - redis - -volumes: - redis-data: - pgdata: diff --git a/graphify-out/.graphify_analysis.json b/graphify-out/.graphify_analysis.json new file mode 100644 index 0000000..af50236 --- /dev/null +++ b/graphify-out/.graphify_analysis.json @@ -0,0 +1,280 @@ +{ + "communities": { + "0": [ + "router_route_v2", + "router_route_v2_route", + "router_route_v3", + "router_route_v3_moe_spillover", + "router_route_v3_rationale_81", + "router_route_v3_route", + "router_router_available_models", + "router_router_estimate_tokens", + "router_router_is_gpu_busy", + "router_router_moe_spillover", + "router_router_rationale_180", + "router_router_rationale_216", + "router_router_rationale_239", + "router_router_rationale_386", + "router_router_route", + "router_router_select_best_gpu" + ], + "1": [ + "dashboard_dashboard", + "dashboard_dashboard_api_performance", + "dashboard_dashboard_api_scatter", + "dashboard_dashboard_api_state", + "dashboard_dashboard_api_stream", + "dashboard_dashboard_api_timeseries", + "dashboard_dashboard_broadcast_loop", + "dashboard_dashboard_dashboard", + "dashboard_dashboard_fetch_state", + "dashboard_dashboard_health", + "dashboard_dashboard_rationale_1" + ], + "2": [ + "queue_service_queue_service", + "queue_service_queue_service_check_gpu_health", + "queue_service_queue_service_enqueue", + "queue_service_queue_service_get_queue_depth", + "queue_service_queue_service_get_redis", + "queue_service_queue_service_health", + "queue_service_queue_service_rationale_100", + "queue_service_queue_service_rationale_62", + "queue_service_queue_service_rationale_68", + "queue_service_queue_service_status" + ], + "3": [ + "router_router_admin_auth", + "router_router_admin_deprecation_summary", + "router_router_admin_generate_key", + "router_router_admin_keys", + "router_router_admin_revoke_key", + "router_router_rationale_895", + "router_router_rationale_905", + "router_router_rationale_928", + "router_router_rationale_950", + "router_router_rationale_978" + ], + "4": [ + "router_router", + "router_router_bcast", + "router_router_get_metrics", + "router_router_metrics", + "router_router_metrics_circuit_breaker", + "router_router_metrics_timeseries", + "router_router_models", + "router_router_rationale_811", + "router_router_stream" + ], + "5": [ + "router_router_get_redis", + "router_router_gpu_decr", + "router_router_gpu_incr", + "router_router_half_open_probe", + "router_router_is_circuit_tripped", + "router_router_performance", + "router_router_rationale_282", + "router_router_rationale_297", + "router_router_rationale_619" + ], + "6": [ + "router_router_check_gpu_health", + "router_router_gpu_active_count", + "router_router_gpu_health_score", + "router_router_health", + "router_router_metrics_gpu_health", + "router_router_rationale_141", + "router_router_rationale_225", + "router_router_rationale_828" + ], + "7": [ + "router_router_chat", + "router_router_check_rate_limit", + "router_router_clean_response", + "router_router_clean_unicode", + "router_router_rationale_184", + "router_router_rationale_72", + "router_router_store_perf_record" + ], + "8": [ + "maintenance", + "maintenance_sh__entry" + ], + "9": [ + "router_router_counter_audit_loop", + "router_router_rationale_116" + ], + "10": [ + "router_router_metrics_latency", + "router_router_rationale_859" + ], + "11": [ + "router_router_rationale_288", + "router_router_trip_circuit" + ], + "12": [ + "router_router_rationale_736", + "router_router_scatter" + ], + "13": [ + "router_http_patch" + ] + }, + "cohesion": { + "0": 0.20833333333333334, + "1": 0.21818181818181817, + "2": 0.3111111111111111, + "3": 0.2, + "4": 0.2777777777777778, + "5": 0.2222222222222222, + "6": 0.35714285714285715, + "7": 0.3333333333333333, + "8": 1.0, + "9": 1.0, + "10": 1.0, + "11": 1.0, + "12": 1.0, + "13": 1.0 + }, + "gods": [ + { + "id": "router_router_chat", + "label": "chat()", + "degree": 12 + }, + { + "id": "router_router_get_redis", + "label": "get_redis()", + "degree": 11 + }, + { + "id": "router_router_gpu_active_count", + "label": "gpu_active_count()", + "degree": 9 + }, + { + "id": "router_router_is_gpu_busy", + "label": "is_gpu_busy()", + "degree": 9 + }, + { + "id": "router_router_select_best_gpu", + "label": "select_best_gpu()", + "degree": 8 + }, + { + "id": "router_router_route", + "label": "route()", + "degree": 8 + }, + { + "id": "router_route_v3_route", + "label": "route()", + "degree": 6 + }, + { + "id": "router_router_check_gpu_health", + "label": "check_gpu_health()", + "degree": 6 + }, + { + "id": "router_router_available_models", + "label": "available_models()", + "degree": 6 + }, + { + "id": "router_router_estimate_tokens", + "label": "estimate_tokens()", + "degree": 6 + } + ], + "surprises": [ + { + "source": "route()", + "target": "available_models()", + "source_files": [ + "router/route_v2.py", + "router/router.py" + ], + "confidence": "INFERRED", + "relation": "calls", + "why": "inferred connection - not explicitly stated in source" + }, + { + "source": "route()", + "target": "estimate_tokens()", + "source_files": [ + "router/route_v2.py", + "router/router.py" + ], + "confidence": "INFERRED", + "relation": "calls", + "why": "inferred connection - not explicitly stated in source" + }, + { + "source": "route()", + "target": "is_gpu_busy()", + "source_files": [ + "router/route_v2.py", + "router/router.py" + ], + "confidence": "INFERRED", + "relation": "calls", + "why": "inferred connection - not explicitly stated in source" + }, + { + "source": "route()", + "target": "select_best_gpu()", + "source_files": [ + "router/route_v2.py", + "router/router.py" + ], + "confidence": "INFERRED", + "relation": "calls", + "why": "inferred connection - not explicitly stated in source" + }, + { + "source": "route()", + "target": "available_models()", + "source_files": [ + "router/route_v3.py", + "router/router.py" + ], + "confidence": "INFERRED", + "relation": "calls", + "why": "inferred connection - not explicitly stated in source" + } + ], + "questions": [ + { + "type": "bridge_node", + "question": "Why does `is_gpu_busy()` connect `Community 0` to `Community 4`, `Community 6`?", + "why": "High betweenness centrality (0.061) - this node is a cross-community bridge." + }, + { + "type": "bridge_node", + "question": "Why does `select_best_gpu()` connect `Community 0` to `Community 4`, `Community 6`?", + "why": "High betweenness centrality (0.031) - this node is a cross-community bridge." + }, + { + "type": "bridge_node", + "question": "Why does `estimate_tokens()` connect `Community 0` to `Community 4`, `Community 7`?", + "why": "High betweenness centrality (0.030) - this node is a cross-community bridge." + }, + { + "type": "verify_inferred", + "question": "Are the 3 inferred relationships involving `is_gpu_busy()` (e.g. with `route()` and `moe_spillover()`) actually correct?", + "why": "`is_gpu_busy()` has 3 INFERRED edges - model-reasoned connections that need verification." + }, + { + "type": "verify_inferred", + "question": "Are the 3 inferred relationships involving `select_best_gpu()` (e.g. with `route()` and `route()`) actually correct?", + "why": "`select_best_gpu()` has 3 INFERRED edges - model-reasoned connections that need verification." + }, + { + "type": "isolated_nodes", + "question": "What connects `SyslogAI Harness Dashboard \u2014 Modern Design.`, `maintenance.sh script`, `Nginx upstream health probe. Returns 200 if service is alive.` to the rest of the system?", + "why": "28 weakly-connected nodes found - possible documentation gaps or missing edges." + } + ] +} \ No newline at end of file diff --git a/graphify-out/.graphify_ast.json b/graphify-out/.graphify_ast.json new file mode 100644 index 0000000..e6edbec --- /dev/null +++ b/graphify-out/.graphify_ast.json @@ -0,0 +1,2439 @@ +{ + "nodes": [ + { + "id": "dashboard_dashboard", + "label": "dashboard.py", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_fetch_state", + "label": "fetch_state()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L10", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_broadcast_loop", + "label": "broadcast_loop()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L17", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_dashboard", + "label": "dashboard()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L308", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_state", + "label": "api_state()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_scatter", + "label": "api_scatter()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L314", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_performance", + "label": "api_performance()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L324", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_timeseries", + "label": "api_timeseries()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L334", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_stream", + "label": "api_stream()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L343", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_health", + "label": "health()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L359", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_rationale_1", + "label": "SyslogAI Harness Dashboard \u2014 Modern Design.", + "file_type": "rationale", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "maintenance", + "label": "maintenance.sh", + "file_type": "code", + "source_file": "maintenance.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "file" + }, + "_origin": "ast" + }, + { + "id": "maintenance_sh__entry", + "label": "maintenance.sh script", + "file_type": "code", + "source_file": "maintenance.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "bash_entrypoint" + }, + "_origin": "ast" + }, + { + "id": "queue_service_queue_service", + "label": "queue-service.py", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_get_redis", + "label": "get_redis()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L35", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_get_queue_depth", + "label": "get_queue_depth()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L43", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_check_gpu_health", + "label": "check_gpu_health()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L50", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_health", + "label": "health()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L61", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_enqueue", + "label": "enqueue()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L67", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_status", + "label": "status()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L99", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_rationale_62", + "label": "Nginx upstream health probe. Returns 200 if service is alive.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L62", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_rationale_68", + "label": "Fallback endpoint \u2014 Nginx calls this when all GPU upstreams are down.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L68", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_rationale_100", + "label": "GET queue depth + circuit breaker state + GPU health.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L100", + "_origin": "ast" + }, + { + "id": "router_http_patch", + "label": "http_patch.py", + "file_type": "code", + "source_file": "router/http_patch.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v2", + "label": "route_v2.py", + "file_type": "code", + "source_file": "router/route_v2.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v2_route", + "label": "route()", + "file_type": "code", + "source_file": "router/route_v2.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v3", + "label": "route_v3.py", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v3_route", + "label": "route()", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v3_moe_spillover", + "label": "moe_spillover()", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L80", + "_origin": "ast" + }, + { + "id": "router_route_v3_rationale_81", + "label": "Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O", + "file_type": "rationale", + "source_file": "router/route_v3.py", + "source_location": "L81", + "_origin": "ast" + }, + { + "id": "router_router", + "label": "router.py", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_router_check_rate_limit", + "label": "check_rate_limit()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L71", + "_origin": "ast" + }, + { + "id": "router_router_get_redis", + "label": "get_redis()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L94", + "_origin": "ast" + }, + { + "id": "router_router_counter_audit_loop", + "label": "counter_audit_loop()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L115", + "_origin": "ast" + }, + { + "id": "router_router_gpu_active_count", + "label": "gpu_active_count()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L140", + "_origin": "ast" + }, + { + "id": "router_router_gpu_incr", + "label": "gpu_incr()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L146", + "_origin": "ast" + }, + { + "id": "router_router_gpu_decr", + "label": "gpu_decr()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L149", + "_origin": "ast" + }, + { + "id": "router_router_check_gpu_health", + "label": "check_gpu_health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L155", + "_origin": "ast" + }, + { + "id": "router_router_available_models", + "label": "available_models()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L177", + "_origin": "ast" + }, + { + "id": "router_router_estimate_tokens", + "label": "estimate_tokens()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L179", + "_origin": "ast" + }, + { + "id": "router_router_store_perf_record", + "label": "store_perf_record()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L183", + "_origin": "ast" + }, + { + "id": "router_router_is_gpu_busy", + "label": "is_gpu_busy()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L215", + "_origin": "ast" + }, + { + "id": "router_router_gpu_health_score", + "label": "gpu_health_score()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L224", + "_origin": "ast" + }, + { + "id": "router_router_select_best_gpu", + "label": "select_best_gpu()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L238", + "_origin": "ast" + }, + { + "id": "router_router_is_circuit_tripped", + "label": "is_circuit_tripped()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L281", + "_origin": "ast" + }, + { + "id": "router_router_trip_circuit", + "label": "trip_circuit()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L287", + "_origin": "ast" + }, + { + "id": "router_router_half_open_probe", + "label": "half_open_probe()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L296", + "_origin": "ast" + }, + { + "id": "router_router_route", + "label": "route()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L305", + "_origin": "ast" + }, + { + "id": "router_router_moe_spillover", + "label": "moe_spillover()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L385", + "_origin": "ast" + }, + { + "id": "router_router_clean_unicode", + "label": "clean_unicode()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L398", + "_origin": "ast" + }, + { + "id": "router_router_clean_response", + "label": "clean_response()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L406", + "_origin": "ast" + }, + { + "id": "router_router_get_metrics", + "label": "get_metrics()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L412", + "_origin": "ast" + }, + { + "id": "router_router_bcast", + "label": "bcast()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L430", + "_origin": "ast" + }, + { + "id": "router_router_chat", + "label": "chat()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L442", + "_origin": "ast" + }, + { + "id": "router_router_performance", + "label": "performance()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L618", + "_origin": "ast" + }, + { + "id": "router_router_scatter", + "label": "scatter()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L735", + "_origin": "ast" + }, + { + "id": "router_router_models", + "label": "models()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L765", + "_origin": "ast" + }, + { + "id": "router_router_health", + "label": "health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L770", + "_origin": "ast" + }, + { + "id": "router_router_metrics", + "label": "metrics()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L780", + "_origin": "ast" + }, + { + "id": "router_router_metrics_timeseries", + "label": "metrics_timeseries()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L783", + "_origin": "ast" + }, + { + "id": "router_router_metrics_circuit_breaker", + "label": "metrics_circuit_breaker()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L810", + "_origin": "ast" + }, + { + "id": "router_router_metrics_gpu_health", + "label": "metrics_gpu_health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L827", + "_origin": "ast" + }, + { + "id": "router_router_metrics_latency", + "label": "metrics_latency()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L858", + "_origin": "ast" + }, + { + "id": "router_router_stream", + "label": "stream()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L875", + "_origin": "ast" + }, + { + "id": "router_router_admin_auth", + "label": "_admin_auth()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L894", + "_origin": "ast" + }, + { + "id": "router_router_admin_keys", + "label": "admin_keys()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L904", + "_origin": "ast" + }, + { + "id": "router_router_admin_deprecation_summary", + "label": "admin_deprecation_summary()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L927", + "_origin": "ast" + }, + { + "id": "router_router_admin_generate_key", + "label": "admin_generate_key()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L949", + "_origin": "ast" + }, + { + "id": "router_router_admin_revoke_key", + "label": "admin_revoke_key()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L977", + "_origin": "ast" + }, + { + "id": "router_router_rationale_72", + "label": "Token bucket rate limiter using Redis. Returns (allowed, retry_after_or_remainin", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L72", + "_origin": "ast" + }, + { + "id": "router_router_rationale_116", + "label": "Every 30s, check GPU slots and reset counters if all slots idle.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L116", + "_origin": "ast" + }, + { + "id": "router_router_rationale_141", + "label": "Get number of in-flight requests for a GPU.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L141", + "_origin": "ast" + }, + { + "id": "router_router_rationale_180", + "label": "Estimate token count from messages. Uses JSON length / 3.5 (closer to real token", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L180", + "_origin": "ast" + }, + { + "id": "router_router_rationale_184", + "label": "Store detailed performance record in Redis for analytics.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L184", + "_origin": "ast" + }, + { + "id": "router_router_rationale_216", + "label": "Check if GPU is at or near max concurrent capacity.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L216", + "_origin": "ast" + }, + { + "id": "router_router_rationale_225", + "label": "Score a GPU based on VRAM, temperature, and load. Lower = better.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L225", + "_origin": "ast" + }, + { + "id": "router_router_rationale_239", + "label": "Pick best GPU, spreading agents across GPUs to prevent hotspots.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L239", + "_origin": "ast" + }, + { + "id": "router_router_rationale_282", + "label": "Check if a GPU host is currently blacklisted.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L282", + "_origin": "ast" + }, + { + "id": "router_router_rationale_288", + "label": "Blacklist a GPU host for a specified duration.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L288", + "_origin": "ast" + }, + { + "id": "router_router_rationale_297", + "label": "Check if a GPU host can be un-blacklisted.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L297", + "_origin": "ast" + }, + { + "id": "router_router_rationale_386", + "label": "Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L386", + "_origin": "ast" + }, + { + "id": "router_router_rationale_619", + "label": "Per-request performance analytics with percentiles per model/reason/agent.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L619", + "_origin": "ast" + }, + { + "id": "router_router_rationale_736", + "label": "Return individual data points for scatter plots (prompt_tokens vs latency).", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L736", + "_origin": "ast" + }, + { + "id": "router_router_rationale_811", + "label": "Expose circuit breaker status per model. Phase 1.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L811", + "_origin": "ast" + }, + { + "id": "router_router_rationale_828", + "label": "Live GPU health scores + circuit breaker + KPIs.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L828", + "_origin": "ast" + }, + { + "id": "router_router_rationale_859", + "label": "Lightweight latency summary for dashboard KPIs.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L859", + "_origin": "ast" + }, + { + "id": "router_router_rationale_895", + "label": "Require admin key for management endpoints.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L895", + "_origin": "ast" + }, + { + "id": "router_router_rationale_905", + "label": "List all API keys (masked) with agent, tier, and deprecation status.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L905", + "_origin": "ast" + }, + { + "id": "router_router_rationale_928", + "label": "Summary of deprecated key usage (from Redis logs, if available).", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L928", + "_origin": "ast" + }, + { + "id": "router_router_rationale_950", + "label": "Generate a new API key for an agent. Body: {\"agent\": \"Name\", \"tier\": \"enterprise", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L950", + "_origin": "ast" + }, + { + "id": "router_router_rationale_978", + "label": "Revoke a deprecated key. Body: {\"agent\": \"Name\"} or {\"key_prefix\": \"sk-xxxx\"}", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L978", + "_origin": "ast" + } + ], + "edges": [ + { + "source": "dashboard_dashboard", + "target": "os", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "json", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "time", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "queue", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "threading", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "requests", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L3", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "flask", + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L4", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_fetch_state", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L10", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_broadcast_loop", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L17", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_dashboard", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L308", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_state", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_scatter", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L314", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_performance", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L324", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_timeseries", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L334", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_stream", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L343", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L359", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard_broadcast_loop", + "target": "dashboard_dashboard_fetch_state", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L20", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard_api_state", + "target": "dashboard_dashboard_fetch_state", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard_rationale_1", + "target": "dashboard_dashboard", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "maintenance", + "target": "maintenance_sh__entry", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "maintenance.sh", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "json", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L11", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "os", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L12", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "sys", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L13", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "time", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L14", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "urllib_request", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L15", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "flask", + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L16", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_get_redis", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L35", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_get_queue_depth", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L43", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_check_gpu_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L50", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L61", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_enqueue", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L67", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_status", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L99", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_enqueue", + "target": "queue_service_queue_service_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L69", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_enqueue", + "target": "queue_service_queue_service_get_queue_depth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L73", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L101", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_get_queue_depth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L102", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L107", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_rationale_62", + "target": "queue_service_queue_service_health", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L62", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_rationale_68", + "target": "queue_service_queue_service_enqueue", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L68", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_rationale_100", + "target": "queue_service_queue_service_status", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L100", + "weight": 1.0 + }, + { + "source": "router_http_patch", + "target": "re", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/http_patch.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_route_v2", + "target": "router_route_v2_route", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v2.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_route_v3", + "target": "router_route_v3_route", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_route_v3", + "target": "router_route_v3_moe_spillover", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L80", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_route_v3_moe_spillover", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L63", + "weight": 1.0 + }, + { + "source": "router_route_v3_rationale_81", + "target": "router_route_v3_moe_spillover", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L81", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "os", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "json", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "time", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "logging", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "traceback", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "threading", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "queue", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "statistics", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "math", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "requests", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "redis", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "flask", + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L3", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_check_rate_limit", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L71", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_get_redis", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L94", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_counter_audit_loop", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L115", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_gpu_active_count", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L140", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_gpu_incr", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L146", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_gpu_decr", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L149", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_check_gpu_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L155", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_available_models", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L177", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_estimate_tokens", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L179", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_store_perf_record", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L183", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_is_gpu_busy", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L215", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_gpu_health_score", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L224", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_select_best_gpu", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L238", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_is_circuit_tripped", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L281", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_trip_circuit", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L287", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_half_open_probe", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L296", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_route", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L305", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_moe_spillover", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L385", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_clean_unicode", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L398", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_clean_response", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L406", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_get_metrics", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L412", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_bcast", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L430", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_chat", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L442", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_performance", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L618", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_scatter", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L735", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_models", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L765", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L770", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L780", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics_timeseries", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L783", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics_circuit_breaker", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L810", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics_gpu_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L827", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics_latency", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L858", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_stream", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L875", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_auth", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L894", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_keys", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L904", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_deprecation_summary", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L927", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_generate_key", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L949", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_revoke_key", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L977", + "weight": 1.0 + }, + { + "source": "router_router_check_rate_limit", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L73", + "weight": 1.0 + }, + { + "source": "router_router_counter_audit_loop", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L119", + "weight": 1.0 + }, + { + "source": "router_router_gpu_incr", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L147", + "weight": 1.0 + }, + { + "source": "router_router_gpu_decr", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L150", + "weight": 1.0 + }, + { + "source": "router_router_available_models", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L177", + "weight": 1.0 + }, + { + "source": "router_router_store_perf_record", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L185", + "weight": 1.0 + }, + { + "source": "router_router_is_gpu_busy", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L217", + "weight": 1.0 + }, + { + "source": "router_router_gpu_health_score", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L226", + "weight": 1.0 + }, + { + "source": "router_router_gpu_health_score", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L231", + "weight": 1.0 + }, + { + "source": "router_router_select_best_gpu", + "target": "router_router_gpu_health_score", + "relation": "indirect_call", + "context": "argument", + "confidence": "INFERRED", + "source_file": "router/router.py", + "source_location": "L250", + "weight": 1.0 + }, + { + "source": "router_router_select_best_gpu", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L253", + "weight": 1.0 + }, + { + "source": "router_router_select_best_gpu", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L268", + "weight": 1.0 + }, + { + "source": "router_router_is_circuit_tripped", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L283", + "weight": 1.0 + }, + { + "source": "router_router_trip_circuit", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L289", + "weight": 1.0 + }, + { + "source": "router_router_half_open_probe", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L298", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_estimate_tokens", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L306", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_available_models", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L312", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_is_circuit_tripped", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L312", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L314", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_select_best_gpu", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L337", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_moe_spillover", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L368", + "weight": 1.0 + }, + { + "source": "router_router_moe_spillover", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L391", + "weight": 1.0 + }, + { + "source": "router_router_clean_response", + "target": "router_router_clean_unicode", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L409", + "weight": 1.0 + }, + { + "source": "router_router_get_metrics", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L415", + "weight": 1.0 + }, + { + "source": "router_router_get_metrics", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L416", + "weight": 1.0 + }, + { + "source": "router_router_bcast", + "target": "router_router_get_metrics", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L431", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_check_rate_limit", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L464", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_estimate_tokens", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L482", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_route", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L487", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_gpu_incr", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L512", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L514", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_gpu_decr", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L530", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_trip_circuit", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L534", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_clean_unicode", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L543", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_store_perf_record", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L564", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_bcast", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L570", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_clean_response", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L582", + "weight": 1.0 + }, + { + "source": "router_router_performance", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L620", + "weight": 1.0 + }, + { + "source": "router_router_scatter", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L737", + "weight": 1.0 + }, + { + "source": "router_router_health", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L773", + "weight": 1.0 + }, + { + "source": "router_router_health", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L774", + "weight": 1.0 + }, + { + "source": "router_router_health", + "target": "router_router_available_models", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L777", + "weight": 1.0 + }, + { + "source": "router_router_metrics", + "target": "router_router_get_metrics", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L780", + "weight": 1.0 + }, + { + "source": "router_router_metrics_gpu_health", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L831", + "weight": 1.0 + }, + { + "source": "router_router_metrics_gpu_health", + "target": "router_router_gpu_health_score", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L832", + "weight": 1.0 + }, + { + "source": "router_router_metrics_gpu_health", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L833", + "weight": 1.0 + }, + { + "source": "router_router_admin_keys", + "target": "router_router_admin_auth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L906", + "weight": 1.0 + }, + { + "source": "router_router_admin_deprecation_summary", + "target": "router_router_admin_auth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L929", + "weight": 1.0 + }, + { + "source": "router_router_admin_generate_key", + "target": "router_router_admin_auth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L951", + "weight": 1.0 + }, + { + "source": "router_router_admin_revoke_key", + "target": "router_router_admin_auth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L979", + "weight": 1.0 + }, + { + "source": "router_router_rationale_72", + "target": "router_router_check_rate_limit", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L72", + "weight": 1.0 + }, + { + "source": "router_router_rationale_116", + "target": "router_router_counter_audit_loop", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L116", + "weight": 1.0 + }, + { + "source": "router_router_rationale_141", + "target": "router_router_gpu_active_count", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L141", + "weight": 1.0 + }, + { + "source": "router_router_rationale_180", + "target": "router_router_estimate_tokens", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L180", + "weight": 1.0 + }, + { + "source": "router_router_rationale_184", + "target": "router_router_store_perf_record", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L184", + "weight": 1.0 + }, + { + "source": "router_router_rationale_216", + "target": "router_router_is_gpu_busy", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L216", + "weight": 1.0 + }, + { + "source": "router_router_rationale_225", + "target": "router_router_gpu_health_score", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L225", + "weight": 1.0 + }, + { + "source": "router_router_rationale_239", + "target": "router_router_select_best_gpu", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L239", + "weight": 1.0 + }, + { + "source": "router_router_rationale_282", + "target": "router_router_is_circuit_tripped", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L282", + "weight": 1.0 + }, + { + "source": "router_router_rationale_288", + "target": "router_router_trip_circuit", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L288", + "weight": 1.0 + }, + { + "source": "router_router_rationale_297", + "target": "router_router_half_open_probe", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L297", + "weight": 1.0 + }, + { + "source": "router_router_rationale_386", + "target": "router_router_moe_spillover", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L386", + "weight": 1.0 + }, + { + "source": "router_router_rationale_619", + "target": "router_router_performance", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L619", + "weight": 1.0 + }, + { + "source": "router_router_rationale_736", + "target": "router_router_scatter", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L736", + "weight": 1.0 + }, + { + "source": "router_router_rationale_811", + "target": "router_router_metrics_circuit_breaker", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L811", + "weight": 1.0 + }, + { + "source": "router_router_rationale_828", + "target": "router_router_metrics_gpu_health", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L828", + "weight": 1.0 + }, + { + "source": "router_router_rationale_859", + "target": "router_router_metrics_latency", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L859", + "weight": 1.0 + }, + { + "source": "router_router_rationale_895", + "target": "router_router_admin_auth", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L895", + "weight": 1.0 + }, + { + "source": "router_router_rationale_905", + "target": "router_router_admin_keys", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L905", + "weight": 1.0 + }, + { + "source": "router_router_rationale_928", + "target": "router_router_admin_deprecation_summary", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L928", + "weight": 1.0 + }, + { + "source": "router_router_rationale_950", + "target": "router_router_admin_generate_key", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L950", + "weight": 1.0 + }, + { + "source": "router_router_rationale_978", + "target": "router_router_admin_revoke_key", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L978", + "weight": 1.0 + }, + { + "source": "router_route_v2_route", + "target": "router_router_estimate_tokens", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_route_v2_route", + "target": "router_router_available_models", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L7", + "weight": 1.0 + }, + { + "source": "router_route_v2_route", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L9", + "weight": 1.0 + }, + { + "source": "router_route_v2_route", + "target": "router_router_select_best_gpu", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L32", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_router_estimate_tokens", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_router_available_models", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L7", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L9", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_router_select_best_gpu", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L32", + "weight": 1.0 + }, + { + "source": "router_route_v3_moe_spillover", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L86", + "weight": 1.0 + } + ], + "input_tokens": 0, + "output_tokens": 0 +} \ No newline at end of file diff --git a/graphify-out/.graphify_detect.json b/graphify-out/.graphify_detect.json new file mode 100644 index 0000000..8a33457 --- /dev/null +++ b/graphify-out/.graphify_detect.json @@ -0,0 +1 @@ +{"files": {"code": ["/root/syslog-harness-repo/dashboard/dashboard.py", "/root/syslog-harness-repo/maintenance.sh", "/root/syslog-harness-repo/phase0-dual-keys.json", "/root/syslog-harness-repo/queue-service/queue-service.py", "/root/syslog-harness-repo/router/http_patch.py", "/root/syslog-harness-repo/router/route_v2.py", "/root/syslog-harness-repo/router/route_v3.py", "/root/syslog-harness-repo/router/router.py"], "document": ["/root/syslog-harness-repo/LITELLM-MIGRATION-PLAN.md", "/root/syslog-harness-repo/MIGRATION_PLAN.md", "/root/syslog-harness-repo/README.md", "/root/syslog-harness-repo/dashboard/dashboard.html", "/root/syslog-harness-repo/dashboard/harness.html", "/root/syslog-harness-repo/dashboard/requirements.txt", "/root/syslog-harness-repo/docker-compose.yml", "/root/syslog-harness-repo/litellm_config.yaml", "/root/syslog-harness-repo/router/requirements.txt", "/root/syslog-harness-repo/ssl/README.md"], "paper": [], "image": [], "video": []}, "total_files": 18, "total_words": 14667, "needs_graph": false, "warning": "Corpus is ~14,667 words - fits in a single context window. You may not need a graph.", "skipped_sensitive": ["/root/syslog-harness-repo/.env.example"], "unclassified": ["/root/syslog-harness-repo/.gitignore", "/root/syslog-harness-repo/Dockerfile.dashboard", "/root/syslog-harness-repo/Dockerfile.queue", "/root/syslog-harness-repo/backups/20260602_103344/dashboard.py.bak", "/root/syslog-harness-repo/backups/20260602_103344/router.py.bak", "/root/syslog-harness-repo/backups/20260602_103344/ts_patch.py.bak", "/root/syslog-harness-repo/dashboard/Dockerfile", "/root/syslog-harness-repo/docker-compose.yml.bak", "/root/syslog-harness-repo/gpu-router-docker.conf", "/root/syslog-harness-repo/gpu-router.conf", "/root/syslog-harness-repo/nginx/nginx.conf", "/root/syslog-harness-repo/nginx/nginx.conf.bak", "/root/syslog-harness-repo/router/Dockerfile", "/root/syslog-harness-repo/router/router.py.bak.20260518074236"], "graphifyignore_patterns": 3, "scan_root": "/root/syslog-harness-repo"} \ No newline at end of file diff --git a/graphify-out/.graphify_extract.json b/graphify-out/.graphify_extract.json new file mode 100644 index 0000000..c7688a0 --- /dev/null +++ b/graphify-out/.graphify_extract.json @@ -0,0 +1,2440 @@ +{ + "nodes": [ + { + "id": "dashboard_dashboard", + "label": "dashboard.py", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_fetch_state", + "label": "fetch_state()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L10", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_broadcast_loop", + "label": "broadcast_loop()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L17", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_dashboard", + "label": "dashboard()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L308", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_state", + "label": "api_state()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_scatter", + "label": "api_scatter()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L314", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_performance", + "label": "api_performance()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L324", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_timeseries", + "label": "api_timeseries()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L334", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_api_stream", + "label": "api_stream()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L343", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_health", + "label": "health()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L359", + "_origin": "ast" + }, + { + "id": "dashboard_dashboard_rationale_1", + "label": "SyslogAI Harness Dashboard \u2014 Modern Design.", + "file_type": "rationale", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "maintenance", + "label": "maintenance.sh", + "file_type": "code", + "source_file": "maintenance.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "file" + }, + "_origin": "ast" + }, + { + "id": "maintenance_sh__entry", + "label": "maintenance.sh script", + "file_type": "code", + "source_file": "maintenance.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "bash_entrypoint" + }, + "_origin": "ast" + }, + { + "id": "queue_service_queue_service", + "label": "queue-service.py", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_get_redis", + "label": "get_redis()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L35", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_get_queue_depth", + "label": "get_queue_depth()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L43", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_check_gpu_health", + "label": "check_gpu_health()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L50", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_health", + "label": "health()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L61", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_enqueue", + "label": "enqueue()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L67", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_status", + "label": "status()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L99", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_rationale_62", + "label": "Nginx upstream health probe. Returns 200 if service is alive.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L62", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_rationale_68", + "label": "Fallback endpoint \u2014 Nginx calls this when all GPU upstreams are down.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L68", + "_origin": "ast" + }, + { + "id": "queue_service_queue_service_rationale_100", + "label": "GET queue depth + circuit breaker state + GPU health.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L100", + "_origin": "ast" + }, + { + "id": "router_http_patch", + "label": "http_patch.py", + "file_type": "code", + "source_file": "router/http_patch.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v2", + "label": "route_v2.py", + "file_type": "code", + "source_file": "router/route_v2.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v2_route", + "label": "route()", + "file_type": "code", + "source_file": "router/route_v2.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v3", + "label": "route_v3.py", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v3_route", + "label": "route()", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_route_v3_moe_spillover", + "label": "moe_spillover()", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L80", + "_origin": "ast" + }, + { + "id": "router_route_v3_rationale_81", + "label": "Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O", + "file_type": "rationale", + "source_file": "router/route_v3.py", + "source_location": "L81", + "_origin": "ast" + }, + { + "id": "router_router", + "label": "router.py", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L1", + "_origin": "ast" + }, + { + "id": "router_router_check_rate_limit", + "label": "check_rate_limit()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L71", + "_origin": "ast" + }, + { + "id": "router_router_get_redis", + "label": "get_redis()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L94", + "_origin": "ast" + }, + { + "id": "router_router_counter_audit_loop", + "label": "counter_audit_loop()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L115", + "_origin": "ast" + }, + { + "id": "router_router_gpu_active_count", + "label": "gpu_active_count()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L140", + "_origin": "ast" + }, + { + "id": "router_router_gpu_incr", + "label": "gpu_incr()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L146", + "_origin": "ast" + }, + { + "id": "router_router_gpu_decr", + "label": "gpu_decr()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L149", + "_origin": "ast" + }, + { + "id": "router_router_check_gpu_health", + "label": "check_gpu_health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L155", + "_origin": "ast" + }, + { + "id": "router_router_available_models", + "label": "available_models()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L177", + "_origin": "ast" + }, + { + "id": "router_router_estimate_tokens", + "label": "estimate_tokens()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L179", + "_origin": "ast" + }, + { + "id": "router_router_store_perf_record", + "label": "store_perf_record()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L183", + "_origin": "ast" + }, + { + "id": "router_router_is_gpu_busy", + "label": "is_gpu_busy()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L215", + "_origin": "ast" + }, + { + "id": "router_router_gpu_health_score", + "label": "gpu_health_score()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L224", + "_origin": "ast" + }, + { + "id": "router_router_select_best_gpu", + "label": "select_best_gpu()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L238", + "_origin": "ast" + }, + { + "id": "router_router_is_circuit_tripped", + "label": "is_circuit_tripped()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L281", + "_origin": "ast" + }, + { + "id": "router_router_trip_circuit", + "label": "trip_circuit()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L287", + "_origin": "ast" + }, + { + "id": "router_router_half_open_probe", + "label": "half_open_probe()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L296", + "_origin": "ast" + }, + { + "id": "router_router_route", + "label": "route()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L305", + "_origin": "ast" + }, + { + "id": "router_router_moe_spillover", + "label": "moe_spillover()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L385", + "_origin": "ast" + }, + { + "id": "router_router_clean_unicode", + "label": "clean_unicode()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L398", + "_origin": "ast" + }, + { + "id": "router_router_clean_response", + "label": "clean_response()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L406", + "_origin": "ast" + }, + { + "id": "router_router_get_metrics", + "label": "get_metrics()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L412", + "_origin": "ast" + }, + { + "id": "router_router_bcast", + "label": "bcast()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L430", + "_origin": "ast" + }, + { + "id": "router_router_chat", + "label": "chat()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L442", + "_origin": "ast" + }, + { + "id": "router_router_performance", + "label": "performance()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L618", + "_origin": "ast" + }, + { + "id": "router_router_scatter", + "label": "scatter()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L735", + "_origin": "ast" + }, + { + "id": "router_router_models", + "label": "models()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L765", + "_origin": "ast" + }, + { + "id": "router_router_health", + "label": "health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L770", + "_origin": "ast" + }, + { + "id": "router_router_metrics", + "label": "metrics()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L780", + "_origin": "ast" + }, + { + "id": "router_router_metrics_timeseries", + "label": "metrics_timeseries()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L783", + "_origin": "ast" + }, + { + "id": "router_router_metrics_circuit_breaker", + "label": "metrics_circuit_breaker()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L810", + "_origin": "ast" + }, + { + "id": "router_router_metrics_gpu_health", + "label": "metrics_gpu_health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L827", + "_origin": "ast" + }, + { + "id": "router_router_metrics_latency", + "label": "metrics_latency()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L858", + "_origin": "ast" + }, + { + "id": "router_router_stream", + "label": "stream()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L875", + "_origin": "ast" + }, + { + "id": "router_router_admin_auth", + "label": "_admin_auth()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L894", + "_origin": "ast" + }, + { + "id": "router_router_admin_keys", + "label": "admin_keys()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L904", + "_origin": "ast" + }, + { + "id": "router_router_admin_deprecation_summary", + "label": "admin_deprecation_summary()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L927", + "_origin": "ast" + }, + { + "id": "router_router_admin_generate_key", + "label": "admin_generate_key()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L949", + "_origin": "ast" + }, + { + "id": "router_router_admin_revoke_key", + "label": "admin_revoke_key()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L977", + "_origin": "ast" + }, + { + "id": "router_router_rationale_72", + "label": "Token bucket rate limiter using Redis. Returns (allowed, retry_after_or_remainin", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L72", + "_origin": "ast" + }, + { + "id": "router_router_rationale_116", + "label": "Every 30s, check GPU slots and reset counters if all slots idle.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L116", + "_origin": "ast" + }, + { + "id": "router_router_rationale_141", + "label": "Get number of in-flight requests for a GPU.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L141", + "_origin": "ast" + }, + { + "id": "router_router_rationale_180", + "label": "Estimate token count from messages. Uses JSON length / 3.5 (closer to real token", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L180", + "_origin": "ast" + }, + { + "id": "router_router_rationale_184", + "label": "Store detailed performance record in Redis for analytics.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L184", + "_origin": "ast" + }, + { + "id": "router_router_rationale_216", + "label": "Check if GPU is at or near max concurrent capacity.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L216", + "_origin": "ast" + }, + { + "id": "router_router_rationale_225", + "label": "Score a GPU based on VRAM, temperature, and load. Lower = better.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L225", + "_origin": "ast" + }, + { + "id": "router_router_rationale_239", + "label": "Pick best GPU, spreading agents across GPUs to prevent hotspots.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L239", + "_origin": "ast" + }, + { + "id": "router_router_rationale_282", + "label": "Check if a GPU host is currently blacklisted.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L282", + "_origin": "ast" + }, + { + "id": "router_router_rationale_288", + "label": "Blacklist a GPU host for a specified duration.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L288", + "_origin": "ast" + }, + { + "id": "router_router_rationale_297", + "label": "Check if a GPU host can be un-blacklisted.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L297", + "_origin": "ast" + }, + { + "id": "router_router_rationale_386", + "label": "Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L386", + "_origin": "ast" + }, + { + "id": "router_router_rationale_619", + "label": "Per-request performance analytics with percentiles per model/reason/agent.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L619", + "_origin": "ast" + }, + { + "id": "router_router_rationale_736", + "label": "Return individual data points for scatter plots (prompt_tokens vs latency).", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L736", + "_origin": "ast" + }, + { + "id": "router_router_rationale_811", + "label": "Expose circuit breaker status per model. Phase 1.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L811", + "_origin": "ast" + }, + { + "id": "router_router_rationale_828", + "label": "Live GPU health scores + circuit breaker + KPIs.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L828", + "_origin": "ast" + }, + { + "id": "router_router_rationale_859", + "label": "Lightweight latency summary for dashboard KPIs.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L859", + "_origin": "ast" + }, + { + "id": "router_router_rationale_895", + "label": "Require admin key for management endpoints.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L895", + "_origin": "ast" + }, + { + "id": "router_router_rationale_905", + "label": "List all API keys (masked) with agent, tier, and deprecation status.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L905", + "_origin": "ast" + }, + { + "id": "router_router_rationale_928", + "label": "Summary of deprecated key usage (from Redis logs, if available).", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L928", + "_origin": "ast" + }, + { + "id": "router_router_rationale_950", + "label": "Generate a new API key for an agent. Body: {\"agent\": \"Name\", \"tier\": \"enterprise", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L950", + "_origin": "ast" + }, + { + "id": "router_router_rationale_978", + "label": "Revoke a deprecated key. Body: {\"agent\": \"Name\"} or {\"key_prefix\": \"sk-xxxx\"}", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L978", + "_origin": "ast" + } + ], + "edges": [ + { + "source": "dashboard_dashboard", + "target": "os", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "json", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "time", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "queue", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "threading", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "requests", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L3", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "flask", + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L4", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_fetch_state", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L10", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_broadcast_loop", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L17", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_dashboard", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L308", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_state", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_scatter", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L314", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_performance", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L324", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_timeseries", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L334", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_stream", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L343", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L359", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard_broadcast_loop", + "target": "dashboard_dashboard_fetch_state", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L20", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard_api_state", + "target": "dashboard_dashboard_fetch_state", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "weight": 1.0 + }, + { + "source": "dashboard_dashboard_rationale_1", + "target": "dashboard_dashboard", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "maintenance", + "target": "maintenance_sh__entry", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "maintenance.sh", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "json", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L11", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "os", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L12", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "sys", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L13", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "time", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L14", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "urllib_request", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L15", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "flask", + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L16", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_get_redis", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L35", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_get_queue_depth", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L43", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_check_gpu_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L50", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L61", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_enqueue", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L67", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_status", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L99", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_enqueue", + "target": "queue_service_queue_service_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L69", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_enqueue", + "target": "queue_service_queue_service_get_queue_depth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L73", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L101", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_get_queue_depth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L102", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L107", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_rationale_62", + "target": "queue_service_queue_service_health", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L62", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_rationale_68", + "target": "queue_service_queue_service_enqueue", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L68", + "weight": 1.0 + }, + { + "source": "queue_service_queue_service_rationale_100", + "target": "queue_service_queue_service_status", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L100", + "weight": 1.0 + }, + { + "source": "router_http_patch", + "target": "re", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/http_patch.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_route_v2", + "target": "router_route_v2_route", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v2.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_route_v3", + "target": "router_route_v3_route", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_route_v3", + "target": "router_route_v3_moe_spillover", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L80", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_route_v3_moe_spillover", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L63", + "weight": 1.0 + }, + { + "source": "router_route_v3_rationale_81", + "target": "router_route_v3_moe_spillover", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L81", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "os", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "json", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "time", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "logging", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "traceback", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "threading", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "queue", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "statistics", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "math", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "requests", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "redis", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "flask", + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L3", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_check_rate_limit", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L71", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_get_redis", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L94", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_counter_audit_loop", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L115", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_gpu_active_count", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L140", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_gpu_incr", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L146", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_gpu_decr", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L149", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_check_gpu_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L155", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_available_models", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L177", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_estimate_tokens", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L179", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_store_perf_record", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L183", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_is_gpu_busy", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L215", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_gpu_health_score", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L224", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_select_best_gpu", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L238", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_is_circuit_tripped", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L281", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_trip_circuit", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L287", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_half_open_probe", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L296", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_route", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L305", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_moe_spillover", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L385", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_clean_unicode", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L398", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_clean_response", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L406", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_get_metrics", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L412", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_bcast", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L430", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_chat", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L442", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_performance", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L618", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_scatter", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L735", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_models", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L765", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L770", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L780", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics_timeseries", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L783", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics_circuit_breaker", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L810", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics_gpu_health", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L827", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_metrics_latency", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L858", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_stream", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L875", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_auth", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L894", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_keys", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L904", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_deprecation_summary", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L927", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_generate_key", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L949", + "weight": 1.0 + }, + { + "source": "router_router", + "target": "router_router_admin_revoke_key", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L977", + "weight": 1.0 + }, + { + "source": "router_router_check_rate_limit", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L73", + "weight": 1.0 + }, + { + "source": "router_router_counter_audit_loop", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L119", + "weight": 1.0 + }, + { + "source": "router_router_gpu_incr", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L147", + "weight": 1.0 + }, + { + "source": "router_router_gpu_decr", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L150", + "weight": 1.0 + }, + { + "source": "router_router_available_models", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L177", + "weight": 1.0 + }, + { + "source": "router_router_store_perf_record", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L185", + "weight": 1.0 + }, + { + "source": "router_router_is_gpu_busy", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L217", + "weight": 1.0 + }, + { + "source": "router_router_gpu_health_score", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L226", + "weight": 1.0 + }, + { + "source": "router_router_gpu_health_score", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L231", + "weight": 1.0 + }, + { + "source": "router_router_select_best_gpu", + "target": "router_router_gpu_health_score", + "relation": "indirect_call", + "context": "argument", + "confidence": "INFERRED", + "source_file": "router/router.py", + "source_location": "L250", + "weight": 1.0 + }, + { + "source": "router_router_select_best_gpu", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L253", + "weight": 1.0 + }, + { + "source": "router_router_select_best_gpu", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L268", + "weight": 1.0 + }, + { + "source": "router_router_is_circuit_tripped", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L283", + "weight": 1.0 + }, + { + "source": "router_router_trip_circuit", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L289", + "weight": 1.0 + }, + { + "source": "router_router_half_open_probe", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L298", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_estimate_tokens", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L306", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_available_models", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L312", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_is_circuit_tripped", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L312", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L314", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_select_best_gpu", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L337", + "weight": 1.0 + }, + { + "source": "router_router_route", + "target": "router_router_moe_spillover", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L368", + "weight": 1.0 + }, + { + "source": "router_router_moe_spillover", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L391", + "weight": 1.0 + }, + { + "source": "router_router_clean_response", + "target": "router_router_clean_unicode", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L409", + "weight": 1.0 + }, + { + "source": "router_router_get_metrics", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L415", + "weight": 1.0 + }, + { + "source": "router_router_get_metrics", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L416", + "weight": 1.0 + }, + { + "source": "router_router_bcast", + "target": "router_router_get_metrics", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L431", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_check_rate_limit", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L464", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_estimate_tokens", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L482", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_route", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L487", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_gpu_incr", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L512", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L514", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_gpu_decr", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L530", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_trip_circuit", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L534", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_clean_unicode", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L543", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_store_perf_record", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L564", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_bcast", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L570", + "weight": 1.0 + }, + { + "source": "router_router_chat", + "target": "router_router_clean_response", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L582", + "weight": 1.0 + }, + { + "source": "router_router_performance", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L620", + "weight": 1.0 + }, + { + "source": "router_router_scatter", + "target": "router_router_get_redis", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L737", + "weight": 1.0 + }, + { + "source": "router_router_health", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L773", + "weight": 1.0 + }, + { + "source": "router_router_health", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L774", + "weight": 1.0 + }, + { + "source": "router_router_health", + "target": "router_router_available_models", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L777", + "weight": 1.0 + }, + { + "source": "router_router_metrics", + "target": "router_router_get_metrics", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L780", + "weight": 1.0 + }, + { + "source": "router_router_metrics_gpu_health", + "target": "router_router_check_gpu_health", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L831", + "weight": 1.0 + }, + { + "source": "router_router_metrics_gpu_health", + "target": "router_router_gpu_health_score", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L832", + "weight": 1.0 + }, + { + "source": "router_router_metrics_gpu_health", + "target": "router_router_gpu_active_count", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L833", + "weight": 1.0 + }, + { + "source": "router_router_admin_keys", + "target": "router_router_admin_auth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L906", + "weight": 1.0 + }, + { + "source": "router_router_admin_deprecation_summary", + "target": "router_router_admin_auth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L929", + "weight": 1.0 + }, + { + "source": "router_router_admin_generate_key", + "target": "router_router_admin_auth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L951", + "weight": 1.0 + }, + { + "source": "router_router_admin_revoke_key", + "target": "router_router_admin_auth", + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L979", + "weight": 1.0 + }, + { + "source": "router_router_rationale_72", + "target": "router_router_check_rate_limit", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L72", + "weight": 1.0 + }, + { + "source": "router_router_rationale_116", + "target": "router_router_counter_audit_loop", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L116", + "weight": 1.0 + }, + { + "source": "router_router_rationale_141", + "target": "router_router_gpu_active_count", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L141", + "weight": 1.0 + }, + { + "source": "router_router_rationale_180", + "target": "router_router_estimate_tokens", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L180", + "weight": 1.0 + }, + { + "source": "router_router_rationale_184", + "target": "router_router_store_perf_record", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L184", + "weight": 1.0 + }, + { + "source": "router_router_rationale_216", + "target": "router_router_is_gpu_busy", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L216", + "weight": 1.0 + }, + { + "source": "router_router_rationale_225", + "target": "router_router_gpu_health_score", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L225", + "weight": 1.0 + }, + { + "source": "router_router_rationale_239", + "target": "router_router_select_best_gpu", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L239", + "weight": 1.0 + }, + { + "source": "router_router_rationale_282", + "target": "router_router_is_circuit_tripped", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L282", + "weight": 1.0 + }, + { + "source": "router_router_rationale_288", + "target": "router_router_trip_circuit", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L288", + "weight": 1.0 + }, + { + "source": "router_router_rationale_297", + "target": "router_router_half_open_probe", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L297", + "weight": 1.0 + }, + { + "source": "router_router_rationale_386", + "target": "router_router_moe_spillover", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L386", + "weight": 1.0 + }, + { + "source": "router_router_rationale_619", + "target": "router_router_performance", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L619", + "weight": 1.0 + }, + { + "source": "router_router_rationale_736", + "target": "router_router_scatter", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L736", + "weight": 1.0 + }, + { + "source": "router_router_rationale_811", + "target": "router_router_metrics_circuit_breaker", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L811", + "weight": 1.0 + }, + { + "source": "router_router_rationale_828", + "target": "router_router_metrics_gpu_health", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L828", + "weight": 1.0 + }, + { + "source": "router_router_rationale_859", + "target": "router_router_metrics_latency", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L859", + "weight": 1.0 + }, + { + "source": "router_router_rationale_895", + "target": "router_router_admin_auth", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L895", + "weight": 1.0 + }, + { + "source": "router_router_rationale_905", + "target": "router_router_admin_keys", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L905", + "weight": 1.0 + }, + { + "source": "router_router_rationale_928", + "target": "router_router_admin_deprecation_summary", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L928", + "weight": 1.0 + }, + { + "source": "router_router_rationale_950", + "target": "router_router_admin_generate_key", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L950", + "weight": 1.0 + }, + { + "source": "router_router_rationale_978", + "target": "router_router_admin_revoke_key", + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L978", + "weight": 1.0 + }, + { + "source": "router_route_v2_route", + "target": "router_router_estimate_tokens", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_route_v2_route", + "target": "router_router_available_models", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L7", + "weight": 1.0 + }, + { + "source": "router_route_v2_route", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L9", + "weight": 1.0 + }, + { + "source": "router_route_v2_route", + "target": "router_router_select_best_gpu", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L32", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_router_estimate_tokens", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L2", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_router_available_models", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L7", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L9", + "weight": 1.0 + }, + { + "source": "router_route_v3_route", + "target": "router_router_select_best_gpu", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L32", + "weight": 1.0 + }, + { + "source": "router_route_v3_moe_spillover", + "target": "router_router_is_gpu_busy", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L86", + "weight": 1.0 + } + ], + "hyperedges": [], + "input_tokens": 0, + "output_tokens": 0 +} \ No newline at end of file diff --git a/graphify-out/.graphify_semantic.json b/graphify-out/.graphify_semantic.json new file mode 100644 index 0000000..526b1ae --- /dev/null +++ b/graphify-out/.graphify_semantic.json @@ -0,0 +1 @@ +{"nodes": [], "edges": [], "hyperedges": [], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md new file mode 100644 index 0000000..a567233 --- /dev/null +++ b/graphify-out/GRAPH_REPORT.md @@ -0,0 +1,106 @@ +# Graph Report - . (2026-07-08) + +## Corpus Check +- Corpus is ~14,667 words - fits in a single context window. You may not need a graph. + +## Summary +- 91 nodes · 151 edges · 14 communities (9 shown, 5 thin omitted) +- Extraction: 93% EXTRACTED · 7% INFERRED · 0% AMBIGUOUS · INFERRED: 10 edges (avg confidence: 0.77) +- Token cost: 0 input · 0 output + +## Community Hubs (Navigation) +- Community 0 +- Community 1 +- Community 2 +- Community 3 +- Community 4 +- Community 5 +- Community 6 +- Community 7 +- Community 8 +- Community 9 +- Community 10 +- Community 11 +- Community 12 + +## God Nodes (most connected - your core abstractions) +1. `chat()` - 12 edges +2. `get_redis()` - 11 edges +3. `gpu_active_count()` - 9 edges +4. `is_gpu_busy()` - 9 edges +5. `select_best_gpu()` - 8 edges +6. `route()` - 8 edges +7. `route()` - 6 edges +8. `check_gpu_health()` - 6 edges +9. `available_models()` - 6 edges +10. `estimate_tokens()` - 6 edges + +## Surprising Connections (you probably didn't know these) +- `route()` --calls--> `available_models()` [INFERRED] + router/route_v2.py → router/router.py +- `route()` --calls--> `estimate_tokens()` [INFERRED] + router/route_v2.py → router/router.py +- `route()` --calls--> `is_gpu_busy()` [INFERRED] + router/route_v2.py → router/router.py +- `route()` --calls--> `select_best_gpu()` [INFERRED] + router/route_v2.py → router/router.py +- `route()` --calls--> `available_models()` [INFERRED] + router/route_v3.py → router/router.py + +## Import Cycles +- None detected. + +## Communities (14 total, 5 thin omitted) + +### Community 0 - "Community 0" +Cohesion: 0.21 +Nodes (14): route(), moe_spillover(), Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O, route(), available_models(), estimate_tokens(), is_gpu_busy(), moe_spillover() (+6 more) + +### Community 1 - "Community 1" +Cohesion: 0.22 +Nodes (4): api_state(), broadcast_loop(), fetch_state(), SyslogAI Harness Dashboard — Modern Design. + +### Community 2 - "Community 2" +Cohesion: 0.31 +Nodes (9): check_gpu_health(), enqueue(), get_queue_depth(), get_redis(), health(), GET queue depth + circuit breaker state + GPU health., Nginx upstream health probe. Returns 200 if service is alive., Fallback endpoint — Nginx calls this when all GPU upstreams are down. (+1 more) + +### Community 3 - "Community 3" +Cohesion: 0.20 +Nodes (10): _admin_auth(), admin_deprecation_summary(), admin_generate_key(), admin_keys(), admin_revoke_key(), Require admin key for management endpoints., List all API keys (masked) with agent, tier, and deprecation status., Summary of deprecated key usage (from Redis logs, if available). (+2 more) + +### Community 4 - "Community 4" +Cohesion: 0.28 +Nodes (5): bcast(), get_metrics(), metrics(), metrics_circuit_breaker(), Expose circuit breaker status per model. Phase 1. + +### Community 5 - "Community 5" +Cohesion: 0.22 +Nodes (9): get_redis(), gpu_decr(), gpu_incr(), half_open_probe(), is_circuit_tripped(), performance(), Check if a GPU host is currently blacklisted., Check if a GPU host can be un-blacklisted. (+1 more) + +### Community 6 - "Community 6" +Cohesion: 0.36 +Nodes (8): check_gpu_health(), gpu_active_count(), gpu_health_score(), health(), metrics_gpu_health(), Get number of in-flight requests for a GPU., Score a GPU based on VRAM, temperature, and load. Lower = better., Live GPU health scores + circuit breaker + KPIs. + +### Community 7 - "Community 7" +Cohesion: 0.33 +Nodes (7): chat(), check_rate_limit(), clean_response(), clean_unicode(), Store detailed performance record in Redis for analytics., Token bucket rate limiter using Redis. Returns (allowed, retry_after_or_remainin, store_perf_record() + +## Knowledge Gaps +- **1 isolated node(s):** `maintenance.sh script` + These have ≤1 connection - possible missing edges or undocumented components. +- **5 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. + +## Suggested Questions +_Questions this graph is uniquely positioned to answer:_ + +- **Why does `is_gpu_busy()` connect `Community 0` to `Community 4`, `Community 6`?** + _High betweenness centrality (0.061) - this node is a cross-community bridge._ +- **Why does `select_best_gpu()` connect `Community 0` to `Community 4`, `Community 6`?** + _High betweenness centrality (0.031) - this node is a cross-community bridge._ +- **Why does `estimate_tokens()` connect `Community 0` to `Community 4`, `Community 7`?** + _High betweenness centrality (0.030) - this node is a cross-community bridge._ +- **Are the 3 inferred relationships involving `is_gpu_busy()` (e.g. with `route()` and `moe_spillover()`) actually correct?** + _`is_gpu_busy()` has 3 INFERRED edges - model-reasoned connections that need verification._ +- **Are the 3 inferred relationships involving `select_best_gpu()` (e.g. with `route()` and `route()`) actually correct?** + _`select_best_gpu()` has 3 INFERRED edges - model-reasoned connections that need verification._ +- **What connects `SyslogAI Harness Dashboard — Modern Design.`, `maintenance.sh script`, `Nginx upstream health probe. Returns 200 if service is alive.` to the rest of the system?** + _28 weakly-connected nodes found - possible documentation gaps or missing edges._ \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.10/30b202626b1f50da90b78272001e253cc7086b0bdc52e46553414c5313e3fb4e.json b/graphify-out/cache/ast/v0.9.10/30b202626b1f50da90b78272001e253cc7086b0bdc52e46553414c5313e3fb4e.json new file mode 100644 index 0000000..232a4d7 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.10/30b202626b1f50da90b78272001e253cc7086b0bdc52e46553414c5313e3fb4e.json @@ -0,0 +1 @@ +{"nodes": [{"id": "root_syslog_harness_repo_router_route_v3_py", "label": "route_v3.py", "file_type": "code", "source_file": "router/route_v3.py", "source_location": "L1"}, {"id": "root_syslog_harness_repo_router_route_v3_route", "label": "route()", "file_type": "code", "source_file": "router/route_v3.py", "source_location": "L1", "_callable": true}, {"id": "root_syslog_harness_repo_router_route_v3_moe_spillover", "label": "moe_spillover()", "file_type": "code", "source_file": "router/route_v3.py", "source_location": "L80", "_callable": true}, {"id": "root_syslog_harness_repo_router_route_v3_rationale_81", "label": "Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O", "file_type": "rationale", "source_file": "router/route_v3.py", "source_location": "L81"}], "edges": [{"source": "root_syslog_harness_repo_router_route_v3_py", "target": "root_syslog_harness_repo_router_route_v3_route", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/route_v3.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_route_v3_py", "target": "root_syslog_harness_repo_router_route_v3_moe_spillover", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/route_v3.py", "source_location": "L80", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_route_v3_route", "target": "root_syslog_harness_repo_router_route_v3_moe_spillover", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/route_v3.py", "source_location": "L63", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_route_v3_rationale_81", "target": "root_syslog_harness_repo_router_route_v3_moe_spillover", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/route_v3.py", "source_location": "L81", "weight": 1.0}], "raw_calls": [{"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L2", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "estimate_tokens", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L2", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L3", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L4", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L5", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L6", "receiver": "TIER_MODELS"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "available_models", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L7", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L9", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "list", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L14"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L14", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L15", "receiver": "p"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L15"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L19", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L26", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L29", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L32", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L37", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L38", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L39", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L40", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L41", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L42", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L44", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "split", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L45", "receiver": "first_msg"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L45"}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L49", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L52", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L58", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L64", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L70", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L75", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_moe_spillover", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L86", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_moe_spillover", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L88", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v3_moe_spillover", "callee": "random", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v3.py", "source_location": "L89", "receiver": "random"}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.10/53edfda5145db02bc35b9e9d8e06e5c731ce50c3a50cec3db65b3b886bed95a6.json b/graphify-out/cache/ast/v0.9.10/53edfda5145db02bc35b9e9d8e06e5c731ce50c3a50cec3db65b3b886bed95a6.json new file mode 100644 index 0000000..163cc6e --- /dev/null +++ b/graphify-out/cache/ast/v0.9.10/53edfda5145db02bc35b9e9d8e06e5c731ce50c3a50cec3db65b3b886bed95a6.json @@ -0,0 +1 @@ +{"nodes": [{"id": "root_syslog_harness_repo_router_http_patch_py", "label": "http_patch.py", "file_type": "code", "source_file": "router/http_patch.py", "source_location": "L1"}], "edges": [{"source": "root_syslog_harness_repo_router_http_patch_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/http_patch.py", "source_location": "L2", "weight": 1.0}], "raw_calls": []} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.10/654e97aa6df1872b0717f32f676c067d15b9795a0dc04a86936730a7e133c214.json b/graphify-out/cache/ast/v0.9.10/654e97aa6df1872b0717f32f676c067d15b9795a0dc04a86936730a7e133c214.json new file mode 100644 index 0000000..b5e5f3d --- /dev/null +++ b/graphify-out/cache/ast/v0.9.10/654e97aa6df1872b0717f32f676c067d15b9795a0dc04a86936730a7e133c214.json @@ -0,0 +1 @@ +{"nodes": [{"id": "root_syslog_harness_repo_dashboard_dashboard_py", "label": "dashboard.py", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L1"}, {"id": "root_syslog_harness_repo_dashboard_dashboard_fetch_state", "label": "fetch_state()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L10", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_broadcast_loop", "label": "broadcast_loop()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L17", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_dashboard", "label": "dashboard()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L308", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_api_state", "label": "api_state()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L311", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_api_scatter", "label": "api_scatter()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L314", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_api_performance", "label": "api_performance()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L324", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_api_timeseries", "label": "api_timeseries()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L334", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_api_stream", "label": "api_stream()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L343", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_health", "label": "health()", "file_type": "code", "source_file": "dashboard/dashboard.py", "source_location": "L359", "_callable": true}, {"id": "root_syslog_harness_repo_dashboard_dashboard_rationale_1", "label": "SyslogAI Harness Dashboard \u2014 Modern Design.", "file_type": "rationale", "source_file": "dashboard/dashboard.py", "source_location": "L1"}], "edges": [{"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L2", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L2", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "time", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L2", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "queue", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L2", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "threading", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L2", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "requests", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L3", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "flask", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L4", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_fetch_state", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L10", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_broadcast_loop", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L17", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_dashboard", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L308", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_api_state", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L311", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_api_scatter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L314", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_api_performance", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L324", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_api_timeseries", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L334", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_api_stream", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L343", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_py", "target": "root_syslog_harness_repo_dashboard_dashboard_health", "relation": "contains", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L359", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_broadcast_loop", "target": "root_syslog_harness_repo_dashboard_dashboard_fetch_state", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L20", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_api_state", "target": "root_syslog_harness_repo_dashboard_dashboard_fetch_state", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L311", "weight": 1.0}, {"source": "root_syslog_harness_repo_dashboard_dashboard_rationale_1", "target": "root_syslog_harness_repo_dashboard_dashboard_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "dashboard/dashboard.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_fetch_state", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L12", "receiver": "requests"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_fetch_state", "callee": "ROUTER_METRICS", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L12"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_fetch_state", "callee": "json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L13", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_fetch_state", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L15", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_broadcast_loop", "callee": "sleep", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L19", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_broadcast_loop", "callee": "dumps", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L20", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_broadcast_loop", "callee": "put", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L22", "receiver": "q"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_broadcast_loop", "callee": "remove", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L23", "receiver": "sse_subscribers"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_dashboard", "callee": "render_template_string", "is_member_call": false, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L308", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_dashboard", "callee": "DASHBOARD_HTML", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L308"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L315", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L316", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L318", "receiver": "requests"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_scatter", "callee": "json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L319", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_performance", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L325", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_performance", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L326", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_performance", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L328", "receiver": "requests"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_performance", "callee": "json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L329", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_timeseries", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L335", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_timeseries", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L337", "receiver": "requests"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_timeseries", "callee": "json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L338", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_stream", "callee": "stream_with_context", "is_member_call": false, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L356", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_dashboard_dashboard_api_stream", "callee": "ev", "is_member_call": false, "source_file": "/root/syslog-harness-repo/dashboard/dashboard.py", "source_location": "L356", "receiver": null}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.10/801feb2c0b7f4052cb2c4ef933d295d3494c8791766687b891c04cc7b5495d09.json b/graphify-out/cache/ast/v0.9.10/801feb2c0b7f4052cb2c4ef933d295d3494c8791766687b891c04cc7b5495d09.json new file mode 100644 index 0000000..ea377cf --- /dev/null +++ b/graphify-out/cache/ast/v0.9.10/801feb2c0b7f4052cb2c4ef933d295d3494c8791766687b891c04cc7b5495d09.json @@ -0,0 +1 @@ +{"nodes": [{"id": "root_syslog_harness_repo_maintenance_sh", "label": "maintenance.sh", "file_type": "code", "source_file": "maintenance.sh", "source_location": "L1", "metadata": {"language": "bash", "kind": "file"}}, {"id": "root_syslog_harness_repo_maintenance_sh__entry", "label": "maintenance.sh script", "file_type": "code", "source_file": "maintenance.sh", "source_location": "L1", "metadata": {"language": "bash", "kind": "bash_entrypoint"}}], "edges": [{"source": "root_syslog_harness_repo_maintenance_sh", "target": "root_syslog_harness_repo_maintenance_sh__entry", "relation": "contains", "confidence": "EXTRACTED", "source_file": "maintenance.sh", "source_location": "L1", "weight": 1.0}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.10/9c6817ae09f6bb5b2862f0282cacab7d4ce5da051e4ddc95e2e4099c7bf09716.json b/graphify-out/cache/ast/v0.9.10/9c6817ae09f6bb5b2862f0282cacab7d4ce5da051e4ddc95e2e4099c7bf09716.json new file mode 100644 index 0000000..3f52176 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.10/9c6817ae09f6bb5b2862f0282cacab7d4ce5da051e4ddc95e2e4099c7bf09716.json @@ -0,0 +1 @@ +{"nodes": [{"id": "root_syslog_harness_repo_router_router_py", "label": "router.py", "file_type": "code", "source_file": "router/router.py", "source_location": "L1"}, {"id": "root_syslog_harness_repo_router_router_check_rate_limit", "label": "check_rate_limit()", "file_type": "code", "source_file": "router/router.py", "source_location": "L71", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_get_redis", "label": "get_redis()", "file_type": "code", "source_file": "router/router.py", "source_location": "L94", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_counter_audit_loop", "label": "counter_audit_loop()", "file_type": "code", "source_file": "router/router.py", "source_location": "L115", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_gpu_active_count", "label": "gpu_active_count()", "file_type": "code", "source_file": "router/router.py", "source_location": "L140", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_gpu_incr", "label": "gpu_incr()", "file_type": "code", "source_file": "router/router.py", "source_location": "L146", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_gpu_decr", "label": "gpu_decr()", "file_type": "code", "source_file": "router/router.py", "source_location": "L149", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_check_gpu_health", "label": "check_gpu_health()", "file_type": "code", "source_file": "router/router.py", "source_location": "L155", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_available_models", "label": "available_models()", "file_type": "code", "source_file": "router/router.py", "source_location": "L177", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_estimate_tokens", "label": "estimate_tokens()", "file_type": "code", "source_file": "router/router.py", "source_location": "L179", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_store_perf_record", "label": "store_perf_record()", "file_type": "code", "source_file": "router/router.py", "source_location": "L183", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_is_gpu_busy", "label": "is_gpu_busy()", "file_type": "code", "source_file": "router/router.py", "source_location": "L215", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_gpu_health_score", "label": "gpu_health_score()", "file_type": "code", "source_file": "router/router.py", "source_location": "L224", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_select_best_gpu", "label": "select_best_gpu()", "file_type": "code", "source_file": "router/router.py", "source_location": "L238", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_is_circuit_tripped", "label": "is_circuit_tripped()", "file_type": "code", "source_file": "router/router.py", "source_location": "L281", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_trip_circuit", "label": "trip_circuit()", "file_type": "code", "source_file": "router/router.py", "source_location": "L287", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_half_open_probe", "label": "half_open_probe()", "file_type": "code", "source_file": "router/router.py", "source_location": "L296", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_route", "label": "route()", "file_type": "code", "source_file": "router/router.py", "source_location": "L305", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_moe_spillover", "label": "moe_spillover()", "file_type": "code", "source_file": "router/router.py", "source_location": "L385", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_clean_unicode", "label": "clean_unicode()", "file_type": "code", "source_file": "router/router.py", "source_location": "L398", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_clean_response", "label": "clean_response()", "file_type": "code", "source_file": "router/router.py", "source_location": "L406", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_get_metrics", "label": "get_metrics()", "file_type": "code", "source_file": "router/router.py", "source_location": "L412", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_bcast", "label": "bcast()", "file_type": "code", "source_file": "router/router.py", "source_location": "L430", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_chat", "label": "chat()", "file_type": "code", "source_file": "router/router.py", "source_location": "L442", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_performance", "label": "performance()", "file_type": "code", "source_file": "router/router.py", "source_location": "L618", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_scatter", "label": "scatter()", "file_type": "code", "source_file": "router/router.py", "source_location": "L735", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_models", "label": "models()", "file_type": "code", "source_file": "router/router.py", "source_location": "L765", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_health", "label": "health()", "file_type": "code", "source_file": "router/router.py", "source_location": "L770", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_metrics", "label": "metrics()", "file_type": "code", "source_file": "router/router.py", "source_location": "L780", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_metrics_timeseries", "label": "metrics_timeseries()", "file_type": "code", "source_file": "router/router.py", "source_location": "L783", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_metrics_circuit_breaker", "label": "metrics_circuit_breaker()", "file_type": "code", "source_file": "router/router.py", "source_location": "L810", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_metrics_gpu_health", "label": "metrics_gpu_health()", "file_type": "code", "source_file": "router/router.py", "source_location": "L827", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_metrics_latency", "label": "metrics_latency()", "file_type": "code", "source_file": "router/router.py", "source_location": "L858", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_stream", "label": "stream()", "file_type": "code", "source_file": "router/router.py", "source_location": "L875", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_admin_auth", "label": "_admin_auth()", "file_type": "code", "source_file": "router/router.py", "source_location": "L894", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_admin_keys", "label": "admin_keys()", "file_type": "code", "source_file": "router/router.py", "source_location": "L904", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "label": "admin_deprecation_summary()", "file_type": "code", "source_file": "router/router.py", "source_location": "L927", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_admin_generate_key", "label": "admin_generate_key()", "file_type": "code", "source_file": "router/router.py", "source_location": "L949", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_admin_revoke_key", "label": "admin_revoke_key()", "file_type": "code", "source_file": "router/router.py", "source_location": "L977", "_callable": true}, {"id": "root_syslog_harness_repo_router_router_rationale_72", "label": "Token bucket rate limiter using Redis. Returns (allowed, retry_after_or_remainin", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L72"}, {"id": "root_syslog_harness_repo_router_router_rationale_116", "label": "Every 30s, check GPU slots and reset counters if all slots idle.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L116"}, {"id": "root_syslog_harness_repo_router_router_rationale_141", "label": "Get number of in-flight requests for a GPU.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L141"}, {"id": "root_syslog_harness_repo_router_router_rationale_180", "label": "Estimate token count from messages. Uses JSON length / 3.5 (closer to real token", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L180"}, {"id": "root_syslog_harness_repo_router_router_rationale_184", "label": "Store detailed performance record in Redis for analytics.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L184"}, {"id": "root_syslog_harness_repo_router_router_rationale_216", "label": "Check if GPU is at or near max concurrent capacity.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L216"}, {"id": "root_syslog_harness_repo_router_router_rationale_225", "label": "Score a GPU based on VRAM, temperature, and load. Lower = better.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L225"}, {"id": "root_syslog_harness_repo_router_router_rationale_239", "label": "Pick best GPU, spreading agents across GPUs to prevent hotspots.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L239"}, {"id": "root_syslog_harness_repo_router_router_rationale_282", "label": "Check if a GPU host is currently blacklisted.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L282"}, {"id": "root_syslog_harness_repo_router_router_rationale_288", "label": "Blacklist a GPU host for a specified duration.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L288"}, {"id": "root_syslog_harness_repo_router_router_rationale_297", "label": "Check if a GPU host can be un-blacklisted.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L297"}, {"id": "root_syslog_harness_repo_router_router_rationale_386", "label": "Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L386"}, {"id": "root_syslog_harness_repo_router_router_rationale_619", "label": "Per-request performance analytics with percentiles per model/reason/agent.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L619"}, {"id": "root_syslog_harness_repo_router_router_rationale_736", "label": "Return individual data points for scatter plots (prompt_tokens vs latency).", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L736"}, {"id": "root_syslog_harness_repo_router_router_rationale_811", "label": "Expose circuit breaker status per model. Phase 1.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L811"}, {"id": "root_syslog_harness_repo_router_router_rationale_828", "label": "Live GPU health scores + circuit breaker + KPIs.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L828"}, {"id": "root_syslog_harness_repo_router_router_rationale_859", "label": "Lightweight latency summary for dashboard KPIs.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L859"}, {"id": "root_syslog_harness_repo_router_router_rationale_895", "label": "Require admin key for management endpoints.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L895"}, {"id": "root_syslog_harness_repo_router_router_rationale_905", "label": "List all API keys (masked) with agent, tier, and deprecation status.", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L905"}, {"id": "root_syslog_harness_repo_router_router_rationale_928", "label": "Summary of deprecated key usage (from Redis logs, if available).", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L928"}, {"id": "root_syslog_harness_repo_router_router_rationale_950", "label": "Generate a new API key for an agent. Body: {\"agent\": \"Name\", \"tier\": \"enterprise", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L950"}, {"id": "root_syslog_harness_repo_router_router_rationale_978", "label": "Revoke a deprecated key. Body: {\"agent\": \"Name\"} or {\"key_prefix\": \"sk-xxxx\"}", "file_type": "rationale", "source_file": "router/router.py", "source_location": "L978"}], "edges": [{"source": "root_syslog_harness_repo_router_router_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "time", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "logging", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "traceback", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "threading", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "queue", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "statistics", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "math", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L1", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "requests", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L2", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "redis", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L2", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "flask", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L3", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_check_rate_limit", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L71", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L94", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_counter_audit_loop", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L115", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L140", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_gpu_incr", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L146", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_gpu_decr", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L149", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_check_gpu_health", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L155", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_available_models", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L177", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_estimate_tokens", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L179", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_store_perf_record", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L183", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_is_gpu_busy", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L215", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_gpu_health_score", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L224", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_select_best_gpu", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L238", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_is_circuit_tripped", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L281", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_trip_circuit", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L287", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_half_open_probe", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L296", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_route", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L305", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_moe_spillover", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L385", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_clean_unicode", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L398", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_clean_response", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L406", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_get_metrics", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L412", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_bcast", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L430", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_chat", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L442", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_performance", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L618", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_scatter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L735", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_models", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L765", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_health", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L770", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_metrics", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L780", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_metrics_timeseries", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L783", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_metrics_circuit_breaker", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L810", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_metrics_gpu_health", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L827", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_metrics_latency", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L858", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_stream", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L875", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_admin_auth", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L894", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_admin_keys", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L904", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L927", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_admin_generate_key", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L949", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_py", "target": "root_syslog_harness_repo_router_router_admin_revoke_key", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L977", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_check_rate_limit", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L73", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_counter_audit_loop", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L119", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_gpu_incr", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L147", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_gpu_decr", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L150", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_available_models", "target": "root_syslog_harness_repo_router_router_check_gpu_health", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L177", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_store_perf_record", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L185", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_is_gpu_busy", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L217", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_gpu_health_score", "target": "root_syslog_harness_repo_router_router_check_gpu_health", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L226", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_gpu_health_score", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L231", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_select_best_gpu", "target": "root_syslog_harness_repo_router_router_gpu_health_score", "relation": "indirect_call", "context": "argument", "confidence": "INFERRED", "source_file": "router/router.py", "source_location": "L250", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_select_best_gpu", "target": "root_syslog_harness_repo_router_router_is_gpu_busy", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L253", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_select_best_gpu", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L268", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_is_circuit_tripped", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L283", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_trip_circuit", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L289", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_half_open_probe", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L298", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_route", "target": "root_syslog_harness_repo_router_router_estimate_tokens", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L306", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_route", "target": "root_syslog_harness_repo_router_router_available_models", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L312", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_route", "target": "root_syslog_harness_repo_router_router_is_circuit_tripped", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L312", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_route", "target": "root_syslog_harness_repo_router_router_is_gpu_busy", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L314", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_route", "target": "root_syslog_harness_repo_router_router_select_best_gpu", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L337", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_route", "target": "root_syslog_harness_repo_router_router_moe_spillover", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L368", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_moe_spillover", "target": "root_syslog_harness_repo_router_router_is_gpu_busy", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L391", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_clean_response", "target": "root_syslog_harness_repo_router_router_clean_unicode", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L409", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_get_metrics", "target": "root_syslog_harness_repo_router_router_check_gpu_health", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L415", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_get_metrics", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L416", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_bcast", "target": "root_syslog_harness_repo_router_router_get_metrics", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L431", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_check_rate_limit", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L464", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_estimate_tokens", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L482", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_route", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L487", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_gpu_incr", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L512", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L514", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_gpu_decr", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L530", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_trip_circuit", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L534", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_clean_unicode", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L543", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_store_perf_record", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L564", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_bcast", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L570", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_chat", "target": "root_syslog_harness_repo_router_router_clean_response", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L582", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_performance", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L620", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_scatter", "target": "root_syslog_harness_repo_router_router_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L737", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_health", "target": "root_syslog_harness_repo_router_router_check_gpu_health", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L773", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_health", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L774", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_health", "target": "root_syslog_harness_repo_router_router_available_models", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L777", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_metrics", "target": "root_syslog_harness_repo_router_router_get_metrics", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L780", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_metrics_gpu_health", "target": "root_syslog_harness_repo_router_router_check_gpu_health", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L831", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_metrics_gpu_health", "target": "root_syslog_harness_repo_router_router_gpu_health_score", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L832", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_metrics_gpu_health", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L833", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_admin_keys", "target": "root_syslog_harness_repo_router_router_admin_auth", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L906", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "target": "root_syslog_harness_repo_router_router_admin_auth", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L929", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_admin_generate_key", "target": "root_syslog_harness_repo_router_router_admin_auth", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L951", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_admin_revoke_key", "target": "root_syslog_harness_repo_router_router_admin_auth", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L979", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_72", "target": "root_syslog_harness_repo_router_router_check_rate_limit", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L72", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_116", "target": "root_syslog_harness_repo_router_router_counter_audit_loop", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L116", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_141", "target": "root_syslog_harness_repo_router_router_gpu_active_count", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L141", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_180", "target": "root_syslog_harness_repo_router_router_estimate_tokens", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L180", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_184", "target": "root_syslog_harness_repo_router_router_store_perf_record", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L184", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_216", "target": "root_syslog_harness_repo_router_router_is_gpu_busy", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L216", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_225", "target": "root_syslog_harness_repo_router_router_gpu_health_score", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L225", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_239", "target": "root_syslog_harness_repo_router_router_select_best_gpu", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L239", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_282", "target": "root_syslog_harness_repo_router_router_is_circuit_tripped", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L282", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_288", "target": "root_syslog_harness_repo_router_router_trip_circuit", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L288", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_297", "target": "root_syslog_harness_repo_router_router_half_open_probe", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L297", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_386", "target": "root_syslog_harness_repo_router_router_moe_spillover", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L386", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_619", "target": "root_syslog_harness_repo_router_router_performance", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L619", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_736", "target": "root_syslog_harness_repo_router_router_scatter", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L736", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_811", "target": "root_syslog_harness_repo_router_router_metrics_circuit_breaker", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L811", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_828", "target": "root_syslog_harness_repo_router_router_metrics_gpu_health", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L828", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_859", "target": "root_syslog_harness_repo_router_router_metrics_latency", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L859", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_895", "target": "root_syslog_harness_repo_router_router_admin_auth", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L895", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_905", "target": "root_syslog_harness_repo_router_router_admin_keys", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L905", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_928", "target": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L928", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_950", "target": "root_syslog_harness_repo_router_router_admin_generate_key", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L950", "weight": 1.0}, {"source": "root_syslog_harness_repo_router_router_rationale_978", "target": "root_syslog_harness_repo_router_router_admin_revoke_key", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "router/router.py", "source_location": "L978", "weight": 1.0}], "raw_calls": [{"caller_nid": "root_syslog_harness_repo_router_router_check_rate_limit", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L75", "receiver": "RATE_LIMIT_RPM"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_rate_limit", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L77", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_check_rate_limit", "callee": "ttl", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L79", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_rate_limit", "callee": "pipeline", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L82", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_rate_limit", "callee": "incr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L83", "receiver": "pipe"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_rate_limit", "callee": "expire", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L84", "receiver": "pipe"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_rate_limit", "callee": "execute", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L85", "receiver": "pipe"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_rate_limit", "callee": "ttl", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L87", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_redis", "callee": "ping", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L98", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_redis", "callee": "from_url", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L103", "receiver": "redis"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_redis", "callee": "REDIS_URL", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L103"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_redis", "callee": "ping", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L104", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_counter_audit_loop", "callee": "sleep", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L118", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_counter_audit_loop", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L120", "receiver": "GPU_URLS"}, {"caller_nid": "root_syslog_harness_repo_router_router_counter_audit_loop", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L122", "receiver": "requests"}, {"caller_nid": "root_syslog_harness_repo_router_router_counter_audit_loop", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L122", "receiver": "url"}, {"caller_nid": "root_syslog_harness_repo_router_router_counter_audit_loop", "callee": "json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L125", "receiver": "resp"}, {"caller_nid": "root_syslog_harness_repo_router_router_counter_audit_loop", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L126", "receiver": "s"}, {"caller_nid": "root_syslog_harness_repo_router_router_counter_audit_loop", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L128", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_counter_audit_loop", "callee": "info", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L131", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_gpu_active_count", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L143", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_gpu_incr", "callee": "incr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L147", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_gpu_decr", "callee": "decr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L152", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L156", "receiver": "GPU_SIDECARS"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L159", "receiver": "requests"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L161", "receiver": "resp"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L162", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L162", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L166", "receiver": "GPU_URLS"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L168", "receiver": "requests"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L168", "receiver": "gpu_url"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L173", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L173", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L173", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L173", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L173", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L173", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_check_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L173", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_estimate_tokens", "callee": "dumps", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L181", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_estimate_tokens", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L181"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "dumps", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L189", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L190", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "lpush", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L201", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "ltrim", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L202", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "lpush", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L204", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "ltrim", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L205", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "lpush", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L207", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "ltrim", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L208", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "lpush", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L210", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_store_perf_record", "callee": "ltrim", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L211", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_is_gpu_busy", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L218", "receiver": "GPU_MAX_CONCURRENT"}, {"caller_nid": "root_syslog_harness_repo_router_router_gpu_health_score", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L227", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_gpu_health_score", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L229", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_gpu_health_score", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L230", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_gpu_health_score", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L232", "receiver": "GPU_MAX_CONCURRENT"}, {"caller_nid": "root_syslog_harness_repo_router_router_select_best_gpu", "callee": "values", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L245", "receiver": "API_KEYS"}, {"caller_nid": "root_syslog_harness_repo_router_router_select_best_gpu", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L246", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_select_best_gpu", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L253", "receiver": "gpu_agent_counts"}, {"caller_nid": "root_syslog_harness_repo_router_router_select_best_gpu", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L258", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_is_circuit_tripped", "callee": "exists", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L285", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_trip_circuit", "callee": "incr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L293", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_trip_circuit", "callee": "warning", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L294", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_half_open_probe", "callee": "exists", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L301", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L306", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L307", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L308", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L309", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L310", "receiver": "TIER_MODELS"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "list", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L319"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L319", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L320", "receiver": "p"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L320"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L331", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L342", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L344", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L346", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L349", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "split", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L350", "receiver": "first_msg"}, {"caller_nid": "root_syslog_harness_repo_router_router_route", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L350"}, {"caller_nid": "root_syslog_harness_repo_router_router_moe_spillover", "callee": "random", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L394", "receiver": "random"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L399"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L400", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "chr", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L400", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L400", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "chr", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L400", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L401", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "chr", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L401", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L401", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "chr", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L401", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L402", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "chr", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L402", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L402", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "chr", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L402", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L403", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "chr", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L403", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L403", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "chr", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L403", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "decode", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L404", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_unicode", "callee": "encode", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L404", "receiver": "text"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_response", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L407"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_response", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L407", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_response", "callee": "list", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L408"}, {"caller_nid": "root_syslog_harness_repo_router_router_clean_response", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L409"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L413", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L416", "receiver": "GPU_MAX_CONCURRENT"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L420", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L421", "receiver": "API_KEYS"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L422", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L424", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "lrange", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L425", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_get_metrics", "callee": "loads", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L426", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_bcast", "callee": "dumps", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L431", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_bcast", "callee": "put", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L435", "receiver": "q"}, {"caller_nid": "root_syslog_harness_repo_router_router_bcast", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L436", "receiver": "dead"}, {"caller_nid": "root_syslog_harness_repo_router_router_bcast", "callee": "remove", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L437", "receiver": "sse_subscribers"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get_json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L444", "receiver": "request"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L445", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L445", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "warning", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L447", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L448", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L453", "receiver": "ki"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L454", "receiver": "API_KEYS"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L455", "receiver": "v"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L455", "receiver": "v"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "warning", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L456", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "incr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L461", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L466", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L468", "receiver": "RATE_LIMIT_RPM"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L470", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "warning", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L471", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L475", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "QUEUE_TIMEOUT", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L475"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L478", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L482", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "eval", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L484", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "SESSION_LUA_SCRIPT", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L484"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L488", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L491", "receiver": "d"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L492", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L494", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "warning", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L496", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "sleep", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L498", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L501", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "info", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L503", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L508", "receiver": "RATE_LIMIT_RPM"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L510", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "info", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L514", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L514", "receiver": "GPU_MAX_CONCURRENT"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "setex", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L517", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "incr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L521", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "incr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L521", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "incr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L521", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "incr", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L522", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "strftime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L522", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "lpush", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L523", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "dumps", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L523", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L523", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "ltrim", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L524", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L526", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "post", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L527", "receiver": "requests"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L529", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L535", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "iter_content", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L541", "receiver": "resp"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L544", "receiver": "chunks"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "split", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L548", "receiver": "buf"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "strip", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L549", "receiver": "line"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "startswith", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L550", "receiver": "line"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "strip", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L551", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "startswith", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L552", "receiver": "js"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L554", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "loads", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L554", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L560", "receiver": "stream_timings"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L561", "receiver": "stream_timings"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L562", "receiver": "stream_timings"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L563", "receiver": "stream_timings"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L566", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L571", "receiver": "GPU_CONTEXT"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L571", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L572", "receiver": "GPU_CONTEXT"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "stream_with_context", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L574", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "gen", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L574", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L577", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L582", "receiver": "resp"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L583", "receiver": "data"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L584", "receiver": "c"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L585", "receiver": "msg"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L585", "receiver": "msg"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L588", "receiver": "data"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L589", "receiver": "data"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L590", "receiver": "usage"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L591", "receiver": "usage"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L594", "receiver": "GPU_CONTEXT"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L594", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L595", "receiver": "GPU_CONTEXT"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L598", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L601", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "error", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L610", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L611", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "error", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L614", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L614"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "format_exc", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L614", "receiver": "traceback"}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L615", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_chat", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L615"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L620", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L622", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L622", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L623", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L626", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "lrange", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L627", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "loads", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L631", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L633", "receiver": "records"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L641", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L652", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L655", "receiver": "model_groups"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L660", "receiver": "models"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "mean", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L665", "receiver": "statistics"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L666", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L667", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L668", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "mean", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L671", "receiver": "statistics"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L672", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L673", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "mean", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L676", "receiver": "statistics"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L677", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L686", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L689", "receiver": "reason_groups"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L691", "receiver": "reasons"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "mean", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L694", "receiver": "statistics"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L695", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L703", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L706", "receiver": "agent_groups"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L709", "receiver": "agents"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "mean", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L712", "receiver": "statistics"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "mean", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L713", "receiver": "statistics"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "mean", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L722", "receiver": "statistics"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L723", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L724", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "pct", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L725", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "mean", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L727", "receiver": "statistics"}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L730", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L732", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_performance", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L732"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L737", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L739", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L739", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L740", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L741", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "lrange", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L742", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "loads", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L746", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L749", "receiver": "points"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L753", "receiver": "rec"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L754", "receiver": "rec"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L756", "receiver": "rec"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L757", "receiver": "rec"}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L760", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L762", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_scatter", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L762"}, {"caller_nid": "root_syslog_harness_repo_router_router_models", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L767", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_models", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L767", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_models", "callee": "_h", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L767", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_models", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L767", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_models", "callee": "_h", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L767", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L775", "receiver": "GPU_MAX_CONCURRENT"}, {"caller_nid": "root_syslog_harness_repo_router_router_health", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L777", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L780", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L784", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "keys", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L784", "receiver": "GPU_URLS"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "strftime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L787", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "gmtime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L787", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L787", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "strftime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L788", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "gmtime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L788", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L788", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "strftime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L790", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "gmtime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L790", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L790", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "strftime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L791", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "gmtime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L791", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L791", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "strftime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L793", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "gmtime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L793", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L793", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "strftime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L794", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "gmtime", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L794", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L794", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L801", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "format", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L801", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L802", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L803", "receiver": "counts"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_timeseries", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L805", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_circuit_breaker", "callee": "ttl", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L816", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_circuit_breaker", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L817", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_circuit_breaker", "callee": "exists", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L819", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_circuit_breaker", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L823", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L829", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L834", "receiver": "GPU_MAX_CONCURRENT"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "exists", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L835", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L836", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L837", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L839", "receiver": "GPU_LABELS"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L840", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L841", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L842", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L843", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L844", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L845", "receiver": "h"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "GPU_URLS", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L854"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_gpu_health", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L855", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L860", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "lrange", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L862", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L863", "receiver": "recent"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "loads", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L863", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L865", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L866", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L867", "receiver": "x"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L868", "receiver": "x"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L868", "receiver": "x"}, {"caller_nid": "root_syslog_harness_repo_router_router_metrics_latency", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L869", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_stream", "callee": "stream_with_context", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L888", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_stream", "callee": "ev", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L888", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_auth", "callee": "replace", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L898", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_auth", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L898", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_keys", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L907", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_keys", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L909", "receiver": "API_KEYS"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_keys", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L911", "receiver": "keys"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_keys", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L916", "receiver": "info"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_keys", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L919", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L930", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L932", "receiver": "API_KEYS"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L933", "receiver": "info"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L937", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L938", "receiver": "deprecated_agents"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_deprecation_summary", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L943", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L952", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "get_json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L953", "receiver": "request"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "strip", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L954", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L954", "receiver": "body"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L955", "receiver": "body"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L957", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L959", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "hexdigest", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L962", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "sha256", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L962", "receiver": "hashlib"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "token_bytes", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L962", "receiver": "secrets"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "token_hex", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L963", "receiver": "secrets"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "info", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L967", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_generate_key", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L968", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L980", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "get_json", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L981", "receiver": "request"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L982", "receiver": "body"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L983", "receiver": "body"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L986", "receiver": "API_KEYS"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L987", "receiver": "info"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L990", "receiver": "keys_to_remove"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "startswith", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L991", "receiver": "key"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L992", "receiver": "keys_to_remove"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "pop", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L994", "receiver": "API_KEYS"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "append", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L995", "receiver": "revoked"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "warning", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L996", "receiver": "log"}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L997", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_router_admin_revoke_key", "callee": "API_KEYS", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/router.py", "source_location": "L1000"}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.10/c9a9d2e5c9f1fb7d35a73f91c83a047ce92dc2d09c9ddab8fc2d6e82d92a093d.json b/graphify-out/cache/ast/v0.9.10/c9a9d2e5c9f1fb7d35a73f91c83a047ce92dc2d09c9ddab8fc2d6e82d92a093d.json new file mode 100644 index 0000000..ac5ac52 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.10/c9a9d2e5c9f1fb7d35a73f91c83a047ce92dc2d09c9ddab8fc2d6e82d92a093d.json @@ -0,0 +1 @@ +{"nodes": [{"id": "root_syslog_harness_repo_queue_service_queue_service_py", "label": "queue-service.py", "file_type": "code", "source_file": "queue-service/queue-service.py", "source_location": "L1"}, {"id": "root_syslog_harness_repo_queue_service_queue_service_get_redis", "label": "get_redis()", "file_type": "code", "source_file": "queue-service/queue-service.py", "source_location": "L35", "_callable": true}, {"id": "root_syslog_harness_repo_queue_service_queue_service_get_queue_depth", "label": "get_queue_depth()", "file_type": "code", "source_file": "queue-service/queue-service.py", "source_location": "L43", "_callable": true}, {"id": "root_syslog_harness_repo_queue_service_queue_service_check_gpu_health", "label": "check_gpu_health()", "file_type": "code", "source_file": "queue-service/queue-service.py", "source_location": "L50", "_callable": true}, {"id": "root_syslog_harness_repo_queue_service_queue_service_health", "label": "health()", "file_type": "code", "source_file": "queue-service/queue-service.py", "source_location": "L61", "_callable": true}, {"id": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "label": "enqueue()", "file_type": "code", "source_file": "queue-service/queue-service.py", "source_location": "L67", "_callable": true}, {"id": "root_syslog_harness_repo_queue_service_queue_service_status", "label": "status()", "file_type": "code", "source_file": "queue-service/queue-service.py", "source_location": "L99", "_callable": true}, {"id": "root_syslog_harness_repo_queue_service_queue_service_rationale_62", "label": "Nginx upstream health probe. Returns 200 if service is alive.", "file_type": "rationale", "source_file": "queue-service/queue-service.py", "source_location": "L62"}, {"id": "root_syslog_harness_repo_queue_service_queue_service_rationale_68", "label": "Fallback endpoint \u2014 Nginx calls this when all GPU upstreams are down.", "file_type": "rationale", "source_file": "queue-service/queue-service.py", "source_location": "L68"}, {"id": "root_syslog_harness_repo_queue_service_queue_service_rationale_100", "label": "GET queue depth + circuit breaker state + GPU health.", "file_type": "rationale", "source_file": "queue-service/queue-service.py", "source_location": "L100"}], "edges": [{"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L11", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L12", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L13", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "time", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L14", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "urllib_request", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L15", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "flask", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L16", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "root_syslog_harness_repo_queue_service_queue_service_get_redis", "relation": "contains", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L35", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "root_syslog_harness_repo_queue_service_queue_service_get_queue_depth", "relation": "contains", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L43", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "root_syslog_harness_repo_queue_service_queue_service_check_gpu_health", "relation": "contains", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L50", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "root_syslog_harness_repo_queue_service_queue_service_health", "relation": "contains", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L61", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "relation": "contains", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L67", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_py", "target": "root_syslog_harness_repo_queue_service_queue_service_status", "relation": "contains", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L99", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "target": "root_syslog_harness_repo_queue_service_queue_service_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L69", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "target": "root_syslog_harness_repo_queue_service_queue_service_get_queue_depth", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L73", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_status", "target": "root_syslog_harness_repo_queue_service_queue_service_get_redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L101", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_status", "target": "root_syslog_harness_repo_queue_service_queue_service_get_queue_depth", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L102", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_status", "target": "root_syslog_harness_repo_queue_service_queue_service_check_gpu_health", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L107", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_rationale_62", "target": "root_syslog_harness_repo_queue_service_queue_service_health", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L62", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_rationale_68", "target": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L68", "weight": 1.0}, {"source": "root_syslog_harness_repo_queue_service_queue_service_rationale_100", "target": "root_syslog_harness_repo_queue_service_queue_service_status", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "queue-service/queue-service.py", "source_location": "L100", "weight": 1.0}], "raw_calls": [{"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_get_redis", "callee": "Redis", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L38", "receiver": "redis"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_get_redis", "callee": "REDIS_HOST", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L38"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_get_redis", "callee": "REDIS_PORT", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L38"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_get_queue_depth", "callee": "llen", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L45", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_get_queue_depth", "callee": "QUEUE_KEY", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L45"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_check_gpu_health", "callee": "add_header", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L53", "receiver": "req"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_check_gpu_health", "callee": "urlopen", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L54", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_health", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L63", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L71", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L75", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "CIRCUIT_OPEN_THRESHOLD", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L78"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "get_data", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L82", "receiver": "request"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "startswith", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L83", "receiver": "k"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "rpush", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L84", "receiver": "r"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "QUEUE_KEY", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L84"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "dumps", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L84", "receiver": "json"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "time", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L87", "receiver": "time"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_enqueue", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L91", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_status", "callee": "items", "is_member_call": true, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L106", "receiver": "GPUS"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_status", "callee": "jsonify", "is_member_call": false, "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L109", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_status", "callee": "CIRCUIT_WARN_THRESHOLD", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L114"}, {"caller_nid": "root_syslog_harness_repo_queue_service_queue_service_status", "callee": "CIRCUIT_OPEN_THRESHOLD", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "/root/syslog-harness-repo/queue-service/queue-service.py", "source_location": "L115"}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.10/e96ac2ae879e0a876d4190daff4cc566d13798b97c4820f3efa47e06627bbbcb.json b/graphify-out/cache/ast/v0.9.10/e96ac2ae879e0a876d4190daff4cc566d13798b97c4820f3efa47e06627bbbcb.json new file mode 100644 index 0000000..4c07803 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.10/e96ac2ae879e0a876d4190daff4cc566d13798b97c4820f3efa47e06627bbbcb.json @@ -0,0 +1 @@ +{"nodes": [{"id": "root_syslog_harness_repo_router_route_v2_py", "label": "route_v2.py", "file_type": "code", "source_file": "router/route_v2.py", "source_location": "L1"}, {"id": "root_syslog_harness_repo_router_route_v2_route", "label": "route()", "file_type": "code", "source_file": "router/route_v2.py", "source_location": "L1", "_callable": true}], "edges": [{"source": "root_syslog_harness_repo_router_route_v2_py", "target": "root_syslog_harness_repo_router_route_v2_route", "relation": "contains", "confidence": "EXTRACTED", "source_file": "router/route_v2.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L2", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "estimate_tokens", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L2", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L3", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L4", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L5", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L6", "receiver": "TIER_MODELS"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "available_models", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L7", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L9", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "list", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L14"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L14", "receiver": "m"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L15", "receiver": "p"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L15"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L19", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L26", "receiver": "rd"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L29", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L32", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L37", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L38", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L39", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L40", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L41", "receiver": "hints"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L42", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "get", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L44", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "split", "is_member_call": true, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L45", "receiver": "first_msg"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L45"}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "is_gpu_busy", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L49", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L52", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L58", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L64", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L70", "receiver": null}, {"caller_nid": "root_syslog_harness_repo_router_route_v2_route", "callee": "select_best_gpu", "is_member_call": false, "source_file": "/root/syslog-harness-repo/router/route_v2.py", "source_location": "L75", "receiver": null}]} \ No newline at end of file diff --git a/graphify-out/cache/stat-index.json b/graphify-out/cache/stat-index.json new file mode 100644 index 0000000..d08918d --- /dev/null +++ b/graphify-out/cache/stat-index.json @@ -0,0 +1 @@ +{"/root/syslog-harness-repo/LITELLM-MIGRATION-PLAN.md":{"size":31561,"mtime_ns":1781468608211508160,"word_count":3762},"/root/syslog-harness-repo/MIGRATION_PLAN.md":{"size":1966,"mtime_ns":1781121183850310435,"word_count":303},"/root/syslog-harness-repo/README.md":{"size":2447,"mtime_ns":1781121183850310435,"word_count":377},"/root/syslog-harness-repo/dashboard/dashboard.html":{"size":8331,"mtime_ns":1781316813360201927,"word_count":415},"/root/syslog-harness-repo/dashboard/dashboard.py":{"size":29010,"mtime_ns":1781121183851178603,"word_count":1615,"hash":"654e97aa6df1872b0717f32f676c067d15b9795a0dc04a86936730a7e133c214"},"/root/syslog-harness-repo/dashboard/harness.html":{"size":23388,"mtime_ns":1781316813362649901,"word_count":1869},"/root/syslog-harness-repo/dashboard/requirements.txt":{"size":30,"mtime_ns":1781121183851178603,"word_count":2},"/root/syslog-harness-repo/docker-compose.yml":{"size":3900,"mtime_ns":1782224658037786319,"word_count":200},"/root/syslog-harness-repo/litellm_config.yaml":{"size":618,"mtime_ns":1781121183851178603,"word_count":39},"/root/syslog-harness-repo/maintenance.sh":{"size":1302,"mtime_ns":1781121183851178603,"word_count":192,"hash":"801feb2c0b7f4052cb2c4ef933d295d3494c8791766687b891c04cc7b5495d09"},"/root/syslog-harness-repo/phase0-dual-keys.json":{"size":1628,"mtime_ns":1781121183851610673,"word_count":110,"hash":"0f115313f2c86df2f57e48bdf180b768d6452d0337bae4e3c3d2b52b9f5267a7"},"/root/syslog-harness-repo/queue-service/queue-service.py":{"size":3284,"mtime_ns":1781121183851610673,"word_count":325,"hash":"c9a9d2e5c9f1fb7d35a73f91c83a047ce92dc2d09c9ddab8fc2d6e82d92a093d"},"/root/syslog-harness-repo/router/http_patch.py":{"size":3562,"mtime_ns":1781121183851788825,"word_count":290,"hash":"53edfda5145db02bc35b9e9d8e06e5c731ce50c3a50cec3db65b3b886bed95a6"},"/root/syslog-harness-repo/router/requirements.txt":{"size":43,"mtime_ns":1781121183851788825,"word_count":3},"/root/syslog-harness-repo/router/route_v2.py":{"size":3954,"mtime_ns":1781121183851788825,"word_count":435,"hash":"e96ac2ae879e0a876d4190daff4cc566d13798b97c4820f3efa47e06627bbbcb"},"/root/syslog-harness-repo/router/route_v3.py":{"size":4703,"mtime_ns":1781121183851788825,"word_count":504,"hash":"30b202626b1f50da90b78272001e253cc7086b0bdc52e46553414c5313e3fb4e"},"/root/syslog-harness-repo/router/router.py":{"size":44307,"mtime_ns":1781316813360201927,"word_count":4198,"hash":"9c6817ae09f6bb5b2862f0282cacab7d4ce5da051e4ddc95e2e4099c7bf09716"},"/root/syslog-harness-repo/ssl/README.md":{"size":204,"mtime_ns":1781121183851788825,"word_count":28}} \ No newline at end of file diff --git a/graphify-out/graph.json b/graphify-out/graph.json new file mode 100644 index 0000000..8ddf7e5 --- /dev/null +++ b/graphify-out/graph.json @@ -0,0 +1,2506 @@ +{ + "directed": false, + "multigraph": false, + "graph": {}, + "nodes": [ + { + "label": "dashboard.py", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "_origin": "ast", + "id": "dashboard_dashboard", + "community": 1, + "norm_label": "dashboard.py" + }, + { + "label": "fetch_state()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L10", + "_origin": "ast", + "id": "dashboard_dashboard_fetch_state", + "community": 1, + "norm_label": "fetch_state()" + }, + { + "label": "broadcast_loop()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L17", + "_origin": "ast", + "id": "dashboard_dashboard_broadcast_loop", + "community": 1, + "norm_label": "broadcast_loop()" + }, + { + "label": "dashboard()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L308", + "_origin": "ast", + "id": "dashboard_dashboard_dashboard", + "community": 1, + "norm_label": "dashboard()" + }, + { + "label": "api_state()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "_origin": "ast", + "id": "dashboard_dashboard_api_state", + "community": 1, + "norm_label": "api_state()" + }, + { + "label": "api_scatter()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L314", + "_origin": "ast", + "id": "dashboard_dashboard_api_scatter", + "community": 1, + "norm_label": "api_scatter()" + }, + { + "label": "api_performance()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L324", + "_origin": "ast", + "id": "dashboard_dashboard_api_performance", + "community": 1, + "norm_label": "api_performance()" + }, + { + "label": "api_timeseries()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L334", + "_origin": "ast", + "id": "dashboard_dashboard_api_timeseries", + "community": 1, + "norm_label": "api_timeseries()" + }, + { + "label": "api_stream()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L343", + "_origin": "ast", + "id": "dashboard_dashboard_api_stream", + "community": 1, + "norm_label": "api_stream()" + }, + { + "label": "health()", + "file_type": "code", + "source_file": "dashboard/dashboard.py", + "source_location": "L359", + "_origin": "ast", + "id": "dashboard_dashboard_health", + "community": 1, + "norm_label": "health()" + }, + { + "label": "SyslogAI Harness Dashboard \u2014 Modern Design.", + "file_type": "rationale", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "_origin": "ast", + "id": "dashboard_dashboard_rationale_1", + "community": 1, + "norm_label": "syslogai harness dashboard \u2014 modern design." + }, + { + "label": "maintenance.sh", + "file_type": "code", + "source_file": "maintenance.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "file" + }, + "_origin": "ast", + "id": "maintenance", + "community": 8, + "norm_label": "maintenance.sh" + }, + { + "label": "maintenance.sh script", + "file_type": "code", + "source_file": "maintenance.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "bash_entrypoint" + }, + "_origin": "ast", + "id": "maintenance_sh__entry", + "community": 8, + "norm_label": "maintenance.sh script" + }, + { + "label": "queue-service.py", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L1", + "_origin": "ast", + "id": "queue_service_queue_service", + "community": 2, + "norm_label": "queue-service.py" + }, + { + "label": "get_redis()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L35", + "_origin": "ast", + "id": "queue_service_queue_service_get_redis", + "community": 2, + "norm_label": "get_redis()" + }, + { + "label": "get_queue_depth()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L43", + "_origin": "ast", + "id": "queue_service_queue_service_get_queue_depth", + "community": 2, + "norm_label": "get_queue_depth()" + }, + { + "label": "check_gpu_health()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L50", + "_origin": "ast", + "id": "queue_service_queue_service_check_gpu_health", + "community": 2, + "norm_label": "check_gpu_health()" + }, + { + "label": "health()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L61", + "_origin": "ast", + "id": "queue_service_queue_service_health", + "community": 2, + "norm_label": "health()" + }, + { + "label": "enqueue()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L67", + "_origin": "ast", + "id": "queue_service_queue_service_enqueue", + "community": 2, + "norm_label": "enqueue()" + }, + { + "label": "status()", + "file_type": "code", + "source_file": "queue-service/queue-service.py", + "source_location": "L99", + "_origin": "ast", + "id": "queue_service_queue_service_status", + "community": 2, + "norm_label": "status()" + }, + { + "label": "Nginx upstream health probe. Returns 200 if service is alive.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L62", + "_origin": "ast", + "id": "queue_service_queue_service_rationale_62", + "community": 2, + "norm_label": "nginx upstream health probe. returns 200 if service is alive." + }, + { + "label": "Fallback endpoint \u2014 Nginx calls this when all GPU upstreams are down.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L68", + "_origin": "ast", + "id": "queue_service_queue_service_rationale_68", + "community": 2, + "norm_label": "fallback endpoint \u2014 nginx calls this when all gpu upstreams are down." + }, + { + "label": "GET queue depth + circuit breaker state + GPU health.", + "file_type": "rationale", + "source_file": "queue-service/queue-service.py", + "source_location": "L100", + "_origin": "ast", + "id": "queue_service_queue_service_rationale_100", + "community": 2, + "norm_label": "get queue depth + circuit breaker state + gpu health." + }, + { + "label": "http_patch.py", + "file_type": "code", + "source_file": "router/http_patch.py", + "source_location": "L1", + "_origin": "ast", + "id": "router_http_patch", + "community": 13, + "norm_label": "http_patch.py" + }, + { + "label": "route_v2.py", + "file_type": "code", + "source_file": "router/route_v2.py", + "source_location": "L1", + "_origin": "ast", + "id": "router_route_v2", + "community": 0, + "norm_label": "route_v2.py" + }, + { + "label": "route()", + "file_type": "code", + "source_file": "router/route_v2.py", + "source_location": "L1", + "_origin": "ast", + "id": "router_route_v2_route", + "community": 0, + "norm_label": "route()" + }, + { + "label": "route_v3.py", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L1", + "_origin": "ast", + "id": "router_route_v3", + "community": 0, + "norm_label": "route_v3.py" + }, + { + "label": "route()", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L1", + "_origin": "ast", + "id": "router_route_v3_route", + "community": 0, + "norm_label": "route()" + }, + { + "label": "moe_spillover()", + "file_type": "code", + "source_file": "router/route_v3.py", + "source_location": "L80", + "_origin": "ast", + "id": "router_route_v3_moe_spillover", + "community": 0, + "norm_label": "moe_spillover()" + }, + { + "label": "Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O", + "file_type": "rationale", + "source_file": "router/route_v3.py", + "source_location": "L81", + "_origin": "ast", + "id": "router_route_v3_rationale_81", + "community": 0, + "norm_label": "spill 40% of moe-first traffic to dense to prevent strix halo overheating. o" + }, + { + "label": "router.py", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L1", + "_origin": "ast", + "id": "router_router", + "community": 4, + "norm_label": "router.py" + }, + { + "label": "check_rate_limit()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L71", + "_origin": "ast", + "id": "router_router_check_rate_limit", + "community": 7, + "norm_label": "check_rate_limit()" + }, + { + "label": "get_redis()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L94", + "_origin": "ast", + "id": "router_router_get_redis", + "community": 5, + "norm_label": "get_redis()" + }, + { + "label": "counter_audit_loop()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L115", + "_origin": "ast", + "id": "router_router_counter_audit_loop", + "community": 9, + "norm_label": "counter_audit_loop()" + }, + { + "label": "gpu_active_count()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L140", + "_origin": "ast", + "id": "router_router_gpu_active_count", + "community": 6, + "norm_label": "gpu_active_count()" + }, + { + "label": "gpu_incr()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L146", + "_origin": "ast", + "id": "router_router_gpu_incr", + "community": 5, + "norm_label": "gpu_incr()" + }, + { + "label": "gpu_decr()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L149", + "_origin": "ast", + "id": "router_router_gpu_decr", + "community": 5, + "norm_label": "gpu_decr()" + }, + { + "label": "check_gpu_health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L155", + "_origin": "ast", + "id": "router_router_check_gpu_health", + "community": 6, + "norm_label": "check_gpu_health()" + }, + { + "label": "available_models()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L177", + "_origin": "ast", + "id": "router_router_available_models", + "community": 0, + "norm_label": "available_models()" + }, + { + "label": "estimate_tokens()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L179", + "_origin": "ast", + "id": "router_router_estimate_tokens", + "community": 0, + "norm_label": "estimate_tokens()" + }, + { + "label": "store_perf_record()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L183", + "_origin": "ast", + "id": "router_router_store_perf_record", + "community": 7, + "norm_label": "store_perf_record()" + }, + { + "label": "is_gpu_busy()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L215", + "_origin": "ast", + "id": "router_router_is_gpu_busy", + "community": 0, + "norm_label": "is_gpu_busy()" + }, + { + "label": "gpu_health_score()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L224", + "_origin": "ast", + "id": "router_router_gpu_health_score", + "community": 6, + "norm_label": "gpu_health_score()" + }, + { + "label": "select_best_gpu()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L238", + "_origin": "ast", + "id": "router_router_select_best_gpu", + "community": 0, + "norm_label": "select_best_gpu()" + }, + { + "label": "is_circuit_tripped()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L281", + "_origin": "ast", + "id": "router_router_is_circuit_tripped", + "community": 5, + "norm_label": "is_circuit_tripped()" + }, + { + "label": "trip_circuit()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L287", + "_origin": "ast", + "id": "router_router_trip_circuit", + "community": 11, + "norm_label": "trip_circuit()" + }, + { + "label": "half_open_probe()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L296", + "_origin": "ast", + "id": "router_router_half_open_probe", + "community": 5, + "norm_label": "half_open_probe()" + }, + { + "label": "route()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L305", + "_origin": "ast", + "id": "router_router_route", + "community": 0, + "norm_label": "route()" + }, + { + "label": "moe_spillover()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L385", + "_origin": "ast", + "id": "router_router_moe_spillover", + "community": 0, + "norm_label": "moe_spillover()" + }, + { + "label": "clean_unicode()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L398", + "_origin": "ast", + "id": "router_router_clean_unicode", + "community": 7, + "norm_label": "clean_unicode()" + }, + { + "label": "clean_response()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L406", + "_origin": "ast", + "id": "router_router_clean_response", + "community": 7, + "norm_label": "clean_response()" + }, + { + "label": "get_metrics()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L412", + "_origin": "ast", + "id": "router_router_get_metrics", + "community": 4, + "norm_label": "get_metrics()" + }, + { + "label": "bcast()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L430", + "_origin": "ast", + "id": "router_router_bcast", + "community": 4, + "norm_label": "bcast()" + }, + { + "label": "chat()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L442", + "_origin": "ast", + "id": "router_router_chat", + "community": 7, + "norm_label": "chat()" + }, + { + "label": "performance()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L618", + "_origin": "ast", + "id": "router_router_performance", + "community": 5, + "norm_label": "performance()" + }, + { + "label": "scatter()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L735", + "_origin": "ast", + "id": "router_router_scatter", + "community": 12, + "norm_label": "scatter()" + }, + { + "label": "models()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L765", + "_origin": "ast", + "id": "router_router_models", + "community": 4, + "norm_label": "models()" + }, + { + "label": "health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L770", + "_origin": "ast", + "id": "router_router_health", + "community": 6, + "norm_label": "health()" + }, + { + "label": "metrics()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L780", + "_origin": "ast", + "id": "router_router_metrics", + "community": 4, + "norm_label": "metrics()" + }, + { + "label": "metrics_timeseries()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L783", + "_origin": "ast", + "id": "router_router_metrics_timeseries", + "community": 4, + "norm_label": "metrics_timeseries()" + }, + { + "label": "metrics_circuit_breaker()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L810", + "_origin": "ast", + "id": "router_router_metrics_circuit_breaker", + "community": 4, + "norm_label": "metrics_circuit_breaker()" + }, + { + "label": "metrics_gpu_health()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L827", + "_origin": "ast", + "id": "router_router_metrics_gpu_health", + "community": 6, + "norm_label": "metrics_gpu_health()" + }, + { + "label": "metrics_latency()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L858", + "_origin": "ast", + "id": "router_router_metrics_latency", + "community": 10, + "norm_label": "metrics_latency()" + }, + { + "label": "stream()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L875", + "_origin": "ast", + "id": "router_router_stream", + "community": 4, + "norm_label": "stream()" + }, + { + "label": "_admin_auth()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L894", + "_origin": "ast", + "id": "router_router_admin_auth", + "community": 3, + "norm_label": "_admin_auth()" + }, + { + "label": "admin_keys()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L904", + "_origin": "ast", + "id": "router_router_admin_keys", + "community": 3, + "norm_label": "admin_keys()" + }, + { + "label": "admin_deprecation_summary()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L927", + "_origin": "ast", + "id": "router_router_admin_deprecation_summary", + "community": 3, + "norm_label": "admin_deprecation_summary()" + }, + { + "label": "admin_generate_key()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L949", + "_origin": "ast", + "id": "router_router_admin_generate_key", + "community": 3, + "norm_label": "admin_generate_key()" + }, + { + "label": "admin_revoke_key()", + "file_type": "code", + "source_file": "router/router.py", + "source_location": "L977", + "_origin": "ast", + "id": "router_router_admin_revoke_key", + "community": 3, + "norm_label": "admin_revoke_key()" + }, + { + "label": "Token bucket rate limiter using Redis. Returns (allowed, retry_after_or_remainin", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L72", + "_origin": "ast", + "id": "router_router_rationale_72", + "community": 7, + "norm_label": "token bucket rate limiter using redis. returns (allowed, retry_after_or_remainin" + }, + { + "label": "Every 30s, check GPU slots and reset counters if all slots idle.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L116", + "_origin": "ast", + "id": "router_router_rationale_116", + "community": 9, + "norm_label": "every 30s, check gpu slots and reset counters if all slots idle." + }, + { + "label": "Get number of in-flight requests for a GPU.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L141", + "_origin": "ast", + "id": "router_router_rationale_141", + "community": 6, + "norm_label": "get number of in-flight requests for a gpu." + }, + { + "label": "Estimate token count from messages. Uses JSON length / 3.5 (closer to real token", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L180", + "_origin": "ast", + "id": "router_router_rationale_180", + "community": 0, + "norm_label": "estimate token count from messages. uses json length / 3.5 (closer to real token" + }, + { + "label": "Store detailed performance record in Redis for analytics.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L184", + "_origin": "ast", + "id": "router_router_rationale_184", + "community": 7, + "norm_label": "store detailed performance record in redis for analytics." + }, + { + "label": "Check if GPU is at or near max concurrent capacity.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L216", + "_origin": "ast", + "id": "router_router_rationale_216", + "community": 0, + "norm_label": "check if gpu is at or near max concurrent capacity." + }, + { + "label": "Score a GPU based on VRAM, temperature, and load. Lower = better.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L225", + "_origin": "ast", + "id": "router_router_rationale_225", + "community": 6, + "norm_label": "score a gpu based on vram, temperature, and load. lower = better." + }, + { + "label": "Pick best GPU, spreading agents across GPUs to prevent hotspots.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L239", + "_origin": "ast", + "id": "router_router_rationale_239", + "community": 0, + "norm_label": "pick best gpu, spreading agents across gpus to prevent hotspots." + }, + { + "label": "Check if a GPU host is currently blacklisted.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L282", + "_origin": "ast", + "id": "router_router_rationale_282", + "community": 5, + "norm_label": "check if a gpu host is currently blacklisted." + }, + { + "label": "Blacklist a GPU host for a specified duration.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L288", + "_origin": "ast", + "id": "router_router_rationale_288", + "community": 11, + "norm_label": "blacklist a gpu host for a specified duration." + }, + { + "label": "Check if a GPU host can be un-blacklisted.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L297", + "_origin": "ast", + "id": "router_router_rationale_297", + "community": 5, + "norm_label": "check if a gpu host can be un-blacklisted." + }, + { + "label": "Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. O", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L386", + "_origin": "ast", + "id": "router_router_rationale_386", + "community": 0, + "norm_label": "spill 40% of moe-first traffic to dense to prevent strix halo overheating. o" + }, + { + "label": "Per-request performance analytics with percentiles per model/reason/agent.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L619", + "_origin": "ast", + "id": "router_router_rationale_619", + "community": 5, + "norm_label": "per-request performance analytics with percentiles per model/reason/agent." + }, + { + "label": "Return individual data points for scatter plots (prompt_tokens vs latency).", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L736", + "_origin": "ast", + "id": "router_router_rationale_736", + "community": 12, + "norm_label": "return individual data points for scatter plots (prompt_tokens vs latency)." + }, + { + "label": "Expose circuit breaker status per model. Phase 1.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L811", + "_origin": "ast", + "id": "router_router_rationale_811", + "community": 4, + "norm_label": "expose circuit breaker status per model. phase 1." + }, + { + "label": "Live GPU health scores + circuit breaker + KPIs.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L828", + "_origin": "ast", + "id": "router_router_rationale_828", + "community": 6, + "norm_label": "live gpu health scores + circuit breaker + kpis." + }, + { + "label": "Lightweight latency summary for dashboard KPIs.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L859", + "_origin": "ast", + "id": "router_router_rationale_859", + "community": 10, + "norm_label": "lightweight latency summary for dashboard kpis." + }, + { + "label": "Require admin key for management endpoints.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L895", + "_origin": "ast", + "id": "router_router_rationale_895", + "community": 3, + "norm_label": "require admin key for management endpoints." + }, + { + "label": "List all API keys (masked) with agent, tier, and deprecation status.", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L905", + "_origin": "ast", + "id": "router_router_rationale_905", + "community": 3, + "norm_label": "list all api keys (masked) with agent, tier, and deprecation status." + }, + { + "label": "Summary of deprecated key usage (from Redis logs, if available).", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L928", + "_origin": "ast", + "id": "router_router_rationale_928", + "community": 3, + "norm_label": "summary of deprecated key usage (from redis logs, if available)." + }, + { + "label": "Generate a new API key for an agent. Body: {\"agent\": \"Name\", \"tier\": \"enterprise", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L950", + "_origin": "ast", + "id": "router_router_rationale_950", + "community": 3, + "norm_label": "generate a new api key for an agent. body: {\"agent\": \"name\", \"tier\": \"enterprise" + }, + { + "label": "Revoke a deprecated key. Body: {\"agent\": \"Name\"} or {\"key_prefix\": \"sk-xxxx\"}", + "file_type": "rationale", + "source_file": "router/router.py", + "source_location": "L978", + "_origin": "ast", + "id": "router_router_rationale_978", + "community": 3, + "norm_label": "revoke a deprecated key. body: {\"agent\": \"name\"} or {\"key_prefix\": \"sk-xxxx\"}" + } + ], + "links": [ + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L324", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_performance", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L314", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_scatter", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_state", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L343", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_stream", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L334", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_api_timeseries", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L17", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_broadcast_loop", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L308", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_dashboard", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L10", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_fetch_state", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L359", + "weight": 1.0, + "source": "dashboard_dashboard", + "target": "dashboard_dashboard_health", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L1", + "weight": 1.0, + "source": "dashboard_dashboard_rationale_1", + "target": "dashboard_dashboard", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L311", + "weight": 1.0, + "source": "dashboard_dashboard_api_state", + "target": "dashboard_dashboard_fetch_state", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "dashboard/dashboard.py", + "source_location": "L20", + "weight": 1.0, + "source": "dashboard_dashboard_broadcast_loop", + "target": "dashboard_dashboard_fetch_state", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "maintenance.sh", + "source_location": "L1", + "weight": 1.0, + "source": "maintenance", + "target": "maintenance_sh__entry", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L50", + "weight": 1.0, + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_check_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L67", + "weight": 1.0, + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_enqueue", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L43", + "weight": 1.0, + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_get_queue_depth", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L35", + "weight": 1.0, + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L61", + "weight": 1.0, + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_health", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L99", + "weight": 1.0, + "source": "queue_service_queue_service", + "target": "queue_service_queue_service_status", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L69", + "weight": 1.0, + "source": "queue_service_queue_service_enqueue", + "target": "queue_service_queue_service_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L101", + "weight": 1.0, + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L73", + "weight": 1.0, + "source": "queue_service_queue_service_enqueue", + "target": "queue_service_queue_service_get_queue_depth", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L102", + "weight": 1.0, + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_get_queue_depth", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L107", + "weight": 1.0, + "source": "queue_service_queue_service_status", + "target": "queue_service_queue_service_check_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L62", + "weight": 1.0, + "source": "queue_service_queue_service_rationale_62", + "target": "queue_service_queue_service_health", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L68", + "weight": 1.0, + "source": "queue_service_queue_service_rationale_68", + "target": "queue_service_queue_service_enqueue", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "queue-service/queue-service.py", + "source_location": "L100", + "weight": 1.0, + "source": "queue_service_queue_service_rationale_100", + "target": "queue_service_queue_service_status", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v2.py", + "source_location": "L1", + "weight": 1.0, + "source": "router_route_v2", + "target": "router_route_v2_route", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L7", + "weight": 1.0, + "source": "router_route_v2_route", + "target": "router_router_available_models" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L2", + "weight": 1.0, + "source": "router_route_v2_route", + "target": "router_router_estimate_tokens" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L9", + "weight": 1.0, + "source": "router_route_v2_route", + "target": "router_router_is_gpu_busy" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v2.py", + "source_location": "L32", + "weight": 1.0, + "source": "router_route_v2_route", + "target": "router_router_select_best_gpu" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L80", + "weight": 1.0, + "source": "router_route_v3", + "target": "router_route_v3_moe_spillover", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L1", + "weight": 1.0, + "source": "router_route_v3", + "target": "router_route_v3_route", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L63", + "weight": 1.0, + "source": "router_route_v3_route", + "target": "router_route_v3_moe_spillover", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L7", + "weight": 1.0, + "source": "router_route_v3_route", + "target": "router_router_available_models" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L2", + "weight": 1.0, + "source": "router_route_v3_route", + "target": "router_router_estimate_tokens" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L9", + "weight": 1.0, + "source": "router_route_v3_route", + "target": "router_router_is_gpu_busy" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L32", + "weight": 1.0, + "source": "router_route_v3_route", + "target": "router_router_select_best_gpu" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "router/route_v3.py", + "source_location": "L86", + "weight": 1.0, + "source": "router_route_v3_moe_spillover", + "target": "router_router_is_gpu_busy" + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/route_v3.py", + "source_location": "L81", + "weight": 1.0, + "source": "router_route_v3_rationale_81", + "target": "router_route_v3_moe_spillover", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L894", + "weight": 1.0, + "source": "router_router", + "target": "router_router_admin_auth", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L927", + "weight": 1.0, + "source": "router_router", + "target": "router_router_admin_deprecation_summary", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L949", + "weight": 1.0, + "source": "router_router", + "target": "router_router_admin_generate_key", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L904", + "weight": 1.0, + "source": "router_router", + "target": "router_router_admin_keys", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L977", + "weight": 1.0, + "source": "router_router", + "target": "router_router_admin_revoke_key", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L177", + "weight": 1.0, + "source": "router_router", + "target": "router_router_available_models", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L430", + "weight": 1.0, + "source": "router_router", + "target": "router_router_bcast", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L442", + "weight": 1.0, + "source": "router_router", + "target": "router_router_chat", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L155", + "weight": 1.0, + "source": "router_router", + "target": "router_router_check_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L71", + "weight": 1.0, + "source": "router_router", + "target": "router_router_check_rate_limit", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L406", + "weight": 1.0, + "source": "router_router", + "target": "router_router_clean_response", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L398", + "weight": 1.0, + "source": "router_router", + "target": "router_router_clean_unicode", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L115", + "weight": 1.0, + "source": "router_router", + "target": "router_router_counter_audit_loop", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L179", + "weight": 1.0, + "source": "router_router", + "target": "router_router_estimate_tokens", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L412", + "weight": 1.0, + "source": "router_router", + "target": "router_router_get_metrics", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L94", + "weight": 1.0, + "source": "router_router", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L140", + "weight": 1.0, + "source": "router_router", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L149", + "weight": 1.0, + "source": "router_router", + "target": "router_router_gpu_decr", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L224", + "weight": 1.0, + "source": "router_router", + "target": "router_router_gpu_health_score", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L146", + "weight": 1.0, + "source": "router_router", + "target": "router_router_gpu_incr", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L296", + "weight": 1.0, + "source": "router_router", + "target": "router_router_half_open_probe", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L770", + "weight": 1.0, + "source": "router_router", + "target": "router_router_health", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L281", + "weight": 1.0, + "source": "router_router", + "target": "router_router_is_circuit_tripped", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L215", + "weight": 1.0, + "source": "router_router", + "target": "router_router_is_gpu_busy", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L780", + "weight": 1.0, + "source": "router_router", + "target": "router_router_metrics", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L810", + "weight": 1.0, + "source": "router_router", + "target": "router_router_metrics_circuit_breaker", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L827", + "weight": 1.0, + "source": "router_router", + "target": "router_router_metrics_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L858", + "weight": 1.0, + "source": "router_router", + "target": "router_router_metrics_latency", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L783", + "weight": 1.0, + "source": "router_router", + "target": "router_router_metrics_timeseries", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L765", + "weight": 1.0, + "source": "router_router", + "target": "router_router_models", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L385", + "weight": 1.0, + "source": "router_router", + "target": "router_router_moe_spillover", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L618", + "weight": 1.0, + "source": "router_router", + "target": "router_router_performance", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L305", + "weight": 1.0, + "source": "router_router", + "target": "router_router_route", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L735", + "weight": 1.0, + "source": "router_router", + "target": "router_router_scatter", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L238", + "weight": 1.0, + "source": "router_router", + "target": "router_router_select_best_gpu", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L183", + "weight": 1.0, + "source": "router_router", + "target": "router_router_store_perf_record", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L875", + "weight": 1.0, + "source": "router_router", + "target": "router_router_stream", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L287", + "weight": 1.0, + "source": "router_router", + "target": "router_router_trip_circuit", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L464", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_check_rate_limit", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L73", + "weight": 1.0, + "source": "router_router_check_rate_limit", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L72", + "weight": 1.0, + "source": "router_router_rationale_72", + "target": "router_router_check_rate_limit", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L119", + "weight": 1.0, + "source": "router_router_counter_audit_loop", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L150", + "weight": 1.0, + "source": "router_router_gpu_decr", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L147", + "weight": 1.0, + "source": "router_router_gpu_incr", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L298", + "weight": 1.0, + "source": "router_router_half_open_probe", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L283", + "weight": 1.0, + "source": "router_router_is_circuit_tripped", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L620", + "weight": 1.0, + "source": "router_router_performance", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L737", + "weight": 1.0, + "source": "router_router_scatter", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L185", + "weight": 1.0, + "source": "router_router_store_perf_record", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L289", + "weight": 1.0, + "source": "router_router_trip_circuit", + "target": "router_router_get_redis", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L116", + "weight": 1.0, + "source": "router_router_rationale_116", + "target": "router_router_counter_audit_loop", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L514", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L416", + "weight": 1.0, + "source": "router_router_get_metrics", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L231", + "weight": 1.0, + "source": "router_router_gpu_health_score", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L774", + "weight": 1.0, + "source": "router_router_health", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L217", + "weight": 1.0, + "source": "router_router_is_gpu_busy", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L833", + "weight": 1.0, + "source": "router_router_metrics_gpu_health", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L141", + "weight": 1.0, + "source": "router_router_rationale_141", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L268", + "weight": 1.0, + "source": "router_router_select_best_gpu", + "target": "router_router_gpu_active_count", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L512", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_gpu_incr", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L530", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_gpu_decr", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L177", + "weight": 1.0, + "source": "router_router_available_models", + "target": "router_router_check_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L415", + "weight": 1.0, + "source": "router_router_get_metrics", + "target": "router_router_check_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L226", + "weight": 1.0, + "source": "router_router_gpu_health_score", + "target": "router_router_check_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L773", + "weight": 1.0, + "source": "router_router_health", + "target": "router_router_check_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L831", + "weight": 1.0, + "source": "router_router_metrics_gpu_health", + "target": "router_router_check_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L777", + "weight": 1.0, + "source": "router_router_health", + "target": "router_router_available_models", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L312", + "weight": 1.0, + "source": "router_router_route", + "target": "router_router_available_models", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L482", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_estimate_tokens", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L180", + "weight": 1.0, + "source": "router_router_rationale_180", + "target": "router_router_estimate_tokens", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L306", + "weight": 1.0, + "source": "router_router_route", + "target": "router_router_estimate_tokens", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L564", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_store_perf_record", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L184", + "weight": 1.0, + "source": "router_router_rationale_184", + "target": "router_router_store_perf_record", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L391", + "weight": 1.0, + "source": "router_router_moe_spillover", + "target": "router_router_is_gpu_busy", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L216", + "weight": 1.0, + "source": "router_router_rationale_216", + "target": "router_router_is_gpu_busy", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L314", + "weight": 1.0, + "source": "router_router_route", + "target": "router_router_is_gpu_busy", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L253", + "weight": 1.0, + "source": "router_router_select_best_gpu", + "target": "router_router_is_gpu_busy", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L832", + "weight": 1.0, + "source": "router_router_metrics_gpu_health", + "target": "router_router_gpu_health_score", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L225", + "weight": 1.0, + "source": "router_router_rationale_225", + "target": "router_router_gpu_health_score", + "confidence_score": 1.0 + }, + { + "relation": "indirect_call", + "context": "argument", + "confidence": "INFERRED", + "source_file": "router/router.py", + "source_location": "L250", + "weight": 1.0, + "source": "router_router_select_best_gpu", + "target": "router_router_gpu_health_score", + "confidence_score": 0.5 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L239", + "weight": 1.0, + "source": "router_router_rationale_239", + "target": "router_router_select_best_gpu", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L337", + "weight": 1.0, + "source": "router_router_route", + "target": "router_router_select_best_gpu", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L282", + "weight": 1.0, + "source": "router_router_rationale_282", + "target": "router_router_is_circuit_tripped", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L312", + "weight": 1.0, + "source": "router_router_route", + "target": "router_router_is_circuit_tripped", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L534", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_trip_circuit", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L288", + "weight": 1.0, + "source": "router_router_rationale_288", + "target": "router_router_trip_circuit", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L297", + "weight": 1.0, + "source": "router_router_rationale_297", + "target": "router_router_half_open_probe", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L487", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_route", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L368", + "weight": 1.0, + "source": "router_router_route", + "target": "router_router_moe_spillover", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L386", + "weight": 1.0, + "source": "router_router_rationale_386", + "target": "router_router_moe_spillover", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L543", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_clean_unicode", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L409", + "weight": 1.0, + "source": "router_router_clean_response", + "target": "router_router_clean_unicode", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L582", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_clean_response", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L431", + "weight": 1.0, + "source": "router_router_bcast", + "target": "router_router_get_metrics", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L780", + "weight": 1.0, + "source": "router_router_metrics", + "target": "router_router_get_metrics", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L570", + "weight": 1.0, + "source": "router_router_chat", + "target": "router_router_bcast", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L619", + "weight": 1.0, + "source": "router_router_rationale_619", + "target": "router_router_performance", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L736", + "weight": 1.0, + "source": "router_router_rationale_736", + "target": "router_router_scatter", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L811", + "weight": 1.0, + "source": "router_router_rationale_811", + "target": "router_router_metrics_circuit_breaker", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L828", + "weight": 1.0, + "source": "router_router_rationale_828", + "target": "router_router_metrics_gpu_health", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L859", + "weight": 1.0, + "source": "router_router_rationale_859", + "target": "router_router_metrics_latency", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L929", + "weight": 1.0, + "source": "router_router_admin_deprecation_summary", + "target": "router_router_admin_auth", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L951", + "weight": 1.0, + "source": "router_router_admin_generate_key", + "target": "router_router_admin_auth", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L906", + "weight": 1.0, + "source": "router_router_admin_keys", + "target": "router_router_admin_auth", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L979", + "weight": 1.0, + "source": "router_router_admin_revoke_key", + "target": "router_router_admin_auth", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L895", + "weight": 1.0, + "source": "router_router_rationale_895", + "target": "router_router_admin_auth", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L905", + "weight": 1.0, + "source": "router_router_rationale_905", + "target": "router_router_admin_keys", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L928", + "weight": 1.0, + "source": "router_router_rationale_928", + "target": "router_router_admin_deprecation_summary", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L950", + "weight": 1.0, + "source": "router_router_rationale_950", + "target": "router_router_admin_generate_key", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "router/router.py", + "source_location": "L978", + "weight": 1.0, + "source": "router_router_rationale_978", + "target": "router_router_admin_revoke_key", + "confidence_score": 1.0 + } + ], + "hyperedges": [], + "built_at_commit": "492a4fe68bd2507d2d3dfc154976a221a850551a" +} \ No newline at end of file diff --git a/litellm_config.yaml b/litellm_config.yaml index 361b9c6..e404ed1 100644 --- a/litellm_config.yaml +++ b/litellm_config.yaml @@ -1,89 +1,21 @@ -general_settings: - master_key: os.environ/LITELLM_MASTER_KEY - store_model_in_db: true -guardrails: -- guardrail_name: input-moderation - litellm_params: - guardrail: openai_moderation - mode: pre_call -- guardrail_name: output-moderation - litellm_params: - guardrail: openai_moderation - mode: post_call -- guardrail_name: harmful-content-filter - litellm_params: - categories: - - action: BLOCK - category: harmful_self_harm - enabled: true - severity_threshold: medium - - action: BLOCK - category: harmful_violence - enabled: true - severity_threshold: medium - - action: BLOCK - category: harmful_illegal_weapons - enabled: true - severity_threshold: medium - guardrail: litellm_content_filter - mode: pre_call -litellm_settings: - failure_callback: - - prometheus - model_cost: - gemma-4-12b: - input_cost_per_token: 0.0 - output_cost_per_token: 0.0 - qwen3.6-27B-code: - input_cost_per_token: 0.0 - output_cost_per_token: 0.0 - qwen3.6-35B-A3B: - input_cost_per_token: 0.0 - output_cost_per_token: 0.0 - syslog-auto: - input_cost_per_token: 0.0 - output_cost_per_token: 0.0 - num_retries: 0 - request_timeout: 600 - set_verbose: true - sso_callback: /sso/callback model_list: -- litellm_params: - api_base: http://router:9000/v1 - api_key: os.environ/ROUTER_API_KEY - model: openai/syslog-auto - rpm: 600 - model_name: syslog-auto -- litellm_params: - api_base: http://router:9000/v1 - api_key: os.environ/ROUTER_API_KEY +- model_name: qwen3.6-35B-A3B + litellm_params: model: openai/qwen3.6-35B-A3B - model_name: qwen3.6-35B-A3B -- litellm_params: - api_base: http://router:9000/v1 - api_key: os.environ/ROUTER_API_KEY - model: openai/qwen3.6-27B-code - model_name: qwen3.6-27B-code -- litellm_params: - api_base: http://router:9000/v1 - api_key: os.environ/ROUTER_API_KEY + api_base: http://192.168.68.15:8080/v1 + api_key: not-needed +- model_name: gpu-dense + litellm_params: + model: openai/qwen3.6-27B-code-text + api_base: http://192.168.68.8:8080/v1 + api_key: not-needed +- model_name: gpu-light + litellm_params: model: openai/gemma-4-12b - model_name: gemma-4-12b -router_settings: - allowed_fails: 100 - enable_loadbalancing_on_proxy: false - fallbacks: - - syslog-auto: - - qwen3.6-35B-A3B - - qwen3.6-27B-code - - gemma-4-12b - - qwen3.6-35B-A3B: - - qwen3.6-27B-code - - gemma-4-12b - - qwen3.6-27B-code: - - qwen3.6-35B-A3B - - gemma-4-12b - - gemma-4-12b: - - qwen3.6-27B-code - - qwen3.6-35B-A3B - routing_strategy: usage-based-routing + api_base: http://192.168.68.110:8080/v1 + api_key: not-needed +general_settings: + master_key: sk-syslog-local-master-key +litellm_settings: + drop_params: true + request_timeout: 120 diff --git a/litellm_config.yaml.bak.poc b/litellm_config.yaml.backup similarity index 100% rename from litellm_config.yaml.bak.poc rename to litellm_config.yaml.backup diff --git a/litellm_config.yaml.bak.20260617-110719 b/litellm_config.yaml.bak.20260617-110719 deleted file mode 100644 index 6cf03d8..0000000 --- a/litellm_config.yaml.bak.20260617-110719 +++ /dev/null @@ -1,107 +0,0 @@ -# LiteLLM Gateway Configuration — Layer 1 of 2-Layer Architecture -# Deployed on CT 116 (192.168.68.116) alongside custom router on :9000 -# Last updated: 2026-06-16 - -general_settings: - master_key: os.environ/LITELLM_MASTER_KEY - # database_url: using DATABASE_URL env var instead - store_model_in_db: true - -model_list: - # Content-based auto-routing (router picks GPU via 5-tier analysis) - - model_name: syslog-auto - litellm_params: - model: openai/syslog-auto - api_base: http://router:9000/v1 - api_key: os.environ/ROUTER_API_KEY - rpm: 600 - - # Individual GPU strict passthrough (exact GPU, no silent fallback) - - model_name: qwen3.6-35B-A3B - litellm_params: - model: openai/qwen3.6-35B-A3B - api_base: http://router:9000/v1 - api_key: os.environ/ROUTER_API_KEY - - - model_name: qwen3.6-27B-code - litellm_params: - model: openai/qwen3.6-27B-code - api_base: http://router:9000/v1 - api_key: os.environ/ROUTER_API_KEY - - - model_name: gemma-4-12b - litellm_params: - model: openai/gemma-4-12b - api_base: http://router:9000/v1 - api_key: os.environ/ROUTER_API_KEY - -# Guardrails: Pre-call and post-call content moderation -guardrails: - - guardrail_name: "input-moderation" - litellm_params: - guardrail: openai_moderation - mode: "pre_call" - - - guardrail_name: "output-moderation" - litellm_params: - guardrail: openai_moderation - mode: "post_call" - - - guardrail_name: "harmful-content-filter" - litellm_params: - guardrail: litellm_content_filter - mode: "pre_call" - categories: - - category: "harmful_self_harm" - enabled: true - action: "BLOCK" - severity_threshold: "medium" - - category: "harmful_violence" - enabled: true - action: "BLOCK" - severity_threshold: "medium" - - category: "harmful_illegal_weapons" - enabled: true - action: "BLOCK" - severity_threshold: "medium" - -litellm_settings: - num_retries: 0 # Disabled — our router handles retry logic - request_timeout: 600 # Match 10-min llama-server timeout - set_verbose: true - failure_callback: ["prometheus"] # Export metrics to Prometheus - -router_settings: - routing_strategy: "usage-based-routing" # For external models only - enable_loadbalancing_on_proxy: false # Disable LiteLLM internal LB - allowed_fails: 100 # Router returns 503 on saturated GPUs - # Fallback chains: LiteLLM retries down the chain when router returns saturated. - # This gives accurate per-model metrics because router no longer silently reroutes. - # The router's circuit breaker prevents cascading failures to dead GPUs. - fallbacks: - - syslog-auto: ["qwen3.6-35B-A3B", "qwen3.6-27B-code", "gemma-4-12b"] - - qwen3.6-35B-A3B: ["qwen3.6-27B-code", "gemma-4-12b"] - - qwen3.6-27B-code: ["qwen3.6-35B-A3B", "gemma-4-12b"] - - gemma-4-12b: ["qwen3.6-27B-code", "qwen3.6-35B-A3B"] - -# Cost tracking for spend analytics (local GPUs at $0, symbolic rates optional) -litellm_settings: - model_cost: - syslog-auto: - input_cost_per_token: 0.0 - output_cost_per_token: 0.0 - qwen3.6-35B-A3B: - input_cost_per_token: 0.0 - output_cost_per_token: 0.0 - qwen3.6-27B-code: - input_cost_per_token: 0.0 - output_cost_per_token: 0.0 - gemma-4-12b: - input_cost_per_token: 0.0 - output_cost_per_token: 0.0 - # For internal cost allocation, set symbolic rates: - # e.g., MoE = $2/M tokens, Dense = $1/M tokens, VLM = $0.50/M tokens - -# SSO/OIDC Configuration -litellm_settings: - sso_callback: "/sso/callback" diff --git a/nginx/default.conf b/nginx/default.conf deleted file mode 100644 index e69de29..0000000 diff --git a/nginx/nginx.conf b/nginx/nginx.conf index a6256e1..d0eaa03 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -1,51 +1,39 @@ -events { - worker_connections 1024; -} +worker_processes auto; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" rt=$request_time'; + access_log /var/log/nginx/access.log main; + error_log /var/log/nginx/error.log; sendfile on; keepalive_timeout 65; - # Docker DNS resolver — forces request-time resolution for variable-based proxy_pass. - # Without this, nginx resolves upstream hostnames at config load time, - # which fails when Docker DNS (127.0.0.11) isn't ready yet on container start. - resolver 127.0.0.11 valid=30s; + upstream router_api { server host.docker.internal:9000; } + upstream dashboard_ui { server dashboard:3000; } + upstream litellm_backend { server litellm:4000; } - # Dynamic upstream resolution via nginx variables. - # Using $var in proxy_pass forces request-time resolution through the resolver. - # Without this, 'host not found in upstream' crashes nginx when Docker DNS is slow. - map $host $router_api_url { - default http://harness-router:9000; - } - map $host $dashboard_ui_url { - default http://harness-dashboard:3000; - } - map $host $litellm_backend_url { - default http://harness-litellm:4000; - } - # ════════════════════════════════════════════════════════════════ - # Server :80 — harness entrypoint - # dashboard (/), router API (/v1/, /admin/, /stream, /api/, /metrics), - # router fallback, health - # ════════════════════════════════════════════════════════════════ server { listen 80; - # Authentik OIDC subrequest - location /authentik/auth { - internal; - proxy_pass https://auth.sysloggh.net/outpost.goauthentik.io/auth/nginx; - proxy_pass_request_body off; - proxy_set_header Content-Length ""; - proxy_set_header X-Original-URL $scheme://$http_host$request_uri; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } + # Security headers + add_header X-Content-Type-Options nosniff always; + add_header X-Frame-Options SAMEORIGIN always; + add_header X-XSS-Protection "1; mode=block" always; - # 2-Layer: /v1/ → router (existing keys work unchanged) + # Disable buffering for SSE streams + proxy_buffering off; + + # API through router location /v1/ { - proxy_pass $router_api_url; + proxy_pass http://router_api; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; @@ -53,122 +41,78 @@ http { proxy_connect_timeout 10s; proxy_read_timeout 600s; proxy_buffering off; - error_page 502 503 = @router_fallback; - } - - location @router_fallback { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; } location /admin/ { - proxy_pass $router_api_url; + proxy_pass http://router_api; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; } + # SSE streaming endpoint location /stream { - proxy_pass $router_api_url/stream; + proxy_pass http://router_api; proxy_http_version 1.1; proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; + proxy_set_header Connection ""; proxy_buffering off; + chunked_transfer_encoding off; } + # Dashboard API proxy for SSE location /api/ { - proxy_pass $router_api_url/; + proxy_pass http://dashboard_ui; proxy_http_version 1.1; proxy_set_header Host $host; - } - - - - location /dashboard/ { - proxy_pass $dashboard_ui_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM redirect target /litellm (no trailing slash) -> add slash back - location = /litellm { - return 301 /litellm/; - } - - # LiteLLM static assets (Next.js chunks, CSS, fonts) - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_connect_timeout 10s; - proxy_read_timeout 60s; - } - - # LiteLLM admin UI and API proxy — strip /litellm prefix so /litellm/ui/ → /ui/ - location /litellm/ { - rewrite ^/litellm(/.*)$ $1 break; - proxy_pass $litellm_backend_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; proxy_buffering off; } - # Auth proxy to Authentik — accepts HTTP from LiteLLM, proxies HTTPS to .11 with SSL verify off - location /application/o/ { - proxy_pass https://192.168.68.11; - proxy_ssl_verify off; - proxy_set_header Host auth.sysloggh.net; - proxy_set_header X-Real-IP $remote_addr; - proxy_connect_timeout 10s; - proxy_read_timeout 30s; + # LiteLLM debug + location /litellm/ { + rewrite ^/litellm/(.*) /$1 break; + proxy_pass http://litellm_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header Authorization $http_authorization; } - # All other requests → 404 + # Professional Dashboard (Phase 1-3) - Static HTML served via Nginx + location /dashboard/ { + alias /opt/inference-harness/dashboard/; + index dashboard.html; + add_header Cache-Control "public, max-age=3600"; + add_header X-Content-Type-Options nosniff; + } + + # Legacy Dashboard (root) - Proxy to Flask app location / { - return 404; + proxy_pass http://dashboard_ui; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_buffering off; } + # Performance analytics location /metrics/ { - proxy_pass $router_api_url/metrics/; + proxy_pass http://router_api; proxy_http_version 1.1; proxy_set_header Host $host; } + # Circuit Breaker metrics (Phase 1) location /metrics/circuit-breaker { - proxy_pass $router_api_url/metrics/circuit-breaker; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /router/ { - proxy_pass $router_api_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health/unified { - proxy_pass $router_api_url/health/unified; + proxy_pass http://router_api/metrics/circuit-breaker; proxy_http_version 1.1; proxy_set_header Host $host; } location /health { - proxy_pass $router_api_url/health; + proxy_pass http://router_api/health; proxy_http_version 1.1; proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; } } - } diff --git a/nginx/nginx.conf.bak.20260616-220643 b/nginx/nginx.conf.bak.20260616-220643 deleted file mode 100644 index 295186e..0000000 --- a/nginx/nginx.conf.bak.20260616-220643 +++ /dev/null @@ -1,124 +0,0 @@ -worker_processes auto; -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; - -events { worker_connections 1024; } - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" rt=$request_time'; - access_log /var/log/nginx/access.log main; - error_log /var/log/nginx/error.log; - sendfile on; - keepalive_timeout 65; - - upstream router_api { server router:9000; } - upstream dashboard_ui { server dashboard:3000; } - upstream litellm_backend { server litellm:4000; } - - server { - listen 80; - - # Security headers - add_header X-Content-Type-Options nosniff always; - add_header X-Frame-Options SAMEORIGIN always; - add_header X-XSS-Protection "1; mode=block" always; - - # Disable buffering for SSE streams - proxy_buffering off; - - # API through router - location /v1/ { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - location /admin/ { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - } - - # SSE streaming endpoint - location /stream { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header Connection ""; - proxy_buffering off; - chunked_transfer_encoding off; - } - - # Dashboard API proxy for SSE - location /api/ { - proxy_pass http://dashboard_ui; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_buffering off; - } - - # LiteLLM debug - location /litellm/ { - rewrite ^/litellm/(.*) /$1 break; - proxy_pass http://litellm_backend; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header Authorization $http_authorization; - } - - # Professional Dashboard (Phase 1-3) - Static HTML served via Nginx - location /dashboard/ { - alias /opt/inference-harness/dashboard/; - index dashboard.html; - add_header Cache-Control "public, max-age=3600"; - add_header X-Content-Type-Options nosniff; - } - - # Legacy Dashboard (root) - Proxy to Flask app - location / { - proxy_pass http://dashboard_ui; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_buffering off; - } - - # Performance analytics - location /metrics/ { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # Circuit Breaker metrics (Phase 1) - location /metrics/circuit-breaker { - proxy_pass http://router_api/metrics/circuit-breaker; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health/unified { - proxy_pass http://router_api/health/unified; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health { - proxy_pass http://router_api/health; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - } - } -} diff --git a/nginx/nginx.conf.bak.20260617-104030 b/nginx/nginx.conf.bak.20260617-104030 deleted file mode 100644 index 7f83b04..0000000 --- a/nginx/nginx.conf.bak.20260617-104030 +++ /dev/null @@ -1,162 +0,0 @@ -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - - upstream router_api { server router:9000; } - upstream dashboard_ui { server dashboard:3000; } - upstream litellm_backend { server litellm:4000; } - - server { - listen 80; - - # Authentik OIDC subrequest - location /authentik/auth { - internal; - proxy_pass https://auth.sysloggh.net/outpost.goauthentik.io/auth/nginx; - proxy_pass_request_body off; - proxy_set_header Content-Length ""; - proxy_set_header X-Original-URL $scheme://$http_host$request_uri; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - # 2-Layer: LiteLLM (Layer 1) -> Router (Layer 2) -> GPUs - # /v1/ routes to router (all existing keys work) - # Agents using new LiteLLM keys: change OPENAI_API_BASE to /litellm/v1 - location /v1/ { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - error_page 502 503 = @router_fallback; - } - - location @router_fallback { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /admin/ { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /stream { - proxy_pass http://router_api/stream; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_buffering off; - } - - location /api/ { - proxy_pass http://router_api/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM gateway access (for agents with new virtual keys) - location /litellm/v1/ { - proxy_pass http://litellm_backend/v1/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # LiteLLM UI static assets - location /litellm-asset-prefix/ { - proxy_pass http://litellm_backend/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM Admin UI (WebSocket support for live updates) - location /litellm/ { - proxy_pass http://litellm_backend/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - # Rewrite all redirects to include /litellm/ prefix - proxy_redirect http://172.18.0.7:4000/ /litellm/; - proxy_redirect http://127.0.0.1:4000/ /litellm/; - } - - location /dashboard/ { - proxy_pass http://dashboard_ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location / { - root /opt/inference-harness/dashboard; - try_files $uri $uri/ /index.html; - } - - location /metrics/ { - proxy_pass http://router_api/metrics/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /metrics/circuit-breaker { - proxy_pass http://router_api/metrics/circuit-breaker; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /router/ { - proxy_pass http://router_api/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /ui/ { - return 302 http://192.168.68.116:4000/ui/; - } - - location /health/unified { - proxy_pass http://router_api/health/unified; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /ui/ { - return 302 http://192.168.68.116:4000/ui/; - } - - location /health { - proxy_pass http://router_api/health; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - } -} diff --git a/nginx/nginx.conf.bak.20260624_174945 b/nginx/nginx.conf.bak.20260624_174945 deleted file mode 100644 index c31e840..0000000 --- a/nginx/nginx.conf.bak.20260624_174945 +++ /dev/null @@ -1,351 +0,0 @@ -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - - # Docker DNS resolver — forces request-time resolution for variable-based proxy_pass. - # Without this, nginx resolves upstream hostnames at config load time, - # which fails when Docker DNS (127.0.0.11) isn't ready yet on container start. - resolver 127.0.0.11 valid=30s; - - # Dynamic upstream resolution via nginx variables. - # Using $var in proxy_pass forces request-time resolution through the resolver. - # Without this, 'host not found in upstream' crashes nginx when Docker DNS is slow. - map $host $router_api_url { - default http://harness-router:9000; - } - map $host $dashboard_ui_url { - default http://harness-dashboard:3000; - } - map $host $litellm_backend_url { - default http://harness-litellm:4000; - } - - # Detect Cloudflare Tunnel requests (cloudflared always sets CF-Connecting-IP). - # Direct LAN browser access to :4000 has no such header -> redirect to canonical https, - # preventing the cross-origin localStorage footgun that traps the UI at the login page. - map $http_cf_connecting_ip $is_cloudflared { - default 1; # any non-empty value = request came through Cloudflare - "" 0; # empty = direct access - } - - # ════════════════════════════════════════════════════════════════ - # Server :80 — existing harness entrypoint - # dashboard (/), router API (/v1/, /admin/, /stream, /api/, /metrics), - # router fallback, LiteLLM UI via /litellm/ prefix, health - # ════════════════════════════════════════════════════════════════ - server { - listen 80; - - # Authentik OIDC subrequest - location /authentik/auth { - internal; - proxy_pass https://auth.sysloggh.net/outpost.goauthentik.io/auth/nginx; - proxy_pass_request_body off; - proxy_set_header Content-Length ""; - proxy_set_header X-Original-URL $scheme://$http_host$request_uri; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - # 2-Layer: /v1/ → router (existing keys work unchanged) - location /v1/ { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - error_page 502 503 = @router_fallback; - } - - location @router_fallback { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /admin/ { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /stream { - proxy_pass $router_api_url/stream; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_buffering off; - } - - location /api/ { - proxy_pass $router_api_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM gateway access (agents with new virtual keys) - location /litellm/v1/ { - proxy_pass $litellm_backend_url/v1/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # LiteLLM UI static assets - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM Admin UI at /ui/ (public access via Traefik → port 80) - # LiteLLM Admin UI at /ui/ (must be before catch-all /) - location /ui/ { - proxy_pass http://litellm_backend/ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - error_page 301 302 = @ui_redirect; - } - - location @ui_redirect { - proxy_pass http://litellm_backend/ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_buffering off; - } - - location /ui/ { - proxy_pass $litellm_backend_url/ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - } - - # SSO callback - location /sso/ { - proxy_pass $litellm_backend_url/sso/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_read_timeout 600s; - } - - # LiteLLM UI static assets on port 80 - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - # LiteLLM Admin UI via /litellm/ prefix (LAN/internal access on :80) - location /litellm/ { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://$host/ /litellm/; - proxy_redirect https://$host/ /litellm/; - } - - location /dashboard/ { - proxy_pass $dashboard_ui_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # Dedicated /openapi.json block — must come before catch-all / - # LiteLLM serves valid openapi: 3.1.0 JSON at this path internally, - # but the catch-all location / strips the URI path. This block - # preserves the full path so the spec JSON is returned instead of - # the Swagger UI SPA HTML. - location /openapi.json { - proxy_pass $litellm_backend_url/openapi.json; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - location / { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - location /metrics/ { - proxy_pass $router_api_url/metrics/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /metrics/circuit-breaker { - proxy_pass $router_api_url/metrics/circuit-breaker; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /router/ { - proxy_pass $router_api_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health/unified { - proxy_pass $router_api_url/health/unified; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health { - proxy_pass $router_api_url/health; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - } - - # ════════════════════════════════════════════════════════════════ - # Server :4000 — external LiteLLM entrypoint (cloudflared target) - # Fixes the /ui redirect: forces correct Host + scheme so LiteLLM - # builds external URLs instead of leaking 192.168.68.116:4000. - # LiteLLM itself is now bound to 127.0.0.1 only (see compose). - # ════════════════════════════════════════════════════════════════ - server { - listen 4000; - - # Canonical external identity — overrides whatever Host cloudflared sends - proxy_set_header Host litellm.sysloggh.net; - proxy_set_header X-Forwarded-Host litellm.sysloggh.net; - proxy_set_header X-Forwarded-Proto https; - proxy_set_header X-Forwarded-Port 443; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Real-IP $remote_addr; - - # /ui → /ui/ — absolute redirect (cloudflared rewrites Host to origin IP, - # so a relative return would be absolutized to http://192.168.68.116:4000/). - location = /ui { return 301 https://litellm.sysloggh.net/ui/; } - - # LiteLLM Admin UI + WebSocket - location /ui/ { - proxy_pass $litellm_backend_url/ui/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect $litellm_backend_url/ https://litellm.sysloggh.net/; - proxy_redirect http://litellm.sysloggh.net:4000/ https://litellm.sysloggh.net/; - } - - # UI static assets - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - # SSO callback - location /sso/ { - proxy_pass $litellm_backend_url/sso/; - proxy_http_version 1.1; - proxy_read_timeout 600s; - } - - # API - location /v1/ { - proxy_pass $litellm_backend_url/v1/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # Key management + admin API - location /key/ { - proxy_pass $litellm_backend_url/key/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /user/ { - proxy_pass $litellm_backend_url/user/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /model/ { - proxy_pass $litellm_backend_url/model/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /team/ { - proxy_pass $litellm_backend_url/team/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - - # Health - location /health { - proxy_pass $litellm_backend_url/health; - proxy_http_version 1.1; - } - - # Root + everything else → LiteLLM (UI index, /configs, /spend, etc.) - location / { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://192.168.68.116:4000/ https://litellm.sysloggh.net/; - proxy_redirect https://192.168.68.116:4000/ https://litellm.sysloggh.net/; - } - } -} diff --git a/nginx/nginx.conf.bak.20260624_201123 b/nginx/nginx.conf.bak.20260624_201123 deleted file mode 100644 index 1338f75..0000000 --- a/nginx/nginx.conf.bak.20260624_201123 +++ /dev/null @@ -1,262 +0,0 @@ -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - - upstream router_api { server router:9000; } - upstream dashboard_ui { server dashboard:3000; } - upstream litellm_backend { server litellm:4000; } - - # Detect Cloudflare Tunnel requests (cloudflared always sets CF-Connecting-IP). - # Direct LAN browser access to :4000 has no such header -> redirect to canonical https, - # preventing the cross-origin localStorage footgun that traps the UI at the login page. - map $http_cf_connecting_ip $is_cloudflared { - default 1; # any non-empty value = request came through Cloudflare - "" 0; # empty = direct access - } - - # ════════════════════════════════════════════════════════════════ - # Server :80 — existing harness entrypoint - # dashboard (/), router API (/v1/, /admin/, /stream, /api/, /metrics), - # router fallback, LiteLLM UI via /litellm/ prefix, health - # ════════════════════════════════════════════════════════════════ - server { - listen 80; - - # Authentik OIDC subrequest - location /authentik/auth { - internal; - proxy_pass https://auth.sysloggh.net/outpost.goauthentik.io/auth/nginx; - proxy_pass_request_body off; - proxy_set_header Content-Length ""; - proxy_set_header X-Original-URL $scheme://$http_host$request_uri; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - # 2-Layer: /v1/ → router (existing keys work unchanged) - location /v1/ { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - error_page 502 503 = @router_fallback; - } - - location @router_fallback { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /admin/ { - proxy_pass http://router_api; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /stream { - proxy_pass http://router_api/stream; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_buffering off; - } - - location /api/ { - proxy_pass http://router_api/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM gateway access (agents with new virtual keys) - location /litellm/v1/ { - proxy_pass http://litellm_backend/v1/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # LiteLLM UI static assets - location /litellm-asset-prefix/ { - proxy_pass http://litellm_backend/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM Admin UI via /litellm/ prefix (LAN/internal access on :80) - location /litellm/ { - proxy_pass http://litellm_backend/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://$host/ /litellm/; - proxy_redirect https://$host/ /litellm/; - } - - location /dashboard/ { - proxy_pass http://dashboard_ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location / { - root /opt/inference-harness/dashboard; - try_files $uri $uri/ /index.html; - } - - location /metrics/ { - proxy_pass http://router_api/metrics/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /metrics/circuit-breaker { - proxy_pass http://router_api/metrics/circuit-breaker; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /router/ { - proxy_pass http://router_api/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health/unified { - proxy_pass http://router_api/health/unified; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health { - proxy_pass http://router_api/health; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - } - - # ════════════════════════════════════════════════════════════════ - # Server :4000 — external LiteLLM entrypoint (cloudflared target) - # Fixes the /ui redirect: forces correct Host + scheme so LiteLLM - # builds external URLs instead of leaking 192.168.68.116:4000. - # LiteLLM itself is now bound to 127.0.0.1 only (see compose). - # ════════════════════════════════════════════════════════════════ - server { - listen 4000; - - # Canonical external identity — overrides whatever Host cloudflared sends - proxy_set_header Host litellm.sysloggh.net; - proxy_set_header X-Forwarded-Host litellm.sysloggh.net; - proxy_set_header X-Forwarded-Proto https; - proxy_set_header X-Forwarded-Port 443; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Real-IP $remote_addr; - - # /ui → /ui/ — absolute redirect (cloudflared rewrites Host to origin IP, - # so a relative return would be absolutized to http://192.168.68.116:4000/). - location = /ui { return 301 https://litellm.sysloggh.net/ui/; } - - # LiteLLM Admin UI + WebSocket - location /ui/ { - proxy_pass http://litellm_backend/ui/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://litellm_backend/ https://litellm.sysloggh.net/; - proxy_redirect http://litellm.sysloggh.net:4000/ https://litellm.sysloggh.net/; - } - - # UI static assets - location /litellm-asset-prefix/ { - proxy_pass http://litellm_backend/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - # SSO callback - location /sso/ { - proxy_pass http://litellm_backend/sso/; - proxy_http_version 1.1; - proxy_read_timeout 600s; - } - - # API - location /v1/ { - proxy_pass http://litellm_backend/v1/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # Key management + admin API - location /key/ { - proxy_pass http://litellm_backend/key/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /user/ { - proxy_pass http://litellm_backend/user/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /model/ { - proxy_pass http://litellm_backend/model/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /team/ { - proxy_pass http://litellm_backend/team/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - - # Health - location /health { - proxy_pass http://litellm_backend/health; - proxy_http_version 1.1; - } - - # Root + everything else → LiteLLM (UI index, /configs, /spend, etc.) - location / { - proxy_pass http://litellm_backend/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://192.168.68.116:4000/ https://litellm.sysloggh.net/; - proxy_redirect https://192.168.68.116:4000/ https://litellm.sysloggh.net/; - } - } -} diff --git a/nginx/nginx.conf.bak.predup2 b/nginx/nginx.conf.bak.predup2 deleted file mode 100644 index c331911..0000000 --- a/nginx/nginx.conf.bak.predup2 +++ /dev/null @@ -1,351 +0,0 @@ -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - - # Docker DNS resolver — forces request-time resolution for variable-based proxy_pass. - # Without this, nginx resolves upstream hostnames at config load time, - # which fails when Docker DNS (127.0.0.11) isn't ready yet on container start. - resolver 127.0.0.11 valid=30s; - - # Dynamic upstream resolution via nginx variables. - # Using $var in proxy_pass forces request-time resolution through the resolver. - # Without this, 'host not found in upstream' crashes nginx when Docker DNS is slow. - map $host $router_api_url { - default http://harness-router:9000; - } - map $host $dashboard_ui_url { - default http://harness-dashboard:3000; - } - map $host $litellm_backend_url { - default http://harness-litellm:4000; - } - - # Detect Cloudflare Tunnel requests (cloudflared always sets CF-Connecting-IP). - # Direct LAN browser access to :4000 has no such header -> redirect to canonical https, - # preventing the cross-origin localStorage footgun that traps the UI at the login page. - map $http_cf_connecting_ip $is_cloudflared { - default 1; # any non-empty value = request came through Cloudflare - "" 0; # empty = direct access - } - - # ════════════════════════════════════════════════════════════════ - # Server :80 — existing harness entrypoint - # dashboard (/), router API (/v1/, /admin/, /stream, /api/, /metrics), - # router fallback, LiteLLM UI via /litellm/ prefix, health - # ════════════════════════════════════════════════════════════════ - server { - listen 80; - - # Authentik OIDC subrequest - location /authentik/auth { - internal; - proxy_pass https://auth.sysloggh.net/outpost.goauthentik.io/auth/nginx; - proxy_pass_request_body off; - proxy_set_header Content-Length ""; - proxy_set_header X-Original-URL $scheme://$http_host$request_uri; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - # 2-Layer: /v1/ → router (existing keys work unchanged) - location /v1/ { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - error_page 502 503 = @router_fallback; - } - - location @router_fallback { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /admin/ { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /stream { - proxy_pass $router_api_url/stream; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_buffering off; - } - - location /api/ { - proxy_pass $router_api_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM gateway access (agents with new virtual keys) - location /litellm/v1/ { - proxy_pass $litellm_backend_url/v1/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # LiteLLM UI static assets - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM Admin UI at /ui/ (public access via Traefik → port 80) - # LiteLLM Admin UI at /ui/ (must be before catch-all /) - location /ui/ { - proxy_pass $litellm_backend_url/ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - error_page 301 302 = @ui_redirect; - } - - location @ui_redirect { - proxy_pass $litellm_backend_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_buffering off; - } - - location /ui/ { - proxy_pass $litellm_backend_url/ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - } - - # SSO callback - location /sso/ { - proxy_pass $litellm_backend_url/sso/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_read_timeout 600s; - } - - # LiteLLM UI static assets on port 80 - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - # LiteLLM Admin UI via /litellm/ prefix (LAN/internal access on :80) - location /litellm/ { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://$host/ /litellm/; - proxy_redirect https://$host/ /litellm/; - } - - location /dashboard/ { - proxy_pass $dashboard_ui_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # Dedicated /openapi.json block — must come before catch-all / - # LiteLLM serves valid openapi: 3.1.0 JSON at this path internally, - # but the catch-all location / strips the URI path. This block - # preserves the full path so the spec JSON is returned instead of - # the Swagger UI SPA HTML. - location /openapi.json { - proxy_pass $litellm_backend_url/openapi.json; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - location / { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - location /metrics/ { - proxy_pass $router_api_url/metrics/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /metrics/circuit-breaker { - proxy_pass $router_api_url/metrics/circuit-breaker; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /router/ { - proxy_pass $router_api_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health/unified { - proxy_pass $router_api_url/health/unified; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health { - proxy_pass $router_api_url/health; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - } - - # ════════════════════════════════════════════════════════════════ - # Server :4000 — external LiteLLM entrypoint (cloudflared target) - # Fixes the /ui redirect: forces correct Host + scheme so LiteLLM - # builds external URLs instead of leaking 192.168.68.116:4000. - # LiteLLM itself is now bound to 127.0.0.1 only (see compose). - # ════════════════════════════════════════════════════════════════ - server { - listen 4000; - - # Canonical external identity — overrides whatever Host cloudflared sends - proxy_set_header Host litellm.sysloggh.net; - proxy_set_header X-Forwarded-Host litellm.sysloggh.net; - proxy_set_header X-Forwarded-Proto https; - proxy_set_header X-Forwarded-Port 443; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Real-IP $remote_addr; - - # /ui → /ui/ — absolute redirect (cloudflared rewrites Host to origin IP, - # so a relative return would be absolutized to http://192.168.68.116:4000/). - location = /ui { return 301 https://litellm.sysloggh.net/ui/; } - - # LiteLLM Admin UI + WebSocket - location /ui/ { - proxy_pass $litellm_backend_url/ui/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect $litellm_backend_url/ https://litellm.sysloggh.net/; - proxy_redirect http://litellm.sysloggh.net:4000/ https://litellm.sysloggh.net/; - } - - # UI static assets - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - # SSO callback - location /sso/ { - proxy_pass $litellm_backend_url/sso/; - proxy_http_version 1.1; - proxy_read_timeout 600s; - } - - # API - location /v1/ { - proxy_pass $litellm_backend_url/v1/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # Key management + admin API - location /key/ { - proxy_pass $litellm_backend_url/key/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /user/ { - proxy_pass $litellm_backend_url/user/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /model/ { - proxy_pass $litellm_backend_url/model/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /team/ { - proxy_pass $litellm_backend_url/team/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - - # Health - location /health { - proxy_pass $litellm_backend_url/health; - proxy_http_version 1.1; - } - - # Root + everything else → LiteLLM (UI index, /configs, /spend, etc.) - location / { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://192.168.68.116:4000/ https://litellm.sysloggh.net/; - proxy_redirect https://192.168.68.116:4000/ https://litellm.sysloggh.net/; - } - } -} diff --git a/nginx/nginx.conf.bak.preui b/nginx/nginx.conf.bak.preui deleted file mode 100644 index 470844f..0000000 --- a/nginx/nginx.conf.bak.preui +++ /dev/null @@ -1,343 +0,0 @@ -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - - # Docker DNS resolver — forces request-time resolution for variable-based proxy_pass. - # Without this, nginx resolves upstream hostnames at config load time, - # which fails when Docker DNS (127.0.0.11) isn't ready yet on container start. - resolver 127.0.0.11 valid=30s; - - # Dynamic upstream resolution via nginx variables. - # Using $var in proxy_pass forces request-time resolution through the resolver. - # Without this, 'host not found in upstream' crashes nginx when Docker DNS is slow. - map $host $router_api_url { - default http://harness-router:9000; - } - map $host $dashboard_ui_url { - default http://harness-dashboard:3000; - } - map $host $litellm_backend_url { - default http://harness-litellm:4000; - } - - # Detect Cloudflare Tunnel requests (cloudflared always sets CF-Connecting-IP). - # Direct LAN browser access to :4000 has no such header -> redirect to canonical https, - # preventing the cross-origin localStorage footgun that traps the UI at the login page. - map $http_cf_connecting_ip $is_cloudflared { - default 1; # any non-empty value = request came through Cloudflare - "" 0; # empty = direct access - } - - # ════════════════════════════════════════════════════════════════ - # Server :80 — existing harness entrypoint - # dashboard (/), router API (/v1/, /admin/, /stream, /api/, /metrics), - # router fallback, LiteLLM UI via /litellm/ prefix, health - # ════════════════════════════════════════════════════════════════ - server { - listen 80; - - # Authentik OIDC subrequest - location /authentik/auth { - internal; - proxy_pass https://auth.sysloggh.net/outpost.goauthentik.io/auth/nginx; - proxy_pass_request_body off; - proxy_set_header Content-Length ""; - proxy_set_header X-Original-URL $scheme://$http_host$request_uri; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - # 2-Layer: /v1/ → router (existing keys work unchanged) - location /v1/ { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - error_page 502 503 = @router_fallback; - } - - location @router_fallback { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /admin/ { - proxy_pass $router_api_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - } - - location /stream { - proxy_pass $router_api_url/stream; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_buffering off; - } - - location /api/ { - proxy_pass $router_api_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM gateway access (agents with new virtual keys) - location /litellm/v1/ { - proxy_pass $litellm_backend_url/v1/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # LiteLLM UI static assets - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # LiteLLM Admin UI at /ui/ (public access via Traefik → port 80) - # LiteLLM Admin UI at /ui/ (must be before catch-all /) - location /ui/ { - proxy_pass $litellm_backend_url/ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - error_page 301 302 = @ui_redirect; - } - - location @ui_redirect { - proxy_pass $litellm_backend_url; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_buffering off; - } - - location /ui/ { - proxy_pass $litellm_backend_url/ui/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - } - - # SSO callback - location /sso/ { - proxy_pass $litellm_backend_url/sso/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_read_timeout 600s; - } - - - # LiteLLM Admin UI via /litellm/ prefix (LAN/internal access on :80) - location /litellm/ { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://$host/ /litellm/; - proxy_redirect https://$host/ /litellm/; - } - - location /dashboard/ { - proxy_pass $dashboard_ui_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # Dedicated /openapi.json block — must come before catch-all / - # LiteLLM serves valid openapi: 3.1.0 JSON at this path internally, - # but the catch-all location / strips the URI path. This block - # preserves the full path so the spec JSON is returned instead of - # the Swagger UI SPA HTML. - location /openapi.json { - proxy_pass $litellm_backend_url/openapi.json; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - location / { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Authorization $http_authorization; - proxy_connect_timeout 10s; - proxy_read_timeout 600s; - proxy_buffering off; - } - - location /metrics/ { - proxy_pass $router_api_url/metrics/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /metrics/circuit-breaker { - proxy_pass $router_api_url/metrics/circuit-breaker; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /router/ { - proxy_pass $router_api_url/; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health/unified { - proxy_pass $router_api_url/health/unified; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - location /health { - proxy_pass $router_api_url/health; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - } - - # ════════════════════════════════════════════════════════════════ - # Server :4000 — external LiteLLM entrypoint (cloudflared target) - # Fixes the /ui redirect: forces correct Host + scheme so LiteLLM - # builds external URLs instead of leaking 192.168.68.116:4000. - # LiteLLM itself is now bound to 127.0.0.1 only (see compose). - # ════════════════════════════════════════════════════════════════ - server { - listen 4000; - - # Canonical external identity — overrides whatever Host cloudflared sends - proxy_set_header Host litellm.sysloggh.net; - proxy_set_header X-Forwarded-Host litellm.sysloggh.net; - proxy_set_header X-Forwarded-Proto https; - proxy_set_header X-Forwarded-Port 443; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Real-IP $remote_addr; - - # /ui → /ui/ — absolute redirect (cloudflared rewrites Host to origin IP, - # so a relative return would be absolutized to http://192.168.68.116:4000/). - location = /ui { return 301 https://litellm.sysloggh.net/ui/; } - - # LiteLLM Admin UI + WebSocket - location /ui/ { - proxy_pass $litellm_backend_url/ui/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect $litellm_backend_url/ https://litellm.sysloggh.net/; - proxy_redirect http://litellm.sysloggh.net:4000/ https://litellm.sysloggh.net/; - } - - # UI static assets - location /litellm-asset-prefix/ { - proxy_pass $litellm_backend_url/litellm-asset-prefix/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - # SSO callback - location /sso/ { - proxy_pass $litellm_backend_url/sso/; - proxy_http_version 1.1; - proxy_read_timeout 600s; - } - - # API - location /v1/ { - proxy_pass $litellm_backend_url/v1/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - proxy_read_timeout 600s; - proxy_buffering off; - } - - # Key management + admin API - location /key/ { - proxy_pass $litellm_backend_url/key/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /user/ { - proxy_pass $litellm_backend_url/user/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /model/ { - proxy_pass $litellm_backend_url/model/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - location /team/ { - proxy_pass $litellm_backend_url/team/; - proxy_http_version 1.1; - proxy_set_header Authorization $http_authorization; - } - - # Health - location /health { - proxy_pass $litellm_backend_url/health; - proxy_http_version 1.1; - } - - # Root + everything else → LiteLLM (UI index, /configs, /spend, etc.) - location / { - proxy_pass $litellm_backend_url/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400s; - proxy_buffering off; - proxy_redirect http://192.168.68.116:4000/ https://litellm.sysloggh.net/; - proxy_redirect https://192.168.68.116:4000/ https://litellm.sysloggh.net/; - } - } -} diff --git a/router/router-fixed.py b/router/router-fixed.py deleted file mode 100644 index 97d0f0e..0000000 --- a/router/router-fixed.py +++ /dev/null @@ -1,831 +0,0 @@ -import os, json, time, logging, traceback, threading, queue, statistics, math -import requests, redis -from flask import Flask, request, jsonify, Response, stream_with_context - -REDIS_URL = os.environ.get("REDIS_URL", "redis://redis:6379") -GPU_MOE_URL = os.environ.get("GPU_MOE_URL", "http://192.168.68.15:8080/v1") -GPU_DENSE_URL = os.environ.get("GPU_DENSE_URL", "http://192.168.68.8:8080/v1") -GPU_LIGHT_URL = os.environ.get("GPU_LIGHT_URL", "http://192.168.68.110:8080/v1") - -GPU_SIDECARS = { - "qwen3.6-35B-A3B": "http://192.168.68.15:8090", - "qwen3.6-27B-code": "http://192.168.68.8:8090", - "gemma-4-12b": "http://192.168.68.110:8090", -} -GPU_URLS = { - "qwen3.6-35B-A3B": GPU_MOE_URL, - "qwen3.6-27B-code": GPU_DENSE_URL, - "gemma-4-12b": GPU_LIGHT_URL, -} -# Max concurrent requests per GPU (based on llama.cpp --parallel) -GPU_MAX_CONCURRENT = { - "qwen3.6-35B-A3B": 2, # 2 slots (cross-agent spread prevents overheating) - "qwen3.6-27B-code": 2, # 2 slots - "gemma-4-12b": 2, # 2 slots (12GB VRAM, 4GB headroom) -} - -# Context window sizes (tokens) — used for compaction signals -GPU_CONTEXT = { - "qwen3.6-35B-A3B": 262144, - "qwen3.6-27B-code": 262144, - "gemma-4-12b": 262144, -} - -TIER_MODELS = { - "starter": ["gemma-4-12b"], - "professional": ["qwen3.6-35B-A3B", "qwen3.6-27B-code", "gemma-4-12b"], - "enterprise": ["qwen3.6-35B-A3B", "qwen3.6-27B-code", "gemma-4-12b"], -} -# ── PHASE 0: Dual-Key API Key System ── -# API_KEYS env var is REQUIRED (JSON string). No hardcoded fallback. -# Format: {"sk-xxx": {"tier": "enterprise", "agent": "Name"}} -# Deprecated keys get {"deprecated": true} — still accepted, logged with warning. -_raw_keys = os.environ.get("API_KEYS") -if not _raw_keys: - raise RuntimeError("FATAL: API_KEYS environment variable is required. " - "Set it in docker-compose.yml or .env file. " - "No hardcoded keys fallback — this is a security feature.") -API_KEYS = json.loads(_raw_keys) -log.info("Loaded %d API keys from env var (%d deprecated)", - len(API_KEYS), sum(1 for v in API_KEYS.values() if v.get("deprecated"))) -# Rate limits: requests per minute per API key tier -RATE_LIMIT_RPM = { - "enterprise": 120, - "professional": 60, - "starter": 20, -} - -def check_rate_limit(api_key, tier): - """Token bucket rate limiter using Redis. Returns (allowed, retry_after_or_remaining, reset_seconds).""" - if not r: - return True, 999, 60 - limit = RATE_LIMIT_RPM.get(tier, 30) - key = f"ratelimit:{api_key}" - current = int(r.get(key) or 0) - if current >= limit: - ttl = r.ttl(key) - retry = max(ttl, 1) if ttl and ttl > 0 else 60 - return False, retry, 0 - pipe = r.pipeline() - pipe.incr(key) - pipe.expire(key, 60) # 1-minute sliding window - pipe.execute() - remaining = limit - (current + 1) - reset_seconds = r.ttl(key) or 60 - return True, remaining, reset_seconds - - -logging.basicConfig(level=logging.INFO, format="%(asctime)s [ROUTER] %(levelname)s %(message)s") -log = logging.getLogger("router") -try: r = redis.from_url(REDIS_URL, decode_responses=True); r.ping() -except Exception: r = None - - -def counter_audit_loop(): - """Every 30s, check GPU slots and reset counters if all slots idle.""" - while True: - time.sleep(30) - if not r: continue - for model, url in GPU_URLS.items(): - try: - resp = requests.get(url.replace("/v1","") + "/slots", - headers={"Authorization": "Bearer not-needed"}, timeout=5) - if resp.status_code == 200: - slots = resp.json() - all_idle = all(not s.get("is_processing", False) for s in slots) - if all_idle: - current = int(r.get("active:" + model) or 0) - if current > 0: - r.set("active:" + model, 0) - log.info("AUDIT: Reset stuck counter for %s (was %d)", model, current) - except Exception: - pass - -threading.Thread(target=counter_audit_loop, daemon=True).start() - -app = Flask(__name__) -sse_subscribers = []; sse_lock = threading.Lock() - -def gpu_active_count(model): - """Get number of in-flight requests for a GPU.""" - if r: - return int(r.get("active:" + model) or 0) - return 0 - -def gpu_incr(model): - if r: r.incr("active:" + model) - -def gpu_decr(model): - if r: - v = r.decr("active:" + model) - if v and int(v) < 0: - r.set("active:" + model, 0) # never go negative - -def check_gpu_health(model, sidecar_timeout=5, gpu_timeout=3): - url = GPU_SIDECARS.get(model) - if not url: return {"status": "unknown"} - try: - resp = requests.get(url, timeout=sidecar_timeout) - if resp.status_code == 200: - d = resp.json() - pct = (d.get("vram_used_mb",0) / max(d.get("vram_total_mb",1), 1)) * 100 - status = "healthy" # VRAM usage != saturation; busy slots handled by is_gpu_busy() - vram_warning = pct >= 95 - # Also check if llama.cpp endpoint is actually responding - gpu_url = GPU_URLS.get(model, "") - try: - hr = requests.get(gpu_url.replace("/v1","") + "/health", headers={"Authorization": "Bearer not-needed"}, timeout=gpu_timeout) - if hr.status_code != 200: - status = "down" - except Exception: - status = "down" - return {"status": status, "vram_warning": vram_warning, "vram_used_mb": d.get("vram_used_mb"), "vram_total_mb": d.get("vram_total_mb"), "vram_pct": round(pct,1), "temp_c": d.get("temp_c"), "gpu_util_pct": d.get("gpu_util_pct"), "gpu_name": d.get("gpu_name"), "power_w": d.get("power_w"), "power_limit_w": d.get("power_limit_w")} - except Exception: pass - return {"status": "down"} - -def available_models(): return [m for m in GPU_URLS if check_gpu_health(m)["status"] in ("healthy","saturated")] - -def estimate_tokens(msgs): - """Estimate token count from messages. Uses JSON length / 3.5 (closer to real tokenizer ratios for dense text).""" - return len(json.dumps(msgs, default=str)) // 3.5 - -def store_perf_record(model, agent, tier, reason, queue_ms, inference_ms, prompt_tokens, completion_tokens, stream): - """Store detailed performance record in Redis for analytics.""" - if not r: return - try: - total_ms = queue_ms + inference_ms - tps = completion_tokens / (inference_ms / 1000) if inference_ms > 0 and completion_tokens > 0 else 0 - rec = json.dumps({ - "ts": time.time(), - "model": model, "agent": agent, "tier": tier, "reason": reason, - "queue_ms": round(queue_ms, 1), - "inference_ms": round(inference_ms, 1), - "total_ms": round(total_ms, 1), - "prompt_tokens": prompt_tokens, - "completion_tokens": completion_tokens, - "tokens_per_sec": round(tps, 1), - "stream": stream - }) - # Global recent list (last 500) - r.lpush("perf:recent", rec) - r.ltrim("perf:recent", 0, 499) - # Per-model list (last 200) - r.lpush("perf:model:" + model, rec) - r.ltrim("perf:model:" + model, 0, 199) - # Per-reason list (last 200) - r.lpush("perf:reason:" + reason, rec) - r.ltrim("perf:reason:" + reason, 0, 199) - # Per-agent list (last 200) - r.lpush("perf:agent:" + agent, rec) - r.ltrim("perf:agent:" + agent, 0, 199) - except Exception: - pass - -def is_gpu_busy(model): - """Check if GPU is at or near max concurrent capacity.""" - active = gpu_active_count(model) - max_c = GPU_MAX_CONCURRENT.get(model, 1) - return active >= max_c - -def select_best_gpu(candidates, reason, agent=""): - """Pick best GPU, spreading agents across GPUs to prevent hotspots.""" - # Count how many distinct agents are on each GPU - gpu_agent_counts = {} - if r: - for m in GPU_URLS: - count = 0 - for ak in API_KEYS.values(): - if r.get("agent_gpu:" + ak["agent"] + ":" + m): - count += 1 - gpu_agent_counts[m] = count - # First pass: prefer GPUs with 0 other agents (fresh GPU for this agent) - for m in candidates: - if not is_gpu_busy(m) and gpu_agent_counts.get(m, 0) == 0: - return {"model": m, "reason": reason} - # Second pass: prefer GPU this agent is NOT already on (skip own GPU) - if agent: - for m in candidates: - if not is_gpu_busy(m) and not r.get("agent_gpu:" + agent + ":" + m): - return {"model": m, "reason": reason} - # Third pass: any non-busy GPU - for m in candidates: - if not is_gpu_busy(m): - return {"model": m, "reason": reason} - # All busy — pick least loaded - best = None - best_load = 999 - for m in candidates: - load = gpu_active_count(m) - if load < best_load: - best_load = load - best = m - if best: - return {"model": best, "reason": "load_balanced_" + reason} - return None - -def route(rd, tier, agent=""): - msgs = rd.get("messages",[]); t = estimate_tokens(msgs) - sys = any(m.get("role")=="system" for m in msgs) - turns = len([m for m in msgs if m.get("role") in ("user","assistant")]) - hints = rd.get("routing_hints",{}) - allowed = TIER_MODELS.get(tier, ["gemma-4-12b"]) - avail = [m for m in available_models() if m in allowed] - if not avail: return {"model": allowed[0], "reason": "all_saturated", "saturated": True} - # Check if all available GPUs are at max capacity - if all(is_gpu_busy(m) for m in avail): - return {"model": avail[0], "reason": "all_saturated", "saturated": True} - - req = rd.get("model","auto") - if req != "auto": - # STRICT MODE: no silent fallback — LiteLLM handles failover chains. - # This keeps per-model metrics accurate. Returns saturated if busy. - target = req if req in avail else avail[0] - if req not in avail: - return {"model": req, "reason": "explicit_unavailable", "saturated": True} - if is_gpu_busy(target): - return {"model": target, "reason": "explicit_saturated", "saturated": True} - return {"model": target, "reason": "explicit"} - - if hints: - if hints.get("priority")=="speed" and "gemma-4-12b" in avail: - return select_best_gpu(["gemma-4-12b"], "hint_speed", agent) or {"model":"gemma-4-12b","reason":"hint_speed"} - if hints.get("priority")=="quality" and "qwen3.6-35B-A3B" in avail: - return select_best_gpu(["qwen3.6-35B-A3B"], "hint_quality", agent) or {"model":"qwen3.6-35B-A3B","reason":"hint_quality"} - - first_msg = msgs[0].get("content","") if msgs else "" - words = len(first_msg.split()) if isinstance(first_msg, str) else 99 - - # TIER 1: Lightweight — single-turn short queries → VLM (fastest) - if not sys and turns <= 1 and t <= 500 and words <= 100 and "gemma-4-12b" in avail: - if not is_gpu_busy("gemma-4-12b"): - return {"model":"gemma-4-12b","reason":"lightweight"} - # VLM busy — Dense is faster for short queries than MoE - fallback = [m for m in ["qwen3.6-27B-code","qwen3.6-35B-A3B"] if m in avail] - result = select_best_gpu(fallback, "lightweight_fallback", agent) - if result: return result - - # TIER 2: Simple conversations — VLM primary (up to 15K tok), fastest for moderate chat - if t <= 15000 and turns <= 12 and "gemma-4-12b" in avail: - if not is_gpu_busy("gemma-4-12b"): - return {"model":"gemma-4-12b","reason":"simple_conv"} - # VLM busy — fall back to Dense, then MoE - fallback = [m for m in ["qwen3.6-27B-code","qwen3.6-35B-A3B"] if m in avail] - result = select_best_gpu(fallback, "simple_conv_fallback", agent) - if result: return result - - # TIER 3: Medium complexity — Dense primary, VLM fallback (quality + speed balance) - if t <= 25000: - candidates = [m for m in ["qwen3.6-27B-code","gemma-4-12b","qwen3.6-35B-A3B"] if m in avail] - result = select_best_gpu(candidates, "medium", agent) - if result: return result - - # TIER 4: Heavy reasoning — MoE primary (workhorse), Dense fallback - if t > 25000: - candidates = [m for m in ["qwen3.6-35B-A3B","qwen3.6-27B-code","gemma-4-12b"] if m in avail] - result = select_best_gpu(candidates, "heavy_reasoning", agent) - if result: return result - - # TIER 5: Default — Dense primary, MoE fallback - candidates = [m for m in ["qwen3.6-27B-code","gemma-4-12b","qwen3.6-35B-A3B"] if m in avail] - result = select_best_gpu(candidates, "default", agent) - if result: return result - return {"model":avail[0],"reason":"last_resort"} - -def clean_unicode(text): - if not isinstance(text, str): return text - text = text.replace(chr(0x2014), "-"); text = text.replace(chr(0x2013), "-") - text = text.replace(chr(0x2018), "'"); text = text.replace(chr(0x2019), "'") - text = text.replace(chr(0x201C), '"'); text = text.replace(chr(0x201D), '"') - text = text.replace(chr(0x2026), "..."); text = text.replace(chr(0x00A0), " ") - return text.encode("ascii", "ignore").decode("ascii") - -def clean_response(d): - if isinstance(d, dict): return {k: clean_response(v) for k,v in d.items()} - if isinstance(d, list): return [clean_response(v) for v in d] - if isinstance(d, str): return clean_unicode(d) - return d - -def get_metrics(): - d = {"gpus":[],"route_counts":{},"agent_counts":{},"tier_counts":{},"recent":[],"timestamp":time.time(),"active_requests":{}} - for m in GPU_URLS: - h = check_gpu_health(m) - d["gpus"].append({"id":m,"gpu_name":h.get("gpu_name",m),"status":h.get("status"),"vram_used_mb":h.get("vram_used_mb"),"vram_total_mb":h.get("vram_total_mb"),"vram_pct":h.get("vram_pct"),"temp_c":h.get("temp_c"),"gpu_util_pct":h.get("gpu_util_pct"),"power_w":h.get("power_w"),"power_limit_w":h.get("power_limit_w"),"active_requests":gpu_active_count(m), "max_concurrent": GPU_MAX_CONCURRENT.get(m, 1)}) - d["active_requests"][m] = gpu_active_count(m) - if r: - try: - for m in GPU_URLS: d["route_counts"][m] = int(r.get("routes:"+m) or 0) - for k,v in API_KEYS.items(): - c = int(r.get("routes:agent:"+v["agent"]) or 0) - if c>0: d["agent_counts"][v["agent"]] = c - for t in TIER_MODELS: d["tier_counts"][t] = int(r.get("routes:tier:"+t) or 0) - raw = r.lrange("routes:recent",0,49) - d["recent"] = [json.loads(x) for x in raw] if raw else [] - except Exception: pass - return d - -def bcast(): - data = get_metrics(); payload = json.dumps(data) - with sse_lock: - dead = [] - for q in sse_subscribers: - try: q.put(payload) - except Exception: dead.append(q) - for q in dead: sse_subscribers.remove(q) - -QUEUE_TIMEOUT = int(os.environ.get("QUEUE_TIMEOUT", "30")) # max seconds to queue before 503 - -@app.route("/v1/chat/completions", methods=["POST"]) -def chat(): - try: - rd = request.get_json(force=True) - ak = request.headers.get("Authorization","").replace("Bearer ","") - if not ak or ak not in API_KEYS: - log.warning("AUTH_REJECTED: no/invalid API key from %s", request.remote_addr) - return jsonify({"error": "Unauthorized — valid API key required"}), 401 - ki = API_KEYS[ak] - tier, agent = ki["tier"], ki["agent"] - # Phase 0: dual-key transition — log deprecated key usage - if ki.get("deprecated"): - new_key = next((k for k, v in API_KEYS.items() - if v.get("agent") == agent and not v.get("deprecated")), None) - log.warning("DEPRECATED_KEY: agent=%s using old key %s...%s — switch to %s...%s", - agent, ak[:12], ak[-8:], - new_key[:12] if new_key else "N/A", - new_key[-8:] if new_key else "N/A") - if r: - r.incr("deprecated_usage:" + agent) - - # Rate limit check - allowed, rl_val, reset_sec = check_rate_limit(ak, tier) - if not allowed: - resp = jsonify({"error": "Rate limit exceeded", "retry_after_s": rl_val}) - resp.headers["Retry-After"] = str(rl_val) - resp.headers["X-RateLimit-Limit"] = str(RATE_LIMIT_RPM.get(tier, 30)) - resp.headers["X-RateLimit-Remaining"] = "0" - resp.headers["X-RateLimit-Reset"] = str(int(time.time() + rl_val)) - log.warning("RATE_LIMIT: %s (%s) exceeded limit", agent, ak[-8:]) - return resp, 429 - - # Allow agent to override queue timeout via header - q_timeout = int(request.headers.get("X-Queue-Timeout", str(QUEUE_TIMEOUT))) - - # Cross-turn context tracking: accumulate tokens per session - session_id = request.headers.get("X-Session-Id", "") - session_tokens = 0 - if session_id and r: - try: - prev = int(r.get("session:" + session_id) or 0) - current = estimate_tokens(rd.get("messages",[])) - session_tokens = max(prev, current) # context only grows - r.set("session:" + session_id, session_tokens, ex=86400) # TTL 24h - except Exception: pass - - d = route(rd, tier, agent) - queue_start = time.time() - - # Queue loop: wait for a GPU slot instead of immediate 503 - while d.get("saturated"): - elapsed = time.time() - queue_start - if elapsed > q_timeout: - resp = jsonify({"error": "All GPUs saturated", "queued_s": round(elapsed,1), "retry_after_s": 5}) - resp.headers["Retry-After"] = "5" - log.warning("QUEUE_TIMEOUT: %s waited %.1fs, all GPUs saturated", agent, elapsed) - return resp, 503 - time.sleep(0.5) # poll every 500ms - d = route(rd, tier, agent) - - queue_ms = (time.time() - queue_start) * 1000 - if queue_ms > 500: - log.info("QUEUED: %s waited %.0fms before slot opened", agent, queue_ms) - model, reason, url = d["model"], d["reason"], GPU_URLS[d["model"]] - - # Stash rate limit values for response headers - _rl_remaining = rl_val - _rl_limit = RATE_LIMIT_RPM.get(tier, 30) - _rl_reset = reset_sec - is_stream = rd.get("stream", False) - - gpu_incr(model) - - log.info("ROUTE: %s -> %s (%s) stream=%s active=%d/%d", agent, model, reason, is_stream, gpu_active_count(model), GPU_MAX_CONCURRENT.get(model,1)) - # Track which GPU this agent is using (TTL 120s covers typical request) - if r and agent: - try: r.setex("agent_gpu:" + agent + ":" + model, 120, "1") - except: pass - if r: - try: - r.incr("routes:"+model); r.incr("routes:tier:"+tier); r.incr("routes:agent:"+agent) - r.incr("ts:"+model+":"+time.strftime("%Y%m%d%H")) - r.lpush("routes:recent", json.dumps({"ts":time.time(),"model":model,"reason":reason,"tier":tier,"agent":agent,"queue_ms": round(queue_ms,1)})) - r.ltrim("routes:recent",0,999) - except Exception: pass - start = time.time() - resp = requests.post(url+"/chat/completions", json=rd, - headers={"Content-Type":"application/json","Authorization":"Bearer not-needed"}, timeout=300, stream=is_stream) - lat = int((time.time()-start)*1000) - gpu_decr(model) - - if resp.status_code != 200: return jsonify({"error":"GPU error "+str(resp.status_code)}), 502 - if is_stream: - # Buffer SSE chunks, handle split lines for large responses - chunks = [] - stream_timings = {} - buf = "" # accumulate partial lines - for raw in resp.iter_content(chunk_size=None, decode_unicode=True): - if raw: - cleaned = clean_unicode(raw) - chunks.append(cleaned) - buf += cleaned - # Process complete lines from buffer - while "\n" in buf: - line, buf = buf.split("\n", 1) - line = line.strip() - if line.startswith("data: ") and not stream_timings: - js = line[6:].strip() - if js.startswith("{") and "timings" in js and "predicted_n" in js: - try: - tj = json.loads(js).get("timings", {}) - if tj: - stream_timings = tj - except: pass - # Store perf record with real token counts from stream - if stream_timings: - pt = stream_timings.get("prompt_n", 0) - ct = stream_timings.get("predicted_n", 0) - tps = stream_timings.get("predicted_per_second", 0) - gen_ms = stream_timings.get("predicted_ms", lat) - store_perf_record(model, agent, tier, reason, queue_ms, gen_ms, pt, ct, True) - else: - store_perf_record(model, agent, tier, reason, queue_ms, lat, estimate_tokens(rd.get("messages",[])), 0, True) - # Yield all chunks to client - def gen(): - for c in chunks: yield c - bcast() - ctx_remaining = GPU_CONTEXT.get(model, 65536) - max(session_tokens, estimate_tokens(rd.get("messages",[]))) - ctx_pct = ctx_remaining / GPU_CONTEXT.get(model, 65536) * 100 - ctx_warning = "compact_urgent" if ctx_pct < 5 else ("compact_recommended" if ctx_pct < 15 else ("compact_soon" if ctx_pct < 30 else "ok")) - sse_resp = Response(stream_with_context(gen()), mimetype="text/event-stream") - sse_resp.headers["X-RateLimit-Limit"] = str(_rl_limit) - sse_resp.headers["X-RateLimit-Remaining"] = str(max(0, _rl_remaining)) - sse_resp.headers["X-RateLimit-Reset"] = str(int(time.time() + _rl_reset)) - sse_resp.headers["X-Context-Remaining"] = str(max(0, ctx_remaining)) - sse_resp.headers["X-Context-Warning"] = ctx_warning - sse_resp.headers["X-Context-Model"] = model - return sse_resp - data = clean_response(resp.json()) - for c in data.get("choices",[]): - msg = c.get("message",{}) - if not msg.get("content") and msg.get("reasoning_content"): - msg["content"] = msg["reasoning_content"] - # Extract performance data from llama.cpp response - usage = data.get("usage", {}) - timings = data.get("timings", {}) - prompt_tokens = usage.get("prompt_tokens", 0) - completion_tokens = usage.get("completion_tokens", 0) - inference_ms = lat # total GPU round-trip - store_perf_record(model, agent, tier, reason, queue_ms, inference_ms, prompt_tokens, completion_tokens, False) - ctx_remaining = GPU_CONTEXT.get(model, 65536) - max(session_tokens, estimate_tokens(rd.get("messages",[]))) - ctx_pct = ctx_remaining / GPU_CONTEXT.get(model, 65536) * 100 - ctx_warning = "compact_urgent" if ctx_pct < 5 else ("compact_recommended" if ctx_pct < 15 else ("compact_soon" if ctx_pct < 30 else "ok")) - data["routing"] = {"model":model,"reason":reason,"gpu":url,"tier":tier,"agent":agent,"latency_ms":lat,"queue_ms": round(queue_ms,1),"active_gpu":gpu_active_count(model),"context_remaining": max(0, ctx_remaining),"context_pct": round(ctx_pct,1),"context_warning": ctx_warning} - resp = jsonify(data) - resp.headers["X-RateLimit-Limit"] = str(_rl_limit) - resp.headers["X-RateLimit-Remaining"] = str(max(0, _rl_remaining)) - resp.headers["X-RateLimit-Reset"] = str(int(time.time() + _rl_reset)) - resp.headers["X-Context-Remaining"] = str(max(0, ctx_remaining)) - resp.headers["X-Context-Warning"] = ctx_warning - resp.headers["X-Context-Model"] = model - bcast() - return resp - except requests.Timeout: - gpu_decr(model) - log.error("TIMEOUT: %s -> %s", agent, model) - return jsonify({"error":"timeout"}), 504 - except Exception as e: - gpu_decr(model) - log.error("Error: %s\n%s", e, traceback.format_exc()) - return jsonify({"error":str(e)}), 500 - -@app.route("/metrics/performance") -def performance(): - """Per-request performance analytics with percentiles per model/reason/agent.""" - if not r: return jsonify({"error": "Redis unavailable"}), 503 - try: - window_hours = int(request.args.get("window", "24")) - model_filter = request.args.get("model", "all") - - # Load recent records - cutoff = time.time() - (window_hours * 3600) - raw = r.lrange("perf:recent", 0, -1) - records = [] - for x in raw: - try: - rec = json.loads(x) - if rec["ts"] >= cutoff: - records.append(rec) - except: pass - - # Filter by model if specified - if model_filter != "all": - records = [r for r in records if r["model"] == model_filter] - - if not records: - return jsonify({"models": [], "reasons": [], "agents": [], "summary": {"total_requests": 0}}) - - def pct(values, p): - if len(values) < 2: return round(values[0], 1) if values else 0 - return round(statistics.quantiles(sorted(values), n=100, method='inclusive')[min(p-1, 98)], 1) - - # Per-model stats - model_groups = {} - for rec in records: - m = rec["model"] - if m not in model_groups: model_groups[m] = [] - model_groups[m].append(rec) - - models = [] - for m, recs in sorted(model_groups.items()): - latencies = [r["total_ms"] for r in recs] - tps_vals = [r["tokens_per_sec"] for r in recs if r["tokens_per_sec"] > 0] - non_stream = [r for r in recs if not r["stream"]] - queue_times = [r["queue_ms"] for r in non_stream] - models.append({ - "model": m, - "count": len(recs), - "stream_pct": round(len([r for r in recs if r["stream"]]) / len(recs) * 100, 1), - "latency": { - "avg": round(statistics.mean(latencies), 1), - "p50": pct(latencies, 50), - "p95": pct(latencies, 95), - "p99": pct(latencies, 99) - }, - "throughput": { - "avg_tokens_per_sec": round(statistics.mean(tps_vals), 1) if tps_vals else 0, - "p50": pct(tps_vals, 50) if tps_vals else 0, - "p95": pct(tps_vals, 95) if tps_vals else 0, - }, - "queue": { - "avg_ms": round(statistics.mean(queue_times), 1) if queue_times else 0, - "p95_ms": pct(queue_times, 95) if queue_times else 0, - } if queue_times else None - }) - - # Per-reason stats - reason_groups = {} - for rec in records: - rsn = rec["reason"] - if rsn not in reason_groups: reason_groups[rsn] = [] - reason_groups[rsn].append(rec) - - reasons = [] - for rsn, recs in sorted(reason_groups.items(), key=lambda x: -len(x[1])): - latencies = [r["total_ms"] for r in recs] - reasons.append({ - "reason": rsn, - "count": len(recs), - "avg_total_ms": round(statistics.mean(latencies), 1), - "p95_total_ms": pct(latencies, 95) - }) - - # Per-agent stats - agent_groups = {} - for rec in records: - ag = rec["agent"] - if ag not in agent_groups: agent_groups[ag] = [] - agent_groups[ag].append(rec) - - agents = [] - for ag, recs in sorted(agent_groups.items(), key=lambda x: -len(x[1])): - latencies = [r["total_ms"] for r in recs] - tps_vals = [r["tokens_per_sec"] for r in recs if r["tokens_per_sec"] > 0] - agents.append({ - "agent": ag, - "count": len(recs), - "avg_total_ms": round(statistics.mean(latencies), 1), - "avg_tokens_per_sec": round(statistics.mean(tps_vals), 1) if tps_vals else 0 - }) - - all_lat = [r["total_ms"] for r in records] - all_tps = [r["tokens_per_sec"] for r in records if r["tokens_per_sec"] > 0] - summary = { - "total_requests": len(records), - "window_hours": window_hours, - "latency": { - "avg_ms": round(statistics.mean(all_lat), 1), - "p50_ms": pct(all_lat, 50), - "p95_ms": pct(all_lat, 95), - "p99_ms": pct(all_lat, 99) - }, - "throughput_avg_tps": round(statistics.mean(all_tps), 1) if all_tps else 0 - } - - return jsonify({"models": models, "reasons": reasons, "agents": agents, "summary": summary}) - except Exception as e: - return jsonify({"error": str(e)}), 500 - -@app.route("/metrics/scatter") -def scatter(): - """Return individual data points for scatter plots (prompt_tokens vs latency).""" - if not r: return jsonify({"error": "Redis unavailable"}), 503 - try: - window_hours = int(request.args.get("window", "24")) - model_filter = request.args.get("model", "all") - cutoff = time.time() - (window_hours * 3600) - raw = r.lrange("perf:recent", 0, -1) - points = [] - for x in raw: - try: - rec = json.loads(x) - if rec["ts"] >= cutoff: - if model_filter == "all" or rec["model"] == model_filter: - points.append({ - "model": rec["model"], - "agent": rec["agent"], - "reason": rec["reason"], - "prompt_tokens": int(rec.get("prompt_tokens", 0)), - "completion_tokens": rec.get("completion_tokens", 0), - "inference_ms": round(rec["inference_ms"], 1), - "tokens_per_sec": rec.get("tokens_per_sec", 0), - "stream": rec.get("stream", False) - }) - except: pass - return jsonify({"points": points, "count": len(points)}) - except Exception as e: - return jsonify({"error": str(e)}), 500 - -@app.route("/v1/models") -def models(): - def _h(m): return check_gpu_health(m, sidecar_timeout=1.5, gpu_timeout=1) - return jsonify({"object":"list","data":[{"id":m,"object":"model","owned_by":"syslog","status":_h(m).get("status"),"gpu":_h(m).get("gpu_name")} for m in GPU_URLS]}) - -@app.route("/health") -def health(): - gpus = {} - for m in GPU_URLS: - h = check_gpu_health(m, sidecar_timeout=1.5, gpu_timeout=1) - h["active_requests"] = gpu_active_count(m) - h["max_concurrent"] = GPU_MAX_CONCURRENT.get(m, 1) - gpus[m] = h - return jsonify({"status":"healthy","redis":"connected" if r else "down","gpus":gpus,"available_models":available_models()}) - -@app.route("/metrics") -def metrics(): return jsonify(get_metrics()) - -@app.route("/metrics/timeseries") -def metrics_timeseries(): - period = request.args.get("period", "day"); models_list = list(GPU_URLS.keys()) - data = {"models": {}, "labels": []} - if period == "day": - buckets = [time.strftime("%Y%m%d%H", time.gmtime(time.time()-h*3600)) for h in range(23,-1,-1)] - data["labels"] = [time.strftime("%H:00", time.gmtime(time.time()-h*3600)) for h in range(23,-1,-1)] - elif period == "week": - buckets = [time.strftime("%Y%m%d", time.gmtime(time.time()-d*86400)) for d in range(6,-1,-1)] - data["labels"] = [time.strftime("%a", time.gmtime(time.time()-d*86400)) for d in range(6,-1,-1)] - else: - buckets = [time.strftime("%Y%m%d", time.gmtime(time.time()-d*86400)) for d in range(29,-1,-1)] - data["labels"] = [time.strftime("%m/%d", time.gmtime(time.time()-d*86400)) for d in range(29,-1,-1)] - if r: - for model in models_list: - counts = [] - for bucket in buckets: - total = 0 - if period in ("week","month"): - for hh in range(24): total += int(r.get("ts:"+model+":"+bucket+"{:02d}".format(hh)) or 0) - else: total = int(r.get("ts:"+model+":"+bucket) or 0) - counts.append(total) - data["models"][model] = counts - return jsonify(data) - -@app.route("/stream") -def stream(): - def ev(): - q = queue.Queue() - with sse_lock: sse_subscribers.append(q) - try: - yield "data: "+json.dumps(get_metrics())+"\n\n" - while True: - try: yield "data: "+q.get(timeout=3)+"\n\n" - except queue.Empty: yield "data: "+json.dumps(get_metrics())+"\n\n" - except GeneratorExit: pass - finally: - with sse_lock: - if q in sse_subscribers: sse_subscribers.remove(q) - return Response(stream_with_context(ev()), mimetype="text/event-stream", - headers={"Cache-Control":"no-cache","X-Accel-Buffering":"no","Access-Control-Allow-Origin":"*"}) - -# ── Phase 0: Admin Key Management ── -ADMIN_KEY = os.environ.get("ADMIN_KEY", "") - -def _admin_auth(): - """Require admin key for management endpoints.""" - if not ADMIN_KEY: - return False, "ADMIN_KEY not configured on server" - ak = request.headers.get("Authorization","").replace("Bearer ","") - if ak != ADMIN_KEY: - return False, "Admin key required" - return True, None - -@app.route("/admin/keys") -def admin_keys(): - """List all API keys (masked) with agent, tier, and deprecation status.""" - ok, err = _admin_auth() - if not ok: return jsonify({"error": err}), 401 - keys = [] - for key, info in API_KEYS.items(): - masked = key[:8] + "..." + key[-8:] - keys.append({ - "masked": masked, - "prefix": key[:8], - "agent": info["agent"], - "tier": info["tier"], - "deprecated": info.get("deprecated", False), - "length": len(key) - }) - return jsonify({ - "total": len(keys), - "active": sum(1 for k in keys if not k["deprecated"]), - "deprecated": sum(1 for k in keys if k["deprecated"]), - "keys": sorted(keys, key=lambda k: (k["deprecated"], k["agent"])) - }) - -@app.route("/admin/keys/deprecation-summary") -def admin_deprecation_summary(): - """Summary of deprecated key usage (from Redis logs, if available).""" - ok, err = _admin_auth() - if not ok: return jsonify({"error": err}), 401 - deprecated_agents = [] - for key, info in API_KEYS.items(): - if info.get("deprecated"): - # Check Redis for usage count - count = 0 - if r: - count = int(r.get("deprecated_usage:" + info["agent"]) or 0) - deprecated_agents.append({ - "agent": info["agent"], - "deprecated_uses": count, - "needs_migration": count > 0 - }) - return jsonify({ - "deprecated_agents": sorted(deprecated_agents, key=lambda d: -d["deprecated_uses"]), - "recommendation": "Run POST /admin/keys/revoke to remove keys with 0 usage" - }) - -@app.route("/admin/keys/generate", methods=["POST"]) -def admin_generate_key(): - """Generate a new API key for an agent. Body: {"agent": "Name", "tier": "enterprise"}""" - ok, err = _admin_auth() - if not ok: return jsonify({"error": err}), 401 - body = request.get_json(force=True) - agent = body.get("agent", "").strip() - tier = body.get("tier", "enterprise") - if not agent: - return jsonify({"error": "agent field required"}), 400 - if tier not in ("starter", "professional", "enterprise"): - return jsonify({"error": "tier must be starter/professional/enterprise"}), 400 - # Generate secure key - import secrets, hashlib - prefix = hashlib.sha256(secrets.token_bytes(12)).hexdigest()[:8] - suffix = secrets.token_hex(20) - new_key = f"sk-{prefix}-{suffix}" - # Update in-memory dict (note: not persisted across restarts without env var update) - API_KEYS[new_key] = {"tier": tier, "agent": agent} - log.info("KEY_GENERATED: agent=%s tier=%s key=%s...%s", agent, tier, new_key[:8], new_key[-8:]) - return jsonify({ - "agent": agent, - "tier": tier, - "key": new_key, - "masked": new_key[:8] + "..." + new_key[-8:], - "warning": "This key exists in memory only. Update API_KEYS env var and redeploy to persist." - }), 201 - -@app.route("/admin/keys/revoke", methods=["POST"]) -def admin_revoke_key(): - """Revoke a deprecated key. Body: {"agent": "Name"} or {"key_prefix": "sk-xxxx"}""" - ok, err = _admin_auth() - if not ok: return jsonify({"error": err}), 401 - body = request.get_json(force=True) - agent = body.get("agent", "") - key_prefix = body.get("key_prefix", "") - revoked = [] - keys_to_remove = [] - for key, info in API_KEYS.items(): - if not info.get("deprecated"): - continue - if agent and info["agent"] == agent: - keys_to_remove.append(key) - elif key_prefix and key.startswith(key_prefix): - keys_to_remove.append(key) - for key in keys_to_remove: - info = API_KEYS.pop(key) - revoked.append({"agent": info["agent"], "masked": key[:8] + "..." + key[-8:]}) - log.warning("KEY_REVOKED: agent=%s key=%s...%s", info["agent"], key[:8], key[-8:]) - return jsonify({ - "revoked": len(revoked), - "keys": revoked, - "remaining_total": len(API_KEYS), - "warning": "Memory-only revoke. Update API_KEYS env var and redeploy to persist." - }) - -if __name__ == "__main__": - log.info("Router on :9000 (load-aware)") - app.run(host="0.0.0.0", port=9000, debug=False) diff --git a/router/router.py.bak.20260518074236 b/router/router.py.bak.20260518074236 deleted file mode 100644 index 46d38d9..0000000 --- a/router/router.py.bak.20260518074236 +++ /dev/null @@ -1,342 +0,0 @@ -import os, json, time, logging, traceback, threading, queue -import requests, redis -from flask import Flask, request, jsonify, Response, stream_with_context - -REDIS_URL = os.environ.get("REDIS_URL", "redis://redis:6379") -GPU_MOE_URL = os.environ.get("GPU_MOE_URL", "http://192.168.68.15:8080/v1") -GPU_DENSE_URL = os.environ.get("GPU_DENSE_URL", "http://192.168.68.8:8080/v1") -GPU_LIGHT_URL = os.environ.get("GPU_LIGHT_URL", "http://192.168.68.110:8080/v1") - -GPU_SIDECARS = { - "qwen3.6-35B-A3B": "http://192.168.68.15:8090", - "qwen3.6-27B-code": "http://192.168.68.8:8090", - "qwen3.5-9b-vlm": "http://192.168.68.110:8090", -} -GPU_URLS = { - "qwen3.6-35B-A3B": GPU_MOE_URL, - "qwen3.6-27B-code": GPU_DENSE_URL, - "qwen3.5-9b-vlm": GPU_LIGHT_URL, -} -# Max concurrent requests per GPU (based on llama.cpp --parallel) -GPU_MAX_CONCURRENT = { - "qwen3.6-35B-A3B": 2, # 2 slots - "qwen3.6-27B-code": 2, # 2 slots - "qwen3.5-9b-vlm": 1, # 1 slot -} - -TIER_MODELS = { - "starter": ["qwen3.5-9b-vlm"], - "professional": ["qwen3.6-35B-A3B", "qwen3.6-27B-code", "qwen3.5-9b-vlm"], - "enterprise": ["qwen3.6-35B-A3B", "qwen3.6-27B-code", "qwen3.5-9b-vlm"], -} -API_KEYS = { - "sk-syslog-local-master-key": {"tier": "enterprise", "agent": "admin"}, - "sk-syslog-abiba": {"tier": "enterprise", "agent": "Abiba"}, - "sk-syslog-mumuni": {"tier": "enterprise", "agent": "Mumuni"}, - "sk-syslog-tanko": {"tier": "enterprise", "agent": "Tanko"}, - "sk-syslog-koby": {"tier": "enterprise", "agent": "Koby"}, - "sk-syslog-kagenz0": {"tier": "enterprise", "agent": "Kagenz0"}, - "sk-syslog-koonimo": {"tier": "enterprise", "agent": "Koonimo"}, - "sk-starter-abc123": {"tier": "starter", "agent": "test-starter"}, - "sk-professional-xyz789": {"tier": "professional", "agent": "test-pro"}, -} - -logging.basicConfig(level=logging.INFO, format="%(asctime)s [ROUTER] %(levelname)s %(message)s") -log = logging.getLogger("router") -try: r = redis.from_url(REDIS_URL, decode_responses=True); r.ping() -except Exception: r = None - - -def counter_audit_loop(): - """Every 30s, check GPU slots and reset counters if all slots idle.""" - while True: - time.sleep(30) - if not r: continue - for model, url in GPU_URLS.items(): - try: - resp = requests.get(url.replace("/v1","") + "/slots", - headers={"Authorization": "Bearer not-needed"}, timeout=5) - if resp.status_code == 200: - slots = resp.json() - all_idle = all(not s.get("is_processing", False) for s in slots) - if all_idle: - current = int(r.get("active:" + model) or 0) - if current > 0: - r.set("active:" + model, 0) - log.info("AUDIT: Reset stuck counter for %s (was %d)", model, current) - except Exception: - pass - -threading.Thread(target=counter_audit_loop, daemon=True).start() - -app = Flask(__name__) -sse_subscribers = []; sse_lock = threading.Lock() - -def gpu_active_count(model): - """Get number of in-flight requests for a GPU.""" - if r: - return int(r.get("active:" + model) or 0) - return 0 - -def gpu_incr(model): - if r: r.incr("active:" + model) - -def gpu_decr(model): - if r: - v = r.decr("active:" + model) - if v and int(v) < 0: - r.set("active:" + model, 0) # never go negative - -def check_gpu_health(model): - url = GPU_SIDECARS.get(model) - if not url: return {"status": "unknown"} - try: - resp = requests.get(url, timeout=5) - if resp.status_code == 200: - d = resp.json() - pct = (d.get("vram_used_mb",0) / max(d.get("vram_total_mb",1), 1)) * 100 - status = "healthy" if pct < 90 else "saturated" - # Also check if llama.cpp endpoint is actually responding - gpu_url = GPU_URLS.get(model, "") - try: - hr = requests.get(gpu_url.replace("/v1","") + "/health", headers={"Authorization": "Bearer not-needed"}, timeout=3) - if hr.status_code != 200: - status = "down" - except Exception: - status = "down" - return {"status": status, "vram_used_mb": d.get("vram_used_mb"), "vram_total_mb": d.get("vram_total_mb"), "vram_pct": round(pct,1), "temp_c": d.get("temp_c"), "gpu_util_pct": d.get("gpu_util_pct"), "gpu_name": d.get("gpu_name"), "power_w": d.get("power_w"), "power_limit_w": d.get("power_limit_w")} - except Exception: pass - return {"status": "down"} - -def available_models(): return [m for m in GPU_URLS if check_gpu_health(m)["status"] in ("healthy","saturated")] - -def estimate_tokens(msgs): return sum(len(str(m.get("content",""))) for m in msgs) // 4 - -def is_gpu_busy(model): - """Check if GPU is at or near max concurrent capacity.""" - active = gpu_active_count(model) - max_c = GPU_MAX_CONCURRENT.get(model, 1) - return active >= max_c - -def select_best_gpu(candidates, reason): - """Pick the best GPU from candidates, preferring least-loaded.""" - best = None - best_load = 999 - for m in candidates: - load = gpu_active_count(m) - if load < best_load: - best_load = load - best = m - if best: - actual_reason = reason - if is_gpu_busy(best): - actual_reason = "load_balanced_" + reason - return {"model": best, "reason": actual_reason} - return None - -def route(rd, tier): - msgs = rd.get("messages",[]); t = estimate_tokens(msgs) - sys = any(m.get("role")=="system" for m in msgs) - turns = len([m for m in msgs if m.get("role") in ("user","assistant")]) - hints = rd.get("routing_hints",{}) - allowed = TIER_MODELS.get(tier, ["qwen3.5-9b-vlm"]) - avail = [m for m in available_models() if m in allowed] - if not avail: return {"model": allowed[0], "reason": "all_saturated", "saturated": True} - - req = rd.get("model","auto") - if req != "auto": - target = req if req in avail else avail[0] - # If explicit model is busy, check if another can take it - if is_gpu_busy(target) and req in allowed: - alts = [m for m in avail if m != target and m in allowed] - if alts: - alt = select_best_gpu(alts, "explicit") - if alt: return alt - return {"model": target, "reason": "explicit"} - - if hints: - if hints.get("priority")=="speed" and "qwen3.5-9b-vlm" in avail: - return select_best_gpu(["qwen3.5-9b-vlm"], "hint_speed") or {"model":"qwen3.5-9b-vlm","reason":"hint_speed"} - if hints.get("priority")=="quality" and "qwen3.6-27B-code" in avail: - return select_best_gpu(["qwen3.6-27B-code"], "hint_quality") or {"model":"qwen3.6-27B-code","reason":"hint_quality"} - - # Heavy -> dense (but fall back to MoE if dense is busy) - if t > 4000 or sys or turns > 6: - candidates = ["qwen3.6-27B-code","qwen3.6-35B-A3B","qwen3.5-9b-vlm"] - candidates = [m for m in candidates if m in avail] - result = select_best_gpu(candidates, "heavy_reasoning") - if result: return result - - # Ultra-light -> VLM - first_msg = msgs[0].get("content","") if msgs else "" - words = len(first_msg.split()) if isinstance(first_msg, str) else 99 - if words <= 3 and turns <= 1 and not sys and "qwen3.5-9b-vlm" in avail: - if not is_gpu_busy("qwen3.5-9b-vlm"): - return {"model":"qwen3.5-9b-vlm","reason":"ultra_light"} - - # Default: MoE, fall back to dense if MoE is busy - if "qwen3.6-35B-A3B" in avail: - if is_gpu_busy("qwen3.6-35B-A3B") and "qwen3.6-27B-code" in avail: - return {"model": "qwen3.6-27B-code", "reason": "load_balanced_default"} - return {"model":"qwen3.6-35B-A3B","reason":"default_moe"} - - return {"model":avail[0],"reason":"fallback"} - -def clean_unicode(text): - if not isinstance(text, str): return text - text = text.replace(chr(0x2014), "-"); text = text.replace(chr(0x2013), "-") - text = text.replace(chr(0x2018), "'"); text = text.replace(chr(0x2019), "'") - text = text.replace(chr(0x201C), '"'); text = text.replace(chr(0x201D), '"') - text = text.replace(chr(0x2026), "..."); text = text.replace(chr(0x00A0), " ") - return text.encode("ascii", "ignore").decode("ascii") - -def clean_response(d): - if isinstance(d, dict): return {k: clean_response(v) for k,v in d.items()} - if isinstance(d, list): return [clean_response(v) for v in d] - if isinstance(d, str): return clean_unicode(d) - return d - -def get_metrics(): - d = {"gpus":[],"route_counts":{},"agent_counts":{},"tier_counts":{},"recent":[],"timestamp":time.time(),"active_requests":{}} - for m in GPU_URLS: - h = check_gpu_health(m) - d["gpus"].append({"id":m,"gpu_name":h.get("gpu_name",m),"status":h.get("status"),"vram_used_mb":h.get("vram_used_mb"),"vram_total_mb":h.get("vram_total_mb"),"vram_pct":h.get("vram_pct"),"temp_c":h.get("temp_c"),"gpu_util_pct":h.get("gpu_util_pct"),"power_w":h.get("power_w"),"power_limit_w":h.get("power_limit_w"),"active_requests":gpu_active_count(m), "max_concurrent": GPU_MAX_CONCURRENT.get(m, 1)}) - d["active_requests"][m] = gpu_active_count(m) - if r: - try: - for m in GPU_URLS: d["route_counts"][m] = int(r.get("routes:"+m) or 0) - for k,v in API_KEYS.items(): - c = int(r.get("routes:agent:"+v["agent"]) or 0) - if c>0: d["agent_counts"][v["agent"]] = c - for t in TIER_MODELS: d["tier_counts"][t] = int(r.get("routes:tier:"+t) or 0) - raw = r.lrange("routes:recent",0,49) - d["recent"] = [json.loads(x) for x in raw] if raw else [] - except Exception: pass - return d - -def bcast(): - data = get_metrics(); payload = json.dumps(data) - with sse_lock: - dead = [] - for q in sse_subscribers: - try: q.put(payload) - except Exception: dead.append(q) - for q in dead: sse_subscribers.remove(q) - -@app.route("/v1/chat/completions", methods=["POST"]) -def chat(): - try: - rd = request.get_json(force=True) - ak = request.headers.get("Authorization","").replace("Bearer ","") - ki = API_KEYS.get(ak, {"tier":"starter","agent":"unknown"}) - tier, agent = ki["tier"], ki["agent"] - d = route(rd, tier) - if d.get("saturated"): - resp = jsonify({"error": "All GPUs saturated", "retry_after_s": 5}) - resp.headers["Retry-After"] = "5" - return resp, 503 - model, reason, url = d["model"], d["reason"], GPU_URLS[d["model"]] - is_stream = rd.get("stream", False) - - gpu_incr(model) - decremented = False - - log.info("ROUTE: %s -> %s (%s) stream=%s active=%d/%d", agent, model, reason, is_stream, gpu_active_count(model), GPU_MAX_CONCURRENT.get(model,1)) - if r: - try: - r.incr("routes:"+model); r.incr("routes:tier:"+tier); r.incr("routes:agent:"+agent) - r.incr("ts:"+model+":"+time.strftime("%Y%m%d%H")) - r.lpush("routes:recent", json.dumps({"ts":time.time(),"model":model,"reason":reason,"tier":tier,"agent":agent})) - r.ltrim("routes:recent",0,999) - except Exception: pass - start = time.time() - resp = requests.post(url+"/chat/completions", json=rd, - headers={"Content-Type":"application/json","Authorization":"Bearer not-needed"}, timeout=300, stream=is_stream) - lat = int((time.time()-start)*1000) - gpu_decr(model) - decremented = True # Release slot - - if resp.status_code != 200: return jsonify({"error":"GPU error "+str(resp.status_code)}), 502 - if is_stream: - def gen(): - for raw in resp.iter_content(chunk_size=None, decode_unicode=True): - if raw: yield clean_unicode(raw) - bcast() - return Response(stream_with_context(gen()), mimetype="text/event-stream") - data = clean_response(resp.json()) - for c in data.get("choices",[]): - msg = c.get("message",{}) - if not msg.get("content") and msg.get("reasoning_content"): - msg["content"] = msg["reasoning_content"] - data["routing"] = {"model":model,"reason":reason,"gpu":url,"tier":tier,"agent":agent,"latency_ms":lat,"active_gpu":gpu_active_count(model)} - bcast() - return jsonify(data) - if not decremented: - try: gpu_decr(model) - except: pass - except requests.Timeout: - return jsonify({"error":"timeout"}), 504 - log.error("Error: %s\n%s", e, traceback.format_exc()) - return jsonify({"error":str(e)}), 500 - -@app.route("/v1/models") -def models(): return jsonify({"object":"list","data":[{"id":m,"object":"model","owned_by":"syslog","status":check_gpu_health(m).get("status"),"gpu":check_gpu_health(m).get("gpu_name")} for m in GPU_URLS]}) - -@app.route("/health") -def health(): - gpus = {} - for m in GPU_URLS: - h = check_gpu_health(m) - h["active_requests"] = gpu_active_count(m) - h["max_concurrent"] = GPU_MAX_CONCURRENT.get(m, 1) - gpus[m] = h - return jsonify({"status":"healthy","redis":"connected" if r else "down","gpus":gpus,"available_models":available_models()}) - -@app.route("/metrics") -def metrics(): return jsonify(get_metrics()) - -@app.route("/metrics/timeseries") -def metrics_timeseries(): - period = request.args.get("period", "day"); models_list = list(GPU_URLS.keys()) - data = {"models": {}, "labels": []} - if period == "day": - buckets = [time.strftime("%Y%m%d%H", time.gmtime(time.time()-h*3600)) for h in range(23,-1,-1)] - data["labels"] = [time.strftime("%H:00", time.gmtime(time.time()-h*3600)) for h in range(23,-1,-1)] - elif period == "week": - buckets = [time.strftime("%Y%m%d", time.gmtime(time.time()-d*86400)) for d in range(6,-1,-1)] - data["labels"] = [time.strftime("%a", time.gmtime(time.time()-d*86400)) for d in range(6,-1,-1)] - else: - buckets = [time.strftime("%Y%m%d", time.gmtime(time.time()-d*86400)) for d in range(29,-1,-1)] - data["labels"] = [time.strftime("%m/%d", time.gmtime(time.time()-d*86400)) for d in range(29,-1,-1)] - if r: - for model in models_list: - counts = [] - for bucket in buckets: - total = 0 - if period in ("week","month"): - for hh in range(24): total += int(r.get("ts:"+model+":"+bucket+"{:02d}".format(hh)) or 0) - else: total = int(r.get("ts:"+model+":"+bucket) or 0) - counts.append(total) - data["models"][model] = counts - return jsonify(data) - -@app.route("/stream") -def stream(): - def ev(): - q = queue.Queue() - with sse_lock: sse_subscribers.append(q) - try: - yield "data: "+json.dumps(get_metrics())+"\n\n" - while True: - try: yield "data: "+q.get(timeout=3)+"\n\n" - except queue.Empty: yield "data: "+json.dumps(get_metrics())+"\n\n" - except GeneratorExit: pass - finally: - with sse_lock: - if q in sse_subscribers: sse_subscribers.remove(q) - return Response(stream_with_context(ev()), mimetype="text/event-stream", - headers={"Cache-Control":"no-cache","X-Accel-Buffering":"no","Access-Control-Allow-Origin":"*"}) - -if __name__ == "__main__": - log.info("Router on :9000 (load-aware)") - app.run(host="0.0.0.0", port=9000, debug=False) diff --git a/router/router.py.bak.20260616-214735 b/router/router.py.bak.20260616-214735 deleted file mode 100644 index 23f9c8e..0000000 --- a/router/router.py.bak.20260616-214735 +++ /dev/null @@ -1,1006 +0,0 @@ -import os, json, time, logging, traceback, threading, queue, statistics, math -import requests, redis -from flask import Flask, request, jsonify, Response, stream_with_context - - - -# Phase 2: Atomic session token update Redis Lua script -SESSION_LUA_SCRIPT = """ -local key = KEYS[1] -local new_val = tonumber(ARGV[1]) -local current = tonumber(redis.call('GET', key) or 0) -local max_val = math.max(current, new_val) -redis.call('SET', key, max_val, 'EX', 86400) -return max_val -""" - - -REDIS_URL = os.environ.get("REDIS_URL", "redis://redis:6379") -GPU_MOE_URL = os.environ.get("GPU_MOE_URL", "http://192.168.68.15:8080/v1") -GPU_DENSE_URL = os.environ.get("GPU_DENSE_URL", "http://192.168.68.8:8080/v1") -GPU_LIGHT_URL = os.environ.get("GPU_LIGHT_URL", "http://192.168.68.110:8080/v1") - -GPU_SIDECARS = { - "qwen3.6-35B-A3B": "http://192.168.68.15:8090", - "qwen3.6-27B-code": "http://192.168.68.8:8090", - "gemma-4-12b": "http://192.168.68.110:8090", -} -GPU_URLS = { - "qwen3.6-35B-A3B": GPU_MOE_URL, - "qwen3.6-27B-code": GPU_DENSE_URL, - "gemma-4-12b": GPU_LIGHT_URL, -} -# Max concurrent requests per GPU (based on llama.cpp --parallel) - -GPU_LABELS = { - "qwen3.6-35B-A3B": "Qwen3.6 35B (Strix Halo)", - "qwen3.6-27B-code": "Qwen3.6 27B Code (RTX 3090)", - "gemma-4-12b": "Gemma-4 12B (RTX 5070)", -} - -GPU_MAX_CONCURRENT = { - "qwen3.6-35B-A3B": 2, # 2 slots (cross-agent spread prevents overheating) - "qwen3.6-27B-code": 2, # 2 slots (128K context frees VRAM) - "gemma-4-12b": 2, # 2 slots (7.1GB VRAM) -} - -# Context window sizes (tokens) — used for compaction signals -GPU_CONTEXT = { - "qwen3.6-35B-A3B": 262144, - "qwen3.6-27B-code": 262144, - "gemma-4-12b": 262144, -} - -TIER_MODELS = { - "starter": ["gemma-4-12b"], - "professional": ["qwen3.6-35B-A3B", "qwen3.6-27B-code", "gemma-4-12b"], - "enterprise": ["qwen3.6-35B-A3B", "qwen3.6-27B-code", "gemma-4-12b"], -} -# API keys loaded from API_KEYS env var (set in docker-compose.yml) -# Fallback is dev-only — production MUST set API_KEYS env var -API_KEYS = json.loads(os.environ.get("API_KEYS", json.dumps({ - "sk-dev-local-only": {"tier": "enterprise", "agent": "dev"}, -}))) -# Rate limits: requests per minute per API key tier -RATE_LIMIT_RPM = { - "enterprise": 120, - "professional": 60, - "starter": 20, -} - -def check_rate_limit(api_key, tier): - """Token bucket rate limiter using Redis. Returns (allowed, retry_after_or_remaining, reset_seconds).""" - if not get_redis(): - return True, 999, 60 - limit = RATE_LIMIT_RPM.get(tier, 30) - key = f"ratelimit:{api_key}" - current = int(get_redis().get(key) or 0) - if current >= limit: - ttl = r.ttl(key) - retry = max(ttl, 1) if ttl and ttl > 0 else 60 - return False, retry, 0 - pipe = r.pipeline() - pipe.incr(key) - pipe.expire(key, 60) # 1-minute sliding window - pipe.execute() - remaining = limit - (current + 1) - reset_seconds = r.ttl(key) or 60 - return True, remaining, reset_seconds - - -logging.basicConfig(level=logging.INFO, format="%(asctime)s [ROUTER] %(levelname)s %(message)s") -log = logging.getLogger("router") -# Redis connection — initialized lazily, retries on first use -def get_redis(): - global r - if r is not None: - try: - r.ping() - return r - except Exception: - r = None - try: - r = redis.from_url(REDIS_URL, decode_responses=True) - r.ping() - return r - except Exception: - return None - -r = None -try: get_redis() -except Exception: pass -except Exception: r = None - - -def counter_audit_loop(): - """Every 30s, check GPU slots and reset counters if all slots idle.""" - while True: - time.sleep(30) - if not get_redis(): continue - for model, url in GPU_URLS.items(): - try: - resp = requests.get(url.replace("/v1","") + "/slots", - headers={"Authorization": "Bearer not-needed"}, timeout=5) - if resp.status_code == 200: - slots = resp.json() - all_idle = all(not s.get("is_processing", False) for s in slots) - if all_idle: - current = int(get_redis().get("active:" + model) or 0) - if current > 0: - get_redis().set("active:" + model, 0) - log.info("AUDIT: Reset stuck counter for %s (was %d)", model, current) - except Exception: - pass - -threading.Thread(target=counter_audit_loop, daemon=True).start() - -app = Flask(__name__) -sse_subscribers = []; sse_lock = threading.Lock() - -def gpu_active_count(model): - """Get number of in-flight requests for a GPU.""" - if r: - return int(r.get("active:" + model) or 0) - return 0 - -def gpu_incr(model): - if get_redis(): get_redis().incr("active:" + model) - -def gpu_decr(model): - rd = get_redis() - if rd: - v = rd.decr("active:" + model) - if v and int(v) < 0: - get_redis().set("active:" + model, 0) # never go negative -def check_gpu_health(model, sidecar_timeout=5, gpu_timeout=3): - url = GPU_SIDECARS.get(model) - if not url: return {"status": "unknown"} - try: - resp = requests.get(url, timeout=sidecar_timeout) - if resp.status_code == 200: - d = resp.json() - pct = (d.get("vram_used_mb",0) / max(d.get("vram_total_mb",1), 1)) * 100 - status = "healthy" # VRAM usage != saturation; busy slots handled by is_gpu_busy() - vram_warning = pct >= 95 - # Also check if llama.cpp endpoint is actually responding - gpu_url = GPU_URLS.get(model, "") - try: - hr = requests.get(gpu_url.replace("/v1","") + "/health", headers={"Authorization": "Bearer not-needed"}, timeout=gpu_timeout) - if hr.status_code != 200: - status = "down" - except Exception: - status = "down" - return {"status": status, "vram_warning": vram_warning, "vram_used_mb": d.get("vram_used_mb"), "vram_total_mb": d.get("vram_total_mb"), "vram_pct": round(pct,1), "temp_c": d.get("temp_c"), "gpu_util_pct": d.get("gpu_util_pct"), "gpu_name": d.get("gpu_name"), "power_w": d.get("power_w"), "power_limit_w": d.get("power_limit_w")} - except Exception: pass - return {"status": "down"} - -def available_models(): return [m for m in GPU_URLS if check_gpu_health(m)["status"] in ("healthy","saturated")] - -def estimate_tokens(msgs): - """Estimate token count from messages. Uses JSON length / 3.5 (closer to real tokenizer ratios for dense text).""" - return len(json.dumps(msgs, default=str)) // 3.5 - -def store_perf_record(model, agent, tier, reason, queue_ms, inference_ms, prompt_tokens, completion_tokens, stream): - """Store detailed performance record in Redis for analytics.""" - if not get_redis(): return - try: - total_ms = queue_ms + inference_ms - tps = completion_tokens / (inference_ms / 1000) if inference_ms > 0 and completion_tokens > 0 else 0 - rec = json.dumps({ - "ts": time.time(), - "model": model, "agent": agent, "tier": tier, "reason": reason, - "queue_ms": round(queue_ms, 1), - "inference_ms": round(inference_ms, 1), - "total_ms": round(total_ms, 1), - "prompt_tokens": prompt_tokens, - "completion_tokens": completion_tokens, - "tokens_per_sec": round(tps, 1), - "stream": stream - }) - # Global recent list (last 500) - r.lpush("perf:recent", rec) - r.ltrim("perf:recent", 0, 499) - # Per-model list (last 200) - r.lpush("perf:model:" + model, rec) - r.ltrim("perf:model:" + model, 0, 199) - # Per-reason list (last 200) - r.lpush("perf:reason:" + reason, rec) - r.ltrim("perf:reason:" + reason, 0, 199) - # Per-agent list (last 200) - r.lpush("perf:agent:" + agent, rec) - r.ltrim("perf:agent:" + agent, 0, 199) - except Exception: - pass - -def is_gpu_busy(model): - """Check if GPU is at or near max concurrent capacity.""" - active = gpu_active_count(model) - max_c = GPU_MAX_CONCURRENT.get(model, 1) - return active >= max_c - - - -# Phase 3: Dynamic GPU Weighting (Health Score) -def gpu_health_score(model): - """Score a GPU based on VRAM, temperature, and load. Lower = better.""" - h = check_gpu_health(model, sidecar_timeout=1.5, gpu_timeout=1) - if h.get("status") == "down": - return 999 # never pick down GPUs - vram_pct = h.get("vram_pct") or 50 - temp_c = h.get("temp_c") or 50 - active = gpu_active_count(model) - max_c = GPU_MAX_CONCURRENT.get(model, 1) - load_pct = (active / max_c) * 100 if max_c > 0 else 0 - # Score: lower = better (more headroom, cooler, less loaded) - score = (vram_pct or 0) * 0.4 + max((temp_c or 50) - 30, 0) * 0.3 + load_pct * 0.3 - return score - -def select_best_gpu(candidates, reason, agent=""): - """Pick best GPU, spreading agents across GPUs to prevent hotspots.""" - # Count how many distinct agents are on each GPU - gpu_agent_counts = {} - if r: - for m in GPU_URLS: - count = 0 - for ak in API_KEYS.values(): - if r.get("agent_gpu:" + ak["agent"] + ":" + m): - count += 1 - gpu_agent_counts[m] = count - # Phase 3: Sort candidates by health score before selection - sorted_candidates = sorted(candidates, key=gpu_health_score) - # First pass: prefer GPUs with 0 other agents (fresh GPU for this agent) - for m in sorted_candidates: - if not is_gpu_busy(m) and gpu_agent_counts.get(m, 0) == 0: - return {"model": m, "reason": reason} - # Second pass: prefer GPU this agent is NOT already on (skip own GPU) - if agent: - for m in sorted_candidates: - if not is_gpu_busy(m) and not r.get("agent_gpu:" + agent + ":" + m): - return {"model": m, "reason": reason} - # Third pass: any non-busy GPU - for m in sorted_candidates: - if not is_gpu_busy(m): - return {"model": m, "reason": reason} - # All busy — pick least loaded - best = None - best_load = 999 - for m in candidates: - load = gpu_active_count(m) - if load < best_load: - best_load = load - best = m - if best: - return {"model": best, "reason": "load_balanced_" + reason} - return None - - - - - -# Phase 1: Circuit Breaker for GPU Hosts (Approved by Abiba) -def is_circuit_tripped(model): - """Check if a GPU host is currently blacklisted.""" - if not get_redis(): - return False - return r.exists("circuit:" + model + ":open") - -def trip_circuit(model, duration=30): - """Blacklist a GPU host for a specified duration.""" - if not get_redis(): - return - key = "circuit:" + model + ":open" - r.set(key, 1, ex=duration) - r.incr("circuit:" + model + ":count") - log.warning("CIRCUIT_TRIPPED: %s blacklisted for %ds", model, duration) - -def half_open_probe(model): - """Check if a GPU host can be un-blacklisted.""" - if not get_redis(): - return True - key = "circuit:" + model + ":open" - if not r.exists(key): - return True # no circuit - return False # still open - -def route(rd, tier, agent=""): - msgs = rd.get("messages",[]); t = estimate_tokens(msgs) - sys = any(m.get("role")=="system" for m in msgs) - turns = len([m for m in msgs if m.get("role") in ("user","assistant")]) - hints = rd.get("routing_hints",{}) - allowed = TIER_MODELS.get(tier, ["gemma-4-12b"]) - # Phase 1: Filter out models with tripped circuit breakers - avail = [m for m in available_models() if m in allowed and not is_circuit_tripped(m)] - if not avail: return {"model": allowed[0], "reason": "all_saturated", "saturated": True} - if all(is_gpu_busy(m) for m in avail): - return {"model": avail[0], "reason": "all_saturated", "saturated": True} - - # GUARD: multimodal -> VLM only (sole vision model) - has_image = any( - isinstance(m.get("content"), list) and - any(p.get("type") == "image_url" for p in m["content"] if isinstance(p, dict)) - for m in msgs - ) - if has_image: - if "gemma-4-12b" in avail and not is_gpu_busy("gemma-4-12b"): - return {"model": "gemma-4-12b", "reason": "vision"} - elif "gemma-4-12b" in avail: - return {"model": "gemma-4-12b", "reason": "vision_saturated", "saturated": True} - else: - return {"model": allowed[0], "reason": "vision_unavailable"} - - req = rd.get("model","auto") - if req != "auto": - target = req if req in avail else avail[0] - if is_gpu_busy(target) and req in allowed: - alts = [m for m in avail if m != target and m in allowed] - if alts: - alt = select_best_gpu(alts, "explicit", agent) - if alt: return alt - return {"model": target, "reason": "explicit"} - - if hints: - if hints.get("priority")=="speed" and "gemma-4-12b" in avail: - return select_best_gpu(["gemma-4-12b"], "hint_speed", agent) or {"model":"gemma-4-12b","reason":"hint_speed"} - if hints.get("priority")=="quality" and "qwen3.6-35B-A3B" in avail: - return select_best_gpu(["qwen3.6-35B-A3B"], "hint_quality", agent) or {"model":"qwen3.6-35B-A3B","reason":"hint_quality"} - if hints.get("priority")=="code" and "qwen3.6-27B-code" in avail: - return select_best_gpu(["qwen3.6-27B-code"], "hint_code", agent) or {"model":"qwen3.6-27B-code","reason":"hint_code"} - - first_msg = msgs[0].get("content","") if msgs else "" - words = len(first_msg.split()) if isinstance(first_msg, str) else 99 - - # TIER 1: Tiny - single-turn micro queries -> VLM (fastest) - if not sys and turns <= 1 and t <= 300 and words <= 100 and "gemma-4-12b" in avail: - if not is_gpu_busy("gemma-4-12b"): - return {"model":"gemma-4-12b","reason":"tiny"} - fallback = [m for m in ["qwen3.6-27B-code","qwen3.6-35B-A3B"] if m in avail] - result = select_best_gpu(fallback, "tiny_fallback", agent) - if result: return result - - # TIER 2: Light - moderate chat -> VLM first (fastest), Dense fallback - if t <= 5000 and turns <= 4: - candidates = [m for m in ["gemma-4-12b","qwen3.6-27B-code","qwen3.6-35B-A3B"] if m in avail] - result = select_best_gpu(candidates, "light", agent) - if result: return result - - # TIER 3: Medium - quality matters -> MoE primary (60%), Dense spillover (40%) - if t <= 30000: - candidates = moe_spillover(avail, ["qwen3.6-35B-A3B","qwen3.6-27B-code","gemma-4-12b"]) - result = select_best_gpu(candidates, "medium", agent) - if result: return result - - # TIER 4: Heavy - quality first -> Dense primary, MoE fallback - if t > 30000: - candidates = [m for m in ["qwen3.6-27B-code","qwen3.6-35B-A3B","gemma-4-12b"] if m in avail] - result = select_best_gpu(candidates, "heavy", agent) - if result: return result - - # TIER 5: Default - MoE primary (60%), Dense spillover (40%) - candidates = moe_spillover(avail, ["qwen3.6-35B-A3B","qwen3.6-27B-code","gemma-4-12b"]) - result = select_best_gpu(candidates, "default", agent) - if result: return result - return {"model":avail[0],"reason":"last_resort"} - - -def moe_spillover(avail, default_order): - """Spill 40% of MoE-first traffic to Dense to prevent Strix Halo overheating. - Only applies when MoE is first candidate, available, and not busy.""" - import random - if (default_order[0] == "qwen3.6-35B-A3B" - and "qwen3.6-35B-A3B" in avail - and not is_gpu_busy("qwen3.6-35B-A3B") - and "qwen3.6-27B-code" in avail - and not is_gpu_busy("qwen3.6-27B-code") - and random.random() < 0.4): - # Swap: Dense first, MoE second - return ["qwen3.6-27B-code","qwen3.6-35B-A3B"] + [m for m in default_order[2:] if m in avail and m not in ("qwen3.6-27B-code","qwen3.6-35B-A3B")] - return [m for m in default_order if m in avail] -def clean_unicode(text): - if not isinstance(text, str): return text - text = text.replace(chr(0x2014), "-"); text = text.replace(chr(0x2013), "-") - text = text.replace(chr(0x2018), "'"); text = text.replace(chr(0x2019), "'") - text = text.replace(chr(0x201C), '"'); text = text.replace(chr(0x201D), '"') - text = text.replace(chr(0x2026), "..."); text = text.replace(chr(0x00A0), " ") - return text.encode("ascii", "ignore").decode("ascii") - -def clean_response(d): - if isinstance(d, dict): return {k: clean_response(v) for k,v in d.items()} - if isinstance(d, list): return [clean_response(v) for v in d] - if isinstance(d, str): return clean_unicode(d) - return d - -def get_metrics(): - d = {"gpus":[],"route_counts":{},"agent_counts":{},"tier_counts":{},"recent":[],"timestamp":time.time(),"active_requests":{}} - for m in GPU_URLS: - h = check_gpu_health(m) - d["gpus"].append({"id":m,"gpu_name":h.get("gpu_name",m),"status":h.get("status"),"vram_used_mb":h.get("vram_used_mb"),"vram_total_mb":h.get("vram_total_mb"),"vram_pct":h.get("vram_pct"),"temp_c":h.get("temp_c"),"gpu_util_pct":h.get("gpu_util_pct"),"power_w":h.get("power_w"),"power_limit_w":h.get("power_limit_w"),"active_requests":gpu_active_count(m), "max_concurrent": GPU_MAX_CONCURRENT.get(m, 1)}) - d["active_requests"][m] = gpu_active_count(m) - if r: - try: - for m in GPU_URLS: d["route_counts"][m] = int(r.get("routes:"+m) or 0) - for k,v in API_KEYS.items(): - c = int(r.get("routes:agent:"+v["agent"]) or 0) - if c>0: d["agent_counts"][v["agent"]] = c - for t in TIER_MODELS: d["tier_counts"][t] = int(r.get("routes:tier:"+t) or 0) - raw = r.lrange("routes:recent",0,49) - d["recent"] = [json.loads(x) for x in raw] if raw else [] - except Exception: pass - return d - -def bcast(): - data = get_metrics(); payload = json.dumps(data) - with sse_lock: - dead = [] - for q in sse_subscribers: - try: q.put(payload) - except Exception: dead.append(q) - for q in dead: sse_subscribers.remove(q) - -QUEUE_TIMEOUT = int(os.environ.get("QUEUE_TIMEOUT", "30")) # max seconds to queue before 503 - -@app.route("/v1/chat/completions", methods=["POST"]) -def chat(): - try: - rd = request.get_json(force=True) - ak = request.headers.get("Authorization","").replace("Bearer ","") - if not ak or ak not in API_KEYS: - log.warning("AUTH_REJECTED: no/invalid API key from %s", request.remote_addr) - return jsonify({"error": "Unauthorized — valid API key required"}), 401 - ki = API_KEYS[ak] - tier, agent = ki["tier"], ki["agent"] - - # Phase 0: dual-key transition — log deprecated key usage - if ki.get("deprecated"): - new_key = next((k for k, v in API_KEYS.items() - if v.get("agent") == agent and not v.get("deprecated")), None) - log.warning("DEPRECATED_KEY: agent=%s using old key %s...%s — switch to %s...%s", - agent, ak[:12], ak[-8:], - new_key[:12] if new_key else "N/A", - new_key[-8:] if new_key else "N/A") - if r: - r.incr("deprecated_usage:" + agent) - - # Rate limit check - allowed, rl_val, reset_sec = check_rate_limit(ak, tier) - if not allowed: - resp = jsonify({"error": "Rate limit exceeded", "retry_after_s": rl_val}) - resp.headers["Retry-After"] = str(rl_val) - resp.headers["X-RateLimit-Limit"] = str(RATE_LIMIT_RPM.get(tier, 30)) - resp.headers["X-RateLimit-Remaining"] = "0" - resp.headers["X-RateLimit-Reset"] = str(int(time.time() + rl_val)) - log.warning("RATE_LIMIT: %s (%s) exceeded limit", agent, ak[-8:]) - return resp, 429 - - # Allow agent to override queue timeout via header - q_timeout = int(request.headers.get("X-Queue-Timeout", str(QUEUE_TIMEOUT))) - - # Cross-turn context tracking: accumulate tokens per session (Phase 2: atomic Lua) - session_id = request.headers.get("X-Session-Id", "") - session_tokens = 0 - if session_id and r: - try: - current = estimate_tokens(rd.get("messages",[])) - # Atomic GET/MAX/SET via Lua script prevents race conditions - session_tokens = r.eval(SESSION_LUA_SCRIPT, 1, "session:" + session_id, current) - except Exception: pass - - d = route(rd, tier, agent) - queue_start = time.time() - - # Queue loop: wait for a GPU slot instead of immediate 503 - while d.get("saturated"): - elapsed = time.time() - queue_start - if elapsed > q_timeout: - resp = jsonify({"error": "All GPUs saturated", "queued_s": round(elapsed,1), "retry_after_s": 5}) - resp.headers["Retry-After"] = "5" - log.warning("QUEUE_TIMEOUT: %s waited %.1fs, all GPUs saturated", agent, elapsed) - return resp, 503 - time.sleep(0.5) # poll every 500ms - d = route(rd, tier, agent) - - queue_ms = (time.time() - queue_start) * 1000 - if queue_ms > 500: - log.info("QUEUED: %s waited %.0fms before slot opened", agent, queue_ms) - model, reason, url = d["model"], d["reason"], GPU_URLS[d["model"]] - - # Stash rate limit values for response headers - _rl_remaining = rl_val - _rl_limit = RATE_LIMIT_RPM.get(tier, 30) - _rl_reset = reset_sec - is_stream = rd.get("stream", False) - - gpu_incr(model) - - log.info("ROUTE: %s -> %s (%s) stream=%s active=%d/%d", agent, model, reason, is_stream, gpu_active_count(model), GPU_MAX_CONCURRENT.get(model,1)) - # Track which GPU this agent is using (TTL 120s covers typical request) - if r and agent: - try: r.setex("agent_gpu:" + agent + ":" + model, 120, "1") - except: pass - if r: - try: - r.incr("routes:"+model); r.incr("routes:tier:"+tier); r.incr("routes:agent:"+agent) - r.incr("ts:"+model+":"+time.strftime("%Y%m%d%H")) - r.lpush("routes:recent", json.dumps({"ts":time.time(),"model":model,"reason":reason,"tier":tier,"agent":agent,"queue_ms": round(queue_ms,1)})) - r.ltrim("routes:recent",0,999) - except Exception: pass - start = time.time() - resp = requests.post(url+"/chat/completions", json=rd, - headers={"Content-Type":"application/json","Authorization":"Bearer not-needed"}, timeout=300, stream=is_stream) - lat = int((time.time()-start)*1000) - gpu_decr(model) - - if resp.status_code != 200: - if resp.status_code in (502, 504): - trip_circuit(model, 30) - return jsonify({"error":"GPU error "+str(resp.status_code)}), 502 - if is_stream: - # Buffer SSE chunks, handle split lines for large responses - chunks = [] - stream_timings = {} - buf = "" # accumulate partial lines - for raw in resp.iter_content(chunk_size=None, decode_unicode=True): - if raw: - cleaned = clean_unicode(raw) - chunks.append(cleaned) - buf += cleaned - # Process complete lines from buffer - while "\n" in buf: - line, buf = buf.split("\n", 1) - line = line.strip() - if line.startswith("data: ") and not stream_timings: - js = line[6:].strip() - if js.startswith("{") and "timings" in js and "predicted_n" in js: - try: - tj = json.loads(js).get("timings", {}) - if tj: - stream_timings = tj - except: pass - # Store perf record with real token counts from stream - if stream_timings: - pt = stream_timings.get("prompt_n", 0) - ct = stream_timings.get("predicted_n", 0) - tps = stream_timings.get("predicted_per_second", 0) - gen_ms = stream_timings.get("predicted_ms", lat) - store_perf_record(model, agent, tier, reason, queue_ms, gen_ms, pt, ct, True) - else: - store_perf_record(model, agent, tier, reason, queue_ms, lat, estimate_tokens(rd.get("messages",[])), 0, True) - # Yield all chunks to client - def gen(): - for c in chunks: yield c - bcast() - ctx_remaining = GPU_CONTEXT.get(model, 65536) - max(session_tokens, estimate_tokens(rd.get("messages",[]))) - ctx_pct = ctx_remaining / GPU_CONTEXT.get(model, 65536) * 100 - ctx_warning = "compact_urgent" if ctx_pct < 5 else ("compact_recommended" if ctx_pct < 15 else ("compact_soon" if ctx_pct < 30 else "ok")) - sse_resp = Response(stream_with_context(gen()), mimetype="text/event-stream") - sse_resp.headers["X-RateLimit-Limit"] = str(_rl_limit) - sse_resp.headers["X-RateLimit-Remaining"] = str(max(0, _rl_remaining)) - sse_resp.headers["X-RateLimit-Reset"] = str(int(time.time() + _rl_reset)) - sse_resp.headers["X-Context-Remaining"] = str(max(0, ctx_remaining)) - sse_resp.headers["X-Context-Warning"] = ctx_warning - sse_resp.headers["X-Context-Model"] = model - return sse_resp - data = clean_response(resp.json()) - for c in data.get("choices",[]): - msg = c.get("message",{}) - if not msg.get("content") and msg.get("reasoning_content"): - msg["content"] = msg["reasoning_content"] - # Extract performance data from llama.cpp response - usage = data.get("usage", {}) - timings = data.get("timings", {}) - prompt_tokens = usage.get("prompt_tokens", 0) - completion_tokens = usage.get("completion_tokens", 0) - inference_ms = lat # total GPU round-trip - store_perf_record(model, agent, tier, reason, queue_ms, inference_ms, prompt_tokens, completion_tokens, False) - ctx_remaining = GPU_CONTEXT.get(model, 65536) - max(session_tokens, estimate_tokens(rd.get("messages",[]))) - ctx_pct = ctx_remaining / GPU_CONTEXT.get(model, 65536) * 100 - ctx_warning = "compact_urgent" if ctx_pct < 5 else ("compact_recommended" if ctx_pct < 15 else ("compact_soon" if ctx_pct < 30 else "ok")) - data["routing"] = {"model":model,"reason":reason,"gpu":url,"tier":tier,"agent":agent,"latency_ms":lat,"queue_ms": round(queue_ms,1),"active_gpu":gpu_active_count(model),"context_remaining": max(0, ctx_remaining),"context_pct": round(ctx_pct,1),"context_warning": ctx_warning} - resp = jsonify(data) - resp.headers["X-RateLimit-Limit"] = str(_rl_limit) - resp.headers["X-RateLimit-Remaining"] = str(max(0, _rl_remaining)) - resp.headers["X-RateLimit-Reset"] = str(int(time.time() + _rl_reset)) - resp.headers["X-Context-Remaining"] = str(max(0, ctx_remaining)) - resp.headers["X-Context-Warning"] = ctx_warning - resp.headers["X-Context-Model"] = model - bcast() - return resp - except requests.Timeout: - gpu_decr(model) - trip_circuit(model, 30) - log.error("TIMEOUT: %s -> %s (Circuit tripped)", agent, model) - return jsonify({"error":"timeout"}), 504 - except Exception as e: - gpu_decr(model) - log.error("Error: %s\n%s", e, traceback.format_exc()) - return jsonify({"error":str(e)}), 500 - -@app.route("/metrics/performance") -def performance(): - """Per-request performance analytics with percentiles per model/reason/agent.""" - if not get_redis(): return jsonify({"error": "Redis unavailable"}), 503 - try: - window_hours = int(request.args.get("window", "24").replace("h","")) - model_filter = request.args.get("model", "all") - - # Load recent records - cutoff = time.time() - (window_hours * 3600) - raw = r.lrange("perf:recent", 0, -1) - records = [] - for x in raw: - try: - rec = json.loads(x) - if rec["ts"] >= cutoff: - records.append(rec) - except: pass - - # Filter by model if specified - if model_filter != "all": - records = [r for r in records if r["model"] == model_filter] - - if not records: - return jsonify({"models": [], "reasons": [], "agents": [], "summary": {"total_requests": 0}}) - - def pct(values, p): - if len(values) < 2: return round(values[0], 1) if values else 0 - return round(statistics.quantiles(sorted(values), n=100, method='inclusive')[min(p-1, 98)], 1) - - # Per-model stats - model_groups = {} - for rec in records: - m = rec["model"] - if m not in model_groups: model_groups[m] = [] - model_groups[m].append(rec) - - models = [] - for m, recs in sorted(model_groups.items()): - latencies = [r["total_ms"] for r in recs] - tps_vals = [r["tokens_per_sec"] for r in recs if r["tokens_per_sec"] > 0] - non_stream = [r for r in recs if not r["stream"]] - queue_times = [r["queue_ms"] for r in non_stream] - models.append({ - "model": m, - "count": len(recs), - "stream_pct": round(len([r for r in recs if r["stream"]]) / len(recs) * 100, 1), - "latency": { - "avg": round(statistics.mean(latencies), 1), - "p50": pct(latencies, 50), - "p95": pct(latencies, 95), - "p99": pct(latencies, 99) - }, - "throughput": { - "avg_tokens_per_sec": round(statistics.mean(tps_vals), 1) if tps_vals else 0, - "p50": pct(tps_vals, 50) if tps_vals else 0, - "p95": pct(tps_vals, 95) if tps_vals else 0, - }, - "queue": { - "avg_ms": round(statistics.mean(queue_times), 1) if queue_times else 0, - "p95_ms": pct(queue_times, 95) if queue_times else 0, - } if queue_times else None - }) - - # Per-reason stats - reason_groups = {} - for rec in records: - rsn = rec["reason"] - if rsn not in reason_groups: reason_groups[rsn] = [] - reason_groups[rsn].append(rec) - - reasons = [] - for rsn, recs in sorted(reason_groups.items(), key=lambda x: -len(x[1])): - latencies = [r["total_ms"] for r in recs] - reasons.append({ - "reason": rsn, - "count": len(recs), - "avg_total_ms": round(statistics.mean(latencies), 1), - "p95_total_ms": pct(latencies, 95) - }) - - # Per-agent stats - agent_groups = {} - for rec in records: - ag = rec["agent"] - if ag not in agent_groups: agent_groups[ag] = [] - agent_groups[ag].append(rec) - - agents = [] - for ag, recs in sorted(agent_groups.items(), key=lambda x: -len(x[1])): - latencies = [r["total_ms"] for r in recs] - tps_vals = [r["tokens_per_sec"] for r in recs if r["tokens_per_sec"] > 0] - agents.append({ - "agent": ag, - "count": len(recs), - "avg_total_ms": round(statistics.mean(latencies), 1), - "avg_tokens_per_sec": round(statistics.mean(tps_vals), 1) if tps_vals else 0 - }) - - all_lat = [r["total_ms"] for r in records] - all_tps = [r["tokens_per_sec"] for r in records if r["tokens_per_sec"] > 0] - summary = { - "total_requests": len(records), - "window_hours": window_hours, - "latency": { - "avg_ms": round(statistics.mean(all_lat), 1), - "p50_ms": pct(all_lat, 50), - "p95_ms": pct(all_lat, 95), - "p99_ms": pct(all_lat, 99) - }, - "throughput_avg_tps": round(statistics.mean(all_tps), 1) if all_tps else 0 - } - - return jsonify({"models": models, "reasons": reasons, "agents": agents, "summary": summary}) - except Exception as e: - return jsonify({"error": str(e)}), 500 - -@app.route("/metrics/scatter") -def scatter(): - """Return individual data points for scatter plots (prompt_tokens vs latency).""" - if not get_redis(): return jsonify({"error": "Redis unavailable"}), 503 - try: - window_hours = int(request.args.get("window", "24").replace("h","")) - model_filter = request.args.get("model", "all") - cutoff = time.time() - (window_hours * 3600) - raw = r.lrange("perf:recent", 0, -1) - points = [] - for x in raw: - try: - rec = json.loads(x) - if rec["ts"] >= cutoff: - if model_filter == "all" or rec["model"] == model_filter: - points.append({ - "model": rec["model"], - "agent": rec["agent"], - "reason": rec["reason"], - "prompt_tokens": int(rec.get("prompt_tokens", 0)), - "completion_tokens": rec.get("completion_tokens", 0), - "inference_ms": round(rec["inference_ms"], 1), - "tokens_per_sec": rec.get("tokens_per_sec", 0), - "stream": rec.get("stream", False) - }) - except: pass - return jsonify({"points": points, "count": len(points)}) - except Exception as e: - return jsonify({"error": str(e)}), 500 - -@app.route("/v1/models") -def models(): - def _h(m): return check_gpu_health(m, sidecar_timeout=1.5, gpu_timeout=1) - return jsonify({"object":"list","data":[{"id":m,"object":"model","owned_by":"syslog","status":_h(m).get("status"),"gpu":_h(m).get("gpu_name")} for m in GPU_URLS]}) - -@app.route("/health") -def health(): - gpus = {} - for m in GPU_URLS: - h = check_gpu_health(m, sidecar_timeout=1.5, gpu_timeout=1) - h["active_requests"] = gpu_active_count(m) - h["max_concurrent"] = GPU_MAX_CONCURRENT.get(m, 1) - gpus[m] = h - return jsonify({"status":"healthy","redis":"connected" if r else "down","gpus":gpus,"available_models":available_models()}) - -@app.route("/metrics") -def metrics(): return jsonify(get_metrics()) - -@app.route("/metrics/timeseries") -def metrics_timeseries(): - period = request.args.get("period", "day"); models_list = list(GPU_URLS.keys()) - data = {"models": {}, "labels": []} - if period == "day": - buckets = [time.strftime("%Y%m%d%H", time.gmtime(time.time()-h*3600)) for h in range(23,-1,-1)] - data["labels"] = [time.strftime("%H:00", time.gmtime(time.time()-h*3600)) for h in range(23,-1,-1)] - elif period == "week": - buckets = [time.strftime("%Y%m%d", time.gmtime(time.time()-d*86400)) for d in range(6,-1,-1)] - data["labels"] = [time.strftime("%a", time.gmtime(time.time()-d*86400)) for d in range(6,-1,-1)] - else: - buckets = [time.strftime("%Y%m%d", time.gmtime(time.time()-d*86400)) for d in range(29,-1,-1)] - data["labels"] = [time.strftime("%m/%d", time.gmtime(time.time()-d*86400)) for d in range(29,-1,-1)] - if r: - for model in models_list: - counts = [] - for bucket in buckets: - total = 0 - if period in ("week","month"): - for hh in range(24): total += int(r.get("ts:"+model+":"+bucket+"{:02d}".format(hh)) or 0) - else: total = int(r.get("ts:"+model+":"+bucket) or 0) - counts.append(total) - data["models"][model] = counts - return jsonify(data) - - - -@app.route("/metrics/circuit-breaker") -def metrics_circuit_breaker(): - """Expose circuit breaker status per model. Phase 1.""" - result = {} - if r: - for model in GPU_URLS: - key = "circuit:" + model + ":open" - duration = r.ttl(key) - trip_count = int(r.get("circuit:" + model + ":count") or 0) - result[model] = { - "tripped": r.exists(key), - "remaining_ttl": duration, - "trip_count": trip_count - } - return jsonify(result) - - -@app.route("/metrics/gpu-health") -def metrics_gpu_health(): - """Live GPU health scores + circuit breaker + KPIs.""" - result = {"gpus": [], "ts": time.time()} - for model in GPU_URLS: - h = check_gpu_health(model, sidecar_timeout=1.5, gpu_timeout=1) - score = gpu_health_score(model) - active = gpu_active_count(model) - max_c = GPU_MAX_CONCURRENT.get(model, 1) - cb_tripped = bool(r and r.exists("circuit:" + model + ":open")) - cb_count = int(r.get("circuit:" + model + ":count") or 0) if r else 0 - result["gpus"].append({ - "id": model, - "label": GPU_LABELS.get(model, model), - "status": h.get("status", "unknown"), - "vram_pct": h.get("vram_pct", 0), - "temp_c": h.get("temp_c", 0), - "vram_used_mb": h.get("vram_used_mb", 0), - "vram_total_mb": h.get("vram_total_mb", 0), - "gpu_name": h.get("gpu_name", model), - "health_score": round(score, 1), - "active_requests": active, - "max_concurrent": max_c, - "circuit_tripped": cb_tripped, - "circuit_trip_count": cb_count - }) - online = sum(1 for g in result["gpus"] if g["status"] in ("healthy", "saturated")) - trips = sum(g["circuit_trip_count"] for g in result["gpus"]) - result["kpi"] = {"gpus_online": online, "total_trips": trips, "total_gpus": len(GPU_URLS)} - return jsonify(result) - -@app.route("/metrics/latency") -def metrics_latency(): - """Lightweight latency summary for dashboard KPIs.""" - if not r: return jsonify({"avg_ms": 0, "requests_per_min": 0}) - recent = [] - for x in (r.lrange("routes:recent", 0, 49) or []): - try: recent.append(json.loads(x)) - except: pass - if not recent: return jsonify({"avg_ms": 0, "requests_per_min": 0, "count": 0}) - now = time.time() - last_min = [x for x in recent if now - x.get("ts", 0) < 60] - latencies = [x.get("queue_ms", 0) + x.get("inference_ms", 0) for x in last_min if "inference_ms" in x] - return jsonify({ - "avg_ms": round(sum(latencies) / len(latencies), 1) if latencies else 0, - "requests_per_min": len(last_min), - "count": len(recent) - }) -@app.route("/stream") -def stream(): - def ev(): - q = queue.Queue() - with sse_lock: sse_subscribers.append(q) - try: - yield "data: "+json.dumps(get_metrics())+"\n\n" - while True: - try: yield "data: "+q.get(timeout=3)+"\n\n" - except queue.Empty: yield "data: "+json.dumps(get_metrics())+"\n\n" - except GeneratorExit: pass - finally: - with sse_lock: - if q in sse_subscribers: sse_subscribers.remove(q) - return Response(stream_with_context(ev()), mimetype="text/event-stream", - headers={"Cache-Control":"no-cache","X-Accel-Buffering":"no","Access-Control-Allow-Origin":"*"}) - -# ── Phase 0: Admin Key Management ── -ADMIN_KEY = os.environ.get("ADMIN_KEY", "") - -def _admin_auth(): - """Require admin key for management endpoints.""" - if not ADMIN_KEY: - return False, "ADMIN_KEY not configured on server" - ak = request.headers.get("Authorization","").replace("Bearer ","") - if ak != ADMIN_KEY: - return False, "Admin key required" - return True, None - -@app.route("/admin/keys") -def admin_keys(): - """List all API keys (masked) with agent, tier, and deprecation status.""" - ok, err = _admin_auth() - if not ok: return jsonify({"error": err}), 401 - keys = [] - for key, info in API_KEYS.items(): - masked = key[:8] + "..." + key[-8:] - keys.append({ - "masked": masked, - "prefix": key[:8], - "agent": info["agent"], - "tier": info["tier"], - "deprecated": info.get("deprecated", False), - "length": len(key) - }) - return jsonify({ - "total": len(keys), - "active": sum(1 for k in keys if not k["deprecated"]), - "deprecated": sum(1 for k in keys if k["deprecated"]), - "keys": sorted(keys, key=lambda k: (k["deprecated"], k["agent"])) - }) - -@app.route("/admin/keys/deprecation-summary") -def admin_deprecation_summary(): - """Summary of deprecated key usage (from Redis logs, if available).""" - ok, err = _admin_auth() - if not ok: return jsonify({"error": err}), 401 - deprecated_agents = [] - for key, info in API_KEYS.items(): - if info.get("deprecated"): - # Check Redis for usage count - count = 0 - if r: - count = int(r.get("deprecated_usage:" + info["agent"]) or 0) - deprecated_agents.append({ - "agent": info["agent"], - "deprecated_uses": count, - "needs_migration": count > 0 - }) - return jsonify({ - "deprecated_agents": sorted(deprecated_agents, key=lambda d: -d["deprecated_uses"]), - "recommendation": "Run POST /admin/keys/revoke to remove keys with 0 usage" - }) - -@app.route("/admin/keys/generate", methods=["POST"]) -def admin_generate_key(): - """Generate a new API key for an agent. Body: {"agent": "Name", "tier": "enterprise"}""" - ok, err = _admin_auth() - if not ok: return jsonify({"error": err}), 401 - body = request.get_json(force=True) - agent = body.get("agent", "").strip() - tier = body.get("tier", "enterprise") - if not agent: - return jsonify({"error": "agent field required"}), 400 - if tier not in ("starter", "professional", "enterprise"): - return jsonify({"error": "tier must be starter/professional/enterprise"}), 400 - # Generate secure key - import secrets, hashlib - prefix = hashlib.sha256(secrets.token_bytes(12)).hexdigest()[:8] - suffix = secrets.token_hex(20) - new_key = f"sk-{prefix}-{suffix}" - # Update in-memory dict (note: not persisted across restarts without env var update) - API_KEYS[new_key] = {"tier": tier, "agent": agent} - log.info("KEY_GENERATED: agent=%s tier=%s key=%s...%s", agent, tier, new_key[:8], new_key[-8:]) - return jsonify({ - "agent": agent, - "tier": tier, - "key": new_key, - "masked": new_key[:8] + "..." + new_key[-8:], - "warning": "This key exists in memory only. Update API_KEYS env var and redeploy to persist." - }), 201 - -@app.route("/admin/keys/revoke", methods=["POST"]) -def admin_revoke_key(): - """Revoke a deprecated key. Body: {"agent": "Name"} or {"key_prefix": "sk-xxxx"}""" - ok, err = _admin_auth() - if not ok: return jsonify({"error": err}), 401 - body = request.get_json(force=True) - agent = body.get("agent", "") - key_prefix = body.get("key_prefix", "") - revoked = [] - keys_to_remove = [] - for key, info in API_KEYS.items(): - if not info.get("deprecated"): - continue - if agent and info["agent"] == agent: - keys_to_remove.append(key) - elif key_prefix and key.startswith(key_prefix): - keys_to_remove.append(key) - for key in keys_to_remove: - info = API_KEYS.pop(key) - revoked.append({"agent": info["agent"], "masked": key[:8] + "..." + key[-8:]}) - log.warning("KEY_REVOKED: agent=%s key=%s...%s", info["agent"], key[:8], key[-8:]) - return jsonify({ - "revoked": len(revoked), - "keys": revoked, - "remaining_total": len(API_KEYS), - "warning": "Memory-only revoke. Update API_KEYS env var and redeploy to persist." - }) - -if __name__ == "__main__": - log.info("Router on :9000 (load-aware)") - app.run(host="0.0.0.0", port=9000, debug=False)