From a57a4165f1063bb9806308726697f6445aaa5949 Mon Sep 17 00:00:00 2001 From: Justin Bollinger Date: Fri, 24 Jul 2026 11:50:19 -0400 Subject: [PATCH] refactor(llm): validate AgentConfig in prod; spec-mock the client in tests Co-Authored-By: Claude Sonnet 4.6 --- hate_crack/llm.py | 2 +- tests/test_llm.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hate_crack/llm.py b/hate_crack/llm.py index 195e5d8..44ad687 100644 --- a/hate_crack/llm.py +++ b/hate_crack/llm.py @@ -111,7 +111,7 @@ def generate_candidates( prompt_generator = _TARGET_PROMPT if mode == "target" else _WORDLIST_PROMPT agent = AtomicAgent[GenerationInput, PasswordCandidatesOutput]( - config=AgentConfig.model_construct( + config=AgentConfig( client=client, model=model, system_prompt_generator=prompt_generator, diff --git a/tests/test_llm.py b/tests/test_llm.py index f96b39c..f555bfc 100644 --- a/tests/test_llm.py +++ b/tests/test_llm.py @@ -3,6 +3,7 @@ import os from unittest import mock +import instructor import pytest os.environ["HATE_CRACK_SKIP_INIT"] = "1" @@ -25,7 +26,7 @@ def _patch_agent(candidates): agent_cls.__getitem__.return_value.return_value = agent_instance return ( - mock.patch("hate_crack.llm.instructor"), + mock.patch("hate_crack.llm.instructor.from_openai", return_value=mock.MagicMock(spec=instructor.Instructor)), mock.patch("hate_crack.llm.OpenAI"), mock.patch("hate_crack.llm.AtomicAgent", agent_cls), agent_cls,