- create_event(title, date, start_time?, end_time?, all_day?, owner)
owner обязателен (daniil | sveta). System prompt велит LLM уточнять
чей это календарь, если неясно.
- update_event(event_id, owner, ...fields) — меняет только переданные
поля. Сначала нужно вызвать get_today_events для получения event_id.
- delete_event(event_id, owner) — сначала get_today_events, найти
событие по названию, подтвердить если важное.
get_today_events теперь возвращает event_id и owner (daniil/sveta),
плюс принимает range=month. Description явно говорит LLM что это
первый tool для CRUD-сценариев.
System prompt (Cosmo и Люся) дополнен секцией 'Работа с календарём'
с правилами: даты YYYY-MM-DD, время HH:MM, «завтра» = +1 день,
вычислять от {today}.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bug: Claude hallucinated actions. User said «удалить таймер чайника»,
Claude replied «Таймер чайника отменён» без вызова cancel_timer.
Две причины:
1) История сохраняла только финальный текст предыдущих turn'ов.
Claude видел «я говорил поставил таймер» и мог ответить «удалил» по
паттерну без реального tool-use.
2) System prompt мягко просил использовать tools — Haiku иногда
пропускал tool и отвечал сразу.
Фикс:
- История теперь содержит полные turn'ы (assistant с tool_use блоками,
user с tool_result блоками). _build_messages/_strip_cache_control
корректно обрабатывают content как string или list of blocks.
- System prompt добавил жёсткий раздел «ЖЁСТКИЕ ПРАВИЛА про tools»:
явно запрещено говорить 'поставил/отменил/удалил' без вызова tool,
информацию (погода, события) — только через tool, не выдумывать.
Размер истории вырастет (tool_result'ы могут быть по 500-2000 байт),
но это не проблема — prompt caching делает каждый turn дешёвым на
чтение (cache_r > 90% в логах).
Claude Haiku 4.5 теперь умеет дёргать tools. Все tools — proxy к endpoints
планшета (/api/voice/tools/* и /api/voice/timer) с bearer auth
VOICE_API_KEY. Никакой дополнительной auth в скрипте не требуется.
- satellite/tools.py — 5 tools:
* get_weather(city?) → Open-Meteo через tablet
* get_transport(direction, routes?) → трамваи Антонова-Овсеенко
* get_today_events(range?) → Google Calendar (today/week)
* get_notes() → текстовые + shopping lists
* set_timer(seconds, label) → создаёт таймер на дашборде
Каждый tool возвращает dict/list; ошибки упаковываются как {error: ...}
и отдаются Claude как результат — он сам обрабатывает.
- satellite/llm_claude.py:
* Подключил TOOL_SCHEMAS в вызов messages.create
* Цикл tool-use: до MAX_TOOL_ROUNDS=4 раундов tool_use → exec → tool_result
* System prompt дополнен инструкцией «используй tools без спроса»
* Финальный текст (после всех tool rounds) сохраняется в историю как один
assistant-turn — tool rounds в history не пишутся чтобы не раздувать кеш
* Usage логируется суммарно за все раунды
Работает с уже поднятым tinyproxy на .103 (HTTPS_PROXY в .env).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a parallel LLM backend that bypasses OpenClaw and talks to
Anthropic Messages API directly. Selected via LLM_BACKEND=claude in
.env; default remains openclaw so nothing breaks for existing setup.
Why: OpenClaw gateway adds 500-1000ms overhead on every turn (auth,
memory fetch, routing). Direct Haiku 4.5 + prompt caching = faster
first token and -90% cost on cached chunks.
- satellite/llm_claude.py — Anthropic SDK streaming client, prompt
caching on system prompt and all-but-last-2 history messages, per
agent+date JSON history in HISTORY_DIR, reset_history() for the
'сбрось' command, per-agent system prompts (Cosmo / Люся), fallback
to error event if SDK/key missing.
- satellite/llm.py — dispatches to ask_claude_stream when backend=claude,
exports LLM_BACKEND so modes.py can route reset too.
- satellite/modes.py — _handle_reset calls reset_history when backend
is claude, keeps /new POST for openclaw.
- requirements.txt — anthropic >= 0.50.0
- .env.example — LLM_BACKEND, ANTHROPIC_API_KEY, ANTHROPIC_MODEL,
HISTORY_DIR, MAX_HISTORY, HTTPS_PROXY block for non-RU egress.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>