This commit is contained in:
2026-07-03 14:34:33 +08:00
commit c153853ca8
18 changed files with 7036 additions and 0 deletions

0
scenarios/__init__.py Normal file
View File

390
scenarios/tc_generator.py Normal file
View File

@@ -0,0 +1,390 @@
import re
import sys
import json
from pathlib import Path
from typing import Callable, Any
import pytest
import yaml
from glrocky.core.logger import logger
from glrocky.framework.marks import Marks as M
from glrocky.framework.schemas import Device
from glrocky.services.dify.dify import run_workflow
from loguru._logger import Logger
from pydantic import BaseModel, ConfigDict, Field, field_serializer
import socket
def _get_local_ip() -> str:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip: str = s.getsockname()[0]
s.close()
return str(ip)
PRODUCTION_EXECUTOR = "192.168.0.139"
IS_PRODUCTION = _get_local_ip() == PRODUCTION_EXECUTOR
class MetricManager:
def __init__(self, metric):
self.metric = metric
def new_span(self, m_type: str = "default", m_id: str = "default", m_iter: int = 1):
self.metric.span(m_type, m_id, m_iter)
def _smart_name_label(self, name: str, label: str | None) -> tuple[str, str]:
"""retruns: (name,label)"""
if not name:
raise ValueError()
if not name.strip():
raise ValueError("Empty name")
if label:
return name, label
for sep in ("|", ":"):
if sep in name:
_n, _l = name.split(sep, maxsplit=1)
return (_n, _l)
return name, name
def add_text_metric(self, name: str, value: str, label: str | None = None):
_n, _l = self._smart_name_label(name, label)
self.metric.add(
name=_n,
label=_l,
value=value,
type="text",
)
def add_number_metric(self, name: str, value: float, label: str | None = None):
_n, _l = self._smart_name_label(name, label)
self.metric.add(
name=_n,
label=_l,
value=value,
type="number",
)
def add_image_metric(self, name: str, value: Path | str, label: str | None = None):
_n, _l = self._smart_name_label(name, label)
self.metric.add(
name=_n,
label=_l,
value=str(value),
type="image",
)
def add_video_metric(self, name: str, value: Path | str, label: str | None = None):
_n, _l = self._smart_name_label(name, label)
self.metric.add(
name=_n,
label=_l,
value=value,
type="video",
)
def send(self):
self.metric.send_all()
def from_dict(self, the_dict: dict[str, Any]):
if not the_dict:
raise ValueError("dict is null")
for _k, v in the_dict.items():
k = {
"result": "result|结果", # True ,False
"_dify_result": "_dify_result|业务完成", # True ,False
"_dify_message": "_dify_message|业务错误信息", # string,None
"resultText": "resultText|文本结果",
"recordVideo": "recordVideo|录像",
"recordAudio": "recordAudio|录音",
"screenshotList": "screenshotList|截图",
"firstToken": "firstToken|首字符时长",
"timeSeries":"timeSeries|时间序列",
"fileList":"fileList|文件"
}.get(_k, _k)
logger.info(k)
if v is None:
self.add_text_metric(name=k, value="")
elif isinstance(v, (int, float)):
self.add_number_metric(name=k, value=v)
elif isinstance(v, str):
self.add_text_metric(name=k, value=v)
elif isinstance(v, Path):
if v.suffix.lower() in (".jpg", ".png", ".gif", ".bmp"):
self.add_image_metric(name=k, value=str(v.resolve()))
elif v.suffix.lower() in (".mp4", ".mkv"):
self.add_video_metric(name=k, value=str(v.resolve()))
else:
self.add_text_metric(name=k, value=str(v.resolve()))
else:
raise NotImplementedError(f"{type(v)} not supported")
class DifySettings(BaseModel):
difyUrl: str = Field(
title="Dify服务地址",
)
difyWorkflowId: str = Field(
title="Dify工作流ID",
)
difyApiKey: str = Field(
title="Dify API密钥",
)
class MaterialForDify(BaseModel):
paramGroupUuid: list[str] = Field(default=[], title="UUID", description="UUID")
inputTextList: list[str] = Field(
default=[], title="对话列表,支持多轮对话", description="对话列表,支持多轮对话"
)
prompt: list[str] = Field(default=[], title="提示词", description="提示词")
model_config = ConfigDict(arbitrary_types_allowed=True) # allows uuid extra...
def pre_process_material(input:list[str])->str:
assert isinstance(input,list)
if not input:
return json.dumps([],ensure_ascii=False)
result=[]
p=re.compile(r"Q\d+\s*[:\.]+\s*",flags=re.MULTILINE)
for text in input:
splited=re.split(p,text,maxsplit=50)
for part in splited:
if not part.strip():
continue
result.append(part.strip())
return json.dumps(result, ensure_ascii=False)
class DifyPayload(BaseModel):
inputTextList: list[str] | str
prompt: list[str] | str
deviceId: str
address: str
caseId:str # 用例名称,当前运行的用例编号
appName: str | None = None
@field_serializer("inputTextList")
def serialize_input_text(self, value: list[str] | str) -> str:
if isinstance(value, list):
return pre_process_material(value)
return value
@field_serializer("prompt")
def serialize_prompt_as_single_str(self, value: list[str] | str) -> str:
if isinstance(value, list):
return value[0] if len(value) > 0 else ""
return value
def call_dify(
case_meta_info:dict[str,str],
logger: Logger,
device_info: Device,
material: list[MaterialForDify],
dify_cfg: DifySettings,
metric,
material_reporter,
app_name: str | None = None,
):
# logger.info(device_info.device_serial)
logger.info(dify_cfg)
event_callbacks: dict[str, Callable[..., None]] = {}
def on_node_started(c, n, d: dict[str, Any]):
logger.info(f"开始执行:{d.get('title', '')}")
logger.info(f"输入节点参数:{d.get('inputs')}")
def on_node_finished(c, n, d):
logger.info(f"结束执行:{d.get('title', '')}")
logger.info(f"节点输出:{d.get('outputs')}")
event_callbacks["on_node_started"] = on_node_started
event_callbacks["on_node_finished"] = on_node_finished
if not material or len(material) < 1:
raise RuntimeError("缺少素材")
else:
logger.info(f"下发素材:{material}")
mm = MetricManager(metric)
for material_index, item in enumerate(material, 1):
paramGroupUuid = item.paramGroupUuid[0]
assert paramGroupUuid, "The param Group Uuid Value must be set."
material_reporter.begin(paramGroupUuid)
dify_final_status = False
try:
# IMPORTANT: the group uuid for params
payload = DifyPayload(
**item.model_dump(),
deviceId=device_info.device_serial,
address=_get_local_ip(),
caseId=case_meta_info.get('id','Unkown'),
appName=app_name,
)
logger.info(f"payload send to dify:\n{payload.model_dump_json()}\n")
mm.new_span("default", f"default-{material_index}", material_index)
result = run_workflow(
api_key=dify_cfg.difyApiKey,
base_url=dify_cfg.difyUrl,
workflow_id=dify_cfg.difyWorkflowId,
inputs=payload.model_dump(),
event_callbacks=event_callbacks,
)
logger.info(f"工作流返回结果:{result.outputs}")
logger.info(f"工作流最终状态:{result.success}")
if result.outputs and len(result.outputs):
logger.info("提交结果到执行器")
mm.from_dict(result.outputs)
metric.send_all()
logger.info("提交结果到执行器完成")
else:
logger.warning("dify 工作流无返回")
if not result.success:
logger.error(f"工作流执行失败:{result.error}")
dify_final_status = result.success
except Exception as e:
logger.error(e)
dify_final_status = False
continue # do not break next round
finally:
material_reporter.end_with(paramGroupUuid, dify_final_status)
def make_dify_test(
case_meta: dict[str, str],
apps_config: dict[str, DifySettings] | None = None,
) -> Callable[..., None]:
@M.meta(**case_meta)
def _func(
logger: Logger,
device_info: Device,
material: list[MaterialForDify],
metric,
material_reporter,
meta,
) -> None:
dify_settings = apps_config.get(meta.app_name) if apps_config else None
call_dify(
case_meta,
logger,
device_info,
material,
dify_cfg=dify_settings,
metric=metric,
material_reporter=material_reporter,
app_name=meta.app_name,
)
return _func
def make_skip_test(meta: dict[str, str]) -> Callable[..., None]:
@M.skip(reason=f"{meta['id']} 未实现")
@M.meta(**meta)
def _func(
logger: Logger,
device_info: Device,
material: list[MaterialForDify],
metric,
) -> None:
logger.error(f"此用例在手机{device_info.device_serial}上暂未实现")
assert False, "not implemented"
return _func
def generate_cases_from_yaml(module_name: str, yaml_path: Path):
if not yaml_path.exists():
logger.warning(f"Test case definition file not found: {yaml_path}")
return
with open(file=yaml_path, mode="r", encoding="utf-8") as f:
all_cases: list[dict[str, Any]] = yaml.safe_load( # pyright: ignore[reportAny]
f
)
if not all_cases:
return
for case_info in all_cases["cases"]:
if not isinstance(case_info, dict):
logger.debug(f"Skipping non-dictionary item in YAML file: {case_info}")
continue
case_id: str = case_info.get("id",'')
if not case_id:
logger.warning(f"用例 缺少 case_id 字段。{case_info=}")
pytest.fail(f"用例 缺少 case_id 字段。{case_info=}")
description: str = case_info.get("description",'')
if not description:
logger.warning(f"用例{case_id} 缺少 description 字段。")
pytest.fail(f"用例{case_id} 缺少 description 字段。")
action: str = case_info.get("action", "skipped")
meta = {"id": case_id, "description": description, "appNames": ["agent"]}
fn_name = f"test_{case_id.lower().replace('-', '_')}"
if action == "dify":
apps_config: dict[str, DifySettings] = {}
if apps_list := case_info.get("apps"):
app_names = []
for app_entry in apps_list:
name = app_entry.get("name", "")
app_names.append(name)
if cfg_block := app_entry.get("dify_config"):
env_key = "production" if IS_PRODUCTION else "testing"
if env_cfg := cfg_block.get(env_key):
apps_config[name] = DifySettings(
difyUrl=env_cfg.get("url"),
difyWorkflowId=env_cfg.get("workflow_id"),
difyApiKey=env_cfg.get("api_key"),
)
meta["appNames"] = app_names
elif cfg_block := case_info.get("dify_config"):
env_key = "production" if IS_PRODUCTION else "testing"
if env_cfg := cfg_block.get(env_key):
apps_config["agent"] = DifySettings(
difyUrl=env_cfg.get("url"),
difyWorkflowId=env_cfg.get("workflow_id"),
difyApiKey=env_cfg.get("api_key"),
)
meta["appNames"] = ["agent"]
fn = make_dify_test(meta, apps_config or None)
elif action == "skipped":
fn = make_skip_test(meta)
elif action == "custom":
logger.info(f"Case {case_id} is a custom test.")
continue
else:
logger.warning(f"Unknown action '{action}' for case {case_id}. Skipping.")
continue
setattr(sys.modules[module_name], fn_name, fn)
logger.info(f"Generated {fn_name} for {case_id} with action '{action}'")
# class TC_CUSTOME_CONFIG(BaseModel):
# phoneNumber: str = Field(
# default="15338070617", title="拨号电话", description="待测机的手机号码"
# )
# @M.meta(id="TC-9991")
# def tc_9991(cfg:TC_CUSTOME_CONFIG):
# ...
# class TC_CUSTOME_CONFIG2(BaseModel):
# phoneNumber: str = Field(
# default="15338070617", title="拨号电话", description="待测机的手机号码"
# )
# phoneNumber2: str = Field(
# default="15338070617", title="拨号电话", description="待测机的手机号码"
# )
# def tc_9992(cfg:TC_CUSTOME_CONFIG2):
# ...
YAML_FILE = Path(__file__).parent / "test_cases.yaml"
generate_cases_from_yaml(__name__, YAML_FILE)

981
scenarios/test_cases.yaml Normal file
View File

@@ -0,0 +1,981 @@
dify_templates:
tianjin_dify_config: &testing_config
url: "http://192.168.0.213:8090/v1"
workflow_id: "b054aa56-fc1f-4770-9969-edb731831e73"
api_key: "app-0ukQIPzRCuaXv4UaBUTFGhVF"
guangzhou_dify_config: &production_config
url: "http://192.168.0.140:8090/v1"
workflow_id: "4b0f55c0-348b-4c51-a536-ce2c95d122bf"
api_key: "app-ByiOi9gp9WA2ejFgkUy8VR1n"
cases:
- id: TC-0101-audio
description: AI代接
category: AI社交.语音交流
action: skipped
- id: TC-0102-audio
description: 通话实时翻译
category: AI社交.语音交流
action: skipped
- id: TC-0103-audio
description: 通话摘要
category: AI社交.语音交流
action: skipped
- id: TC-0104-txt
description: 文本通话
category: AI社交.语音交流
action: skipped
- id: TC-0105-audio
description: AI通话降噪
category: AI社交.语音交流
action: skipped
- id: TC-0106-audio
description: AI隐私保护防漏音
category: AI社交.语音交流
action: skipped
- id: TC-0107-audio
description: 对话翻译
category: AI社交.语音交流
action: skipped
- id: TC-0108-audio
description: 面对面同声传译
category: AI社交.语音交流
action: skipped
- id: TC-0109-txt
description: AI短信
category: AI社交.短信
action: skipped
- id: TC-0110-txt
description: AR虚拟表情
category: AI社交.短信
action: skipped
- id: TC-0110-img
description: AR虚拟表情
category: AI社交.短信
action: skipped
- id: TC-0111-video
description: 视频电话AI鉴伪
category: AI社交.社交应用
action: skipped
- id: TC-0112-doc
description: 语音快传
category: AI社交.语音快传
action: skipped
- id: TC-0112-img
description: 语音快传
category: AI社交.语音快传
action: skipped
- id: TC-0113-txt
description: 社交应用内翻译
category: AI社交.跨语言沟通
action: skipped
- id: TC-0201-img
description: 日程管理
category: AI办公.日程管理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0201-audio
description: 日程管理
category: AI办公.日程管理
action: skipped
- id: TC-0202-audio
description: 语音转写
category: AI办公.会议助手
action: skipped
- id: TC-0202-video
description: 语音转写
category: AI办公.会议助手
action: skipped
- id: TC-0203-doc
description: 智能纪要
category: AI办公.会议助手
action: skipped
- id: TC-0204-txt
description: 文稿创作
category: AI办公.工作文稿处理
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0204-img
description: 文稿创作
category: AI办公.工作文稿处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0205-txt
description: 文稿润色-文本
category: AI办公.工作文稿处理
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0205-doc
description: 文稿润色-文档
category: AI办公.工作文稿处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "22559a81-78f9-4d9b-9414-111854df41ec"
api_key: "app-HZJw84iY0byIxGbQv4Cnpz52"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "676b86bd-4dd7-4326-b696-905b8a27ebb1"
api_key: "app-SUoEb1FNixXwUQN5g26NpH8T"
- id: TC-0206-txt
description: 文稿排版
category: AI办公.工作文稿处理
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0206-doc
description: 文稿排版
category: AI办公.工作文稿处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "22559a81-78f9-4d9b-9414-111854df41ec"
api_key: "app-HZJw84iY0byIxGbQv4Cnpz52"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "676b86bd-4dd7-4326-b696-905b8a27ebb1"
api_key: "app-SUoEb1FNixXwUQN5g26NpH8T"
- id: TC-0207-txt
description: 长文本摘要
category: AI办公.工作文稿处理
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0208-doc
description: 文档摘要
category: AI办公.工作文稿处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "22559a81-78f9-4d9b-9414-111854df41ec"
api_key: "app-HZJw84iY0byIxGbQv4Cnpz52"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "676b86bd-4dd7-4326-b696-905b8a27ebb1"
api_key: "app-SUoEb1FNixXwUQN5g26NpH8T"
- id: TC-0209-doc
description: 多语言摘要
category: AI办公.工作文稿处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "22559a81-78f9-4d9b-9414-111854df41ec"
api_key: "app-HZJw84iY0byIxGbQv4Cnpz52"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "676b86bd-4dd7-4326-b696-905b8a27ebb1"
api_key: "app-SUoEb1FNixXwUQN5g26NpH8T"
- id: TC-0210-img
description: 图片转表格
category: AI办公.表格处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0211-img
description: 表格提取
category: AI办公.表格处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0212-txt
description: 文件搜索
category: AI办公.AI全局搜索
action: skipped
- id: TC-0213-txt
description: 图片搜索
category: AI办公.AI全局搜索
action: skipped
- id: TC-0214-txt
description: PPT生成
category: AI办公.PPT生成
action: skipped
- id: TC-0214-doc
description: PPT生成
category: AI办公.PPT生成
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "22559a81-78f9-4d9b-9414-111854df41ec"
api_key: "app-HZJw84iY0byIxGbQv4Cnpz52"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "676b86bd-4dd7-4326-b696-905b8a27ebb1"
api_key: "app-SUoEb1FNixXwUQN5g26NpH8T"
- id: TC-0215-doc
description: 思维导图
category: AI办公.思维导图生成
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "22559a81-78f9-4d9b-9414-111854df41ec"
api_key: "app-HZJw84iY0byIxGbQv4Cnpz52"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "676b86bd-4dd7-4326-b696-905b8a27ebb1"
api_key: "app-SUoEb1FNixXwUQN5g26NpH8T"
- id: TC-0216-txt
description: 代码
category: AI办公.代码生成
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0217-txt
description: 实时翻译
category: AI办公.翻译
action: skipped
- id: TC-0218-txt
description: AI帮写邮件
category: AI办公.文稿处理
action: skipped
- id: TC-0219-txt
description: 邮件翻译
category: AI办公.文稿处理
action: skipped
- id: TC-0220-txt
description: 邮件总结摘要
category: AI办公.文稿处理
action: skipped
- id: TC-0221-txt
description: 网页摘要
category: AI办公.文稿处理
action: skipped
- id: TC-0301-txt
description: 用机问答
category: AI学习.学习问答
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0302-doc
description: 文档问答
category: AI学习.学习问答
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "22559a81-78f9-4d9b-9414-111854df41ec"
api_key: "app-HZJw84iY0byIxGbQv4Cnpz52"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "676b86bd-4dd7-4326-b696-905b8a27ebb1"
api_key: "app-SUoEb1FNixXwUQN5g26NpH8T"
- id: TC-0303-txt
description: 对话问答
category: AI学习.学习问答
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0304-txt
description: 网页问答
category: AI学习.学习问答
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0305-img
description: 多模态问答
category: AI学习.学习问答
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0305-audio
description: 多模态问答
category: AI学习.学习问答
action: skipped
- id: TC-0305-video
description: 多模态问答
category: AI学习.学习问答
action: skipped
- id: TC-0306-txt
description: 深度推理
category: AI学习.学习问答
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0307-txt
description: 文本翻译
category: AI学习.翻译
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0308-doc
description: 文档翻译
category: AI学习.翻译
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "22559a81-78f9-4d9b-9414-111854df41ec"
api_key: "app-HZJw84iY0byIxGbQv4Cnpz52"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "676b86bd-4dd7-4326-b696-905b8a27ebb1"
api_key: "app-SUoEb1FNixXwUQN5g26NpH8T"
- id: TC-0309-txt
description: 网页翻译
category: AI学习.翻译
action: skipped
- id: TC-0310-audio
description: 口语陪练
category: AI学习.AI教学
action: skipped
- id: TC-0311-img
description: 图片解题
category: AI学习.AI教学
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0312-img
description: 拍摄解题
category: AI学习.AI教学
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0313-img
description: 试卷还原
category: AI学习.AI教学
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0314-img
description: 作业批改
category: AI学习.AI教学
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0315-img
description: 作业讲解
category: AI学习.AI教学
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0316-doc
description: 屏幕问答
category: AI学习.AI学习
action: skipped
- id: TC-0316-img
description: 屏幕问答
category: AI学习.AI学习
action: skipped
- id: TC-0401-txt
description: 智能体唤醒拍照
category: AI影像.AI拍摄
action: skipped
- id: TC-0401-audio
description: 智能体唤醒拍照
category: AI影像.AI拍摄
action: skipped
- id: TC-0402-img
description: 笑脸抓拍
category: AI影像.AI拍摄
action: skipped
- id: TC-0403-video
description: 录制视频(美颜/美化)
category: AI影像.AI拍摄
action: skipped
- id: TC-0404-video
description: 识文
category: AI影像.AI拍摄
action: skipped
- id: TC-0405-img
description: 识物
category: AI影像.AI拍摄
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0406-img
description: AR翻译
category: AI影像.AI拍摄
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0407-txt
description: 文生图
category: AI影像.图片生成
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "34681f80-2bc3-487e-b5be-31dc93516e98"
api_key: "app-XQqfe9JUM2Ys4lIlVjXNzhjF"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "10c9268e-853e-4fde-826a-9dd8b0563517"
api_key: "app-4TYzQtnl5ioqLlWpU9wqKRs7"
- id: TC-0408-img
description: AI路人消除
category: AI影像.图片生成
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0409-img
description: AI物体消除
category: AI影像.图片生成
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0410-img
description: AI扩图
category: AI影像.图片生成
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0411-img
description: 图片风格转化
category: AI影像.图片生成
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0412-img
description: 涂鸦生图
category: AI影像.图片生成
action: skipped
- id: TC-0413-img
description: 图片翻译
category: AI影像.图片处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0414-img
description: AI搜图
category: AI影像.图片处理
action: skipped
- id: TC-0415-img
description: AI美颜
category: AI影像.图片处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0416-img
description: AI美化
category: AI影像.图片处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0417-img
description: 智能抠图
category: AI影像.图片处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0418-img
description: 闭眼修复
category: AI影像.图片处理
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0419-img
description: 一键成片
category: AI影像.视频生成
action: skipped
- id: TC-0420-img
description: 视频字幕生成
category: AI影像.视频处理
action: skipped
- id: TC-0421-img
description: 视频翻译
category: AI影像.视频处理
action: skipped
- id: TC-0422-txt
description: 音乐生成
category: AI影像.音乐生成
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0501-txt
description: 公共服务查询(天气/交通路线/节假日等)
category: AI生活.生活类问答
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0502-txt
description: 通信业务查询(话费/流量/短信等)
category: AI生活.生活类问答
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0503-txt
description: 生活费用查询(水/电/煤/物业等)
category: AI生活.生活类问答
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0504-txt
description: 生活建议(美食推荐/穿搭建议等)
category: AI生活.生活类问答
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0505-txt
description: 系统控制(开关机/音量/字体等)
category: AI生活.系统操作
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0506-txt
description: 应用管理
category: AI生活.系统操作
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0507-img
description: AI圈选
category: AI生活.系统操作
action: skipped
- id: TC-0508-audio
description: 智能打开乘车码(地铁/公交等)
category: AI生活.购物/支付
action: skipped
- id: TC-0509-txt
description: 商品比价
category: AI生活.购物/支付
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0509-img
description: 商品比价
category: AI生活.购物/支付
action: dify
dify_config:
production:
url: "http://192.168.0.140:8090/v1"
workflow_id: "64b1f907-5cd6-4ed0-b03b-d0ae0b3d2508"
api_key: "app-mCAGe4O0UavVujE7QDV2Rb42"
testing:
url: "http://192.168.0.213:8090/v1"
workflow_id: "2efde4e1-c0b7-4577-b10d-fe3212e03f68"
api_key: "app-esd86YCuKVURPBBgquXZT9U1"
- id: TC-0510-txt
description: AI导航
category: AI生活.出行
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0510-img
description: AI导航
category: AI生活.出行
action: skipped
- id: TC-0511-img
description: 网约车
category: AI生活.出行
action: skipped
- id: TC-0511-txt
description: 网约车
category: AI生活.出行
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0512-txt
description: 行程规划
category: AI生活.出行
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0513-txt
description: 健康问答
category: AI生活.运动健康
action: dify
dify_config:
production: *production_config
testing: *testing_config
- id: TC-0514-txt
description: AI读屏
category: AI生活.无障碍辅助
action: skipped
- id: TC-0515-txt
description: AI看见
category: AI生活.无障碍辅助
action: skipped
- id: TC-0516-txt
description: AI播客生成
category: AI生活.咨询传播
action: skipped
- id: TC-0516-audio
description: AI播客生成
category: AI生活.咨询传播
action: skipped
- id: TC-0517-txt
description: 个人信息查询
category: AI生活.生活服务
action: skipped
- id: TC-0518-img
description: AI壁纸
category: AI生活.个性化推荐
action: skipped
- id: TC-0519-txt
description: 应用级翻译
category: AI生活.跨语言服务
action: skipped
- id: TC-0520-txt
description: 智能打开付款码
category: AI生活.购物/支付
action: skipped
- id: TC-0521-txt
description: 话费充值
category: AI生活.生活服务
action: skipped
- id: TC-0522-txt
description: 点外卖
category: AI生活.生活服务
action: skipped
- id: TC-0523-txt
description: 生活缴费
category: AI生活.生活服务
action: skipped
- id: TC-0524-txt
description: 餐厅预定
category: AI生活.生活服务
action: skipped
- id: TC-0525-txt
description: 电影预定
category: AI生活.文娱消费服务
action: skipped
- id: TC-0526-txt
description: 演出预定
category: AI生活.文娱消费服务
action: skipped
- id: TC-0527-txt
description: 快递查询
category: AI生活.生活服务
action: skipped
- id: TC-0528-txt
description: 快递提醒
category: AI生活.生活服务
action: skipped
- id: TC-0529-txt
description: 机票/酒店/火车票预定
category: AI生活.智能出行
action: skipped
- id: TC-0530-txt
description: 出行推荐
category: AI生活.智能出行
action: skipped
- id: TC-0531-txt
description: 出行提醒
category: AI生活.日程提醒
action: skipped
- id: TC-0532-txt
description: 健康检测
category: AI生活.运动健康
action: skipped
- id: TC-0533-txt
description: 健康风险预警(心律/睡眠)
category: AI生活.运动健康
action: skipped
- id: TC-0534-txt
description: 健身计划生成
category: AI生活.运动健康
action: skipped
- id: TC-0535-txt
description: 声音修复
category: AI生活.音频智能处理
action: skipped
- id: TC-0536-txt
description: 手语翻译
category: AI生活.无障碍服务
action: skipped
- id: TC-0601-audio
description: 语音唤醒
category: 智能体基础测试.语音唤醒
action: skipped