A self-hosted proxy between your coding agents and your LLM backends. It routes each request to the right local or cloud model and translates dialects only when it has to. One binary, one config file, nothing else to run.
docker run -p 8080:8080 -v ./hlid.toml:/app/hlid.toml ghcr.io/skaft-software/hlid:latestAgents keep speaking whatever they already speak: Anthropic Messages, OpenAI Chat, Responses, or legacy Completions. hlid matches the model name against your backend registry, forwards bytes untouched when dialects agree, and translates when they don't.
Glob patterns map model names to backends. llama-* to the box under your desk, claude-* to Anthropic. First match wins.
Passthrough-first: matching dialects forward byte-for-byte. Cross-dialect requests convert system prompts, tools, streaming SSE, and token usage.
Every request lands in a ring buffer: model, backend, dialect, latency, tokens, errors. curl /hlid/requests and see.
Backend API keys live in one place and never reach your agents. Optional key on hlid itself; localhost stays frictionless.
cat > hlid.toml << 'EOF' bind_addr = "0.0.0.0:8080" [[backends]] model_pattern = "*" url = "http://localhost:8081" dialect = "openai-chat" EOF
docker run -p 8080:8080 \ -v ./hlid.toml:/app/hlid.toml \ ghcr.io/skaft-software/hlid:latest
export ANTHROPIC_BASE_URL=http://localhost:8080 # or export OPENAI_BASE_URL=http://localhost:8080
hlid never runs models. No downloads, no GPU management, no lifecycle. It is the gate in front of the servers you already run, including llama.cpp, vLLM, SGLang, and cloud APIs. It does exactly four things well.
One Rust binary · 205 tests · MIT licensed