62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
"""look_at_image 的问题收敛与兼容兜底测试(不碰网络和数据库)。"""
|
|
from __future__ import annotations
|
|
|
|
import unittest
|
|
import uuid
|
|
from pathlib import Path
|
|
from unittest import mock
|
|
|
|
from core.ark_client import ArkConfig
|
|
from tools.look_at_image import LookAtImageTool, _DEFAULT_QUESTION
|
|
|
|
|
|
class LookAtImageQuestionTests(unittest.TestCase):
|
|
def _tool(self) -> LookAtImageTool:
|
|
return LookAtImageTool(
|
|
ark_cfg=ArkConfig(api_key="test", base_url="https://example.invalid", raw={}),
|
|
vision_variant_cfg={
|
|
"model_id": "vision-test",
|
|
"request_timeout_s": 1,
|
|
"timeout_retries": 0,
|
|
},
|
|
variant_key="test",
|
|
working_dir=Path("."),
|
|
task_id=uuid.uuid4(),
|
|
user_id=uuid.uuid4(),
|
|
base_dir=Path("."),
|
|
user_root=Path("."),
|
|
)
|
|
|
|
def _execute_and_question(self, question=None) -> str:
|
|
captured = {}
|
|
|
|
def fake_chat(_cfg, _endpoint, body, **_kwargs):
|
|
captured["question"] = body["messages"][0]["content"][0]["text"]
|
|
return {
|
|
"choices": [{"finish_reason": "stop", "message": {"content": "ok"}}],
|
|
"usage": {},
|
|
}, ""
|
|
|
|
with mock.patch(
|
|
"tools.look_at_image.load_image_as_data_url",
|
|
return_value=("data:image/png;base64,AA==", "image.png", ""),
|
|
), mock.patch("tools.look_at_image.ark_chat_with_retry", side_effect=fake_chat), \
|
|
mock.patch("tools.look_at_image.record_usage_safe", return_value=0):
|
|
self._tool().execute("image.png", question=question)
|
|
return captured["question"]
|
|
|
|
def test_specific_question_is_forwarded_unchanged(self):
|
|
question = "只读出仪表盘当前数值,不要描述其他内容。"
|
|
self.assertEqual(self._execute_and_question(question), question)
|
|
|
|
def test_missing_question_uses_concise_compatibility_fallback(self):
|
|
self.assertEqual(self._execute_and_question(), _DEFAULT_QUESTION)
|
|
self.assertIn("简洁", _DEFAULT_QUESTION)
|
|
self.assertIn("不要主动全文 OCR", _DEFAULT_QUESTION)
|
|
self.assertNotIn("完整描述画面内容", _DEFAULT_QUESTION)
|
|
self.assertNotIn("把其中的数据、坐标轴、图例", _DEFAULT_QUESTION)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|