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 @@
+
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)