Try to improve prompt adherence for low variety image models
Build and Push Container / build-and-push (push) Successful in 1m5s

This commit is contained in:
2026-08-17 13:42:05 -04:00
parent 7f0c5fbd80
commit 16407dd7c8
3 changed files with 138 additions and 5 deletions
+61
View File
@@ -1030,6 +1030,10 @@ def test_image_prompt_system_prompt_covers_key_details() -> None:
assert "style" in lowered
assert "canada goose" in lowered
assert "only the image generation prompt" in lowered
assert "exactly as written" in lowered
assert "fountain pen wearing pants" in lowered
assert "centaur" in lowered
assert "not a person riding a horse" in lowered
def test_doodlebob_prompt_rewrite_uses_detailed_system_prompt(
@@ -1046,6 +1050,7 @@ def test_doodlebob_prompt_rewrite_uses_detailed_system_prompt(
mock_llama_wrapper.chat_completion_instruct.side_effect = [
"landscape", # layout selection
"a very detailed prompt", # prompt rewrite
"PASS", # prompt verification
]
mock_llama_wrapper.image_generation.return_value = "aW1hZ2U="
mock_database.get_image_generation_time_estimate.return_value = None
@@ -1064,6 +1069,55 @@ def test_doodlebob_prompt_rewrite_uses_detailed_system_prompt(
)
def test_verify_image_prompt_passes_unchanged(
mock_llama_wrapper: MagicMock,
) -> None:
"""A PASS verdict keeps the original prompt and sends both inputs."""
import vibe_bot.main as main_module
mock_llama_wrapper.chat_completion_instruct.return_value = "PASS"
result = main_module.verify_image_prompt("a centaur", "a detailed prompt")
assert result == "a detailed prompt"
call = mock_llama_wrapper.chat_completion_instruct.call_args
assert call.kwargs["system_prompt"] == main_module.IMAGE_PROMPT_VERIFY_SYSTEM_PROMPT
assert "a centaur" in call.kwargs["user_prompt"]
assert "a detailed prompt" in call.kwargs["user_prompt"]
def test_verify_image_prompt_case_insensitive_pass(
mock_llama_wrapper: MagicMock,
) -> None:
"""A lower-case, punctuated 'pass' verdict also keeps the original."""
import vibe_bot.main as main_module
mock_llama_wrapper.chat_completion_instruct.return_value = "pass."
assert main_module.verify_image_prompt("a centaur", "p") == "p"
def test_verify_image_prompt_correction_replaces_prompt(
mock_llama_wrapper: MagicMock,
) -> None:
"""A non-PASS response is used as the corrected prompt."""
import vibe_bot.main as main_module
corrected = (
"one fused creature, a human torso joined to a horse's front half, "
"human arms raised, standing in a rocky field"
)
mock_llama_wrapper.chat_completion_instruct.return_value = corrected
assert main_module.verify_image_prompt("a centaur", "a horse") == corrected
def test_verify_image_prompt_empty_falls_back(
mock_llama_wrapper: MagicMock,
) -> None:
"""An empty verification response falls back to the drafted prompt."""
import vibe_bot.main as main_module
mock_llama_wrapper.chat_completion_instruct.return_value = ""
assert main_module.verify_image_prompt("a centaur", "drafted") == "drafted"
def test_doodlebob_selects_portrait(
mock_ctx: MagicMock,
mock_llama_wrapper: MagicMock,
@@ -1078,6 +1132,7 @@ def test_doodlebob_selects_portrait(
mock_llama_wrapper.chat_completion_instruct.side_effect = [
"portrait", # layout selection
"a tall portrait of a lighthouse", # prompt rewrite
"PASS", # prompt verification
]
mock_llama_wrapper.image_generation.return_value = "aW1hZ2U="
mock_database.get_image_generation_time_estimate.return_value = None
@@ -1113,6 +1168,7 @@ def test_doodlebob_selects_landscape(
mock_llama_wrapper.chat_completion_instruct.side_effect = [
"landscape",
"a wide panoramic coastline",
"PASS", # prompt verification
]
mock_llama_wrapper.image_generation.return_value = "aW1hZ2U="
mock_database.get_image_generation_time_estimate.return_value = None
@@ -1137,6 +1193,7 @@ def test_doodlebob_malformed_layout_defaults_square(
mock_llama_wrapper.chat_completion_instruct.side_effect = [
"banana", # malformed layout
"a balanced composition",
"PASS", # prompt verification
]
mock_llama_wrapper.image_generation.return_value = "aW1hZ2U="
mock_database.get_image_generation_time_estimate.return_value = None
@@ -1163,6 +1220,7 @@ def test_doodlebob_empty_layout_defaults_square(
mock_llama_wrapper.chat_completion_instruct.side_effect = [
"", # empty layout response
"a balanced composition",
"PASS", # prompt verification
]
mock_llama_wrapper.image_generation.return_value = "aW1hZ2U="
mock_database.get_image_generation_time_estimate.return_value = None
@@ -1188,6 +1246,7 @@ def test_doodlebob_reports_estimate_and_elapsed(
mock_llama_wrapper.chat_completion_instruct.side_effect = [
"square",
"a test scene",
"PASS", # prompt verification
]
mock_llama_wrapper.image_generation.return_value = "aW1hZ2U="
mock_database.get_image_generation_time_estimate.return_value = 12.34
@@ -1220,6 +1279,7 @@ def test_doodlebob_no_estimate_without_history(
mock_llama_wrapper.chat_completion_instruct.side_effect = [
"square",
"a test scene",
"PASS", # prompt verification
]
mock_llama_wrapper.image_generation.return_value = "aW1hZ2U="
mock_database.get_image_generation_time_estimate.return_value = None
@@ -1247,6 +1307,7 @@ def test_doodlebob_failed_generation_not_recorded(
mock_llama_wrapper.chat_completion_instruct.side_effect = [
"square",
"a test scene",
"PASS", # prompt verification
]
mock_llama_wrapper.image_generation.return_value = ""
mock_database.get_image_generation_time_estimate.return_value = 8.0