feat: add telegram /model and /reasoning overrides (#147)
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
import pytest
|
||||
|
||||
from takopi.telegram.chat_prefs import ChatPrefsStore
|
||||
from takopi.telegram.engine_overrides import (
|
||||
EngineOverrides,
|
||||
merge_overrides,
|
||||
resolve_override_value,
|
||||
)
|
||||
from takopi.telegram.topic_state import TopicStateStore
|
||||
|
||||
|
||||
def test_merge_overrides_prefers_topic_values() -> None:
|
||||
topic = EngineOverrides(model=None, reasoning="high")
|
||||
chat = EngineOverrides(model="gpt-4.1-mini", reasoning=None)
|
||||
merged = merge_overrides(topic, chat)
|
||||
|
||||
assert merged is not None
|
||||
assert merged.model == "gpt-4.1-mini"
|
||||
assert merged.reasoning == "high"
|
||||
|
||||
|
||||
def test_resolve_override_value_tracks_sources() -> None:
|
||||
topic = EngineOverrides(model="gpt-4.1", reasoning=None)
|
||||
chat = EngineOverrides(model="gpt-4.1-mini", reasoning="low")
|
||||
resolution = resolve_override_value(
|
||||
topic_override=topic,
|
||||
chat_override=chat,
|
||||
field="model",
|
||||
)
|
||||
|
||||
assert resolution.value == "gpt-4.1"
|
||||
assert resolution.source == "topic_override"
|
||||
assert resolution.topic_value == "gpt-4.1"
|
||||
assert resolution.chat_value == "gpt-4.1-mini"
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_chat_prefs_engine_overrides_roundtrip(tmp_path) -> None:
|
||||
path = tmp_path / "telegram_chat_prefs_state.json"
|
||||
store = ChatPrefsStore(path)
|
||||
await store.set_engine_override(
|
||||
123,
|
||||
"codex",
|
||||
EngineOverrides(model="gpt-4.1-mini", reasoning="low"),
|
||||
)
|
||||
|
||||
override = await store.get_engine_override(123, "codex")
|
||||
assert override is not None
|
||||
assert override.model == "gpt-4.1-mini"
|
||||
assert override.reasoning == "low"
|
||||
|
||||
store2 = ChatPrefsStore(path)
|
||||
override2 = await store2.get_engine_override(123, "codex")
|
||||
assert override2 is not None
|
||||
assert override2.model == "gpt-4.1-mini"
|
||||
assert override2.reasoning == "low"
|
||||
|
||||
await store2.set_engine_override(
|
||||
123,
|
||||
"codex",
|
||||
EngineOverrides(model=None, reasoning="low"),
|
||||
)
|
||||
override3 = await store2.get_engine_override(123, "codex")
|
||||
assert override3 is not None
|
||||
assert override3.model is None
|
||||
assert override3.reasoning == "low"
|
||||
|
||||
await store2.set_engine_override(
|
||||
123,
|
||||
"codex",
|
||||
EngineOverrides(model=None, reasoning=None),
|
||||
)
|
||||
override4 = await store2.get_engine_override(123, "codex")
|
||||
assert override4 is None
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_topic_state_engine_overrides_roundtrip(tmp_path) -> None:
|
||||
path = tmp_path / "telegram_topics_state.json"
|
||||
store = TopicStateStore(path)
|
||||
await store.set_engine_override(
|
||||
1,
|
||||
10,
|
||||
"codex",
|
||||
EngineOverrides(model="gpt-4.1", reasoning="medium"),
|
||||
)
|
||||
|
||||
override = await store.get_engine_override(1, 10, "codex")
|
||||
assert override is not None
|
||||
assert override.model == "gpt-4.1"
|
||||
assert override.reasoning == "medium"
|
||||
|
||||
store2 = TopicStateStore(path)
|
||||
override2 = await store2.get_engine_override(1, 10, "codex")
|
||||
assert override2 is not None
|
||||
assert override2.model == "gpt-4.1"
|
||||
assert override2.reasoning == "medium"
|
||||
Reference in New Issue
Block a user