Files
MoviePilot/tests/test_openai_utils.py
2026-04-22 17:21:43 +08:00

121 lines
4.5 KiB
Python

from unittest import TestCase
from app.api.openai_utils import (
build_anthropic_messages,
build_completion_payload,
build_prompt,
build_responses_input,
build_session_id,
extract_text_and_images,
)
class OpenAIUtilsTest(TestCase):
def test_extract_text_and_images(self):
text, images = extract_text_and_images(
[
{"type": "text", "text": "你好"},
{"type": "image_url", "image_url": {"url": "https://example.com/a.png"}},
{"type": "text", "text": "世界"},
]
)
self.assertEqual(text, "你好\n世界")
self.assertEqual(images, ["https://example.com/a.png"])
def test_extract_text_and_images_with_input_image_and_base64_image(self):
text, images = extract_text_and_images(
[
{"type": "input_text", "text": "看图"},
{"type": "input_image", "image_url": "https://example.com/b.png"},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": "YWJj",
},
},
]
)
self.assertEqual(text, "看图")
self.assertEqual(
images,
["https://example.com/b.png", "data:image/png;base64,YWJj"],
)
def test_build_prompt_without_server_session_keeps_recent_history(self):
prompt, images = build_prompt(
[
{"role": "system", "content": "回答简短"},
{"role": "user", "content": "第一句"},
{"role": "assistant", "content": "第一答"},
{"role": "user", "content": "第二句"},
],
use_server_session=False,
)
self.assertIn("系统要求:\n回答简短", prompt)
self.assertIn("对话上下文:\nuser: 第一句\nassistant: 第一答", prompt)
self.assertIn("当前用户消息:\n第二句", prompt)
self.assertEqual(images, [])
def test_build_prompt_with_server_session_ignores_history_block(self):
prompt, _ = build_prompt(
[
{"role": "user", "content": "历史问题"},
{"role": "assistant", "content": "历史回答"},
{"role": "user", "content": "当前问题"},
],
use_server_session=True,
)
self.assertNotIn("对话上下文:", prompt)
self.assertIn("当前用户消息:\n当前问题", prompt)
def test_build_prompt_accepts_image_only_user_message(self):
prompt, images = build_prompt(
[
{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": "https://example.com/a.png"}}
],
}
],
use_server_session=True,
)
self.assertIn("请结合图片内容回复", prompt)
self.assertEqual(images, ["https://example.com/a.png"])
def test_build_session_id_is_stable(self):
session_id = build_session_id("user-1", "openai:")
self.assertTrue(session_id.startswith("openai:"))
self.assertEqual(session_id, build_session_id("user-1", "openai:"))
self.assertNotEqual(session_id, build_session_id("user-2", "openai:"))
def test_build_completion_payload(self):
payload = build_completion_payload("你好", "moviepilot-agent")
self.assertEqual(payload["model"], "moviepilot-agent")
self.assertEqual(payload["choices"][0]["message"]["content"], "你好")
self.assertEqual(payload["choices"][0]["finish_reason"], "stop")
def test_build_responses_input(self):
messages = build_responses_input(
[
{
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": "你好"}],
}
],
instructions="你要简短回答",
)
self.assertEqual(messages[0]["role"], "system")
self.assertEqual(messages[1]["role"], "user")
def test_build_anthropic_messages(self):
messages = build_anthropic_messages(
system=[{"type": "text", "text": "你是助手"}],
messages=[{"role": "user", "content": "你好"}],
)
self.assertEqual(messages[0]["role"], "system")
self.assertEqual(messages[1]["role"], "user")