DatabricksAdapter yields text content during tool-calling rounds, causing response duplication
Maintainer antworten meist innerhalb von 3 Tagen
Dieses Issue hat noch niemand übernommen.
- #436 von @MarioCadenas — ohne Merge geschlossen
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 55/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Ruhig
- Tech-Stack
- typescript
Rechercherichtung
Beginne mit DatabricksAdapter's streamCompletion() und der run()-Methode um Zeile 196, und reproduziere dann das Problem mit maxSteps: 10 und mehreren Tools wie describeTable und executeSql. Verfolge message_delta- und Tool-Call-Ereignisse über einen Tool-Calling-Durchlauf hinweg. Fertig bedeutet, dass Zwischentext keine doppelten für den Benutzer sichtbaren Antworten erzeugt, während die endgültige Antwort weiterhin genau einmal erscheint.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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
- Vorherrschende Sprache
- TypeScript
- Sterne
- 119
- Forks
- 36
- Ø Merge
- 4 T. 16 Std.
- Gemergte PRs (30 T.)
- 37
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus databricks/appkit
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 55/100
databricks/appkit#729 ·
Maintainer antworten meist innerhalb von 3 Tagen
-
@databricks/lakebase: pool drops maxLifetimeSeconds and other pg options, so connections never recycle and Unity Catalog claims access fails after 4 hoursEvtl. vergeben @billmcmillin hat das vor 5 Tagen übernommen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 20/100
databricks/appkit#718 ·
Maintainer antworten meist innerhalb von 3 Tagen
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
databricks/appkit#699 ·
Maintainer antworten meist innerhalb von 3 Tagen
-
Schwierigkeit 3/5 Ein halber Tag Anfängerfreundlichkeit 42/100
databricks/appkit#656 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 3 Tagen
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 28/100
databricks/appkit#648 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 3 Tagen
Alle Issues in databricks/appkit
Ähnliche Issues
-
Add "append" and "prepend" slots for vue-vuetify extended renderersEvtl. vergeben @simeyc hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
eclipsesource/jsonforms#2668 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Maintainer antworten meist innerhalb von 1 Tag
-
README の通知条件を実際の判定処理に合わせるEvtl. vergeben @unhappychoice hat das heute übernommen. Offenfactory:in-progress priority:medium
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
unhappychoice/oss-issue-opener#395 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug Website
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 77/100
OWASP/OWASP-Hunting#88 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag