feat(injects,conversations): configurable inject header, urgent inject marks the turn it cut

This commit is contained in:
hh
2026-08-29 17:07:43 +02:00
parent 4a59c59bda
commit be114e6eaf
4 changed files with 66 additions and 5 deletions
+9 -2
View File
@@ -39,6 +39,7 @@ from claude_agent_sdk import (
)
from sqlmodel import col, select
from beaver_gateway.core import injects
from beaver_gateway.core.conversation_store import load_messages
from beaver_gateway.core.distill import (
Digest,
@@ -52,7 +53,7 @@ from beaver_gateway.core.distill import (
trim_summary,
written_paths,
)
from beaver_gateway.core.injects import InjectQueue, inject_header
from beaver_gateway.core.injects import InjectQueue
from beaver_gateway.core.kinds import KINDS, Kind, as_kind
from beaver_gateway.core.transcript import (
messages_from_entries,
@@ -157,6 +158,8 @@ class ConversationTexts:
"""
merge_prompt: str = _DEFAULT_MERGE_PROMPT
inject_header: Callable[[injects.InjectContext], str] = injects.inject_header
"""Framing line(s) above each inject: who it is from, whether it cut a turn."""
interrupted: str = "прервано"
answered: str = "Пользователь ответил: {answer}"
unanswered: str = (
@@ -857,6 +860,7 @@ class Conversations:
_log.info(
"conversation %s: interrupted for urgent inject", conv.external_id
)
await self._queue.mark_interrupting(item)
self._ensure_worker(cast("int", conv.id))
return item
@@ -1650,7 +1654,10 @@ class Conversations:
prompt += "\n\n" + _bundle(batch[1:])
else:
origin = "inject"
prompt = "\n\n".join(f"{inject_header(i.origin)}\n{i.text}" for i in batch)
prompt = "\n\n".join(
f"{self._texts.inject_header(injects.context_of(i))}\n{i.text}"
for i in batch
)
seed = await self._pending_seed(conv)
if seed:
prompt = f"{seed}\n\n{prompt}"