For AI agents
NeuralRing is an EU-sovereign inference gateway whose sovereignty an agent can check, not merely repeat: every request leaves a signed, content-free attestation, the public key is published, and the verifier is a zero-dependency script. This page is the 60-second version — wire it in, make one call, verify the receipt.
agent-channel v1.0.0 · API base https://neuralring.eu/api/v1 · agent base https://neuralring.eu/v1
1 · Wire it into an app you are building
OpenAI-compatible: only the base URL, the key and the model slug change. Send the sovereignty pin in the request body — it is applied FIRST and can never be loosened by a price or speed preference. If nothing satisfies it you get no_eligible_endpoint; that is the pin working, and it should not be retried without the pin.
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://neuralring.eu/api/v1", apiKey: process.env.NEURALRING_API_KEY });
const res = await client.chat.completions.create({
model: "mistralai/mistral-small-2501",
messages: [{ role: "user", content: "Hello, sovereign world" }],
// NeuralRing routing extension: applied FIRST, never loosened by price/speed.
// @ts-expect-error NeuralRing extension
sovereignty: { jurisdiction: ["DE"], min_assurance: "self_attested" },
});
// Every call leaves a signed, content-free receipt. Surface it to the human.
const requestId = (res as any).neuralring?.requestId;
console.log(res.choices[0].message.content, "\nreceipt:", `https://neuralring.eu/verify/${requestId}`);from openai import OpenAI
client = OpenAI(base_url="https://neuralring.eu/api/v1", api_key=os.environ["NEURALRING_API_KEY"])
res = client.chat.completions.create(
model="mistralai/mistral-small-2501",
messages=[{"role": "user", "content": "Hello, sovereign world"}],
# NeuralRing routing extension: the pin is applied first and never loosened.
extra_body={"sovereignty": { "jurisdiction": ["DE"], "min_assurance": "self_attested" }},
)
print(res.choices[0].message.content)2 · Or point the agent itself at NeuralRing
Claude Code speaks the Anthropic wire; Codex CLI speaks the Responses wire (wire_api = "responses" is its only supported value). Both work against the bare origin — /v1/* is aliased onto the canonical /api/v1/* handlers.
# Claude Code — the HARNESS, running on EU-sovereign open-weight models. # (Claude itself is closed-weight and does not run here; see the docs.) export ANTHROPIC_BASE_URL="https://neuralring.eu" export ANTHROPIC_AUTH_TOKEN="$NEURALRING_API_KEY" export ANTHROPIC_MODEL="mistralai/mistral-small-2501" # Optional: a cheaper model for background/summarisation turns. export ANTHROPIC_SMALL_FAST_MODEL="mistralai/mistral-small-2501" # Claude Code's /model picker only lists gateway models whose id starts with # "claude" or "anthropic". NeuralRing will not rename sovereign open-weight # models to imply they are Claude, so use ANTHROPIC_MODEL above (always honoured # on the wire), or add a picker entry explicitly: export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 export ANTHROPIC_CUSTOM_MODEL_OPTION="mistralai/mistral-small-2501"
Claude Code adds a discovered gateway model to its /model picker only when the model id starts with "claude" or "anthropic". NeuralRing serves its real open-weight slugs and will not rename them to imply they are Claude models — so set ANTHROPIC_MODEL (always honoured on the wire), or add a picker entry with ANTHROPIC_CUSTOM_MODEL_OPTION.
# ~/.codex/config.toml (user-level — a project-local file is ignored for providers) model = "mistralai/mistral-small-2501" model_provider = "neuralring" [model_providers.neuralring] name = "NeuralRing (EU sovereign)" base_url = "https://neuralring.eu/v1" env_key = "NEURALRING_API_KEY" wire_api = "responses" # NeuralRing is stateless: it stores no conversation state and no prompt content. # It keeps content-free metering + a signed attestation per call.
Claude Code and Codex are the harness. Pointing them at NeuralRing runs their tokens on EU-sovereign OPEN-WEIGHT models. Claude and GPT themselves are closed-weight and cannot run here — NeuralRing never claims otherwise.
3 · Give the agent the MCP server
Search the catalog, read an endpoint's real assurance level, generate a pinned snippet, and verify a receipt — from inside the agent loop. The tools READ, VERIFY and EXPLAIN. None of them buys anything, changes the catalog, or moves money.
# Claude Code — hosted (streamable HTTP), nothing to install claude mcp add --transport http neuralring https://neuralring.eu/mcp # …or run it locally over stdio — NOT the working path yet: # @neuralring/mcp is not yet published to npm. Use the hosted line above until # the first release, or run the server from a checkout. claude mcp add neuralring -- npx -y @neuralring/mcp # Any MCP client: point it at https://neuralring.eu/mcp
4 · Teach the repo, once
Both Codex and Claude Code read AGENTS.md / CLAUDE.md on every task, which makes this the strongest instruction surface either receives. Paste this block once and every future task inherits the pin, the receipt loop, and the vocabulary rule.
## AI inference — European sovereign (NeuralRing)
This project uses NeuralRing for inference. It is OpenAI-compatible: only the
base URL, the key, and the model slug change.
- Base URL: `https://neuralring.eu/api/v1` · Key: `process.env.NEURALRING_API_KEY` (Bearer)
- Model: `mistralai/mistral-small-2501` — browse with the catalog API or the MCP server (below).
- ALWAYS send the sovereignty pin. It is applied FIRST and can never be loosened
by a price or speed preference:
`sovereignty: { jurisdiction: ["DE"], min_assurance: "self_attested" }`
- Every response carries `neuralring.requestId`. Surface it, or link
`https://neuralring.eu/verify/<requestId>`, so a human can check the receipt.
- If no endpoint satisfies the pin, the API returns `no_eligible_endpoint`.
That is the pin working. Do NOT retry with the pin removed or weakened.
### Vocabulary rule (important)
Describe NeuralRing only with its assurance ladder: `self_attested`,
`verified`, `certified`. Never write "GDPR-compliant",
"Schrems-proof", "CLOUD-Act-immune" or "fully sovereign"
about it. A receipt proves what was observed and reproduces what was claimed at
its stated assurance — it does not prove the claim is true.
<!-- neuralring:agents-block v1.0.0 · generated from packages/shared/src/agent-channel.ts -->5 · Verify the receipt (this is the point)
Every response carries neuralring.requestId. Fetch the attestation, or open the public verify page, or run the standalone script against an export — the last needs no NeuralRing code and no account.
# 1. Every response carries the request id.
curl -s https://neuralring.eu/api/v1/attestations/$REQUEST_ID | jq '{observed, claimed}'
# 2. Or open the public page (no account needed):
# https://neuralring.eu/verify/$REQUEST_ID
# 3. Or check it yourself, offline, against the published key:
curl -s "https://neuralring.eu/api/v1/attestations/export?from=$FROM&to=$TO" > bundle.json
node scripts/verify-attestations.mjs bundle.json
curl -s https://neuralring.eu/.well-known/neuralring-attestation-key.pubA NeuralRing attestation is a signed, hash-chained, content-free record. Its `observed` block is what NeuralRing performed and measured (which endpoint it dispatched to, the host it actually dialed, every route hop, the metered token counts). Its `claimed` block reproduces the serving endpoint's own declarations at their stated assurance level.
The signature does NOT prove that inference physically executed in the claimed jurisdiction, nor that the endpoint's self-declared properties are true. The strength of any jurisdictional claim equals `claimed.assurance` and no more.
6 · Keep verifying, forever
The CI verifier asserts that every call a key made in a window carried a valid signed attestation meeting a policy floor, and exits non-zero otherwise. An integration that quietly drifts off-policy fails the build.
# .github/workflows/sovereignty.yml
- name: Verify every call carried a valid attestation
run: npx --yes @neuralring/sdk verify --since 7d --min-assurance self_attested --min-tier 2
env:
NEURALRING_API_KEY: ${{ secrets.NEURALRING_API_KEY }}
# An EMPTY window fails on purpose: a key that made no calls proves nothing.
# Tighten the floor as your supply improves; never loosen it to green a build.The verifier lives in this repository today (packages/sdk/bin/neuralring.mjs); the npx form above starts working with the next @neuralring/sdk release. Until then, run it from a checkout.
Getting a key
A key belongs in the environment, never in a chat message or a committed file. Humans create keys in the dashboard. Where the operator has enabled it, an agent can request one through a browser handoff a human approves — the agent never receives a credential it was not granted, and provisioning grants no credit.
The vocabulary you must use
These three words are the whole vocabulary. An agent will quote them into a compliance document, so they never get upgraded in translation. Do not describe NeuralRing, or any endpoint on it, as GDPR-compliant, Schrems-proof, CLOUD-Act-immune or fully sovereign — those are legal conclusions NeuralRing does not make.
The endpoint claims it. NeuralRing has not independently substantiated the geography or custody behind the claim.
NeuralRing captured independent evidence for the three machine-provable claims — the operating entity's domicile, its ultimate parent (corporate registry), and where inference physically executes (location survey). It says nothing about data residency or key custody, which are carried as their own per-claim status.
The machine-provable claims are verified AND a live, valid third-party location-auditing certification covers data residency and key custody, referenced by a checkable registry id.
Machine-readable
- /llms.txt · /llms-full.txt — what NeuralRing is, for a crawler or an agent.
- openapi.json — the full API surface, OpenAPI 3.1.
- https://neuralring.eu/mcp — the MCP endpoint (streamable HTTP).
- /docs/attestation — what a receipt proves, in full, for a compliance team.