mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-05-07 05:02:40 +08:00
121 lines
4.5 KiB
Python
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")
|