mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-07 22:23:48 +08:00
feat: add ai-compatible API endpoints
This commit is contained in:
120
tests/test_openai_utils.py
Normal file
120
tests/test_openai_utils.py
Normal file
@@ -0,0 +1,120 @@
|
||||
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")
|
||||
Reference in New Issue
Block a user