feat(telegram): add per-chat/topic default agents (#109)
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from takopi.config import ProjectConfig, ProjectsConfig
|
||||
from takopi.context import RunContext
|
||||
from takopi.model import EngineId
|
||||
from takopi.router import AutoRouter, RunnerEntry
|
||||
from takopi.runners.mock import Return, ScriptRunner
|
||||
from takopi.telegram.chat_prefs import ChatPrefsStore
|
||||
from takopi.telegram.engine_defaults import resolve_engine_for_message
|
||||
from takopi.telegram.topic_state import TopicStateStore
|
||||
from takopi.transport_runtime import TransportRuntime
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_resolve_engine_for_message_sources(tmp_path) -> None:
|
||||
codex = ScriptRunner([Return(answer="ok")], engine=EngineId("codex"))
|
||||
pi = ScriptRunner([Return(answer="ok")], engine=EngineId("pi"))
|
||||
router = AutoRouter(
|
||||
entries=[
|
||||
RunnerEntry(engine=codex.engine, runner=codex),
|
||||
RunnerEntry(engine=pi.engine, runner=pi),
|
||||
],
|
||||
default_engine=codex.engine,
|
||||
)
|
||||
project = ProjectConfig(
|
||||
alias="proj",
|
||||
path=tmp_path,
|
||||
worktrees_dir=Path(".worktrees"),
|
||||
default_engine=pi.engine,
|
||||
)
|
||||
runtime = TransportRuntime(
|
||||
router=router,
|
||||
projects=ProjectsConfig(projects={"proj": project}, default_project=None),
|
||||
)
|
||||
chat_prefs = ChatPrefsStore(tmp_path / "telegram_chat_prefs_state.json")
|
||||
topic_store = TopicStateStore(tmp_path / "telegram_topics_state.json")
|
||||
await chat_prefs.set_default_engine(1, "pi")
|
||||
await topic_store.set_default_engine(1, 10, "codex")
|
||||
|
||||
resolved = await resolve_engine_for_message(
|
||||
runtime=runtime,
|
||||
context=RunContext(project="proj"),
|
||||
explicit_engine=EngineId("codex"),
|
||||
chat_id=1,
|
||||
topic_key=(1, 10),
|
||||
topic_store=topic_store,
|
||||
chat_prefs=chat_prefs,
|
||||
)
|
||||
assert resolved.source == "directive"
|
||||
assert resolved.engine == "codex"
|
||||
|
||||
await topic_store.clear_default_engine(1, 10)
|
||||
resolved = await resolve_engine_for_message(
|
||||
runtime=runtime,
|
||||
context=RunContext(project="proj"),
|
||||
explicit_engine=None,
|
||||
chat_id=1,
|
||||
topic_key=(1, 10),
|
||||
topic_store=topic_store,
|
||||
chat_prefs=chat_prefs,
|
||||
)
|
||||
assert resolved.source == "chat_default"
|
||||
assert resolved.engine == "pi"
|
||||
|
||||
await chat_prefs.clear_default_engine(1)
|
||||
resolved = await resolve_engine_for_message(
|
||||
runtime=runtime,
|
||||
context=RunContext(project="proj"),
|
||||
explicit_engine=None,
|
||||
chat_id=1,
|
||||
topic_key=(1, 10),
|
||||
topic_store=topic_store,
|
||||
chat_prefs=chat_prefs,
|
||||
)
|
||||
assert resolved.source == "project_default"
|
||||
assert resolved.engine == "pi"
|
||||
Reference in New Issue
Block a user