diff --git a/api/streaming.py b/api/streaming.py index a1e0be80..4c2802c5 100644 --- a/api/streaming.py +++ b/api/streaming.py @@ -4614,7 +4614,7 @@ def _replace_session_db_in_kwargs(agent_kwargs, state_db_path): def _attempt_credential_self_heal( - provider_id, session_id, _agent_lock_ref, + provider_id, session_id, _agent_lock_ref, *, target_model=None, ): """Try to silently refresh credentials after a 401/auth error (#1401). @@ -4662,6 +4662,7 @@ def _attempt_credential_self_heal( _new_rt = resolve_runtime_provider_with_anthropic_env_lock( resolve_runtime_provider, requested=provider_id, + target_model=target_model, ) logger.info( @@ -6789,6 +6790,7 @@ def _run_agent_streaming( _heal_result = None _heal_rt = _attempt_credential_self_heal( resolved_provider or '', session_id, _agent_lock, + target_model=resolved_model, ) if _heal_rt is not None: logger.info('[webui] self-heal: retrying stream after credential refresh') @@ -7742,6 +7744,7 @@ def _run_agent_streaming( # ── Credential self-heal on 401 (#1401) ── _heal_rt = _attempt_credential_self_heal( resolved_provider or '', session_id, _agent_lock, + target_model=resolved_model, ) if _heal_rt is not None: logger.info('[webui] self-heal (except path): retrying stream after credential refresh') diff --git a/tests/test_issue3895_opencode_go_model_picker.py b/tests/test_issue3895_opencode_go_model_picker.py index fc690351..a017e40b 100644 --- a/tests/test_issue3895_opencode_go_model_picker.py +++ b/tests/test_issue3895_opencode_go_model_picker.py @@ -2,6 +2,7 @@ import pathlib import queue +import re import sys import types from unittest import mock @@ -191,6 +192,23 @@ def test_streaming_reuses_runtime_base_url_helper_in_self_heal_paths(): source = (pathlib.Path(__file__).parent.parent / "api" / "streaming.py").read_text( encoding="utf-8" ) - assert "resolved_base_url = _runtime_preferred_base_url(\n _rt, resolved_provider, configured_base_url\n )" in source - assert "resolved_base_url = _runtime_preferred_base_url(\n _heal_rt, resolved_provider, configured_base_url\n )" in source - assert "resolved_base_url = _runtime_preferred_base_url(\n _heal_rt, resolved_provider, configured_base_url\n )" in source + assert re.search( + r"resolved_base_url\s*=\s*_runtime_preferred_base_url\(\s*_rt,\s*resolved_provider,\s*configured_base_url\s*\)", + source, + ) + assert len( + re.findall( + r"resolved_base_url\s*=\s*_runtime_preferred_base_url\(\s*_heal_rt,\s*resolved_provider,\s*configured_base_url\s*\)", + source, + ) + ) == 2 + assert len( + re.findall( + r"_attempt_credential_self_heal\(\s*resolved_provider\s+or\s+['\"]{2},\s*session_id,\s*_agent_lock,\s*target_model=resolved_model,\s*\)", + source, + ) + ) == 2 + assert re.search( + r"resolve_runtime_provider_with_anthropic_env_lock\(\s*resolve_runtime_provider,\s*requested=provider_id,\s*target_model=target_model,\s*\)", + source, + )