smarter: factual-model routing (beh-10), fetch_url main-content extraction + 8k cap (url-08), get_weather via met.no (spec-016)

This commit is contained in:
Oleksandr Kozachuk
2026-07-17 19:15:18 +02:00
parent f8b9bc75ee
commit e0b97363c9
11 changed files with 404 additions and 6 deletions
+33
View File
@@ -114,6 +114,39 @@ class TestIgnoredChannels(ClassifierGateBase):
self.assertIs(self.bot.channel_by_name("todo-lists", fallback), fallback)
class TestFactualModel(unittest.IsolatedAsyncioTestCase):
async def _model_used(self, config, factual):
from .test_spec_structured import ok_result
responder = OpenAIResponder(dict({"openai-token": "t", "model": "cheap", "system": "s", "history-limit": 5}, **config), "chat")
responder._factual = factual
with patch("fjerkroa_bot.openai_responder.openai_chat", new_callable=AsyncMock) as chat_mock:
chat_mock.return_value = ok_result()
await responder.chat([{"role": "user", "content": "hi"}], 10)
return chat_mock.await_args.kwargs["model"]
async def test_factual_uses_stronger_model(self):
"""BEH-10: factual verdict + factual-model config -> stronger tier."""
self.assertEqual(await self._model_used({"factual-model": "strong"}, True), "strong")
async def test_factual_without_config_stays_default(self):
"""BEH-10: no factual-model config -> default model, no behavior change."""
self.assertEqual(await self._model_used({}, True), "cheap")
async def test_small_talk_stays_default(self):
"""BEH-10: non-factual messages stay on the cheap default."""
self.assertEqual(await self._model_used({"factual-model": "strong"}, False), "cheap")
async def test_send_reads_flag_from_message(self):
"""BEH-10: send() picks the factual flag off the AIMessage."""
responder = FakeModelResponder({"system": "s", "history-limit": 5}, "chat")
responder.scripted = [envelope(answer="x", answer_needed=True)]
message = AIMessage("alice", "opening hours?", "chat")
message.factual = True
await responder.send(message)
self.assertTrue(responder._factual)
class TestTypingPacing(OpsBase):
async def send_with(self, answer, factual, cps=30):
if cps is not None: