A lightweight, observable LLM API proxy with built-in tracing for OpenAI, Anthropic, Google Gemini, and Meta Muse. Capture and visualize all your LLM traffic using Arize Phoenix.
Native OAuth passthrough for the Big 3 agentic CLIs (Claude Code, OpenAI Codex, Gemini CLI). You log in with your normal plan; the proxy does not require or manage API keys, and simply forwards traffic while tracing it.
- 🔄 Multi-Provider Support: Proxies OpenAI (
/v1/*), Anthropic (/v1/messages/*), Gemini (/v1beta/*), and Meta Muse (/meta/v1/*,/muse-code/*) API endpoints - 📊 Built-in Observability: Automatic OpenTelemetry tracing to Arize Phoenix
- 🌊 Streaming Support: Full support for streaming responses with token usage capture
- 🐳 Docker-Ready: Complete Docker Compose setup with Phoenix included
- 🔧 Flexible Configuration: YAML-based config with environment variable support
- 🎯 Model-Aware Routing: Intelligent routing based on model names and API paths
Perfect for:
- Debugging agentic CLI tools (Claude Code, Gemini CLI, OpenAI Codex) with OAuth passthrough
- Monitoring LLM API usage and costs
- Tracing complex multi-turn conversations
- Analyzing prompt/response patterns
- Capturing token usage across providers
Scoped to: Claude Code, OpenAI Codex, the QuixiAI fork of Gemini CLI (with --base-url), and Meta Muse (with --base-url). Muse routing was verified against local mock upstreams with Muse 1.4.6-R6000.1; a live authenticated Meta completion has not been verified. Other clients such as open-code, continue.dev, rooCode, cline, or local runtimes (vLLM/sglang/ollama/lmstudio/llamacpp) are untested/unsupported.
- Docker and Docker Compose
-
Clone and navigate to the project:
git clone https://github.com/QuixiAI/VibeLogger.git cd VibeLogger -
Start the services (Daemon Mode): Run in the background with
-d:mkdir -p ~/phoenix-data docker compose up --build -d -
Access the services:
- Phoenix UI: http://localhost:6006
- Proxy API: http://localhost:8082
- Health check: http://localhost:8082/health
By default, Phoenix data is stored in ~/phoenix-data on your host machine. To store it elsewhere, set the PHOENIX_DATA_DIR environment variable before starting docker:
export PHOENIX_DATA_DIR=/path/to/your/data
mkdir -p $PHOENIX_DATA_DIR
docker compose up -dIf port 8082 is in use, you can change the host port using the PROXY_PORT variable:
# Run the proxy on port 9000 instead
export PROXY_PORT=9000
docker compose up -dEdit config.yaml to customize behavior:
# Phoenix collector endpoint (default works with Docker Compose)
phoenix_collector_endpoint: "http://phoenix:6006/v1/traces"
# Optional upstream API base URL overrides
gemini_base_url: null
anthropic_upstream_base: "https://api.anthropic.com"
openai_upstream_base: "https://api.openai.com"
meta_upstream_base: "https://api.meta.ai"Authenticate in your client as you normally would (OAuth or existing login/session); the proxy simply forwards traffic and does not store credentials or API keys.
If your client only honors standard proxy variables, set HTTP_PROXY / HTTPS_PROXY to http://localhost:8082 (and NO_PROXY for any hosts you want to bypass).
| Tool | How to point at the proxy |
|---|---|
| Claude Code | ANTHROPIC_BASE_URL=http://localhost:8082 |
| Meta Muse | muse --base-url http://localhost:8082/meta/v1 |
| OpenAI Codex | OPENAI_BASE_URL=http://localhost:8082/v1 |
| Gemini CLI (QuixiAI fork) | npm install -g github:QuixiAI/gemini-cli then gemini -url http://localhost:8082 "<prompt>" |
Point Claude tools to the proxy using ANTHROPIC_BASE_URL.
export ANTHROPIC_BASE_URL="http://localhost:8082"
claudePoint OpenAI-compatible tools to the proxy using OPENAI_BASE_URL. Note that for OpenAI, you usually need to append /v1.
export OPENAI_BASE_URL="http://localhost:8082/v1"
codexKeep your normal Muse login and override the provider URL:
muse --base-url http://localhost:8082/meta/v1
# Headless runs:
muse exec --base-url http://localhost:8082/meta/v1 "Reply with OK."The proxy strips /meta and forwards /v1/responses (including streaming),
other /v1/* provider calls, and Muse's /meta/muse-code/* and origin-relative /muse-code/* calls to
https://api.meta.ai. It preserves Muse's authorization and session headers,
and records request/response bodies and token usage in Phoenix. The separate
prefix allows Claude Code and OpenAI clients to keep their existing settings.
Muse's launcher downloads and login traffic are separate from provider requests
and are not redirected by this option.
After updating the proxy source, rebuild just the proxy service:
cd ~/VibeLogger
docker compose up -d --build --no-deps proxyThis recreates the proxy container and briefly interrupts active streams; run it between Claude Code requests. Phoenix's container and stored traces remain in place.
Standard Gemini CLI tools don't natively support proxies well. Use the QuixiAI fork of gemini-cli which adds the --base-url flag.
# Install gemini-cli
npm install -g github:QuixiAI/gemini-cli
# Run with --base-url flag
gemini --base-url http://localhost:8082 "Hello world"┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ LLM Client │─────▶│ VibeLogger │─────▶│ Upstream APIs │
│ │ │ (Port 8082) │ │ (OpenAI/etc) │
└─────────────┘ └──────┬───────┘ └─────────────────┘
│
│ OpenTelemetry
│ Traces (OTLP)
│
┌──────▼───────┐
│ Phoenix │
│ (Port 6006) │
└──────────────┘
The proxy:
- Receives LLM API requests from your clients
- Creates OpenTelemetry spans with full request/response data
- Forwards requests to the appropriate upstream API
- Streams responses back to clients
- Exports traces to Phoenix for visualization
All requests are traced with:
- Request/response bodies (
⚠️ may contain sensitive data) - Token usage statistics
- Latency metrics
- Model and provider information
- Streaming chunk details
View traces in the Phoenix UI at http://localhost:6006 to analyze:
- Request patterns and frequency
- Token consumption per model
- Error rates and types
- Response latencies
- Full conversation flows
MIT
Contributions welcome! Please open an issue or PR.