mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-10-28 00:32:22 +01:00
buffer rejected search drafts and cap interactive rounds
This commit is contained in:
@@ -1307,11 +1307,11 @@ def native_execution_limits(max_rounds):
|
|||||||
|
|
||||||
|
|
||||||
def interactive_execution_limit(max_rounds):
|
def interactive_execution_limit(max_rounds):
|
||||||
"""Honor the WebUI agent-step setting for the compact preview loop."""
|
"""Bound interactive turns independently of long-running native jobs."""
|
||||||
if max_rounds is None:
|
if max_rounds is None:
|
||||||
return INTERACTIVE_ROUND_LIMIT
|
return INTERACTIVE_ROUND_LIMIT
|
||||||
try:
|
try:
|
||||||
return max(1, min(int(max_rounds), 200))
|
return max(1, min(int(max_rounds), INTERACTIVE_ROUND_LIMIT))
|
||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
return INTERACTIVE_ROUND_LIMIT
|
return INTERACTIVE_ROUND_LIMIT
|
||||||
|
|
||||||
@@ -3891,6 +3891,7 @@ async def stream_preview(*, endpoint_url, model, messages, headers, turn_contrac
|
|||||||
official_source_retry_attempted = False
|
official_source_retry_attempted = False
|
||||||
note_search_recovery_attempted = False
|
note_search_recovery_attempted = False
|
||||||
replace_streamed_draft_on_finish = False
|
replace_streamed_draft_on_finish = False
|
||||||
|
buffer_completion_drafts = broad_current_web_request(direct_user_text)
|
||||||
usage_in = usage_out = 0
|
usage_in = usage_out = 0
|
||||||
has_real_usage = False
|
has_real_usage = False
|
||||||
first_request_tokens = last_request_tokens = 0
|
first_request_tokens = last_request_tokens = 0
|
||||||
@@ -4108,7 +4109,11 @@ async def stream_preview(*, endpoint_url, model, messages, headers, turn_contrac
|
|||||||
if text:
|
if text:
|
||||||
first_token = first_token or time.monotonic()
|
first_token = first_token or time.monotonic()
|
||||||
content += text
|
content += text
|
||||||
if not prior_summary_answer and not progressive_thinking:
|
if (
|
||||||
|
not prior_summary_answer
|
||||||
|
and not progressive_thinking
|
||||||
|
and not buffer_completion_drafts
|
||||||
|
):
|
||||||
yield event({'delta': text})
|
yield event({'delta': text})
|
||||||
for fragment in delta.get('tool_calls') or []:
|
for fragment in delta.get('tool_calls') or []:
|
||||||
call = pending.setdefault(fragment['index'], {'id': '', 'type': 'function', 'function': {'name': '', 'arguments': ''}})
|
call = pending.setdefault(fragment['index'], {'id': '', 'type': 'function', 'function': {'name': '', 'arguments': ''}})
|
||||||
@@ -4118,7 +4123,7 @@ async def stream_preview(*, endpoint_url, model, messages, headers, turn_contrac
|
|||||||
call['function'][key] += (fragment.get('function') or {}).get(key) or ''
|
call['function'][key] += (fragment.get('function') or {}).get(key) or ''
|
||||||
if progressive_thinking:
|
if progressive_thinking:
|
||||||
content = visible_content_after_qwen_thinking(content)
|
content = visible_content_after_qwen_thinking(content)
|
||||||
if content and not prior_summary_answer:
|
if content and not prior_summary_answer and not buffer_completion_drafts:
|
||||||
yield event({'delta': content})
|
yield event({'delta': content})
|
||||||
proposed = [pending[i] for i in sorted(pending)]
|
proposed = [pending[i] for i in sorted(pending)]
|
||||||
proposed = serialize_required_email_attachment_chain(
|
proposed = serialize_required_email_attachment_chain(
|
||||||
@@ -4377,7 +4382,7 @@ async def stream_preview(*, endpoint_url, model, messages, headers, turn_contrac
|
|||||||
yield event({'delta': suffix})
|
yield event({'delta': suffix})
|
||||||
if not content:
|
if not content:
|
||||||
yield event({'delta': 'The test model returned no answer. No substitute answer was generated.'})
|
yield event({'delta': 'The test model returned no answer. No substitute answer was generated.'})
|
||||||
elif replace_streamed_draft_on_finish:
|
elif replace_streamed_draft_on_finish or buffer_completion_drafts:
|
||||||
yield event({'type': 'final_response', 'content': content})
|
yield event({'type': 'final_response', 'content': content})
|
||||||
break
|
break
|
||||||
# Treat a model-proposed call batch atomically for preview
|
# Treat a model-proposed call batch atomically for preview
|
||||||
|
|||||||
@@ -312,8 +312,8 @@ def test_native_execution_limits_allow_multi_artifact_work_without_unbounded_rou
|
|||||||
|
|
||||||
|
|
||||||
def test_compact_preview_honors_configured_interactive_round_limit():
|
def test_compact_preview_honors_configured_interactive_round_limit():
|
||||||
assert interactive_execution_limit(100) == 100
|
assert interactive_execution_limit(100) == 8
|
||||||
assert interactive_execution_limit(1000) == 200
|
assert interactive_execution_limit(1000) == 8
|
||||||
assert interactive_execution_limit(0) == 1
|
assert interactive_execution_limit(0) == 1
|
||||||
assert interactive_execution_limit(None) == 8
|
assert interactive_execution_limit(None) == 8
|
||||||
assert interactive_execution_limit("invalid") == 8
|
assert interactive_execution_limit("invalid") == 8
|
||||||
@@ -1266,6 +1266,10 @@ async def test_stream_retries_an_obviously_truncated_broad_web_answer(monkeypatc
|
|||||||
and 'fuller evidence-based briefing' in event.get('content', '')
|
and 'fuller evidence-based briefing' in event.get('content', '')
|
||||||
for event in events
|
for event in events
|
||||||
)
|
)
|
||||||
|
assert not any(
|
||||||
|
event.get('delta') == 'Current AI news includes reports about U.'
|
||||||
|
for event in events
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_task_renderer_honors_few_and_filters_confirmed_morning_schedule():
|
def test_task_renderer_honors_few_and_filters_confirmed_morning_schedule():
|
||||||
|
|||||||
Reference in New Issue
Block a user