Initial video AI analysis project
This commit is contained in:
85
tests/test_vlm_client.py
Normal file
85
tests/test_vlm_client.py
Normal file
@@ -0,0 +1,85 @@
|
||||
import base64
|
||||
import json
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from video_ai_analysis_poc.vlm_client import infer_clip
|
||||
|
||||
|
||||
class VlmClientTests(unittest.TestCase):
|
||||
def test_infer_clip_uses_config_prompt_url_and_data_uri_images(self):
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
output_dir = Path(tmp)
|
||||
frame_path = output_dir / "frames" / "video-abc" / "000001.jpg"
|
||||
frame_path.parent.mkdir(parents=True)
|
||||
frame_path.write_bytes(b"jpg-bytes")
|
||||
calls = []
|
||||
|
||||
def http_post(url, payload, timeout_seconds):
|
||||
calls.append((url, payload, timeout_seconds))
|
||||
return {
|
||||
"status": 200,
|
||||
"body": {
|
||||
"choices": [
|
||||
{
|
||||
"message": {
|
||||
"content": json.dumps(
|
||||
{"screen_time": "10:00:01", "events": []}
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
}
|
||||
|
||||
result = infer_clip(
|
||||
{
|
||||
"clip_id": "video-abc_c000001",
|
||||
"frame_times": [
|
||||
{
|
||||
"frame_path": "frames/video-abc/000001.jpg",
|
||||
"offset_seconds": 0.0,
|
||||
"timecode": "00:00:00",
|
||||
}
|
||||
],
|
||||
},
|
||||
output_dir,
|
||||
{
|
||||
"api_base_url": "http://localhost:8679/",
|
||||
"chat_completions_path": "/v1/chat/completions",
|
||||
"model": "memai-zhengxin-v3-20260413",
|
||||
"timeout_seconds": 17,
|
||||
"max_tokens": 256,
|
||||
"temperature": 0,
|
||||
"image_transport": "data_uri",
|
||||
},
|
||||
{
|
||||
"system": "system prompt from config",
|
||||
"user": "user prompt from config",
|
||||
},
|
||||
http_post=http_post,
|
||||
)
|
||||
|
||||
self.assertEqual(result["raw_response"], '{"screen_time": "10:00:01", "events": []}')
|
||||
self.assertEqual(len(calls), 1)
|
||||
url, payload, timeout_seconds = calls[0]
|
||||
self.assertEqual(url, "http://localhost:8679/v1/chat/completions")
|
||||
self.assertEqual(timeout_seconds, 17)
|
||||
self.assertEqual(payload["model"], "memai-zhengxin-v3-20260413")
|
||||
self.assertEqual(payload["messages"][0]["role"], "system")
|
||||
self.assertEqual(payload["messages"][0]["content"], "system prompt from config")
|
||||
user_content = payload["messages"][1]["content"]
|
||||
self.assertEqual(user_content[0], {"type": "text", "text": "user prompt from config"})
|
||||
self.assertEqual(user_content[1]["type"], "image_url")
|
||||
expected_data = base64.b64encode(b"jpg-bytes").decode("ascii")
|
||||
self.assertEqual(
|
||||
user_content[1]["image_url"]["url"],
|
||||
f"data:image/jpeg;base64,{expected_data}",
|
||||
)
|
||||
self.assertEqual(result["http_status"], 200)
|
||||
self.assertIsInstance(result["latency_ms"], int)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user