mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-07-28 13:26:48 +00:00
* fix(channels): wire channel→agent handler and fix Telegram send pipeline * format code * add supported tests
103 lines
3.3 KiB
Python
103 lines
3.3 KiB
Python
"""Tests for continuation handling (Phase 14.2)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Dict, List
|
|
|
|
from openjarvis.agents._stubs import AgentResult, BaseAgent
|
|
|
|
|
|
class MockEngine:
|
|
"""Mock engine that simulates finish_reason='length'."""
|
|
|
|
def __init__(self, responses: List[Dict[str, Any]]):
|
|
self._responses = list(responses)
|
|
self._call_count = 0
|
|
|
|
def generate(self, messages, **kwargs):
|
|
if self._call_count < len(self._responses):
|
|
resp = self._responses[self._call_count]
|
|
else:
|
|
resp = {"content": "done", "finish_reason": "stop"}
|
|
self._call_count += 1
|
|
return resp
|
|
|
|
def list_models(self):
|
|
return ["test-model"]
|
|
|
|
def health(self):
|
|
return True
|
|
|
|
|
|
class ContinuationAgent(BaseAgent):
|
|
"""Agent that exercises _check_continuation."""
|
|
|
|
agent_id = "test_continuation"
|
|
|
|
def run(self, input, context=None, **kwargs):
|
|
messages = self._build_messages(input, context)
|
|
result = self._generate(messages)
|
|
content = self._check_continuation(result, messages)
|
|
return AgentResult(content=content, turns=1)
|
|
|
|
|
|
class TestContinuation:
|
|
def test_no_continuation_needed(self):
|
|
engine = MockEngine(
|
|
[
|
|
{"content": "Hello world", "finish_reason": "stop"},
|
|
]
|
|
)
|
|
agent = ContinuationAgent(engine, "test-model")
|
|
result = agent.run("Hi")
|
|
assert result.content == "Hello world"
|
|
|
|
def test_single_continuation(self):
|
|
engine = MockEngine(
|
|
[
|
|
{"content": "Part 1...", "finish_reason": "length"},
|
|
{"content": " Part 2.", "finish_reason": "stop"},
|
|
]
|
|
)
|
|
agent = ContinuationAgent(engine, "test-model")
|
|
result = agent.run("Hi")
|
|
assert result.content == "Part 1... Part 2."
|
|
|
|
def test_multiple_continuations(self):
|
|
engine = MockEngine(
|
|
[
|
|
{"content": "A", "finish_reason": "length"},
|
|
{"content": "B", "finish_reason": "length"},
|
|
{"content": "C", "finish_reason": "stop"},
|
|
]
|
|
)
|
|
agent = ContinuationAgent(engine, "test-model")
|
|
result = agent.run("Hi")
|
|
assert result.content == "ABC"
|
|
|
|
def test_max_continuations_respected(self):
|
|
engine = MockEngine(
|
|
[
|
|
{"content": "A", "finish_reason": "length"},
|
|
{"content": "B", "finish_reason": "length"},
|
|
{"content": "C", "finish_reason": "length"}, # 3rd continuation
|
|
{"content": "D", "finish_reason": "stop"},
|
|
]
|
|
)
|
|
agent = ContinuationAgent(engine, "test-model")
|
|
# Default max_continuations=2, so should stop after 2 continuations
|
|
messages = agent._build_messages("Hi")
|
|
result_dict = agent._generate(messages)
|
|
content = agent._check_continuation(result_dict, messages, max_continuations=2)
|
|
assert content == "ABC" # A + B + C, but not D
|
|
|
|
def test_empty_finish_reason(self):
|
|
engine = MockEngine(
|
|
[
|
|
{"content": "Done", "finish_reason": ""},
|
|
]
|
|
)
|
|
agent = ContinuationAgent(engine, "test-model")
|
|
result = agent.run("Hi")
|
|
assert result.content == "Done"
|