276 lines
8.8 KiB
Python
276 lines
8.8 KiB
Python
import json
|
|
|
|
from opensquilla.engine.runtime import _persisted_tool_result_segment
|
|
from opensquilla.engine.types import ToolResultEvent
|
|
|
|
|
|
def test_persisted_tool_result_keeps_oversized_json_parseable_with_provider() -> None:
|
|
result = json.dumps(
|
|
{
|
|
"query": "ClickUp pricing plans 2025 2026 per seat",
|
|
"provider": "brave",
|
|
"results": [
|
|
{
|
|
"title": f"Result {idx}",
|
|
"url": f"https://example.com/{idx}",
|
|
"snippet": "x" * 700,
|
|
}
|
|
for idx in range(5)
|
|
],
|
|
},
|
|
ensure_ascii=False,
|
|
indent=2,
|
|
)
|
|
assert len(result) > 2000
|
|
|
|
segment = _persisted_tool_result_segment(
|
|
ToolResultEvent(
|
|
tool_use_id="call_1",
|
|
tool_name="web_search",
|
|
result=result,
|
|
is_error=False,
|
|
)
|
|
)
|
|
|
|
assert segment["provider"] == "brave"
|
|
assert segment["query"] == "ClickUp pricing plans 2025 2026 per seat"
|
|
assert segment["result_truncated"] is True
|
|
assert segment["result_original_chars"] == len(result)
|
|
assert len(segment["result"]) <= 2000
|
|
|
|
preview = json.loads(segment["result"])
|
|
assert preview["provider"] == "brave"
|
|
assert preview["query"] == "ClickUp pricing plans 2025 2026 per seat"
|
|
assert preview["result_truncated"] is True
|
|
assert preview["result_original_chars"] == len(result)
|
|
|
|
|
|
def test_persisted_web_search_result_promotes_nested_diagnostics() -> None:
|
|
result = json.dumps(
|
|
{
|
|
"ok": True,
|
|
"query": "OpenSquilla search architecture",
|
|
"mode": "technical",
|
|
"provider_attempts": [
|
|
{"provider": "exa", "status": "error", "error_kind": "network"},
|
|
{"provider": "brave", "status": "success"},
|
|
],
|
|
"diagnostics": {
|
|
"selected_provider": "brave",
|
|
"fallback_from": "exa",
|
|
"fetched_count": 2,
|
|
"fetch_failed_count": 1,
|
|
"returned_chars": 2800,
|
|
"budget_clamped": True,
|
|
"recency_supported": False,
|
|
"recency_degraded": True,
|
|
"provider_attempts": [
|
|
{"provider": "exa", "status": "error", "error_kind": "network"},
|
|
{"provider": "brave", "status": "success"},
|
|
],
|
|
},
|
|
"results": [
|
|
{
|
|
"title": f"Result {idx}",
|
|
"url": f"https://example.com/{idx}",
|
|
"excerpt": "x" * 900,
|
|
}
|
|
for idx in range(5)
|
|
],
|
|
},
|
|
ensure_ascii=False,
|
|
indent=2,
|
|
)
|
|
assert len(result) > 2000
|
|
|
|
segment = _persisted_tool_result_segment(
|
|
ToolResultEvent(
|
|
tool_use_id="call_web_search_diagnostics",
|
|
tool_name="web_search",
|
|
result=result,
|
|
is_error=False,
|
|
)
|
|
)
|
|
|
|
assert segment["selected_provider"] == "brave"
|
|
assert segment["fallback_from"] == "exa"
|
|
assert segment["provider_attempt_count"] == 2
|
|
assert segment["fetched_count"] == 2
|
|
assert segment["fetch_failed_count"] == 1
|
|
assert segment["returned_chars"] == 2800
|
|
assert segment["budget_clamped"] is True
|
|
assert segment["recency_supported"] is False
|
|
assert segment["recency_degraded"] is True
|
|
|
|
|
|
def test_persisted_web_search_result_keeps_sources_with_complete_urls() -> None:
|
|
long_excerpt = "Long fetched article body. " * 120
|
|
result = json.dumps(
|
|
{
|
|
"ok": True,
|
|
"query": "Lionel Messi retirement 2026",
|
|
"mode": "auto",
|
|
"sources": [
|
|
{
|
|
"rank": 1,
|
|
"title": "Messi retirement dismissed with one condition clear",
|
|
"url": "https://thefootballfaithful.com/messi-retirement-dismissed-one-condition-clear/",
|
|
"canonical_url": "https://thefootballfaithful.com/messi-retirement-dismissed-one-condition-clear/",
|
|
"domain": "thefootballfaithful.com",
|
|
"provider": "duckduckgo",
|
|
"fetched": True,
|
|
}
|
|
],
|
|
"results": [
|
|
{
|
|
"rank": 1,
|
|
"title": "Messi retirement dismissed with one condition clear",
|
|
"url": "https://thefootballfaithful.com/messi-retirement-dismissed-one-condition-clear/",
|
|
"excerpt": long_excerpt,
|
|
"provider": "duckduckgo",
|
|
}
|
|
],
|
|
},
|
|
ensure_ascii=False,
|
|
indent=2,
|
|
)
|
|
assert len(result) > 2000
|
|
|
|
segment = _persisted_tool_result_segment(
|
|
ToolResultEvent(
|
|
tool_use_id="call_web_search_sources",
|
|
tool_name="web_search",
|
|
result=result,
|
|
is_error=False,
|
|
)
|
|
)
|
|
|
|
assert segment["result_truncated"] is True
|
|
assert segment["sources"] == [
|
|
{
|
|
"rank": 1,
|
|
"title": "Messi retirement dismissed with one condition clear",
|
|
"url": "https://thefootballfaithful.com/messi-retirement-dismissed-one-condition-clear/",
|
|
"canonical_url": "https://thefootballfaithful.com/messi-retirement-dismissed-one-condition-clear/",
|
|
"domain": "thefootballfaithful.com",
|
|
"provider": "duckduckgo",
|
|
"fetched": True,
|
|
}
|
|
]
|
|
assert not segment["sources"][0]["url"].endswith("…")
|
|
|
|
|
|
def test_persisted_web_search_result_derives_sources_from_results_when_missing() -> None:
|
|
result = json.dumps(
|
|
{
|
|
"ok": True,
|
|
"query": "source fallback",
|
|
"provider_attempts": [{"provider": "duckduckgo", "status": "success"}],
|
|
"results": [
|
|
{
|
|
"rank": 1,
|
|
"title": "Fallback source",
|
|
"url": "https://example.com/fallback-source?utm=tracking",
|
|
"canonical_url": "https://example.com/fallback-source",
|
|
"domain": "example.com",
|
|
"provider": "duckduckgo",
|
|
"fetched": False,
|
|
"excerpt": "x" * 3000,
|
|
}
|
|
],
|
|
},
|
|
ensure_ascii=False,
|
|
indent=2,
|
|
)
|
|
assert len(result) > 2000
|
|
|
|
segment = _persisted_tool_result_segment(
|
|
ToolResultEvent(
|
|
tool_use_id="call_web_search_sources_fallback",
|
|
tool_name="web_search",
|
|
result=result,
|
|
is_error=False,
|
|
)
|
|
)
|
|
|
|
assert segment["sources"] == [
|
|
{
|
|
"rank": 1,
|
|
"title": "Fallback source",
|
|
"url": "https://example.com/fallback-source?utm=tracking",
|
|
"canonical_url": "https://example.com/fallback-source",
|
|
"domain": "example.com",
|
|
"provider": "duckduckgo",
|
|
"fetched": False,
|
|
}
|
|
]
|
|
|
|
|
|
def test_persisted_tool_result_bounds_oversized_segment_metadata() -> None:
|
|
result = json.dumps(
|
|
{
|
|
"provider": "brave",
|
|
"query": "q" * 100_000,
|
|
"error": "e" * 100_000,
|
|
"results": [{"snippet": "x" * 700}],
|
|
},
|
|
ensure_ascii=False,
|
|
indent=2,
|
|
)
|
|
|
|
segment = _persisted_tool_result_segment(
|
|
ToolResultEvent(
|
|
tool_use_id="call_oversized_metadata",
|
|
tool_name="web_search",
|
|
result=result,
|
|
is_error=False,
|
|
)
|
|
)
|
|
|
|
assert segment["provider"] == "brave"
|
|
assert len(segment["query"]) == 256
|
|
assert segment["query"].endswith("…")
|
|
assert len(segment["error"]) == 256
|
|
assert segment["error"].endswith("…")
|
|
assert "fallback_from" not in segment
|
|
assert len(segment["result"]) <= 2000
|
|
assert len(json.dumps(segment, ensure_ascii=False)) < 3000
|
|
|
|
|
|
def test_persisted_tool_result_keeps_short_result_unchanged() -> None:
|
|
result = '{"provider": "brave", "results": []}'
|
|
|
|
segment = _persisted_tool_result_segment(
|
|
ToolResultEvent(
|
|
tool_use_id="call_2",
|
|
tool_name="web_search",
|
|
result=result,
|
|
is_error=False,
|
|
)
|
|
)
|
|
|
|
assert segment == {
|
|
"type": "tool_result",
|
|
"tool_use_id": "call_2",
|
|
"name": "web_search",
|
|
"result": result,
|
|
"is_error": False,
|
|
}
|
|
|
|
|
|
def test_persisted_tool_result_marks_oversized_non_json_prefix() -> None:
|
|
result = "abc" * 1000
|
|
|
|
segment = _persisted_tool_result_segment(
|
|
ToolResultEvent(
|
|
tool_use_id="call_3",
|
|
tool_name="exec_command",
|
|
result=result,
|
|
is_error=False,
|
|
)
|
|
)
|
|
|
|
assert segment["result"] == result[:2000]
|
|
assert segment["result_truncated"] is True
|
|
assert segment["result_original_chars"] == len(result)
|