from pathlib import Path import pytest from encoding_dsv4 import ( IMAGE_PLACEHOLDER, encode_messages, load_cases, parse_tagged_text, ) def test_plain_text_prompt_is_unchanged(): prompt = encode_messages( [{"role": "user", "content": "hello"}], thinking_mode="chat", ) assert prompt == ( "<|begin▁of▁sentence|><|User|>hello" "<|Assistant|>" ) def test_multiturn_text_prompt_is_unchanged(): prompt = encode_messages( [ {"role": "system", "content": "sys"}, {"role": "user", "content": "q1"}, {"role": "assistant", "content": "a1"}, {"role": "user", "content": "q2"}, ], thinking_mode="chat", ) assert prompt == ( "<|begin▁of▁sentence|>sys<|User|>q1<|Assistant|>" "a1<|end▁of▁sentence|><|User|>q2<|Assistant|>" ) def test_top_level_image_block_returns_matching_placeholder_and_record(): messages = [{ "role": "user", "content": [ {"type": "image_url", "image_url": {"url": "images/image_1.jpeg"}}, {"type": "text", "text": "describe"}, ], }] prompt, media = encode_messages( messages, thinking_mode="chat", return_multi_modal_data=True, ) assert prompt == ( "<|begin▁of▁sentence|><|User|><|deepseek_image|>\n\n" "describe<|Assistant|>" ) assert prompt.count(IMAGE_PLACEHOLDER) == len(media["images"]) == 1 assert media["images"][0]["url"] == "images/image_1.jpeg" def test_tagged_text_matches_standard_image_content_blocks(): tagged_content = parse_tagged_text( "beforeimages/image_1.jpegafter" ) standard_content = [ {"type": "text", "text": "before"}, {"type": "image_url", "image_url": {"url": "images/image_1.jpeg"}}, {"type": "text", "text": "after"}, ] tagged = encode_messages( [{"role": "user", "content": tagged_content}], thinking_mode="chat", return_multi_modal_data=True, ) standard = encode_messages( [{"role": "user", "content": standard_content}], thinking_mode="chat", return_multi_modal_data=True, ) assert tagged == standard def test_tagged_text_preserves_multiple_image_order(): content = parse_tagged_text( "first.pngmiddlesecond.png" ) prompt, media = encode_messages( [{"role": "user", "content": content}], thinking_mode="chat", return_multi_modal_data=True, ) assert prompt.count(IMAGE_PLACEHOLDER) == 2 assert [image["url"] for image in media["images"]] == [ "first.png", "second.png", ] def test_txt_and_json_examples_encode_identically(): root = Path(__file__).parent.parent examples = root / "inference" / "examples" text = (examples / "example_vl.txt").read_text().rstrip("\n") json_case = load_cases(str(examples / "example_vl_harmony.json"))[0] txt_encoded = encode_messages( [{"role": "user", "content": parse_tagged_text(text)}], thinking_mode="chat", return_multi_modal_data=True, ) json_encoded = encode_messages( json_case["messages"], thinking_mode="chat", return_multi_modal_data=True, ) assert txt_encoded == json_encoded prompt, media = txt_encoded assert prompt.count(IMAGE_PLACEHOLDER) == 2 assert [image["url"] for image in media["images"]] == [ "examples/images/carrots.jpeg", "examples/images/corn.jpeg", ] def test_malformed_tagged_text_is_rejected(): with pytest.raises(ValueError, match="Malformed"): parse_tagged_text("missing end tag") def test_nested_tool_result_preserves_image_placeholder(): messages = [{ "role": "user", "content": [{ "type": "tool_result", "tool_use_id": "call-1", "content": [ {"type": "image_url", "image_url": {"url": "images/image_1.jpeg"}}, {"type": "text", "text": "nested"}, ], }], }] prompt, media = encode_messages( messages, thinking_mode="chat", return_multi_modal_data=True, ) assert "<|deepseek_image|>\n\nnested" in prompt assert prompt.count(IMAGE_PLACEHOLDER) == len(media["images"]) == 1 def test_tool_role_with_image_blocks_preserves_placeholder(): messages = [ { "role": "assistant", "content": "", "tool_calls": [{ "id": "call-1", "type": "function", "function": {"name": "inspect", "arguments": "{}"}, }], }, { "role": "tool", "tool_call_id": "call-1", "content": [ {"type": "image_url", "image_url": {"url": "images/image_1.jpeg"}}, {"type": "text", "text": "tool image"}, ], }, ] prompt, media = encode_messages( messages, thinking_mode="chat", return_multi_modal_data=True, ) assert "<|deepseek_image|>\n\ntool image" in prompt assert prompt.count(IMAGE_PLACEHOLDER) == len(media["images"]) == 1 def test_context_images_are_not_returned_as_current_media(): context = [{ "role": "user", "content": [ {"type": "image_url", "image_url": {"url": "images/image_1.jpeg"}}, {"type": "text", "text": "previous"}, ], }] prompt, media = encode_messages( [{"role": "user", "content": "now"}], thinking_mode="chat", context=context, return_multi_modal_data=True, ) assert IMAGE_PLACEHOLDER not in prompt assert media == {"images": []} def test_user_supplied_placeholder_is_rejected(): with pytest.raises(ValueError, match="image special token"): encode_messages( [{"role": "user", "content": IMAGE_PLACEHOLDER}], thinking_mode="chat", ) def test_image_block_without_source_is_rejected(): with pytest.raises(ValueError, match="valid source"): encode_messages( [{ "role": "user", "content": [{"type": "image_url", "image_url": {}}], }], thinking_mode="chat", return_multi_modal_data=True, )