Latest commit

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

unhardcoded

An OpenAI-compatible LLM router. Instead of hardcoding a model, a caller sends a policy with each request: the host filters the candidate models to those that qualify, ranks the survivors and picks one (e.g. the cheapest that passes) — over your own provider keys — and falls back automatically when a provider errors. Every run records which models passed, which were rejected and why.

Concretely it's an async FastAPI shim that runs the unhardcoded-engine core and inherits its provider selection, fallback, retry and per-provider auth. The core is vendored as a git submodule under core/; this repo is the host (the I/O, auth, providers, the HTTP service) plus an operator dashboard to compose, test and analyse policies. The policy algebra (Σ_pol) lives in the core.

The model: callers send a policy

A request carries its own Σ_pol policy as data — a policy_ir term in the body. The host admits it (sorts, arity, depth/size bounds), ∧-composes the host's policy_envelope so a caller can only narrow the host's invariants, then runs it: filter the candidate models, score the survivors, pick and fall back. Compose, preview, test live and download policies in the dashboard Builder.

There are no intelligence tiers. When a caller sends no policy, a single declarative default policy (balanced quality/cost) is the fallback — itself a Σ_pol term with an identity, editable like any other.

Layout

core/ -- git submodule -> genlayerlabs/unhardcoded-engine (the pure Σ_pol core)
llm_router_host.py -- embeds the core via lupa; sync/async backends; auth resolver
shim.py -- OpenAI-compatible app: /v1/chat/completions and /v1/responses (+ per-call policy_ir) and /x/* operator endpoints
responses_api.py -- inbound OpenAI *Responses* API surface for /v1/responses (sibling of the chat-completions surface)
auth_proxy.py -- ingress + operator dashboard (Analytics · Builder · Activity · Market · Settings)
serve.py -- entry point: wires the api_kind dispatcher + runs uvicorn
config.live.lua -- catalog (providers + models), the `default` policy, and the observation fields (incl. OpenRouter benchmark/modality/capability fields)
scripts/refresh_model_meta.py -- the job: writes model_meta.lua (model-level traits pulled from OpenRouter)
codex_auth.py / codex_backend.py -- the ChatGPT-subscription (Codex) provider
metrics.live.lua -- EMA seed (PLACEHOLDER/fake — see docs/METRICS.md)
docs/METRICS.md -- the metrics seed: format, codex≈0, regeneration (it's fake)
docs/PROVIDERS.md -- per-provider auth + the AntSeed node
docs/OPENAI-CODEX.md -- the ChatGPT-subscription provider (unofficial / ToS-risky)
docs/USAGE_ENDPOINTS.md -- per-key usage stats API endpoints and auth behavior
live_smoke.py -- drive real providers end-to-end
tests/ -- the full host unit-test suite
features/ -- BDD user-flow suite (behave); user_flows.json is the spec
SETUP.md -- agent/human setup runbook (clone -> running -> first call)
scripts/gen-dev-wallet.sh -- generate a local AntSeed dev wallet (testing)

Quickstart

Point a coding agent at SETUP.md ("set up unhardcoded by following SETUP.md") for a guided, copy-pasteable runbook — or do it yourself:

git clone --recursive https://github.com/genlayerlabs/unhardcoded.git &&cd unhardcoded
cp .env.example .env.secrets && chmod 600 .env.secrets
# in .env.secrets: set OPENROUTER_API_KEY, and DASHBOARD_NO_AUTH=1 for local dev
docker compose up -d --build
curl -fsS http://127.0.0.1:8080/healthz # -> {"ok":true,"initialized":true}

Open the dashboard at http://127.0.0.1:8080/dashboard, mint a caller key (POST /dashboard/api/keys {"consumer":"my-app"}, or Consumers → Generate key), then call:

curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"Reply: pong"}]}'

Empty model runs the default policy; or send family:/pin:/profile: or a per-call policy_ir/flow_ir (below). Optional providers (Codex, AntSeed) and troubleshooting are in SETUP.md.

Responses-only clients (e.g. the Codex CLI):POST /v1/responses (and POST /{profile}/v1/responses) speak the OpenAI Responses API — translated to the same routing/policy/metering as chat-completions, streaming Responses SSE. Point Codex at the router with base_url=…/v1, wire_api = "responses", and the router key; use a /{profile}/v1/responses base_url to pin a policy by URL (Codex can't put policy_ir in its body).

Develop without Docker (raw shim — no dashboard/auth)

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt
python serve.py --config config.live.lua --default-profile default --host 127.0.0.1 --port 8080

serve.py is the data plane only (no ingress auth, no dashboard); provider keys come from the process env. The bearer-token contract and the dashboard live in the ingress service (docker compose). (Nix users: a nix-shell with the same packages works too.)

Policies (the model field + policy_ir)

Routing is server-side. The primary path is a per-call policy; the model prefix is sugar for the common cases:

client sendshost does
policy_ir term in the bodyrun that Σ_pol policy (the primary path)
"" / unprefixed modelthe default policy
model = "profile:NAME"a named profile from the catalog (only default ships)
model = "family:FAMILY"default, pinned to a model family
model = "pin:PROVIDER/FAMILY"default, pinned to one (provider, family)

A policy is a Σ_pol term: filter (which models qualify) → score (rank the survivors) → pick (the selector) + request transform + failover. Write it as raw IR, or compose it in the Builder (structured rows ↔ raw term). The vocabulary it filters/scores over includes live fields (price_in/price_out, latency_ms, success_rate, …) and host-declared fields — the OpenRouter benchmarks/modalities/capabilities (bench_intelligence, in_image, cap_tools, …). See the core's core/docs/SIGMA-POL.md for the algebra; config.live.lua declares the host fields and the default policy.

Dashboard

auth_proxy serves an operator console at /dashboard:

  • Analytics — spend, traffic and errors over time, filtered by timeframe, consumer, provider and model.
  • Builder — compose a policy over raw + benchmark fields, preview the live ranking, Test call it with a prompt, and download the term to run per call.
  • Activity — per-request trace: the policy that ran (copyable), the ordered fallback chain with the error at each step, and the cost paid.
  • Market — live price book per model family.
  • Settings — consumer keys and provider keys.

Tests

Install the test deps once (a virtualenv keeps them off your system Python):

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt

Unit — boots a real host with mocked provider responses (only the outbound HTTP to upstream providers is mocked):

python -m pytest tests -q

BDD user-flow suite (features/, behave) — drives the live stack end to end the way the dashboard does and asserts the rendered data is correct, including a real headless-browser pass (needs Chrome/Chromium installed; Selenium fetches the matching driver). Free & repeatable: end-to-end chats route to a $0 path. The catalogue of flows it covers is user_flows.json:

behave

(Nix users: nix-shell -p ... with the same packages — plus chromium chromedriver for the browser pass — works as before.)

About

OpenAI-compatible LLM policy router

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

unhardcoded

An OpenAI-compatible LLM router. Instead of hardcoding a model, a caller sends a policy with each request: the host filters the candidate models to those that qualify, ranks the survivors and picks one (e.g. the cheapest that passes) — over your own provider keys — and falls back automatically when a provider errors. Every run records which models passed, which were rejected and why.

Concretely it's an async FastAPI shim that runs the unhardcoded-engine core and inherits its provider selection, fallback, retry and per-provider auth. The core is vendored as a git submodule under core/; this repo is the host (the I/O, auth, providers, the HTTP service) plus an operator dashboard to compose, test and analyse policies. The policy algebra (Σ_pol) lives in the core.

The model: callers send a policy

A request carries its own Σ_pol policy as data — a policy_ir term in the body. The host admits it (sorts, arity, depth/size bounds), ∧-composes the host's policy_envelope so a caller can only narrow the host's invariants, then runs it: filter the candidate models, score the survivors, pick and fall back. Compose, preview, test live and download policies in the dashboard Builder.

There are no intelligence tiers. When a caller sends no policy, a single declarative default policy (balanced quality/cost) is the fallback — itself a Σ_pol term with an identity, editable like any other.

Layout

core/ -- git submodule -> genlayerlabs/unhardcoded-engine (the pure Σ_pol core)
llm_router_host.py -- embeds the core via lupa; sync/async backends; auth resolver
shim.py -- OpenAI-compatible app: /v1/chat/completions and /v1/responses (+ per-call policy_ir) and /x/* operator endpoints
responses_api.py -- inbound OpenAI *Responses* API surface for /v1/responses (sibling of the chat-completions surface)
auth_proxy.py -- ingress + operator dashboard (Analytics · Builder · Activity · Market · Settings)
serve.py -- entry point: wires the api_kind dispatcher + runs uvicorn
config.live.lua -- catalog (providers + models), the `default` policy, and the observation fields (incl. OpenRouter benchmark/modality/capability fields)
scripts/refresh_model_meta.py -- the job: writes model_meta.lua (model-level traits pulled from OpenRouter)
codex_auth.py / codex_backend.py -- the ChatGPT-subscription (Codex) provider
metrics.live.lua -- EMA seed (PLACEHOLDER/fake — see docs/METRICS.md)
docs/METRICS.md -- the metrics seed: format, codex≈0, regeneration (it's fake)
docs/PROVIDERS.md -- per-provider auth + the AntSeed node
docs/OPENAI-CODEX.md -- the ChatGPT-subscription provider (unofficial / ToS-risky)
docs/USAGE_ENDPOINTS.md -- per-key usage stats API endpoints and auth behavior
live_smoke.py -- drive real providers end-to-end
tests/ -- the full host unit-test suite
features/ -- BDD user-flow suite (behave); user_flows.json is the spec
SETUP.md -- agent/human setup runbook (clone -> running -> first call)
scripts/gen-dev-wallet.sh -- generate a local AntSeed dev wallet (testing)

Quickstart

Point a coding agent at SETUP.md ("set up unhardcoded by following SETUP.md") for a guided, copy-pasteable runbook — or do it yourself:

git clone --recursive https://github.com/genlayerlabs/unhardcoded.git &&cd unhardcoded
cp .env.example .env.secrets && chmod 600 .env.secrets
# in .env.secrets: set OPENROUTER_API_KEY, and DASHBOARD_NO_AUTH=1 for local dev
docker compose up -d --build
curl -fsS http://127.0.0.1:8080/healthz # -> {"ok":true,"initialized":true}

Open the dashboard at http://127.0.0.1:8080/dashboard, mint a caller key (POST /dashboard/api/keys {"consumer":"my-app"}, or Consumers → Generate key), then call:

curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"Reply: pong"}]}'

Empty model runs the default policy; or send family:/pin:/profile: or a per-call policy_ir/flow_ir (below). Optional providers (Codex, AntSeed) and troubleshooting are in SETUP.md.

Responses-only clients (e.g. the Codex CLI):POST /v1/responses (and POST /{profile}/v1/responses) speak the OpenAI Responses API — translated to the same routing/policy/metering as chat-completions, streaming Responses SSE. Point Codex at the router with base_url=…/v1, wire_api = "responses", and the router key; use a /{profile}/v1/responses base_url to pin a policy by URL (Codex can't put policy_ir in its body).

Develop without Docker (raw shim — no dashboard/auth)

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt
python serve.py --config config.live.lua --default-profile default --host 127.0.0.1 --port 8080

serve.py is the data plane only (no ingress auth, no dashboard); provider keys come from the process env. The bearer-token contract and the dashboard live in the ingress service (docker compose). (Nix users: a nix-shell with the same packages works too.)

Policies (the model field + policy_ir)

Routing is server-side. The primary path is a per-call policy; the model prefix is sugar for the common cases:

client sendshost does
policy_ir term in the bodyrun that Σ_pol policy (the primary path)
"" / unprefixed modelthe default policy
model = "profile:NAME"a named profile from the catalog (only default ships)
model = "family:FAMILY"default, pinned to a model family
model = "pin:PROVIDER/FAMILY"default, pinned to one (provider, family)

A policy is a Σ_pol term: filter (which models qualify) → score (rank the survivors) → pick (the selector) + request transform + failover. Write it as raw IR, or compose it in the Builder (structured rows ↔ raw term). The vocabulary it filters/scores over includes live fields (price_in/price_out, latency_ms, success_rate, …) and host-declared fields — the OpenRouter benchmarks/modalities/capabilities (bench_intelligence, in_image, cap_tools, …). See the core's core/docs/SIGMA-POL.md for the algebra; config.live.lua declares the host fields and the default policy.

Dashboard

auth_proxy serves an operator console at /dashboard:

  • Analytics — spend, traffic and errors over time, filtered by timeframe, consumer, provider and model.
  • Builder — compose a policy over raw + benchmark fields, preview the live ranking, Test call it with a prompt, and download the term to run per call.
  • Activity — per-request trace: the policy that ran (copyable), the ordered fallback chain with the error at each step, and the cost paid.
  • Market — live price book per model family.
  • Settings — consumer keys and provider keys.

Tests

Install the test deps once (a virtualenv keeps them off your system Python):

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt

Unit — boots a real host with mocked provider responses (only the outbound HTTP to upstream providers is mocked):

python -m pytest tests -q

BDD user-flow suite (features/, behave) — drives the live stack end to end the way the dashboard does and asserts the rendered data is correct, including a real headless-browser pass (needs Chrome/Chromium installed; Selenium fetches the matching driver). Free & repeatable: end-to-end chats route to a $0 path. The catalogue of flows it covers is user_flows.json:

behave

(Nix users: nix-shell -p ... with the same packages — plus chromium chromedriver for the browser pass — works as before.)

About

OpenAI-compatible LLM policy router

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

unhardcoded

An OpenAI-compatible LLM router. Instead of hardcoding a model, a caller sends a policy with each request: the host filters the candidate models to those that qualify, ranks the survivors and picks one (e.g. the cheapest that passes) — over your own provider keys — and falls back automatically when a provider errors. Every run records which models passed, which were rejected and why.

Concretely it's an async FastAPI shim that runs the unhardcoded-engine core and inherits its provider selection, fallback, retry and per-provider auth. The core is vendored as a git submodule under core/; this repo is the host (the I/O, auth, providers, the HTTP service) plus an operator dashboard to compose, test and analyse policies. The policy algebra (Σ_pol) lives in the core.

The model: callers send a policy

A request carries its own Σ_pol policy as data — a policy_ir term in the body. The host admits it (sorts, arity, depth/size bounds), ∧-composes the host's policy_envelope so a caller can only narrow the host's invariants, then runs it: filter the candidate models, score the survivors, pick and fall back. Compose, preview, test live and download policies in the dashboard Builder.

There are no intelligence tiers. When a caller sends no policy, a single declarative default policy (balanced quality/cost) is the fallback — itself a Σ_pol term with an identity, editable like any other.

Layout

core/ -- git submodule -> genlayerlabs/unhardcoded-engine (the pure Σ_pol core)
llm_router_host.py -- embeds the core via lupa; sync/async backends; auth resolver
shim.py -- OpenAI-compatible app: /v1/chat/completions and /v1/responses (+ per-call policy_ir) and /x/* operator endpoints
responses_api.py -- inbound OpenAI *Responses* API surface for /v1/responses (sibling of the chat-completions surface)
auth_proxy.py -- ingress + operator dashboard (Analytics · Builder · Activity · Market · Settings)
serve.py -- entry point: wires the api_kind dispatcher + runs uvicorn
config.live.lua -- catalog (providers + models), the `default` policy, and the observation fields (incl. OpenRouter benchmark/modality/capability fields)
scripts/refresh_model_meta.py -- the job: writes model_meta.lua (model-level traits pulled from OpenRouter)
codex_auth.py / codex_backend.py -- the ChatGPT-subscription (Codex) provider
metrics.live.lua -- EMA seed (PLACEHOLDER/fake — see docs/METRICS.md)
docs/METRICS.md -- the metrics seed: format, codex≈0, regeneration (it's fake)
docs/PROVIDERS.md -- per-provider auth + the AntSeed node
docs/OPENAI-CODEX.md -- the ChatGPT-subscription provider (unofficial / ToS-risky)
docs/USAGE_ENDPOINTS.md -- per-key usage stats API endpoints and auth behavior
live_smoke.py -- drive real providers end-to-end
tests/ -- the full host unit-test suite
features/ -- BDD user-flow suite (behave); user_flows.json is the spec
SETUP.md -- agent/human setup runbook (clone -> running -> first call)
scripts/gen-dev-wallet.sh -- generate a local AntSeed dev wallet (testing)

Quickstart

Point a coding agent at SETUP.md ("set up unhardcoded by following SETUP.md") for a guided, copy-pasteable runbook — or do it yourself:

git clone --recursive https://github.com/genlayerlabs/unhardcoded.git &&cd unhardcoded
cp .env.example .env.secrets && chmod 600 .env.secrets
# in .env.secrets: set OPENROUTER_API_KEY, and DASHBOARD_NO_AUTH=1 for local dev
docker compose up -d --build
curl -fsS http://127.0.0.1:8080/healthz # -> {"ok":true,"initialized":true}

Open the dashboard at http://127.0.0.1:8080/dashboard, mint a caller key (POST /dashboard/api/keys {"consumer":"my-app"}, or Consumers → Generate key), then call:

curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"Reply: pong"}]}'

Empty model runs the default policy; or send family:/pin:/profile: or a per-call policy_ir/flow_ir (below). Optional providers (Codex, AntSeed) and troubleshooting are in SETUP.md.

Responses-only clients (e.g. the Codex CLI):POST /v1/responses (and POST /{profile}/v1/responses) speak the OpenAI Responses API — translated to the same routing/policy/metering as chat-completions, streaming Responses SSE. Point Codex at the router with base_url=…/v1, wire_api = "responses", and the router key; use a /{profile}/v1/responses base_url to pin a policy by URL (Codex can't put policy_ir in its body).

Develop without Docker (raw shim — no dashboard/auth)

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt
python serve.py --config config.live.lua --default-profile default --host 127.0.0.1 --port 8080

serve.py is the data plane only (no ingress auth, no dashboard); provider keys come from the process env. The bearer-token contract and the dashboard live in the ingress service (docker compose). (Nix users: a nix-shell with the same packages works too.)

Policies (the model field + policy_ir)

Routing is server-side. The primary path is a per-call policy; the model prefix is sugar for the common cases:

client sendshost does
policy_ir term in the bodyrun that Σ_pol policy (the primary path)
"" / unprefixed modelthe default policy
model = "profile:NAME"a named profile from the catalog (only default ships)
model = "family:FAMILY"default, pinned to a model family
model = "pin:PROVIDER/FAMILY"default, pinned to one (provider, family)

A policy is a Σ_pol term: filter (which models qualify) → score (rank the survivors) → pick (the selector) + request transform + failover. Write it as raw IR, or compose it in the Builder (structured rows ↔ raw term). The vocabulary it filters/scores over includes live fields (price_in/price_out, latency_ms, success_rate, …) and host-declared fields — the OpenRouter benchmarks/modalities/capabilities (bench_intelligence, in_image, cap_tools, …). See the core's core/docs/SIGMA-POL.md for the algebra; config.live.lua declares the host fields and the default policy.

Dashboard

auth_proxy serves an operator console at /dashboard:

  • Analytics — spend, traffic and errors over time, filtered by timeframe, consumer, provider and model.
  • Builder — compose a policy over raw + benchmark fields, preview the live ranking, Test call it with a prompt, and download the term to run per call.
  • Activity — per-request trace: the policy that ran (copyable), the ordered fallback chain with the error at each step, and the cost paid.
  • Market — live price book per model family.
  • Settings — consumer keys and provider keys.

Tests

Install the test deps once (a virtualenv keeps them off your system Python):

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt

Unit — boots a real host with mocked provider responses (only the outbound HTTP to upstream providers is mocked):

python -m pytest tests -q

BDD user-flow suite (features/, behave) — drives the live stack end to end the way the dashboard does and asserts the rendered data is correct, including a real headless-browser pass (needs Chrome/Chromium installed; Selenium fetches the matching driver). Free & repeatable: end-to-end chats route to a $0 path. The catalogue of flows it covers is user_flows.json:

behave

(Nix users: nix-shell -p ... with the same packages — plus chromium chromedriver for the browser pass — works as before.)

About

OpenAI-compatible LLM policy router

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

unhardcoded

An OpenAI-compatible LLM router. Instead of hardcoding a model, a caller sends a policy with each request: the host filters the candidate models to those that qualify, ranks the survivors and picks one (e.g. the cheapest that passes) — over your own provider keys — and falls back automatically when a provider errors. Every run records which models passed, which were rejected and why.

Concretely it's an async FastAPI shim that runs the unhardcoded-engine core and inherits its provider selection, fallback, retry and per-provider auth. The core is vendored as a git submodule under core/; this repo is the host (the I/O, auth, providers, the HTTP service) plus an operator dashboard to compose, test and analyse policies. The policy algebra (Σ_pol) lives in the core.

The model: callers send a policy

A request carries its own Σ_pol policy as data — a policy_ir term in the body. The host admits it (sorts, arity, depth/size bounds), ∧-composes the host's policy_envelope so a caller can only narrow the host's invariants, then runs it: filter the candidate models, score the survivors, pick and fall back. Compose, preview, test live and download policies in the dashboard Builder.

There are no intelligence tiers. When a caller sends no policy, a single declarative default policy (balanced quality/cost) is the fallback — itself a Σ_pol term with an identity, editable like any other.

Layout

core/ -- git submodule -> genlayerlabs/unhardcoded-engine (the pure Σ_pol core)
llm_router_host.py -- embeds the core via lupa; sync/async backends; auth resolver
shim.py -- OpenAI-compatible app: /v1/chat/completions and /v1/responses (+ per-call policy_ir) and /x/* operator endpoints
responses_api.py -- inbound OpenAI *Responses* API surface for /v1/responses (sibling of the chat-completions surface)
auth_proxy.py -- ingress + operator dashboard (Analytics · Builder · Activity · Market · Settings)
serve.py -- entry point: wires the api_kind dispatcher + runs uvicorn
config.live.lua -- catalog (providers + models), the `default` policy, and the observation fields (incl. OpenRouter benchmark/modality/capability fields)
scripts/refresh_model_meta.py -- the job: writes model_meta.lua (model-level traits pulled from OpenRouter)
codex_auth.py / codex_backend.py -- the ChatGPT-subscription (Codex) provider
metrics.live.lua -- EMA seed (PLACEHOLDER/fake — see docs/METRICS.md)
docs/METRICS.md -- the metrics seed: format, codex≈0, regeneration (it's fake)
docs/PROVIDERS.md -- per-provider auth + the AntSeed node
docs/OPENAI-CODEX.md -- the ChatGPT-subscription provider (unofficial / ToS-risky)
docs/USAGE_ENDPOINTS.md -- per-key usage stats API endpoints and auth behavior
live_smoke.py -- drive real providers end-to-end
tests/ -- the full host unit-test suite
features/ -- BDD user-flow suite (behave); user_flows.json is the spec
SETUP.md -- agent/human setup runbook (clone -> running -> first call)
scripts/gen-dev-wallet.sh -- generate a local AntSeed dev wallet (testing)

Quickstart

Point a coding agent at SETUP.md ("set up unhardcoded by following SETUP.md") for a guided, copy-pasteable runbook — or do it yourself:

git clone --recursive https://github.com/genlayerlabs/unhardcoded.git &&cd unhardcoded
cp .env.example .env.secrets && chmod 600 .env.secrets
# in .env.secrets: set OPENROUTER_API_KEY, and DASHBOARD_NO_AUTH=1 for local dev
docker compose up -d --build
curl -fsS http://127.0.0.1:8080/healthz # -> {"ok":true,"initialized":true}

Open the dashboard at http://127.0.0.1:8080/dashboard, mint a caller key (POST /dashboard/api/keys {"consumer":"my-app"}, or Consumers → Generate key), then call:

curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"Reply: pong"}]}'

Empty model runs the default policy; or send family:/pin:/profile: or a per-call policy_ir/flow_ir (below). Optional providers (Codex, AntSeed) and troubleshooting are in SETUP.md.

Responses-only clients (e.g. the Codex CLI):POST /v1/responses (and POST /{profile}/v1/responses) speak the OpenAI Responses API — translated to the same routing/policy/metering as chat-completions, streaming Responses SSE. Point Codex at the router with base_url=…/v1, wire_api = "responses", and the router key; use a /{profile}/v1/responses base_url to pin a policy by URL (Codex can't put policy_ir in its body).

Develop without Docker (raw shim — no dashboard/auth)

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt
python serve.py --config config.live.lua --default-profile default --host 127.0.0.1 --port 8080

serve.py is the data plane only (no ingress auth, no dashboard); provider keys come from the process env. The bearer-token contract and the dashboard live in the ingress service (docker compose). (Nix users: a nix-shell with the same packages works too.)

Policies (the model field + policy_ir)

Routing is server-side. The primary path is a per-call policy; the model prefix is sugar for the common cases:

client sendshost does
policy_ir term in the bodyrun that Σ_pol policy (the primary path)
"" / unprefixed modelthe default policy
model = "profile:NAME"a named profile from the catalog (only default ships)
model = "family:FAMILY"default, pinned to a model family
model = "pin:PROVIDER/FAMILY"default, pinned to one (provider, family)

A policy is a Σ_pol term: filter (which models qualify) → score (rank the survivors) → pick (the selector) + request transform + failover. Write it as raw IR, or compose it in the Builder (structured rows ↔ raw term). The vocabulary it filters/scores over includes live fields (price_in/price_out, latency_ms, success_rate, …) and host-declared fields — the OpenRouter benchmarks/modalities/capabilities (bench_intelligence, in_image, cap_tools, …). See the core's core/docs/SIGMA-POL.md for the algebra; config.live.lua declares the host fields and the default policy.

Dashboard

auth_proxy serves an operator console at /dashboard:

  • Analytics — spend, traffic and errors over time, filtered by timeframe, consumer, provider and model.
  • Builder — compose a policy over raw + benchmark fields, preview the live ranking, Test call it with a prompt, and download the term to run per call.
  • Activity — per-request trace: the policy that ran (copyable), the ordered fallback chain with the error at each step, and the cost paid.
  • Market — live price book per model family.
  • Settings — consumer keys and provider keys.

Tests

Install the test deps once (a virtualenv keeps them off your system Python):

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt

Unit — boots a real host with mocked provider responses (only the outbound HTTP to upstream providers is mocked):

python -m pytest tests -q

BDD user-flow suite (features/, behave) — drives the live stack end to end the way the dashboard does and asserts the rendered data is correct, including a real headless-browser pass (needs Chrome/Chromium installed; Selenium fetches the matching driver). Free & repeatable: end-to-end chats route to a $0 path. The catalogue of flows it covers is user_flows.json:

behave

(Nix users: nix-shell -p ... with the same packages — plus chromium chromedriver for the browser pass — works as before.)

About

OpenAI-compatible LLM policy router

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

unhardcoded

An OpenAI-compatible LLM router. Instead of hardcoding a model, a caller sends a policy with each request: the host filters the candidate models to those that qualify, ranks the survivors and picks one (e.g. the cheapest that passes) — over your own provider keys — and falls back automatically when a provider errors. Every run records which models passed, which were rejected and why.

Concretely it's an async FastAPI shim that runs the unhardcoded-engine core and inherits its provider selection, fallback, retry and per-provider auth. The core is vendored as a git submodule under core/; this repo is the host (the I/O, auth, providers, the HTTP service) plus an operator dashboard to compose, test and analyse policies. The policy algebra (Σ_pol) lives in the core.

The model: callers send a policy

A request carries its own Σ_pol policy as data — a policy_ir term in the body. The host admits it (sorts, arity, depth/size bounds), ∧-composes the host's policy_envelope so a caller can only narrow the host's invariants, then runs it: filter the candidate models, score the survivors, pick and fall back. Compose, preview, test live and download policies in the dashboard Builder.

There are no intelligence tiers. When a caller sends no policy, a single declarative default policy (balanced quality/cost) is the fallback — itself a Σ_pol term with an identity, editable like any other.

Layout

core/ -- git submodule -> genlayerlabs/unhardcoded-engine (the pure Σ_pol core)
llm_router_host.py -- embeds the core via lupa; sync/async backends; auth resolver
shim.py -- OpenAI-compatible app: /v1/chat/completions and /v1/responses (+ per-call policy_ir) and /x/* operator endpoints
responses_api.py -- inbound OpenAI *Responses* API surface for /v1/responses (sibling of the chat-completions surface)
auth_proxy.py -- ingress + operator dashboard (Analytics · Builder · Activity · Market · Settings)
serve.py -- entry point: wires the api_kind dispatcher + runs uvicorn
config.live.lua -- catalog (providers + models), the `default` policy, and the observation fields (incl. OpenRouter benchmark/modality/capability fields)
scripts/refresh_model_meta.py -- the job: writes model_meta.lua (model-level traits pulled from OpenRouter)
codex_auth.py / codex_backend.py -- the ChatGPT-subscription (Codex) provider
metrics.live.lua -- EMA seed (PLACEHOLDER/fake — see docs/METRICS.md)
docs/METRICS.md -- the metrics seed: format, codex≈0, regeneration (it's fake)
docs/PROVIDERS.md -- per-provider auth + the AntSeed node
docs/OPENAI-CODEX.md -- the ChatGPT-subscription provider (unofficial / ToS-risky)
docs/USAGE_ENDPOINTS.md -- per-key usage stats API endpoints and auth behavior
live_smoke.py -- drive real providers end-to-end
tests/ -- the full host unit-test suite
features/ -- BDD user-flow suite (behave); user_flows.json is the spec
SETUP.md -- agent/human setup runbook (clone -> running -> first call)
scripts/gen-dev-wallet.sh -- generate a local AntSeed dev wallet (testing)

Quickstart

Point a coding agent at SETUP.md ("set up unhardcoded by following SETUP.md") for a guided, copy-pasteable runbook — or do it yourself:

git clone --recursive https://github.com/genlayerlabs/unhardcoded.git &&cd unhardcoded
cp .env.example .env.secrets && chmod 600 .env.secrets
# in .env.secrets: set OPENROUTER_API_KEY, and DASHBOARD_NO_AUTH=1 for local dev
docker compose up -d --build
curl -fsS http://127.0.0.1:8080/healthz # -> {"ok":true,"initialized":true}

Open the dashboard at http://127.0.0.1:8080/dashboard, mint a caller key (POST /dashboard/api/keys {"consumer":"my-app"}, or Consumers → Generate key), then call:

curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"Reply: pong"}]}'

Empty model runs the default policy; or send family:/pin:/profile: or a per-call policy_ir/flow_ir (below). Optional providers (Codex, AntSeed) and troubleshooting are in SETUP.md.

Responses-only clients (e.g. the Codex CLI):POST /v1/responses (and POST /{profile}/v1/responses) speak the OpenAI Responses API — translated to the same routing/policy/metering as chat-completions, streaming Responses SSE. Point Codex at the router with base_url=…/v1, wire_api = "responses", and the router key; use a /{profile}/v1/responses base_url to pin a policy by URL (Codex can't put policy_ir in its body).

Develop without Docker (raw shim — no dashboard/auth)

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt
python serve.py --config config.live.lua --default-profile default --host 127.0.0.1 --port 8080

serve.py is the data plane only (no ingress auth, no dashboard); provider keys come from the process env. The bearer-token contract and the dashboard live in the ingress service (docker compose). (Nix users: a nix-shell with the same packages works too.)

Policies (the model field + policy_ir)

Routing is server-side. The primary path is a per-call policy; the model prefix is sugar for the common cases:

client sendshost does
policy_ir term in the bodyrun that Σ_pol policy (the primary path)
"" / unprefixed modelthe default policy
model = "profile:NAME"a named profile from the catalog (only default ships)
model = "family:FAMILY"default, pinned to a model family
model = "pin:PROVIDER/FAMILY"default, pinned to one (provider, family)

A policy is a Σ_pol term: filter (which models qualify) → score (rank the survivors) → pick (the selector) + request transform + failover. Write it as raw IR, or compose it in the Builder (structured rows ↔ raw term). The vocabulary it filters/scores over includes live fields (price_in/price_out, latency_ms, success_rate, …) and host-declared fields — the OpenRouter benchmarks/modalities/capabilities (bench_intelligence, in_image, cap_tools, …). See the core's core/docs/SIGMA-POL.md for the algebra; config.live.lua declares the host fields and the default policy.

Dashboard

auth_proxy serves an operator console at /dashboard:

  • Analytics — spend, traffic and errors over time, filtered by timeframe, consumer, provider and model.
  • Builder — compose a policy over raw + benchmark fields, preview the live ranking, Test call it with a prompt, and download the term to run per call.
  • Activity — per-request trace: the policy that ran (copyable), the ordered fallback chain with the error at each step, and the cost paid.
  • Market — live price book per model family.
  • Settings — consumer keys and provider keys.

Tests

Install the test deps once (a virtualenv keeps them off your system Python):

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt

Unit — boots a real host with mocked provider responses (only the outbound HTTP to upstream providers is mocked):

python -m pytest tests -q

BDD user-flow suite (features/, behave) — drives the live stack end to end the way the dashboard does and asserts the rendered data is correct, including a real headless-browser pass (needs Chrome/Chromium installed; Selenium fetches the matching driver). Free & repeatable: end-to-end chats route to a $0 path. The catalogue of flows it covers is user_flows.json:

behave

(Nix users: nix-shell -p ... with the same packages — plus chromium chromedriver for the browser pass — works as before.)

About

OpenAI-compatible LLM policy router

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

unhardcoded

An OpenAI-compatible LLM router. Instead of hardcoding a model, a caller sends a policy with each request: the host filters the candidate models to those that qualify, ranks the survivors and picks one (e.g. the cheapest that passes) — over your own provider keys — and falls back automatically when a provider errors. Every run records which models passed, which were rejected and why.

Concretely it's an async FastAPI shim that runs the unhardcoded-engine core and inherits its provider selection, fallback, retry and per-provider auth. The core is vendored as a git submodule under core/; this repo is the host (the I/O, auth, providers, the HTTP service) plus an operator dashboard to compose, test and analyse policies. The policy algebra (Σ_pol) lives in the core.

The model: callers send a policy

A request carries its own Σ_pol policy as data — a policy_ir term in the body. The host admits it (sorts, arity, depth/size bounds), ∧-composes the host's policy_envelope so a caller can only narrow the host's invariants, then runs it: filter the candidate models, score the survivors, pick and fall back. Compose, preview, test live and download policies in the dashboard Builder.

There are no intelligence tiers. When a caller sends no policy, a single declarative default policy (balanced quality/cost) is the fallback — itself a Σ_pol term with an identity, editable like any other.

Layout

core/ -- git submodule -> genlayerlabs/unhardcoded-engine (the pure Σ_pol core)
llm_router_host.py -- embeds the core via lupa; sync/async backends; auth resolver
shim.py -- OpenAI-compatible app: /v1/chat/completions and /v1/responses (+ per-call policy_ir) and /x/* operator endpoints
responses_api.py -- inbound OpenAI *Responses* API surface for /v1/responses (sibling of the chat-completions surface)
auth_proxy.py -- ingress + operator dashboard (Analytics · Builder · Activity · Market · Settings)
serve.py -- entry point: wires the api_kind dispatcher + runs uvicorn
config.live.lua -- catalog (providers + models), the `default` policy, and the observation fields (incl. OpenRouter benchmark/modality/capability fields)
scripts/refresh_model_meta.py -- the job: writes model_meta.lua (model-level traits pulled from OpenRouter)
codex_auth.py / codex_backend.py -- the ChatGPT-subscription (Codex) provider
metrics.live.lua -- EMA seed (PLACEHOLDER/fake — see docs/METRICS.md)
docs/METRICS.md -- the metrics seed: format, codex≈0, regeneration (it's fake)
docs/PROVIDERS.md -- per-provider auth + the AntSeed node
docs/OPENAI-CODEX.md -- the ChatGPT-subscription provider (unofficial / ToS-risky)
docs/USAGE_ENDPOINTS.md -- per-key usage stats API endpoints and auth behavior
live_smoke.py -- drive real providers end-to-end
tests/ -- the full host unit-test suite
features/ -- BDD user-flow suite (behave); user_flows.json is the spec
SETUP.md -- agent/human setup runbook (clone -> running -> first call)
scripts/gen-dev-wallet.sh -- generate a local AntSeed dev wallet (testing)

Quickstart

Point a coding agent at SETUP.md ("set up unhardcoded by following SETUP.md") for a guided, copy-pasteable runbook — or do it yourself:

git clone --recursive https://github.com/genlayerlabs/unhardcoded.git &&cd unhardcoded
cp .env.example .env.secrets && chmod 600 .env.secrets
# in .env.secrets: set OPENROUTER_API_KEY, and DASHBOARD_NO_AUTH=1 for local dev
docker compose up -d --build
curl -fsS http://127.0.0.1:8080/healthz # -> {"ok":true,"initialized":true}

Open the dashboard at http://127.0.0.1:8080/dashboard, mint a caller key (POST /dashboard/api/keys {"consumer":"my-app"}, or Consumers → Generate key), then call:

curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"Reply: pong"}]}'

Empty model runs the default policy; or send family:/pin:/profile: or a per-call policy_ir/flow_ir (below). Optional providers (Codex, AntSeed) and troubleshooting are in SETUP.md.

Responses-only clients (e.g. the Codex CLI):POST /v1/responses (and POST /{profile}/v1/responses) speak the OpenAI Responses API — translated to the same routing/policy/metering as chat-completions, streaming Responses SSE. Point Codex at the router with base_url=…/v1, wire_api = "responses", and the router key; use a /{profile}/v1/responses base_url to pin a policy by URL (Codex can't put policy_ir in its body).

Develop without Docker (raw shim — no dashboard/auth)

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt
python serve.py --config config.live.lua --default-profile default --host 127.0.0.1 --port 8080

serve.py is the data plane only (no ingress auth, no dashboard); provider keys come from the process env. The bearer-token contract and the dashboard live in the ingress service (docker compose). (Nix users: a nix-shell with the same packages works too.)

Policies (the model field + policy_ir)

Routing is server-side. The primary path is a per-call policy; the model prefix is sugar for the common cases:

client sendshost does
policy_ir term in the bodyrun that Σ_pol policy (the primary path)
"" / unprefixed modelthe default policy
model = "profile:NAME"a named profile from the catalog (only default ships)
model = "family:FAMILY"default, pinned to a model family
model = "pin:PROVIDER/FAMILY"default, pinned to one (provider, family)

A policy is a Σ_pol term: filter (which models qualify) → score (rank the survivors) → pick (the selector) + request transform + failover. Write it as raw IR, or compose it in the Builder (structured rows ↔ raw term). The vocabulary it filters/scores over includes live fields (price_in/price_out, latency_ms, success_rate, …) and host-declared fields — the OpenRouter benchmarks/modalities/capabilities (bench_intelligence, in_image, cap_tools, …). See the core's core/docs/SIGMA-POL.md for the algebra; config.live.lua declares the host fields and the default policy.

Dashboard

auth_proxy serves an operator console at /dashboard:

  • Analytics — spend, traffic and errors over time, filtered by timeframe, consumer, provider and model.
  • Builder — compose a policy over raw + benchmark fields, preview the live ranking, Test call it with a prompt, and download the term to run per call.
  • Activity — per-request trace: the policy that ran (copyable), the ordered fallback chain with the error at each step, and the cost paid.
  • Market — live price book per model family.
  • Settings — consumer keys and provider keys.

Tests

Install the test deps once (a virtualenv keeps them off your system Python):

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt

Unit — boots a real host with mocked provider responses (only the outbound HTTP to upstream providers is mocked):

python -m pytest tests -q

BDD user-flow suite (features/, behave) — drives the live stack end to end the way the dashboard does and asserts the rendered data is correct, including a real headless-browser pass (needs Chrome/Chromium installed; Selenium fetches the matching driver). Free & repeatable: end-to-end chats route to a $0 path. The catalogue of flows it covers is user_flows.json:

behave

(Nix users: nix-shell -p ... with the same packages — plus chromium chromedriver for the browser pass — works as before.)

About

OpenAI-compatible LLM policy router

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

unhardcoded

An OpenAI-compatible LLM router. Instead of hardcoding a model, a caller sends a policy with each request: the host filters the candidate models to those that qualify, ranks the survivors and picks one (e.g. the cheapest that passes) — over your own provider keys — and falls back automatically when a provider errors. Every run records which models passed, which were rejected and why.

Concretely it's an async FastAPI shim that runs the unhardcoded-engine core and inherits its provider selection, fallback, retry and per-provider auth. The core is vendored as a git submodule under core/; this repo is the host (the I/O, auth, providers, the HTTP service) plus an operator dashboard to compose, test and analyse policies. The policy algebra (Σ_pol) lives in the core.

The model: callers send a policy

A request carries its own Σ_pol policy as data — a policy_ir term in the body. The host admits it (sorts, arity, depth/size bounds), ∧-composes the host's policy_envelope so a caller can only narrow the host's invariants, then runs it: filter the candidate models, score the survivors, pick and fall back. Compose, preview, test live and download policies in the dashboard Builder.

There are no intelligence tiers. When a caller sends no policy, a single declarative default policy (balanced quality/cost) is the fallback — itself a Σ_pol term with an identity, editable like any other.

Layout

core/ -- git submodule -> genlayerlabs/unhardcoded-engine (the pure Σ_pol core)
llm_router_host.py -- embeds the core via lupa; sync/async backends; auth resolver
shim.py -- OpenAI-compatible app: /v1/chat/completions and /v1/responses (+ per-call policy_ir) and /x/* operator endpoints
responses_api.py -- inbound OpenAI *Responses* API surface for /v1/responses (sibling of the chat-completions surface)
auth_proxy.py -- ingress + operator dashboard (Analytics · Builder · Activity · Market · Settings)
serve.py -- entry point: wires the api_kind dispatcher + runs uvicorn
config.live.lua -- catalog (providers + models), the `default` policy, and the observation fields (incl. OpenRouter benchmark/modality/capability fields)
scripts/refresh_model_meta.py -- the job: writes model_meta.lua (model-level traits pulled from OpenRouter)
codex_auth.py / codex_backend.py -- the ChatGPT-subscription (Codex) provider
metrics.live.lua -- EMA seed (PLACEHOLDER/fake — see docs/METRICS.md)
docs/METRICS.md -- the metrics seed: format, codex≈0, regeneration (it's fake)
docs/PROVIDERS.md -- per-provider auth + the AntSeed node
docs/OPENAI-CODEX.md -- the ChatGPT-subscription provider (unofficial / ToS-risky)
docs/USAGE_ENDPOINTS.md -- per-key usage stats API endpoints and auth behavior
live_smoke.py -- drive real providers end-to-end
tests/ -- the full host unit-test suite
features/ -- BDD user-flow suite (behave); user_flows.json is the spec
SETUP.md -- agent/human setup runbook (clone -> running -> first call)
scripts/gen-dev-wallet.sh -- generate a local AntSeed dev wallet (testing)

Quickstart

Point a coding agent at SETUP.md ("set up unhardcoded by following SETUP.md") for a guided, copy-pasteable runbook — or do it yourself:

git clone --recursive https://github.com/genlayerlabs/unhardcoded.git &&cd unhardcoded
cp .env.example .env.secrets && chmod 600 .env.secrets
# in .env.secrets: set OPENROUTER_API_KEY, and DASHBOARD_NO_AUTH=1 for local dev
docker compose up -d --build
curl -fsS http://127.0.0.1:8080/healthz # -> {"ok":true,"initialized":true}

Open the dashboard at http://127.0.0.1:8080/dashboard, mint a caller key (POST /dashboard/api/keys {"consumer":"my-app"}, or Consumers → Generate key), then call:

curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"Reply: pong"}]}'

Empty model runs the default policy; or send family:/pin:/profile: or a per-call policy_ir/flow_ir (below). Optional providers (Codex, AntSeed) and troubleshooting are in SETUP.md.

Responses-only clients (e.g. the Codex CLI):POST /v1/responses (and POST /{profile}/v1/responses) speak the OpenAI Responses API — translated to the same routing/policy/metering as chat-completions, streaming Responses SSE. Point Codex at the router with base_url=…/v1, wire_api = "responses", and the router key; use a /{profile}/v1/responses base_url to pin a policy by URL (Codex can't put policy_ir in its body).

Develop without Docker (raw shim — no dashboard/auth)

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt
python serve.py --config config.live.lua --default-profile default --host 127.0.0.1 --port 8080

serve.py is the data plane only (no ingress auth, no dashboard); provider keys come from the process env. The bearer-token contract and the dashboard live in the ingress service (docker compose). (Nix users: a nix-shell with the same packages works too.)

Policies (the model field + policy_ir)

Routing is server-side. The primary path is a per-call policy; the model prefix is sugar for the common cases:

client sendshost does
policy_ir term in the bodyrun that Σ_pol policy (the primary path)
"" / unprefixed modelthe default policy
model = "profile:NAME"a named profile from the catalog (only default ships)
model = "family:FAMILY"default, pinned to a model family
model = "pin:PROVIDER/FAMILY"default, pinned to one (provider, family)

A policy is a Σ_pol term: filter (which models qualify) → score (rank the survivors) → pick (the selector) + request transform + failover. Write it as raw IR, or compose it in the Builder (structured rows ↔ raw term). The vocabulary it filters/scores over includes live fields (price_in/price_out, latency_ms, success_rate, …) and host-declared fields — the OpenRouter benchmarks/modalities/capabilities (bench_intelligence, in_image, cap_tools, …). See the core's core/docs/SIGMA-POL.md for the algebra; config.live.lua declares the host fields and the default policy.

Dashboard

auth_proxy serves an operator console at /dashboard:

  • Analytics — spend, traffic and errors over time, filtered by timeframe, consumer, provider and model.
  • Builder — compose a policy over raw + benchmark fields, preview the live ranking, Test call it with a prompt, and download the term to run per call.
  • Activity — per-request trace: the policy that ran (copyable), the ordered fallback chain with the error at each step, and the cost paid.
  • Market — live price book per model family.
  • Settings — consumer keys and provider keys.

Tests

Install the test deps once (a virtualenv keeps them off your system Python):

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt

Unit — boots a real host with mocked provider responses (only the outbound HTTP to upstream providers is mocked):

python -m pytest tests -q

BDD user-flow suite (features/, behave) — drives the live stack end to end the way the dashboard does and asserts the rendered data is correct, including a real headless-browser pass (needs Chrome/Chromium installed; Selenium fetches the matching driver). Free & repeatable: end-to-end chats route to a $0 path. The catalogue of flows it covers is user_flows.json:

behave

(Nix users: nix-shell -p ... with the same packages — plus chromium chromedriver for the browser pass — works as before.)

About

OpenAI-compatible LLM policy router

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

unhardcoded

An OpenAI-compatible LLM router. Instead of hardcoding a model, a caller sends a policy with each request: the host filters the candidate models to those that qualify, ranks the survivors and picks one (e.g. the cheapest that passes) — over your own provider keys — and falls back automatically when a provider errors. Every run records which models passed, which were rejected and why.

Concretely it's an async FastAPI shim that runs the unhardcoded-engine core and inherits its provider selection, fallback, retry and per-provider auth. The core is vendored as a git submodule under core/; this repo is the host (the I/O, auth, providers, the HTTP service) plus an operator dashboard to compose, test and analyse policies. The policy algebra (Σ_pol) lives in the core.

The model: callers send a policy

A request carries its own Σ_pol policy as data — a policy_ir term in the body. The host admits it (sorts, arity, depth/size bounds), ∧-composes the host's policy_envelope so a caller can only narrow the host's invariants, then runs it: filter the candidate models, score the survivors, pick and fall back. Compose, preview, test live and download policies in the dashboard Builder.

There are no intelligence tiers. When a caller sends no policy, a single declarative default policy (balanced quality/cost) is the fallback — itself a Σ_pol term with an identity, editable like any other.

Layout

core/ -- git submodule -> genlayerlabs/unhardcoded-engine (the pure Σ_pol core)
llm_router_host.py -- embeds the core via lupa; sync/async backends; auth resolver
shim.py -- OpenAI-compatible app: /v1/chat/completions and /v1/responses (+ per-call policy_ir) and /x/* operator endpoints
responses_api.py -- inbound OpenAI *Responses* API surface for /v1/responses (sibling of the chat-completions surface)
auth_proxy.py -- ingress + operator dashboard (Analytics · Builder · Activity · Market · Settings)
serve.py -- entry point: wires the api_kind dispatcher + runs uvicorn
config.live.lua -- catalog (providers + models), the `default` policy, and the observation fields (incl. OpenRouter benchmark/modality/capability fields)
scripts/refresh_model_meta.py -- the job: writes model_meta.lua (model-level traits pulled from OpenRouter)
codex_auth.py / codex_backend.py -- the ChatGPT-subscription (Codex) provider
metrics.live.lua -- EMA seed (PLACEHOLDER/fake — see docs/METRICS.md)
docs/METRICS.md -- the metrics seed: format, codex≈0, regeneration (it's fake)
docs/PROVIDERS.md -- per-provider auth + the AntSeed node
docs/OPENAI-CODEX.md -- the ChatGPT-subscription provider (unofficial / ToS-risky)
docs/USAGE_ENDPOINTS.md -- per-key usage stats API endpoints and auth behavior
live_smoke.py -- drive real providers end-to-end
tests/ -- the full host unit-test suite
features/ -- BDD user-flow suite (behave); user_flows.json is the spec
SETUP.md -- agent/human setup runbook (clone -> running -> first call)
scripts/gen-dev-wallet.sh -- generate a local AntSeed dev wallet (testing)

Quickstart

Point a coding agent at SETUP.md ("set up unhardcoded by following SETUP.md") for a guided, copy-pasteable runbook — or do it yourself:

git clone --recursive https://github.com/genlayerlabs/unhardcoded.git &&cd unhardcoded
cp .env.example .env.secrets && chmod 600 .env.secrets
# in .env.secrets: set OPENROUTER_API_KEY, and DASHBOARD_NO_AUTH=1 for local dev
docker compose up -d --build
curl -fsS http://127.0.0.1:8080/healthz # -> {"ok":true,"initialized":true}

Open the dashboard at http://127.0.0.1:8080/dashboard, mint a caller key (POST /dashboard/api/keys {"consumer":"my-app"}, or Consumers → Generate key), then call:

curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"Reply: pong"}]}'

Empty model runs the default policy; or send family:/pin:/profile: or a per-call policy_ir/flow_ir (below). Optional providers (Codex, AntSeed) and troubleshooting are in SETUP.md.

Responses-only clients (e.g. the Codex CLI):POST /v1/responses (and POST /{profile}/v1/responses) speak the OpenAI Responses API — translated to the same routing/policy/metering as chat-completions, streaming Responses SSE. Point Codex at the router with base_url=…/v1, wire_api = "responses", and the router key; use a /{profile}/v1/responses base_url to pin a policy by URL (Codex can't put policy_ir in its body).

Develop without Docker (raw shim — no dashboard/auth)

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt
python serve.py --config config.live.lua --default-profile default --host 127.0.0.1 --port 8080

serve.py is the data plane only (no ingress auth, no dashboard); provider keys come from the process env. The bearer-token contract and the dashboard live in the ingress service (docker compose). (Nix users: a nix-shell with the same packages works too.)

Policies (the model field + policy_ir)

Routing is server-side. The primary path is a per-call policy; the model prefix is sugar for the common cases:

client sendshost does
policy_ir term in the bodyrun that Σ_pol policy (the primary path)
"" / unprefixed modelthe default policy
model = "profile:NAME"a named profile from the catalog (only default ships)
model = "family:FAMILY"default, pinned to a model family
model = "pin:PROVIDER/FAMILY"default, pinned to one (provider, family)

A policy is a Σ_pol term: filter (which models qualify) → score (rank the survivors) → pick (the selector) + request transform + failover. Write it as raw IR, or compose it in the Builder (structured rows ↔ raw term). The vocabulary it filters/scores over includes live fields (price_in/price_out, latency_ms, success_rate, …) and host-declared fields — the OpenRouter benchmarks/modalities/capabilities (bench_intelligence, in_image, cap_tools, …). See the core's core/docs/SIGMA-POL.md for the algebra; config.live.lua declares the host fields and the default policy.

Dashboard

auth_proxy serves an operator console at /dashboard:

  • Analytics — spend, traffic and errors over time, filtered by timeframe, consumer, provider and model.
  • Builder — compose a policy over raw + benchmark fields, preview the live ranking, Test call it with a prompt, and download the term to run per call.
  • Activity — per-request trace: the policy that ran (copyable), the ordered fallback chain with the error at each step, and the cost paid.
  • Market — live price book per model family.
  • Settings — consumer keys and provider keys.

Tests

Install the test deps once (a virtualenv keeps them off your system Python):

python3 -m venv .venv &&. .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txt

Unit — boots a real host with mocked provider responses (only the outbound HTTP to upstream providers is mocked):

python -m pytest tests -q

BDD user-flow suite (features/, behave) — drives the live stack end to end the way the dashboard does and asserts the rendered data is correct, including a real headless-browser pass (needs Chrome/Chromium installed; Selenium fetches the matching driver). Free & repeatable: end-to-end chats route to a $0 path. The catalogue of flows it covers is user_flows.json:

behave

(Nix users: nix-shell -p ... with the same packages — plus chromium chromedriver for the browser pass — works as before.)

About

OpenAI-compatible LLM policy router

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages