feat(brain): wire STREAM_BROWSER real-time modes into the reply engine (browser + Gemini)

Completes the two info modes in the Python brain:

- config.py: read STREAM_BROWSER / GEMINI_API_KEY / GEMINI_MODEL from env into
  Settings (stream_browser, gemini_api_key, gemini_model). Verified load_settings
  reads both modes.
- realtime_search.py: two fail-open backends returning the same fenced
  UNTRUSTED-WEB-EXTRACT envelope: browser_search() shells the Node CDP helper to
  drive the on-screen Chrome (visible on the broadcast); gemini_search() calls
  the Gemini REST API with google_search grounding.
- web_search.run(): routes by mode before the DDG cascade (true->browser,
  false->Gemini), falling through to DDG/Brave/Wikipedia on any miss.
- browse_and_play tool: plays a YouTube video on the shared screen (true mode
  only); registered in the tool registry.
- specs + docs/llm_contexts.md updated (new Gemini LLM context); CLAUDE.md spec
  registry updated.

Verified live against the running Chrome: true-mode webSearch returned real
Google results for "오늘 서울 날씨", browseAndPlay played the IU 밤편지 MV, and
false-mode degrades gracefully on a bad/absent key. A valid GEMINI_API_KEY is
still needed to confirm the real Gemini grounding output.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
javis-bot
2026-06-10 16:46:58 +09:00
parent c420d5da53
commit 702fe8017e
9 changed files with 257 additions and 1 deletions

View File

@@ -5,6 +5,22 @@ reply LLM to ground its answer in. Used for any query that needs current,
external, or entity-specific information the assistant can't derive from
memory.
### Real-time info routing (`STREAM_BROWSER`)
Before the DuckDuckGo cascade, `run()` routes by the env flag `STREAM_BROWSER`
(mirrored into `cfg.stream_browser`; see `docs/stream_browser_modes.md` and
`realtime_search.py`):
- **true** (default): `browser_search()` drives the on-screen Chrome (Node CDP
helper `bot/scripts/stream-test/browse-search.mjs`) to Google-search the
query, so the action is visible on the Go-Live broadcast.
- **false**: `gemini_search()` answers via the Gemini API (`google_search`
grounding), keyed by `GEMINI_API_KEY` / `GEMINI_MODEL`.
Both return the same fenced `UNTRUSTED WEB EXTRACT` envelope and are fail-open:
if the route yields nothing (Chrome down, no/invalid key, error) the tool falls
through to the normal DDG / Brave / Wikipedia cascade below.
### Pipeline
1. **Instant answer**: hit `https://api.duckduckgo.com/` for the Abstract /