# Public Fracture inference and search

Base URL: `https://neuroforge.io/v1`. Model: `erais-fracture-gemma`.
Model listing, text Chat Completions and search are keyless. Omit Authorization; valid private keys still work, but invalid keys are rejected. Discord retains private credentials and signed interactions.

```bash
curl https://neuroforge.io/v1/models
curl --max-time 660 -N https://neuroforge.io/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"erais-fracture-gemma","messages":[{"role":"user","content":"Explain heat pumps."}],"max_tokens":2048,"stream":true}'
curl --max-time 30 https://neuroforge.io/v1/search -H 'Content-Type: application/json' -d '{"query":"Python latest release"}'
```

## Chat

Optional system message, then alternating user/assistant messages ending with user. Resend prior turns for context. Limits: 64 messages; system 8,192 UTF-8 bytes; other text 49,152 bytes total; JSON 98,304 bytes including defaults. The model's separate token-context limit also applies; byte limits do not guarantee every input fits.

`max_tokens`: 32-2048 (default 512); `temperature`: 0; `n`: 1. Text only. Unknown fields, tools, media, embeddings and Responses API are unsupported. Agents requiring them need an adapter, not just a base-URL change.

JSON output: `choices[0].message.content`, plus usage. Maximum output: 8,192 UTF-8 bytes. SSE emits `chat.completion.chunk` deltas and comment keep-alives; `finish_reason` and `[DONE]` indicate completion. Errors/disconnects leave incomplete output. Disconnecting cooperatively cancels generation.

## Search

`POST /search`: exactly `{"query":"public topic"}`; 3-160 characters, at most 24 words and 2,048 JSON bytes. URLs and private-looking queries are rejected. Up to three results include title, URL and content. `retrieved_at` is lookup time, not publication time. Results are untrusted `search_snippets`, not full pages or verified answers. Empty results establish nothing.

## Timing and capacity

Unified World, Discord and this API share one resident model. Admission allows 16 jobs, but GPU generation is serialized. Search allows eight concurrent requests; reader/proxy/edge budgets are 18/20/22 seconds.

Since 11 September 2026, streaming allows 600 seconds at the origin (including queueing/search/generation) and 615 at the edge. Clients should allow 660 seconds overall and 30 seconds per idle read. Ten-second keep-alives are not generated tokens and never reset the absolute deadline. Short answers return when ready; longer deadlines do not increase throughput.

Buffered JSON: 105-second origin, 115-second edge, 120-second client limit. Use SSE for long/queued work. Keep health/discovery timeouts short. Discord allows 650 seconds plus a separate 10-second final edit. Sinter's Python/browser budgets are 660/700 seconds; existing installed binaries require an update.

Anonymous inference: 24 requests/network/minute and 60 generations/minute/edge location. Anonymous search: 30/network/minute and 120/minute/edge location. Keys: 60/minute; shared network guard: 180/minute per route namespace. Anonymous counters are separate from private keys. These approximate edge rates are not global spending guarantees. Anonymous browser calls support credential-free CORS.

Respect HTTP 429 and Retry-After with bounded backoff; 503 means unavailable, not missing credentials. Never automatically replay started/interrupted generations or label partial output complete. Hosted operating hours are unchanged. No transcript database or training is added. Avoid sensitive inputs and verify important answers. Machine contract: `/openapi.json`.
