A self-hosted proxy between your coding agents and your LLM backends. It routes each request to the right model — local or cloud — 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 are converted — system prompts, tools, streaming SSE, 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 — llama.cpp, vLLM, SGLang, or the cloud APIs — and it does exactly four things well.
One Rust binary · 205 tests · MIT licensed