From afbab148f2d00be30f0391a2961c869b736f5596 Mon Sep 17 00:00:00 2001 From: pewdiepie-archdaemon Date: Fri, 18 Sep 2026 15:27:11 +0000 Subject: [PATCH] trace artifact phase provider contract --- src/clean_agent_preview.py | 11 +++++++++++ tests/test_clean_agent_preview.py | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/clean_agent_preview.py b/src/clean_agent_preview.py index c38fcdb18..2a53821c0 100644 --- a/src/clean_agent_preview.py +++ b/src/clean_agent_preview.py @@ -4436,6 +4436,17 @@ async def stream_preview(*, endpoint_url, model, messages, headers, turn_contrac streamed_round_text = False request = search_tool_choice_request(request) request = provider_compatible_tool_choice_request(request, model) + if artifact_write_phase and not successful_artifact_write: + yield event({ + 'type': 'provider_request_contract', + 'round': round_number, + 'artifact_write_phase': True, + 'offered_tools': [ + schema.get('function', {}).get('name') + for schema in request.get('tools', []) + ], + 'tool_choice': request.get('tool_choice'), + }) async with preview_model_response(client, endpoint_url, headers, request, context_recovery) as response: response.raise_for_status() async for line in response.aiter_lines(): diff --git a/tests/test_clean_agent_preview.py b/tests/test_clean_agent_preview.py index 6c5550dbb..8b771a736 100644 --- a/tests/test_clean_agent_preview.py +++ b/tests/test_clean_agent_preview.py @@ -4703,6 +4703,16 @@ async def test_native_stream_reserves_remaining_budget_for_required_artifact(mon and event.get("reason") == "artifact_write_budget_reserved" ) assert recovery["calls_used"] == module.NATIVE_ARTIFACT_RESEARCH_LIMIT + request_contract = next( + event for event in events + if event.get("type") == "provider_request_contract" + and event.get("artifact_write_phase") is True + ) + assert "write_file" in request_contract["offered_tools"] + assert "web_search" not in request_contract["offered_tools"] + assert request_contract["tool_choice"] == { + "type": "function", "function": {"name": "write_file"}, + } reserved_names = [tool["function"]["name"] for tool in requests[12]["tools"]] assert "write_file" in reserved_names assert "web_search" not in reserved_names