commit 1506b28da64fcf3f574e0518afe5767242a8f1d6 Author: lmflash Date: Wed Apr 22 11:25:55 2026 +0800 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2fd9ea0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__ +doc.xlsx +.env +.config.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..10772c9 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,24 @@ +exclude: "^assets|^test/" +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.11 + hooks: + - id: ruff-check + args: [--fix] + - id: ruff-format + + - repo: https://github.com/asottile/pyupgrade + rev: v3.20.0 + hooks: + - id: pyupgrade + args: [--py312-plus] + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: check-added-large-files + - id: check-toml + - id: check-yaml + exclude: "^helm/" + args: [--unsafe] + - id: check-merge-conflict diff --git a/.well-known/schema.json b/.well-known/schema.json new file mode 100644 index 0000000..0d11d55 --- /dev/null +++ b/.well-known/schema.json @@ -0,0 +1,2528 @@ +{ + "schemaVersion": "2.0.0", + "metadata": { + "name": "vivo-Phone-Test-Project-vivo", + "uuid": "157f58111-aaa9-4636-b476-639e02vivo01", + "description": "vivo手机用例集", + "remoteUrl": "https://gitea.glrocky.cn/aitest-scripts/vivo.git", + "branch": "master", + "tags": { + "osName": "android", + "osVersion": "15", + "brand": "vivo", + "model": "V2405A", + "manufacturer": "vivo" + } + }, + "requirements": { + "devices": [ + { + "type": "phone", + "os": "android", + "count": 1 + } + ] + }, + "cases": [ + { + "name": "TC-0101-audio", + "description": "AI代接", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0102-audio", + "description": "通话实时翻译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0103-audio", + "description": "通话摘要", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0104-txt", + "description": "文本通话", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0105-audio", + "description": "AI通话降噪", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0106-audio", + "description": "AI隐私保护(防漏音)", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0107-audio", + "description": "对话翻译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0108-audio", + "description": "面对面同声传译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0109-txt", + "description": "AI短信", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0110-txt", + "description": "AR虚拟表情", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0110-img", + "description": "AR虚拟表情", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0111-video", + "description": "视频电话AI鉴伪", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0112-doc", + "description": "语音快传", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0112-img", + "description": "语音快传", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0201-img", + "description": "日程管理", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0201-audio", + "description": "日程管理", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0202-audio", + "description": "语音转写", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0202-video", + "description": "语音转写", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0203-doc", + "description": "智能纪要", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0204-txt", + "description": "文稿创作", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0204-img", + "description": "文稿创作", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0205-txt", + "description": "文稿润色-文本", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0205-doc", + "description": "文稿润色-文档", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0206-txt", + "description": "文稿排版", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0206-doc", + "description": "文稿排版", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0207-txt", + "description": "长文本摘要", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0208-doc", + "description": "文档摘要", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0209-doc", + "description": "多语言摘要", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0210-img", + "description": "图片转表格", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0211-img", + "description": "表格提取", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0212-txt", + "description": "文件搜索", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0213-txt", + "description": "图片搜索", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0214-txt", + "description": "PPT生成", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0214-doc", + "description": "PPT生成", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0215-doc", + "description": "思维导图", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0216-txt", + "description": "代码", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0301-txt", + "description": "用机问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0302-doc", + "description": "文档问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0303-txt", + "description": "对话问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0304-txt", + "description": "网页问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0305-img", + "description": "多模态问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0305-audio", + "description": "多模态问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0305-video", + "description": "多模态问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0306-txt", + "description": "深度推理", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0307-txt", + "description": "文本翻译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0308-doc", + "description": "文档翻译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0309-txt", + "description": "网页翻译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0310-audio", + "description": "口语陪练", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0311-img", + "description": "图片解题", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0312-img", + "description": "拍摄解题", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0313-img", + "description": "试卷还原", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0314-img", + "description": "作业批改", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0315-img", + "description": "作业讲解", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0316-doc", + "description": "屏幕问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0316-img", + "description": "屏幕问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0401-txt", + "description": "智能体唤醒拍照", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0401-audio", + "description": "智能体唤醒拍照", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0402-img", + "description": "笑脸抓拍", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0403-video", + "description": "录制视频(美颜/美化)", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0404-video", + "description": "识文", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0405-img", + "description": "识物", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0406-img", + "description": "AR翻译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0407-txt", + "description": "文生图", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0408-img", + "description": "AI路人消除", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0409-img", + "description": "AI物体消除", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0410-img", + "description": "AI扩图", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0411-img", + "description": "图片风格转化", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0412-img", + "description": "涂鸦生图", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0413-img", + "description": "图片翻译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0414-img", + "description": "AI搜图", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0415-img", + "description": "AI美颜", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0416-img", + "description": "AI美化", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0417-img", + "description": "智能抠图", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0418-img", + "description": "闭眼修复", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0419-img", + "description": "一键成片", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0420-img", + "description": "视频字幕生成", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0421-img", + "description": "视频翻译", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0501-txt", + "description": "公共服务查询(天气/交通路线/节假日等)", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0502-txt", + "description": "通信业务查询(话费/流量/短信等)", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0503-txt", + "description": "生活费用查询(水/电/煤/物业等)", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0504-txt", + "description": "生活建议(美食推荐/穿搭建议等)", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0505-txt", + "description": "系统控制(开关机/音量/字体等)", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0506-txt", + "description": "应用管理", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0507-img", + "description": "AI圈选", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0508-audio", + "description": "智能打开乘车码(地铁/公交等)", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0509-txt", + "description": "商品比价", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0509-img", + "description": "商品比价", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0510-txt", + "description": "AI导航", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0510-img", + "description": "AI导航", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0511-img", + "description": "网约车", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0511-txt", + "description": "网约车", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0512-txt", + "description": "行程规划", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0513-txt", + "description": "健康问答", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0514-txt", + "description": "AI读屏", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0515-txt", + "description": "AI看见", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + }, + { + "name": "TC-0601-audio", + "description": "语音唤醒", + "supportedMetrics": [], + "materialParams": [ + { + "name": "paramGroupUuid", + "description": "UUID", + "type": "text", + "isArray": true + }, + { + "name": "inputTextList", + "description": "对话列表,支持多轮对话", + "type": "text", + "isArray": true + }, + { + "name": "prompt", + "description": "提示词", + "type": "text", + "isArray": true + } + ], + "parameters": [] + } + ], + "commands": { + "generateSchema": "uv run --reinstall-package glrocky-sdk pytest --co --generate-schema --continue-on-collection-errors", + "startTest": "uv run pytest" + } +} \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..3bfd741 --- /dev/null +++ b/README @@ -0,0 +1,178 @@ +# OPPO AI 能力自动化测试框架(测试用例部分) + +## 1. OPPO测试用例项目简介 + +本项目旨在为 OPPO 移动设备提供一套全面的 AI 能力自动化测试解决方案。通过模拟真实用户操作,对 AI 社交、AI 办公、AI 学习、AI 影像及 AI 生活等多个核心场景的功能进行端到端验证,确保各项 AI 功能的稳定性与可靠性。 + +## 2. 项目结构 + +项目采用分层结构,将核心逻辑、测试用例与配置文件分离,以提高代码的可维护性与扩展性。 + +``` +oppo/ +├── .well-known/ # 此目录存放与服务器交互的规范文件(由框架自动生成,请勿手动维护。) +├── .pacakge/ # 此目录存放更为底层的框架封装(勿动!) +├── assets/ # 所需的测试素材与语料均保存在此目录中(请勿使用git维护此目录) +├── core/ # 核心业务逻辑与辅助模块 +│ ├── album.py # 相册操作封装 +│ ├── local_search.py # 本地搜索功能封装 +│ ├── sound_recorder.py # 录音机功能封装 +│ ├── ui_helper.py # UI 交互辅助工具 +│ ├── xiaobu.py # 小布助手交互封装 +│ └──... +├── scenarios/ # 自动化测试用例场景 +│ ├── tc_01_social/ # AI 社交场景 +│ ├── tc_02_office/ # AI 办公场景 +│ ├── tc_03_study/ # AI 学习场景 +│ ├── tc_04_visual/ # AI 影像场景 +│ └── tc_05_daily_life/ # AI 生活场景 +├── conftest.py # Pytest 配置文件,提供全局 Fixture +├── pyproject.toml # 项目配置文件 (PEP 621),定义项目依赖与元数据 +├── README # 项目说明文档 +└── .env # 环境变量配置(请勿提交至版本库) +``` + +### 2.1. `core` 目录 + +`core` 目录包含了项目所需的核心功能模块。这些模块提供了对设备原生应用(如相册、录音机)和系统级功能(如UI操作、小布助手)的原子化操作接口,为上层测试用例的编写提供稳定支持。 + +### 2.2. `scenarios` 目录 + +`scenarios` 目录存放所有自动化测试用例。用例根据功能领域划分为不同的子目录,每个子目录对应一个二级测试场景。用例文件(`tc_*.py`)的命名遵循统一规范。 + + +## 3. 测试场景概览 + +本项目覆盖了以下五大核心 AI 测试领域: + +| 二级场景 | 编号前缀 | 描述 | +| :--- | :--- | :--- | +| AI 社交 | `tc_01` | 覆盖通话、短信、社交应用等场景下的 AI 功能。 | +| AI 办公 | `tc_02` | 覆盖日程管理、会议、文稿处理、全局搜索等办公场景。 | +| AI 学习 | `tc_03` | 覆盖问答、翻译、AI 教学等学习辅助功能。 | +| AI 影像 | `tc_04` | 覆盖 AI 拍摄、图片生成与处理、视频处理等影像能力。 | +| AI 生活 | `tc_05` | 覆盖生活问答、系统操作、出行、健康等日常应用场景。 | + +每个场景下的具体测试用例(三级场景)均在对应的 `tc_*.py` 文件中实现。 + +## 4. 指标收集与发送机制 + +本项目包含一个完整的指标收集与发送机制,用于记录和传输测试过程中的关键性能指标和测试结果。 + +### 4.1 设计思想 + +指标管理器(`metric_manager.py`)的设计目标是提供一个灵活且易于使用的接口,用于收集和发送各种类型的测试指标。指标管理器支持多种指标类型,包括文本、数值、图像和视频。通过`conftest.py`中的`metric` fixture,指标管理器被集成到测试框架中,使得所有测试用例可以方便地使用它。 + +### 4.2 指标收集 + +指标管理器提供了以下方法来收集不同类型的指标: + +- `add_text_metric(name: str, value: str, label: str | None = None)`: 添加文本类型的指标。 +- `add_number_metric(name: str, value: float, label: str | None = None)`: 添加数值类型的指标。 +- `add_image_metric(name: str, value: Path | str, label: str | None = None)`: 添加图像类型的指标。 +- `add_video_metric(name: str, value: Path | str, label: str | None = None)`: 添加视频类型的指标。 + +此外,指标管理器还提供了一个`from_dict`方法,用于从字典中批量添加指标。 + +### 4.3 指标发送 + +在测试用例执行完成后,指标管理器会自动调用`send`方法,将收集到的所有指标发送到服务器。发送过程由`conftest.py`中的`metric` fixture管理,确保在每个测试用例结束后指标能够及时发送。 + +### 4.4 使用示例 + +在测试用例中,可以通过`metric` fixture来使用指标管理器。以下是一个简单的示例: + +```python +import pytest + +@pytest.mark.meta(id="TC-0101-01", description="AI社交/语音交流/AI代接/快递") +def test_tc_0101_01(metric): + metric.span(m_type="social", m_id="TC-0101-01", m_iter=1) + metric.add_text_metric(name="call_status", value="success", label="通话状态") + metric.add_number_metric(name="call_duration", value=120.5, label="通话时长") + metric.send() +``` + +在这个示例中,测试用例首先调用`span`方法开始一个新的指标收集周期,然后使用`add_text_metric`和`add_number_metric`方法添加文本和数值类型的指标,最后调用`send`方法将指标发送到服务器。 + +## 5. 开发规范与工具配置 + +为了确保代码质量和开发规范,项目中使用了`justfile`和`.pre-commit-config.yaml`两个重要配置文件。 + +### 5.1 `justfile` - 本地开发任务管理 + +`justfile` 是一个本地开发任务管理工具,类似于 Makefile,但更加简洁和易用。它定义了一系列常用开发任务及其执行命令,可以帮助你快速执行构建、清理、测试等操作。 + +#### 当前有的主要功能 + +- **任务分组**:任务按照功能分组,例如构建、测试、清理等。 +- **命令简化**:通过简单的命令即可执行复杂的操作。 +- **环境配置**:可以设置环境变量和默认参数。 + +后续,你可以参考现有命令自行拓展。 + +#### 使用示例 + +- **执行所有测试**: + ```shell + just run + ``` +- **清理缓存**: + ```shell + just clean-all + ``` + +### 5.2 `.pre-commit-config.yaml` - 代码质量检查 + +`.pre-commit-config.yaml` 是 pre-commit 工具的配置文件,用于在每次提交代码前自动执行代码质量检查和格式化操作。 +加入此工具的目的是为了代码风格的一致性和代码质量。 + +#### 主要功能 + +- **代码检查**:使用 Ruff 进行代码风格检查和格式化。 +- **文件检查**:检查大文件、YAML 文件、TOML 文件的格式。 +- **冲突检测**:检测合并冲突。 + +#### 使用示例 + +- **安装 pre-commit 钩子**: + ```shell + pre-commit install + ``` +- **手动运行检查**: + ```shell + pre-commit run --all-files + ``` + +## 6. 环境与依赖 + +本项目使用 `uv` 作为包管理工具,所有依赖项均在 `pyproject.toml` 文件中声明。 + +**环境设置步骤:** +1. 确保已安装 `uv`。 +2. 在项目根目录下执行以下命令创建并激活虚拟环境: + ```shell + uv venv + source .venv/bin/activate + ``` +3. 安装项目依赖: + ```shell + uv pip install -e . + ``` + +## 7. 执行测试 + +本项目测试框架基于 `pytest` 构建。在激活虚拟环境后,可使用标准 `pytest` 命令执行测试。 + +- **执行所有测试:** + ```shell + pytest + ``` +- **执行指定场景的测试:** + ```shell + pytest scenarios/tc_01_social/ + ``` +- **执行单个测试文件:** + ```shell + pytest scenarios/tc_01_social/tc_0101.py + ``` \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..ca4ccb2 --- /dev/null +++ b/conftest.py @@ -0,0 +1,120 @@ +from typing import Callable, Literal +from glrocky.framework.schemas import ( + TestSessionRuntime, + Device as _Device, + TestCaseExecutionState, + TestCaseRuntime, +) +from glrocky.framework.const_stash_keys import CASE_RUNTIME_CONFIG_KEY +import pytest +from glrocky.framework.schemas import TestCaseMertic as MetricItem +from glrocky.framework.schemas import TestCaseMetrics as MetricPacked +from glrocky.core.logger import core_logger + + +@pytest.fixture(scope="function") +def device_info( + request: pytest.FixtureRequest, +) -> _Device: + runtime: TestSessionRuntime | None = getattr(request.config, "project", None) + if runtime is None: + raise RuntimeError("unreachable!!!!!") + ret = runtime.devices[0] if runtime.devices else None + if not ret: + raise RuntimeError("no device found") + return ret + + +@pytest.fixture(scope="function", autouse=True) +def metric(record_metric: Callable[[MetricPacked], None]): + """usage: + def test_g(metric): + metric.span() # optional + metric.add() + metric.add() + metric.send_all() # optianl + """ + + class M: + def __init__(self): + self.data: list[tuple[str, str, int, list[MetricItem]]] = [] + self.span() + + def add( + self, + name: str, + value: float | int | str, + label: str | None = None, + type: Literal["number", "image", "video", "text"] = "text", + ) -> None: + metric = MetricItem( + name=name, value=value, label=label or name, unit=None, type=type + ) + self.data[-1][-1].append(metric) + + def span( + self, + material_type: str = "default", + material_id: str = "default", + material_iteration: int = 1, + ): + # DO NOT ADD DUPLICATE ITEM!! + if len(self.data): + last_span = self.data[-1] + if all( + ( + last_span[0] == material_type, + last_span[1] == material_id, + last_span[2] == material_iteration, + ) + ): + core_logger.debug( + f"SKIP DUPLICATE SPAN:{material_type=},{material_id=},{material_iteration=}" + ) + return + + self.data.append((material_type, material_id, material_iteration, [])) + core_logger.info( + f"added new span for metric:{material_type=},{material_id=},{material_iteration=}" + ) + + def send_all( + self, + ): + if len(self.data) < 1: + core_logger.debug("no materics to send") + return # no span at all,skip + + data = self.data[::-1] + self.data.clear() # TODO: not safe,to be improved + core_logger.info(f"{len(data)} metrics for send.") + while True: + if len(data) == 0: + break + item = data.pop() + material_type, material_id, material_iteration, metrics = ( + item[0], + item[1], + item[2], + item[3], + ) + if len(metrics) == 0: + core_logger.info("skip empty metrics") + continue + for_send = MetricPacked( + type=material_type, + material=material_id, + iteration=material_iteration, + metrics=metrics, + ) + core_logger.info(f"rebuild metric:{for_send=}") + core_logger.info("sending metrics to executor...") + record_metric(for_send) + core_logger.info("sent") + + _m = M() + yield _m + try: + _m.send_all() + except Exception as e: + raise RuntimeError(f"Cloud not send metric to server,Detail: {e}") diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/metric_manager.py b/core/metric_manager.py new file mode 100644 index 0000000..751692d --- /dev/null +++ b/core/metric_manager.py @@ -0,0 +1,82 @@ +from pathlib import Path + + +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): + if not the_dict: + raise ValueError("dict is null") + for k, v in the_dict.items(): + if 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") diff --git a/glrocky_sdk-0.4.3-py3-none-any.whl b/glrocky_sdk-0.4.3-py3-none-any.whl new file mode 100644 index 0000000..09529a5 Binary files /dev/null and b/glrocky_sdk-0.4.3-py3-none-any.whl differ diff --git a/justfile b/justfile new file mode 100644 index 0000000..2890b79 --- /dev/null +++ b/justfile @@ -0,0 +1,62 @@ +set shell := ["powershell.exe","-NoLogo","-NoProfile", "-c"] # windows +set dotenv-load +set quiet :=true + +@_: + just --list + +[group("build")] +generate-schema: + rm {{quote(".well-known"/"*.json")}} + @fd -e json -H "schema" + uv run --reinstall-package glrocky-sdk \ + python -m \ + pytest --co --generate-schema --continue-on-collection-errors -q + mv {{ quote (".well-known" / "schema_autogenerated.json")}} {{ quote (".well-known" / "schema.json")}} + @fd -e json -H "schema" + +[group("qa")] +lint: + uvx ruff check --fix --unsafe-fixes . + uvx ruff format + +[group("run")] +[doc("run a specific test,eg: j run 0101_02")] +run TEST: + uv run python -m pytest -sqv -k {{TEST}} + +[group("clean")] +clean-pycache: + @rm.exe -rf .pytest_cache .mypy_cache .ruff_cache .coverage + rm.exe -rf log out + @fd -td -I "__pycache__" -x rm -rf '{}' + @echo "✅ Done" + +[group("clean")] +clean-cache: + @rm.exe -rf .pytest_cache .mypy_cache .ruff_cache .coverage + +[group("clean")] +clean-out-and-log: + rm.exe -rf logs/ out/ + +[group("clean")] +clean-all: + just clean-cache + just clean-out-and-log + just clean-pycache + +[group("dev")] +[doc("invoke ipython with u2")] +debug-u2: + uvx --with uiautomator2 --with .packages/glrocky_sdk-0.1.2-py3-none-any.whl --directory . ipython + +[group("dev")] +[doc("show android ui")] +debug-ui: + uvx uiviewer + +[group("dev")] +[doc("start test executor server,from glrocky framework")] +debug-srv: + uv run api-test-server diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ef50ed3 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,76 @@ +[project] +name = "vivo-Phone-Test-Project-vivo" +version = "0.3.1" +description = "vivo手机用例集" +readme = "README.md" +authors = [{ name = "liumin", email = "liumin@glrocy.com" }] +requires-python = "==3.12.6" + +dependencies = ["glrocky-sdk", "uvicorn>=0.34.2"] + +[tool.pytest.ini_options] +minversion = "8.3.5" +#addopts = "--no-summary --no-header -rfEX --strict-markers --capture=tee-sys " +addopts = "--capture=tee-sys " +testpaths = ["scenarios"] +python_files = "tc_*.py" +markers = [] + +[tool.pyright] +venv = ".venv" +venvPath = "." +reportMissingTypeStubs = false +reportUnknownMemberType = false +[tool.uv.sources] +#glrocky-sdk = { path = "../../packages/glrocky-sdk" } +glrocky-sdk = { path = "./glrocky_sdk-0.4.3-py3-none-any.whl" } + +[[tool.uv.index]] +url = "https://mirrors.aliyun.com/pypi/simple/" +default = true + +[tool.glrocky] +remote_url = "https://gitea.glrocky.cn/aitest-scripts/vivo.git" +branch = "master" +uuid = "157f58111-aaa9-4636-b476-639e02vivo01" + +[tool.glrocky.tags] +osName="android" #adb -s 10AE8217PH000AH shell "getprop ro.build.version.release" +osVersion="15" +brand="vivo" #adb -s 10AE8217PH000AH shell "getprop ro.product.brand" +model="V2405A" #adb -s 10AE8217PH000AH shell "getprop ro.product.model" +manufacturer="vivo" #adb -s 10AE8217PH000AH shell "getprop ro.product.manufacturer" + +[tool.glrocky.commands] +generateSchema = "uv run --reinstall-package glrocky-sdk pytest --co --generate-schema --continue-on-collection-errors" +startTest = "uv run pytest" + +[tool.glrocky.requirements] +devices = [{ type = "phone", os = "android", count = 1 }] + +[tool.glrocky.project_settings] +screen-record-extra-commands = [ + "--window-x=1380", + "--window-y=50", + "--always-on-top", + "--disable-screensaver", + "--window-borderless", + "-m", + "600", + "--video-codec", + "h264", + "--video-bit-rate", + "5M", + "--max-fps", + "60", + "--time-limit", + "3600", + "--print-fps", + "--video-buffer", + "100", + "--no-audio-playback", + "--no-audio", +] + +[dependency-groups] +dev = ["ruff>=0.12.2"] diff --git a/scenarios/__init__.py b/scenarios/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scenarios/tc_generator.py b/scenarios/tc_generator.py new file mode 100644 index 0000000..f2959f6 --- /dev/null +++ b/scenarios/tc_generator.py @@ -0,0 +1,483 @@ +import os +import re +import sys +import json +import time +import concurrent.futures +from dataclasses import dataclass +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, create_model +import socket + +PRODUCTION_ENV_NAME = "GLROCKY_PRODUCTION_MODE" +PRODUCTION_EXECUTOR = "192.168.0.139" +YAML_FILE = Path(__file__).parent / "test_cases.yaml" + +def _get_local_ip() -> str: + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + s.connect(("8.8.8.8", 80)) + ip: str = s.getsockname()[0] + return str(ip) + finally: + s.close() + + +def _is_production_mode() -> bool: + env_val = os.getenv(PRODUCTION_ENV_NAME) + if env_val is not None: + return env_val.lower() in ("true", "yes", "1") + return _get_local_ip() == PRODUCTION_EXECUTOR + + +def pre_process_material(input: list[str]) -> str: + + assert isinstance(input, list) + if not input: + return json.dumps([], ensure_ascii=False) + result = [] + for text in input: + splited = _Q_PATTERN.split(text, maxsplit=50) + for part in splited: + if not part.strip(): + continue + result.append(part.strip()) + return json.dumps(result, ensure_ascii=False) + + +IS_PRODUCTION = _is_production_mode() + +METRIC_FIELD_MAPPING: dict[str, str] = { + "result": "result|结果", + "_dify_result": "_dify_result|业务完成", + "_dify_message": "_dify_message|业务错误信息", + "resultText": "resultText|文本结果", + "recordVideo": "recordVideo|录像", + "recordAudio": "recordAudio|录音", + "screenshotList": "screenshotList|截图", + "firstToken": "firstToken|首字符时长", + "timeSeries": "timeSeries|时间序列", + "fileList": "fileList|文件", +} + +IMAGE_EXTENSIONS = {".jpg", ".png", ".gif", ".bmp"} +VIDEO_EXTENSIONS = {".mp4", ".mkv"} +_Q_PATTERN = re.compile(r"Q\d+\s*[::\.]+\s*", flags=re.MULTILINE) + + +@dataclass +class _TimeoutCtx: + client: Any = None + task_id: str | None = None + + def stop(self): + if self.client and self.task_id: + try: + logger.info(f"Stopping workflow: {self.task_id}") + self.client.stop_workflow(self.task_id) + logger.info(f"Stopped workflow: {self.task_id}") + except Exception as e: + logger.debug(f"Stop workflow failed: {e}") + + +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 or not name.strip(): + raise ValueError("Empty name") + + if label: + return name, label + sep = next((s for s in ("|", ":") if s in name), None) + if sep: + _n, _l = name.split(sep, maxsplit=1) + return (_n, _l) + return name, name + + def _add_metric(self, name: str, value: Any, m_type: str, label: str | None = None): + _n, _l = self._smart_name_label(name, label) + self.metric.add(name=_n, label=_l, value=value, type=m_type) + + def add_text_metric(self, name: str, value: str, label: str | None = None): + self._add_metric(name, value, "text", label) + + def add_number_metric(self, name: str, value: float, label: str | None = None): + self._add_metric(name, value, "number", label) + + def add_image_metric(self, name: str, value: Path | str, label: str | None = None): + self._add_metric(name, str(value), "image", label) + + def add_video_metric(self, name: str, value: Path | str, label: str | None = None): + self._add_metric(name, value, "video", label) + + 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 = METRIC_FIELD_MAPPING.get(_k, _k) + logger.info(k) + + match v: + case None: + self.add_text_metric(name=k, value="") + case int() | float(): + self.add_number_metric(name=k, value=v) + case str(): + self.add_text_metric(name=k, value=v) + case Path(): + match v.suffix.lower(): + case s if s in IMAGE_EXTENSIONS: + self.add_image_metric(name=k, value=str(v.resolve())) + case s if s in VIDEO_EXTENSIONS: + self.add_video_metric(name=k, value=str(v.resolve())) + case _: + self.add_text_metric(name=k, value=str(v.resolve())) + case _: + raise TypeError(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_factory=list, title="UUID", description="UUID" + ) + inputTextList: list[str] = Field( + default_factory=list, + title="对话列表,支持多轮对话", + description="对话列表,支持多轮对话", + ) + prompt: list[str] = Field( + default_factory=list, title="提示词", description="提示词" + ) + model_config = ConfigDict(arbitrary_types_allowed=True) # allows uuid extra... + + +class DifyPayload(BaseModel): + inputTextList: list[str] | str + prompt: list[str] | str + deviceId: str + address: str + caseId: str + parameters: dict[str, Any] |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 create_dynamic_model(model_name: str, parameters: list[dict]) -> type[BaseModel]: + field_definitions = {} + for idx, param in enumerate(parameters): + name: str = ( + param.get("name", "").strip() if isinstance(param.get("name"), str) else "" + ) + if not name: + raise ValueError(f"参数定义错误: 第 {idx + 1} 个参数缺少 'name' 字段或为空") + + label = ( + param.get("label", "").strip() + if isinstance(param.get("label"), str) + else name + ) + description = ( + param.get("description", label).strip() + if isinstance(param.get("description"), str) + else label + ) + param_type = ( + param.get("type", "string").strip() + if isinstance(param.get("type"), str) + else "string" + ) + + if param_type not in ("string",): + raise ValueError( + f"参数 '{name}' 不支持的类型 '{param_type}',目前仅支持 'string'" + ) + + default = param.get("defaultValue", "") + if default and isinstance(default, str): + default = default.strip() + + field_definitions[name] = ( + str, + Field(default=default, title=label, description=description), + ) + + try: + model = create_model(model_name, __base__=BaseModel, **field_definitions) + model.model_config["extra"] = "ignore" + + model() + return model + except Exception as e: + raise ValueError(f"创建参数模型 '{model_name}' 失败: {e}") + + +def call_dify( + case_meta_info: dict[str, str], + logger: Logger, + device_info: Device, + material: list[MaterialForDify], + dify_cfg: DifySettings, + metric, + material_reporter, + parameters: dict[str, Any] | None = None, + timeout_sec: int | None = None, +): + # logger.info(device_info.device_serial) + logger.info(dify_cfg) + + event_callbacks: dict[str, Callable[..., None]] = {} + + def on_node_started(_, __, d: dict[str, Any]): + logger.info(f"开始执行:{d.get('title', '')}") + logger.info(f"输入节点参数:{d.get('inputs')}") + + def on_node_finished(_, __, 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 timeout_sec: + ctx = _TimeoutCtx() + + def on_workflow_started(client, event_name, event_data): + logger.info("开始执行dify任务") + ctx.client = client + ctx.task_id = event_data.get("task_id") + + event_callbacks["on_workflow_started"] = on_workflow_started + if not material: + raise RuntimeError("缺少素材") + else: + logger.info(f"下发素材:{material}") + metric_manager = MetricManager(metric) + local_ip = _get_local_ip() + + 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_data = { + **item.model_dump(), + "deviceId": device_info.device_serial, + "address": local_ip, + "caseId": case_meta_info.get("id", "Unknown"), + } + if parameters: + payload_data["parameters"] = json.dumps(parameters) + payload = DifyPayload(**payload_data) + logger.info(f"payload send to dify:\n{payload.model_dump_json(indent=2)}\n") + metric_manager.new_span( + "default", f"default-{material_index}", material_index + ) + + def _run_workflow(): + return run_workflow( + api_key=dify_cfg.difyApiKey, + base_url=dify_cfg.difyUrl, + workflow_id=dify_cfg.difyWorkflowId, + inputs=payload.model_dump(exclude_none=True), + event_callbacks=event_callbacks, + ) + + if timeout_sec: + with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor: + future = executor.submit(_run_workflow) + try: + result = future.result(timeout=timeout_sec) + except concurrent.futures.TimeoutError: + logger.error(f"Workflow timeout after {timeout_sec}s,(yaml config)") + time.sleep(0.1) + logger.info("尝试停止工作流...") + ctx.stop() + raise TimeoutError(f"Workflow timeout after {timeout_sec}s") + else: + result = _run_workflow() + logger.info(f"工作流返回结果:{result.outputs}") + logger.info(f"工作流最终状态:{result.success}") + + if result.outputs: + logger.info("提交结果到执行器") + metric_manager.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( + meta: dict[str, str], + dify_settings: DifySettings | None = None, + param_model: type[BaseModel] | None = None, + timeout: int | None = None, +) -> Callable[..., None]: + if param_model is None: + param_model = create_model("EmptyParams", __base__=BaseModel) + + @pytest.mark.usefixtures("cfg") + def _func_impl( + logger: Logger, + device_info: Device, + material: list[MaterialForDify], + metric, + material_reporter, + cfg: param_model, + ) -> None: + param_dict = cfg.model_dump() if cfg else {} + call_dify( + meta, + logger, + device_info, + material, + dify_cfg=dify_settings, + metric=metric, + material_reporter=material_reporter, + parameters=param_dict, + timeout_sec=timeout, + ) + + # always use cfg fixture + # _func_impl = pytest.mark.usefixtures("cfg")(_func_impl) + return M.meta(**meta)(_func_impl) + + +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 + + try: + 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 + ) + except yaml.YAMLError as e: + logger.error(f"Failed to parse YAML file {yaml_path}: {e}") + pytest.fail(f"YAML解析失败: {yaml_path}") + return + if not all_cases: + return + for case_info in all_cases.get("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} + fn_name = f"test_{case_id.lower().replace('-', '_')}" + + if action == "dify": + dify_settings: DifySettings | None = None + param_model: type[BaseModel] | None = None + timeout = case_info.get("timeout") + + if parameters_def := case_info.get("parameters"): + model_name = f"{case_id.replace('-', '_')}_Params" + param_model = create_dynamic_model(model_name, parameters_def) + + if dify_config_block := case_info.get("dify_config"): + env_key = "production" if IS_PRODUCTION else "testing" + if env_config := dify_config_block.get(env_key): + dify_settings = DifySettings( + difyUrl=env_config.get("url"), + difyWorkflowId=env_config.get("workflow_id"), + difyApiKey=env_config.get("api_key"), + ) + else: + logger.warning( + f"No '{env_key}' config found for {case_id}, will use default." + ) + fn = make_dify_test(meta, dify_settings, param_model, timeout) + 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}'") + + + +generate_cases_from_yaml(__name__, YAML_FILE) diff --git a/scenarios/test_cases.yaml b/scenarios/test_cases.yaml new file mode 100644 index 0000000..d04e83f --- /dev/null +++ b/scenarios/test_cases.yaml @@ -0,0 +1,798 @@ +dify_templates: + tianjin_dify_config: &testing_config + url: "http://192.168.0.163:8090/v1" + workflow_id: "d4a40bf2-99cb-440f-97be-3793e2274318" + api_key: "app-cvFr7cpcHytfYIS0q2LpdS0B" + guangzhou_dify_config: &production_config + url: "http://192.168.0.140:8090/v1" + workflow_id: "401dedaf-3c8f-4cc7-8131-1648826c3d7b" + api_key: "app-PG0AtryXUDXwM7pwTeDFGks8" +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: dify + dify_config: + production: *production_config + testing: *testing_config + + - 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-0201-img + description: 日程管理 + category: AI办公.日程管理 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - id: TC-0201-audio + description: 日程管理 + category: AI办公.日程管理 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "20410cc9-93da-4e23-afed-000c4599a7b1" + api_key: "app-esPo8u1OLCR6gmcQXg6cGRRS" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - 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: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + + - 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: "cfdc59bc-cd21-47ed-a4bb-65a579b9b570" + api_key: "app-Fwdj6dySruRWkCNkdxwvRUBq" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "2c7809b7-baea-478f-9f19-c722a7a276c4" + api_key: "app-puoiD0ZqPRtFb7wrUimw4cSt" + + - 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: "cfdc59bc-cd21-47ed-a4bb-65a579b9b570" + api_key: "app-Fwdj6dySruRWkCNkdxwvRUBq" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "2c7809b7-baea-478f-9f19-c722a7a276c4" + api_key: "app-puoiD0ZqPRtFb7wrUimw4cSt" + + - 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: "cfdc59bc-cd21-47ed-a4bb-65a579b9b570" + api_key: "app-Fwdj6dySruRWkCNkdxwvRUBq" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "2c7809b7-baea-478f-9f19-c722a7a276c4" + api_key: "app-puoiD0ZqPRtFb7wrUimw4cSt" + + - id: TC-0209-doc + description: 多语言摘要 + category: AI办公.工作文稿处理 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "cfdc59bc-cd21-47ed-a4bb-65a579b9b570" + api_key: "app-Fwdj6dySruRWkCNkdxwvRUBq" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "2c7809b7-baea-478f-9f19-c722a7a276c4" + api_key: "app-puoiD0ZqPRtFb7wrUimw4cSt" + + - id: TC-0210-img + description: 图片转表格 + category: AI办公.表格处理 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - id: TC-0211-img + description: 表格提取 + category: AI办公.表格处理 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - 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: skipped + + - id: TC-0215-doc + description: 思维导图 + category: AI办公.思维导图生成 + action: skipped + + - id: TC-0216-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: "cfdc59bc-cd21-47ed-a4bb-65a579b9b570" + api_key: "app-Fwdj6dySruRWkCNkdxwvRUBq" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "2c7809b7-baea-478f-9f19-c722a7a276c4" + api_key: "app-puoiD0ZqPRtFb7wrUimw4cSt" + + - 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: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - 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: "cfdc59bc-cd21-47ed-a4bb-65a579b9b570" + api_key: "app-Fwdj6dySruRWkCNkdxwvRUBq" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "2c7809b7-baea-478f-9f19-c722a7a276c4" + api_key: "app-puoiD0ZqPRtFb7wrUimw4cSt" + + - 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: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - id: TC-0312-img + description: 拍摄解题 + category: AI学习.AI教学 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - id: TC-0313-img + description: 试卷还原 + category: AI学习.AI教学 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - id: TC-0314-img + description: 作业批改 + category: AI学习.AI教学 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - id: TC-0315-img + description: 作业讲解 + category: AI学习.AI教学 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - 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: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - id: TC-0406-img + description: AR翻译 + category: AI影像.AI拍摄 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - id: TC-0407-txt + description: 文生图 + category: AI影像.图片生成 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "c25592cb-da9a-4819-9361-f53bc323f790" + api_key: "app-RqGgudoqeNbteUNQJbTW7TeS" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "6962c5d6-9d85-487c-844b-82f81fbfe246" + api_key: "app-QfWiJwbzSiGcakxHmFouPund" + + - id: TC-0408-img + description: AI路人消除 + category: AI影像.图片生成 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "584bb977-5ffe-4d91-b38f-ddaa0fe2196d" + api_key: "app-nRj7qTnpcF9hYb7LYDoIHsk1" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "6962c5d6-9d85-487c-844b-82f81fbfe246" + api_key: "app-QfWiJwbzSiGcakxHmFouPund" + + - id: TC-0409-img + description: AI物体消除 + category: AI影像.图片生成 + action: skipped + + - id: TC-0410-img + description: AI扩图 + category: AI影像.图片生成 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "584bb977-5ffe-4d91-b38f-ddaa0fe2196d" + api_key: "app-nRj7qTnpcF9hYb7LYDoIHsk1" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "6962c5d6-9d85-487c-844b-82f81fbfe246" + api_key: "app-QfWiJwbzSiGcakxHmFouPund" + + - id: TC-0411-img + description: 图片风格转化 + category: AI影像.图片生成 + action: skipped + + - 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: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - 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: "584bb977-5ffe-4d91-b38f-ddaa0fe2196d" + api_key: "app-nRj7qTnpcF9hYb7LYDoIHsk1" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "6962c5d6-9d85-487c-844b-82f81fbfe246" + api_key: "app-QfWiJwbzSiGcakxHmFouPund" + + - id: TC-0416-img + description: AI美化 + category: AI影像.图片处理 + action: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "584bb977-5ffe-4d91-b38f-ddaa0fe2196d" + api_key: "app-nRj7qTnpcF9hYb7LYDoIHsk1" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "6962c5d6-9d85-487c-844b-82f81fbfe246" + api_key: "app-QfWiJwbzSiGcakxHmFouPund" + + - id: TC-0417-img + description: 智能抠图 + category: AI影像.图片处理 + action: skipped + + - id: TC-0418-img + description: 闭眼修复 + category: AI影像.图片处理 + action: skipped + + - 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-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: dify + dify_config: + production: + url: "http://192.168.0.140:8090/v1" + workflow_id: "375edfd9-bf28-4792-8f03-399b9201f6cf" + api_key: "app-dHfCMjyNgVwvny9oODgZNKui" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - 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: "80bfd123-926a-44b6-8e76-3b889fbd43fb" + api_key: "app-lhbMbI5dytQby85y4SfAaOQV" + testing: + url: "http://192.168.0.163:8090/v1" + workflow_id: "30ecb958-b56d-4b65-8713-f23945a8db91" + api_key: "app-w2NVHlHZzlIGnmxmkRUO4FPJ" + + - 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-0601-audio + description: 语音唤醒 + category: 智能体基础测试.语音唤醒 + action: skipped diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..496471e --- /dev/null +++ b/uv.lock @@ -0,0 +1,1251 @@ +version = 1 +revision = 2 +requires-python = "==3.12.6" + +[[package]] +name = "adbutils" +version = "2.9.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "deprecation" }, + { name = "pillow" }, + { name = "requests" }, + { name = "retry2" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/89/26/d522ca7dd18e51e48952046e5f26b0436532f1f433f9d1376f3b4700f99e/adbutils-2.9.3.tar.gz", hash = "sha256:9adb922796f1096cb5bfebc6754f419ec781136b3f38a5588ca58a07bec26147" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/66/3b/616c81dc14b8cf03ffb3202365d2593a3e5aad5c91356b6e41090e3b56cb/adbutils-2.9.3-py3-none-macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:db11a3273f755f50bd7d80d14feb470ad5f02fe73d3d6b8442a1408374a5174b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6b/27/5da73f56315694de3bbbbb3ded61199b4ea4a714e19df5ad5285f9b2534f/adbutils-2.9.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:fe91d59324dfcdebf01cd76e843467d8efb1ab78bd697bc81ec9b83918dc9c8d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d6/9c/fe66312844bd048190fc3cbb803c19eb57a2679f1ea0aea5e2f6dd2ef4a1/adbutils-2.9.3-py3-none-win32.whl", hash = "sha256:82cf82ad5b4ff74cbe44c54c9a92364c906c6fd93eba25b1f47941862140edfa" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/56/ecc00bcb16dc7358573f9886571281ed4dfdb14d20c47783301b046d96f7/adbutils-2.9.3-py3-none-win_amd64.whl", hash = "sha256:73f6ca710bdfb9bc72d9b7e5c9c51325751c1e43d4bdc98b9cee910e2e97588c" }, +] + +[[package]] +name = "agno" +version = "1.7.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "docstring-parser" }, + { name = "gitpython" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-dotenv" }, + { name = "python-multipart" }, + { name = "pyyaml" }, + { name = "rich" }, + { name = "tomli" }, + { name = "typer" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b9/9b/55cf2f1b983a46e885abd685c9c22d4e23a5b607d8b0d63e9b41e9dcf5f2/agno-1.7.0.tar.gz", hash = "sha256:52bfe110c43cac6902b0493e902e7e6ad3aa0890263640b9fbf98567b77866e4" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/25/91/a1a719caf50fdec33bdfa5106906da158c0b204871f6f041be052a626baf/agno-1.7.0-py3-none-any.whl", hash = "sha256:473bd8f67c8084a45c7f98f4c98fe372d58934dfaa21966b71624e62c1dd7010" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" }, +] + +[[package]] +name = "aiohttp" +version = "3.12.13" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/42/6e/ab88e7cb2a4058bed2f7870276454f85a7c56cd6da79349eb314fc7bbcaa/aiohttp-3.12.13.tar.gz", hash = "sha256:47e2da578528264a12e4e3dd8dd72a7289e5f812758fe086473fab037a10fcce" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/b4/6a/ce40e329788013cd190b1d62bbabb2b6a9673ecb6d836298635b939562ef/aiohttp-3.12.13-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0aa580cf80558557285b49452151b9c69f2fa3ad94c5c9e76e684719a8791b73" }, + { url = "https://mirrors.aliyun.com/pypi/packages/28/d9/7150d5cf9163e05081f1c5c64a0cdf3c32d2f56e2ac95db2a28fe90eca69/aiohttp-3.12.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b103a7e414b57e6939cc4dece8e282cfb22043efd0c7298044f6594cf83ab347" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f8/91/d42ba4aed039ce6e449b3e2db694328756c152a79804e64e3da5bc19dffc/aiohttp-3.12.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f64e748e9e741d2eccff9597d09fb3cd962210e5b5716047cbb646dc8fe06f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/99/3b/06f0a632775946981d7c4e5a865cddb6e8dfdbaed2f56f9ade7bb4a1039b/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c955989bf4c696d2ededc6b0ccb85a73623ae6e112439398935362bacfaaf6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/92/a6/2552eebad9ec5e3581a89256276009e6a974dc0793632796af144df8b740/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d640191016763fab76072c87d8854a19e8e65d7a6fcfcbf017926bdbbb30a7e5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d8/9f/bd08fdde114b3fec7a021381b537b21920cdd2aa29ad48c5dffd8ee314f1/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dc507481266b410dede95dd9f26c8d6f5a14315372cc48a6e43eac652237d9b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f7/e1/affdea8723aec5bd0959171b5490dccd9a91fcc505c8c26c9f1dca73474d/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8a94daa873465d518db073bd95d75f14302e0208a08e8c942b2f3f1c07288a75" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/9d/666d856cc3af3a62ae86393baa3074cc1d591a47d89dc3bf16f6eb2c8d32/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f52420cde4ce0bb9425a375d95577fe082cb5721ecb61da3049b55189e4e6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/ce/3c185293843d17be063dada45efd2712bb6bf6370b37104b4eda908ffdbd/aiohttp-3.12.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f7df1f620ec40f1a7fbcb99ea17d7326ea6996715e78f71a1c9a021e31b96b8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3a/5b/f3413f4b238113be35dfd6794e65029250d4b93caa0974ca572217745bdb/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3062d4ad53b36e17796dce1c0d6da0ad27a015c321e663657ba1cc7659cfc710" }, + { url = "https://mirrors.aliyun.com/pypi/packages/82/c8/0e56e8bf12081faca85d14a6929ad5c1263c146149cd66caa7bc12255b6d/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:8605e22d2a86b8e51ffb5253d9045ea73683d92d47c0b1438e11a359bdb94462" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ea/f3/33192b4761f7f9b2f7f4281365d925d663629cfaea093a64b658b94fc8e1/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:54fbbe6beafc2820de71ece2198458a711e224e116efefa01b7969f3e2b3ddae" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5e/0b/26ddd91ca8f84c48452431cb4c5dd9523b13bc0c9766bda468e072ac9e29/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:050bd277dfc3768b606fd4eae79dd58ceda67d8b0b3c565656a89ae34525d15e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c3/8d/e04569aae853302648e2c138a680a6a2f02e374c5b6711732b29f1e129cc/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2637a60910b58f50f22379b6797466c3aa6ae28a6ab6404e09175ce4955b4e6a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ac/98/c193c1d1198571d988454e4ed75adc21c55af247a9fda08236602921c8c8/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e986067357550d1aaa21cfe9897fa19e680110551518a5a7cf44e6c5638cb8b5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e7/9e/07bb8aa11eec762c6b1ff61575eeeb2657df11ab3d3abfa528d95f3e9337/aiohttp-3.12.13-cp312-cp312-win32.whl", hash = "sha256:ac941a80aeea2aaae2875c9500861a3ba356f9ff17b9cb2dbfb5cbf91baaf5bf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/52/66/3ce877e56ec0813069cdc9607cd979575859c597b6fb9b4182c6d5f31886/aiohttp-3.12.13-cp312-cp312-win_amd64.whl", hash = "sha256:671f41e6146a749b6c81cb7fd07f5a8356d46febdaaaf07b0e774ff04830461e" }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" }, +] + +[[package]] +name = "anyio" +version = "4.9.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3" }, +] + +[[package]] +name = "certifi" +version = "2025.6.15" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981" }, + { url = "https://mirrors.aliyun.com/pypi/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0" }, +] + +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, +] + +[[package]] +name = "dashscope" +version = "1.23.6" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "aiohttp" }, + { name = "requests" }, + { name = "websocket-client" }, +] +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/17/52/acf3b2ace5aec0a66ee51ac7f441522b82601a0a936658fb196032835ab0/dashscope-1.23.6-py3-none-any.whl", hash = "sha256:aadf9fd0e1648f8b492e060e857b1be025a4ecb9ec440c36129633cd60b54a23" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a" }, +] + +[[package]] +name = "deprecation" +version = "2.1.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" }, +] + +[[package]] +name = "docstring-parser" +version = "0.16" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/08/12/9c22a58c0b1e29271051222d8906257616da84135af9ed167c9e28f85cb3/docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/d5/7c/e9fcff7623954d86bdc17782036cbf715ecab1bec4847c008557affe1ca8/docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637" }, +] + +[[package]] +name = "fastapi" +version = "0.115.14" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ca/53/8c38a874844a8b0fa10dd8adf3836ac154082cf88d3f22b544e9ceea0a15/fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/53/50/b1222562c6d270fea83e9c9075b8e8600b8479150a18e4516a6138b980d1/fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca" }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de" }, +] + +[[package]] +name = "frozenlist" +version = "1.7.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/79/b1/b64018016eeb087db503b038296fd782586432b9c077fc5c7839e9cb6ef6/frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/ef/a2/c8131383f1e66adad5f6ecfcce383d584ca94055a34d683bbb24ac5f2f1c/frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4c/9d/02754159955088cb52567337d1113f945b9e444c4960771ea90eb73de8db/frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/01/7a/0046ef1bd6699b40acd2067ed6d6670b4db2f425c56980fa21c982c2a9db/frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d6/a2/a910bafe29c86997363fb4c02069df4ff0b5bc39d33c5198b4e9dd42d8f8/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/64/3e/5036af9d5031374c64c387469bfcc3af537fc0f5b1187d83a1cf6fab1639/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08" }, + { url = "https://mirrors.aliyun.com/pypi/packages/06/39/6a17b7c107a2887e781a48ecf20ad20f1c39d94b2a548c83615b5b879f28/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/be/00/711d1337c7327d88c44d91dd0f556a1c47fb99afc060ae0ef66b4d24793d/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/24/fe/74e6ec0639c115df13d5850e75722750adabdc7de24e37e05a40527ca539/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8d/db/48421f62a6f77c553575201e89048e97198046b793f4a089c79a6e3268bd/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1d/fa/cb4a76bea23047c8462976ea7b7a2bf53997a0ca171302deae9d6dd12096/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5d/32/476a4b5cfaa0ec94d3f808f193301debff2ea42288a099afe60757ef6282/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8d/ba/9a28042f84a6bf8ea5dbc81cfff8eaef18d78b2a1ad9d51c7bc5b029ad16/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bc/29/3a32959e68f9cf000b04e79ba574527c17e8842e38c91d68214a37455786/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01" }, + { url = "https://mirrors.aliyun.com/pypi/packages/80/e8/edf2f9e00da553f07f5fa165325cfc302dead715cab6ac8336a5f3d0adc2/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1c/80/9a0eb48b944050f94cc51ee1c413eb14a39543cc4f760ed12657a5a3c45a/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/74/87601e0fb0369b7a2baf404ea921769c53b7ae00dee7dcfe5162c8c6dbf0/frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0b/15/c026e9a9fc17585a9d461f65d8593d281fedf55fbf7eb53f16c6df2392f9/frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ee/45/b82e3c16be2182bff01179db177fe144d58b5dc787a7d4492c6ed8b9317f/frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e" }, +] + +[[package]] +name = "fsspec" +version = "2025.5.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/00/f7/27f15d41f0ed38e8fcc488584b57e902b331da7f7c6dcda53721b15838fc/fsspec-2025.5.1.tar.gz", hash = "sha256:2e55e47a540b91843b755e83ded97c6e897fa0942b11490113f09e9c443c2475" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/bb/61/78c7b3851add1481b048b5fdc29067397a1784e2910592bc81bb3f608635/fsspec-2025.5.1-py3-none-any.whl", hash = "sha256:24d3a2e663d5fc735ab256263c4075f374a174c3410c0b25e5bd1970bceaa462" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf" }, +] + +[[package]] +name = "gitpython" +version = "3.1.44" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110" }, +] + +[[package]] +name = "glrocky-sdk" +version = "0.4.3" +source = { path = "glrocky_sdk-0.4.3-py3-none-any.whl" } +dependencies = [ + { name = "agno" }, + { name = "dashscope" }, + { name = "fastapi" }, + { name = "hmdriver2" }, + { name = "litellm" }, + { name = "loguru" }, + { name = "pillow" }, + { name = "pydantic" }, + { name = "pytest" }, + { name = "python-dotenv" }, + { name = "requests" }, + { name = "tenacity" }, + { name = "uiautomator2" }, + { name = "uvicorn" }, +] +wheels = [ + { filename = "glrocky_sdk-0.4.3-py3-none-any.whl", hash = "sha256:604769f87f7550bd1b2ef5c0bae1d48129ff05c255bb5c5156f1b3b684eb6268" }, +] + +[package.metadata] +requires-dist = [ + { name = "agno", specifier = ">=1.5.1" }, + { name = "dashscope", specifier = ">=1.23.3" }, + { name = "fastapi", specifier = ">=0.115.12" }, + { name = "hmdriver2", specifier = ">=1.4.3" }, + { name = "litellm", specifier = ">=1.69.3" }, + { name = "loguru", specifier = "==0.7.3" }, + { name = "pillow", specifier = ">=11.2.1" }, + { name = "pydantic", specifier = "==2.11.3" }, + { name = "pytest", specifier = "==8.3.5" }, + { name = "python-dotenv", specifier = ">=1.1.0" }, + { name = "requests", specifier = ">=2.32.3" }, + { name = "tenacity", specifier = ">=9.1.2" }, + { name = "uiautomator2", specifier = ">=3.2.9" }, + { name = "uvicorn" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" }, +] + +[[package]] +name = "hf-xet" +version = "1.1.5" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ed/d4/7685999e85945ed0d7f0762b686ae7015035390de1161dcea9d5276c134c/hf_xet-1.1.5.tar.gz", hash = "sha256:69ebbcfd9ec44fdc2af73441619eeb06b94ee34511bbcf57cd423820090f5694" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/00/89/a1119eebe2836cb25758e7661d6410d3eae982e2b5e974bcc4d250be9012/hf_xet-1.1.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f52c2fa3635b8c37c7764d8796dfa72706cc4eded19d638331161e82b0792e23" }, + { url = "https://mirrors.aliyun.com/pypi/packages/de/5f/2c78e28f309396e71ec8e4e9304a6483dcbc36172b5cea8f291994163425/hf_xet-1.1.5-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:9fa6e3ee5d61912c4a113e0708eaaef987047616465ac7aa30f7121a48fc1af8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6d/2f/6cad7b5fe86b7652579346cb7f85156c11761df26435651cbba89376cd2c/hf_xet-1.1.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc874b5c843e642f45fd85cda1ce599e123308ad2901ead23d3510a47ff506d1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d0/54/0fcf2b619720a26fbb6cc941e89f2472a522cd963a776c089b189559447f/hf_xet-1.1.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dbba1660e5d810bd0ea77c511a99e9242d920790d0e63c0e4673ed36c4022d18" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/92/1d351ac6cef7c4ba8c85744d37ffbfac2d53d0a6c04d2cabeba614640a78/hf_xet-1.1.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ab34c4c3104133c495785d5d8bba3b1efc99de52c02e759cf711a91fd39d3a14" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c9/65/4b2ddb0e3e983f2508528eb4501288ae2f84963586fbdfae596836d5e57a/hf_xet-1.1.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:83088ecea236d5113de478acb2339f92c95b4fb0462acaa30621fac02f5a534a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f0/55/ef77a85ee443ae05a9e9cba1c9f0dd9241eb42da2aeba1dc50f51154c81a/hf_xet-1.1.5-cp37-abi3-win_amd64.whl", hash = "sha256:73e167d9807d166596b4b2f0b585c6d5bd84a26dea32843665a8b58f6edba245" }, +] + +[[package]] +name = "hmdriver2" +version = "1.4.4" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "lxml" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/20/dd/58578a0b8b9e28917f5c8ec559e41bbec46d5c3abd87aa2f32793d2e08f1/hmdriver2-1.4.4.tar.gz", hash = "sha256:ea2cd1f4b9ad9fe9a1dfa79f78c3d8f4be5a9e5ae805edae3ebee3f28e76d55a" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/2c/8b/d1e764ad756c4d9db6b1616c5a3ebd34abca98388cd378cd572a91f00066/hmdriver2-1.4.4-py3-none-any.whl", hash = "sha256:19ac55fb7f2a21bd60ceb4aba6d5f72cb5128a772ff3bef6bf6ce72277bf8bd1" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" }, +] + +[[package]] +name = "huggingface-hub" +version = "0.33.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/a4/01/bfe0534a63ce7a2285e90dbb33e8a5b815ff096d8f7743b135c256916589/huggingface_hub-0.33.1.tar.gz", hash = "sha256:589b634f979da3ea4b8bdb3d79f97f547840dc83715918daf0b64209c0844c7b" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/d0/fb/5307bd3612eb0f0e62c3a916ae531d3a31e58fb5c82b58e3ebf7fd6f47a1/huggingface_hub-0.33.1-py3-none-any.whl", hash = "sha256:ec8d7444628210c0ba27e968e3c4c973032d44dcea59ca0d78ef3f612196f095" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" }, +] + +[[package]] +name = "jiter" +version = "0.10.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/6d/b5/348b3313c58f5fbfb2194eb4d07e46a35748ba6e5b3b3046143f3040bafa/jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9c/4a/6a2397096162b21645162825f058d1709a02965606e537e3304b02742e9b/jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2a/85/1ce02cade7516b726dd88f59a4ee46914bf79d1676d1228ef2002ed2f1c9/jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/75/d0/bb6b4f209a77190ce10ea8d7e50bf3725fc16d3372d0a9f11985a2b23eff/jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a0/f5/a61787da9b8847a601e6827fbc42ecb12be2c925ced3252c8ffcb56afcaf/jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/12/e4/6f906272810a7b21406c760a53aadbe52e99ee070fc5c0cb191e316de30b/jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e2/ba/77013b0b8ba904bf3762f11e0129b8928bff7f978a81838dfcc958ad5728/jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/67/27/c62568e3ccb03368dbcc44a1ef3a423cb86778a4389e995125d3d1aaa0a4/jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c0/72/0d6b7e31fc17a8fdce76164884edef0698ba556b8eb0af9546ae1a06b91d/jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2f/09/bc1661fbbcbeb6244bd2904ff3a06f340aa77a2b94e5a7373fd165960ea3/jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1b/84/5a5d5400e9d4d54b8004c9673bbe4403928a00d28529ff35b19e9d176b19/jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9b/52/7ec47455e26f2d6e5f2ea4951a0652c06e5b995c291f723973ae9e724a65/jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49" }, +] + +[[package]] +name = "jsonschema" +version = "4.24.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.4.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af" }, +] + +[[package]] +name = "litellm" +version = "1.73.6" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "aiohttp" }, + { name = "click" }, + { name = "httpx" }, + { name = "importlib-metadata" }, + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "openai" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "tiktoken" }, + { name = "tokenizers" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/26/58/1a8ecf64b9a1f01dbddc123200f3156638c919fc3de683bd206235ccd33c/litellm-1.73.6.tar.gz", hash = "sha256:072ff9225aaa9caafe0fa9782df0ba4c93f893791cc55dd5ed218a401e788e88" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/81/be/3e9a3097c3b25bd1bc24073afdf5e6316120d8f4127e38bd6dcc3e193f55/litellm-1.73.6-py3-none-any.whl", hash = "sha256:98b3c7f436e6521e280f98faf9bad06c4c76d6a1678db2b370ffa175c206d288" }, +] + +[[package]] +name = "loguru" +version = "0.7.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c" }, +] + +[[package]] +name = "lxml" +version = "5.4.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/76/3d/14e82fc7c8fb1b7761f7e748fd47e2ec8276d137b6acfe5a4bb73853e08f/lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/f8/4c/d101ace719ca6a4ec043eb516fcfcb1b396a9fccc4fcd9ef593df34ba0d5/lxml-5.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/11/84/beddae0cec4dd9ddf46abf156f0af451c13019a0fa25d7445b655ba5ccb7/lxml-5.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d0/25/d0d93a4e763f0462cccd2b8a665bf1e4343dd788c76dcfefa289d46a38a9/lxml-5.4.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779" }, + { url = "https://mirrors.aliyun.com/pypi/packages/31/ce/1df18fb8f7946e7f3388af378b1f34fcf253b94b9feedb2cec5969da8012/lxml-5.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4e/62/f4a6c60ae7c40d43657f552f3045df05118636be1165b906d3423790447f/lxml-5.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9e/aa/04f00009e1e3a77838c7fc948f161b5d2d5de1136b2b81c712a263829ea4/lxml-5.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c9/1f/e0b2f61fa2404bf0f1fdf1898377e5bd1b74cc9b2cf2c6ba8509b8f27990/lxml-5.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/24/a2/8263f351b4ffe0ed3e32ea7b7830f845c795349034f912f490180d88a877/lxml-5.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/05/00/41db052f279995c0e35c79d0f0fc9f8122d5b5e9630139c592a0b58c71b4/lxml-5.4.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1d/be/ee99e6314cdef4587617d3b3b745f9356d9b7dd12a9663c5f3b5734b64ba/lxml-5.4.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ad/36/239820114bf1d71f38f12208b9c58dec033cbcf80101cde006b9bde5cffd/lxml-5.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d4/e1/1b795cc0b174efc9e13dbd078a9ff79a58728a033142bc6d70a1ee8fc34d/lxml-5.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20" }, + { url = "https://mirrors.aliyun.com/pypi/packages/72/48/3c198455ca108cec5ae3662ae8acd7fd99476812fd712bb17f1b39a0b589/lxml-5.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d6/10/5bf51858971c51ec96cfc13e800a9951f3fd501686f4c18d7d84fe2d6352/lxml-5.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2b/11/06710dd809205377da380546f91d2ac94bad9ff735a72b64ec029f706c85/lxml-5.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f5/b0/15b6217834b5e3a59ebf7f53125e08e318030e8cc0d7310355e6edac98ef/lxml-5.4.0-cp312-cp312-win32.whl", hash = "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/91/1e/05ddcb57ad2f3069101611bd5f5084157d90861a2ef460bf42f45cced944/lxml-5.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2" }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48" }, + { url = "https://mirrors.aliyun.com/pypi/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" }, +] + +[[package]] +name = "multidict" +version = "6.6.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/0e/a0/6b57988ea102da0623ea814160ed78d45a2645e4bbb499c2896d12833a70/multidict-6.6.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/07/7a/d1e92665b0850c6c0508f101f9cf0410c1afa24973e1115fe9c6a185ebf7/multidict-6.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/52/6f/dd104490e01be6ef8bf9573705d8572f8c2d2c561f06e3826b081d9e6591/multidict-6.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55" }, + { url = "https://mirrors.aliyun.com/pypi/packages/44/fe/06e0e01b1b0611e6581b7fd5a85b43dacc08b6cea3034f902f383b0873e5/multidict-6.6.3-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ce/71/4f0e558fb77696b89c233c1ee2d92f3e1d5459070a0e89153c9e9e804186/multidict-6.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e3/25/cca0e68228addad24903801ed1ab42e21307a1b4b6dd2cf63da5d3ae082a/multidict-6.6.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6e/a3/46f2d420d86bbcb8fe660b26a10a219871a0fbf4d43cb846a4031533f3e0/multidict-6.6.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9e/73/1c743542fe00794a2ec7466abd3f312ccb8fad8dff9f36d42e18fb1ec33e/multidict-6.6.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a4/11/6ec9dcbe2264b92778eeb85407d1df18812248bf3506a5a1754bc035db0c/multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9b/2b/631b1e2afeb5f1696846d747d36cda075bfdc0bc7245d6ba5c319278d6c4/multidict-6.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bf/0e/7e3b93f79efeb6111d3bf9a1a69e555ba1d07ad1c11bceb56b7310d0d7ee/multidict-6.6.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ad/9e/086846c1d6601948e7de556ee464a2d4c85e33883e749f46b9547d7b0704/multidict-6.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8c/7b/86ec260118e522f1a31550e87b23542294880c97cfbf6fb18cc67b044c66/multidict-6.6.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8c/bd/22ce8f47abb0be04692c9fc4638508b8340987b18691aa7775d927b73f72/multidict-6.6.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75" }, + { url = "https://mirrors.aliyun.com/pypi/packages/07/9c/91b7ac1691be95cd1f4a26e36a74b97cda6aa9820632d31aab4410f46ebd/multidict-6.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6f/5c/4d7adc739884f7a9fbe00d1eac8c034023ef8bad71f2ebe12823ca2e3649/multidict-6.6.3-cp312-cp312-win32.whl", hash = "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6a/a3/0fbc7afdf7cb1aa12a086b02959307848eb6bcc8f66fcb66c0cb57e2a2c1/multidict-6.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b8/95/8c825bd70ff9b02462dc18d1295dd08d3e9e4eb66856d292ffa62cfe1920/multidict-6.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d8/30/9aec301e9772b098c1f5c0ca0279237c9766d94b97802e9888010c64b0ed/multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a" }, +] + +[[package]] +name = "openai" +version = "1.93.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/e4/d7/e91c6a9cf71726420cddf539852ee4c29176ebb716a702d9118d0409fd8e/openai-1.93.0.tar.gz", hash = "sha256:988f31ade95e1ff0585af11cc5a64510225e4f5cd392698c675d0a9265b8e337" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/64/46/a10d9df4673df56f71201d129ba1cb19eaff3366d08c8664d61a7df52e65/openai-1.93.0-py3-none-any.whl", hash = "sha256:3d746fe5498f0dd72e0d9ab706f26c91c0f646bf7459e5629af8ba7c9dbdf090" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484" }, +] + +[[package]] +name = "pillow" +version = "11.2.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941" }, + { url = "https://mirrors.aliyun.com/pypi/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" }, +] + +[[package]] +name = "propcache" +version = "0.3.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/a6/16/43264e4a779dd8588c21a70f0709665ee8f611211bdd2c87d952cfa7c776/propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/a8/42/9ca01b0a6f48e81615dca4765a8f1dd2c057e0540f6116a27dc5ee01dfb6/propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10" }, + { url = "https://mirrors.aliyun.com/pypi/packages/af/6e/21293133beb550f9c901bbece755d582bfaf2176bee4774000bd4dd41884/propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0c/c8/0393a0a3a2b8760eb3bde3c147f62b20044f0ddac81e9d6ed7318ec0d852/propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615" }, + { url = "https://mirrors.aliyun.com/pypi/packages/37/2c/489afe311a690399d04a3e03b069225670c1d489eb7b044a566511c1c498/propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9d/ca/63b520d2f3d418c968bf596839ae26cf7f87bead026b6192d4da6a08c467/propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/11/60/1d0ed6fff455a028d678df30cc28dcee7af77fa2b0e6962ce1df95c9a2a9/propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/37/7c/54fd5301ef38505ab235d98827207176a5c9b2aa61939b10a460ca53e123/propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ee/1a/89a40e0846f5de05fdc6779883bf46ba980e6df4d2ff8fb02643de126592/propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5e/33/ca98368586c9566a6b8d5ef66e30484f8da84c0aac3f2d9aec6d31a11bd5/propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ba/11/ace870d0aafe443b33b2f0b7efdb872b7c3abd505bfb4890716ad7865e9d/propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5b/d2/86fd6f7adffcfc74b42c10a6b7db721d1d9ca1055c45d39a1a8f2a740a21/propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474" }, + { url = "https://mirrors.aliyun.com/pypi/packages/07/94/2d7d1e328f45ff34a0a284cf5a2847013701e24c2a53117e7c280a4316b3/propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b7/05/37ae63a0087677e90b1d14710e532ff104d44bc1efa3b3970fff99b891dc/propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a4/7c/3f539fcae630408d0bd8bf3208b9a647ccad10976eda62402a80adf8fc34/propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7c/d2/34b9eac8c35f79f8a962546b3e97e9d4b990c420ee66ac8255d5d9611648/propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/19/61/d582be5d226cf79071681d1b46b848d6cb03d7b70af7063e33a2787eaa03/propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f" }, +] + +[[package]] +name = "pydantic" +version = "2.11.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda" }, + { url = "https://mirrors.aliyun.com/pypi/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.10.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8" }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29" }, + { url = "https://mirrors.aliyun.com/pypi/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51" }, + { url = "https://mirrors.aliyun.com/pypi/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54" }, + { url = "https://mirrors.aliyun.com/pypi/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c" }, +] + +[[package]] +name = "retry2" +version = "0.9.5" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "decorator" }, +] +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/97/49/1cae6d9b932378cc75f902fa70648945b7ea7190cb0d09ff83b47de3e60a/retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55" }, +] + +[[package]] +name = "rich" +version = "14.0.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0" }, +] + +[[package]] +name = "rpds-py" +version = "0.25.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/8c/a6/60184b7fc00dd3ca80ac635dd5b8577d444c57e8e8742cecabfacb829921/rpds_py-0.25.1.tar.gz", hash = "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/7f/81/28ab0408391b1dc57393653b6a0cf2014cc282cc2909e4615e63e58262be/rpds_py-0.25.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2c/9a/7797f04cad0d5e56310e1238434f71fc6939d0bc517192a18bb99a72a95f/rpds_py-0.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/69/3c/93d2ef941b04898011e5d6eaa56a1acf46a3b4c9f4b3ad1bbcbafa0bee1f/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c1/57/ad0e31e928751dde8903a11102559628d24173428a0f85e25e187defb2c1/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda" }, + { url = "https://mirrors.aliyun.com/pypi/packages/16/ad/c0c652fa9bba778b4f54980a02962748479dc09632e1fd34e5282cf2556c/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2a/39/3e1839bc527e6fcf48d5fec4770070f872cdee6c6fbc9b259932f4e88a38/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7a/95/dd6b91cd4560da41df9d7030a038298a67d24f8ca38e150562644c829c48/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea" }, + { url = "https://mirrors.aliyun.com/pypi/packages/64/48/1be88a820e7494ce0a15c2d390ccb7c52212370badabf128e6a7bb4cb802/rpds_py-0.25.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65" }, + { url = "https://mirrors.aliyun.com/pypi/packages/cf/07/3e2a17927ef6d7720b9949ec1b37d1e963b829ad0387f7af18d923d5cfa5/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d2/e5/76cf010998deccc4f95305d827847e2eae9c568099c06b405cf96384762b/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/52/9a/df55efd84403736ba37a5a6377b70aad0fd1cb469a9109ee8a1e21299a1c/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ab/aa/dc3620dd8db84454aaf9374bd318f1aa02578bba5e567f5bf6b79492aca4/rpds_py-0.25.1-cp312-cp312-win32.whl", hash = "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a3/7f/7cef485269a50ed5b4e9bae145f512d2a111ca638ae70cc101f661b4defd/rpds_py-0.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192" }, + { url = "https://mirrors.aliyun.com/pypi/packages/99/f2/c2d64f6564f32af913bf5f3f7ae41c7c263c5ae4c4e8f1a17af8af66cd46/rpds_py-0.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728" }, +] + +[[package]] +name = "ruff" +version = "0.12.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/6c/3d/d9a195676f25d00dbfcf3cf95fdd4c685c497fcfa7e862a44ac5e4e96480/ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/74/b6/2098d0126d2d3318fd5bec3ad40d06c25d377d95749f7a0c5af17129b3b1/ruff-0.12.2-py3-none-linux_armv6l.whl", hash = "sha256:093ea2b221df1d2b8e7ad92fc6ffdca40a2cb10d8564477a987b44fd4008a7be" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b1/4b/5da0142033dbe155dc598cfb99262d8ee2449d76920ea92c4eeb9547c208/ruff-0.12.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:09e4cf27cc10f96b1708100fa851e0daf21767e9709e1649175355280e0d950e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3e/21/967b82550a503d7c5c5c127d11c935344b35e8c521f52915fc858fb3e473/ruff-0.12.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8ae64755b22f4ff85e9c52d1f82644abd0b6b6b6deedceb74bd71f35c24044cc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/33/91/00cff7102e2ec71a4890fb7ba1803f2cdb122d82787c7d7cf8041fe8cbc1/ruff-0.12.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb3a6b2db4d6e2c77e682f0b988d4d61aff06860158fdb413118ca133d57922" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9b/eb/928814daec4e1ba9115858adcda44a637fb9010618721937491e4e2283b8/ruff-0.12.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73448de992d05517170fc37169cbca857dfeaeaa8c2b9be494d7bcb0d36c8f4b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/50/fa/f15089bc20c40f4f72334f9145dde55ab2b680e51afb3b55422effbf2fb6/ruff-0.12.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b94317cbc2ae4a2771af641739f933934b03555e51515e6e021c64441532d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/43/9f/1f6f98f39f2b9302acc161a4a2187b1e3a97634fe918a8e731e591841cf4/ruff-0.12.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45fc42c3bf1d30d2008023a0a9a0cfb06bf9835b147f11fe0679f21ae86d34b1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d8/70/08991ac46e38ddd231c8f4fd05ef189b1b94be8883e8c0c146a025c20a19/ruff-0.12.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce48f675c394c37e958bf229fb5c1e843e20945a6d962cf3ea20b7a107dcd9f4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/88/a9/5a55266fec474acfd0a1c73285f19dd22461d95a538f29bba02edd07a5d9/ruff-0.12.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793d8859445ea47591272021a81391350205a4af65a9392401f418a95dfb75c9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/87/e5/0c270e458fc73c46c0d0f7cf970bb14786e5fdb88c87b5e423a4bd65232b/ruff-0.12.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932323db80484dda89153da3d8e58164d01d6da86857c79f1961934354992da" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b7/b6/45ab96070c9752af37f0be364d849ed70e9ccede07675b0ec4e3ef76b63b/ruff-0.12.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6aa7e623a3a11538108f61e859ebf016c4f14a7e6e4eba1980190cacb57714ce" }, + { url = "https://mirrors.aliyun.com/pypi/packages/86/91/26a6e6a424eb147cc7627eebae095cfa0b4b337a7c1c413c447c9ebb72fd/ruff-0.12.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2a4a20aeed74671b2def096bdf2eac610c7d8ffcbf4fb0e627c06947a1d7078d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f5/0c/9f344583465a61c8918a7cda604226e77b2c548daf8ef7c2bfccf2b37200/ruff-0.12.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:71a4c550195612f486c9d1f2b045a600aeba851b298c667807ae933478fcef04" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1c/b7/99c34ded8fb5f86c0280278fa89a0066c3760edc326e935ce0b1550d315d/ruff-0.12.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4987b8f4ceadf597c927beee65a5eaf994c6e2b631df963f86d8ad1bdea99342" }, + { url = "https://mirrors.aliyun.com/pypi/packages/51/de/8589fa724590faa057e5a6d171e7f2f6cffe3287406ef40e49c682c07d89/ruff-0.12.2-py3-none-win32.whl", hash = "sha256:369ffb69b70cd55b6c3fc453b9492d98aed98062db9fec828cdfd069555f5f1a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/94/47/8abf129102ae4c90cba0c2199a1a9b0fa896f6f806238d6f8c14448cc748/ruff-0.12.2-py3-none-win_amd64.whl", hash = "sha256:dca8a3b6d6dc9810ed8f328d406516bf4d660c00caeaef36eb831cf4871b0639" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e2/1f/72d2946e3cc7456bb837e88000eb3437e55f80db339c840c04015a11115d/ruff-0.12.2-py3-none-win_arm64.whl", hash = "sha256:48d6c6bfb4761df68bc05ae630e24f506755e702d4fb08f08460be778c7ccb12" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686" }, +] + +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" }, +] + +[[package]] +name = "starlette" +version = "0.46.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35" }, +] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138" }, +] + +[[package]] +name = "tiktoken" +version = "0.9.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ea/cf/756fedf6981e82897f2d570dd25fa597eb3f4459068ae0572d7e888cfd6f/tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/cf/e5/21ff33ecfa2101c1bb0f9b6df750553bd873b7fb532ce2cb276ff40b197f/tiktoken-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e88f121c1c22b726649ce67c089b90ddda8b9662545a8aeb03cfef15967ddd03" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8e/03/a95e7b4863ee9ceec1c55983e4cc9558bcfd8f4f80e19c4f8a99642f697d/tiktoken-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a6600660f2f72369acb13a57fb3e212434ed38b045fd8cc6cdd74947b4b5d210" }, + { url = "https://mirrors.aliyun.com/pypi/packages/40/10/1305bb02a561595088235a513ec73e50b32e74364fef4de519da69bc8010/tiktoken-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95e811743b5dfa74f4b227927ed86cbc57cad4df859cb3b643be797914e41794" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1b/40/da42522018ca496432ffd02793c3a72a739ac04c3794a4914570c9bb2925/tiktoken-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99376e1370d59bcf6935c933cb9ba64adc29033b7e73f5f7569f3aad86552b22" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5c/41/1e59dddaae270ba20187ceb8aa52c75b24ffc09f547233991d5fd822838b/tiktoken-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:badb947c32739fb6ddde173e14885fb3de4d32ab9d8c591cbd013c22b4c31dd2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5b/64/b16003419a1d7728d0d8c0d56a4c24325e7b10a21a9dd1fc0f7115c02f0a/tiktoken-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16" }, +] + +[[package]] +name = "tokenizers" +version = "0.21.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ab/2d/b0fce2b8201635f60e8c95990080f58461cc9ca3d5026de2e900f38a7f21/tokenizers-0.21.2.tar.gz", hash = "sha256:fdc7cffde3e2113ba0e6cc7318c40e3438a4d74bbc62bf04bcc63bdfb082ac77" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/1d/cc/2936e2d45ceb130a21d929743f1e9897514691bec123203e10837972296f/tokenizers-0.21.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:342b5dfb75009f2255ab8dec0041287260fed5ce00c323eb6bab639066fef8ec" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6c/e6/33f41f2cc7861faeba8988e7a77601407bf1d9d28fc79c5903f8f77df587/tokenizers-0.21.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:126df3205d6f3a93fea80c7a8a266a78c1bd8dd2fe043386bafdd7736a23e45f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/33/2b/1791eb329c07122a75b01035b1a3aa22ad139f3ce0ece1b059b506d9d9de/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a32cd81be21168bd0d6a0f0962d60177c447a1aa1b1e48fa6ec9fc728ee0b12" }, + { url = "https://mirrors.aliyun.com/pypi/packages/05/15/fd2d8104faa9f86ac68748e6f7ece0b5eb7983c7efc3a2c197cb98c99030/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8bd8999538c405133c2ab999b83b17c08b7fc1b48c1ada2469964605a709ef91" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a5/2e/53e8fd053e1f3ffbe579ca5f9546f35ac67cf0039ed357ad7ec57f5f5af0/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e9944e61239b083a41cf8fc42802f855e1dca0f499196df37a8ce219abac6eb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/00/15/79713359f4037aa8f4d1f06ffca35312ac83629da062670e8830917e2153/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:514cd43045c5d546f01142ff9c79a96ea69e4b5cda09e3027708cb2e6d5762ab" }, + { url = "https://mirrors.aliyun.com/pypi/packages/38/5f/959f3a8756fc9396aeb704292777b84f02a5c6f25c3fc3ba7530db5feb2c/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1b9405822527ec1e0f7d8d2fdb287a5730c3a6518189c968254a8441b21faae" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c5/74/f41a432a0733f61f3d21b288de6dfa78f7acff309c6f0f323b2833e9189f/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed9a4d51c395103ad24f8e7eb976811c57fbec2af9f133df471afcd922e5020" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3c/6a/bc220a11a17e5d07b0dfb3b5c628621d4dcc084bccd27cfaead659963016/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c41862df3d873665ec78b6be36fcc30a26e3d4902e9dd8608ed61d49a48bc19" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6c/bd/ac386d79c4ef20dc6f39c4706640c24823dca7ebb6f703bfe6b5f0292d88/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed21dc7e624e4220e21758b2e62893be7101453525e3d23264081c9ef9a6d00d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/63/7b/5440bf203b2a5358f074408f7f9c42884849cd9972879e10ee6b7a8c3b3d/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:0e73770507e65a0e0e2a1affd6b03c36e3bc4377bd10c9ccf51a82c77c0fe365" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a4/d2/faa1acac3f96a7427866e94ed4289949b2524f0c1878512516567d80563c/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:106746e8aa9014a12109e58d540ad5465b4c183768ea96c03cbc24c44d329958" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d8/a5/896e1ef0707212745ae9f37e84c7d50269411aef2e9ccd0de63623feecdf/tokenizers-0.21.2-cp39-abi3-win32.whl", hash = "sha256:cabda5a6d15d620b6dfe711e1af52205266d05b379ea85a8a301b3593c60e962" }, + { url = "https://mirrors.aliyun.com/pypi/packages/13/c3/cc2755ee10be859c4338c962a35b9a663788c0c0b50c0bdd8078fb6870cf/tokenizers-0.21.2-cp39-abi3-win_amd64.whl", hash = "sha256:58747bb898acdb1007f37a7bbe614346e98dc28708ffb66a3fd50ce169ac6c98" }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea" }, + { url = "https://mirrors.aliyun.com/pypi/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2" }, +] + +[[package]] +name = "typer" +version = "0.16.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855" }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51" }, +] + +[[package]] +name = "uiautomator2" +version = "3.3.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "adbutils" }, + { name = "lxml" }, + { name = "pillow" }, + { name = "requests" }, + { name = "retry2" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/6c/9c/83c3c7a6071133deced5d1ca4b3dc432b3f658d172f4908dd45beb6c2138/uiautomator2-3.3.3.tar.gz", hash = "sha256:15e5425dba73913979a234dae917f576f91a6862784af816042ab0ba4d94fa1e" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/0b/50/d41b28eb876ad7049215a0bf1e28725d9b900ca797c6bc78b72bb712307f/uiautomator2-3.3.3-py3-none-any.whl", hash = "sha256:8e1b0bdf788f15e1c81cf53817d066a908301c64f040aa4d7a8407e999f24328" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" }, +] + +[[package]] +name = "uvicorn" +version = "0.35.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a" }, +] + +[[package]] +name = "vivo-phone-test-project-vivo" +version = "0.3.1" +source = { virtual = "." } +dependencies = [ + { name = "glrocky-sdk" }, + { name = "uvicorn" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "glrocky-sdk", path = "glrocky_sdk-0.4.3-py3-none-any.whl" }, + { name = "uvicorn", specifier = ">=0.34.2" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "ruff", specifier = ">=0.12.2" }] + +[[package]] +name = "websocket-client" +version = "1.8.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526" }, +] + +[[package]] +name = "win32-setctime" +version = "1.2.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390" }, +] + +[[package]] +name = "yarl" +version = "1.20.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/3c/fb/efaa23fa4e45537b827620f04cf8f3cd658b76642205162e072703a5b963/yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/5f/9a/cb7fad7d73c69f296eda6815e4a2c7ed53fc70c2f136479a91c8e5fbdb6d/yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/67/38/688577a1cb1e656e3971fb66a3492501c5a5df56d99722e57c98249e5b8a/yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/50/ec/72991ae51febeb11a42813fc259f0d4c8e0507f2b74b5514618d8b640365/yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/99/da/4d798025490e89426e9f976702e5f9482005c548c579bdae792a4c37769e/yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1a/26/54a15c6a567aac1c61b18aa0f4b8aa2e285a52d547d1be8bf48abe2b3991/yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d6/95/9dcf2386cb875b234353b93ec43e40219e14900e046bf6ac118f94b1e353/yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16" }, + { url = "https://mirrors.aliyun.com/pypi/packages/91/b2/33a8750f6a4bc224242a635f5f2cff6d6ad5ba651f6edcccf721992c21a0/yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/98/28/3ab7acc5b51f4434b181b0cee8f1f4b77a65919700a355fb3617f9488874/yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/36/a3/f666894aa947a371724ec7cd2e5daa78ee8a777b21509b4252dd7bd15e29/yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f1/81/5f466427e09773c04219d3450d7a1256138a010b6c9f0af2d48565e9ad13/yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2e/e3/e4b0ad8403e97e6c9972dd587388940a032f030ebec196ab81a3b8e94d31/yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ac/99/b8a142e79eb86c926f9f06452eb13ecb1bb5713bd01dc0038faf5452e544/yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/34/f2/08ed34a4a506d82a1a3e5bab99ccd930a040f9b6449e9fd050320e45845c/yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/92/f8/9a3fbf0968eac704f681726eff595dce9b49c8a25cd92bf83df209668285/yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/af/85/9363f77bdfa1e4d690957cd39d192c4cacd1c58965df0470a4905253b54f/yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004" }, + { url = "https://mirrors.aliyun.com/pypi/packages/35/99/9918c8739ba271dcd935400cff8b32e3cd319eaf02fcd023d5dcd487a7c8/yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/eb/83/5d9092950565481b413b31a23e75dd3418ff0a277d6e0abf3729d4d1ce25/yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b4/2d/2345fce04cfd4bee161bf1e7d9cdc702e3e16109021035dbb24db654a622/yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e" }, +]