1Panel-dev / 1Panel-dev/MaxKB

[Bug] Anthropic models: tool calls fail with "Input tag 'input_json_delta' ... does not match any of the expected tags" (streamed tool_use never assembled)

Ouverte
#6,480 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Type: To Be Verified
Langage dominant
Python
Étoiles
22.8k
Forks
3.2k
Merge moyen
45 min
PR mergées (30 j)
270

Description

MaxKB Version

v2.10.4-lts (also reproduced on v2.10.2-lts)

Problem Description

When an application has a custom tool attached and uses an Anthropic model (model_anthropic_provider), every message that triggers a tool call fails. The Anthropic API rejects MaxKB's follow-up request:

BadRequestError: Error code: 400 - {'type': 'error', 'error': {'type': 'invalid_request_error',
'message': "messages.1.content.1: Input tag 'input_json_delta' found using 'type' does not match any of the expected tags"}}

and, in the other variant:

BadRequestError: Error code: 400 - {'type': 'error', 'error': {'type': 'invalid_request_error',
'message': 'messages: text content blocks must be non-empty'}}

MaxKB returns this to the caller as HTTP 200 with the error text as the answer body, so it reaches end users as the assistant's reply.

Cause

input_json_delta is an Anthropic streaming event type, not a message content type. Anthropic streams tool arguments as a series of content_block_delta events of type input_json_delta, each carrying a partial_json fragment. These must be accumulated and assembled into a completed tool_use content block before the assistant turn is replayed in messages.

MaxKB appears to replay the raw streamed deltas instead. A search of the v2.10.4-lts tree finds no handling for either field:

grep -rn "input_json_delta\|partial_json" apps/     # zero hits

_yield_mcp_response() in apps/application/flow/tools.py handles only OpenAI-shaped tool deltas (tool_call_chunks / tool_calls / invalid_tool_calls). There is no branch for Anthropic content blocks, which is consistent with both error messages: the unassembled delta is sent verbatim, and the accompanying text block is empty.

Steps to Reproduce
  1. Register an Anthropic model (reproduced with claude-sonnet-5, model_anthropic_provider).
  2. Create a SIMPLE agent using that model.
  3. Create a custom Python tool and attach it (tool_enable: true), e.g.
def live_price(query):
    return 'DJI Neo: 4242.42 GEL, in stock.'
  1. Set the system prompt so the tool is actually used, e.g. "For any question about price or stock you MUST call the live_price tool."
  2. Call the OpenAI-compatible endpoint with stream: true (required — with tools attached, stream: false is unsupported per #6300 / #4846 / #4363):
curl -N "$MAXKB/chat/api/$APP_ID/chat/completions" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"model":"gpt-3.5-turbo","stream":true,"messages":[{"role":"user","content":"How much is the DJI Neo?"}]}'

Expected: the answer quotes the tool's value (4242.42 GEL).
Actual: the answer is the BadRequestError text above.

The same setup works on an OpenAI-shaped provider

Identical agent, identical tool, identical prompt, only the model swapped to model_openai_provider (gpt-4o-mini): no error, and the answer contains 4242.42 GEL, confirming the tool executed. This isolates the defect to the Anthropic provider's streamed tool-call handling rather than to tools, sandboxing, or the endpoint.

Impact

Custom tools and MCP cannot be used at all with Anthropic models. Because tools require stream: true, and streaming is exactly where the assembly fails, there is no working combination for Anthropic users.

Tested on v2.10.2-lts and v2.10.4-lts (CE), Docker, single-node.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans apps/application/flow/tools.py, à _yield_mcp_response(), puis recherchez dans l’arborescence input_json_delta et partial_json comme indiqué. Reproduisez un appel d’outil Anthropic diffusé en streaming et comparez-le au provider fonctionnel structuré comme OpenAI ; c’est terminé lorsque la valeur de l’outil atteint la réponse sans Anthropic BadRequestError.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
ai, backend-api-design
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Active
Clarté
Clairement spécifiée
Accessibilité débutants
68/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.