From 742be06ea9d8853534781460d91e79e3169ae0a6 Mon Sep 17 00:00:00 2001 From: Yeuoly <45712896+Yeuoly@users.noreply.github.com> Date: Fri, 15 Mar 2024 11:41:51 +0800 Subject: [PATCH 01/10] Fix/localai (#2840) --- .../model_providers/localai/llm/llm.py | 14 +++++++--- .../model_providers/localai/localai.yaml | 9 ++++++ .../localai/text_embedding/text_embedding.py | 28 +++++++++++++++++-- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/api/core/model_runtime/model_providers/localai/llm/llm.py b/api/core/model_runtime/model_providers/localai/llm/llm.py index 3c805682f3..161e65302f 100644 --- a/api/core/model_runtime/model_providers/localai/llm/llm.py +++ b/api/core/model_runtime/model_providers/localai/llm/llm.py @@ -1,6 +1,5 @@ from collections.abc import Generator from typing import cast -from urllib.parse import urljoin from httpx import Timeout from openai import ( @@ -19,6 +18,7 @@ from openai import ( from openai.types.chat import ChatCompletion, ChatCompletionChunk from openai.types.chat.chat_completion_message import FunctionCall from openai.types.completion import Completion +from yarl import URL from core.model_runtime.entities.common_entities import I18nObject from core.model_runtime.entities.llm_entities import LLMMode, LLMResult, LLMResultChunk, LLMResultChunkDelta @@ -181,7 +181,7 @@ class LocalAILarguageModel(LargeLanguageModel): UserPromptMessage(content='ping') ], model_parameters={ 'max_tokens': 10, - }, stop=[]) + }, stop=[], stream=False) except Exception as ex: raise CredentialsValidateFailedError(f'Invalid credentials {str(ex)}') @@ -227,6 +227,12 @@ class LocalAILarguageModel(LargeLanguageModel): ) ] + model_properties = { + ModelPropertyKey.MODE: completion_model, + } if completion_model else {} + + model_properties[ModelPropertyKey.CONTEXT_SIZE] = int(credentials.get('context_size', '2048')) + entity = AIModelEntity( model=model, label=I18nObject( @@ -234,7 +240,7 @@ class LocalAILarguageModel(LargeLanguageModel): ), fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, model_type=ModelType.LLM, - model_properties={ ModelPropertyKey.MODE: completion_model } if completion_model else {}, + model_properties=model_properties, parameter_rules=rules ) @@ -319,7 +325,7 @@ class LocalAILarguageModel(LargeLanguageModel): client_kwargs = { "timeout": Timeout(315.0, read=300.0, write=10.0, connect=5.0), "api_key": "1", - "base_url": urljoin(credentials['server_url'], 'v1'), + "base_url": str(URL(credentials['server_url']) / 'v1'), } return client_kwargs diff --git a/api/core/model_runtime/model_providers/localai/localai.yaml b/api/core/model_runtime/model_providers/localai/localai.yaml index e4b625d171..a870914632 100644 --- a/api/core/model_runtime/model_providers/localai/localai.yaml +++ b/api/core/model_runtime/model_providers/localai/localai.yaml @@ -56,3 +56,12 @@ model_credential_schema: placeholder: zh_Hans: 在此输入LocalAI的服务器地址,如 http://192.168.1.100:8080 en_US: Enter the url of your LocalAI, e.g. http://192.168.1.100:8080 + - variable: context_size + label: + zh_Hans: 上下文大小 + en_US: Context size + placeholder: + zh_Hans: 输入上下文大小 + en_US: Enter context size + required: false + type: text-input diff --git a/api/core/model_runtime/model_providers/localai/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/localai/text_embedding/text_embedding.py index c95007d271..954c9d10f2 100644 --- a/api/core/model_runtime/model_providers/localai/text_embedding/text_embedding.py +++ b/api/core/model_runtime/model_providers/localai/text_embedding/text_embedding.py @@ -1,11 +1,12 @@ import time from json import JSONDecodeError, dumps -from os.path import join from typing import Optional from requests import post +from yarl import URL -from core.model_runtime.entities.model_entities import PriceType +from core.model_runtime.entities.common_entities import I18nObject +from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelPropertyKey, ModelType, PriceType from core.model_runtime.entities.text_embedding_entities import EmbeddingUsage, TextEmbeddingResult from core.model_runtime.errors.invoke import ( InvokeAuthorizationError, @@ -57,7 +58,7 @@ class LocalAITextEmbeddingModel(TextEmbeddingModel): } try: - response = post(join(url, 'embeddings'), headers=headers, data=dumps(data), timeout=10) + response = post(str(URL(url) / 'embeddings'), headers=headers, data=dumps(data), timeout=10) except Exception as e: raise InvokeConnectionError(str(e)) @@ -113,6 +114,27 @@ class LocalAITextEmbeddingModel(TextEmbeddingModel): # use GPT2Tokenizer to get num tokens num_tokens += self._get_num_tokens_by_gpt2(text) return num_tokens + + def _get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity | None: + """ + Get customizable model schema + + :param model: model name + :param credentials: model credentials + :return: model schema + """ + return AIModelEntity( + model=model, + label=I18nObject(zh_Hans=model, en_US=model), + model_type=ModelType.TEXT_EMBEDDING, + features=[], + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_properties={ + ModelPropertyKey.CONTEXT_SIZE: int(credentials.get('context_size', '512')), + ModelPropertyKey.MAX_CHUNKS: 1, + }, + parameter_rules=[] + ) def validate_credentials(self, model: str, credentials: dict) -> None: """ From f29280ba5c4be690d34a797cd3a0f552fffcad4f Mon Sep 17 00:00:00 2001 From: Yeuoly <45712896+Yeuoly@users.noreply.github.com> Date: Fri, 15 Mar 2024 11:44:24 +0800 Subject: [PATCH 02/10] Fix/compatible to old tool config (#2839) --- api/controllers/console/app/model_config.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/controllers/console/app/model_config.py b/api/controllers/console/app/model_config.py index 436f8c1447..2095bb6bea 100644 --- a/api/controllers/console/app/model_config.py +++ b/api/controllers/console/app/model_config.py @@ -52,6 +52,9 @@ class ModelConfigResource(Resource): masked_parameter_map = {} tool_map = {} for tool in agent_mode.get('tools') or []: + if not isinstance(tool, dict) or len(tool.keys()) <= 3: + continue + agent_tool_entity = AgentToolEntity(**tool) # get tool try: From 156345cb4b16a7922eab03ca4a06a6cf6de99fc3 Mon Sep 17 00:00:00 2001 From: crazywoola <100913391+crazywoola@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:05:35 +0800 Subject: [PATCH 03/10] fix: use supported languages only for install form (#2844) --- web/app/activate/activateForm.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/app/activate/activateForm.tsx b/web/app/activate/activateForm.tsx index be3706037b..eaaa86988c 100644 --- a/web/app/activate/activateForm.tsx +++ b/web/app/activate/activateForm.tsx @@ -171,8 +171,8 @@ const ActivateForm = () => {
item.supported)} onSelect={(item) => { setLanguage(item.value as string) }} From 8a4015722dc59812344b02d6dfbfebfcfb348073 Mon Sep 17 00:00:00 2001 From: Rozstone <42225395+wststone@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:19:06 +0800 Subject: [PATCH 04/10] prevent auto scrolling down to bottom when user already scrolled up (#2813) --- web/app/components/base/chat/chat/index.tsx | 28 +++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/web/app/components/base/chat/chat/index.tsx b/web/app/components/base/chat/chat/index.tsx index 2f3ae50131..2e46f1e869 100644 --- a/web/app/components/base/chat/chat/index.tsx +++ b/web/app/components/base/chat/chat/index.tsx @@ -4,6 +4,7 @@ import type { } from 'react' import { memo, + useCallback, useEffect, useRef, } from 'react' @@ -76,19 +77,20 @@ const Chat: FC = ({ const chatContainerInnerRef = useRef(null) const chatFooterRef = useRef(null) const chatFooterInnerRef = useRef(null) + const userScrolledRef = useRef(false) - const handleScrolltoBottom = () => { - if (chatContainerRef.current) + const handleScrolltoBottom = useCallback(() => { + if (chatContainerRef.current && !userScrolledRef.current) chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight - } + }, []) - const handleWindowResize = () => { + const handleWindowResize = useCallback(() => { if (chatContainerRef.current && chatFooterRef.current) chatFooterRef.current.style.width = `${chatContainerRef.current.clientWidth}px` if (chatContainerInnerRef.current && chatFooterInnerRef.current) chatFooterInnerRef.current.style.width = `${chatContainerInnerRef.current.clientWidth}px` - } + }, []) useThrottleEffect(() => { handleScrolltoBottom() @@ -98,7 +100,7 @@ const Chat: FC = ({ useEffect(() => { window.addEventListener('resize', debounce(handleWindowResize)) return () => window.removeEventListener('resize', handleWindowResize) - }, []) + }, [handleWindowResize]) useEffect(() => { if (chatFooterRef.current && chatContainerRef.current) { @@ -117,7 +119,19 @@ const Chat: FC = ({ resizeObserver.disconnect() } } - }, [chatFooterRef, chatContainerRef]) + }, [handleScrolltoBottom]) + + useEffect(() => { + const chatContainer = chatContainerRef.current + if (chatContainer) { + const setUserScrolled = () => { + if (chatContainer) + userScrolledRef.current = chatContainer.scrollHeight - chatContainer.scrollTop >= chatContainer.clientHeight + 300 + } + chatContainer.addEventListener('scroll', setUserScrolled) + return () => chatContainer.removeEventListener('scroll', setUserScrolled) + } + }, []) const hasTryToAsk = config?.suggested_questions_after_answer?.enabled && !!suggestedQuestions?.length && onSend From cef16862da3b8f61a7bff235c3f86345c7811cab Mon Sep 17 00:00:00 2001 From: Yeuoly <45712896+Yeuoly@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:02:52 +0800 Subject: [PATCH 05/10] fix: charts encoding (#2848) --- .../tools/provider/builtin/chart/chart.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/api/core/tools/provider/builtin/chart/chart.py b/api/core/tools/provider/builtin/chart/chart.py index 813b4abcf2..f5e42e766d 100644 --- a/api/core/tools/provider/builtin/chart/chart.py +++ b/api/core/tools/provider/builtin/chart/chart.py @@ -1,4 +1,6 @@ import matplotlib.pyplot as plt +from fontTools.ttLib import TTFont +from matplotlib.font_manager import findSystemFonts from core.tools.errors import ToolProviderCredentialValidationError from core.tools.provider.builtin.chart.tools.line import LinearChartTool @@ -6,6 +8,37 @@ from core.tools.provider.builtin_tool_provider import BuiltinToolProviderControl # use a business theme plt.style.use('seaborn-v0_8-darkgrid') +plt.rcParams['axes.unicode_minus'] = False + +def init_fonts(): + fonts = findSystemFonts() + + popular_unicode_fonts = [ + 'Arial Unicode MS', 'DejaVu Sans', 'DejaVu Sans Mono', 'DejaVu Serif', 'FreeMono', 'FreeSans', 'FreeSerif', + 'Liberation Mono', 'Liberation Sans', 'Liberation Serif', 'Noto Mono', 'Noto Sans', 'Noto Serif', 'Open Sans', + 'Roboto', 'Source Code Pro', 'Source Sans Pro', 'Source Serif Pro', 'Ubuntu', 'Ubuntu Mono' + ] + + supported_fonts = [] + + for font_path in fonts: + try: + font = TTFont(font_path) + # get family name + family_name = font['name'].getName(1, 3, 1).toUnicode() + if family_name in popular_unicode_fonts: + supported_fonts.append(family_name) + except: + pass + + plt.rcParams['font.family'] = 'sans-serif' + # sort by order of popular_unicode_fonts + for font in popular_unicode_fonts: + if font in supported_fonts: + plt.rcParams['font.sans-serif'] = font + break + +init_fonts() class ChartProvider(BuiltinToolProviderController): def _validate_credentials(self, credentials: dict) -> None: From 056331981e26ba647f660145824f797be6b14bff Mon Sep 17 00:00:00 2001 From: crazywoola <100913391+crazywoola@users.noreply.github.com> Date: Fri, 15 Mar 2024 18:17:43 +0800 Subject: [PATCH 06/10] fix: api doc duplicate symbols (#2853) --- web/app/components/develop/template/template.zh.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/web/app/components/develop/template/template.zh.mdx b/web/app/components/develop/template/template.zh.mdx index 1b83c6a1c3..6fd1cddc16 100644 --- a/web/app/components/develop/template/template.zh.mdx +++ b/web/app/components/develop/template/template.zh.mdx @@ -153,8 +153,6 @@ import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx' "user": "abc-123" }' ``` - ``` - ### blocking From 15a6d949532834e12425c6f11e216c4c5e8c9d58 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 17 Mar 2024 14:20:34 +0800 Subject: [PATCH 07/10] Refactor: Streamline the build-push and deploy-dev workflow (#2852) --- .../{build-api-image.yml => build-push.yml} | 44 +++++++------- .github/workflows/build-web-image.yml | 60 ------------------- .github/workflows/deploy-dev.yml | 24 ++++++++ Makefile | 43 +++++++++++++ 4 files changed, 91 insertions(+), 80 deletions(-) rename .github/workflows/{build-api-image.yml => build-push.yml} (56%) delete mode 100644 .github/workflows/build-web-image.yml create mode 100644 .github/workflows/deploy-dev.yml create mode 100644 Makefile diff --git a/.github/workflows/build-api-image.yml b/.github/workflows/build-push.yml similarity index 56% rename from .github/workflows/build-api-image.yml rename to .github/workflows/build-push.yml index 0eb9e95b61..048f4cd942 100644 --- a/.github/workflows/build-api-image.yml +++ b/.github/workflows/build-push.yml @@ -1,17 +1,32 @@ -name: Build and Push API Image +name: Build and Push API & Web on: push: branches: - - 'main' - - 'deploy/dev' + - "main" + - "deploy/dev" release: - types: [ published ] + types: [published] + +env: + DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + DIFY_WEB_IMAGE_NAME: ${{ vars.DIFY_WEB_IMAGE_NAME || 'langgenius/dify-web' }} + DIFY_API_IMAGE_NAME: ${{ vars.DIFY_API_IMAGE_NAME || 'langgenius/dify-api' }} jobs: build-and-push: runs-on: ubuntu-latest if: github.event.pull_request.draft == false + strategy: + matrix: + include: + - service_name: "web" + image_name_env: "DIFY_WEB_IMAGE_NAME" + context: "web" + - service_name: "api" + image_name_env: "DIFY_API_IMAGE_NAME" + context: "api" steps: - name: Set up QEMU uses: docker/setup-qemu-action@v3 @@ -22,14 +37,14 @@ jobs: - name: Login to Docker Hub uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKERHUB_USER }} - password: ${{ secrets.DOCKERHUB_TOKEN }} + username: ${{ env.DOCKERHUB_USER }} + password: ${{ env.DOCKERHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v5 with: - images: langgenius/dify-api + images: ${{ env[matrix.image_name_env] }} tags: | type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} type=ref,event=branch @@ -39,22 +54,11 @@ jobs: - name: Build and push uses: docker/build-push-action@v5 with: - context: "{{defaultContext}}:api" + context: "{{defaultContext}}:${{ matrix.context }}" platforms: ${{ startsWith(github.ref, 'refs/tags/') && 'linux/amd64,linux/arm64' || 'linux/amd64' }} - build-args: | - COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} + build-args: COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max - - - name: Deploy to server - if: github.ref == 'refs/heads/deploy/dev' - uses: appleboy/ssh-action@v0.1.8 - with: - host: ${{ secrets.SSH_HOST }} - username: ${{ secrets.SSH_USER }} - key: ${{ secrets.SSH_PRIVATE_KEY }} - script: | - ${{ secrets.SSH_SCRIPT }} diff --git a/.github/workflows/build-web-image.yml b/.github/workflows/build-web-image.yml deleted file mode 100644 index b77167c2a3..0000000000 --- a/.github/workflows/build-web-image.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Build and Push WEB Image - -on: - push: - branches: - - 'main' - - 'deploy/dev' - release: - types: [ published ] - -jobs: - build-and-push: - runs-on: ubuntu-latest - if: github.event.pull_request.draft == false - steps: - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USER }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v5 - with: - images: langgenius/dify-web - tags: | - type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} - type=ref,event=branch - type=sha,enable=true,priority=100,prefix=,suffix=,format=long - type=raw,value=${{ github.ref_name }},enable=${{ startsWith(github.ref, 'refs/tags/') }} - - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: "{{defaultContext}}:web" - platforms: ${{ startsWith(github.ref, 'refs/tags/') && 'linux/amd64,linux/arm64' || 'linux/amd64' }} - build-args: | - COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: Deploy to server - if: github.ref == 'refs/heads/deploy/dev' - uses: appleboy/ssh-action@v0.1.8 - with: - host: ${{ secrets.SSH_HOST }} - username: ${{ secrets.SSH_USER }} - key: ${{ secrets.SSH_PRIVATE_KEY }} - script: | - ${{ secrets.SSH_SCRIPT }} diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml new file mode 100644 index 0000000000..47ca03c2eb --- /dev/null +++ b/.github/workflows/deploy-dev.yml @@ -0,0 +1,24 @@ +name: Deploy Dev + +on: + workflow_run: + workflows: ["Build and Push API & Web"] + branches: + - "deploy/dev" + types: + - completed + +jobs: + deploy: + runs-on: ubuntu-latest + if: | + github.event.workflow_run.conclusion == 'success' + steps: + - name: Deploy to server + uses: appleboy/ssh-action@v0.1.8 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USER }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + ${{ vars.SSH_SCRIPT || secrets.SSH_SCRIPT }} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..ff61a00313 --- /dev/null +++ b/Makefile @@ -0,0 +1,43 @@ +# Variables +DOCKER_REGISTRY=langgenius +WEB_IMAGE=$(DOCKER_REGISTRY)/dify-web +API_IMAGE=$(DOCKER_REGISTRY)/dify-api +VERSION=latest + +# Build Docker images +build-web: + @echo "Building web Docker image: $(WEB_IMAGE):$(VERSION)..." + docker build -t $(WEB_IMAGE):$(VERSION) ./web + @echo "Web Docker image built successfully: $(WEB_IMAGE):$(VERSION)" + +build-api: + @echo "Building API Docker image: $(API_IMAGE):$(VERSION)..." + docker build -t $(API_IMAGE):$(VERSION) ./api + @echo "API Docker image built successfully: $(API_IMAGE):$(VERSION)" + +# Push Docker images +push-web: + @echo "Pushing web Docker image: $(WEB_IMAGE):$(VERSION)..." + docker push $(WEB_IMAGE):$(VERSION) + @echo "Web Docker image pushed successfully: $(WEB_IMAGE):$(VERSION)" + +push-api: + @echo "Pushing API Docker image: $(API_IMAGE):$(VERSION)..." + docker push $(API_IMAGE):$(VERSION) + @echo "API Docker image pushed successfully: $(API_IMAGE):$(VERSION)" + +# Build all images +build-all: build-web build-api + +# Push all images +push-all: push-web push-api + +build-push-api: build-api push-api +build-push-web: build-web push-web + +# Build and push all images +build-push-all: build-all push-all + @echo "All Docker images have been built and pushed." + +# Phony targets +.PHONY: build-web build-api push-web push-api build-all push-all build-push-all From a8e694c235758ddbc82fa426d5ed7cab4e160aa4 Mon Sep 17 00:00:00 2001 From: Bowen Liang Date: Sun, 17 Mar 2024 14:34:32 +0800 Subject: [PATCH 08/10] fix: print exception logs for ValueError and InvokeError (#2823) --- api/core/application_manager.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/api/core/application_manager.py b/api/core/application_manager.py index 9aca61c7bb..b4a416ccad 100644 --- a/api/core/application_manager.py +++ b/api/core/application_manager.py @@ -35,7 +35,7 @@ from core.errors.error import ModelCurrentlyNotSupportError, ProviderTokenNotIni from core.file.file_obj import FileObj from core.model_runtime.entities.message_entities import PromptMessageRole from core.model_runtime.entities.model_entities import ModelType -from core.model_runtime.errors.invoke import InvokeAuthorizationError, InvokeError +from core.model_runtime.errors.invoke import InvokeAuthorizationError from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel from core.prompt.prompt_template import PromptTemplateParser from core.provider_manager import ProviderManager @@ -195,8 +195,6 @@ class ApplicationManager: except ValidationError as e: logger.exception("Validation Error when generating") queue_manager.publish_error(e, PublishFrom.APPLICATION_MANAGER) - except (ValueError, InvokeError) as e: - queue_manager.publish_error(e, PublishFrom.APPLICATION_MANAGER) except Exception as e: logger.exception("Unknown Error when generating") queue_manager.publish_error(e, PublishFrom.APPLICATION_MANAGER) From f770232b63cf33eed2fb1ec8a3c38783ca322667 Mon Sep 17 00:00:00 2001 From: Su Yang Date: Sun, 17 Mar 2024 21:24:01 +0800 Subject: [PATCH 09/10] feat: add model for 01.ai, yi-chat-34b series (#2865) --- .../model_providers/_position.yaml | 1 + .../model_providers/yi/__init__.py | 0 .../model_providers/yi/_assets/icon_l_en.svg | 20 +++++++++ .../model_providers/yi/_assets/icon_l_zh.svg | 20 +++++++++ .../model_providers/yi/_assets/icon_s_en.svg | 7 ++++ .../model_providers/yi/llm/__init__.py | 0 .../model_providers/yi/llm/_position.yaml | 3 ++ .../model_providers/yi/llm/llm.py | 30 ++++++++++++++ .../yi/llm/yi-34b-chat-0205.yaml | 28 +++++++++++++ .../yi/llm/yi-34b-chat-200k.yaml | 28 +++++++++++++ .../model_providers/yi/llm/yi-vl-plus.yaml | 28 +++++++++++++ .../model_runtime/model_providers/yi/yi.py | 32 +++++++++++++++ .../model_runtime/model_providers/yi/yi.yaml | 41 +++++++++++++++++++ 13 files changed, 238 insertions(+) create mode 100644 api/core/model_runtime/model_providers/yi/__init__.py create mode 100644 api/core/model_runtime/model_providers/yi/_assets/icon_l_en.svg create mode 100644 api/core/model_runtime/model_providers/yi/_assets/icon_l_zh.svg create mode 100644 api/core/model_runtime/model_providers/yi/_assets/icon_s_en.svg create mode 100644 api/core/model_runtime/model_providers/yi/llm/__init__.py create mode 100644 api/core/model_runtime/model_providers/yi/llm/_position.yaml create mode 100644 api/core/model_runtime/model_providers/yi/llm/llm.py create mode 100644 api/core/model_runtime/model_providers/yi/llm/yi-34b-chat-0205.yaml create mode 100644 api/core/model_runtime/model_providers/yi/llm/yi-34b-chat-200k.yaml create mode 100644 api/core/model_runtime/model_providers/yi/llm/yi-vl-plus.yaml create mode 100644 api/core/model_runtime/model_providers/yi/yi.py create mode 100644 api/core/model_runtime/model_providers/yi/yi.yaml diff --git a/api/core/model_runtime/model_providers/_position.yaml b/api/core/model_runtime/model_providers/_position.yaml index 2dcdc1bf2e..97116978cd 100644 --- a/api/core/model_runtime/model_providers/_position.yaml +++ b/api/core/model_runtime/model_providers/_position.yaml @@ -20,6 +20,7 @@ - jina - chatglm - xinference +- yi - openllm - localai - openai_api_compatible diff --git a/api/core/model_runtime/model_providers/yi/__init__.py b/api/core/model_runtime/model_providers/yi/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api/core/model_runtime/model_providers/yi/_assets/icon_l_en.svg b/api/core/model_runtime/model_providers/yi/_assets/icon_l_en.svg new file mode 100644 index 0000000000..0efce4e85b --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/_assets/icon_l_en.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + 01.AI + + diff --git a/api/core/model_runtime/model_providers/yi/_assets/icon_l_zh.svg b/api/core/model_runtime/model_providers/yi/_assets/icon_l_zh.svg new file mode 100644 index 0000000000..951842da55 --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/_assets/icon_l_zh.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + 零一万物 + + diff --git a/api/core/model_runtime/model_providers/yi/_assets/icon_s_en.svg b/api/core/model_runtime/model_providers/yi/_assets/icon_s_en.svg new file mode 100644 index 0000000000..a813274466 --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/_assets/icon_s_en.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/api/core/model_runtime/model_providers/yi/llm/__init__.py b/api/core/model_runtime/model_providers/yi/llm/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api/core/model_runtime/model_providers/yi/llm/_position.yaml b/api/core/model_runtime/model_providers/yi/llm/_position.yaml new file mode 100644 index 0000000000..12838d670f --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/llm/_position.yaml @@ -0,0 +1,3 @@ +- yi-34b-chat-0205 +- yi-34b-chat-200k +- yi-vl-plus diff --git a/api/core/model_runtime/model_providers/yi/llm/llm.py b/api/core/model_runtime/model_providers/yi/llm/llm.py new file mode 100644 index 0000000000..8ad6462514 --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/llm/llm.py @@ -0,0 +1,30 @@ +from collections.abc import Generator +from typing import Optional, Union + +from core.model_runtime.entities.llm_entities import LLMResult +from core.model_runtime.entities.message_entities import ( + PromptMessage, + PromptMessageTool, +) +from core.model_runtime.model_providers.openai_api_compatible.llm.llm import OAIAPICompatLargeLanguageModel + + +class YiLargeLanguageModel(OAIAPICompatLargeLanguageModel): + def _invoke(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None, + stream: bool = True, user: Optional[str] = None) \ + -> Union[LLMResult, Generator]: + self._add_custom_parameters(credentials) + return super()._invoke(model, credentials, prompt_messages, model_parameters, tools, stop, stream) + + def validate_credentials(self, model: str, credentials: dict) -> None: + self._add_custom_parameters(credentials) + super().validate_credentials(model, credentials) + + @staticmethod + def _add_custom_parameters(credentials: dict) -> None: + credentials['mode'] = 'chat' + + if 'endpoint_url' not in credentials or credentials['endpoint_url'] == "": + credentials['endpoint_url'] = 'https://api.lingyiwanwu.com/v1' diff --git a/api/core/model_runtime/model_providers/yi/llm/yi-34b-chat-0205.yaml b/api/core/model_runtime/model_providers/yi/llm/yi-34b-chat-0205.yaml new file mode 100644 index 0000000000..4d4148aa91 --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/llm/yi-34b-chat-0205.yaml @@ -0,0 +1,28 @@ +model: yi-34b-chat-0205 +label: + zh_Hans: yi-34b-chat-0205 + en_US: yi-34b-chat-0205 +model_type: llm +features: + - agent-thought +model_properties: + mode: chat + context_size: 4096 +parameter_rules: + - name: max_tokens + use_template: max_tokens + type: int + default: 512 + min: 1 + max: 4096 + - name: temperature + use_template: temperature + type: float + default: 0.7 + min: 0 + max: 2 +pricing: + input: '0.0025' + output: '0.0025' + unit: '0.00001' + currency: RMB diff --git a/api/core/model_runtime/model_providers/yi/llm/yi-34b-chat-200k.yaml b/api/core/model_runtime/model_providers/yi/llm/yi-34b-chat-200k.yaml new file mode 100644 index 0000000000..4fbe84e9b7 --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/llm/yi-34b-chat-200k.yaml @@ -0,0 +1,28 @@ +model: yi-34b-chat-200k +label: + zh_Hans: yi-34b-chat-200k + en_US: yi-34b-chat-200k +model_type: llm +features: + - agent-thought +model_properties: + mode: chat + context_size: 200000 +parameter_rules: + - name: max_tokens + use_template: max_tokens + type: int + default: 1024 + min: 1 + max: 200000 + - name: temperature + use_template: temperature + type: float + default: 0.7 + min: 0 + max: 2 +pricing: + input: '0.012' + output: '0.012' + unit: '0.00001' + currency: RMB diff --git a/api/core/model_runtime/model_providers/yi/llm/yi-vl-plus.yaml b/api/core/model_runtime/model_providers/yi/llm/yi-vl-plus.yaml new file mode 100644 index 0000000000..6195051f16 --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/llm/yi-vl-plus.yaml @@ -0,0 +1,28 @@ +model: yi-vl-plus +label: + zh_Hans: yi-vl-plus + en_US: yi-vl-plus +model_type: llm +features: + - vision +model_properties: + mode: chat + context_size: 4096 +parameter_rules: + - name: max_tokens + use_template: max_tokens + type: int + default: 512 + min: 1 + max: 4096 + - name: temperature + use_template: temperature + type: float + default: 0.7 + min: 0 + max: 2 +pricing: + input: '0.01' + output: '0.03' + unit: '0.001' + currency: USD diff --git a/api/core/model_runtime/model_providers/yi/yi.py b/api/core/model_runtime/model_providers/yi/yi.py new file mode 100644 index 0000000000..691c7aa371 --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/yi.py @@ -0,0 +1,32 @@ +import logging + +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.errors.validate import CredentialsValidateFailedError +from core.model_runtime.model_providers.__base.model_provider import ModelProvider + +logger = logging.getLogger(__name__) + + +class YiProvider(ModelProvider): + + def validate_provider_credentials(self, credentials: dict) -> None: + """ + Validate provider credentials + if validate failed, raise exception + + :param credentials: provider credentials, credentials form defined in `provider_credential_schema`. + """ + try: + model_instance = self.get_model_instance(ModelType.LLM) + + # Use `yi-34b-chat-0205` model for validate, + # no matter what model you pass in, text completion model or chat model + model_instance.validate_credentials( + model='yi-34b-chat-0205', + credentials=credentials + ) + except CredentialsValidateFailedError as ex: + raise ex + except Exception as ex: + logger.exception(f'{self.get_provider_schema().provider} credentials validate failed') + raise ex diff --git a/api/core/model_runtime/model_providers/yi/yi.yaml b/api/core/model_runtime/model_providers/yi/yi.yaml new file mode 100644 index 0000000000..368c715456 --- /dev/null +++ b/api/core/model_runtime/model_providers/yi/yi.yaml @@ -0,0 +1,41 @@ +provider: yi +label: + en_US: 01.AI + zh_Hans: 零一万物 +description: + en_US: Models provided by 01.AI, such as yi-34b-chat and yi-vl-plus. + zh_Hans: 零一万物提供的模型,例如 yi-34b-chat 和 yi-vl-plus。 +icon_small: + en_US: icon_s_en.svg +icon_large: + en_US: icon_l_en.svg +background: "#EFFDFD" +help: + title: + en_US: Get your API Key from 01.ai + zh_Hans: 从零一万物获取 API Key + url: + en_US: https://platform.lingyiwanwu.com/apikeys +supported_model_types: + - llm +configurate_methods: + - predefined-model +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: endpoint_url + label: + zh_Hans: 自定义 API endpoint 地址 + en_US: CUstom API endpoint URL + type: text-input + required: false + placeholder: + zh_Hans: Base URL, e.g. https://api.lingyiwanwu.com/v1 + en_US: Base URL, e.g. https://api.lingyiwanwu.com/v1 From 6fd1795d25d746791d4cd152883e92442d0bf33a Mon Sep 17 00:00:00 2001 From: Su Yang Date: Mon, 18 Mar 2024 00:44:09 +0800 Subject: [PATCH 10/10] feat: Allow users to specify AWS Bedrock validation models (#2857) --- .../model_runtime/model_providers/bedrock/bedrock.py | 5 ++--- .../model_runtime/model_providers/bedrock/bedrock.yaml | 9 +++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/api/core/model_runtime/model_providers/bedrock/bedrock.py b/api/core/model_runtime/model_providers/bedrock/bedrock.py index aa322fc664..96cb90280e 100644 --- a/api/core/model_runtime/model_providers/bedrock/bedrock.py +++ b/api/core/model_runtime/model_providers/bedrock/bedrock.py @@ -17,10 +17,9 @@ class BedrockProvider(ModelProvider): """ try: model_instance = self.get_model_instance(ModelType.LLM) - - # Use `gemini-pro` model for validate, + bedrock_validate_model_name = credentials.get('model_for_validation', 'amazon.titan-text-lite-v1') model_instance.validate_credentials( - model='amazon.titan-text-lite-v1', + model=bedrock_validate_model_name, credentials=credentials ) except CredentialsValidateFailedError as ex: diff --git a/api/core/model_runtime/model_providers/bedrock/bedrock.yaml b/api/core/model_runtime/model_providers/bedrock/bedrock.yaml index 1458b830cd..05cd402d4e 100644 --- a/api/core/model_runtime/model_providers/bedrock/bedrock.yaml +++ b/api/core/model_runtime/model_providers/bedrock/bedrock.yaml @@ -69,3 +69,12 @@ provider_credential_schema: label: en_US: AWS GovCloud (US-West) zh_Hans: AWS GovCloud (US-West) + - variable: model_for_validation + required: false + label: + en_US: Available Model Name + zh_Hans: 可用模型名称 + type: text-input + placeholder: + en_US: A model you have access to (e.g. amazon.titan-text-lite-v1) for validation. + zh_Hans: 为了进行验证,请输入一个您可用的模型名称 (例如:amazon.titan-text-lite-v1)