NULLMOTH / FIELD MANUAL
Your first request.
One endpoint. Your own tools. Start with a small output budget.
Quick start
Create an account, add development credit and create an API
key. Keep ATELIER_API_KEY in your server environment. Local development uses
npm run dev and an active connection to Qwen. The public service is not
launched yet.
$qwenRequest = @{
model = 'nullmoth-recon'
messages = @(@{ role = 'user'; content = 'Hello Qwen !' })
max_tokens = 512
stream = $false
} | ConvertTo-Json -Depth 5
Invoke-RestMethod `
-Uri 'http://127.0.0.1:4173/v1/chat/completions' `
-Method Post `
-ContentType 'application/json; charset=utf-8' `
-Headers @{ Authorization = "Bearer $env:ATELIER_API_KEY" } `
-Body ([System.Text.Encoding]::UTF8.GetBytes($qwenRequest))
/api/status reports Qwen availability. /v1/models requires your
API key and exposes nullmoth-recon. Chat uses
/api/playground with a session cookie.
Stream the response
curl --no-buffer "http://127.0.0.1:4173/v1/chat/completions" \
-H "Authorization: Bearer $ATELIER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"nullmoth-recon","messages":[{"role":"user","content":"Hello !"}],"max_tokens":128,"stream":true,"stream_options":{"include_usage":true}}'
Read choices[0].delta.content from each SSE event. Request
stream_options.include_usage for the final usage event. Wait for
[DONE]; an early disconnect or an error event is a failure, even
after HTTP 200. Incomplete responses are excluded from the next chat context.
Deployment templates
Set ATELIER_BASE_URL to the server HTTPS URL ending in /v1,
without a trailing slash. No public production URL or demo key has been issued.
curl "$ATELIER_BASE_URL/chat/completions" \
-H "Authorization: Bearer $ATELIER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nullmoth-recon",
"messages": [{"role": "user", "content": "Hello !"}],
"max_tokens": 512,
"stream": false
}'
$requestBody = @{
model = 'nullmoth-recon'
messages = @(@{ role = 'user'; content = 'Hello !' })
max_tokens = 512
stream = $false
} | ConvertTo-Json -Depth 5
$requestHeaders = @{
Authorization = "Bearer $env:ATELIER_API_KEY"
}
Invoke-RestMethod `
-Uri "$env:ATELIER_BASE_URL/chat/completions" `
-Method Post `
-Headers $requestHeaders `
-ContentType 'application/json; charset=utf-8' `
-Body ([System.Text.Encoding]::UTF8.GetBytes($requestBody))
Keep your key server-side.
Use Authorization: Bearer YOUR_KEY. Keys are shown once, when created. You
can create up to five active keys and revoke them in your account. Never publish a key in
browser code, a repository or a URL. Chat uses a session cookie, not your API key.
What works today
| Feature | Status |
|---|---|
| Chat completions | JSON and SSE streaming, cancellation and verified usage. |
| Model |
nullmoth-recon — NullMoth Recon, Qwen3.8 fine-tuned for cybersecurity
and red-team workflows. Base variant:
OrcaRouter’s Qwen3.8-27B Uncensored FP8. Legacy requests using atelier-large remain supported.
|
| Limits | 4,000 characters per user message, 24,000 total, 20 messages, 1,024 output tokens by default. |
| Tool calls / vision | Not exposed by this backend. |
| Long context | The model configuration can exceed these limits; that is not the public API allowance. |
Handle errors explicitly.
Check HTTP status before reading the response. Preserve user input and offer a retry, with backoff.
| HTTP | Action |
|---|---|
| 400 | Fix the request parameters. |
| 401 / 403 | Check authentication and origin. |
| 402 | Add credit or lower the output budget. |
| 429 | Wait for Retry-After before retrying. |
| 500 / 502 / 503 / 504 | Report unavailability. Avoid retry loops. |
Pay for measured usage.
Provisional rates: $1.95 per million input tokens and $6.50 per million output tokens. Before generation, Qwen tokenizes the input and the server reserves its cost plus the maximum output budget. Valid final usage determines the charge; unused credit is released. Errors or cancellations without valid final counts do not debit this MVP balance.
Usage separates input and output tokens. When the engine reports reasoning tokens, they are included in output, never charged a second time. An absent reasoning breakdown means unavailable, not zero. Thinking is currently disabled on this API.
One active generation and 20 requests per minute per account; two concurrent generations globally by default. Development credits are simulated, capped at $100 per account. No money is collected in development mode.
Ethereum USDC is the planned launch payment. Automatic Ethereum crediting is still pending. The existing Solana adapter is a separate test capability. Public checkout stays disabled until the selected payment flow is validated. A browser return URL never proves a payment.
Credit expiry, refunds, account recovery and final rates must be published before commercial launch.
Estimate my usage ↗Continuous batching ≠ a Batch API.
vLLM can combine computation for independent concurrent requests through continuous batching. Aggregate throughput is not the speed of each individual request. Our own concurrent-load benchmark is needed to determine sustainable prices.
No public asynchronous Batch API, processing deadline or discounted batch rate is currently offered.