Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

Provider /v1/messages rejects role:"system" inside messages[] — Claude Code ≥ 2.1.154 incompatible

Aberta Para iniciantes
#1,085 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 2 dias

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
75/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
python
Domínio
api, backend

Direção de pesquisa

Encontre o validador de requisições de /v1/messages e seu modelo para messages[].role; a issue identifica a restrição de papéis como o ponto da falha. Leia primeiro o validador e os testes de requisições e, em seguida, verifique como as mensagens validadas são encaminhadas upstream. O trabalho estará concluído quando uma mensagem com papel system após um turno do usuário passar pela validação e os casos existentes de user e assistant continuarem funcionando.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Provider /v1/messages rejects role:"system" inside messages[] — Claude Code ≥ 2.1.154 incompatible

Summary

The Provider Anthropic Messages endpoint validates messages[].role against only user/assistant and returns:

{"type":"error","error":{"type":"invalid_request_error","message":"Invalid input at messages.1.role"}}

This breaks vanilla Claude Code ≥ 2.1.154, which sends a system-role message inside messages[] (a still-open regression: anthropics/claude-code#63469). Your own command-code CLI sends the legacy shape and works — vanilla Claude Code against api.commandcode.ai/provider does not.

Repro (curl, max_tokens 2 — both uncharged/zero-cost)

Works (control, legacy shape):

curl https://api.commandcode.ai/provider/v1/messages \
  -H "Authorization: Bearer $CMD_PROVIDER_API_KEY" \
  -H "anthropic-version: 2023-06-01" -H "content-type: application/json" \
  -d '{"model":"claude-haiku-5-5","max_tokens":2,"messages":[{"role":"user","content":"hi"}]}'
# → HTTP 200, normal completion

Fails with 400 Invalid input at messages.0.role (system-role message):

curl https://api.commandcode.ai/provider/v1/messages \
  -H "Authorization: Bearer $CMD_PROVIDER_API_KEY" \
  -H "anthropic-version: 2023-06-01" -H "content-type: application/json" \
  -d '{"model":"claude-haiku-5-5","max_tokens":2,"messages":[{"role":"system","content":"You reply tersely."},{"role":"user","content":"hi"}]}'

Verified 2026-10-29: identical 400 on every Claude model in the catalog — claude-opus-5-5, claude-opus-5, claude-sonnet-5-5, claude-sonnet-4-6, claude-fable-5-1, claude-haiku-5-5 (so it's central validation, not per-upstream). The failure fires before upstream routing model-level plan checks fire earlier; the schema gate is the blocker.

Why this is valid per Anthropic's own API

Working with Messages API → System role in messages documents mid-conversation system messages on Opus 5/5.5, Sonnet 5/5.5, Haiku 5.5, Fable/Mythos 5.x, Opus 4.8 — legal after a user turn (only messages[0] is excluded, and Claude Code ≥ 2.1.154 places it after the first user message). First-party api.anthropic.com accepts this since Claude Code 2.1.154 onward.

References

  • anthropics/claude-code#63469 — regression thread: Claude Code started sending messages[].role="system" in 2.1.154; still unfixed upstream (closed stale 2026-08); broke DeepSeek/GLM/Kimi-compatible gateways for 5 months
  • free-claude-code#611 — a third-party Anthropic-compatible server fixed exactly this by widening its role validator to include "system" (then merging/forwarding)
  • Your docs example requests only ever use user messages, so the docs and validator are consistent today — but Claude Code (the highest-volume /v1/messages client) is not

Suggested fix

In the /v1/messages request validator, allow "system" alongside user|assistant for messages[].role (≈10 lines in the pydantic model: role: Literal["user","assistant","system"]), then either forward as-is to system-role-aware upstreams (Anthropic's newer API accepts it on the 5.x families) or pre-merge system-role messages into the top-level system param for legacy upstreams. The free-claude-code fix is the minimal version and has been in production for 5 months.

Environment: macOS, Claude Code 2.1.308 (Homebrew cask), Provider plan key. happy to provide more traces (request captured verbatim via local listener: anthropic-beta headers list included).

Linguagem predominante
Sem dados de linguagem
Estrelas
4.2k
Forks
372
Merge médio
4d 15h
PRs com merge (30d)
9

Preparar o ambiente

Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de CommandCodeAI/command-code

Todas as issues de CommandCodeAI/command-code

Issues semelhantes

Mais issues de Backend & API Design

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.