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.

Local request · PowerShell
$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

Streaming · Bash / Git Bash
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.

First request · Bash
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
  }'
First request · PowerShell
$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

Current backend capabilities
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.