From 4ec9a87e4645336ef8f63feab4c2c2ff6474ff3c Mon Sep 17 00:00:00 2001 From: -LAN- Date: Thu, 25 Jul 2024 00:32:39 +0800 Subject: [PATCH 01/60] fix(api/core/workflow/nodes/iteration/iteration_node.py): Extend output in iteration if output is a array. (#6647) Signed-off-by: -LAN- --- api/core/workflow/nodes/iteration/iteration_node.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api/core/workflow/nodes/iteration/iteration_node.py b/api/core/workflow/nodes/iteration/iteration_node.py index fcd853a4bd..54dfe8b7f4 100644 --- a/api/core/workflow/nodes/iteration/iteration_node.py +++ b/api/core/workflow/nodes/iteration/iteration_node.py @@ -106,7 +106,11 @@ class IterationNode(BaseIterationNode): variable_pool.remove([self.node_id] + output_selector[1:]) state.current_output = output if output is not None: - state.outputs.append(output) + # NOTE: This is a temporary patch to process double nested list (for example, DALL-E output in iteration). + if isinstance(output, list): + state.outputs.extend(output) + else: + state.outputs.append(output) @classmethod def _extract_variable_selector_to_variable_mapping(cls, node_data: IterationNodeData) -> dict[str, list[str]]: From 91fd8521c3f5f9d9d8bbbe791f4c0c9facc0a267 Mon Sep 17 00:00:00 2001 From: Jyong <76649700+JohnJyong@users.noreply.github.com> Date: Thu, 25 Jul 2024 10:07:55 +0800 Subject: [PATCH 02/60] fix reranking model field error (#6654) --- api/core/workflow/nodes/knowledge_retrieval/entities.py | 4 ++-- .../nodes/knowledge_retrieval/knowledge_retrieval_node.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/core/workflow/nodes/knowledge_retrieval/entities.py b/api/core/workflow/nodes/knowledge_retrieval/entities.py index 5a9a4a9009..5758b895f3 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/entities.py +++ b/api/core/workflow/nodes/knowledge_retrieval/entities.py @@ -46,8 +46,8 @@ class MultipleRetrievalConfig(BaseModel): score_threshold: Optional[float] = None reranking_mode: str = 'reranking_model' reranking_enable: bool = True - reranking_model: RerankingModelConfig - weights: WeightedScoreConfig + reranking_model: Optional[RerankingModelConfig] = None + weights: Optional[WeightedScoreConfig] = None class ModelConfig(BaseModel): diff --git a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py index 5f8966f880..7a2b3c8512 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py +++ b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py @@ -140,8 +140,8 @@ class KnowledgeRetrievalNode(BaseNode): elif node_data.retrieval_mode == DatasetRetrieveConfigEntity.RetrieveStrategy.MULTIPLE.value: if node_data.multiple_retrieval_config.reranking_mode == 'reranking_model': reranking_model = { - 'reranking_provider_name': node_data.multiple_retrieval_config.reranking_model['provider'], - 'reranking_model_name': node_data.multiple_retrieval_config.reranking_model['name'] + 'reranking_provider_name': node_data.multiple_retrieval_config.reranking_model.provider, + 'reranking_model_name': node_data.multiple_retrieval_config.reranking_model.model } weights = None elif node_data.multiple_retrieval_config.reranking_mode == 'weighted_score': From a876baf0a9cc46f03e8e67af4dfebb2398309683 Mon Sep 17 00:00:00 2001 From: majian <46617237@qq.com> Date: Thu, 25 Jul 2024 11:15:54 +0800 Subject: [PATCH 03/60] Resolve variable type parameter error (#6646) --- api/core/workflow/nodes/tool/tool_node.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/api/core/workflow/nodes/tool/tool_node.py b/api/core/workflow/nodes/tool/tool_node.py index 1bd126f842..238477117d 100644 --- a/api/core/workflow/nodes/tool/tool_node.py +++ b/api/core/workflow/nodes/tool/tool_node.py @@ -125,11 +125,15 @@ class ToolNode(BaseNode): ] else: tool_input = node_data.tool_parameters[parameter_name] - segment_group = parser.convert_template( - template=str(tool_input.value), - variable_pool=variable_pool, - ) - result[parameter_name] = segment_group.log if for_log else segment_group.text + if tool_input.type == 'variable': + parameter_value = variable_pool.get(tool_input.value).value + else: + segment_group = parser.convert_template( + template=str(tool_input.value), + variable_pool=variable_pool, + ) + parameter_value = segment_group.log if for_log else segment_group.text + result[parameter_name] = parameter_value return result From 349ec0db7749fd6154cd4212cd3560287300a980 Mon Sep 17 00:00:00 2001 From: yanghx <30469680+yanghx-git@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:20:20 +0800 Subject: [PATCH 04/60] fix tencent_cos_storage image-preview error is not a byte (#6652) --- api/extensions/storage/tencent_storage.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/extensions/storage/tencent_storage.py b/api/extensions/storage/tencent_storage.py index 6d9fb80f5e..e2c1ca55e3 100644 --- a/api/extensions/storage/tencent_storage.py +++ b/api/extensions/storage/tencent_storage.py @@ -32,8 +32,7 @@ class TencentStorage(BaseStorage): def load_stream(self, filename: str) -> Generator: def generate(filename: str = filename) -> Generator: response = self.client.get_object(Bucket=self.bucket_name, Key=filename) - while chunk := response['Body'].get_stream(chunk_size=4096): - yield chunk + yield from response['Body'].get_stream(chunk_size=4096) return generate() From 9815aab7a371fcaa34e1daa644ff8d1308a96e92 Mon Sep 17 00:00:00 2001 From: longzhihun <38651850@qq.com> Date: Thu, 25 Jul 2024 11:20:37 +0800 Subject: [PATCH 05/60] [seanguo] feat: add llama 3.1 support in bedrock (#6645) --- .../bedrock/llm/_position.yaml | 2 ++ .../model_providers/bedrock/llm/llm.py | 24 ++++++++++++------ .../llm/meta.llama3-1-70b-instruct-v1:0.yaml | 25 +++++++++++++++++++ .../llm/meta.llama3-1-8b-instruct-v1:0.yaml | 25 +++++++++++++++++++ 4 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 api/core/model_runtime/model_providers/bedrock/llm/meta.llama3-1-70b-instruct-v1:0.yaml create mode 100644 api/core/model_runtime/model_providers/bedrock/llm/meta.llama3-1-8b-instruct-v1:0.yaml diff --git a/api/core/model_runtime/model_providers/bedrock/llm/_position.yaml b/api/core/model_runtime/model_providers/bedrock/llm/_position.yaml index 3a79a929ba..6789a79987 100644 --- a/api/core/model_runtime/model_providers/bedrock/llm/_position.yaml +++ b/api/core/model_runtime/model_providers/bedrock/llm/_position.yaml @@ -10,6 +10,8 @@ - cohere.command-text-v14 - cohere.command-r-plus-v1.0 - cohere.command-r-v1.0 +- meta.llama3-1-8b-instruct-v1:0 +- meta.llama3-1-70b-instruct-v1:0 - meta.llama3-8b-instruct-v1:0 - meta.llama3-70b-instruct-v1:0 - meta.llama2-13b-chat-v1 diff --git a/api/core/model_runtime/model_providers/bedrock/llm/llm.py b/api/core/model_runtime/model_providers/bedrock/llm/llm.py index 882d0b6352..e9906c8294 100644 --- a/api/core/model_runtime/model_providers/bedrock/llm/llm.py +++ b/api/core/model_runtime/model_providers/bedrock/llm/llm.py @@ -208,14 +208,25 @@ class BedrockLargeLanguageModel(LargeLanguageModel): if model_info['support_tool_use'] and tools: parameters['toolConfig'] = self._convert_converse_tool_config(tools=tools) + try: + if stream: + response = bedrock_client.converse_stream(**parameters) + return self._handle_converse_stream_response(model_info['model'], credentials, response, prompt_messages) + else: + response = bedrock_client.converse(**parameters) + return self._handle_converse_response(model_info['model'], credentials, response, prompt_messages) + except ClientError as ex: + error_code = ex.response['Error']['Code'] + full_error_msg = f"{error_code}: {ex.response['Error']['Message']}" + raise self._map_client_to_invoke_error(error_code, full_error_msg) + except (EndpointConnectionError, NoRegionError, ServiceNotInRegionError) as ex: + raise InvokeConnectionError(str(ex)) - if stream: - response = bedrock_client.converse_stream(**parameters) - return self._handle_converse_stream_response(model_info['model'], credentials, response, prompt_messages) - else: - response = bedrock_client.converse(**parameters) - return self._handle_converse_response(model_info['model'], credentials, response, prompt_messages) + except UnknownServiceError as ex: + raise InvokeServerUnavailableError(str(ex)) + except Exception as ex: + raise InvokeError(str(ex)) def _handle_converse_response(self, model: str, credentials: dict, response: dict, prompt_messages: list[PromptMessage]) -> LLMResult: """ @@ -558,7 +569,6 @@ class BedrockLargeLanguageModel(LargeLanguageModel): except ClientError as ex: error_code = ex.response['Error']['Code'] full_error_msg = f"{error_code}: {ex.response['Error']['Message']}" - raise CredentialsValidateFailedError(str(self._map_client_to_invoke_error(error_code, full_error_msg))) except Exception as ex: diff --git a/api/core/model_runtime/model_providers/bedrock/llm/meta.llama3-1-70b-instruct-v1:0.yaml b/api/core/model_runtime/model_providers/bedrock/llm/meta.llama3-1-70b-instruct-v1:0.yaml new file mode 100644 index 0000000000..10bfa7b1d5 --- /dev/null +++ b/api/core/model_runtime/model_providers/bedrock/llm/meta.llama3-1-70b-instruct-v1:0.yaml @@ -0,0 +1,25 @@ +model: meta.llama3-1-70b-instruct-v1:0 +label: + en_US: Llama 3.1 Instruct 70B +model_type: llm +model_properties: + mode: completion + context_size: 128000 +parameter_rules: + - name: temperature + use_template: temperature + default: 0.5 + - name: top_p + use_template: top_p + default: 0.9 + - name: max_gen_len + use_template: max_tokens + required: true + default: 512 + min: 1 + max: 2048 +pricing: + input: '0.00265' + output: '0.0035' + unit: '0.001' + currency: USD diff --git a/api/core/model_runtime/model_providers/bedrock/llm/meta.llama3-1-8b-instruct-v1:0.yaml b/api/core/model_runtime/model_providers/bedrock/llm/meta.llama3-1-8b-instruct-v1:0.yaml new file mode 100644 index 0000000000..81cd53243f --- /dev/null +++ b/api/core/model_runtime/model_providers/bedrock/llm/meta.llama3-1-8b-instruct-v1:0.yaml @@ -0,0 +1,25 @@ +model: meta.llama3-1-8b-instruct-v1:0 +label: + en_US: Llama 3.1 Instruct 8B +model_type: llm +model_properties: + mode: completion + context_size: 128000 +parameter_rules: + - name: temperature + use_template: temperature + default: 0.5 + - name: top_p + use_template: top_p + default: 0.9 + - name: max_gen_len + use_template: max_tokens + required: true + default: 512 + min: 1 + max: 2048 +pricing: + input: '0.0003' + output: '0.0006' + unit: '0.001' + currency: USD From 585444c50c99fd2629680f7d01ef06a270431bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=9E=E6=B3=95=E6=93=8D=E4=BD=9C?= Date: Thu, 25 Jul 2024 11:21:51 +0800 Subject: [PATCH 06/60] chore: fix type annotations (#6600) --- .../app/configuration/config-var/index.tsx | 2 +- .../prompt-mode/advanced-mode-waring.tsx | 2 -- .../notion-page-selector-modal/index.tsx | 8 ++++---- web/app/components/base/select/index.tsx | 2 +- web/app/components/explore/category.tsx | 2 +- .../model-provider-page/declarations.ts | 1 + web/app/components/header/dataset-nav/index.tsx | 7 ++++--- .../components/header/nav/nav-selector/index.tsx | 4 ++-- web/app/components/tools/provider/card.tsx | 2 +- web/app/components/tools/provider/detail.tsx | 2 +- web/app/components/tools/workflow-tool/index.tsx | 2 +- .../workflow/block-selector/index-bar.tsx | 14 ++++++++++---- 12 files changed, 27 insertions(+), 21 deletions(-) diff --git a/web/app/components/app/configuration/config-var/index.tsx b/web/app/components/app/configuration/config-var/index.tsx index a4f8b6839f..9ef624ed97 100644 --- a/web/app/components/app/configuration/config-var/index.tsx +++ b/web/app/components/app/configuration/config-var/index.tsx @@ -96,7 +96,7 @@ const ConfigVar: FC = ({ promptVariables, readonly, onPromptVar ...rest, type: type === InputVarType.textInput ? 'string' : type, key: variable, - name: label, + name: label as string, } if (payload.type === InputVarType.textInput) diff --git a/web/app/components/app/configuration/prompt-mode/advanced-mode-waring.tsx b/web/app/components/app/configuration/prompt-mode/advanced-mode-waring.tsx index 759a15213d..6fb58ba9a1 100644 --- a/web/app/components/app/configuration/prompt-mode/advanced-mode-waring.tsx +++ b/web/app/components/app/configuration/prompt-mode/advanced-mode-waring.tsx @@ -4,7 +4,6 @@ import React from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import I18n from '@/context/i18n' -import { FlipBackward } from '@/app/components/base/icons/src/vender/line/arrows' import { LanguagesSupported } from '@/i18n/language' type Props = { onReturnToSimpleMode: () => void @@ -38,7 +37,6 @@ const AdvancedModeWarning: FC = ({ onClick={onReturnToSimpleMode} className='shrink-0 flex items-center h-6 px-2 bg-indigo-600 shadow-xs border border-gray-200 rounded-lg text-white text-xs font-semibold cursor-pointer space-x-1' > -
{t('appDebug.promptMode.switchBack')}
void - onSave: (selectedPages: NotionPageSelectorValue[]) => void + onSave: (selectedPages: NotionPage[]) => void datasetId: string } const NotionPageSelectorModal = ({ @@ -20,12 +20,12 @@ const NotionPageSelectorModal = ({ datasetId, }: NotionPageSelectorModalProps) => { const { t } = useTranslation() - const [selectedPages, setSelectedPages] = useState([]) + const [selectedPages, setSelectedPages] = useState([]) const handleClose = () => { onClose() } - const handleSelectPage = (newSelectedPages: NotionPageSelectorValue[]) => { + const handleSelectPage = (newSelectedPages: NotionPage[]) => { setSelectedPages(newSelectedPages) } const handleSave = () => { diff --git a/web/app/components/base/select/index.tsx b/web/app/components/base/select/index.tsx index 24da8855fa..dee983690b 100644 --- a/web/app/components/base/select/index.tsx +++ b/web/app/components/base/select/index.tsx @@ -191,7 +191,7 @@ const SimpleSelect: FC = ({ onClick={(e) => { e.stopPropagation() setSelectedItem(null) - onSelect({ value: null }) + onSelect({ name: '', value: '' }) }} className="h-5 w-5 text-gray-400 cursor-pointer" aria-hidden="false" diff --git a/web/app/components/explore/category.tsx b/web/app/components/explore/category.tsx index 2b6cfbd9be..cf655c5333 100644 --- a/web/app/components/explore/category.tsx +++ b/web/app/components/explore/category.tsx @@ -28,7 +28,7 @@ const Category: FC = ({ allCategoriesEn, }) => { const { t } = useTranslation() - const isAllCategories = !list.includes(value) + const isAllCategories = !list.includes(value as AppCategory) const itemClassName = (isSelected: boolean) => cn( 'flex items-center px-3 py-[7px] h-[32px] rounded-lg border-[0.5px] border-transparent text-gray-700 font-medium leading-[18px] cursor-pointer hover:bg-gray-200', diff --git a/web/app/components/header/account-setting/model-provider-page/declarations.ts b/web/app/components/header/account-setting/model-provider-page/declarations.ts index abc81262b9..1547032163 100644 --- a/web/app/components/header/account-setting/model-provider-page/declarations.ts +++ b/web/app/components/header/account-setting/model-provider-page/declarations.ts @@ -12,6 +12,7 @@ export enum FormTypeEnum { secretInput = 'secret-input', select = 'select', radio = 'radio', + boolean = 'boolean', files = 'files', } diff --git a/web/app/components/header/dataset-nav/index.tsx b/web/app/components/header/dataset-nav/index.tsx index f415658eee..abf76608a8 100644 --- a/web/app/components/header/dataset-nav/index.tsx +++ b/web/app/components/header/dataset-nav/index.tsx @@ -11,6 +11,7 @@ import useSWR from 'swr' import useSWRInfinite from 'swr/infinite' import { flatten } from 'lodash-es' import Nav from '../nav' +import type { NavItem } from '../nav/nav-selector' import { fetchDatasetDetail, fetchDatasets } from '@/service/datasets' import type { DataSetListResponse } from '@/models/datasets' @@ -31,7 +32,7 @@ const DatasetNav = () => { datasetId, } : null, - apiParams => fetchDatasetDetail(apiParams.datasetId)) + apiParams => fetchDatasetDetail(apiParams.datasetId as string)) const { data: datasetsData, setSize } = useSWRInfinite(datasetId ? getKey : () => null, fetchDatasets, { revalidateFirstPage: false, revalidateAll: true }) const datasetItems = flatten(datasetsData?.map(datasetData => datasetData.data)) @@ -46,14 +47,14 @@ const DatasetNav = () => { text={t('common.menus.datasets')} activeSegment='datasets' link='/datasets' - curNav={currentDataset} + curNav={currentDataset as Omit} navs={datasetItems.map(dataset => ({ id: dataset.id, name: dataset.name, link: `/datasets/${dataset.id}/documents`, icon: dataset.icon, icon_background: dataset.icon_background, - }))} + })) as NavItem[]} createText={t('common.menus.newDataset')} onCreate={() => router.push('/datasets/create')} onLoadmore={handleLoadmore} diff --git a/web/app/components/header/nav/nav-selector/index.tsx b/web/app/components/header/nav/nav-selector/index.tsx index 51192c6580..26f538d72d 100644 --- a/web/app/components/header/nav/nav-selector/index.tsx +++ b/web/app/components/header/nav/nav-selector/index.tsx @@ -23,13 +23,13 @@ export type NavItem = { link: string icon: string icon_background: string - mode: string + mode?: string } export type INavSelectorProps = { navs: NavItem[] curNav?: Omit createText: string - isApp: boolean + isApp?: boolean onCreate: (state: string) => void onLoadmore?: () => void } diff --git a/web/app/components/tools/provider/card.tsx b/web/app/components/tools/provider/card.tsx index 7f87d65e3a..6a688186cf 100644 --- a/web/app/components/tools/provider/card.tsx +++ b/web/app/components/tools/provider/card.tsx @@ -36,7 +36,7 @@ const ProviderCard = ({ }, [collection.labels, labelList, language]) return ( -
+
{typeof collection.icon === 'string' && ( diff --git a/web/app/components/tools/provider/detail.tsx b/web/app/components/tools/provider/detail.tsx index ee02e4966d..546b9cd9a1 100644 --- a/web/app/components/tools/provider/detail.tsx +++ b/web/app/components/tools/provider/detail.tsx @@ -85,7 +85,7 @@ const ProviderDetail = ({ const [customCollection, setCustomCollection] = useState(null) const [isShowEditCollectionToolModal, setIsShowEditCustomCollectionModal] = useState(false) const [showConfirmDelete, setShowConfirmDelete] = useState(false) - const [deleteAction, setDeleteAction] = useState(null) + const [deleteAction, setDeleteAction] = useState('') const doUpdateCustomToolCollection = async (data: CustomCollectionBackend) => { await updateCustomCollection(data) onRefreshData() diff --git a/web/app/components/tools/workflow-tool/index.tsx b/web/app/components/tools/workflow-tool/index.tsx index 436b2c55ab..0f9fe4c4c1 100644 --- a/web/app/components/tools/workflow-tool/index.tsx +++ b/web/app/components/tools/workflow-tool/index.tsx @@ -173,7 +173,7 @@ const WorkflowToolAsModal: FC = ({
{t('tools.createTool.description')}