DatabricksAdapter yields text content during tool-calling rounds, causing response duplication
Les mainteneurs répondent en général sous 3 jours
Personne n'a encore pris cette issue.
- #436 par @MarioCadenas — fermée sans fusion
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 55/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Calme
- Stack technique
- typescript
Piste de recherche
Commencez par streamCompletion() de DatabricksAdapter et la méthode run() autour de la ligne 196, puis reproduisez le problème avec maxSteps: 10 et plusieurs outils tels que describeTable et executeSql. Suivez les événements message_delta et tool-call au cours d’un cycle d’appel d’outils. C’est terminé lorsque le texte intermédiaire ne produit pas de réponses en double visibles par l’utilisateur, tandis que la réponse finale apparaît toujours une seule fois.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
DatabricksAdapter yields text content during tool-calling rounds, causing response duplication
Problem
When using DatabricksAdapter with Claude models via Databricks Model Serving (OpenAI-compatible endpoint), the model produces substantial text content alongside tool calls in the same response turn. The adapter's streamCompletion() method yields all delta.content text as message_delta events regardless of whether the same response also contains tool calls.
In a multi-step ReAct loop, this causes the model's intermediate text (which often includes the full answer) to be emitted and displayed to the user on every tool-calling turn — resulting in the same answer appearing 3-4× in the final output.
Root Cause Analysis
Claude's native API uses a trained-in tool-use system prompt that shapes the model to produce brief commentary before tool_use blocks. The Databricks OpenAI-compatible translation layer does not include this trained-in prompt, so Claude produces more verbose text during tool-calling rounds.
The adapter loop (run() method, line ~196) correctly breaks when no tool calls are present, but during tool-calling rounds, streamCompletion() yields ALL delta.content as message_delta events — there's no mechanism to suppress or buffer text that arrives in a turn that also contains tool calls.
Expected Behavior
Text content from tool-calling rounds should either:
- Be suppressed (not yielded as
message_delta) when the same response also containstool_calls - Be buffered until
streamCompletionreturns, and only yielded if no tool calls were detected - Be marked with metadata so consumers can distinguish intermediate text from final-answer text
Current Workaround
We added:
- A system prompt instruction telling the model to only write brief status notes during tool-calling turns
- Client-side text buffering in the SSE transport layer that discards accumulated text when a
function_callevent arrives in the same round
Environment
- AppKit version: 0.38.1
- Model:
databricks-claude-opus-4-6via Model Serving - Adapter:
DatabricksAdapter.fromServingEndpoint()
Reproduction
- Create an agent with
maxSteps: 10and multiple tools (e.g.,describeTable,executeSql) - Ask a question that triggers 3+ tool calls
- Observe that the assistant's text response contains the full answer repeated once per tool-calling round
- Langage dominant
- TypeScript
- Étoiles
- 119
- Forks
- 36
- Merge moyen
- 4 j 16 h
- PR mergées (30 j)
- 37
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de databricks/appkit
-
Difficulté 4/5 3-5 jours Accessibilité débutants 55/100
databricks/appkit#729 ·
Les mainteneurs répondent en général sous 3 jours
-
@databricks/lakebase: pool drops maxLifetimeSeconds and other pg options, so connections never recycle and Unity Catalog claims access fails after 4 hoursPeut-être pris @billmcmillin l’a pris il y a 5 jours. Ouverte
Difficulté 4/5 3-5 jours Accessibilité débutants 20/100
databricks/appkit#718 ·
Les mainteneurs répondent en général sous 3 jours
-
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
databricks/appkit#699 ·
Les mainteneurs répondent en général sous 3 jours
-
Difficulté 3/5 Une demi-journée Accessibilité débutants 42/100
databricks/appkit#656 · 1 commentaire ·
Les mainteneurs répondent en général sous 3 jours
-
Difficulté 4/5 3-5 jours Accessibilité débutants 28/100
databricks/appkit#648 · 2 commentaires ·
Les mainteneurs répondent en général sous 3 jours
Toutes les issues de databricks/appkit
Issues similaires
-
Add "append" and "prepend" slots for vue-vuetify extended renderersPeut-être pris @simeyc l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
eclipsesource/jsonforms#2668 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
README の通知条件を実際の判定処理に合わせるPeut-être pris @unhappychoice l’a pris aujourd’hui. Ouvertefactory:in-progress priority:medium
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
unhappychoice/oss-issue-opener#395 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug Website
Difficulté 2/5 1-3 heures Accessibilité débutants 77/100
OWASP/OWASP-Hunting#88 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour