diff --git a/chatchat-server/README.md b/chatchat-server/README.md index 62ea0dc0..d2039dcc 100644 --- a/chatchat-server/README.md +++ b/chatchat-server/README.md @@ -1,49 +1,4 @@ - -### 加入开发 -#### 依赖管理:Poetry与env/dependency管理方法 -这个项目使用 Poetry 来管理依赖。 -> 注意:在安装Poetry之前,如果您使用Conda,请创建并激活一个新的Conda env(例如,`conda create-n chatchat python=3.9`) - -Install Poetry: [documentation on how to install it.](https://python-poetry.org/docs/#installing-with-pipx) - -> 注意: 如果您使用 Conda 或 Pyenv 作为您的环境/包管理器,在安装Poetry之后, -> 使用如下命令使Poetry使用virtualenv python environment (`poetry config virtualenvs.prefer-active-python true`) - -#### 本地开发环境安装 - -- 选择主项目目录 -```shell -cd chatchat -``` - -- 安装chatchat依赖(for running chatchat lint\tests): - -```shell -poetry install --with lint,test -``` - -#### 格式化和代码检查 -在提交PR之前,请在本地运行以下命令;CI系统也会进行检查。 - -##### 代码格式化 -本项目使用ruff进行代码格式化。 - -要对某个库进行格式化,请在相应的库目录下运行相同的命令: -```shell -cd {model-providers|chatchat|chatchat-server|chatchat-frontend} -make format -``` -此外,你可以使用format_diff命令仅对当前分支中与主分支相比已修改的文件进行格式化: - - -```shell - -make format_diff -``` -当你对项目的一部分进行了更改,并希望确保更改的部分格式正确,而不影响代码库的其他部分时,这个命令特别有用。 - - ### 开始使用 > 环境配置完成后,启动步骤为先启动chatchat-server,然后启动chatchat-frontend。 @@ -55,7 +10,8 @@ make format_diff pip install langchain-chatchat -U ``` - 复制配置文件 - +> 后面我们会提供一个一键初始化的脚本,现在您可以手动复制配置文件 +> 请注意:这个命令会清空数据库,如果您有重要数据,请备份 ```shell cd chatchat-server/ mkdir ~/.config/chatchat/ @@ -79,12 +35,9 @@ chatchat -a #### 源码启动chatchat-server -- 初始化依赖 -```shell -cd chatchat-server/chatchat -python copy_config_example.py -``` + - 初始化仓库 +> 请注意:这个命令会清空数据库,如果您有重要数据,请备份 ```shell cd chatchat-server/chatchat python init_database.py diff --git a/docs/contributing/README.md b/docs/contributing/README.md new file mode 100644 index 00000000..9946597c --- /dev/null +++ b/docs/contributing/README.md @@ -0,0 +1,30 @@ + +### 贡献指南 +各位开发者,chatchat由个人组织经过了不断地迭代和完善,作为一个不断进化的项目, +我们欢迎您的参与,无论是提交bug报告、功能请求、代码贡献、文档编写、测试、或者其他形式的贡献。 + +#### 贡献方式 +这里列出了一些您可以为chatchat做出贡献的方式: +- [Code](code.md): 帮助我们编写代码,修复bug,或者改进基础设施。 +- Documentation: 帮助我们编写文档,使chatchat更容易使用。 +- Discussions: 帮助回答用户的使用问题,讨论问题。 +当您的贡献被接受后,我们会将您的名字添加到贡献者列表中。 +在功能贡献达到2次以上,我们会考虑将您加入到chatchat的开发团队中。 + +#### Github Issue +我们需要跟踪功能请求与bug报告 + +目前我们有使用Issue默认模板来让用户更好的描述问题,但是目前这个大部分issue的用户可能依然选择只回复一句话, + +对于这样的情况我们需要告知用户如何更好的描述问题。在15天内没有回复的issue我们会关闭issue。 + +关于功能请求,备受关注的RAG话题我们会考虑加入到我们的开发计划中。 + +我们努力保持issue的更新,但是我们也需要您的帮助,如果您发现有问题没有得到及时回复,请在issue下@我们。 + +#### 寻求帮助 +我们尽量使开发者更容易上手,当您遇到问题时,请联系维护人员,我们会尽力帮助您。 + +类似的 diff、formatting、linting、testing等问题,如果您不确定如何解决,请随时联系我们, +很多时候规则校验会阻碍一些开发者,您的思路如果足够优秀,我们会考虑调整规则。 + diff --git a/docs/contributing/code.md b/docs/contributing/code.md new file mode 100644 index 00000000..138f3e6c --- /dev/null +++ b/docs/contributing/code.md @@ -0,0 +1,58 @@ + +### 代码贡献 +贡献此仓库的代码时,请查阅 ["fork and pull request"](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project) 流程,除非您是项目的维护者。请不要直接提交到主分支。 +在提交PR之前,请检查按照pull request模板的指导进行操作。注意,我们的CI系统会自动运行linting和测试,以确保您的代码符合我们的标准。 +更重要的是,我们需要保持良好的单元测试和文档,如果你做了如下操作: +- 添加新功能 +更新受影响的操作文档 +- 修复bug +尽可能添加一个单元测试,在tests/integration_tests或tests/unit_tests中 + + +#### 依赖管理:Poetry与env/dependency管理方法 +这个项目使用 Poetry 来管理依赖。 +> 注意:在安装Poetry之前,如果您使用Conda,请创建并激活一个新的Conda env(例如,`conda create-n chatchat python=3.9`) + +Install Poetry: [documentation on how to install it.](https://python-poetry.org/docs/#installing-with-pipx) + +> 注意: 如果您使用 Conda 或 Pyenv 作为您的环境/包管理器,在安装Poetry之后, +> 使用如下命令使Poetry使用virtualenv python environment (`poetry config virtualenvs.prefer-active-python true`) + +#### 本地开发环境安装 + +- 选择主项目目录 +```shell +cd chatchat +``` + +- 安装chatchat依赖(for running chatchat lint\tests): + +```shell +poetry install --with lint,test +``` +> Poetry install后会在你的site-packages安装一个chatchat-``.dist-info文件夹带有direct_url.json文件,这个文件指向你的开发环境 + +#### 格式化和代码检查 +在提交PR之前,请在本地运行以下命令;CI系统也会进行检查。 + +##### 代码格式化 +本项目使用ruff进行代码格式化。 + +##### 关于 + +要对某个库进行格式化,请在相应的库目录下运行相同的命令: +```shell +cd {model-providers|chatchat-server|chatchat-frontend} +make format +``` + +此外,你可以使用format_diff命令仅对当前分支中与主分支相比已修改的文件进行格式化: + + +```shell + +make format_diff +``` +当你对项目的一部分进行了更改,并希望确保更改的部分格式正确,而不影响代码库的其他部分时,这个命令特别有用。 + + diff --git a/docs/contributing/repo_structure.md b/docs/contributing/repo_structure.md new file mode 100644 index 00000000..285509f0 --- /dev/null +++ b/docs/contributing/repo_structure.md @@ -0,0 +1,36 @@ + +### 仓库结构 +如果您想要贡献代码,您需要了解仓库的结构。这将有助于您找到您想要的文件,以及了解如何将您的代码提交到仓库。 + +chatchat沿用了 monorepo的组织方式, 项目的代码库包含了多个包。 + +以下是可视化为树的结构: + + +```shell +. +├── docs # 文档 +├── chatchat-server # 服务端 +│ └── tests +│ ├── integration_tests # 集成测试 (每个包都有,为了简洁没有展示) +│ └── unit_tests # 单元测试 (每个包都有,为了简洁没有展示) +├── frontend # 前端 +└── model-providers # 模型平台 + +``` +根目录还包含以下文件: + +pyproject.toml: 用于构建文档和文档linting的依赖项,cookbook。 +Makefile: 包含用于构建,linting和文档和cookbook的快捷方式的文件。 + +根目录中还有其他文件,但它们的都应该是顾名思义的,请查看相应的文件夹以了解更多信息。 + +### 代码 + +代码库中的代码分为两个部分: + +- /chatchat-server目录包含chatchat服务端代码。 +- /frontend目录包含chatchat前端代码。 +- /model-providers目录包含对供应商模型转换的代码。 + +详细的 diff --git a/model-providers/README.md b/model-providers/README.md index 7dabe4d7..e180e297 100644 --- a/model-providers/README.md +++ b/model-providers/README.md @@ -1,50 +1,4 @@ -### 加入开发 -#### 依赖管理:Poetry与env/dependency管理方法 -这个项目使用 Poetry 来管理依赖。 -> 注意:在安装Poetry之前,如果您使用Conda,请创建并激活一个新的Conda env(例如,`conda create-n chatchat python=3.9`) - -Install Poetry: [documentation on how to install it.](https://python-poetry.org/docs/#installing-with-pipx) - -> 注意: 如果您使用 Conda 或 Pyenv 作为您的环境/包管理器,在安装Poetry之后, -> 使用如下命令使Poetry使用virtualenv python environment (`poetry config virtualenvs.prefer-active-python true`) - -#### 本地开发环境安装 - -- 选择主项目目录 -```shell -cd model-providers -``` - -- 安装model-providers依赖(for running model-providers lint\tests): - -```shell -poetry install --with lint,test -``` - -#### 格式化和代码检查 -在提交PR之前,请在本地运行以下命令;CI系统也会进行检查。 - -##### 代码格式化 -本项目使用ruff进行代码格式化。 - -要对某个库进行格式化,请在相应的库目录下运行相同的命令: -```shell -cd {model-providers|chatchat|chatchat-server|chatchat-frontend} -make format -``` - -此外,你可以使用format_diff命令仅对当前分支中与主分支相比已修改的文件进行格式化: - - -```shell - -make format_diff -``` -当你对项目的一部分进行了更改,并希望确保更改的部分格式正确,而不影响代码库的其他部分时,这个命令特别有用。 - - - ### 开始使用 当项目安装完成,配置这个`model_providers.yaml`文件,即可完成平台加载 @@ -54,9 +8,126 @@ model_providers包含了不同平台提供的 全局配置`provider_credential`, 不同平台所加载的配置有所不同,关于如何配置这个文件 请查看包`model_providers.core.model_runtime.model_providers`下方的平台 `yaml`文件 -例如`zhipuai.yaml`,这里给出了`provider_credential_schema`,其中包含了一个变量`api_key` +关于`schemas`信息详细描述设计,请查看 [README_CN.md](model_providers/core/model_runtime/README_CN.md) -要加载智谱平台,操作如下 + +### 相关平台配置说明 + + +#### 要加载xinference平台,操作如下 + +- 查看`schemas`信息 + +在[xinference.yaml](model_providers/core/model_runtime/model_providers/xinference/xinference.yaml)包含了如下信息, + `supported_model_types`描述支持了`llm`、`text-embedding`、`rerank` 模型类型 + `configurate_methods`描述包含变量 `customizable-model`表示这个是一个可以自定义模型的平台 + `model_credential_schema`描述包含了自定义模型需要的凭据信息 + +- 安装sdk +```shell +$ pip install xinference-client +``` + +- 编辑`model_providers.yaml` + +```yaml + + +xinference: + model_credential: + - model: 'chatglm3-6b' + model_type: 'llm' + model_credentials: + server_url: 'http://127.0.0.1:9997/' + model_uid: 'chatglm3-6b' + + +``` + +#### 要加载ollama平台,操作如下 + +- 查看`schemas`信息 + + 在[ollama.yaml](model_providers/core/model_runtime/model_providers/ollama/ollama.yaml)包含了如下信息, + `supported_model_types`描述支持了`llm`和`text-embedding`两种模型类型 + + `configurate_methods`描述包含变量 + - `customizable-model`表示这个是一个可以自定义模型的平台 + + `model_credential_schema`描述包含了自定义模型需要的凭据信息 +- 安装sdk +```shell +$ pip install openai +``` + +- 编辑`model_providers.yaml` + +```yaml + + +ollama: + model_credential: + - model: 'llama3' + model_type: 'llm' + model_credentials: + base_url: 'http://172.21.80.1:11434/v1' + +``` + + + +#### 要加载openai平台,操作如下 + +- 查看`schemas`信息 + + 在[openai.yaml](model_providers/core/model_runtime/model_providers/openai/openai.yaml)包含了如下信息, + `supported_model_types`描述支持了`llm`和`text-embedding`两种模型类型 + + `configurate_methods`描述包含变量 + - `predefined-model`表示这个是一个使用预定义模型的平台 + - `customizable-model`表示这个是一个可以自定义模型的平台 + + `model_credential_schema`描述包含了自定义模型需要的凭据信息 + `provider_credential_schema`描述包含平台的凭据信息 +- 安装sdk +```shell +$ pip install openai +``` + +- 编辑`model_providers.yaml` + +```yaml + +openai: + + model_credential: + - model: 'gpt-3.5-turbo' + model_type: 'llm' + model_credentials: + openai_api_key: 'sk-' + openai_organization: '' + openai_api_base: '' + - model: 'gpt-4' + model_type: 'llm' + model_credentials: + openai_api_key: 'sk-' + openai_organization: '' + openai_api_base: '' + + provider_credential: + openai_api_key: 'sk-' + openai_organization: '' + openai_api_base: '' +``` + +#### 要加载智谱平台,操作如下 + +- 查看`schemas`信息 + + 在[zhipuai.yaml](model_providers/core/model_runtime/model_providers/zhipuai/zhipuai.yaml)包含了如下信息, + `supported_model_types`描述支持了`llm`和`text-embedding`两种模型类型 + `configurate_methods`描述包含变量 `predefined-model`表示这个是一个使用预定义模型的平台 + `provider_credential_schema`描述包含平台的凭据信息 - 安装sdk ```shell @@ -73,8 +144,36 @@ zhipuai: api_key: 'd4fa0690b6dfa205204cae2e12aa6fb6.2' ``` -- `model-providers`可以运行pytest 测试 -```shell - poetry run pytest tests/server_unit_test/test_init_server.py -``` \ No newline at end of file + +#### 要加载deepseek平台,操作如下 + +- 查看`schemas`信息 + + 在[deepseek.yaml](model_providers/core/model_runtime/model_providers/deepseek/deepseek.yaml)包含了如下信息, + `supported_model_types`描述支持了`llm`和`text-embedding`两种模型类型 + `configurate_methods`描述包含变量 `predefined-model`表示这个是一个使用预定义模型的平台 + `provider_credential_schema`描述包含平台的凭据信息 + +- 安装sdk +```shell +$ pip install openai +``` + +- 编辑`model_providers.yaml` + +```yaml + + +deepseek: + model_credential: + - model: 'deepseek-chat' + model_type: 'llm' + model_credentials: + base_url: 'https://api.deepseek.com' + api_key: 'sk-dcb625fcbc1e497d80b7b9493b51d758' + + + + +``` diff --git a/model-providers/model_providers/bootstrap_web/openai_bootstrap_web.py b/model-providers/model_providers/bootstrap_web/openai_bootstrap_web.py index a0661ec6..593fe394 100644 --- a/model-providers/model_providers/bootstrap_web/openai_bootstrap_web.py +++ b/model-providers/model_providers/bootstrap_web/openai_bootstrap_web.py @@ -185,9 +185,17 @@ class RESTFulOpenAIBootstrapBaseWeb(OpenAIBootstrapBaseWeb): provider=provider, model_type=model_type ) ) + # 获取预定义模型 llm_models.extend( provider_model_bundle.model_type_instance.predefined_models() ) + # 获取自定义模型 + for model in provider_model_bundle.configuration.custom_configuration.models: + + llm_models.append(provider_model_bundle.model_type_instance.get_model_schema( + model=model.model, + credentials=model.credentials, + )) except Exception as e: logger.error( f"Error while fetching models for provider: {provider}, model_type: {model_type}" diff --git a/model-providers/model_providers/core/model_runtime/model_providers/deepseek/deepseek.yaml b/model-providers/model_providers/core/model_runtime/model_providers/deepseek/deepseek.yaml index 4d77678d..5cf3707c 100644 --- a/model-providers/model_providers/core/model_runtime/model_providers/deepseek/deepseek.yaml +++ b/model-providers/model_providers/core/model_runtime/model_providers/deepseek/deepseek.yaml @@ -15,6 +15,7 @@ help: supported_model_types: - llm configurate_methods: + - predefined-model - customizable-model model_credential_schema: model: @@ -42,3 +43,22 @@ model_credential_schema: placeholder: zh_Hans: 在此输入您的 API Base en_US: Enter your API Base +provider_credential_schema: + credential_form_schemas: + - variable: api_key + label: + en_US: API Key + type: secret-input + required: true + placeholder: + zh_Hans: 在此输入您的 API Key + en_US: Enter your API Key + - variable: base_url + label: + zh_Hans: API Base + en_US: API Base + type: text-input + required: false + placeholder: + zh_Hans: 在此输入您的 API Base + en_US: Enter your API Base diff --git a/model-providers/tests/conftest.py b/model-providers/tests/conftest.py index c3191f07..a4508b81 100644 --- a/model-providers/tests/conftest.py +++ b/model-providers/tests/conftest.py @@ -136,7 +136,7 @@ def init_server(logging_conf: dict, providers_file: str) -> None: yield f"http://127.0.0.1:20000" finally: print("") - # boot.destroy() + boot.destroy() except SystemExit: diff --git a/model-providers/tests/deepseek_providers_test/model_providers.yaml b/model-providers/tests/integration_tests/deepseek_providers_test/model_providers.yaml similarity index 100% rename from model-providers/tests/deepseek_providers_test/model_providers.yaml rename to model-providers/tests/integration_tests/deepseek_providers_test/model_providers.yaml diff --git a/model-providers/tests/deepseek_providers_test/test_deepseek_service.py b/model-providers/tests/integration_tests/deepseek_providers_test/test_deepseek_service.py similarity index 100% rename from model-providers/tests/deepseek_providers_test/test_deepseek_service.py rename to model-providers/tests/integration_tests/deepseek_providers_test/test_deepseek_service.py diff --git a/model-providers/tests/ollama_providers_test/model_providers.yaml b/model-providers/tests/integration_tests/ollama_providers_test/model_providers.yaml similarity index 100% rename from model-providers/tests/ollama_providers_test/model_providers.yaml rename to model-providers/tests/integration_tests/ollama_providers_test/model_providers.yaml diff --git a/model-providers/tests/ollama_providers_test/test_ollama_service.py b/model-providers/tests/integration_tests/ollama_providers_test/test_ollama_service.py similarity index 100% rename from model-providers/tests/ollama_providers_test/test_ollama_service.py rename to model-providers/tests/integration_tests/ollama_providers_test/test_ollama_service.py diff --git a/model-providers/tests/openai_providers_test/model_providers.yaml b/model-providers/tests/integration_tests/openai_providers_test/model_providers.yaml similarity index 100% rename from model-providers/tests/openai_providers_test/model_providers.yaml rename to model-providers/tests/integration_tests/openai_providers_test/model_providers.yaml diff --git a/model-providers/tests/openai_providers_test/test_ollama_service.py b/model-providers/tests/integration_tests/openai_providers_test/test_ollama_service.py similarity index 100% rename from model-providers/tests/openai_providers_test/test_ollama_service.py rename to model-providers/tests/integration_tests/openai_providers_test/test_ollama_service.py diff --git a/model-providers/tests/integration_tests/xinference_providers_test/model_providers.yaml b/model-providers/tests/integration_tests/xinference_providers_test/model_providers.yaml new file mode 100644 index 00000000..fc26fa5f --- /dev/null +++ b/model-providers/tests/integration_tests/xinference_providers_test/model_providers.yaml @@ -0,0 +1,15 @@ + + +xinference: + model_credential: + - model: 'chatglm3-6b' + model_type: 'llm' + model_credentials: + server_url: 'http://127.0.0.1:9997/' + model_uid: 'chatglm3-6b' + + - model: 'chatglm31-6b' + model_type: 'llm' + model_credentials: + server_url: 'http://127.0.0.1:9997/' + model_uid: 'chatglm3-6b' diff --git a/model-providers/tests/integration_tests/xinference_providers_test/test_service.py b/model-providers/tests/integration_tests/xinference_providers_test/test_service.py new file mode 100644 index 00000000..831406ff --- /dev/null +++ b/model-providers/tests/integration_tests/xinference_providers_test/test_service.py @@ -0,0 +1,37 @@ +from langchain.chains import LLMChain +from langchain_core.prompts import PromptTemplate +from langchain_openai import ChatOpenAI, OpenAIEmbeddings +import pytest +import logging + +logger = logging.getLogger(__name__) + + +@pytest.mark.requires("xinference_client") +def test_llm(init_server: str): + llm = ChatOpenAI( + + model_name="glm-4", + openai_api_key="YOUR_API_KEY", openai_api_base=f"{init_server}/xinference/v1") + template = """Question: {question} + + Answer: Let's think step by step.""" + + prompt = PromptTemplate.from_template(template) + + llm_chain = LLMChain(prompt=prompt, llm=llm) + responses = llm_chain.run("你好") + logger.info("\033[1;32m" + f"llm_chain: {responses}" + "\033[0m") + + +@pytest.mark.requires("xinference-client") +def test_embedding(init_server: str): + embeddings = OpenAIEmbeddings(model="text_embedding", + openai_api_key="YOUR_API_KEY", + openai_api_base=f"{init_server}/xinference/v1") + + text = "你好" + + query_result = embeddings.embed_query(text) + + logger.info("\033[1;32m" + f"embeddings: {query_result}" + "\033[0m") diff --git a/model-providers/tests/zhipuai_providers_test/model_providers.yaml b/model-providers/tests/integration_tests/zhipuai_providers_test/model_providers.yaml similarity index 100% rename from model-providers/tests/zhipuai_providers_test/model_providers.yaml rename to model-providers/tests/integration_tests/zhipuai_providers_test/model_providers.yaml diff --git a/model-providers/tests/zhipuai_providers_test/test_zhipuai_service.py b/model-providers/tests/integration_tests/zhipuai_providers_test/test_zhipuai_service.py similarity index 100% rename from model-providers/tests/zhipuai_providers_test/test_zhipuai_service.py rename to model-providers/tests/integration_tests/zhipuai_providers_test/test_zhipuai_service.py diff --git a/model-providers/tests/unit_tests/deepseek/test_provider_manager_models.py b/model-providers/tests/unit_tests/deepseek/test_provider_manager_models.py index 109fd37b..f28e8ba4 100644 --- a/model-providers/tests/unit_tests/deepseek/test_provider_manager_models.py +++ b/model-providers/tests/unit_tests/deepseek/test_provider_manager_models.py @@ -1,18 +1,19 @@ import asyncio import logging +from typing import List import pytest from omegaconf import OmegaConf from model_providers import BootstrapWebBuilder, _to_custom_provide_configuration from model_providers.core.model_manager import ModelManager -from model_providers.core.model_runtime.entities.model_entities import ModelType +from model_providers.core.model_runtime.entities.model_entities import ModelType, AIModelEntity from model_providers.core.provider_manager import ProviderManager logger = logging.getLogger(__name__) -def test_ollama_provider_manager_models(logging_conf: dict, providers_file: str) -> None: +def test_provider_manager_models(logging_conf: dict, providers_file: str) -> None: logging.config.dictConfig(logging_conf) # type: ignore # 读取配置文件 cfg = OmegaConf.load( @@ -32,8 +33,17 @@ def test_ollama_provider_manager_models(logging_conf: dict, providers_file: str) provider_model_bundle_llm = provider_manager.get_provider_model_bundle( provider="deepseek", model_type=ModelType.LLM ) - predefined_models = ( + llm_models: List[AIModelEntity] = [] + for model in provider_model_bundle_llm.configuration.custom_configuration.models: + + llm_models.append(provider_model_bundle_llm.model_type_instance.get_model_schema( + model=model.model, + credentials=model.credentials, + )) + + # 获取预定义模型 + llm_models.extend( provider_model_bundle_llm.model_type_instance.predefined_models() ) - logger.info(f"predefined_models: {predefined_models}") + logger.info(f"predefined_models: {llm_models}") diff --git a/model-providers/tests/unit_tests/ollama/test_provider_manager_models.py b/model-providers/tests/unit_tests/ollama/test_provider_manager_models.py index e60d082d..6d307698 100644 --- a/model-providers/tests/unit_tests/ollama/test_provider_manager_models.py +++ b/model-providers/tests/unit_tests/ollama/test_provider_manager_models.py @@ -12,7 +12,7 @@ from model_providers.core.provider_manager import ProviderManager logger = logging.getLogger(__name__) -def test_ollama_provider_manager_models(logging_conf: dict, providers_file: str) -> None: +def test_provider_manager_models(logging_conf: dict, providers_file: str) -> None: logging.config.dictConfig(logging_conf) # type: ignore # 读取配置文件 cfg = OmegaConf.load( @@ -32,11 +32,18 @@ def test_ollama_provider_manager_models(logging_conf: dict, providers_file: str) provider_model_bundle_llm = provider_manager.get_provider_model_bundle( provider="ollama", model_type=ModelType.LLM ) - provider_model_bundle_emb = provider_manager.get_provider_model_bundle( - provider="ollama", model_type=ModelType.TEXT_EMBEDDING - ) - predefined_models = ( + llm_models: List[AIModelEntity] = [] + for model in provider_model_bundle_llm.configuration.custom_configuration.models: + + llm_models.append(provider_model_bundle_llm.model_type_instance.get_model_schema( + model=model.model, + credentials=model.credentials, + )) + + # 获取预定义模型 + llm_models.extend( provider_model_bundle_llm.model_type_instance.predefined_models() ) - logger.info(f"predefined_models: {predefined_models}") + logger.info(f"predefined_models: {llm_models}") + diff --git a/model-providers/tests/unit_tests/model_providers.yaml b/model-providers/tests/unit_tests/openai/model_providers.yaml similarity index 62% rename from model-providers/tests/unit_tests/model_providers.yaml rename to model-providers/tests/unit_tests/openai/model_providers.yaml index 908883c7..4b7234d5 100644 --- a/model-providers/tests/unit_tests/model_providers.yaml +++ b/model-providers/tests/unit_tests/openai/model_providers.yaml @@ -17,17 +17,3 @@ openai: openai_api_key: 'sk-' openai_organization: '' openai_api_base: '' - -xinference: - model_credential: - - model: 'chatglm3-6b' - model_type: 'llm' - model_credentials: - server_url: 'http://127.0.0.1:9997/' - model_uid: 'chatglm3-6b' - - -zhipuai: - - provider_credential: - api_key: 'd4fa0690b6dfa205204cae2e12aa6fb6.1' \ No newline at end of file diff --git a/model-providers/tests/unit_tests/test_provider_manager_models.py b/model-providers/tests/unit_tests/openai/test_provider_manager_models.py similarity index 72% rename from model-providers/tests/unit_tests/test_provider_manager_models.py rename to model-providers/tests/unit_tests/openai/test_provider_manager_models.py index 9416fb9f..43c0a3d2 100644 --- a/model-providers/tests/unit_tests/test_provider_manager_models.py +++ b/model-providers/tests/unit_tests/openai/test_provider_manager_models.py @@ -32,11 +32,17 @@ def test_provider_manager_models(logging_conf: dict, providers_file: str) -> Non provider_model_bundle_llm = provider_manager.get_provider_model_bundle( provider="openai", model_type=ModelType.LLM ) - provider_model_bundle_emb = provider_manager.get_provider_model_bundle( - provider="openai", model_type=ModelType.TEXT_EMBEDDING - ) - predefined_models = ( - provider_model_bundle_emb.model_type_instance.predefined_models() + llm_models: List[AIModelEntity] = [] + for model in provider_model_bundle_llm.configuration.custom_configuration.models: + + llm_models.append(provider_model_bundle_llm.model_type_instance.get_model_schema( + model=model.model, + credentials=model.credentials, + )) + + # 获取预定义模型 + llm_models.extend( + provider_model_bundle_llm.model_type_instance.predefined_models() ) - logger.info(f"predefined_models: {predefined_models}") + logger.info(f"predefined_models: {llm_models}") diff --git a/model-providers/tests/unit_tests/xinference/model_providers.yaml b/model-providers/tests/unit_tests/xinference/model_providers.yaml new file mode 100644 index 00000000..95209dd4 --- /dev/null +++ b/model-providers/tests/unit_tests/xinference/model_providers.yaml @@ -0,0 +1,9 @@ + + +xinference: + model_credential: + - model: 'chatglm3-6b' + model_type: 'llm' + model_credentials: + server_url: 'http://127.0.0.1:9997/' + model_uid: 'chatglm3-6b' diff --git a/model-providers/tests/unit_tests/xinference/test_provider_manager_models.py b/model-providers/tests/unit_tests/xinference/test_provider_manager_models.py new file mode 100644 index 00000000..a8c404ef --- /dev/null +++ b/model-providers/tests/unit_tests/xinference/test_provider_manager_models.py @@ -0,0 +1,48 @@ +import asyncio +import logging + +import pytest +from omegaconf import OmegaConf + +from model_providers import BootstrapWebBuilder, _to_custom_provide_configuration +from model_providers.core.model_manager import ModelManager +from model_providers.core.model_runtime.entities.model_entities import ModelType +from model_providers.core.provider_manager import ProviderManager + +logger = logging.getLogger(__name__) + + +def test_provider_manager_models(logging_conf: dict, providers_file: str) -> None: + logging.config.dictConfig(logging_conf) # type: ignore + # 读取配置文件 + cfg = OmegaConf.load( + providers_file + ) + # 转换配置文件 + ( + provider_name_to_provider_records_dict, + provider_name_to_provider_model_records_dict, + ) = _to_custom_provide_configuration(cfg) + # 创建模型管理器 + provider_manager = ProviderManager( + provider_name_to_provider_records_dict=provider_name_to_provider_records_dict, + provider_name_to_provider_model_records_dict=provider_name_to_provider_model_records_dict, + ) + + provider_model_bundle_llm = provider_manager.get_provider_model_bundle( + provider="xinference", model_type=ModelType.LLM + ) + llm_models: List[AIModelEntity] = [] + for model in provider_model_bundle_llm.configuration.custom_configuration.models: + + llm_models.append(provider_model_bundle_llm.model_type_instance.get_model_schema( + model=model.model, + credentials=model.credentials, + )) + + # 获取预定义模型 + llm_models.extend( + provider_model_bundle_llm.model_type_instance.predefined_models() + ) + + logger.info(f"predefined_models: {llm_models}") diff --git a/model-providers/tests/unit_tests/zhipuai/model_providers.yaml b/model-providers/tests/unit_tests/zhipuai/model_providers.yaml new file mode 100644 index 00000000..4f90212f --- /dev/null +++ b/model-providers/tests/unit_tests/zhipuai/model_providers.yaml @@ -0,0 +1,6 @@ + + +zhipuai: + + provider_credential: + api_key: 'd4fa0690b6dfa205204cae2e12aa6fb6.1' diff --git a/model-providers/tests/unit_tests/zhipuai/test_provider_manager_models.py b/model-providers/tests/unit_tests/zhipuai/test_provider_manager_models.py new file mode 100644 index 00000000..23ba6f62 --- /dev/null +++ b/model-providers/tests/unit_tests/zhipuai/test_provider_manager_models.py @@ -0,0 +1,48 @@ +import asyncio +import logging + +import pytest +from omegaconf import OmegaConf + +from model_providers import BootstrapWebBuilder, _to_custom_provide_configuration +from model_providers.core.model_manager import ModelManager +from model_providers.core.model_runtime.entities.model_entities import ModelType +from model_providers.core.provider_manager import ProviderManager + +logger = logging.getLogger(__name__) + + +def test_provider_manager_models(logging_conf: dict, providers_file: str) -> None: + logging.config.dictConfig(logging_conf) # type: ignore + # 读取配置文件 + cfg = OmegaConf.load( + providers_file + ) + # 转换配置文件 + ( + provider_name_to_provider_records_dict, + provider_name_to_provider_model_records_dict, + ) = _to_custom_provide_configuration(cfg) + # 创建模型管理器 + provider_manager = ProviderManager( + provider_name_to_provider_records_dict=provider_name_to_provider_records_dict, + provider_name_to_provider_model_records_dict=provider_name_to_provider_model_records_dict, + ) + + provider_model_bundle_llm = provider_manager.get_provider_model_bundle( + provider="zhipuai", model_type=ModelType.LLM + ) + llm_models: List[AIModelEntity] = [] + for model in provider_model_bundle_llm.configuration.custom_configuration.models: + + llm_models.append(provider_model_bundle_llm.model_type_instance.get_model_schema( + model=model.model, + credentials=model.credentials, + )) + + # 获取预定义模型 + llm_models.extend( + provider_model_bundle_llm.model_type_instance.predefined_models() + ) + + logger.info(f"predefined_models: {llm_models}")