From 04b9a2c6055dca1a0ffc1b3ba0d6df0c808720b2 Mon Sep 17 00:00:00 2001 From: yihong Date: Mon, 25 Nov 2024 13:50:03 +0800 Subject: [PATCH 01/29] fix: better path trigger for vdb and fix the version (#11057) Signed-off-by: yihong0618 --- .github/workflows/vdb-tests.yml | 2 ++ docker-legacy/docker-compose.chroma.yaml | 2 +- docker/docker-compose.yaml | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/vdb-tests.yml b/.github/workflows/vdb-tests.yml index a5ba51ce0e..73af370063 100644 --- a/.github/workflows/vdb-tests.yml +++ b/.github/workflows/vdb-tests.yml @@ -8,6 +8,8 @@ on: - api/core/rag/datasource/** - docker/** - .github/workflows/vdb-tests.yml + - api/poetry.lock + - api/pyproject.toml concurrency: group: vdb-tests-${{ github.head_ref || github.run_id }} diff --git a/docker-legacy/docker-compose.chroma.yaml b/docker-legacy/docker-compose.chroma.yaml index a943d620c0..63354305de 100644 --- a/docker-legacy/docker-compose.chroma.yaml +++ b/docker-legacy/docker-compose.chroma.yaml @@ -1,7 +1,7 @@ services: # Chroma vector store. chroma: - image: ghcr.io/chroma-core/chroma:0.5.1 + image: ghcr.io/chroma-core/chroma:0.5.20 restart: always volumes: - ./volumes/chroma:/chroma/chroma diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 285f576b0e..11eab3170d 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -605,7 +605,7 @@ services: # Chroma vector database chroma: - image: ghcr.io/chroma-core/chroma:0.5.1 + image: ghcr.io/chroma-core/chroma:0.5.20 profiles: - chroma restart: always From eb542067af9a826f6e3e849b63ec73eb5553f50e Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 25 Nov 2024 16:31:49 +0800 Subject: [PATCH 02/29] feat: add cookie management (#11061) --- web/app/components/base/ga/index.tsx | 6 ++++++ web/app/signin/layout.tsx | 15 --------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/web/app/components/base/ga/index.tsx b/web/app/components/base/ga/index.tsx index 219724113f..0015edbfca 100644 --- a/web/app/components/base/ga/index.tsx +++ b/web/app/components/base/ga/index.tsx @@ -47,6 +47,12 @@ gtag('config', '${gaIdMaps[gaType]}'); nonce={nonce!} > + {/* Cookie banner */} + ) diff --git a/web/app/signin/layout.tsx b/web/app/signin/layout.tsx index 342876bc53..b404c5c4de 100644 --- a/web/app/signin/layout.tsx +++ b/web/app/signin/layout.tsx @@ -1,25 +1,10 @@ -import Script from 'next/script' import Header from './_header' import style from './page.module.css' import cn from '@/utils/classnames' -import { IS_CE_EDITION } from '@/config' export default async function SignInLayout({ children }: any) { return <> - {!IS_CE_EDITION && ( - <> - - - - )} -
Date: Mon, 25 Nov 2024 10:00:42 +0000 Subject: [PATCH 03/29] fix: ignore empty outputs in Tool node (#10988) --- api/core/workflow/nodes/tool/tool_node.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/core/workflow/nodes/tool/tool_node.py b/api/core/workflow/nodes/tool/tool_node.py index 5560f26456..951e5330a3 100644 --- a/api/core/workflow/nodes/tool/tool_node.py +++ b/api/core/workflow/nodes/tool/tool_node.py @@ -250,9 +250,8 @@ class ToolNode(BaseNode[ToolNodeData]): f"{message.message}" if message.type == ToolInvokeMessage.MessageType.TEXT else f"Link: {message.message}" - if message.type == ToolInvokeMessage.MessageType.LINK - else "" for message in tool_response + if message.type in {ToolInvokeMessage.MessageType.TEXT, ToolInvokeMessage.MessageType.LINK} ] ) From 98d85e6b747d87d5f9cdceb140caf425a1f19a6d Mon Sep 17 00:00:00 2001 From: -LAN- Date: Mon, 25 Nov 2024 18:16:55 +0800 Subject: [PATCH 04/29] fix: WorkflowNodeExecution.created_at may be earlier than WorkflowRun.created_at (#11070) --- .../task_pipeline/workflow_cycle_manage.py | 51 ++++++++++--------- api/models/workflow.py | 10 ++-- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/api/core/app/task_pipeline/workflow_cycle_manage.py b/api/core/app/task_pipeline/workflow_cycle_manage.py index 9229cbcc0a..d45726af46 100644 --- a/api/core/app/task_pipeline/workflow_cycle_manage.py +++ b/api/core/app/task_pipeline/workflow_cycle_manage.py @@ -3,6 +3,7 @@ import time from collections.abc import Mapping, Sequence from datetime import UTC, datetime from typing import Any, Optional, Union, cast +from uuid import uuid4 from sqlalchemy.orm import Session @@ -80,38 +81,38 @@ class WorkflowCycleManage: inputs[f"sys.{key.value}"] = value - inputs = WorkflowEntry.handle_special_values(inputs) - triggered_from = ( WorkflowRunTriggeredFrom.DEBUGGING if self._application_generate_entity.invoke_from == InvokeFrom.DEBUGGER else WorkflowRunTriggeredFrom.APP_RUN ) - # init workflow run - workflow_run = WorkflowRun() - workflow_run_id = self._workflow_system_variables[SystemVariableKey.WORKFLOW_RUN_ID] - if workflow_run_id: - workflow_run.id = workflow_run_id - workflow_run.tenant_id = self._workflow.tenant_id - workflow_run.app_id = self._workflow.app_id - workflow_run.sequence_number = new_sequence_number - workflow_run.workflow_id = self._workflow.id - workflow_run.type = self._workflow.type - workflow_run.triggered_from = triggered_from.value - workflow_run.version = self._workflow.version - workflow_run.graph = self._workflow.graph - workflow_run.inputs = json.dumps(inputs) - workflow_run.status = WorkflowRunStatus.RUNNING.value - workflow_run.created_by_role = ( - CreatedByRole.ACCOUNT.value if isinstance(self._user, Account) else CreatedByRole.END_USER.value - ) - workflow_run.created_by = self._user.id + # handle special values + inputs = WorkflowEntry.handle_special_values(inputs) - db.session.add(workflow_run) - db.session.commit() - db.session.refresh(workflow_run) - db.session.close() + # init workflow run + with Session(db.engine, expire_on_commit=False) as session: + workflow_run = WorkflowRun() + system_id = self._workflow_system_variables[SystemVariableKey.WORKFLOW_RUN_ID] + workflow_run.id = system_id or str(uuid4()) + workflow_run.tenant_id = self._workflow.tenant_id + workflow_run.app_id = self._workflow.app_id + workflow_run.sequence_number = new_sequence_number + workflow_run.workflow_id = self._workflow.id + workflow_run.type = self._workflow.type + workflow_run.triggered_from = triggered_from.value + workflow_run.version = self._workflow.version + workflow_run.graph = self._workflow.graph + workflow_run.inputs = json.dumps(inputs) + workflow_run.status = WorkflowRunStatus.RUNNING + workflow_run.created_by_role = ( + CreatedByRole.ACCOUNT if isinstance(self._user, Account) else CreatedByRole.END_USER + ) + workflow_run.created_by = self._user.id + workflow_run.created_at = datetime.now(UTC).replace(tzinfo=None) + + session.add(workflow_run) + session.commit() return workflow_run diff --git a/api/models/workflow.py b/api/models/workflow.py index 5b0617828d..fd53f137f9 100644 --- a/api/models/workflow.py +++ b/api/models/workflow.py @@ -1,7 +1,7 @@ import json from collections.abc import Mapping, Sequence from datetime import UTC, datetime -from enum import Enum +from enum import Enum, StrEnum from typing import Any, Optional, Union import sqlalchemy as sa @@ -314,7 +314,7 @@ class Workflow(db.Model): ) -class WorkflowRunStatus(Enum): +class WorkflowRunStatus(StrEnum): """ Workflow Run Status Enum """ @@ -393,13 +393,13 @@ class WorkflowRun(db.Model): version = db.Column(db.String(255), nullable=False) graph = db.Column(db.Text) inputs = db.Column(db.Text) - status = db.Column(db.String(255), nullable=False) - outputs: Mapped[str] = db.Column(db.Text) + status = db.Column(db.String(255), nullable=False) # running, succeeded, failed, stopped + outputs: Mapped[str] = mapped_column(sa.Text, default="{}") error = db.Column(db.Text) elapsed_time = db.Column(db.Float, nullable=False, server_default=db.text("0")) total_tokens = db.Column(db.Integer, nullable=False, server_default=db.text("0")) total_steps = db.Column(db.Integer, server_default=db.text("0")) - created_by_role = db.Column(db.String(255), nullable=False) + created_by_role = db.Column(db.String(255), nullable=False) # account, end_user created_by = db.Column(StringUUID, nullable=False) created_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)")) finished_at = db.Column(db.DateTime) From 625aaceb005a43fe4602da70e4c48affa4d250e5 Mon Sep 17 00:00:00 2001 From: -LAN- Date: Mon, 25 Nov 2024 19:17:59 +0800 Subject: [PATCH 05/29] chore: bump version to 0.12.0 (#11056) --- api/configs/packaging/__init__.py | 2 +- docker-legacy/docker-compose.yaml | 6 +++--- docker/docker-compose.yaml | 6 +++--- web/package.json | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/api/configs/packaging/__init__.py b/api/configs/packaging/__init__.py index 1f2b8224e8..7e95e79bfb 100644 --- a/api/configs/packaging/__init__.py +++ b/api/configs/packaging/__init__.py @@ -9,7 +9,7 @@ class PackagingInfo(BaseSettings): CURRENT_VERSION: str = Field( description="Dify version", - default="0.11.2", + default="0.12.0", ) COMMIT_SHA: str = Field( diff --git a/docker-legacy/docker-compose.yaml b/docker-legacy/docker-compose.yaml index 7bf2cd4708..7ddb98e272 100644 --- a/docker-legacy/docker-compose.yaml +++ b/docker-legacy/docker-compose.yaml @@ -2,7 +2,7 @@ version: '3' services: # API service api: - image: langgenius/dify-api:0.11.2 + image: langgenius/dify-api:0.12.0 restart: always environment: # Startup mode, 'api' starts the API server. @@ -227,7 +227,7 @@ services: # worker service # The Celery worker for processing the queue. worker: - image: langgenius/dify-api:0.11.2 + image: langgenius/dify-api:0.12.0 restart: always environment: CONSOLE_WEB_URL: '' @@ -397,7 +397,7 @@ services: # Frontend web application. web: - image: langgenius/dify-web:0.11.2 + image: langgenius/dify-web:0.12.0 restart: always environment: # The base URL of console application api server, refers to the Console base URL of WEB service if console domain is diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 11eab3170d..9a135e7b54 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -291,7 +291,7 @@ x-shared-env: &shared-api-worker-env services: # API service api: - image: langgenius/dify-api:0.11.2 + image: langgenius/dify-api:0.12.0 restart: always environment: # Use the shared environment variables. @@ -311,7 +311,7 @@ services: # worker service # The Celery worker for processing the queue. worker: - image: langgenius/dify-api:0.11.2 + image: langgenius/dify-api:0.12.0 restart: always environment: # Use the shared environment variables. @@ -330,7 +330,7 @@ services: # Frontend web application. web: - image: langgenius/dify-web:0.11.2 + image: langgenius/dify-web:0.12.0 restart: always environment: CONSOLE_API_URL: ${CONSOLE_API_URL:-} diff --git a/web/package.json b/web/package.json index 596faf81ac..f65d87961b 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "dify-web", - "version": "0.11.2", + "version": "0.12.0", "private": true, "engines": { "node": ">=18.17.0" From 2e00829b1e7ebae50da09192dc8bf8110a2deca5 Mon Sep 17 00:00:00 2001 From: yihong Date: Mon, 25 Nov 2024 19:50:23 +0800 Subject: [PATCH 06/29] fix: drop useless and wrong code for zhipu embedding (#11069) Signed-off-by: yihong0618 --- .../zhipuai/text_embedding/text_embedding.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/api/core/model_runtime/model_providers/zhipuai/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/zhipuai/text_embedding/text_embedding.py index f629b62fd5..2428284ba9 100644 --- a/api/core/model_runtime/model_providers/zhipuai/text_embedding/text_embedding.py +++ b/api/core/model_runtime/model_providers/zhipuai/text_embedding/text_embedding.py @@ -105,17 +105,6 @@ class ZhipuAITextEmbeddingModel(_CommonZhipuaiAI, TextEmbeddingModel): return [list(map(float, e)) for e in embeddings], embedding_used_tokens - def embed_query(self, text: str) -> list[float]: - """Call out to ZhipuAI's embedding endpoint. - - Args: - text: The text to embed. - - Returns: - Embeddings for the text. - """ - return self.embed_documents([text])[0] - def _calc_response_usage(self, model: str, credentials: dict, tokens: int) -> EmbeddingUsage: """ Calculate response usage From 56e361ac44609e0db6818e453e8b441d1dab17f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=9E=E6=B3=95=E6=93=8D=E4=BD=9C?= Date: Mon, 25 Nov 2024 19:50:33 +0800 Subject: [PATCH 07/29] fix: chart tool chinese font display and raise error (#11058) --- api/core/tools/provider/builtin/chart/chart.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/api/core/tools/provider/builtin/chart/chart.py b/api/core/tools/provider/builtin/chart/chart.py index dfa3fbea6a..8fa647d9ed 100644 --- a/api/core/tools/provider/builtin/chart/chart.py +++ b/api/core/tools/provider/builtin/chart/chart.py @@ -1,3 +1,4 @@ +import matplotlib import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties, fontManager @@ -5,7 +6,7 @@ from core.tools.provider.builtin_tool_provider import BuiltinToolProviderControl def set_chinese_font(): - font_list = [ + to_find_fonts = [ "PingFang SC", "SimHei", "Microsoft YaHei", @@ -15,16 +16,16 @@ def set_chinese_font(): "Noto Sans CJK SC", "Noto Sans CJK JP", ] - - for font in font_list: - if font in fontManager.ttflist: - chinese_font = FontProperties(font) - if chinese_font.get_name() == font: - return chinese_font + installed_fonts = frozenset(fontInfo.name for fontInfo in fontManager.ttflist) + for font in to_find_fonts: + if font in installed_fonts: + return FontProperties(font) return FontProperties() +# use non-interactive backend to prevent `RuntimeError: main thread is not in main loop` +matplotlib.use("Agg") # use a business theme plt.style.use("seaborn-v0_8-darkgrid") plt.rcParams["axes.unicode_minus"] = False From 1065917872d5da941dc3c4196e50a8f896d1e5bd Mon Sep 17 00:00:00 2001 From: Tao Wang <74752235+taowang1993@users.noreply.github.com> Date: Mon, 25 Nov 2024 04:53:03 -0800 Subject: [PATCH 08/29] Add grok-vision-beta to xAI + Update grok-beta Features (#11004) --- .../model_providers/x/llm/grok-beta.yaml | 5 +- .../x/llm/grok-vision-beta.yaml | 64 +++++++++++++++++++ .../model_providers/x/llm/llm.py | 2 + 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 api/core/model_runtime/model_providers/x/llm/grok-vision-beta.yaml diff --git a/api/core/model_runtime/model_providers/x/llm/grok-beta.yaml b/api/core/model_runtime/model_providers/x/llm/grok-beta.yaml index 7c305735b9..bb71de2bad 100644 --- a/api/core/model_runtime/model_providers/x/llm/grok-beta.yaml +++ b/api/core/model_runtime/model_providers/x/llm/grok-beta.yaml @@ -1,9 +1,12 @@ model: grok-beta label: - en_US: Grok beta + en_US: Grok Beta model_type: llm features: + - agent-thought + - tool-call - multi-tool-call + - stream-tool-call model_properties: mode: chat context_size: 131072 diff --git a/api/core/model_runtime/model_providers/x/llm/grok-vision-beta.yaml b/api/core/model_runtime/model_providers/x/llm/grok-vision-beta.yaml new file mode 100644 index 0000000000..844f0520bc --- /dev/null +++ b/api/core/model_runtime/model_providers/x/llm/grok-vision-beta.yaml @@ -0,0 +1,64 @@ +model: grok-vision-beta +label: + en_US: Grok Vision Beta +model_type: llm +features: + - agent-thought + - vision +model_properties: + mode: chat + context_size: 8192 +parameter_rules: + - name: temperature + label: + en_US: "Temperature" + zh_Hans: "采样温度" + type: float + default: 0.7 + min: 0.0 + max: 2.0 + precision: 1 + required: true + help: + en_US: "The randomness of the sampling temperature control output. The temperature value is within the range of [0.0, 1.0]. The higher the value, the more random and creative the output; the lower the value, the more stable it is. It is recommended to adjust either top_p or temperature parameters according to your needs to avoid adjusting both at the same time." + zh_Hans: "采样温度控制输出的随机性。温度值在 [0.0, 1.0] 范围内,值越高,输出越随机和创造性;值越低,输出越稳定。建议根据需求调整 top_p 或 temperature 参数,避免同时调整两者。" + + - name: top_p + label: + en_US: "Top P" + zh_Hans: "Top P" + type: float + default: 0.7 + min: 0.0 + max: 1.0 + precision: 1 + required: true + help: + en_US: "The value range of the sampling method is [0.0, 1.0]. The top_p value determines that the model selects tokens from the top p% of candidate words with the highest probability; when top_p is 0, this parameter is invalid. It is recommended to adjust either top_p or temperature parameters according to your needs to avoid adjusting both at the same time." + zh_Hans: "采样方法的取值范围为 [0.0,1.0]。top_p 值确定模型从概率最高的前p%的候选词中选取 tokens;当 top_p 为 0 时,此参数无效。建议根据需求调整 top_p 或 temperature 参数,避免同时调整两者。" + + - name: frequency_penalty + use_template: frequency_penalty + label: + en_US: "Frequency Penalty" + zh_Hans: "频率惩罚" + type: float + default: 0 + min: 0 + max: 2.0 + precision: 1 + required: false + help: + en_US: "Number between 0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim." + zh_Hans: "介于0和2.0之间的数字。正值会根据新标记在文本中迄今为止的现有频率来惩罚它们,从而降低模型一字不差地重复同一句话的可能性。" + + - name: user + use_template: text + label: + en_US: "User" + zh_Hans: "用户" + type: string + required: false + help: + en_US: "Used to track and differentiate conversation requests from different users." + zh_Hans: "用于追踪和区分不同用户的对话请求。" diff --git a/api/core/model_runtime/model_providers/x/llm/llm.py b/api/core/model_runtime/model_providers/x/llm/llm.py index 3f5325a857..eacd086fee 100644 --- a/api/core/model_runtime/model_providers/x/llm/llm.py +++ b/api/core/model_runtime/model_providers/x/llm/llm.py @@ -35,3 +35,5 @@ class XAILargeLanguageModel(OAIAPICompatLargeLanguageModel): credentials["endpoint_url"] = str(URL(credentials["endpoint_url"])) or "https://api.x.ai/v1" credentials["mode"] = LLMMode.CHAT.value credentials["function_calling_type"] = "tool_call" + credentials["stream_function_calling"] = "support" + credentials["vision_support"] = "support" From c032574491bad38788977fa8bfecb0430ad2a610 Mon Sep 17 00:00:00 2001 From: -LAN- Date: Mon, 25 Nov 2024 20:53:55 +0800 Subject: [PATCH 09/29] fix: timezone not imported in conversation service. (#11076) --- api/services/conversation_service.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/services/conversation_service.py b/api/services/conversation_service.py index f3e76d3300..8642972710 100644 --- a/api/services/conversation_service.py +++ b/api/services/conversation_service.py @@ -1,3 +1,4 @@ +from collections.abc import Callable from datetime import UTC, datetime from typing import Optional, Union @@ -74,14 +75,14 @@ class ConversationService: return InfiniteScrollPagination(data=conversations, limit=limit, has_more=has_more) @classmethod - def _get_sort_params(cls, sort_by: str) -> tuple[str, callable]: + def _get_sort_params(cls, sort_by: str): if sort_by.startswith("-"): return sort_by[1:], desc return sort_by, asc @classmethod def _build_filter_condition( - cls, sort_field: str, sort_direction: callable, reference_conversation: Conversation, is_next_page: bool = False + cls, sort_field: str, sort_direction: Callable, reference_conversation: Conversation, is_next_page: bool = False ): field_value = getattr(reference_conversation, sort_field) if (sort_direction == desc and not is_next_page) or (sort_direction == asc and is_next_page): @@ -160,5 +161,5 @@ class ConversationService: conversation = cls.get_conversation(app_model, conversation_id, user) conversation.is_deleted = True - conversation.updated_at = datetime.now(timezone.utc).replace(tzinfo=None) + conversation.updated_at = datetime.now(UTC).replace(tzinfo=None) db.session.commit() From 8aae235a71efe3bc9e647120202b2d412acc4b9e Mon Sep 17 00:00:00 2001 From: yihong Date: Mon, 25 Nov 2024 21:04:16 +0800 Subject: [PATCH 10/29] fix: int None will cause error for context size (#11055) Signed-off-by: yihong0618 --- .../model_runtime/model_providers/gitee_ai/rerank/rerank.py | 2 +- .../model_runtime/model_providers/gpustack/rerank/rerank.py | 2 +- api/core/model_runtime/model_providers/jina/rerank/rerank.py | 2 +- .../model_providers/jina/text_embedding/text_embedding.py | 2 +- .../model_providers/ollama/text_embedding/text_embedding.py | 2 +- .../openai_api_compatible/text_embedding/text_embedding.py | 2 +- .../model_providers/perfxcloud/text_embedding/text_embedding.py | 2 +- .../model_providers/vertex_ai/text_embedding/text_embedding.py | 2 +- .../model_providers/voyage/text_embedding/text_embedding.py | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/api/core/model_runtime/model_providers/gitee_ai/rerank/rerank.py b/api/core/model_runtime/model_providers/gitee_ai/rerank/rerank.py index 231345c2f4..832ba92740 100644 --- a/api/core/model_runtime/model_providers/gitee_ai/rerank/rerank.py +++ b/api/core/model_runtime/model_providers/gitee_ai/rerank/rerank.py @@ -122,7 +122,7 @@ class GiteeAIRerankModel(RerankModel): label=I18nObject(en_US=model), model_type=ModelType.RERANK, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, - model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size"))}, + model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 512))}, ) return entity diff --git a/api/core/model_runtime/model_providers/gpustack/rerank/rerank.py b/api/core/model_runtime/model_providers/gpustack/rerank/rerank.py index 5ea7532564..feb5777028 100644 --- a/api/core/model_runtime/model_providers/gpustack/rerank/rerank.py +++ b/api/core/model_runtime/model_providers/gpustack/rerank/rerank.py @@ -140,7 +140,7 @@ class GPUStackRerankModel(RerankModel): label=I18nObject(en_US=model), model_type=ModelType.RERANK, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, - model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size"))}, + model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 512))}, ) return entity diff --git a/api/core/model_runtime/model_providers/jina/rerank/rerank.py b/api/core/model_runtime/model_providers/jina/rerank/rerank.py index aacc8e75d3..22f882be6b 100644 --- a/api/core/model_runtime/model_providers/jina/rerank/rerank.py +++ b/api/core/model_runtime/model_providers/jina/rerank/rerank.py @@ -128,7 +128,7 @@ class JinaRerankModel(RerankModel): label=I18nObject(en_US=model), model_type=ModelType.RERANK, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, - model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size"))}, + model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 8000))}, ) return entity diff --git a/api/core/model_runtime/model_providers/jina/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/jina/text_embedding/text_embedding.py index 49c558f4a4..f5be7a9828 100644 --- a/api/core/model_runtime/model_providers/jina/text_embedding/text_embedding.py +++ b/api/core/model_runtime/model_providers/jina/text_embedding/text_embedding.py @@ -193,7 +193,7 @@ class JinaTextEmbeddingModel(TextEmbeddingModel): label=I18nObject(en_US=model), model_type=ModelType.TEXT_EMBEDDING, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, - model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size"))}, + model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 8000))}, ) return entity diff --git a/api/core/model_runtime/model_providers/ollama/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/ollama/text_embedding/text_embedding.py index a16c91cd7e..83c4facc8d 100644 --- a/api/core/model_runtime/model_providers/ollama/text_embedding/text_embedding.py +++ b/api/core/model_runtime/model_providers/ollama/text_embedding/text_embedding.py @@ -139,7 +139,7 @@ class OllamaEmbeddingModel(TextEmbeddingModel): model_type=ModelType.TEXT_EMBEDDING, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, model_properties={ - ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size")), + ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 512)), ModelPropertyKey.MAX_CHUNKS: 1, }, parameter_rules=[], diff --git a/api/core/model_runtime/model_providers/openai_api_compatible/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/openai_api_compatible/text_embedding/text_embedding.py index c2b7297aac..793c384d5a 100644 --- a/api/core/model_runtime/model_providers/openai_api_compatible/text_embedding/text_embedding.py +++ b/api/core/model_runtime/model_providers/openai_api_compatible/text_embedding/text_embedding.py @@ -176,7 +176,7 @@ class OAICompatEmbeddingModel(_CommonOaiApiCompat, TextEmbeddingModel): model_type=ModelType.TEXT_EMBEDDING, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, model_properties={ - ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size")), + ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 512)), ModelPropertyKey.MAX_CHUNKS: 1, }, parameter_rules=[], diff --git a/api/core/model_runtime/model_providers/perfxcloud/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/perfxcloud/text_embedding/text_embedding.py index d78bdaa75e..7bbd31e87c 100644 --- a/api/core/model_runtime/model_providers/perfxcloud/text_embedding/text_embedding.py +++ b/api/core/model_runtime/model_providers/perfxcloud/text_embedding/text_embedding.py @@ -182,7 +182,7 @@ class OAICompatEmbeddingModel(_CommonOaiApiCompat, TextEmbeddingModel): model_type=ModelType.TEXT_EMBEDDING, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, model_properties={ - ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size")), + ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 512)), ModelPropertyKey.MAX_CHUNKS: 1, }, parameter_rules=[], diff --git a/api/core/model_runtime/model_providers/vertex_ai/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/vertex_ai/text_embedding/text_embedding.py index 43233e6126..9cd0c78d99 100644 --- a/api/core/model_runtime/model_providers/vertex_ai/text_embedding/text_embedding.py +++ b/api/core/model_runtime/model_providers/vertex_ai/text_embedding/text_embedding.py @@ -173,7 +173,7 @@ class VertexAiTextEmbeddingModel(_CommonVertexAi, TextEmbeddingModel): model_type=ModelType.TEXT_EMBEDDING, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, model_properties={ - ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size")), + ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 512)), ModelPropertyKey.MAX_CHUNKS: 1, }, parameter_rules=[], diff --git a/api/core/model_runtime/model_providers/voyage/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/voyage/text_embedding/text_embedding.py index e69c9fccba..16f1bd43d8 100644 --- a/api/core/model_runtime/model_providers/voyage/text_embedding/text_embedding.py +++ b/api/core/model_runtime/model_providers/voyage/text_embedding/text_embedding.py @@ -166,7 +166,7 @@ class VoyageTextEmbeddingModel(TextEmbeddingModel): label=I18nObject(en_US=model), model_type=ModelType.TEXT_EMBEDDING, fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, - model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size"))}, + model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size", 512))}, ) return entity From ab6dcf7032110e5510ee6fa81e948646c319709b Mon Sep 17 00:00:00 2001 From: fengjiajie Date: Mon, 25 Nov 2024 21:13:02 +0800 Subject: [PATCH 11/29] fix: update the max tokens configuration for Azure GPT-4o (2024-08-06) to 16384 (#11074) --- .../model_runtime/model_providers/azure_openai/_constant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/core/model_runtime/model_providers/azure_openai/_constant.py b/api/core/model_runtime/model_providers/azure_openai/_constant.py index e61a9e0474..4cf58275d7 100644 --- a/api/core/model_runtime/model_providers/azure_openai/_constant.py +++ b/api/core/model_runtime/model_providers/azure_openai/_constant.py @@ -779,7 +779,7 @@ LLM_BASE_MODELS = [ name="frequency_penalty", **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], ), - _get_max_tokens(default=512, min_val=1, max_val=4096), + _get_max_tokens(default=512, min_val=1, max_val=16384), ParameterRule( name="seed", label=I18nObject(zh_Hans="种子", en_US="Seed"), From 60c15497713cd27a3dd68b6b6730366ab2d70f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=9E=E6=B3=95=E6=93=8D=E4=BD=9C?= Date: Tue, 26 Nov 2024 09:32:08 +0800 Subject: [PATCH 12/29] fix: import Explore Apps raise error (#11091) --- web/app/components/explore/app-list/index.tsx | 8 +++++--- web/utils/app-redirection.ts | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/web/app/components/explore/app-list/index.tsx b/web/app/components/explore/app-list/index.tsx index 6186d8164d..bd50708cb4 100644 --- a/web/app/components/explore/app-list/index.tsx +++ b/web/app/components/explore/app-list/index.tsx @@ -14,7 +14,7 @@ import type { App } from '@/models/explore' import Category from '@/app/components/explore/category' import AppCard from '@/app/components/explore/app-card' import { fetchAppDetail, fetchAppList } from '@/service/explore' -import { importApp } from '@/service/apps' +import { importDSL } from '@/service/apps' import { useTabSearchParams } from '@/hooks/use-tab-searchparams' import CreateAppModal from '@/app/components/explore/create-app-modal' import AppTypeSelector from '@/app/components/app/type-selector' @@ -24,6 +24,7 @@ import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useAppContext } from '@/context/app-context' import { getRedirection } from '@/utils/app-redirection' import Input from '@/app/components/base/input' +import { DSLImportMode } from '@/models/app' type AppsProps = { pageType?: PageType @@ -127,8 +128,9 @@ const Apps = ({ currApp?.app.id as string, ) try { - const app = await importApp({ - data: export_data, + const app = await importDSL({ + mode: DSLImportMode.YAML_CONTENT, + yaml_content: export_data, name, icon_type, icon, diff --git a/web/utils/app-redirection.ts b/web/utils/app-redirection.ts index 534b019250..b14f660e63 100644 --- a/web/utils/app-redirection.ts +++ b/web/utils/app-redirection.ts @@ -4,12 +4,12 @@ export const getRedirection = ( redirectionFunc: (href: string) => void, ) => { if (!isCurrentWorkspaceEditor) { - redirectionFunc(`/app/${app.id}/overview`) + redirectionFunc(`/app/${app.app_id}/overview`) } else { if (app.mode === 'workflow' || app.mode === 'advanced-chat') - redirectionFunc(`/app/${app.id}/workflow`) + redirectionFunc(`/app/${app.app_id}/workflow`) else - redirectionFunc(`/app/${app.id}/configuration`) + redirectionFunc(`/app/${app.app_id}/configuration`) } } From af2461cccc7ff0caf09ae73c7384022e584004ef Mon Sep 17 00:00:00 2001 From: Tao Wang <74752235+taowang1993@users.noreply.github.com> Date: Mon, 25 Nov 2024 17:32:37 -0800 Subject: [PATCH 13/29] Add query_prefix + Return TED Transcript URL for Downstream Scraping Tasks (#11090) --- .../builtin/duckduckgo/tools/ddgo_img.py | 6 +++++ .../builtin/duckduckgo/tools/ddgo_img.yaml | 11 ++++++++++ .../builtin/duckduckgo/tools/ddgo_news.py | 8 ++++++- .../builtin/duckduckgo/tools/ddgo_news.yaml | 11 ++++++++++ .../builtin/duckduckgo/tools/ddgo_search.py | 9 ++++++-- .../builtin/duckduckgo/tools/ddgo_search.yaml | 11 ++++++++++ .../builtin/duckduckgo/tools/ddgo_video.py | 22 ++++++++++++++++--- .../builtin/duckduckgo/tools/ddgo_video.yaml | 11 ++++++++++ 8 files changed, 83 insertions(+), 6 deletions(-) diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.py b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.py index 54bb38755a..b3c630878f 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.py +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.py @@ -18,6 +18,12 @@ class DuckDuckGoImageSearchTool(BuiltinTool): "size": tool_parameters.get("size"), "max_results": tool_parameters.get("max_results"), } + + # Add query_prefix handling + query_prefix = tool_parameters.get("query_prefix", "").strip() + final_query = f"{query_prefix} {query_dict['keywords']}".strip() + query_dict["keywords"] = final_query + response = DDGS().images(**query_dict) markdown_result = "\n\n" json_result = [] diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.yaml b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.yaml index 168cface22..a543d1e218 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.yaml +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.yaml @@ -86,3 +86,14 @@ parameters: en_US: The size of the image to be searched. zh_Hans: 要搜索的图片的大小 form: form + - name: query_prefix + label: + en_US: Query Prefix + zh_Hans: 查询前缀 + type: string + required: false + default: "" + form: form + human_description: + en_US: Specific Search e.g. "site:unsplash.com" + zh_Hans: 定向搜索 e.g. "site:unsplash.com" diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_news.py b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_news.py index 3a6fd394a8..11da6f5cf7 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_news.py +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_news.py @@ -7,7 +7,7 @@ from core.tools.entities.tool_entities import ToolInvokeMessage from core.tools.tool.builtin_tool import BuiltinTool SUMMARY_PROMPT = """ -User's query: +User's query: {query} Here are the news results: @@ -30,6 +30,12 @@ class DuckDuckGoNewsSearchTool(BuiltinTool): "safesearch": "moderate", "region": "wt-wt", } + + # Add query_prefix handling + query_prefix = tool_parameters.get("query_prefix", "").strip() + final_query = f"{query_prefix} {query_dict['keywords']}".strip() + query_dict["keywords"] = final_query + try: response = list(DDGS().news(**query_dict)) if not response: diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_news.yaml b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_news.yaml index eb2b67b7c9..6e181e0f41 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_news.yaml +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_news.yaml @@ -69,3 +69,14 @@ parameters: en_US: Whether to pass the news results to llm for summarization. zh_Hans: 是否需要将新闻结果传给大模型总结 form: form + - name: query_prefix + label: + en_US: Query Prefix + zh_Hans: 查询前缀 + type: string + required: false + default: "" + form: form + human_description: + en_US: Specific Search e.g. "site:msn.com" + zh_Hans: 定向搜索 e.g. "site:msn.com" diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_search.py b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_search.py index cbd65d2e77..3cd35d16a6 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_search.py +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_search.py @@ -7,7 +7,7 @@ from core.tools.entities.tool_entities import ToolInvokeMessage from core.tools.tool.builtin_tool import BuiltinTool SUMMARY_PROMPT = """ -User's query: +User's query: {query} Here is the search engine result: @@ -26,7 +26,12 @@ class DuckDuckGoSearchTool(BuiltinTool): query = tool_parameters.get("query") max_results = tool_parameters.get("max_results", 5) require_summary = tool_parameters.get("require_summary", False) - response = DDGS().text(query, max_results=max_results) + + # Add query_prefix handling + query_prefix = tool_parameters.get("query_prefix", "").strip() + final_query = f"{query_prefix} {query}".strip() + + response = DDGS().text(final_query, max_results=max_results) if require_summary: results = "\n".join([res.get("body") for res in response]) results = self.summary_results(user_id=user_id, content=results, query=query) diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_search.yaml b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_search.yaml index 333c0cb093..54e27d9905 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_search.yaml +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_search.yaml @@ -39,3 +39,14 @@ parameters: en_US: Whether to pass the search results to llm for summarization. zh_Hans: 是否需要将搜索结果传给大模型总结 form: form + - name: query_prefix + label: + en_US: Query Prefix + zh_Hans: 查询前缀 + type: string + required: false + default: "" + form: form + human_description: + en_US: Specific Search e.g. "site:wikipedia.org" + zh_Hans: 定向搜索 e.g. "site:wikipedia.org" diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_video.py b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_video.py index 4b74b223c1..1eef0b1ba2 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_video.py +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_video.py @@ -24,7 +24,7 @@ max-width: 100%; border-radius: 8px;"> def _invoke(self, user_id: str, tool_parameters: dict[str, Any]) -> list[ToolInvokeMessage]: query_dict = { - "keywords": tool_parameters.get("query"), + "keywords": tool_parameters.get("query"), # LLM's query "region": tool_parameters.get("region", "wt-wt"), "safesearch": tool_parameters.get("safesearch", "moderate"), "timelimit": tool_parameters.get("timelimit"), @@ -40,6 +40,12 @@ max-width: 100%; border-radius: 8px;"> # Get proxy URL from parameters proxy_url = tool_parameters.get("proxy_url", "").strip() + query_prefix = tool_parameters.get("query_prefix", "").strip() + final_query = f"{query_prefix} {query_dict['keywords']}".strip() + + # Update the keywords in query_dict with the final_query + query_dict["keywords"] = final_query + response = DDGS().videos(**query_dict) # Create HTML result with embedded iframes @@ -51,9 +57,13 @@ max-width: 100%; border-radius: 8px;"> embed_html = res.get("embed_html", "") description = res.get("description", "") content_url = res.get("content", "") + transcript_url = None # Handle TED.com videos - if not embed_html and "ted.com/talks" in content_url: + if "ted.com/talks" in content_url: + # Create transcript URL + transcript_url = f"{content_url}/transcript" + # Create embed URL embed_url = content_url.replace("www.ted.com", "embed.ted.com") if proxy_url: embed_url = f"{proxy_url}{embed_url}" @@ -68,8 +78,14 @@ max-width: 100%; border-radius: 8px;"> markdown_result += f"{title}\n\n" markdown_result += f"{embed_html}\n\n" + if description: + markdown_result += f"{description}\n\n" markdown_result += "---\n\n" - json_result.append(self.create_json_message(res)) + # Add transcript_url to the JSON result if available + result_dict = res.copy() + if transcript_url: + result_dict["transcript_url"] = transcript_url + json_result.append(self.create_json_message(result_dict)) return [self.create_text_message(markdown_result)] + json_result diff --git a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_video.yaml b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_video.yaml index a516d3cb98..d846244e3d 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_video.yaml +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_video.yaml @@ -95,3 +95,14 @@ parameters: en_US: Proxy URL zh_Hans: 视频代理地址 form: form + - name: query_prefix + label: + en_US: Query Prefix + zh_Hans: 查询前缀 + type: string + required: false + default: "" + form: form + human_description: + en_US: Specific Search e.g. "site:www.ted.com" + zh_Hans: 定向搜索 e.g. "site:www.ted.com" From 17ee731546a80b98d1c75563b66ba12688926675 Mon Sep 17 00:00:00 2001 From: SebastjanPrachovskij <86522260+SebastjanPrachovskij@users.noreply.github.com> Date: Tue, 26 Nov 2024 03:34:51 +0200 Subject: [PATCH 14/29] SearchApi - Return error message instead of raising a ValueError (#11083) --- api/core/tools/provider/builtin/searchapi/tools/google.py | 2 +- api/core/tools/provider/builtin/searchapi/tools/google_jobs.py | 2 +- api/core/tools/provider/builtin/searchapi/tools/google_news.py | 2 +- .../provider/builtin/searchapi/tools/youtube_transcripts.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/core/tools/provider/builtin/searchapi/tools/google.py b/api/core/tools/provider/builtin/searchapi/tools/google.py index 17e2978194..29d36f5f23 100644 --- a/api/core/tools/provider/builtin/searchapi/tools/google.py +++ b/api/core/tools/provider/builtin/searchapi/tools/google.py @@ -45,7 +45,7 @@ class SearchAPI: def _process_response(res: dict, type: str) -> str: """Process response from SearchAPI.""" if "error" in res: - raise ValueError(f"Got error from SearchApi: {res['error']}") + return res["error"] toret = "" if type == "text": diff --git a/api/core/tools/provider/builtin/searchapi/tools/google_jobs.py b/api/core/tools/provider/builtin/searchapi/tools/google_jobs.py index c478bc108b..de42360898 100644 --- a/api/core/tools/provider/builtin/searchapi/tools/google_jobs.py +++ b/api/core/tools/provider/builtin/searchapi/tools/google_jobs.py @@ -45,7 +45,7 @@ class SearchAPI: def _process_response(res: dict, type: str) -> str: """Process response from SearchAPI.""" if "error" in res: - raise ValueError(f"Got error from SearchApi: {res['error']}") + return res["error"] toret = "" if type == "text": diff --git a/api/core/tools/provider/builtin/searchapi/tools/google_news.py b/api/core/tools/provider/builtin/searchapi/tools/google_news.py index 562bc01964..c8b3ccda05 100644 --- a/api/core/tools/provider/builtin/searchapi/tools/google_news.py +++ b/api/core/tools/provider/builtin/searchapi/tools/google_news.py @@ -45,7 +45,7 @@ class SearchAPI: def _process_response(res: dict, type: str) -> str: """Process response from SearchAPI.""" if "error" in res: - raise ValueError(f"Got error from SearchApi: {res['error']}") + return res["error"] toret = "" if type == "text": diff --git a/api/core/tools/provider/builtin/searchapi/tools/youtube_transcripts.py b/api/core/tools/provider/builtin/searchapi/tools/youtube_transcripts.py index 1867cf7be7..b14821f831 100644 --- a/api/core/tools/provider/builtin/searchapi/tools/youtube_transcripts.py +++ b/api/core/tools/provider/builtin/searchapi/tools/youtube_transcripts.py @@ -45,7 +45,7 @@ class SearchAPI: def _process_response(res: dict) -> str: """Process response from SearchAPI.""" if "error" in res: - raise ValueError(f"Got error from SearchApi: {res['error']}") + return res["error"] toret = "" if "transcripts" in res and "text" in res["transcripts"][0]: From 0f85e3557ba12f1bf0175ebe491452c34ec2a6f7 Mon Sep 17 00:00:00 2001 From: Hash Brown Date: Tue, 26 Nov 2024 10:23:03 +0800 Subject: [PATCH 15/29] fix: site icon not showing (#11094) --- api/libs/helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/libs/helper.py b/api/libs/helper.py index 023240a9a4..b98a4829e8 100644 --- a/api/libs/helper.py +++ b/api/libs/helper.py @@ -31,12 +31,12 @@ class AppIconUrlField(fields.Raw): if obj is None: return None - from models.model import App, IconType + from models.model import App, IconType, Site if isinstance(obj, dict) and "app" in obj: obj = obj["app"] - if isinstance(obj, App) and obj.icon_type == IconType.IMAGE.value: + if isinstance(obj, App | Site) and obj.icon_type == IconType.IMAGE.value: return file_helpers.get_signed_file_url(obj.icon) return None From f1366e8e195d4a86759a010cd5322a8571ee57ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=9E=E6=B3=95=E6=93=8D=E4=BD=9C?= Date: Tue, 26 Nov 2024 10:25:42 +0800 Subject: [PATCH 16/29] fix #11091 raise redirect issue (#11092) --- web/app/components/explore/app-list/index.tsx | 2 +- web/utils/app-redirection.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/app/components/explore/app-list/index.tsx b/web/app/components/explore/app-list/index.tsx index bd50708cb4..b8e7939328 100644 --- a/web/app/components/explore/app-list/index.tsx +++ b/web/app/components/explore/app-list/index.tsx @@ -145,7 +145,7 @@ const Apps = ({ if (onSuccess) onSuccess() localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1') - getRedirection(isCurrentWorkspaceEditor, app, push) + getRedirection(isCurrentWorkspaceEditor, { id: app.app_id }, push) } catch (e) { Toast.notify({ type: 'error', message: t('app.newApp.appCreateFailed') }) diff --git a/web/utils/app-redirection.ts b/web/utils/app-redirection.ts index b14f660e63..534b019250 100644 --- a/web/utils/app-redirection.ts +++ b/web/utils/app-redirection.ts @@ -4,12 +4,12 @@ export const getRedirection = ( redirectionFunc: (href: string) => void, ) => { if (!isCurrentWorkspaceEditor) { - redirectionFunc(`/app/${app.app_id}/overview`) + redirectionFunc(`/app/${app.id}/overview`) } else { if (app.mode === 'workflow' || app.mode === 'advanced-chat') - redirectionFunc(`/app/${app.app_id}/workflow`) + redirectionFunc(`/app/${app.id}/workflow`) else - redirectionFunc(`/app/${app.app_id}/configuration`) + redirectionFunc(`/app/${app.id}/configuration`) } } From 9f75970347f81e8556478fdbe402dcdbfdd2bc1d Mon Sep 17 00:00:00 2001 From: horochx <32632779+horochx@users.noreply.github.com> Date: Tue, 26 Nov 2024 10:29:00 +0800 Subject: [PATCH 17/29] fix: ops_trace_manager `from_end_user_id` (#11077) --- api/core/ops/ops_trace_manager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/core/ops/ops_trace_manager.py b/api/core/ops/ops_trace_manager.py index 1069889abd..b7799ce1fb 100644 --- a/api/core/ops/ops_trace_manager.py +++ b/api/core/ops/ops_trace_manager.py @@ -445,7 +445,7 @@ class TraceTask: "ls_provider": message_data.model_provider, "ls_model_name": message_data.model_id, "status": message_data.status, - "from_end_user_id": message_data.from_account_id, + "from_end_user_id": message_data.from_end_user_id, "from_account_id": message_data.from_account_id, "agent_based": message_data.agent_based, "workflow_run_id": message_data.workflow_run_id, @@ -521,7 +521,7 @@ class TraceTask: "ls_provider": message_data.model_provider, "ls_model_name": message_data.model_id, "status": message_data.status, - "from_end_user_id": message_data.from_account_id, + "from_end_user_id": message_data.from_end_user_id, "from_account_id": message_data.from_account_id, "agent_based": message_data.agent_based, "workflow_run_id": message_data.workflow_run_id, @@ -570,7 +570,7 @@ class TraceTask: "ls_provider": message_data.model_provider, "ls_model_name": message_data.model_id, "status": message_data.status, - "from_end_user_id": message_data.from_account_id, + "from_end_user_id": message_data.from_end_user_id, "from_account_id": message_data.from_account_id, "agent_based": message_data.agent_based, "workflow_run_id": message_data.workflow_run_id, From e9c098d024e02e9a40e96b3937422bc5c467ead9 Mon Sep 17 00:00:00 2001 From: NFish Date: Tue, 26 Nov 2024 11:33:04 +0800 Subject: [PATCH 18/29] Fix regenerate themes (#11101) --- web/themes/dark.css | 150 ++++++++++++++++++++++-- web/themes/light.css | 144 +++++++++++++++++++++-- web/themes/tailwind-theme-var-define.ts | 134 ++++++++++++++++++++- 3 files changed, 400 insertions(+), 28 deletions(-) diff --git a/web/themes/dark.css b/web/themes/dark.css index f89c59190d..892f48fa48 100644 --- a/web/themes/dark.css +++ b/web/themes/dark.css @@ -85,6 +85,10 @@ html[data-theme="dark"] { --color-components-button-secondary-accent-border-hover: #FFFFFF1F; --color-components-button-secondary-accent-border-disabled: #FFFFFF0D; + --color-components-button-indigo-bg: #444CE7; + --color-components-button-indigo-bg-hover: #6172F3; + --color-components-button-indigo-bg-disabled: #FFFFFF08; + --color-components-checkbox-icon: #FFFFFFF2; --color-components-checkbox-icon-disabled: #FFFFFF33; --color-components-checkbox-bg: #296DFF; @@ -95,10 +99,11 @@ html[data-theme="dark"] { --color-components-checkbox-border-disabled: #FFFFFF03; --color-components-checkbox-bg-unchecked: #FFFFFF08; --color-components-checkbox-bg-unchecked-hover: #FFFFFF0D; + --color-components-checkbox-bg-disabled-checked: #155AEF33; --color-components-radio-border-checked: #296DFF; --color-components-radio-border-checked-hover: #5289FF; - --color-components-radio-border-checked-disabled: #FFFFFF14; + --color-components-radio-border-checked-disabled: #155AEF33; --color-components-radio-bg-disabled: #FFFFFF08; --color-components-radio-border: #FFFFFF66; --color-components-radio-border-hover: #FFFFFF99; @@ -135,6 +140,9 @@ html[data-theme="dark"] { --color-components-panel-on-panel-item-bg: #27272B; --color-components-panel-on-panel-item-bg-hover: #3A3A40; --color-components-panel-on-panel-item-bg-alt: #3A3A40; + --color-components-panel-on-panel-item-bg-transparent: #2C2C30F2; + --color-components-panel-on-panel-item-bg-hover-transparent: #3A3A4000; + --color-components-panel-on-panel-item-bg-destructive-hover-transparent: #FFFBFA00; --color-components-panel-bg-transparent: #22222500; @@ -208,10 +216,12 @@ html[data-theme="dark"] { --color-components-actionbar-bg: #222225; --color-components-actionbar-border: #C8CEDA14; + --color-components-actionbar-bg-accent: #27272B; + --color-components-actionbar-border-accent: #5289FF; --color-components-dropzone-bg-alt: #18181BCC; --color-components-dropzone-bg: #18181B66; - --color-components-dropzone-bg-accent: #155AEF24; + --color-components-dropzone-bg-accent: #155AEF33; --color-components-dropzone-border: #C8CEDA24; --color-components-dropzone-border-alt: #C8CEDA33; --color-components-dropzone-border-accent: #84ABFF; @@ -228,6 +238,14 @@ html[data-theme="dark"] { --color-components-progress-gray-border: #98A2B2; --color-components-progress-gray-bg: #C8CEDA05; + --color-components-progress-warning-progress: #FDB022; + --color-components-progress-warning-border: #FDB022; + --color-components-progress-warning-bg: #F790090A; + + --color-components-progress-error-progress: #F97066; + --color-components-progress-error-border: #F97066; + --color-components-progress-error-bg: #F044380A; + --color-components-chat-input-audio-bg: #155AEF33; --color-components-chat-input-audio-wave-default: #C8CEDA24; --color-components-chat-input-bg-mask-1: #18181B0A; @@ -236,13 +254,103 @@ html[data-theme="dark"] { --color-components-chat-input-audio-wave-active: #84ABFF; --color-components-chat-input-audio-bg-alt: #18181BE5; - --color-components-Avatar-shape-fill-stop-0: #FFFFFFF2; - --color-components-Avatar-shape-fill-stop-100: #FFFFFFCC; + --color-components-avatar-shape-fill-stop-0: #FFFFFFF2; + --color-components-avatar-shape-fill-stop-100: #FFFFFFCC; - --color-components-Avatar-bg-mask-stop-0: #FFFFFF33; - --color-components-Avatar-bg-mask-stop-100: #FFFFFF08; + --color-components-avatar-bg-mask-stop-0: #FFFFFF33; + --color-components-avatar-bg-mask-stop-100: #FFFFFF08; - --color-components-Avatar-default-avatar-bg: #222225; + --color-components-avatar-default-avatar-bg: #222225; + --color-components-avatar-mask-darkmode-dimmed: #0000001F; + + --color-components-label-gray: #C8CEDA24; + + --color-components-premium-badge-blue-bg-stop-0: #5289FF; + --color-components-premium-badge-blue-bg-stop-100: #296DFF; + --color-components-premium-badge-blue-stroke-stop-0: #FFFFFF33; + --color-components-premium-badge-blue-stroke-stop-100: #296DFF; + --color-components-premium-badge-blue-text-stop-0: #EFF4FF; + --color-components-premium-badge-blue-text-stop-100: #B2CAFF; + --color-components-premium-badge-blue-glow: #004AEB; + --color-components-premium-badge-blue-bg-stop-0-hover: #84ABFF; + --color-components-premium-badge-blue-bg-stop-100-hover: #004AEB; + --color-components-premium-badge-blue-glow-hover: #D1E0FF; + --color-components-premium-badge-blue-stroke-stop-0-hover: #FFFFFF80; + --color-components-premium-badge-blue-stroke-stop-100-hover: #296DFF; + + --color-components-premium-badge-highlight-stop-0: #FFFFFF1F; + --color-components-premium-badge-highlight-stop-100: #FFFFFF33; + --color-components-premium-badge-indigo-bg-stop-0: #6172F3; + --color-components-premium-badge-indigo-bg-stop-100: #3538CD; + --color-components-premium-badge-indigo-stroke-stop-0: #FFFFFF33; + --color-components-premium-badge-indigo-stroke-stop-100: #444CE7; + --color-components-premium-badge-indigo-text-stop-0: #EEF4FF; + --color-components-premium-badge-indigo-text-stop-100: #C7D7FE; + --color-components-premium-badge-indigo-glow: #3538CD; + --color-components-premium-badge-indigo-glow-hover: #E0EAFF; + --color-components-premium-badge-indigo-bg-stop-0-hover: #A4BCFD; + --color-components-premium-badge-indigo-bg-stop-100-hover: #3538CD; + --color-components-premium-badge-indigo-stroke-stop-0-hover: #FFFFFF80; + --color-components-premium-badge-indigo-stroke-stop-100-hover: #444CE7; + + --color-components-premium-badge-grey-bg-stop-0: #676F83; + --color-components-premium-badge-grey-bg-stop-100: #495464; + --color-components-premium-badge-grey-stroke-stop-0: #FFFFFF1F; + --color-components-premium-badge-grey-stroke-stop-100: #495464; + --color-components-premium-badge-grey-text-stop-0: #F9FAFB; + --color-components-premium-badge-grey-text-stop-100: #E9EBF0; + --color-components-premium-badge-grey-glow: #354052; + --color-components-premium-badge-grey-glow-hover: #F2F4F7; + --color-components-premium-badge-grey-bg-stop-0-hover: #98A2B2; + --color-components-premium-badge-grey-bg-stop-100-hover: #354052; + --color-components-premium-badge-grey-stroke-stop-0-hover: #FFFFFF80; + --color-components-premium-badge-grey-stroke-stop-100-hover: #676F83; + + --color-components-premium-badge-orange-bg-stop-0: #FF692E; + --color-components-premium-badge-orange-bg-stop-100: #E04F16; + --color-components-premium-badge-orange-stroke-stop-0: #FFFFFF33; + --color-components-premium-badge-orange-stroke-stop-100: #FF4405; + --color-components-premium-badge-orange-text-stop-0: #FEF6EE; + --color-components-premium-badge-orange-text-stop-100: #F9DBAF; + --color-components-premium-badge-orange-glow: #B93815; + --color-components-premium-badge-orange-glow-hover: #FDEAD7; + --color-components-premium-badge-orange-bg-stop-0-hover: #FF692E; + --color-components-premium-badge-orange-bg-stop-100-hover: #B93815; + --color-components-premium-badge-orange-stroke-stop-0-hover: #FFFFFF80; + --color-components-premium-badge-orange-stroke-stop-100-hover: #FF4405; + + --color-components-progress-bar-bg: #C8CEDA14; + --color-components-progress-bar-progress: #C8CEDA24; + --color-components-progress-bar-border: #FFFFFF08; + --color-components-progress-bar-progress-solid: #FFFFFFF2; + --color-components-progress-bar-progress-highlight: #C8CEDA33; + + --color-components-icon-bg-red-solid: #D92D20; + --color-components-icon-bg-rose-solid: #E31B54; + --color-components-icon-bg-pink-solid: #DD2590; + --color-components-icon-bg-orange-dark-solid: #FF4405; + --color-components-icon-bg-yellow-solid: #EAAA08; + --color-components-icon-bg-green-solid: #4CA30D; + --color-components-icon-bg-teal-solid: #0E9384; + --color-components-icon-bg-blue-light-solid: #0BA5EC; + --color-components-icon-bg-blue-solid: #155AEF; + --color-components-icon-bg-indigo-solid: #444CE7; + --color-components-icon-bg-violet-solid: #7839EE; + --color-components-icon-bg-midnight-solid: #5D698D; + --color-components-icon-bg-rose-soft: #F63D6833; + --color-components-icon-bg-pink-soft: #EE46BC33; + --color-components-icon-bg-orange-dark-soft: #FF440533; + --color-components-icon-bg-yellow-soft: #EAAA0833; + --color-components-icon-bg-green-soft: #66C61C33; + --color-components-icon-bg-teal-soft: #15B79E33; + --color-components-icon-bg-blue-light-soft: #0BA5EC33; + --color-components-icon-bg-blue-soft: #155AEF33; + --color-components-icon-bg-indigo-soft: #6172F333; + --color-components-icon-bg-violet-soft: #875BF733; + --color-components-icon-bg-midnight-soft: #828DAD33; + --color-components-icon-bg-red-soft: #F0443833; + --color-components-icon-bg-orange-solid: #F79009; + --color-components-icon-bg-orange-soft: #F7900933; --color-text-primary: #FBFBFC; --color-text-secondary: #D9D9DE; @@ -302,6 +410,7 @@ html[data-theme="dark"] { --color-background-overlay-alt: #18181B66; --color-background-surface-white: #FFFFFFE5; --color-background-overlay-destructive: #F044384D; + --color-background-overlay-backdrop: #18181BF2; --color-shadow-shadow-1: #0000000D; --color-shadow-shadow-3: #0000001A; @@ -317,14 +426,20 @@ html[data-theme="dark"] { --color-workflow-block-border: #FFFFFF14; --color-workflow-block-parma-bg: #FFFFFF0D; --color-workflow-block-bg: #27272B; + --color-workflow-block-bg-transparent: #27272BF5; --color-workflow-block-border-highlight: #C8CEDA33; --color-workflow-canvas-workflow-dot-color: #8585AD26; --color-workflow-canvas-workflow-bg: #1D1D20; - --color-workflow-link-line-active: #296DFF; + --color-workflow-link-line-active: #5289FF; --color-workflow-link-line-normal: #676F83; - --color-workflow-link-line-handle: #296DFF; + --color-workflow-link-line-handle: #5289FF; + --color-workflow-link-line-normal-transparent: #676F8333; + --color-workflow-link-line-failure-active: #FDB022; + --color-workflow-link-line-failure-handle: #FDB022; + --color-workflow-link-line-failure-button-bg: #F79009; + --color-workflow-link-line-failure-button-hover: #DC6803; --color-workflow-link-line-success-active: #47CD89; --color-workflow-link-line-success-handle: #47CD89; @@ -341,8 +456,8 @@ html[data-theme="dark"] { --color-workflow-display-success-vignette-color: #17B26A40; --color-workflow-display-success-bg-line-pattern: #18181BCC; - --color-workflow-display-glass-1: #FFFFFF03; - --color-workflow-display-glass-2: #FFFFFF08; + --color-workflow-display-glass-1: #FFFFFF08; + --color-workflow-display-glass-2: #FFFFFF0D; --color-workflow-display-vignette-dark: #00000066; --color-workflow-display-highlight: #FFFFFF1F; --color-workflow-display-outline: #18181BF2; @@ -431,6 +546,7 @@ html[data-theme="dark"] { --color-util-colors-orange-orange-500: #EF6820; --color-util-colors-orange-orange-600: #F38744; --color-util-colors-orange-orange-700: #F7B27A; + --color-util-colors-orange-orange-100-transparent: #77291700; --color-util-colors-pink-pink-50: #4E0D30; --color-util-colors-pink-pink-100: #851651; @@ -606,4 +722,16 @@ html[data-theme="dark"] { --color-third-party-LangChain: #FFFFFF; --color-third-party-Langfuse: #FFFFFF; --color-third-party-Github: #FFFFFF; + --color-third-party-Github-tertiary: #C8CEDA99; + --color-third-party-Github-secondary: #D9D9DE; + --color-third-party-model-bg-openai: #121212; + --color-third-party-model-bg-anthropic: #1D1917; + --color-third-party-model-bg-default: #0B0B0E; + + --color-third-party-aws: #141F2E; + --color-third-party-aws-alt: #192639; + + --color-saas-background: #0B0B0E; + --color-saas-pricing-grid-bg: #C8CEDA33; + } \ No newline at end of file diff --git a/web/themes/light.css b/web/themes/light.css index 3b9c15505c..6fb2a6b00c 100644 --- a/web/themes/light.css +++ b/web/themes/light.css @@ -85,8 +85,12 @@ html[data-theme="light"] { --color-components-button-secondary-accent-border-hover: #10182824; --color-components-button-secondary-accent-border-disabled: #1018280A; + --color-components-button-indigo-bg: #444CE7; + --color-components-button-indigo-bg-hover: #3538CD; + --color-components-button-indigo-bg-disabled: #6172F324; + --color-components-checkbox-icon: #FFFFFF; - --color-components-checkbox-icon-disabled: #D0D5DC; + --color-components-checkbox-icon-disabled: #FFFFFF80; --color-components-checkbox-bg: #155AEF; --color-components-checkbox-bg-hover: #004AEB; --color-components-checkbox-bg-disabled: #F2F4F7; @@ -95,10 +99,11 @@ html[data-theme="light"] { --color-components-checkbox-border-disabled: #18181B0A; --color-components-checkbox-bg-unchecked: #FFFFFF; --color-components-checkbox-bg-unchecked-hover: #FFFFFF; + --color-components-checkbox-bg-disabled-checked: #B2CAFF; --color-components-radio-border-checked: #155AEF; --color-components-radio-border-checked-hover: #004AEB; - --color-components-radio-border-checked-disabled: #F2F4F7; + --color-components-radio-border-checked-disabled: #B2CAFF; --color-components-radio-bg-disabled: #FFFFFF00; --color-components-radio-border: #D0D5DC; --color-components-radio-border-hover: #98A2B2; @@ -135,6 +140,9 @@ html[data-theme="light"] { --color-components-panel-on-panel-item-bg: #FFFFFF; --color-components-panel-on-panel-item-bg-hover: #F9FAFB; --color-components-panel-on-panel-item-bg-alt: #F9FAFB; + --color-components-panel-on-panel-item-bg-transparent: #FFFFFFF2; + --color-components-panel-on-panel-item-bg-hover-transparent: #F9FAFB00; + --color-components-panel-on-panel-item-bg-destructive-hover-transparent: #FEF3F200; --color-components-panel-bg-transparent: #FFFFFF00; @@ -161,10 +169,10 @@ html[data-theme="light"] { --color-components-segmented-control-item-active-accent-bg: #FFFFFF; --color-components-segmented-control-item-active-accent-border: #FFFFFF; - --color-components-option-card-option-bg: #F9FAFB; + --color-components-option-card-option-bg: #FCFCFD; --color-components-option-card-option-selected-bg: #FFFFFF; --color-components-option-card-option-selected-border: #296DFF; - --color-components-option-card-option-border: #F2F4F7; + --color-components-option-card-option-border: #E9EBF0; --color-components-option-card-option-bg-hover: #FFFFFF; --color-components-option-card-option-border-hover: #D0D5DC; @@ -208,10 +216,12 @@ html[data-theme="light"] { --color-components-actionbar-bg: #FFFFFFF2; --color-components-actionbar-border: #1018280A; + --color-components-actionbar-bg-accent: #F5F7FF; + --color-components-actionbar-border-accent: #B2CAFF; --color-components-dropzone-bg-alt: #F2F4F7; --color-components-dropzone-bg: #F9FAFB; - --color-components-dropzone-bg-accent: #EFF4FF; + --color-components-dropzone-bg-accent: #155AEF24; --color-components-dropzone-border: #10182814; --color-components-dropzone-border-alt: #10182833; --color-components-dropzone-border-accent: #84ABFF; @@ -228,6 +238,14 @@ html[data-theme="light"] { --color-components-progress-gray-border: #98A2B2; --color-components-progress-gray-bg: #C8CEDA05; + --color-components-progress-warning-progress: #F79009; + --color-components-progress-warning-border: #F79009; + --color-components-progress-warning-bg: #F790090A; + + --color-components-progress-error-progress: #F04438; + --color-components-progress-error-border: #F04438; + --color-components-progress-error-bg: #F044380A; + --color-components-chat-input-audio-bg: #EFF4FF; --color-components-chat-input-audio-wave-default: #155AEF33; --color-components-chat-input-bg-mask-1: #FFFFFF03; @@ -236,13 +254,103 @@ html[data-theme="light"] { --color-components-chat-input-audio-wave-active: #296DFF; --color-components-chat-input-audio-bg-alt: #FCFCFD; - --color-components-Avatar-shape-fill-stop-0: #FFFFFF; - --color-components-Avatar-shape-fill-stop-100: #FFFFFFE5; + --color-components-avatar-shape-fill-stop-0: #FFFFFF; + --color-components-avatar-shape-fill-stop-100: #FFFFFFE5; - --color-components-Avatar-bg-mask-stop-0: #FFFFFF1F; - --color-components-Avatar-bg-mask-stop-100: #FFFFFF14; + --color-components-avatar-bg-mask-stop-0: #FFFFFF1F; + --color-components-avatar-bg-mask-stop-100: #FFFFFF14; - --color-components-Avatar-default-avatar-bg: #D0D5DC; + --color-components-avatar-default-avatar-bg: #D0D5DC; + --color-components-avatar-mask-darkmode-dimmed: #FFFFFF00; + + --color-components-label-gray: #F2F4F7; + + --color-components-premium-badge-blue-bg-stop-0: #5289FF; + --color-components-premium-badge-blue-bg-stop-100: #155AEF; + --color-components-premium-badge-blue-stroke-stop-0: #FFFFFFF2; + --color-components-premium-badge-blue-stroke-stop-100: #155AEF; + --color-components-premium-badge-blue-text-stop-0: #F5F7FF; + --color-components-premium-badge-blue-text-stop-100: #D1E0FF; + --color-components-premium-badge-blue-glow: #00329E; + --color-components-premium-badge-blue-bg-stop-0-hover: #296DFF; + --color-components-premium-badge-blue-bg-stop-100-hover: #004AEB; + --color-components-premium-badge-blue-glow-hover: #84ABFF; + --color-components-premium-badge-blue-stroke-stop-0-hover: #FFFFFFF2; + --color-components-premium-badge-blue-stroke-stop-100-hover: #00329E; + + --color-components-premium-badge-highlight-stop-0: #FFFFFF1F; + --color-components-premium-badge-highlight-stop-100: #FFFFFF4D; + --color-components-premium-badge-indigo-bg-stop-0: #8098F9; + --color-components-premium-badge-indigo-bg-stop-100: #444CE7; + --color-components-premium-badge-indigo-stroke-stop-0: #FFFFFFF2; + --color-components-premium-badge-indigo-stroke-stop-100: #6172F3; + --color-components-premium-badge-indigo-text-stop-0: #F5F8FF; + --color-components-premium-badge-indigo-text-stop-100: #E0EAFF; + --color-components-premium-badge-indigo-glow: #2D3282; + --color-components-premium-badge-indigo-glow-hover: #A4BCFD; + --color-components-premium-badge-indigo-bg-stop-0-hover: #6172F3; + --color-components-premium-badge-indigo-bg-stop-100-hover: #2D31A6; + --color-components-premium-badge-indigo-stroke-stop-0-hover: #FFFFFFF2; + --color-components-premium-badge-indigo-stroke-stop-100-hover: #2D31A6; + + --color-components-premium-badge-grey-bg-stop-0: #98A2B2; + --color-components-premium-badge-grey-bg-stop-100: #676F83; + --color-components-premium-badge-grey-stroke-stop-0: #FFFFFFF2; + --color-components-premium-badge-grey-stroke-stop-100: #676F83; + --color-components-premium-badge-grey-text-stop-0: #FCFCFD; + --color-components-premium-badge-grey-text-stop-100: #F2F4F7; + --color-components-premium-badge-grey-glow: #101828; + --color-components-premium-badge-grey-glow-hover: #D0D5DC; + --color-components-premium-badge-grey-bg-stop-0-hover: #676F83; + --color-components-premium-badge-grey-bg-stop-100-hover: #354052; + --color-components-premium-badge-grey-stroke-stop-0-hover: #FFFFFFF2; + --color-components-premium-badge-grey-stroke-stop-100-hover: #354052; + + --color-components-premium-badge-orange-bg-stop-0: #FF692E; + --color-components-premium-badge-orange-bg-stop-100: #E04F16; + --color-components-premium-badge-orange-stroke-stop-0: #FFFFFFF2; + --color-components-premium-badge-orange-stroke-stop-100: #E62E05; + --color-components-premium-badge-orange-text-stop-0: #FEFAF5; + --color-components-premium-badge-orange-text-stop-100: #FDEAD7; + --color-components-premium-badge-orange-glow: #772917; + --color-components-premium-badge-orange-glow-hover: #F7B27A; + --color-components-premium-badge-orange-bg-stop-0-hover: #FF4405; + --color-components-premium-badge-orange-bg-stop-100-hover: #B93815; + --color-components-premium-badge-orange-stroke-stop-0-hover: #FFFFFFF2; + --color-components-premium-badge-orange-stroke-stop-100-hover: #BC1B06; + + --color-components-progress-bar-bg: #155AEF0A; + --color-components-progress-bar-progress: #155AEF24; + --color-components-progress-bar-border: #1018280A; + --color-components-progress-bar-progress-solid: #296DFF; + --color-components-progress-bar-progress-highlight: #155AEF33; + + --color-components-icon-bg-red-solid: #D92D20; + --color-components-icon-bg-rose-solid: #E31B54; + --color-components-icon-bg-pink-solid: #DD2590; + --color-components-icon-bg-orange-dark-solid: #FF4405; + --color-components-icon-bg-yellow-solid: #EAAA08; + --color-components-icon-bg-green-solid: #4CA30D; + --color-components-icon-bg-teal-solid: #0E9384; + --color-components-icon-bg-blue-light-solid: #0BA5EC; + --color-components-icon-bg-blue-solid: #155AEF; + --color-components-icon-bg-indigo-solid: #444CE7; + --color-components-icon-bg-violet-solid: #7839EE; + --color-components-icon-bg-midnight-solid: #828DAD; + --color-components-icon-bg-rose-soft: #FFF1F3; + --color-components-icon-bg-pink-soft: #FDF2FA; + --color-components-icon-bg-orange-dark-soft: #FFF4ED; + --color-components-icon-bg-yellow-soft: #FEFBE8; + --color-components-icon-bg-green-soft: #F3FEE7; + --color-components-icon-bg-teal-soft: #F0FDF9; + --color-components-icon-bg-blue-light-soft: #F0F9FF; + --color-components-icon-bg-blue-soft: #EFF4FF; + --color-components-icon-bg-indigo-soft: #EEF4FF; + --color-components-icon-bg-violet-soft: #F5F3FF; + --color-components-icon-bg-midnight-soft: #F0F2F5; + --color-components-icon-bg-red-soft: #FEF3F2; + --color-components-icon-bg-orange-solid: #F79009; + --color-components-icon-bg-orange-soft: #FFFAEB; --color-text-primary: #101828; --color-text-secondary: #354052; @@ -302,6 +410,7 @@ html[data-theme="light"] { --color-background-overlay-alt: #10182866; --color-background-surface-white: #FFFFFFF2; --color-background-overlay-destructive: #F044384D; + --color-background-overlay-backdrop: #F2F4F7F2; --color-shadow-shadow-1: #09090B08; --color-shadow-shadow-3: #09090B0D; @@ -317,6 +426,7 @@ html[data-theme="light"] { --color-workflow-block-border: #FFFFFF; --color-workflow-block-parma-bg: #F2F4F7; --color-workflow-block-bg: #FCFCFD; + --color-workflow-block-bg-transparent: #FCFCFDE5; --color-workflow-block-border-highlight: #155AEF24; --color-workflow-canvas-workflow-dot-color: #8585AD26; @@ -436,6 +546,7 @@ html[data-theme="light"] { --color-util-colors-orange-orange-500: #EF6820; --color-util-colors-orange-orange-600: #E04F16; --color-util-colors-orange-orange-700: #B93815; + --color-util-colors-orange-orange-100-transparent: #FDEAD700; --color-util-colors-pink-pink-50: #FDF2FA; --color-util-colors-pink-pink-100: #FCE7F6; @@ -610,6 +721,17 @@ html[data-theme="light"] { --color-third-party-LangChain: #1C3C3C; --color-third-party-Langfuse: #000000; - --color-third-party-Github: #1B1F24; + --color-third-party-Github-tertiary: #1B1F24; + --color-third-party-Github-secondary: #1B1F24; + --color-third-party-model-bg-openai: #E3E5E8; + --color-third-party-model-bg-anthropic: #EEEDE7; + --color-third-party-model-bg-default: #F9FAFB; + + --color-third-party-aws: #141F2E; + --color-third-party-aws-alt: #0F1824; + + --color-saas-background: #FCFCFD; + --color-saas-pricing-grid-bg: #C8CEDA80; + } \ No newline at end of file diff --git a/web/themes/tailwind-theme-var-define.ts b/web/themes/tailwind-theme-var-define.ts index a81e224e9d..6329ce3d26 100644 --- a/web/themes/tailwind-theme-var-define.ts +++ b/web/themes/tailwind-theme-var-define.ts @@ -85,6 +85,10 @@ const vars = { 'components-button-secondary-accent-border-hover': 'var(--color-components-button-secondary-accent-border-hover)', 'components-button-secondary-accent-border-disabled': 'var(--color-components-button-secondary-accent-border-disabled)', + 'components-button-indigo-bg': 'var(--color-components-button-indigo-bg)', + 'components-button-indigo-bg-hover': 'var(--color-components-button-indigo-bg-hover)', + 'components-button-indigo-bg-disabled': 'var(--color-components-button-indigo-bg-disabled)', + 'components-checkbox-icon': 'var(--color-components-checkbox-icon)', 'components-checkbox-icon-disabled': 'var(--color-components-checkbox-icon-disabled)', 'components-checkbox-bg': 'var(--color-components-checkbox-bg)', @@ -95,6 +99,7 @@ const vars = { 'components-checkbox-border-disabled': 'var(--color-components-checkbox-border-disabled)', 'components-checkbox-bg-unchecked': 'var(--color-components-checkbox-bg-unchecked)', 'components-checkbox-bg-unchecked-hover': 'var(--color-components-checkbox-bg-unchecked-hover)', + 'components-checkbox-bg-disabled-checked': 'var(--color-components-checkbox-bg-disabled-checked)', 'components-radio-border-checked': 'var(--color-components-radio-border-checked)', 'components-radio-border-checked-hover': 'var(--color-components-radio-border-checked-hover)', @@ -135,6 +140,9 @@ const vars = { 'components-panel-on-panel-item-bg': 'var(--color-components-panel-on-panel-item-bg)', 'components-panel-on-panel-item-bg-hover': 'var(--color-components-panel-on-panel-item-bg-hover)', 'components-panel-on-panel-item-bg-alt': 'var(--color-components-panel-on-panel-item-bg-alt)', + 'components-panel-on-panel-item-bg-transparent': 'var(--color-components-panel-on-panel-item-bg-transparent)', + 'components-panel-on-panel-item-bg-hover-transparent': 'var(--color-components-panel-on-panel-item-bg-hover-transparent)', + 'components-panel-on-panel-item-bg-destructive-hover-transparent': 'var(--color-components-panel-on-panel-item-bg-destructive-hover-transparent)', 'components-panel-bg-transparent': 'var(--color-components-panel-bg-transparent)', @@ -208,6 +216,8 @@ const vars = { 'components-actionbar-bg': 'var(--color-components-actionbar-bg)', 'components-actionbar-border': 'var(--color-components-actionbar-border)', + 'components-actionbar-bg-accent': 'var(--color-components-actionbar-bg-accent)', + 'components-actionbar-border-accent': 'var(--color-components-actionbar-border-accent)', 'components-dropzone-bg-alt': 'var(--color-components-dropzone-bg-alt)', 'components-dropzone-bg': 'var(--color-components-dropzone-bg)', @@ -228,6 +238,14 @@ const vars = { 'components-progress-gray-border': 'var(--color-components-progress-gray-border)', 'components-progress-gray-bg': 'var(--color-components-progress-gray-bg)', + 'components-progress-warning-progress': 'var(--color-components-progress-warning-progress)', + 'components-progress-warning-border': 'var(--color-components-progress-warning-border)', + 'components-progress-warning-bg': 'var(--color-components-progress-warning-bg)', + + 'components-progress-error-progress': 'var(--color-components-progress-error-progress)', + 'components-progress-error-border': 'var(--color-components-progress-error-border)', + 'components-progress-error-bg': 'var(--color-components-progress-error-bg)', + 'components-chat-input-audio-bg': 'var(--color-components-chat-input-audio-bg)', 'components-chat-input-audio-wave-default': 'var(--color-components-chat-input-audio-wave-default)', 'components-chat-input-bg-mask-1': 'var(--color-components-chat-input-bg-mask-1)', @@ -236,13 +254,103 @@ const vars = { 'components-chat-input-audio-wave-active': 'var(--color-components-chat-input-audio-wave-active)', 'components-chat-input-audio-bg-alt': 'var(--color-components-chat-input-audio-bg-alt)', - 'components-Avatar-shape-fill-stop-0': 'var(--color-components-Avatar-shape-fill-stop-0)', - 'components-Avatar-shape-fill-stop-100': 'var(--color-components-Avatar-shape-fill-stop-100)', + 'components-avatar-shape-fill-stop-0': 'var(--color-components-avatar-shape-fill-stop-0)', + 'components-avatar-shape-fill-stop-100': 'var(--color-components-avatar-shape-fill-stop-100)', - 'components-Avatar-bg-mask-stop-0': 'var(--color-components-Avatar-bg-mask-stop-0)', - 'components-Avatar-bg-mask-stop-100': 'var(--color-components-Avatar-bg-mask-stop-100)', + 'components-avatar-bg-mask-stop-0': 'var(--color-components-avatar-bg-mask-stop-0)', + 'components-avatar-bg-mask-stop-100': 'var(--color-components-avatar-bg-mask-stop-100)', - 'components-Avatar-default-avatar-bg': 'var(--color-components-Avatar-default-avatar-bg)', + 'components-avatar-default-avatar-bg': 'var(--color-components-avatar-default-avatar-bg)', + 'components-avatar-mask-darkmode-dimmed': 'var(--color-components-avatar-mask-darkmode-dimmed)', + + 'components-label-gray': 'var(--color-components-label-gray)', + + 'components-premium-badge-blue-bg-stop-0': 'var(--color-components-premium-badge-blue-bg-stop-0)', + 'components-premium-badge-blue-bg-stop-100': 'var(--color-components-premium-badge-blue-bg-stop-100)', + 'components-premium-badge-blue-stroke-stop-0': 'var(--color-components-premium-badge-blue-stroke-stop-0)', + 'components-premium-badge-blue-stroke-stop-100': 'var(--color-components-premium-badge-blue-stroke-stop-100)', + 'components-premium-badge-blue-text-stop-0': 'var(--color-components-premium-badge-blue-text-stop-0)', + 'components-premium-badge-blue-text-stop-100': 'var(--color-components-premium-badge-blue-text-stop-100)', + 'components-premium-badge-blue-glow': 'var(--color-components-premium-badge-blue-glow)', + 'components-premium-badge-blue-bg-stop-0-hover': 'var(--color-components-premium-badge-blue-bg-stop-0-hover)', + 'components-premium-badge-blue-bg-stop-100-hover': 'var(--color-components-premium-badge-blue-bg-stop-100-hover)', + 'components-premium-badge-blue-glow-hover': 'var(--color-components-premium-badge-blue-glow-hover)', + 'components-premium-badge-blue-stroke-stop-0-hover': 'var(--color-components-premium-badge-blue-stroke-stop-0-hover)', + 'components-premium-badge-blue-stroke-stop-100-hover': 'var(--color-components-premium-badge-blue-stroke-stop-100-hover)', + + 'components-premium-badge-highlight-stop-0': 'var(--color-components-premium-badge-highlight-stop-0)', + 'components-premium-badge-highlight-stop-100': 'var(--color-components-premium-badge-highlight-stop-100)', + 'components-premium-badge-indigo-bg-stop-0': 'var(--color-components-premium-badge-indigo-bg-stop-0)', + 'components-premium-badge-indigo-bg-stop-100': 'var(--color-components-premium-badge-indigo-bg-stop-100)', + 'components-premium-badge-indigo-stroke-stop-0': 'var(--color-components-premium-badge-indigo-stroke-stop-0)', + 'components-premium-badge-indigo-stroke-stop-100': 'var(--color-components-premium-badge-indigo-stroke-stop-100)', + 'components-premium-badge-indigo-text-stop-0': 'var(--color-components-premium-badge-indigo-text-stop-0)', + 'components-premium-badge-indigo-text-stop-100': 'var(--color-components-premium-badge-indigo-text-stop-100)', + 'components-premium-badge-indigo-glow': 'var(--color-components-premium-badge-indigo-glow)', + 'components-premium-badge-indigo-glow-hover': 'var(--color-components-premium-badge-indigo-glow-hover)', + 'components-premium-badge-indigo-bg-stop-0-hover': 'var(--color-components-premium-badge-indigo-bg-stop-0-hover)', + 'components-premium-badge-indigo-bg-stop-100-hover': 'var(--color-components-premium-badge-indigo-bg-stop-100-hover)', + 'components-premium-badge-indigo-stroke-stop-0-hover': 'var(--color-components-premium-badge-indigo-stroke-stop-0-hover)', + 'components-premium-badge-indigo-stroke-stop-100-hover': 'var(--color-components-premium-badge-indigo-stroke-stop-100-hover)', + + 'components-premium-badge-grey-bg-stop-0': 'var(--color-components-premium-badge-grey-bg-stop-0)', + 'components-premium-badge-grey-bg-stop-100': 'var(--color-components-premium-badge-grey-bg-stop-100)', + 'components-premium-badge-grey-stroke-stop-0': 'var(--color-components-premium-badge-grey-stroke-stop-0)', + 'components-premium-badge-grey-stroke-stop-100': 'var(--color-components-premium-badge-grey-stroke-stop-100)', + 'components-premium-badge-grey-text-stop-0': 'var(--color-components-premium-badge-grey-text-stop-0)', + 'components-premium-badge-grey-text-stop-100': 'var(--color-components-premium-badge-grey-text-stop-100)', + 'components-premium-badge-grey-glow': 'var(--color-components-premium-badge-grey-glow)', + 'components-premium-badge-grey-glow-hover': 'var(--color-components-premium-badge-grey-glow-hover)', + 'components-premium-badge-grey-bg-stop-0-hover': 'var(--color-components-premium-badge-grey-bg-stop-0-hover)', + 'components-premium-badge-grey-bg-stop-100-hover': 'var(--color-components-premium-badge-grey-bg-stop-100-hover)', + 'components-premium-badge-grey-stroke-stop-0-hover': 'var(--color-components-premium-badge-grey-stroke-stop-0-hover)', + 'components-premium-badge-grey-stroke-stop-100-hover': 'var(--color-components-premium-badge-grey-stroke-stop-100-hover)', + + 'components-premium-badge-orange-bg-stop-0': 'var(--color-components-premium-badge-orange-bg-stop-0)', + 'components-premium-badge-orange-bg-stop-100': 'var(--color-components-premium-badge-orange-bg-stop-100)', + 'components-premium-badge-orange-stroke-stop-0': 'var(--color-components-premium-badge-orange-stroke-stop-0)', + 'components-premium-badge-orange-stroke-stop-100': 'var(--color-components-premium-badge-orange-stroke-stop-100)', + 'components-premium-badge-orange-text-stop-0': 'var(--color-components-premium-badge-orange-text-stop-0)', + 'components-premium-badge-orange-text-stop-100': 'var(--color-components-premium-badge-orange-text-stop-100)', + 'components-premium-badge-orange-glow': 'var(--color-components-premium-badge-orange-glow)', + 'components-premium-badge-orange-glow-hover': 'var(--color-components-premium-badge-orange-glow-hover)', + 'components-premium-badge-orange-bg-stop-0-hover': 'var(--color-components-premium-badge-orange-bg-stop-0-hover)', + 'components-premium-badge-orange-bg-stop-100-hover': 'var(--color-components-premium-badge-orange-bg-stop-100-hover)', + 'components-premium-badge-orange-stroke-stop-0-hover': 'var(--color-components-premium-badge-orange-stroke-stop-0-hover)', + 'components-premium-badge-orange-stroke-stop-100-hover': 'var(--color-components-premium-badge-orange-stroke-stop-100-hover)', + + 'components-progress-bar-bg': 'var(--color-components-progress-bar-bg)', + 'components-progress-bar-progress': 'var(--color-components-progress-bar-progress)', + 'components-progress-bar-border': 'var(--color-components-progress-bar-border)', + 'components-progress-bar-progress-solid': 'var(--color-components-progress-bar-progress-solid)', + 'components-progress-bar-progress-highlight': 'var(--color-components-progress-bar-progress-highlight)', + + 'components-icon-bg-red-solid': 'var(--color-components-icon-bg-red-solid)', + 'components-icon-bg-rose-solid': 'var(--color-components-icon-bg-rose-solid)', + 'components-icon-bg-pink-solid': 'var(--color-components-icon-bg-pink-solid)', + 'components-icon-bg-orange-dark-solid': 'var(--color-components-icon-bg-orange-dark-solid)', + 'components-icon-bg-yellow-solid': 'var(--color-components-icon-bg-yellow-solid)', + 'components-icon-bg-green-solid': 'var(--color-components-icon-bg-green-solid)', + 'components-icon-bg-teal-solid': 'var(--color-components-icon-bg-teal-solid)', + 'components-icon-bg-blue-light-solid': 'var(--color-components-icon-bg-blue-light-solid)', + 'components-icon-bg-blue-solid': 'var(--color-components-icon-bg-blue-solid)', + 'components-icon-bg-indigo-solid': 'var(--color-components-icon-bg-indigo-solid)', + 'components-icon-bg-violet-solid': 'var(--color-components-icon-bg-violet-solid)', + 'components-icon-bg-midnight-solid': 'var(--color-components-icon-bg-midnight-solid)', + 'components-icon-bg-rose-soft': 'var(--color-components-icon-bg-rose-soft)', + 'components-icon-bg-pink-soft': 'var(--color-components-icon-bg-pink-soft)', + 'components-icon-bg-orange-dark-soft': 'var(--color-components-icon-bg-orange-dark-soft)', + 'components-icon-bg-yellow-soft': 'var(--color-components-icon-bg-yellow-soft)', + 'components-icon-bg-green-soft': 'var(--color-components-icon-bg-green-soft)', + 'components-icon-bg-teal-soft': 'var(--color-components-icon-bg-teal-soft)', + 'components-icon-bg-blue-light-soft': 'var(--color-components-icon-bg-blue-light-soft)', + 'components-icon-bg-blue-soft': 'var(--color-components-icon-bg-blue-soft)', + 'components-icon-bg-indigo-soft': 'var(--color-components-icon-bg-indigo-soft)', + 'components-icon-bg-violet-soft': 'var(--color-components-icon-bg-violet-soft)', + 'components-icon-bg-midnight-soft': 'var(--color-components-icon-bg-midnight-soft)', + 'components-icon-bg-red-soft': 'var(--color-components-icon-bg-red-soft)', + 'components-icon-bg-orange-solid': 'var(--color-components-icon-bg-orange-solid)', + 'components-icon-bg-orange-soft': 'var(--color-components-icon-bg-orange-soft)', 'text-primary': 'var(--color-text-primary)', 'text-secondary': 'var(--color-text-secondary)', @@ -302,6 +410,7 @@ const vars = { 'background-overlay-alt': 'var(--color-background-overlay-alt)', 'background-surface-white': 'var(--color-background-surface-white)', 'background-overlay-destructive': 'var(--color-background-overlay-destructive)', + 'background-overlay-backdrop': 'var(--color-background-overlay-backdrop)', 'shadow-shadow-1': 'var(--color-shadow-shadow-1)', 'shadow-shadow-3': 'var(--color-shadow-shadow-3)', @@ -317,6 +426,7 @@ const vars = { 'workflow-block-border': 'var(--color-workflow-block-border)', 'workflow-block-parma-bg': 'var(--color-workflow-block-parma-bg)', 'workflow-block-bg': 'var(--color-workflow-block-bg)', + 'workflow-block-bg-transparent': 'var(--color-workflow-block-bg-transparent)', 'workflow-block-border-highlight': 'var(--color-workflow-block-border-highlight)', 'workflow-canvas-workflow-dot-color': 'var(--color-workflow-canvas-workflow-dot-color)', @@ -436,6 +546,7 @@ const vars = { 'util-colors-orange-orange-500': 'var(--color-util-colors-orange-orange-500)', 'util-colors-orange-orange-600': 'var(--color-util-colors-orange-orange-600)', 'util-colors-orange-orange-700': 'var(--color-util-colors-orange-orange-700)', + 'util-colors-orange-orange-100-transparent': 'var(--color-util-colors-orange-orange-100-transparent)', 'util-colors-pink-pink-50': 'var(--color-util-colors-pink-pink-50)', 'util-colors-pink-pink-100': 'var(--color-util-colors-pink-pink-100)', @@ -611,6 +722,17 @@ const vars = { 'third-party-LangChain': 'var(--color-third-party-LangChain)', 'third-party-Langfuse': 'var(--color-third-party-Langfuse)', 'third-party-Github': 'var(--color-third-party-Github)', -} + 'third-party-Github-tertiary': 'var(--color-third-party-Github-tertiary)', + 'third-party-Github-secondary': 'var(--color-third-party-Github-secondary)', + 'third-party-model-bg-openai': 'var(--color-third-party-model-bg-openai)', + 'third-party-model-bg-anthropic': 'var(--color-third-party-model-bg-anthropic)', + 'third-party-model-bg-default': 'var(--color-third-party-model-bg-default)', + 'third-party-aws': 'var(--color-third-party-aws)', + 'third-party-aws-alt': 'var(--color-third-party-aws-alt)', + + 'saas-background': 'var(--color-saas-background)', + 'saas-pricing-grid-bg': 'var(--color-saas-pricing-grid-bg)', + +} export default vars From 20c091a5e7eeebf2f3310f4766d95dc518834000 Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 26 Nov 2024 12:47:59 +0800 Subject: [PATCH 19/29] fix: user query be ignored if query_prompt_template is an empty string (#11103) --- api/core/workflow/nodes/llm/node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index 4a6f0ecae9..9f5df1edc6 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -137,7 +137,7 @@ class LLMNode(BaseNode[LLMNodeData]): query = None if self.node_data.memory: query = self.node_data.memory.query_prompt_template - if query is None and ( + if not query and ( query_variable := self.graph_runtime_state.variable_pool.get( (SYSTEM_VARIABLE_NODE_ID, SystemVariableKey.QUERY) ) From cbb4e95928138e63cb8948f89d6e8d282327cf0d Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 26 Nov 2024 13:07:32 +0800 Subject: [PATCH 20/29] fix(llm_node): Ignore user query when memory is disabled. (#11106) --- api/core/workflow/nodes/llm/node.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index 9f5df1edc6..8653f539a0 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -137,12 +137,12 @@ class LLMNode(BaseNode[LLMNodeData]): query = None if self.node_data.memory: query = self.node_data.memory.query_prompt_template - if not query and ( - query_variable := self.graph_runtime_state.variable_pool.get( - (SYSTEM_VARIABLE_NODE_ID, SystemVariableKey.QUERY) - ) - ): - query = query_variable.text + if not query and ( + query_variable := self.graph_runtime_state.variable_pool.get( + (SYSTEM_VARIABLE_NODE_ID, SystemVariableKey.QUERY) + ) + ): + query = query_variable.text prompt_messages, stop = self._fetch_prompt_messages( user_query=query, From 1db14793fa4043598b8c42fd30d5c07ba4463add Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 26 Nov 2024 13:31:40 +0800 Subject: [PATCH 21/29] fix(anthropic_llm): Ignore non-text parts in the system prompt. (#11107) --- .../model_runtime/model_providers/anthropic/llm/llm.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/api/core/model_runtime/model_providers/anthropic/llm/llm.py b/api/core/model_runtime/model_providers/anthropic/llm/llm.py index 79701e4ea4..b5de02193b 100644 --- a/api/core/model_runtime/model_providers/anthropic/llm/llm.py +++ b/api/core/model_runtime/model_providers/anthropic/llm/llm.py @@ -461,7 +461,15 @@ class AnthropicLargeLanguageModel(LargeLanguageModel): first_loop = True for message in prompt_messages: if isinstance(message, SystemPromptMessage): - message.content = message.content.strip() + if isinstance(message.content, str): + message.content = message.content.strip() + elif isinstance(message.content, list): + # System prompt only support text + message.content = "".join( + c.data.strip() for c in message.content if isinstance(c, TextPromptMessageContent) + ) + else: + raise ValueError(f"Unknown system prompt message content type {type(message.content)}") if first_loop: system = message.content first_loop = False From 90d5765fb64e9abc6b03d5016c4cc6940c627ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=9E=E6=B3=95=E6=93=8D=E4=BD=9C?= Date: Tue, 26 Nov 2024 13:42:13 +0800 Subject: [PATCH 22/29] fix: app copy raise error (#11108) --- api/controllers/console/app/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index 9687b59cd1..da72b704c7 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -190,7 +190,7 @@ class AppCopyApi(Resource): ) session.commit() - stmt = select(App).where(App.id == result.app.id) + stmt = select(App).where(App.id == result.app_id) app = session.scalar(stmt) return app, 201 From 8d5a1be2273bfcf7a919f9268f80a1e8847abc15 Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 26 Nov 2024 13:43:38 +0800 Subject: [PATCH 23/29] fix: Cannot use files in the user inputs. (#11112) --- api/core/app/apps/advanced_chat/app_generator.py | 4 +++- api/core/app/apps/agent_chat/app_generator.py | 4 +++- api/core/app/apps/chat/app_generator.py | 4 +++- api/core/app/apps/completion/app_generator.py | 2 +- api/models/account.py | 4 ++-- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/api/core/app/apps/advanced_chat/app_generator.py b/api/core/app/apps/advanced_chat/app_generator.py index c099b29c97..ffe56ce410 100644 --- a/api/core/app/apps/advanced_chat/app_generator.py +++ b/api/core/app/apps/advanced_chat/app_generator.py @@ -127,7 +127,9 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator): conversation_id=conversation.id if conversation else None, inputs=conversation.inputs if conversation - else self._prepare_user_inputs(user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.id), + else self._prepare_user_inputs( + user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.tenant_id + ), query=query, files=file_objs, parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL, diff --git a/api/core/app/apps/agent_chat/app_generator.py b/api/core/app/apps/agent_chat/app_generator.py index ae0a01e8a7..48ee590e2f 100644 --- a/api/core/app/apps/agent_chat/app_generator.py +++ b/api/core/app/apps/agent_chat/app_generator.py @@ -134,7 +134,9 @@ class AgentChatAppGenerator(MessageBasedAppGenerator): conversation_id=conversation.id if conversation else None, inputs=conversation.inputs if conversation - else self._prepare_user_inputs(user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.id), + else self._prepare_user_inputs( + user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.tenant_id + ), query=query, files=file_objs, parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL, diff --git a/api/core/app/apps/chat/app_generator.py b/api/core/app/apps/chat/app_generator.py index cf6aae34f8..5b3efe12eb 100644 --- a/api/core/app/apps/chat/app_generator.py +++ b/api/core/app/apps/chat/app_generator.py @@ -132,7 +132,9 @@ class ChatAppGenerator(MessageBasedAppGenerator): conversation_id=conversation.id if conversation else None, inputs=conversation.inputs if conversation - else self._prepare_user_inputs(user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.id), + else self._prepare_user_inputs( + user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.tenant_id + ), query=query, files=file_objs, parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL, diff --git a/api/core/app/apps/completion/app_generator.py b/api/core/app/apps/completion/app_generator.py index 70434f24c1..e9e50015bd 100644 --- a/api/core/app/apps/completion/app_generator.py +++ b/api/core/app/apps/completion/app_generator.py @@ -114,7 +114,7 @@ class CompletionAppGenerator(MessageBasedAppGenerator): model_conf=ModelConfigConverter.convert(app_config), file_upload_config=file_extra_config, inputs=self._prepare_user_inputs( - user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.id + user_inputs=inputs, variables=app_config.variables, tenant_id=app_model.tenant_id ), query=query, files=file_objs, diff --git a/api/models/account.py b/api/models/account.py index 18be4be036..951e836dec 100644 --- a/api/models/account.py +++ b/api/models/account.py @@ -56,8 +56,8 @@ class Account(UserMixin, db.Model): self._current_tenant = tenant @property - def current_tenant_id(self): - return self._current_tenant.id + def current_tenant_id(self) -> str | None: + return self._current_tenant.id if self._current_tenant else None @current_tenant_id.setter def current_tenant_id(self, value: str): From 5b7b328193e65eacd33d97e652acac2567bc0375 Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 26 Nov 2024 13:45:49 +0800 Subject: [PATCH 24/29] feat: Allow to contains files in the system prompt even model not support. (#11111) --- .../model_providers/anthropic/llm/llm.py | 2 +- .../model_providers/openai/llm/llm.py | 3 +++ api/core/workflow/nodes/llm/node.py | 23 ++++++++++++------- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/api/core/model_runtime/model_providers/anthropic/llm/llm.py b/api/core/model_runtime/model_providers/anthropic/llm/llm.py index b5de02193b..b24324708b 100644 --- a/api/core/model_runtime/model_providers/anthropic/llm/llm.py +++ b/api/core/model_runtime/model_providers/anthropic/llm/llm.py @@ -453,7 +453,7 @@ class AnthropicLargeLanguageModel(LargeLanguageModel): return credentials_kwargs - def _convert_prompt_messages(self, prompt_messages: list[PromptMessage]) -> tuple[str, list[dict]]: + def _convert_prompt_messages(self, prompt_messages: Sequence[PromptMessage]) -> tuple[str, list[dict]]: """ Convert prompt messages to dict list and system """ diff --git a/api/core/model_runtime/model_providers/openai/llm/llm.py b/api/core/model_runtime/model_providers/openai/llm/llm.py index aea884e002..07cb1e2d10 100644 --- a/api/core/model_runtime/model_providers/openai/llm/llm.py +++ b/api/core/model_runtime/model_providers/openai/llm/llm.py @@ -943,6 +943,9 @@ class OpenAILargeLanguageModel(_CommonOpenAI, LargeLanguageModel): } elif isinstance(message, SystemPromptMessage): message = cast(SystemPromptMessage, message) + if isinstance(message.content, list): + text_contents = filter(lambda c: isinstance(c, TextPromptMessageContent), message.content) + message.content = "".join(c.data for c in text_contents) message_dict = {"role": "system", "content": message.content} elif isinstance(message, ToolPromptMessage): message = cast(ToolPromptMessage, message) diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index 8653f539a0..2380829f7d 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -20,6 +20,7 @@ from core.model_runtime.entities import ( from core.model_runtime.entities.llm_entities import LLMResult, LLMUsage from core.model_runtime.entities.message_entities import ( AssistantPromptMessage, + PromptMessageContent, PromptMessageRole, SystemPromptMessage, UserPromptMessage, @@ -828,14 +829,14 @@ class LLMNode(BaseNode[LLMNodeData]): } -def _combine_text_message_with_role(*, text: str, role: PromptMessageRole): +def _combine_message_content_with_role(*, contents: Sequence[PromptMessageContent], role: PromptMessageRole): match role: case PromptMessageRole.USER: - return UserPromptMessage(content=[TextPromptMessageContent(data=text)]) + return UserPromptMessage(content=contents) case PromptMessageRole.ASSISTANT: - return AssistantPromptMessage(content=[TextPromptMessageContent(data=text)]) + return AssistantPromptMessage(content=contents) case PromptMessageRole.SYSTEM: - return SystemPromptMessage(content=[TextPromptMessageContent(data=text)]) + return SystemPromptMessage(content=contents) raise NotImplementedError(f"Role {role} is not supported") @@ -877,7 +878,9 @@ def _handle_list_messages( jinjia2_variables=jinja2_variables, variable_pool=variable_pool, ) - prompt_message = _combine_text_message_with_role(text=result_text, role=message.role) + prompt_message = _combine_message_content_with_role( + contents=[TextPromptMessageContent(data=result_text)], role=message.role + ) prompt_messages.append(prompt_message) else: # Get segment group from basic message @@ -908,12 +911,14 @@ def _handle_list_messages( # Create message with text from all segments plain_text = segment_group.text if plain_text: - prompt_message = _combine_text_message_with_role(text=plain_text, role=message.role) + prompt_message = _combine_message_content_with_role( + contents=[TextPromptMessageContent(data=plain_text)], role=message.role + ) prompt_messages.append(prompt_message) if file_contents: # Create message with image contents - prompt_message = UserPromptMessage(content=file_contents) + prompt_message = _combine_message_content_with_role(contents=file_contents, role=message.role) prompt_messages.append(prompt_message) return prompt_messages @@ -1018,6 +1023,8 @@ def _handle_completion_template( else: template_text = template.text result_text = variable_pool.convert_template(template_text).text - prompt_message = _combine_text_message_with_role(text=result_text, role=PromptMessageRole.USER) + prompt_message = _combine_message_content_with_role( + contents=[TextPromptMessageContent(data=result_text)], role=PromptMessageRole.USER + ) prompt_messages.append(prompt_message) return prompt_messages From 044e7b63c254eb284cc0a17d683aec60a33f2eef Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 26 Nov 2024 14:14:14 +0800 Subject: [PATCH 25/29] fix(llm_node): Ignore file if not supported. (#11114) --- api/core/workflow/nodes/llm/node.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index 2380829f7d..39480e34b3 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -67,7 +67,6 @@ from .entities import ( ModelConfig, ) from .exc import ( - FileTypeNotSupportError, InvalidContextStructureError, InvalidVariableTypeError, LLMModeRequiredError, @@ -676,7 +675,7 @@ class LLMNode(BaseNode[LLMNodeData]): and ModelFeature.AUDIO not in model_config.model_schema.features ) ): - raise FileTypeNotSupportError(type_name=content_item.type) + continue prompt_message_content.append(content_item) if len(prompt_message_content) == 1 and prompt_message_content[0].type == PromptMessageContentType.TEXT: prompt_message.content = prompt_message_content[0].data From aa135a3780ff9136b78efd1c3d31b9afd48168df Mon Sep 17 00:00:00 2001 From: Tao Wang <74752235+taowang1993@users.noreply.github.com> Date: Mon, 25 Nov 2024 23:14:02 -0800 Subject: [PATCH 26/29] Add TTS to OpenAI_API_Compatible (#11071) --- .../model_providers/azure_openai/tts/tts.py | 2 +- .../model_providers/gitee_ai/tts/tts.py | 2 +- .../model_providers/openai/tts/tts.py | 2 +- .../openai_api_compatible.yaml | 25 ++- .../openai_api_compatible/tts/__init__.py | 0 .../openai_api_compatible/tts/tts.py | 145 ++++++++++++++++++ 6 files changed, 169 insertions(+), 7 deletions(-) create mode 100644 api/core/model_runtime/model_providers/openai_api_compatible/tts/__init__.py create mode 100644 api/core/model_runtime/model_providers/openai_api_compatible/tts/tts.py diff --git a/api/core/model_runtime/model_providers/azure_openai/tts/tts.py b/api/core/model_runtime/model_providers/azure_openai/tts/tts.py index 133cc9f76e..173b9d250c 100644 --- a/api/core/model_runtime/model_providers/azure_openai/tts/tts.py +++ b/api/core/model_runtime/model_providers/azure_openai/tts/tts.py @@ -14,7 +14,7 @@ from core.model_runtime.model_providers.azure_openai._constant import TTS_BASE_M class AzureOpenAIText2SpeechModel(_CommonAzureOpenAI, TTSModel): """ - Model class for OpenAI Speech to text model. + Model class for OpenAI text2speech model. """ def _invoke( diff --git a/api/core/model_runtime/model_providers/gitee_ai/tts/tts.py b/api/core/model_runtime/model_providers/gitee_ai/tts/tts.py index ed2bd5b13d..36dcea405d 100644 --- a/api/core/model_runtime/model_providers/gitee_ai/tts/tts.py +++ b/api/core/model_runtime/model_providers/gitee_ai/tts/tts.py @@ -10,7 +10,7 @@ from core.model_runtime.model_providers.gitee_ai._common import _CommonGiteeAI class GiteeAIText2SpeechModel(_CommonGiteeAI, TTSModel): """ - Model class for OpenAI Speech to text model. + Model class for OpenAI text2speech model. """ def _invoke( diff --git a/api/core/model_runtime/model_providers/openai/tts/tts.py b/api/core/model_runtime/model_providers/openai/tts/tts.py index 2e57b95944..dac37f0c7f 100644 --- a/api/core/model_runtime/model_providers/openai/tts/tts.py +++ b/api/core/model_runtime/model_providers/openai/tts/tts.py @@ -11,7 +11,7 @@ from core.model_runtime.model_providers.openai._common import _CommonOpenAI class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel): """ - Model class for OpenAI Speech to text model. + Model class for OpenAI text2speech model. """ def _invoke( diff --git a/api/core/model_runtime/model_providers/openai_api_compatible/openai_api_compatible.yaml b/api/core/model_runtime/model_providers/openai_api_compatible/openai_api_compatible.yaml index 69a081f35c..2b8dcb72d8 100644 --- a/api/core/model_runtime/model_providers/openai_api_compatible/openai_api_compatible.yaml +++ b/api/core/model_runtime/model_providers/openai_api_compatible/openai_api_compatible.yaml @@ -9,6 +9,7 @@ supported_model_types: - text-embedding - speech2text - rerank + - tts configurate_methods: - customizable-model model_credential_schema: @@ -67,7 +68,7 @@ model_credential_schema: - variable: __model_type value: llm type: text-input - default: '4096' + default: "4096" placeholder: zh_Hans: 在此输入您的模型上下文长度 en_US: Enter your Model context size @@ -80,7 +81,7 @@ model_credential_schema: - variable: __model_type value: text-embedding type: text-input - default: '4096' + default: "4096" placeholder: zh_Hans: 在此输入您的模型上下文长度 en_US: Enter your Model context size @@ -93,7 +94,7 @@ model_credential_schema: - variable: __model_type value: rerank type: text-input - default: '4096' + default: "4096" placeholder: zh_Hans: 在此输入您的模型上下文长度 en_US: Enter your Model context size @@ -104,7 +105,7 @@ model_credential_schema: show_on: - variable: __model_type value: llm - default: '4096' + default: "4096" type: text-input - variable: function_calling_type show_on: @@ -174,3 +175,19 @@ model_credential_schema: value: llm default: '\n\n' type: text-input + - variable: voices + show_on: + - variable: __model_type + value: tts + label: + en_US: Available Voices (comma-separated) + zh_Hans: 可用声音(用英文逗号分隔) + type: text-input + required: false + default: "alloy" + placeholder: + en_US: "alloy,echo,fable,onyx,nova,shimmer" + zh_Hans: "alloy,echo,fable,onyx,nova,shimmer" + help: + en_US: "List voice names separated by commas. First voice will be used as default." + zh_Hans: "用英文逗号分隔的声音列表。第一个声音将作为默认值。" diff --git a/api/core/model_runtime/model_providers/openai_api_compatible/tts/__init__.py b/api/core/model_runtime/model_providers/openai_api_compatible/tts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api/core/model_runtime/model_providers/openai_api_compatible/tts/tts.py b/api/core/model_runtime/model_providers/openai_api_compatible/tts/tts.py new file mode 100644 index 0000000000..8239c625f7 --- /dev/null +++ b/api/core/model_runtime/model_providers/openai_api_compatible/tts/tts.py @@ -0,0 +1,145 @@ +from collections.abc import Iterable +from typing import Optional +from urllib.parse import urljoin + +import requests + +from core.model_runtime.entities.common_entities import I18nObject +from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelPropertyKey, ModelType +from core.model_runtime.errors.invoke import InvokeBadRequestError +from core.model_runtime.errors.validate import CredentialsValidateFailedError +from core.model_runtime.model_providers.__base.tts_model import TTSModel +from core.model_runtime.model_providers.openai_api_compatible._common import _CommonOaiApiCompat + + +class OAICompatText2SpeechModel(_CommonOaiApiCompat, TTSModel): + """ + Model class for OpenAI-compatible text2speech model. + """ + + def _invoke( + self, + model: str, + tenant_id: str, + credentials: dict, + content_text: str, + voice: str, + user: Optional[str] = None, + ) -> Iterable[bytes]: + """ + Invoke TTS model + + :param model: model name + :param tenant_id: user tenant id + :param credentials: model credentials + :param content_text: text content to be translated + :param voice: model voice/speaker + :param user: unique user id + :return: audio data as bytes iterator + """ + # Set up headers with authentication if provided + headers = {} + if api_key := credentials.get("api_key"): + headers["Authorization"] = f"Bearer {api_key}" + + # Construct endpoint URL + endpoint_url = credentials.get("endpoint_url") + if not endpoint_url.endswith("/"): + endpoint_url += "/" + endpoint_url = urljoin(endpoint_url, "audio/speech") + + # Get audio format from model properties + audio_format = self._get_model_audio_type(model, credentials) + + # Split text into chunks if needed based on word limit + word_limit = self._get_model_word_limit(model, credentials) + sentences = self._split_text_into_sentences(content_text, word_limit) + + for sentence in sentences: + # Prepare request payload + payload = {"model": model, "input": sentence, "voice": voice, "response_format": audio_format} + + # Make POST request + response = requests.post(endpoint_url, headers=headers, json=payload, stream=True) + + if response.status_code != 200: + raise InvokeBadRequestError(response.text) + + # Stream the audio data + for chunk in response.iter_content(chunk_size=4096): + if chunk: + yield chunk + + def validate_credentials(self, model: str, credentials: dict) -> None: + """ + Validate model credentials + + :param model: model name + :param credentials: model credentials + :return: + """ + try: + # Get default voice for validation + voice = self._get_model_default_voice(model, credentials) + + # Test with a simple text + next( + self._invoke( + model=model, tenant_id="validate", credentials=credentials, content_text="Test.", voice=voice + ) + ) + except Exception as ex: + raise CredentialsValidateFailedError(str(ex)) + + def get_customizable_model_schema(self, model: str, credentials: dict) -> Optional[AIModelEntity]: + """ + Get customizable model schema + """ + # Parse voices from comma-separated string + voice_names = credentials.get("voices", "alloy").strip().split(",") + voices = [] + + for voice in voice_names: + voice = voice.strip() + if not voice: + continue + + # Use en-US for all voices + voices.append( + { + "name": voice, + "mode": voice, + "language": "en-US", + } + ) + + # If no voices provided or all voices were empty strings, use 'alloy' as default + if not voices: + voices = [{"name": "Alloy", "mode": "alloy", "language": "en-US"}] + + return AIModelEntity( + model=model, + label=I18nObject(en_US=model), + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_type=ModelType.TTS, + model_properties={ + ModelPropertyKey.AUDIO_TYPE: credentials.get("audio_type", "mp3"), + ModelPropertyKey.WORD_LIMIT: int(credentials.get("word_limit", 4096)), + ModelPropertyKey.DEFAULT_VOICE: voices[0]["mode"], + ModelPropertyKey.VOICES: voices, + }, + ) + + def get_tts_model_voices(self, model: str, credentials: dict, language: Optional[str] = None) -> list: + """ + Override base get_tts_model_voices to handle customizable voices + """ + model_schema = self.get_customizable_model_schema(model, credentials) + + if not model_schema or ModelPropertyKey.VOICES not in model_schema.model_properties: + raise ValueError("this model does not support voice") + + voices = model_schema.model_properties[ModelPropertyKey.VOICES] + + # Always return all voices regardless of language + return [{"name": d["name"], "value": d["mode"]} for d in voices] From 208d6d6d94975742d84483bdaa0625c78ad582ff Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 26 Nov 2024 15:46:17 +0800 Subject: [PATCH 27/29] chore: bump to 0.12.1 (#11122) --- api/configs/packaging/__init__.py | 2 +- docker-legacy/docker-compose.yaml | 6 +++--- docker/docker-compose.yaml | 6 +++--- web/package.json | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/api/configs/packaging/__init__.py b/api/configs/packaging/__init__.py index 7e95e79bfb..5d2a0231b0 100644 --- a/api/configs/packaging/__init__.py +++ b/api/configs/packaging/__init__.py @@ -9,7 +9,7 @@ class PackagingInfo(BaseSettings): CURRENT_VERSION: str = Field( description="Dify version", - default="0.12.0", + default="0.12.1", ) COMMIT_SHA: str = Field( diff --git a/docker-legacy/docker-compose.yaml b/docker-legacy/docker-compose.yaml index 7ddb98e272..aaca3c9c12 100644 --- a/docker-legacy/docker-compose.yaml +++ b/docker-legacy/docker-compose.yaml @@ -2,7 +2,7 @@ version: '3' services: # API service api: - image: langgenius/dify-api:0.12.0 + image: langgenius/dify-api:0.12.1 restart: always environment: # Startup mode, 'api' starts the API server. @@ -227,7 +227,7 @@ services: # worker service # The Celery worker for processing the queue. worker: - image: langgenius/dify-api:0.12.0 + image: langgenius/dify-api:0.12.1 restart: always environment: CONSOLE_WEB_URL: '' @@ -397,7 +397,7 @@ services: # Frontend web application. web: - image: langgenius/dify-web:0.12.0 + image: langgenius/dify-web:0.12.1 restart: always environment: # The base URL of console application api server, refers to the Console base URL of WEB service if console domain is diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 9a135e7b54..3e2b276c92 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -291,7 +291,7 @@ x-shared-env: &shared-api-worker-env services: # API service api: - image: langgenius/dify-api:0.12.0 + image: langgenius/dify-api:0.12.1 restart: always environment: # Use the shared environment variables. @@ -311,7 +311,7 @@ services: # worker service # The Celery worker for processing the queue. worker: - image: langgenius/dify-api:0.12.0 + image: langgenius/dify-api:0.12.1 restart: always environment: # Use the shared environment variables. @@ -330,7 +330,7 @@ services: # Frontend web application. web: - image: langgenius/dify-web:0.12.0 + image: langgenius/dify-web:0.12.1 restart: always environment: CONSOLE_API_URL: ${CONSOLE_API_URL:-} diff --git a/web/package.json b/web/package.json index f65d87961b..4f7ddf8e5c 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "dify-web", - "version": "0.12.0", + "version": "0.12.1", "private": true, "engines": { "node": ">=18.17.0" From b3d65cc7df034d8678ac59f7ab30b9617e9415a6 Mon Sep 17 00:00:00 2001 From: NFish Date: Tue, 26 Nov 2024 17:44:56 +0800 Subject: [PATCH 28/29] Feat: Divider component now supports gradient background (#11130) --- web/app/components/base/divider/index.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/web/app/components/base/divider/index.tsx b/web/app/components/base/divider/index.tsx index 4b351dea99..fcee10a9e2 100644 --- a/web/app/components/base/divider/index.tsx +++ b/web/app/components/base/divider/index.tsx @@ -3,17 +3,21 @@ import React from 'react' import { type VariantProps, cva } from 'class-variance-authority' import classNames from '@/utils/classnames' -const dividerVariants = cva( - 'bg-divider-regular', +const dividerVariants = cva('', { variants: { type: { - horizontal: 'w-full h-[0.5px] my-2', + horizontal: 'w-full h-[0.5px] my-2 ', vertical: 'w-[1px] h-full mx-2', }, + bgStyle: { + gradient: 'bg-gradient-to-r from-divider-regular to-background-gradient-mask-transparent', + solid: 'bg-divider-regular', + }, }, defaultVariants: { type: 'horizontal', + bgStyle: 'solid', }, }, ) @@ -23,9 +27,9 @@ type DividerProps = { style?: CSSProperties } & VariantProps -const Divider: FC = ({ type, className = '', style }) => { +const Divider: FC = ({ type, bgStyle, className = '', style }) => { return ( -
+
) } From 79db920fa7bd9e458c3114d6a7149ead49c75d65 Mon Sep 17 00:00:00 2001 From: Joel Date: Tue, 26 Nov 2024 17:55:11 +0800 Subject: [PATCH 29/29] fix: enable after disabled memory not pass user query (#11136) --- .../workflow/nodes/_base/components/memory-config.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/components/workflow/nodes/_base/components/memory-config.tsx b/web/app/components/workflow/nodes/_base/components/memory-config.tsx index c108608739..476f5b738c 100644 --- a/web/app/components/workflow/nodes/_base/components/memory-config.tsx +++ b/web/app/components/workflow/nodes/_base/components/memory-config.tsx @@ -53,7 +53,7 @@ type Props = { const MEMORY_DEFAULT: Memory = { window: { enabled: false, size: WINDOW_SIZE_DEFAULT }, - query_prompt_template: '', + query_prompt_template: '{{#sys.query#}}', } const MemoryConfig: FC = ({