Files
copilotkit__copilotkit/showcase/harness/fixtures/d5/frontend-tools.json
Alem Tuzlak 1d8d1b0783 fix(showcase/aimock): disambiguate frontend-tools fixtures with toolCallId follow-ups
In replay mode (no real OpenAI), the existing frontend-tools fixtures
match by 'userMessage' substring only. Each pill (Sunset / Forest /
Cosmic) had a single fixture that returned both content + a
change_background toolCall. After the frontend tool ran, the agent's
follow-up LLM call still has the same last user message — substring
matches the same fixture again — agent re-fires change_background,
loops to langgraph's recursion limit, probe's settle window never
quiets, run reds out at the assistant-settle timeout.

Add a toolCallId-keyed follow-up per pill that returns content-only,
plus a static tool_call_id on the first-turn toolCall for the follow-
up to pin to. The follow-up combines userMessage + toolCallId so it
can't cross-match the next pill's first-turn request (which still has
a tool result in history from the prior pill, but a different last
user message).

Probe result: d5:langgraph-python/frontend-tools flips green again in
replay mode — was passing in PR #4724 only because the real-LLM run
that PR was tested against happened to settle without re-firing.
2026-05-08 16:32:19 +02:00

84 lines
3.0 KiB
JSON

{
"_comment": "D5 fixture for /demos/frontend-tools. Three per-pill prompts (Sunset/Forest/Cosmic) drive the `change_background` frontend tool. Each pill has TWO entries: a first-turn (matches by userMessage substring AND no toolCall-id present in the most recent tool message) and a follow-up (matches by userMessage substring AND a static toolCallId). Both criteria are combined so a follow-up never cross-matches a different pill (the matcher iterates top-to-bottom and uses first-match-wins; a follow-up keyed only on toolCallId would re-match the next pill's first-turn request because the prior tool result is still the latest tool message in history). Substrings 'Make the background a sunset gradient', 'deep green forest gradient', 'navy → magenta cosmic gradient' are unique per pill. See showcase/harness/fixtures/d5/README.md (\"Mid-loop re-invocations after a tool call\").",
"fixtures": [
{
"match": {
"userMessage": "Make the background a sunset gradient",
"toolCallId": "call_d5_change_background_sunset"
},
"response": {
"content": "Done — sunset gradient is live."
}
},
{
"match": {
"userMessage": "Make the background a sunset gradient"
},
"response": {
"content": "Sunset gradient applied — warm orange-to-rose blend.",
"toolCalls": [
{
"id": "call_d5_change_background_sunset",
"name": "change_background",
"arguments": {
"background": "linear-gradient(135deg, #ff7e5f 0%, #feb47b 50%, #ff6b6b 100%)"
}
}
]
}
},
{
"match": {
"userMessage": "deep green forest gradient",
"toolCallId": "call_d5_change_background_forest"
},
"response": {
"content": "Done — forest gradient is live."
}
},
{
"match": {
"userMessage": "deep green forest gradient"
},
"response": {
"content": "Forest gradient applied — deep green hues.",
"toolCalls": [
{
"id": "call_d5_change_background_forest",
"name": "change_background",
"arguments": {
"background": "linear-gradient(135deg, #0a3d2e 0%, #166534 50%, #059669 100%)"
}
}
]
}
},
{
"match": {
"userMessage": "navy → magenta cosmic gradient",
"toolCallId": "call_d5_change_background_cosmic"
},
"response": {
"content": "Done — cosmic gradient is live."
}
},
{
"match": {
"userMessage": "navy → magenta cosmic gradient"
},
"response": {
"content": "Cosmic gradient applied — navy fading to magenta.",
"toolCalls": [
{
"id": "call_d5_change_background_cosmic",
"name": "change_background",
"arguments": {
"background": "linear-gradient(135deg, #1e3a8a 0%, #6b21a8 50%, #9333ea 100%)"
}
}
]
}
}
]
}