honcho/tests/dialectic/test_model_config_usage.py

112 lines
3.2 KiB
Python

import time
from unittest.mock import AsyncMock, patch
import pytest
from src.config import settings
from src.dialectic.core import DialecticAgent
from src.llm import (
HonchoLLMCallResponse,
HonchoLLMCallStreamChunk,
StreamingResponseWithMetadata,
)
async def _stream_chunks() -> StreamingResponseWithMetadata:
async def _stream():
yield HonchoLLMCallStreamChunk(content="streamed")
yield HonchoLLMCallStreamChunk(content="", is_done=True)
return StreamingResponseWithMetadata(
_stream(),
tool_calls_made=[],
input_tokens=10,
output_tokens=5,
cache_creation_input_tokens=0,
cache_read_input_tokens=0,
iterations=1,
)
@pytest.mark.asyncio
async def test_dialectic_answer_uses_level_model_config() -> None:
agent = DialecticAgent(
workspace_name="workspace",
session_name="session",
observer="observer",
observed="observed",
reasoning_level="medium",
)
mock_response = HonchoLLMCallResponse(
content="answer",
input_tokens=10,
output_tokens=5,
finish_reasons=["stop"],
)
with (
patch.object(
DialecticAgent,
"_prepare_query",
new=AsyncMock(
return_value=(AsyncMock(), "task", "run", time.perf_counter())
),
),
patch.object(DialecticAgent, "_log_response_metrics"),
patch(
"src.dialectic.core.honcho_llm_call",
new=AsyncMock(return_value=mock_response),
) as mock_llm_call,
):
result = await agent.answer("What do you know?")
await_args = mock_llm_call.await_args
if await_args is None:
raise AssertionError("Expected dialectic LLM call")
kwargs = await_args.kwargs
expected_config = settings.DIALECTIC.LEVELS["medium"].MODEL_CONFIG
assert result == "answer"
assert kwargs["model_config"] == expected_config
assert "llm_settings" not in kwargs
assert "thinking_budget_tokens" not in kwargs
@pytest.mark.asyncio
async def test_dialectic_answer_stream_uses_level_model_config() -> None:
agent = DialecticAgent(
workspace_name="workspace",
session_name="session",
observer="observer",
observed="observed",
reasoning_level="medium",
)
with (
patch.object(
DialecticAgent,
"_prepare_query",
new=AsyncMock(
return_value=(AsyncMock(), "task", "run", time.perf_counter())
),
),
patch.object(DialecticAgent, "_log_response_metrics"),
patch(
"src.dialectic.core.honcho_llm_call",
new=AsyncMock(return_value=await _stream_chunks()),
) as mock_llm_call,
):
chunks = [chunk async for chunk in agent.answer_stream("What do you know?")]
await_args = mock_llm_call.await_args
if await_args is None:
raise AssertionError("Expected dialectic streaming LLM call")
kwargs = await_args.kwargs
expected_config = settings.DIALECTIC.LEVELS["medium"].MODEL_CONFIG
assert chunks == ["streamed"]
assert kwargs["model_config"] == expected_config
assert "llm_settings" not in kwargs
assert "thinking_budget_tokens" not in kwargs