Skip to content

feat(retrieval): Phase 5 Stage 2 — живой ClaudeProvider.search() через web_search - #4

Merged
Socialpranker merged 6 commits into
mainfrom
feat/phase5-stage2-live-search
Jun 15, 2026
Merged

feat(retrieval): Phase 5 Stage 2 — живой ClaudeProvider.search() через web_search#4
Socialpranker merged 6 commits into
mainfrom
feat/phase5-stage2-live-search

Conversation

@Socialpranker

Copy link
Copy Markdown
Owner

Что

Phase 5 Stage 2: заменяет NotImplementedError в ClaudeProvider.search() на живой two-call web_search flow, возвращающий blob в форме, которую читает runner.adaptive.parse_signals. Закрывает последний содержательный кусок дорожной карты deep-research скилла — после этого адаптивный цикл (Phase 4) работает на реальных источниках, а не на DryRun-фикстурах.

Как (two-call)

Структурный вывод несовместим с citations (web_search их эмитит) → один вызов с обоими = HTTP 400. Поэтому два:

  1. Call 1web_search_20260209 БЕЗ output_config → сырые источники + текст ответа.
  2. Call 2 — тот же контент как plain user-text (не реплей tool-result блоков) + output_config.format=SIGNALS_SCHEMA БЕЗ web_search → строгий JSON {sources, signals}.

Модель прибита к mid (claude-sonnet-4-6) независимо от tier: Haiku 4.5 не поддерживает web_search_20260209 (подтверждено докой claude-api). model_override всё ещё побеждает.

Состав (7 TDD-задач)

  • SIGNALS_SCHEMA + _SIGNAL_SCHEMA/_SOURCE_SCHEMA — structured-output-safe (additionalProperties:false, без min/max)
  • ClaudeProvider._search_model(tier) — хардкод mid
  • _collect_call1(resp) — текст + источники из web_search_tool_result
  • _parse_call2(resp, sqid) + _empty_signals() — JSON→blob, fail-safe на refusal/мусор (зеркалит parse_signals)
  • живой search() two-call + _SEARCH_PROMPT/_SIGNALS_PROMPT + pause_turn guard (до 5 итераций)
  • opt-in -m live smoke (skip без ANTHROPIC_API_KEY)
  • удалён test_claude_search_not_implemented_yet (стаб ушёл — намеренно)

Верификация

  • pytest -q99 passed, 5 skipped (baseline Stage 1 был 90/4)
  • scripts/stamp_docs.py --check → exit 0
  • ruff check . (0.15.1, как в CI) → clean
  • test_claude_search_blob_feeds_parse_signals пинит round-trip с движком цикла

Все тесты — mock-based (fake anthropic client). Живой путь — opt-in -m live, в сеть в обычном прогоне/CI не ходит.

🤖 Generated with Claude Code

Socialpranker and others added 6 commits June 15, 2026 08:49
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…signals

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Socialpranker
Socialpranker merged commit 67e1191 into main Jun 15, 2026
2 checks passed
@Socialpranker
Socialpranker deleted the feat/phase5-stage2-live-search branch June 15, 2026 07:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant