本次同步 09-12 至 09-28 的代码变更,主要内容: 新增功能 - 修改密码:后端新增 ChangePasswordRequest DTO 与UserController/UserService 对应接口,前端新增 ChangePasswordDialog 并在 Header 接入入口 - 文件预览组件重构:file-preview 目录拆分出 VideoPreview(支持 blobUrl 直传)、 ImagePreview、AudioPreview,index.tsx 统一调度各类型预览器 - 新增 my_ops 算子模块:markitdown_parser、mineru_pdf_parser、text_quality_evaluator - 新增 tools/minio-file-server MinIO 文件服务 功能增强 - 数据清洗:cleaning_task_service/scheduler/routes 重构, data_juicer_executor 与 wrapper 增强,OperatorTable/LogsTable/TaskDetail 同步调整 - 数据标注:annotation sync.py、project.py 接口与schema 更新 - 数据采集、算子市场、首页与菜单路由相关页面调整 - DataJuicer 算子接入(useOperatorOperations、dj_ops_schema) 结构调整 - deepflow/ 更名为 deep-flow/(419 个文件重命名) - 新增 helm 部署编排、GitHub Actions 之外的自建镜像构建脚本 未纳入本次提交 - scripts-backup/、runtime/python-executor-backup/、components_backup/(备份目录) - *.backup*、__pycache__ 产物 - zh_core_web_sm-3.8.0-py3-none-any.whl(46MB 构建产物) - DataX/(内嵌独立仓库,远程亦未收录其源码)
88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import pytest
|
|
|
|
from src.llms import llm
|
|
|
|
|
|
class DummyChatOpenAI:
|
|
def __init__(self, **kwargs):
|
|
self.kwargs = kwargs
|
|
|
|
def invoke(self, msg):
|
|
return f"Echo: {msg}"
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def patch_chat_openai(monkeypatch):
|
|
monkeypatch.setattr(llm, "ChatOpenAI", DummyChatOpenAI)
|
|
|
|
|
|
@pytest.fixture
|
|
def dummy_conf():
|
|
return {
|
|
"BASIC_MODEL": {"api_key": "test_key", "base_url": "http://test"},
|
|
"REASONING_MODEL": {"api_key": "reason_key"},
|
|
"VISION_MODEL": {"api_key": "vision_key"},
|
|
}
|
|
|
|
|
|
def test_get_env_llm_conf(monkeypatch):
|
|
# Clear any existing environment variables that might interfere
|
|
monkeypatch.delenv("BASIC_MODEL__API_KEY", raising=False)
|
|
monkeypatch.delenv("BASIC_MODEL__BASE_URL", raising=False)
|
|
monkeypatch.delenv("BASIC_MODEL__MODEL", raising=False)
|
|
|
|
monkeypatch.setenv("BASIC_MODEL__API_KEY", "env_key")
|
|
monkeypatch.setenv("BASIC_MODEL__BASE_URL", "http://env")
|
|
conf = llm._get_env_llm_conf("basic")
|
|
assert conf["api_key"] == "env_key"
|
|
assert conf["base_url"] == "http://env"
|
|
|
|
|
|
def test_create_llm_use_conf_merges_env(monkeypatch, dummy_conf):
|
|
# Clear any existing environment variables that might interfere
|
|
monkeypatch.delenv("BASIC_MODEL__BASE_URL", raising=False)
|
|
monkeypatch.delenv("BASIC_MODEL__MODEL", raising=False)
|
|
monkeypatch.setenv("BASIC_MODEL__API_KEY", "env_key")
|
|
result = llm._create_llm_use_conf("basic", dummy_conf)
|
|
assert isinstance(result, DummyChatOpenAI)
|
|
assert result.kwargs["api_key"] == "env_key"
|
|
assert result.kwargs["base_url"] == "http://test"
|
|
|
|
|
|
def test_create_llm_use_conf_invalid_type(monkeypatch, dummy_conf):
|
|
# Clear any existing environment variables that might interfere
|
|
monkeypatch.delenv("BASIC_MODEL__API_KEY", raising=False)
|
|
monkeypatch.delenv("BASIC_MODEL__BASE_URL", raising=False)
|
|
monkeypatch.delenv("BASIC_MODEL__MODEL", raising=False)
|
|
|
|
with pytest.raises(ValueError):
|
|
llm._create_llm_use_conf("unknown", dummy_conf)
|
|
|
|
|
|
def test_create_llm_use_conf_empty_conf(monkeypatch):
|
|
# Clear any existing environment variables that might interfere
|
|
monkeypatch.delenv("BASIC_MODEL__API_KEY", raising=False)
|
|
monkeypatch.delenv("BASIC_MODEL__BASE_URL", raising=False)
|
|
monkeypatch.delenv("BASIC_MODEL__MODEL", raising=False)
|
|
|
|
with pytest.raises(ValueError):
|
|
llm._create_llm_use_conf("basic", {})
|
|
|
|
|
|
def test_get_llm_by_type_caches(monkeypatch, dummy_conf):
|
|
called = {}
|
|
|
|
def fake_load_yaml_config(path):
|
|
called["called"] = True
|
|
return dummy_conf
|
|
|
|
monkeypatch.setattr(llm, "load_yaml_config", fake_load_yaml_config)
|
|
llm._llm_cache.clear()
|
|
inst1 = llm.get_llm_by_type("basic")
|
|
inst2 = llm.get_llm_by_type("basic")
|
|
assert inst1 is inst2
|
|
assert called["called"]
|