标题是「一次请求·纯提示词·生成多条」,需经中转站转发 + 大模型排队 + 整段返回,比一张图更耗时。原借 1K 档 240 秒读取超时,慢/排队型模型常在 返回前 ReadTimeout。改为借 4K 档 600 秒(resolution_timeout 512/1K/2K/4K → 180/240/360/600s),仅改标题链路,不动 generate_texts 默认 1K;模型条目 timeout_seconds>0 仍优先覆盖。 - ai_title.py:加常量 _TITLE_TIMEOUT_RESOLUTION="4K",generate_titles 显式传 resolution 借 600s - docs/11 §17.2 补读取超时说明、新增 §17.8 决策 - tests/test_ai_title:断言以 resolution="4K" 调 generate_texts - tasks.md:新增 §19.30;同时含 match_stamp §19.30–§19.34 任务段的移除 (用户回退 match_stamp 功能,本提交仅移除其 tasks.md 段落) 验证:test_ai_title / test_ai_text_service + 全套 py37(232 测试)通过, 唯一失败为无关的 test_config_service packaging 模板;离屏冒烟确认读取超时 =600s、timeout_seconds>0 优先覆盖。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
2.0 KiB
Python
57 lines
2.0 KiB
Python
"""Tests for AI title batch generation core (docs/11 §17.1 / §17.7)."""
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
|
|
|
|
|
|
class TestAiTitleCore(unittest.TestCase):
|
|
def test_generate_titles_one_request_returns_list(self):
|
|
from core.ai_title import generate_titles
|
|
|
|
client = _RecordingTextClient(["纯棉短袖T恤", "印花连衣裙", "碎花雪纺衫"])
|
|
titles = generate_titles("生成 3 条标题", model_config={}, api_client=client)
|
|
|
|
self.assertEqual(titles, ["纯棉短袖T恤", "印花连衣裙", "碎花雪纺衫"])
|
|
self.assertEqual(client.calls, 1) # 只请求一次
|
|
self.assertEqual(client.image_paths, [None]) # 纯文本,不传图
|
|
|
|
def test_generate_titles_uses_4k_read_timeout(self):
|
|
# §19.30/§17.8:标题生成借 4K 档(600s 读取超时),不用默认 1K 的 240s
|
|
from core.ai_title import _TITLE_TIMEOUT_RESOLUTION, generate_titles
|
|
|
|
self.assertEqual(_TITLE_TIMEOUT_RESOLUTION, "4K")
|
|
client = _RecordingTextClient(["a", "b"])
|
|
generate_titles("生成 2 条标题", model_config={}, api_client=client)
|
|
self.assertEqual(client.resolutions, ["4K"])
|
|
|
|
def test_generate_titles_propagates_client_error(self):
|
|
from core.ai_title import generate_titles
|
|
|
|
with self.assertRaises(RuntimeError):
|
|
generate_titles("x", model_config={}, api_client=_FailingTextClient())
|
|
|
|
|
|
class _RecordingTextClient:
|
|
def __init__(self, titles):
|
|
self._titles = titles
|
|
self.calls = 0
|
|
self.image_paths = []
|
|
self.resolutions = []
|
|
|
|
def generate_texts(self, prompt, image_path=None, resolution="1K"):
|
|
self.calls += 1
|
|
self.image_paths.append(image_path)
|
|
self.resolutions.append(resolution)
|
|
return list(self._titles)
|
|
|
|
|
|
class _FailingTextClient:
|
|
def generate_texts(self, prompt, image_path=None, resolution="1K"):
|
|
raise RuntimeError("boom")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|