Repository navigation
AINode 0.5.19
The fleet endpoint forwards the Anthropic Messages API; Claude Code is a harness bench adapter; Qwen3.8-Flash-Next entry pinned and proven.
Fixed
- The fleet endpoint forwards the Anthropic Messages API. vLLM serves
POST /v1/messagesnatively alongside its OpenAI paths, but AINode's port 3000 registered only/v1/chat/completionsand/v1/completions, so/v1/messageswas a 404 on every node: a client that speaks Messages and nothing else (Claude Code, the Anthropic SDKs) had to be aimed at one engine's:8000and lost the model-id lookup, capability-aware ordering and failover that every other protocol gets for free./v1/messagesand/v1/messages/count_tokensnow go throughproxy_to_vllm, the same handler as chat completions, so routing on the body'smodel, transport failover across every node serving it, the 404 for a model nobody serves, SSE streaming and header passthrough (x-api-key,anthropic-version,anthropic-betareach the engine untouched) are the code that already existed rather than a second implementation.is_multimodal_requestnow also reads the Messages API's own spelling of media (an{"type": "image"}or{"type": "document"}block, including one nested in atool_result), so an image sent over/v1/messagesis ordered onto an instance that accepts images instead of being routed on the model id alone. The proxy also stops dropping the caller's query string (path_qs, notpath): Claude Code posts to/v1/messages?beta=true. The Server view's endpoint list no longer calls/v1/messagesplanned.
Added
- Harness bench adapter:
claude, Claude Code driven against a served model. The first harness here that does not speak the OpenAI protocol, and the reason the proxy fix above exists.--harness clauderunsclaude -p "<prompt>" --model <id> --dangerously-skip-permissions --output-format json --max-turns 12withANTHROPIC_BASE_URLset to--endpointminus its trailing/v1(Claude Code appends/v1/messagesitself, so the/v1form would produce/v1/v1/messages);--endpointstays the/v1form on the command line for every harness. The placeholder key goes in bothANTHROPIC_API_KEYandANTHROPIC_AUTH_TOKEN, the served model fills both the main and small-fast model slots, and telemetry and non-essential traffic are off.CLAUDE_CONFIG_DIRpoints at the run's own scratch directory so a bench run never reads or writes the operator's Claude Code profile (settings, hooks, MCP servers, sessions, credentials), which is both hygiene and honesty, since a personalsettings.jsonchanges what the agent does; it needs no seed file (verified: claude 2.1.272 creates the whole tree itself from a directory that never existed and never prompts for a login).is_error: truein the result JSON is recorded as a crash even when the exit code is 0, because Claude Code reports a run it could not finish and still exits cleanly. Verified end to end on claude 2.1.272: 6/6 hidden tests onisogramdriving Qwen3.8 27B NVFP4 on the fleet, 294 s over 6 turns. Known gap, documented rather than fixed: aCLAUDE.mdin a parent of the working directory is still discovered, so a--work-dirinside a checkout that has one puts that file in the run.
Image: ghcr.io/getainode/ainode:0.5.19