From df9bd36caba86051e856ea2a3ca25abd4d2e0f7b Mon Sep 17 00:00:00 2001 From: Joe <79627742+ZhouhaoJiang@users.noreply.github.com> Date: Wed, 31 Jul 2024 18:34:44 +0800 Subject: [PATCH 01/33] fix: claude-3-5-sonnet-20240620 max token error (#6843) --- .../anthropic/llm/claude-3-5-sonnet-20240620.yaml | 1 - api/core/model_runtime/model_providers/anthropic/llm/llm.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/core/model_runtime/model_providers/anthropic/llm/claude-3-5-sonnet-20240620.yaml b/api/core/model_runtime/model_providers/anthropic/llm/claude-3-5-sonnet-20240620.yaml index e02c5517fe..64ae3abf64 100644 --- a/api/core/model_runtime/model_providers/anthropic/llm/claude-3-5-sonnet-20240620.yaml +++ b/api/core/model_runtime/model_providers/anthropic/llm/claude-3-5-sonnet-20240620.yaml @@ -26,7 +26,6 @@ parameter_rules: required: false - name: max_tokens use_template: max_tokens - required: true default: 8192 min: 1 max: 8192 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 107efe4867..19ce401999 100644 --- a/api/core/model_runtime/model_providers/anthropic/llm/llm.py +++ b/api/core/model_runtime/model_providers/anthropic/llm/llm.py @@ -116,7 +116,8 @@ class AnthropicLargeLanguageModel(LargeLanguageModel): # Add the new header for claude-3-5-sonnet-20240620 model extra_headers = {} if model == "claude-3-5-sonnet-20240620": - extra_headers["anthropic-beta"] = "max-tokens-3-5-sonnet-2024-07-15" + if model_parameters.get('max_tokens') > 4096: + extra_headers["anthropic-beta"] = "max-tokens-3-5-sonnet-2024-07-15" if tools: extra_model_kwargs['tools'] = [ From 13f5867a1654293644781483121a6d1e9a4adc88 Mon Sep 17 00:00:00 2001 From: Jyong <76649700+JohnJyong@users.noreply.github.com> Date: Wed, 31 Jul 2024 19:39:38 +0800 Subject: [PATCH 02/33] add unstructured profiles (#6846) --- docker/.env.example | 1 + docker/docker-compose.yaml | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/docker/.env.example b/docker/.env.example index b4a55bbba5..c463bf1bec 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -655,6 +655,7 @@ SSRF_SANDBOX_HOST=sandbox # docker env var for specifying vector db type at startup # (based on the vector db type, the corresponding docker # compose profile will be used) +# if you want to use unstructured, add ',unstructured' to the end # ------------------------------ COMPOSE_PROFILES=${VECTOR_STORE:-weaviate} diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 4df015e1b8..83a627e21b 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -583,6 +583,16 @@ services: ports: - "${MYSCALE_PORT:-8123}:${MYSCALE_PORT:-8123}" + # unstructured . + # (if used, you need to set ETL_TYPE to Unstructured in the api & worker service.) + unstructured: + image: downloads.unstructured.io/unstructured-io/unstructured-api:latest + profiles: + - unstructured + restart: always + volumes: + - ./volumes/unstructured:/app/data + networks: # create a network between sandbox, api and ssrf_proxy, and can not access outside. ssrf_proxy_network: From 4b410494b3d0dd12bbde7ce8dffd5b6ef282bf81 Mon Sep 17 00:00:00 2001 From: Giga Group <88305215+maybemaynot@users.noreply.github.com> Date: Wed, 31 Jul 2024 20:04:43 +0800 Subject: [PATCH 03/33] Add model parameter enable_enhance for hunyuan llm model (#6847) Co-authored-by: sun --- .../model_providers/hunyuan/llm/hunyuan-pro.yaml | 10 ++++++++++ .../hunyuan/llm/hunyuan-standard-256k.yaml | 10 ++++++++++ .../model_providers/hunyuan/llm/hunyuan-standard.yaml | 10 ++++++++++ .../model_runtime/model_providers/hunyuan/llm/llm.py | 3 ++- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-pro.yaml b/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-pro.yaml index d3b1b6d8b6..b173ffbe77 100644 --- a/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-pro.yaml +++ b/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-pro.yaml @@ -21,6 +21,16 @@ parameter_rules: default: 1024 min: 1 max: 32000 + - name: enable_enhance + label: + zh_Hans: 功能增强 + en_US: Enable Enhancement + type: boolean + help: + zh_Hans: 功能增强(如搜索)开关,关闭时将直接由主模型生成回复内容,可以降低响应时延(对于流式输出时的首字时延尤为明显)。但在少数场景里,回复效果可能会下降。 + en_US: Allow the model to perform external search to enhance the generation results. + required: false + default: true pricing: input: '0.03' output: '0.10' diff --git a/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-standard-256k.yaml b/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-standard-256k.yaml index 3b28317497..1f94a8623b 100644 --- a/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-standard-256k.yaml +++ b/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-standard-256k.yaml @@ -21,6 +21,16 @@ parameter_rules: default: 1024 min: 1 max: 256000 + - name: enable_enhance + label: + zh_Hans: 功能增强 + en_US: Enable Enhancement + type: boolean + help: + zh_Hans: 功能增强(如搜索)开关,关闭时将直接由主模型生成回复内容,可以降低响应时延(对于流式输出时的首字时延尤为明显)。但在少数场景里,回复效果可能会下降。 + en_US: Allow the model to perform external search to enhance the generation results. + required: false + default: true pricing: input: '0.015' output: '0.06' diff --git a/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-standard.yaml b/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-standard.yaml index 88b27f51c4..1db25930fc 100644 --- a/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-standard.yaml +++ b/api/core/model_runtime/model_providers/hunyuan/llm/hunyuan-standard.yaml @@ -21,6 +21,16 @@ parameter_rules: default: 1024 min: 1 max: 32000 + - name: enable_enhance + label: + zh_Hans: 功能增强 + en_US: Enable Enhancement + type: boolean + help: + zh_Hans: 功能增强(如搜索)开关,关闭时将直接由主模型生成回复内容,可以降低响应时延(对于流式输出时的首字时延尤为明显)。但在少数场景里,回复效果可能会下降。 + en_US: Allow the model to perform external search to enhance the generation results. + required: false + default: true pricing: input: '0.0045' output: '0.0005' diff --git a/api/core/model_runtime/model_providers/hunyuan/llm/llm.py b/api/core/model_runtime/model_providers/hunyuan/llm/llm.py index 8859dd72bd..6d22f9d2d6 100644 --- a/api/core/model_runtime/model_providers/hunyuan/llm/llm.py +++ b/api/core/model_runtime/model_providers/hunyuan/llm/llm.py @@ -36,7 +36,8 @@ class HunyuanLargeLanguageModel(LargeLanguageModel): custom_parameters = { 'Temperature': model_parameters.get('temperature', 0.0), - 'TopP': model_parameters.get('top_p', 1.0) + 'TopP': model_parameters.get('top_p', 1.0), + 'EnableEnhancement': model_parameters.get('enable_enhance', True) } params = { From 56b43f62d1a7d677fa5d1200efbc43f0535a3f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=BE=BD?= <821760648@qq.com> Date: Wed, 31 Jul 2024 21:24:02 +0800 Subject: [PATCH 04/33] feat: nvidia add llama3.1 model (#6844) --- .../model_providers/nvidia/llm/_position.yaml | 3 ++ .../nvidia/llm/llama-3.1-405b.yaml | 36 +++++++++++++++++++ .../nvidia/llm/llama-3.1-70b.yaml | 36 +++++++++++++++++++ .../nvidia/llm/llama-3.1-8b.yaml | 36 +++++++++++++++++++ .../model_providers/nvidia/llm/llm.py | 3 ++ 5 files changed, 114 insertions(+) create mode 100644 api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-405b.yaml create mode 100644 api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-70b.yaml create mode 100644 api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-8b.yaml diff --git a/api/core/model_runtime/model_providers/nvidia/llm/_position.yaml b/api/core/model_runtime/model_providers/nvidia/llm/_position.yaml index 2401f2a890..6cc197b70b 100644 --- a/api/core/model_runtime/model_providers/nvidia/llm/_position.yaml +++ b/api/core/model_runtime/model_providers/nvidia/llm/_position.yaml @@ -2,6 +2,9 @@ - google/codegemma-7b - google/recurrentgemma-2b - meta/llama2-70b +- meta/llama-3.1-8b-instruct +- meta/llama-3.1-70b-instruct +- meta/llama-3.1-405b-instruct - meta/llama3-8b-instruct - meta/llama3-70b-instruct - mistralai/mistral-large diff --git a/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-405b.yaml b/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-405b.yaml new file mode 100644 index 0000000000..5472de9902 --- /dev/null +++ b/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-405b.yaml @@ -0,0 +1,36 @@ +model: meta/llama-3.1-405b-instruct +label: + zh_Hans: meta/llama-3.1-405b-instruct + en_US: meta/llama-3.1-405b-instruct +model_type: llm +features: + - agent-thought +model_properties: + mode: chat + context_size: 131072 +parameter_rules: + - name: temperature + use_template: temperature + min: 0 + max: 1 + default: 0.5 + - name: top_p + use_template: top_p + min: 0 + max: 1 + default: 1 + - name: max_tokens + use_template: max_tokens + min: 1 + max: 4096 + default: 1024 + - name: frequency_penalt + use_template: frequency_penalty + min: -2 + max: 2 + default: 0 + - name: presence_penalty + use_template: presence_penalty + min: -2 + max: 2 + default: 0 diff --git a/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-70b.yaml b/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-70b.yaml new file mode 100644 index 0000000000..16af0554a1 --- /dev/null +++ b/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-70b.yaml @@ -0,0 +1,36 @@ +model: meta/llama-3.1-70b-instruct +label: + zh_Hans: meta/llama-3.1-70b-instruct + en_US: meta/llama-3.1-70b-instruct +model_type: llm +features: + - agent-thought +model_properties: + mode: chat + context_size: 131072 +parameter_rules: + - name: temperature + use_template: temperature + min: 0 + max: 1 + default: 0.5 + - name: top_p + use_template: top_p + min: 0 + max: 1 + default: 1 + - name: max_tokens + use_template: max_tokens + min: 1 + max: 4096 + default: 1024 + - name: frequency_penalty + use_template: frequency_penalty + min: -2 + max: 2 + default: 0 + - name: presence_penalty + use_template: presence_penalty + min: -2 + max: 2 + default: 0 diff --git a/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-8b.yaml b/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-8b.yaml new file mode 100644 index 0000000000..f2d43dc30e --- /dev/null +++ b/api/core/model_runtime/model_providers/nvidia/llm/llama-3.1-8b.yaml @@ -0,0 +1,36 @@ +model: meta/llama-3.1-8b-instruct +label: + zh_Hans: meta/llama-3.1-8b-instruct + en_US: meta/llama-3.1-8b-instruct +model_type: llm +features: + - agent-thought +model_properties: + mode: chat + context_size: 131072 +parameter_rules: + - name: temperature + use_template: temperature + min: 0 + max: 1 + default: 0.5 + - name: top_p + use_template: top_p + min: 0 + max: 1 + default: 1 + - name: max_tokens + use_template: max_tokens + min: 1 + max: 4096 + default: 1024 + - name: frequency_penalty + use_template: frequency_penalty + min: -2 + max: 2 + default: 0 + - name: presence_penalty + use_template: presence_penalty + min: -2 + max: 2 + default: 0 diff --git a/api/core/model_runtime/model_providers/nvidia/llm/llm.py b/api/core/model_runtime/model_providers/nvidia/llm/llm.py index 11252b9211..494b7374f5 100644 --- a/api/core/model_runtime/model_providers/nvidia/llm/llm.py +++ b/api/core/model_runtime/model_providers/nvidia/llm/llm.py @@ -31,6 +31,9 @@ class NVIDIALargeLanguageModel(OAIAPICompatLargeLanguageModel): 'meta/llama2-70b': '', 'meta/llama3-8b-instruct': '', 'meta/llama3-70b-instruct': '', + 'meta/llama-3.1-8b-instruct': '', + 'meta/llama-3.1-70b-instruct': '', + 'meta/llama-3.1-405b-instruct': '', 'google/recurrentgemma-2b': '' } From feb4576ee71bfc137d9a933bd1c6293015bfccef Mon Sep 17 00:00:00 2001 From: -LAN- Date: Thu, 1 Aug 2024 11:16:49 +0800 Subject: [PATCH 05/33] chore: update SQLAlchemy configuration with custom naming convention (#6854) --- api/extensions/ext_database.py | 12 +++++++++++- api/migrations/alembic.ini | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/api/extensions/ext_database.py b/api/extensions/ext_database.py index 9121c6ead9..c248e173a2 100644 --- a/api/extensions/ext_database.py +++ b/api/extensions/ext_database.py @@ -1,6 +1,16 @@ from flask_sqlalchemy import SQLAlchemy +from sqlalchemy import MetaData -db = SQLAlchemy() +POSTGRES_INDEXES_NAMING_CONVENTION = { + 'ix': '%(column_0_label)s_idx', + 'uq': '%(table_name)s_%(column_0_name)s_key', + 'ck': '%(table_name)s_%(constraint_name)s_check', + 'fk': '%(table_name)s_%(column_0_name)s_fkey', + 'pk': '%(table_name)s_pkey', +} + +metadata = MetaData(naming_convention=POSTGRES_INDEXES_NAMING_CONVENTION) +db = SQLAlchemy(metadata=metadata) def init_app(app): diff --git a/api/migrations/alembic.ini b/api/migrations/alembic.ini index ec9d45c26a..aa21ecabcd 100644 --- a/api/migrations/alembic.ini +++ b/api/migrations/alembic.ini @@ -3,6 +3,7 @@ [alembic] # template used to generate migration files # file_template = %%(rev)s_%%(slug)s +file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s # set to 'true' to run the environment during # the 'revision' command, regardless of autogenerate From e9d6a439076297ff57d8a8ad3d8bc9ffb964a465 Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Thu, 1 Aug 2024 11:23:53 +0800 Subject: [PATCH 06/33] fix: model parameter selector (#6861) --- .../model-parameter-modal/parameter-item.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx b/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx index a206290408..57ea4bdd11 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx @@ -56,7 +56,7 @@ const ParameterItem: FC = ({ const handleInputChange = (newValue: ParameterValue) => { setLocalValue(newValue) - if (onChange && (parameterRule.name === 'stop' || !isNullOrUndefined(value))) + if (onChange && (parameterRule.name === 'stop' || !isNullOrUndefined(value) || parameterRule.required)) onChange(newValue) } From 08f922d8c91a94aefa421510150de3b11a6abb85 Mon Sep 17 00:00:00 2001 From: Joe <79627742+ZhouhaoJiang@users.noreply.github.com> Date: Thu, 1 Aug 2024 11:30:00 +0800 Subject: [PATCH 07/33] fix: anthropic max token NoneType error (#6858) --- .../anthropic/llm/claude-3-5-sonnet-20240620.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/api/core/model_runtime/model_providers/anthropic/llm/claude-3-5-sonnet-20240620.yaml b/api/core/model_runtime/model_providers/anthropic/llm/claude-3-5-sonnet-20240620.yaml index 64ae3abf64..e02c5517fe 100644 --- a/api/core/model_runtime/model_providers/anthropic/llm/claude-3-5-sonnet-20240620.yaml +++ b/api/core/model_runtime/model_providers/anthropic/llm/claude-3-5-sonnet-20240620.yaml @@ -26,6 +26,7 @@ parameter_rules: required: false - name: max_tokens use_template: max_tokens + required: true default: 8192 min: 1 max: 8192 From f6e8e120a1f7923157e21485c43c51c6b8153d33 Mon Sep 17 00:00:00 2001 From: Weaxs <459312872@qq.com> Date: Thu, 1 Aug 2024 11:59:15 +0800 Subject: [PATCH 08/33] support xinference tts (#6746) --- .../xinference/tts/__init__.py | 0 .../model_providers/xinference/tts/tts.py | 240 ++++++++++++++++++ .../xinference/xinference.yaml | 1 + api/poetry.lock | 8 +- api/pyproject.toml | 2 +- 5 files changed, 246 insertions(+), 5 deletions(-) create mode 100644 api/core/model_runtime/model_providers/xinference/tts/__init__.py create mode 100644 api/core/model_runtime/model_providers/xinference/tts/tts.py diff --git a/api/core/model_runtime/model_providers/xinference/tts/__init__.py b/api/core/model_runtime/model_providers/xinference/tts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api/core/model_runtime/model_providers/xinference/tts/tts.py b/api/core/model_runtime/model_providers/xinference/tts/tts.py new file mode 100644 index 0000000000..c106e38781 --- /dev/null +++ b/api/core/model_runtime/model_providers/xinference/tts/tts.py @@ -0,0 +1,240 @@ +import concurrent.futures +from functools import reduce +from io import BytesIO +from typing import Optional + +from flask import Response +from pydub import AudioSegment +from xinference_client.client.restful.restful_client import Client, RESTfulAudioModelHandle + +from core.model_runtime.entities.common_entities import I18nObject +from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelType +from core.model_runtime.errors.invoke import ( + InvokeAuthorizationError, + InvokeBadRequestError, + InvokeConnectionError, + InvokeError, + InvokeRateLimitError, + InvokeServerUnavailableError, +) +from core.model_runtime.errors.validate import CredentialsValidateFailedError +from core.model_runtime.model_providers.__base.tts_model import TTSModel + + +class XinferenceText2SpeechModel(TTSModel): + + def __init__(self): + # preset voices, need support custom voice + self.model_voices = { + 'chattts': { + 'all': [ + {'name': 'Alloy', 'value': 'alloy'}, + {'name': 'Echo', 'value': 'echo'}, + {'name': 'Fable', 'value': 'fable'}, + {'name': 'Onyx', 'value': 'onyx'}, + {'name': 'Nova', 'value': 'nova'}, + {'name': 'Shimmer', 'value': 'shimmer'}, + ] + }, + 'cosyvoice': { + 'zh-Hans': [ + {'name': '中文男', 'value': '中文男'}, + {'name': '中文女', 'value': '中文女'}, + {'name': '粤语女', 'value': '粤语女'}, + ], + 'zh-Hant': [ + {'name': '中文男', 'value': '中文男'}, + {'name': '中文女', 'value': '中文女'}, + {'name': '粤语女', 'value': '粤语女'}, + ], + 'en-US': [ + {'name': '英文男', 'value': '英文男'}, + {'name': '英文女', 'value': '英文女'}, + ], + 'ja-JP': [ + {'name': '日语男', 'value': '日语男'}, + ], + 'ko-KR': [ + {'name': '韩语女', 'value': '韩语女'}, + ] + } + } + + def validate_credentials(self, model: str, credentials: dict) -> None: + """ + Validate model credentials + + :param model: model name + :param credentials: model credentials + :return: + """ + try: + if ("/" in credentials['model_uid'] or + "?" in credentials['model_uid'] or + "#" in credentials['model_uid']): + raise CredentialsValidateFailedError("model_uid should not contain /, ?, or #") + + if credentials['server_url'].endswith('/'): + credentials['server_url'] = credentials['server_url'][:-1] + + # initialize client + client = Client( + base_url=credentials['server_url'] + ) + + xinference_client = client.get_model(model_uid=credentials['model_uid']) + + if not isinstance(xinference_client, RESTfulAudioModelHandle): + raise InvokeBadRequestError( + 'please check model type, the model you want to invoke is not a audio model') + + self._tts_invoke( + model=model, + credentials=credentials, + content_text='Hello Dify!', + voice=self._get_model_default_voice(model, credentials), + ) + except Exception as ex: + raise CredentialsValidateFailedError(str(ex)) + + def _invoke(self, model: str, tenant_id: str, credentials: dict, content_text: str, voice: str, + user: Optional[str] = None): + """ + _invoke text2speech model + + :param model: model name + :param tenant_id: user tenant id + :param credentials: model credentials + :param voice: model timbre + :param content_text: text content to be translated + :param user: unique user id + :return: text translated to audio file + """ + return self._tts_invoke(model, credentials, content_text, voice) + + def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity | None: + """ + used to define customizable model schema + """ + + entity = AIModelEntity( + model=model, + label=I18nObject( + en_US=model + ), + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_type=ModelType.TTS, + model_properties={}, + parameter_rules=[] + ) + + return entity + + @property + def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: + """ + Map model invoke error to unified error + The key is the error type thrown to the caller + The value is the error type thrown by the model, + which needs to be converted into a unified error type for the caller. + + :return: Invoke error mapping + """ + return { + InvokeConnectionError: [ + InvokeConnectionError + ], + InvokeServerUnavailableError: [ + InvokeServerUnavailableError + ], + InvokeRateLimitError: [ + InvokeRateLimitError + ], + InvokeAuthorizationError: [ + InvokeAuthorizationError + ], + InvokeBadRequestError: [ + InvokeBadRequestError, + KeyError, + ValueError + ] + } + + def get_tts_model_voices(self, model: str, credentials: dict, language: Optional[str] = None) -> list: + for key, voices in self.model_voices.items(): + if key in model.lower(): + if language in voices: + return voices[language] + elif 'all' in voices: + return voices['all'] + return [] + + def _get_model_default_voice(self, model: str, credentials: dict) -> any: + return "" + + def _get_model_word_limit(self, model: str, credentials: dict) -> int: + return 3500 + + def _get_model_audio_type(self, model: str, credentials: dict) -> str: + return "mp3" + + def _get_model_workers_limit(self, model: str, credentials: dict) -> int: + return 5 + + def _tts_invoke(self, model: str, credentials: dict, content_text: str, voice: str) -> any: + """ + _tts_invoke text2speech model + + :param model: model name + :param credentials: model credentials + :param voice: model timbre + :param content_text: text content to be translated + :return: text translated to audio file + """ + if credentials['server_url'].endswith('/'): + credentials['server_url'] = credentials['server_url'][:-1] + + word_limit = self._get_model_word_limit(model, credentials) + audio_type = self._get_model_audio_type(model, credentials) + handle = RESTfulAudioModelHandle(credentials['model_uid'], credentials['server_url'], auth_headers={}) + + try: + sentences = list(self._split_text_into_sentences(org_text=content_text, max_length=word_limit)) + audio_bytes_list = [] + + with concurrent.futures.ThreadPoolExecutor(max_workers=min((3, len(sentences)))) as executor: + futures = [executor.submit( + handle.speech, input=sentence, voice=voice, response_format="mp3", speed=1.0, stream=False) + for sentence in sentences] + for future in futures: + try: + if future.result(): + audio_bytes_list.append(future.result()) + except Exception as ex: + raise InvokeBadRequestError(str(ex)) + + if len(audio_bytes_list) > 0: + audio_segments = [AudioSegment.from_file( + BytesIO(audio_bytes), format=audio_type) for audio_bytes in + audio_bytes_list if audio_bytes] + combined_segment = reduce(lambda x, y: x + y, audio_segments) + buffer: BytesIO = BytesIO() + combined_segment.export(buffer, format=audio_type) + buffer.seek(0) + return Response(buffer.read(), status=200, mimetype=f"audio/{audio_type}") + except Exception as ex: + raise InvokeBadRequestError(str(ex)) + + def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str, voice: str) -> any: + """ + _tts_invoke_streaming text2speech model + + Attention: stream api may return error [Parallel generation is not supported by ggml] + + :param model: model name + :param credentials: model credentials + :param voice: model timbre + :param content_text: text content to be translated + :return: text translated to audio file + """ + pass diff --git a/api/core/model_runtime/model_providers/xinference/xinference.yaml b/api/core/model_runtime/model_providers/xinference/xinference.yaml index 9496c66fdd..aca076b6e1 100644 --- a/api/core/model_runtime/model_providers/xinference/xinference.yaml +++ b/api/core/model_runtime/model_providers/xinference/xinference.yaml @@ -17,6 +17,7 @@ supported_model_types: - text-embedding - rerank - speech2text + - tts configurate_methods: - customizable-model model_credential_schema: diff --git a/api/poetry.lock b/api/poetry.lock index abde108a7a..3356d11f78 100644 --- a/api/poetry.lock +++ b/api/poetry.lock @@ -9098,13 +9098,13 @@ h11 = ">=0.9.0,<1" [[package]] name = "xinference-client" -version = "0.9.4" +version = "0.13.3" description = "Client for Xinference" optional = false python-versions = "*" files = [ - {file = "xinference-client-0.9.4.tar.gz", hash = "sha256:21934bc9f3142ade66aaed33c2b6cf244c274d5b4b3163f9981bebdddacf205f"}, - {file = "xinference_client-0.9.4-py3-none-any.whl", hash = "sha256:6d3f1df3537a011f0afee5f9c9ca4f3ff564ca32cc999cf7038b324c0b907d0c"}, + {file = "xinference-client-0.13.3.tar.gz", hash = "sha256:822b722100affdff049c27760be7d62ac92de58c87a40d3361066df446ba648f"}, + {file = "xinference_client-0.13.3-py3-none-any.whl", hash = "sha256:f0eff3858b1ebcef2129726f82b09259c177e11db466a7ca23def3d4849c419f"}, ] [package.dependencies] @@ -9502,4 +9502,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "a8b61d74d9322302b7447b6f8728ad606abc160202a8a122a05a8ef3cec7055b" +content-hash = "ca55e4a4bb354fe969cc73c823557525c7598b0375e8791fcd77febc59e03b96" diff --git a/api/pyproject.toml b/api/pyproject.toml index 25778f323d..112ea22da8 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -173,7 +173,7 @@ transformers = "~4.35.0" unstructured = { version = "~0.10.27", extras = ["docx", "epub", "md", "msg", "ppt", "pptx"] } websocket-client = "~1.7.0" werkzeug = "~3.0.1" -xinference-client = "0.9.4" +xinference-client = "0.13.3" yarl = "~1.9.4" zhipuai = "1.0.7" rank-bm25 = "~0.2.2" From 9c4f3be0f3b377d33ca1d2ee6f6e7c242ad2645f Mon Sep 17 00:00:00 2001 From: NFish Date: Thu, 1 Aug 2024 12:57:30 +0800 Subject: [PATCH 09/33] Fix keyboard shortcut conflict between workflow and browser (#6863) --- web/app/components/workflow/index.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx index 0f69b56840..345ed46ff0 100644 --- a/web/app/components/workflow/index.tsx +++ b/web/app/components/workflow/index.tsx @@ -194,6 +194,10 @@ const Workflow: FC = memo(({ e.preventDefault() if ((e.key === 'z' || e.key === 'Z') && (e.ctrlKey || e.metaKey)) e.preventDefault() + if ((e.key === 'y' || e.key === 'Y') && (e.ctrlKey || e.metaKey)) + e.preventDefault() + if ((e.key === 's' || e.key === 'S') && (e.ctrlKey || e.metaKey)) + e.preventDefault() }) useEventListener('mousemove', (e) => { const containerClientRect = workflowContainerRef.current?.getBoundingClientRect() @@ -260,7 +264,7 @@ const Workflow: FC = memo(({ const { shortcutsEnabled: workflowHistoryShortcutsEnabled } = useWorkflowHistoryStore() - useKeyPress('delete', handleNodesDelete) + useKeyPress(['delete', 'backspace'], handleNodesDelete) useKeyPress(['delete', 'backspace'], handleEdgeDelete) useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.c`, (e) => { if (isEventTargetInputArea(e.target as HTMLElement)) @@ -310,7 +314,7 @@ const Workflow: FC = memo(({ > -
+
{ From cbf7f21adee0c2eb93c794e362c4593eb4379f5b Mon Sep 17 00:00:00 2001 From: "Charlie.Wei" Date: Thu, 1 Aug 2024 12:57:52 +0800 Subject: [PATCH 10/33] Add azure gpt4omini (#6862) Co-authored-by: luowei Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> --- api/core/hosting_configuration.py | 2 + .../model_providers/azure_openai/_constant.py | 76 +++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/api/core/hosting_configuration.py b/api/core/hosting_configuration.py index 45ad1b51bf..5f7fec5833 100644 --- a/api/core/hosting_configuration.py +++ b/api/core/hosting_configuration.py @@ -73,6 +73,8 @@ class HostingConfiguration: quota_limit=hosted_quota_limit, restrict_models=[ RestrictModel(model="gpt-4", base_model_name="gpt-4", model_type=ModelType.LLM), + RestrictModel(model="gpt-4o", base_model_name="gpt-4o", model_type=ModelType.LLM), + RestrictModel(model="gpt-4o-mini", base_model_name="gpt-4o-mini", model_type=ModelType.LLM), RestrictModel(model="gpt-4-32k", base_model_name="gpt-4-32k", model_type=ModelType.LLM), RestrictModel(model="gpt-4-1106-preview", base_model_name="gpt-4-1106-preview", model_type=ModelType.LLM), RestrictModel(model="gpt-4-vision-preview", base_model_name="gpt-4-vision-preview", model_type=ModelType.LLM), 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 63a0b5c8be..0820bfe964 100644 --- a/api/core/model_runtime/model_providers/azure_openai/_constant.py +++ b/api/core/model_runtime/model_providers/azure_openai/_constant.py @@ -572,6 +572,82 @@ LLM_BASE_MODELS = [ ) ) ), + AzureBaseModel( + base_model_name='gpt-4o-mini', + entity=AIModelEntity( + model='fake-deployment-name', + label=I18nObject( + en_US='fake-deployment-name-label', + ), + model_type=ModelType.LLM, + features=[ + ModelFeature.AGENT_THOUGHT, + ModelFeature.VISION, + ModelFeature.MULTI_TOOL_CALL, + ModelFeature.STREAM_TOOL_CALL, + ], + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_properties={ + ModelPropertyKey.MODE: LLMMode.CHAT.value, + ModelPropertyKey.CONTEXT_SIZE: 128000, + }, + parameter_rules=[ + ParameterRule( + name='temperature', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE], + ), + ParameterRule( + name='top_p', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P], + ), + ParameterRule( + name='presence_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY], + ), + ParameterRule( + name='frequency_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], + ), + _get_max_tokens(default=512, min_val=1, max_val=16384), + ParameterRule( + name='seed', + label=I18nObject( + zh_Hans='种子', + en_US='Seed' + ), + type='int', + help=I18nObject( + zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。', + en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.' + ), + required=False, + precision=2, + min=0, + max=1, + ), + ParameterRule( + name='response_format', + label=I18nObject( + zh_Hans='回复格式', + en_US='response_format' + ), + type='string', + help=I18nObject( + zh_Hans='指定模型必须输出的格式', + en_US='specifying the format that the model must output' + ), + required=False, + options=['text', 'json_object'] + ), + ], + pricing=PriceConfig( + input=0.15, + output=0.60, + unit=0.000001, + currency='USD', + ) + ) + ), AzureBaseModel( base_model_name='gpt-4o-2024-05-13', entity=AIModelEntity( From 8157fccf6d385ab537be9e2f6a6ab57c96bab92c Mon Sep 17 00:00:00 2001 From: Jyong <76649700+JohnJyong@users.noreply.github.com> Date: Thu, 1 Aug 2024 13:02:33 +0800 Subject: [PATCH 11/33] delete weight_type (#6865) --- api/core/rag/data_post_processor/data_post_processor.py | 1 - api/core/rag/rerank/entity/weight.py | 2 -- api/fields/dataset_fields.py | 1 - 3 files changed, 4 deletions(-) diff --git a/api/core/rag/data_post_processor/data_post_processor.py b/api/core/rag/data_post_processor/data_post_processor.py index 2ed6d74187..ad9ee4f7cf 100644 --- a/api/core/rag/data_post_processor/data_post_processor.py +++ b/api/core/rag/data_post_processor/data_post_processor.py @@ -37,7 +37,6 @@ class DataPostProcessor: return WeightRerankRunner( tenant_id, Weights( - weight_type=weights['weight_type'], vector_setting=VectorSetting( vector_weight=weights['vector_setting']['vector_weight'], embedding_provider_name=weights['vector_setting']['embedding_provider_name'], diff --git a/api/core/rag/rerank/entity/weight.py b/api/core/rag/rerank/entity/weight.py index 36afc89a21..6dbbad2f8d 100644 --- a/api/core/rag/rerank/entity/weight.py +++ b/api/core/rag/rerank/entity/weight.py @@ -16,8 +16,6 @@ class KeywordSetting(BaseModel): class Weights(BaseModel): """Model for weighted rerank.""" - weight_type: str - vector_setting: VectorSetting keyword_setting: KeywordSetting diff --git a/api/fields/dataset_fields.py b/api/fields/dataset_fields.py index 120b66a92d..a9f79b5c67 100644 --- a/api/fields/dataset_fields.py +++ b/api/fields/dataset_fields.py @@ -29,7 +29,6 @@ vector_setting_fields = { } weighted_score_fields = { - 'weight_type': fields.String, 'keyword_setting': fields.Nested(keyword_setting_fields), 'vector_setting': fields.Nested(vector_setting_fields), } From 14367ddc0947db2f0c2ff1ca7d84a1f3f1da7ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=86=E8=90=8C=E9=97=B7=E6=B2=B9=E7=93=B6?= <253605712@qq.com> Date: Thu, 1 Aug 2024 13:03:08 +0800 Subject: [PATCH 12/33] feat:Azure gpt4o mini (#6866) --- .../model_providers/azure_openai/_constant.py | 152 ++++++++++++++++++ .../azure_openai/azure_openai.yaml | 12 ++ 2 files changed, 164 insertions(+) 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 0820bfe964..f077ce6742 100644 --- a/api/core/model_runtime/model_providers/azure_openai/_constant.py +++ b/api/core/model_runtime/model_providers/azure_openai/_constant.py @@ -496,6 +496,158 @@ LLM_BASE_MODELS = [ ) ) ), + AzureBaseModel( + base_model_name='gpt-4o-mini', + entity=AIModelEntity( + model='fake-deployment-name', + label=I18nObject( + en_US='fake-deployment-name-label', + ), + model_type=ModelType.LLM, + features=[ + ModelFeature.AGENT_THOUGHT, + ModelFeature.VISION, + ModelFeature.MULTI_TOOL_CALL, + ModelFeature.STREAM_TOOL_CALL, + ], + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_properties={ + ModelPropertyKey.MODE: LLMMode.CHAT.value, + ModelPropertyKey.CONTEXT_SIZE: 128000, + }, + parameter_rules=[ + ParameterRule( + name='temperature', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE], + ), + ParameterRule( + name='top_p', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P], + ), + ParameterRule( + name='presence_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY], + ), + ParameterRule( + name='frequency_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], + ), + _get_max_tokens(default=512, min_val=1, max_val=16384), + ParameterRule( + name='seed', + label=I18nObject( + zh_Hans='种子', + en_US='Seed' + ), + type='int', + help=I18nObject( + zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。', + en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.' + ), + required=False, + precision=2, + min=0, + max=1, + ), + ParameterRule( + name='response_format', + label=I18nObject( + zh_Hans='回复格式', + en_US='response_format' + ), + type='string', + help=I18nObject( + zh_Hans='指定模型必须输出的格式', + en_US='specifying the format that the model must output' + ), + required=False, + options=['text', 'json_object'] + ), + ], + pricing=PriceConfig( + input=0.150, + output=0.600, + unit=0.000001, + currency='USD', + ) + ) + ), + AzureBaseModel( + base_model_name='gpt-4o-mini-2024-07-18', + entity=AIModelEntity( + model='fake-deployment-name', + label=I18nObject( + en_US='fake-deployment-name-label', + ), + model_type=ModelType.LLM, + features=[ + ModelFeature.AGENT_THOUGHT, + ModelFeature.VISION, + ModelFeature.MULTI_TOOL_CALL, + ModelFeature.STREAM_TOOL_CALL, + ], + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_properties={ + ModelPropertyKey.MODE: LLMMode.CHAT.value, + ModelPropertyKey.CONTEXT_SIZE: 128000, + }, + parameter_rules=[ + ParameterRule( + name='temperature', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE], + ), + ParameterRule( + name='top_p', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P], + ), + ParameterRule( + name='presence_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY], + ), + ParameterRule( + name='frequency_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], + ), + _get_max_tokens(default=512, min_val=1, max_val=16384), + ParameterRule( + name='seed', + label=I18nObject( + zh_Hans='种子', + en_US='Seed' + ), + type='int', + help=I18nObject( + zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。', + en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.' + ), + required=False, + precision=2, + min=0, + max=1, + ), + ParameterRule( + name='response_format', + label=I18nObject( + zh_Hans='回复格式', + en_US='response_format' + ), + type='string', + help=I18nObject( + zh_Hans='指定模型必须输出的格式', + en_US='specifying the format that the model must output' + ), + required=False, + options=['text', 'json_object'] + ), + ], + pricing=PriceConfig( + input=0.150, + output=0.600, + unit=0.000001, + currency='USD', + ) + ) + ), AzureBaseModel( base_model_name='gpt-4o', entity=AIModelEntity( diff --git a/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml b/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml index 875e94167d..be4d4651d7 100644 --- a/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml +++ b/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml @@ -114,6 +114,18 @@ model_credential_schema: show_on: - variable: __model_type value: llm + - label: + en_US: gpt-4o-mini + value: gpt-4o-mini + show_on: + - variable: __model_type + value: llm + - label: + en_US: gpt-4o-mini-2024-07-18 + value: gpt-4o-mini-2024-07-18 + show_on: + - variable: __model_type + value: llm - label: en_US: gpt-4o value: gpt-4o From 29e3c3061c903bfa6d08ba2486f87b68874a6e91 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, 1 Aug 2024 13:21:49 +0800 Subject: [PATCH 13/33] fix: remote image not display in answer node (#6867) --- api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.py | 2 ++ api/core/workflow/nodes/tool/tool_node.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) 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 ed873cdcf6..bca53f6b4b 100644 --- a/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.py +++ b/api/core/tools/provider/builtin/duckduckgo/tools/ddgo_img.py @@ -2,6 +2,7 @@ from typing import Any from duckduckgo_search import DDGS +from core.file.file_obj import FileTransferMethod from core.tools.entities.tool_entities import ToolInvokeMessage from core.tools.tool.builtin_tool import BuiltinTool @@ -21,6 +22,7 @@ class DuckDuckGoImageSearchTool(BuiltinTool): response = DDGS().images(**query_dict) result = [] for res in response: + res['transfer_method'] = FileTransferMethod.REMOTE_URL msg = ToolInvokeMessage(type=ToolInvokeMessage.MessageType.IMAGE_LINK, message=res.get('image'), save_as='', diff --git a/api/core/workflow/nodes/tool/tool_node.py b/api/core/workflow/nodes/tool/tool_node.py index c03a17468a..969b1c241e 100644 --- a/api/core/workflow/nodes/tool/tool_node.py +++ b/api/core/workflow/nodes/tool/tool_node.py @@ -174,13 +174,14 @@ class ToolNode(BaseNode): ext = path.splitext(url)[1] mimetype = response.meta.get('mime_type', 'image/jpeg') filename = response.save_as or url.split('/')[-1] + transfer_method = response.meta.get('transfer_method', FileTransferMethod.TOOL_FILE) # get tool file id tool_file_id = url.split('/')[-1].split('.')[0] result.append(FileVar( tenant_id=self.tenant_id, type=FileType.IMAGE, - transfer_method=FileTransferMethod.TOOL_FILE, + transfer_method=transfer_method, url=url, related_id=tool_file_id, filename=filename, From 792f908afbb7d08a0d3dbc65452d3e10f05e07db Mon Sep 17 00:00:00 2001 From: crazywoola <100913391+crazywoola@users.noreply.github.com> Date: Thu, 1 Aug 2024 13:32:03 +0800 Subject: [PATCH 14/33] Revert "feat:Azure gpt4o mini" (#6870) --- .../model_providers/azure_openai/_constant.py | 152 ------------------ .../azure_openai/azure_openai.yaml | 12 -- 2 files changed, 164 deletions(-) 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 f077ce6742..0820bfe964 100644 --- a/api/core/model_runtime/model_providers/azure_openai/_constant.py +++ b/api/core/model_runtime/model_providers/azure_openai/_constant.py @@ -496,158 +496,6 @@ LLM_BASE_MODELS = [ ) ) ), - AzureBaseModel( - base_model_name='gpt-4o-mini', - entity=AIModelEntity( - model='fake-deployment-name', - label=I18nObject( - en_US='fake-deployment-name-label', - ), - model_type=ModelType.LLM, - features=[ - ModelFeature.AGENT_THOUGHT, - ModelFeature.VISION, - ModelFeature.MULTI_TOOL_CALL, - ModelFeature.STREAM_TOOL_CALL, - ], - fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, - model_properties={ - ModelPropertyKey.MODE: LLMMode.CHAT.value, - ModelPropertyKey.CONTEXT_SIZE: 128000, - }, - parameter_rules=[ - ParameterRule( - name='temperature', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE], - ), - ParameterRule( - name='top_p', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P], - ), - ParameterRule( - name='presence_penalty', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY], - ), - ParameterRule( - name='frequency_penalty', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], - ), - _get_max_tokens(default=512, min_val=1, max_val=16384), - ParameterRule( - name='seed', - label=I18nObject( - zh_Hans='种子', - en_US='Seed' - ), - type='int', - help=I18nObject( - zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。', - en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.' - ), - required=False, - precision=2, - min=0, - max=1, - ), - ParameterRule( - name='response_format', - label=I18nObject( - zh_Hans='回复格式', - en_US='response_format' - ), - type='string', - help=I18nObject( - zh_Hans='指定模型必须输出的格式', - en_US='specifying the format that the model must output' - ), - required=False, - options=['text', 'json_object'] - ), - ], - pricing=PriceConfig( - input=0.150, - output=0.600, - unit=0.000001, - currency='USD', - ) - ) - ), - AzureBaseModel( - base_model_name='gpt-4o-mini-2024-07-18', - entity=AIModelEntity( - model='fake-deployment-name', - label=I18nObject( - en_US='fake-deployment-name-label', - ), - model_type=ModelType.LLM, - features=[ - ModelFeature.AGENT_THOUGHT, - ModelFeature.VISION, - ModelFeature.MULTI_TOOL_CALL, - ModelFeature.STREAM_TOOL_CALL, - ], - fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, - model_properties={ - ModelPropertyKey.MODE: LLMMode.CHAT.value, - ModelPropertyKey.CONTEXT_SIZE: 128000, - }, - parameter_rules=[ - ParameterRule( - name='temperature', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE], - ), - ParameterRule( - name='top_p', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P], - ), - ParameterRule( - name='presence_penalty', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY], - ), - ParameterRule( - name='frequency_penalty', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], - ), - _get_max_tokens(default=512, min_val=1, max_val=16384), - ParameterRule( - name='seed', - label=I18nObject( - zh_Hans='种子', - en_US='Seed' - ), - type='int', - help=I18nObject( - zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。', - en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.' - ), - required=False, - precision=2, - min=0, - max=1, - ), - ParameterRule( - name='response_format', - label=I18nObject( - zh_Hans='回复格式', - en_US='response_format' - ), - type='string', - help=I18nObject( - zh_Hans='指定模型必须输出的格式', - en_US='specifying the format that the model must output' - ), - required=False, - options=['text', 'json_object'] - ), - ], - pricing=PriceConfig( - input=0.150, - output=0.600, - unit=0.000001, - currency='USD', - ) - ) - ), AzureBaseModel( base_model_name='gpt-4o', entity=AIModelEntity( diff --git a/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml b/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml index be4d4651d7..875e94167d 100644 --- a/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml +++ b/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml @@ -114,18 +114,6 @@ model_credential_schema: show_on: - variable: __model_type value: llm - - label: - en_US: gpt-4o-mini - value: gpt-4o-mini - show_on: - - variable: __model_type - value: llm - - label: - en_US: gpt-4o-mini-2024-07-18 - value: gpt-4o-mini-2024-07-18 - show_on: - - variable: __model_type - value: llm - label: en_US: gpt-4o value: gpt-4o From 9ae88ede120473491ee9f9e260cad757b4dfc4ec Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Thu, 1 Aug 2024 13:45:18 +0800 Subject: [PATCH 15/33] chore: n to 1 retrieval (#6839) --- .../params-config/config-content.tsx | 30 ++++--- .../params-config/weighted-score.css | 7 ++ .../params-config/weighted-score.tsx | 87 ++++--------------- .../base/radio-card/simple/index.tsx | 19 ++-- .../base/radio-card/simple/style.module.css | 2 +- .../nodes/knowledge-retrieval/types.ts | 2 - .../nodes/knowledge-retrieval/use-config.ts | 2 +- .../nodes/knowledge-retrieval/utils.ts | 2 - web/i18n/en-US/dataset.ts | 1 + web/i18n/zh-Hans/dataset.ts | 1 + web/models/debug.ts | 2 - 11 files changed, 59 insertions(+), 96 deletions(-) create mode 100644 web/app/components/app/configuration/dataset-config/params-config/weighted-score.css diff --git a/web/app/components/app/configuration/dataset-config/params-config/config-content.tsx b/web/app/components/app/configuration/dataset-config/params-config/config-content.tsx index 683617bf25..3656bf6ea7 100644 --- a/web/app/components/app/configuration/dataset-config/params-config/config-content.tsx +++ b/web/app/components/app/configuration/dataset-config/params-config/config-content.tsx @@ -4,6 +4,7 @@ import { memo, useMemo } from 'react' import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { + RiAlertFill, RiQuestionLine, } from '@remixicon/react' import WeightedScore from './weighted-score' @@ -26,7 +27,6 @@ import TooltipPlus from '@/app/components/base/tooltip-plus' import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import type { DataSet, - WeightedScoreEnum, } from '@/models/datasets' import { RerankingModeEnum } from '@/models/datasets' import cn from '@/utils/classnames' @@ -112,12 +112,11 @@ const ConfigContent: FC = ({ }) } - const handleWeightedScoreChange = (value: { type: WeightedScoreEnum; value: number[] }) => { + const handleWeightedScoreChange = (value: { value: number[] }) => { const configs = { ...datasetConfigs, weights: { ...datasetConfigs.weights!, - weight_type: value.type, vector_setting: { ...datasetConfigs.weights!.vector_setting!, vector_weight: value.value[0], @@ -178,14 +177,6 @@ const ConfigContent: FC = ({ popupContent={(
{t('dataset.nTo1RetrievalLegacy')} - - ({t('dataset.nTo1RetrievalLegacyLink')}) -
)} > @@ -196,6 +187,22 @@ const ConfigContent: FC = ({ description={t('appDebug.datasetConfig.retrieveOneWay.description')} isChosen={type === RETRIEVE_TYPE.oneWay} onChosen={() => { setType(RETRIEVE_TYPE.oneWay) }} + extra={( +
+ +
+ {t('dataset.nTo1RetrievalLegacyLinkText')} + + {t('dataset.nTo1RetrievalLegacyLink')} + +
+
+ )} /> } @@ -302,7 +309,6 @@ const ConfigContent: FC = ({
{ } type Value = { - type: WeightedScoreEnum value: number[] } @@ -30,78 +26,31 @@ const WeightedScore = ({ onChange = () => {}, }: WeightedScoreProps) => { const { t } = useTranslation() - const options = [ - { - value: WeightedScoreEnum.SemanticFirst, - label: t('dataset.weightedScore.semanticFirst'), - }, - { - value: WeightedScoreEnum.KeywordFirst, - label: t('dataset.weightedScore.keywordFirst'), - }, - { - value: WeightedScoreEnum.Customized, - label: t('dataset.weightedScore.customized'), - }, - ] - - const disabled = value.type !== WeightedScoreEnum.Customized - - const handleTypeChange = useCallback((type: WeightedScoreEnum) => { - const result = { ...value, type } - - if (type === WeightedScoreEnum.SemanticFirst) - result.value = [DEFAULT_WEIGHTED_SCORE.semanticFirst.semantic, DEFAULT_WEIGHTED_SCORE.semanticFirst.keyword] - - if (type === WeightedScoreEnum.KeywordFirst) - result.value = [DEFAULT_WEIGHTED_SCORE.keywordFirst.semantic, DEFAULT_WEIGHTED_SCORE.keywordFirst.keyword] - - onChange(result) - }, [value, onChange]) return (
-
- { - options.map(option => ( -
handleTypeChange(option.value)} - > -
-
{option.label}
-
- )) - } -
-
-
-
- {t('dataset.weightedScore.semantic')} -
- {formatNumber(value.value[0])} -
+
onChange({ type: value.type, value: [v, (10 - v * 10) / 10] })} - disabled={disabled} - thumbClassName={cn(disabled && '!cursor-not-allowed')} - trackClassName='!bg-transparent' + onChange={v => onChange({ value: [v, (10 - v * 10) / 10] })} + trackClassName='weightedScoreSliderTrack' /> -
- {formatNumber(value.value[1])} -
- {t('dataset.weightedScore.keyword')} +
+
+
+ {t('dataset.weightedScore.semantic')} +
+ {formatNumber(value.value[0])} +
+
+ {formatNumber(value.value[1])} +
+ {t('dataset.weightedScore.keyword')} +
diff --git a/web/app/components/base/radio-card/simple/index.tsx b/web/app/components/base/radio-card/simple/index.tsx index 6893b4c2e2..926fc02523 100644 --- a/web/app/components/base/radio-card/simple/index.tsx +++ b/web/app/components/base/radio-card/simple/index.tsx @@ -12,6 +12,7 @@ type Props = { onChosen: () => void chosenConfig?: React.ReactNode icon?: JSX.Element + extra?: React.ReactNode } const RadioCard: FC = ({ @@ -20,20 +21,24 @@ const RadioCard: FC = ({ isChosen, onChosen, icon, + extra, }) => { return (
- {icon} -
-
-
{title}
-
+
+ {icon} +
+
+
{title}
+
+
+
{description}
-
{description}
+ {extra}
) } diff --git a/web/app/components/base/radio-card/simple/style.module.css b/web/app/components/base/radio-card/simple/style.module.css index 7b9871cc17..58a87086bc 100644 --- a/web/app/components/base/radio-card/simple/style.module.css +++ b/web/app/components/base/radio-card/simple/style.module.css @@ -1,5 +1,5 @@ .item { - @apply relative p-4 rounded-xl border border-gray-100 cursor-pointer; + @apply relative rounded-xl border border-gray-100 cursor-pointer; background-color: #fcfcfd; } diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/types.ts b/web/app/components/workflow/nodes/knowledge-retrieval/types.ts index b14a8bb15c..da9373962b 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/types.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/types.ts @@ -2,7 +2,6 @@ import type { CommonNodeType, ModelConfig, ValueSelector } from '@/app/component import type { RETRIEVE_TYPE } from '@/types/app' import type { RerankingModeEnum, - WeightedScoreEnum, } from '@/models/datasets' export type MultipleRetrievalConfig = { @@ -14,7 +13,6 @@ export type MultipleRetrievalConfig = { } reranking_mode?: RerankingModeEnum weights?: { - weight_type: WeightedScoreEnum vector_setting: { vector_weight: number embedding_provider_name: string diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts index 0a5631a08e..994bf4f205 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts @@ -263,7 +263,7 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { handleMultipleRetrievalConfigChange, handleModelChanged, handleCompletionParamsChange, - selectedDatasets, + selectedDatasets: selectedDatasets.filter(d => d.name), handleOnDatasetsChange, isShowSingleRun, hideSingleRun, diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/utils.ts b/web/app/components/workflow/nodes/knowledge-retrieval/utils.ts index d4dfd3b914..3835e88f90 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/utils.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/utils.ts @@ -7,7 +7,6 @@ import type { import { DEFAULT_WEIGHTED_SCORE, RerankingModeEnum, - WeightedScoreEnum, } from '@/models/datasets' import { RETRIEVE_METHOD } from '@/types/app' import { DATASET_DEFAULT } from '@/config' @@ -100,7 +99,6 @@ export const getMultipleRetrievalConfig = (multipleRetrievalConfig: MultipleRetr if (allHighQuality && !inconsistentEmbeddingModel && (reranking_mode === RerankingModeEnum.WeightedScore || reranking_mode === undefined) && !weights) { result.weights = { - weight_type: WeightedScoreEnum.Customized, vector_setting: { vector_weight: allHighQualityVectorSearch ? DEFAULT_WEIGHTED_SCORE.allHighQualityVectorSearch.semantic diff --git a/web/i18n/en-US/dataset.ts b/web/i18n/en-US/dataset.ts index 64fda36c10..e6914b4a00 100644 --- a/web/i18n/en-US/dataset.ts +++ b/web/i18n/en-US/dataset.ts @@ -70,6 +70,7 @@ const translation = { }, nTo1RetrievalLegacy: 'N-to-1 retrieval will be officially deprecated from September. It is recommended to use the latest Multi-path retrieval to obtain better results. ', nTo1RetrievalLegacyLink: 'Learn more', + nTo1RetrievalLegacyLinkText: ' N-to-1 retrieval will be officially deprecated in September.', } export default translation diff --git a/web/i18n/zh-Hans/dataset.ts b/web/i18n/zh-Hans/dataset.ts index 1dd11c5c33..f76be97818 100644 --- a/web/i18n/zh-Hans/dataset.ts +++ b/web/i18n/zh-Hans/dataset.ts @@ -70,6 +70,7 @@ const translation = { }, nTo1RetrievalLegacy: '9 月 1 日起我们将不再提供此能力,推荐使用最新的多路召回获得更好的检索效果。', nTo1RetrievalLegacyLink: '了解更多', + nTo1RetrievalLegacyLinkText: '9 月 1 日起我们将不再提供此能力。', } export default translation diff --git a/web/models/debug.ts b/web/models/debug.ts index 468d9fa0ba..2b2af80065 100644 --- a/web/models/debug.ts +++ b/web/models/debug.ts @@ -1,7 +1,6 @@ import type { AgentStrategy, ModelModeType, RETRIEVE_TYPE, ToolItem, TtsAutoPlay } from '@/types/app' import type { RerankingModeEnum, - WeightedScoreEnum, } from '@/models/datasets' export type Inputs = Record @@ -157,7 +156,6 @@ export type DatasetConfigs = { } reranking_mode?: RerankingModeEnum weights?: { - weight_type: WeightedScoreEnum vector_setting: { vector_weight: number embedding_provider_name: string From f31142e7588cb5e7e9b4b273253438b15166fc84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=86=E8=90=8C=E9=97=B7=E6=B2=B9=E7=93=B6?= <253605712@qq.com> Date: Thu, 1 Aug 2024 14:04:18 +0800 Subject: [PATCH 16/33] Azure 4o mini options (#6873) --- .../model_providers/azure_openai/_constant.py | 228 ++++++++++++------ .../azure_openai/azure_openai.yaml | 12 + 2 files changed, 164 insertions(+), 76 deletions(-) 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 0820bfe964..984cca3744 100644 --- a/api/core/model_runtime/model_providers/azure_openai/_constant.py +++ b/api/core/model_runtime/model_providers/azure_openai/_constant.py @@ -496,6 +496,158 @@ LLM_BASE_MODELS = [ ) ) ), + AzureBaseModel( + base_model_name='gpt-4o-mini', + entity=AIModelEntity( + model='fake-deployment-name', + label=I18nObject( + en_US='fake-deployment-name-label', + ), + model_type=ModelType.LLM, + features=[ + ModelFeature.AGENT_THOUGHT, + ModelFeature.VISION, + ModelFeature.MULTI_TOOL_CALL, + ModelFeature.STREAM_TOOL_CALL, + ], + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_properties={ + ModelPropertyKey.MODE: LLMMode.CHAT.value, + ModelPropertyKey.CONTEXT_SIZE: 128000, + }, + parameter_rules=[ + ParameterRule( + name='temperature', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE], + ), + ParameterRule( + name='top_p', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P], + ), + ParameterRule( + name='presence_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY], + ), + ParameterRule( + name='frequency_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], + ), + _get_max_tokens(default=512, min_val=1, max_val=16384), + ParameterRule( + name='seed', + label=I18nObject( + zh_Hans='种子', + en_US='Seed' + ), + type='int', + help=I18nObject( + zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。', + en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.' + ), + required=False, + precision=2, + min=0, + max=1, + ), + ParameterRule( + name='response_format', + label=I18nObject( + zh_Hans='回复格式', + en_US='response_format' + ), + type='string', + help=I18nObject( + zh_Hans='指定模型必须输出的格式', + en_US='specifying the format that the model must output' + ), + required=False, + options=['text', 'json_object'] + ), + ], + pricing=PriceConfig( + input=0.150, + output=0.600, + unit=0.000001, + currency='USD', + ) + ) + ), + AzureBaseModel( + base_model_name='gpt-4o-mini-2024-07-18', + entity=AIModelEntity( + model='fake-deployment-name', + label=I18nObject( + en_US='fake-deployment-name-label', + ), + model_type=ModelType.LLM, + features=[ + ModelFeature.AGENT_THOUGHT, + ModelFeature.VISION, + ModelFeature.MULTI_TOOL_CALL, + ModelFeature.STREAM_TOOL_CALL, + ], + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_properties={ + ModelPropertyKey.MODE: LLMMode.CHAT.value, + ModelPropertyKey.CONTEXT_SIZE: 128000, + }, + parameter_rules=[ + ParameterRule( + name='temperature', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE], + ), + ParameterRule( + name='top_p', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P], + ), + ParameterRule( + name='presence_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY], + ), + ParameterRule( + name='frequency_penalty', + **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], + ), + _get_max_tokens(default=512, min_val=1, max_val=16384), + ParameterRule( + name='seed', + label=I18nObject( + zh_Hans='种子', + en_US='Seed' + ), + type='int', + help=I18nObject( + zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。', + en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.' + ), + required=False, + precision=2, + min=0, + max=1, + ), + ParameterRule( + name='response_format', + label=I18nObject( + zh_Hans='回复格式', + en_US='response_format' + ), + type='string', + help=I18nObject( + zh_Hans='指定模型必须输出的格式', + en_US='specifying the format that the model must output' + ), + required=False, + options=['text', 'json_object'] + ), + ], + pricing=PriceConfig( + input=0.150, + output=0.600, + unit=0.000001, + currency='USD', + ) + ) + ), AzureBaseModel( base_model_name='gpt-4o', entity=AIModelEntity( @@ -572,82 +724,6 @@ LLM_BASE_MODELS = [ ) ) ), - AzureBaseModel( - base_model_name='gpt-4o-mini', - entity=AIModelEntity( - model='fake-deployment-name', - label=I18nObject( - en_US='fake-deployment-name-label', - ), - model_type=ModelType.LLM, - features=[ - ModelFeature.AGENT_THOUGHT, - ModelFeature.VISION, - ModelFeature.MULTI_TOOL_CALL, - ModelFeature.STREAM_TOOL_CALL, - ], - fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, - model_properties={ - ModelPropertyKey.MODE: LLMMode.CHAT.value, - ModelPropertyKey.CONTEXT_SIZE: 128000, - }, - parameter_rules=[ - ParameterRule( - name='temperature', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE], - ), - ParameterRule( - name='top_p', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P], - ), - ParameterRule( - name='presence_penalty', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY], - ), - ParameterRule( - name='frequency_penalty', - **PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY], - ), - _get_max_tokens(default=512, min_val=1, max_val=16384), - ParameterRule( - name='seed', - label=I18nObject( - zh_Hans='种子', - en_US='Seed' - ), - type='int', - help=I18nObject( - zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。', - en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.' - ), - required=False, - precision=2, - min=0, - max=1, - ), - ParameterRule( - name='response_format', - label=I18nObject( - zh_Hans='回复格式', - en_US='response_format' - ), - type='string', - help=I18nObject( - zh_Hans='指定模型必须输出的格式', - en_US='specifying the format that the model must output' - ), - required=False, - options=['text', 'json_object'] - ), - ], - pricing=PriceConfig( - input=0.15, - output=0.60, - unit=0.000001, - currency='USD', - ) - ) - ), AzureBaseModel( base_model_name='gpt-4o-2024-05-13', entity=AIModelEntity( diff --git a/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml b/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml index 875e94167d..be4d4651d7 100644 --- a/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml +++ b/api/core/model_runtime/model_providers/azure_openai/azure_openai.yaml @@ -114,6 +114,18 @@ model_credential_schema: show_on: - variable: __model_type value: llm + - label: + en_US: gpt-4o-mini + value: gpt-4o-mini + show_on: + - variable: __model_type + value: llm + - label: + en_US: gpt-4o-mini-2024-07-18 + value: gpt-4o-mini-2024-07-18 + show_on: + - variable: __model_type + value: llm - label: en_US: gpt-4o value: gpt-4o From a9cd6df97e1989461876ca5a364f3fd4047158ad Mon Sep 17 00:00:00 2001 From: chenxu9741 Date: Thu, 1 Aug 2024 14:50:22 +0800 Subject: [PATCH 17/33] Remove tts (blocking call) (#6869) --- .../model_providers/azure_openai/tts/tts.py | 46 +--------------- .../model_providers/openai/tts/tts.py | 52 ++----------------- .../model_providers/tongyi/tts/tts.py | 47 +---------------- 3 files changed, 7 insertions(+), 138 deletions(-) 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 50c125b873..3d2bac1c31 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 @@ -1,12 +1,8 @@ import concurrent.futures import copy -from functools import reduce -from io import BytesIO from typing import Optional -from flask import Response from openai import AzureOpenAI -from pydub import AudioSegment from core.model_runtime.entities.model_entities import AIModelEntity from core.model_runtime.errors.invoke import InvokeBadRequestError @@ -51,7 +47,7 @@ class AzureOpenAIText2SpeechModel(_CommonAzureOpenAI, TTSModel): :return: text translated to audio file """ try: - self._tts_invoke( + self._tts_invoke_streaming( model=model, credentials=credentials, content_text='Hello Dify!', @@ -60,45 +56,6 @@ class AzureOpenAIText2SpeechModel(_CommonAzureOpenAI, TTSModel): except Exception as ex: raise CredentialsValidateFailedError(str(ex)) - def _tts_invoke(self, model: str, credentials: dict, content_text: str, voice: str) -> Response: - """ - _tts_invoke text2speech model - - :param model: model name - :param credentials: model credentials - :param content_text: text content to be translated - :param voice: model timbre - :return: text translated to audio file - """ - audio_type = self._get_model_audio_type(model, credentials) - word_limit = self._get_model_word_limit(model, credentials) - max_workers = self._get_model_workers_limit(model, credentials) - try: - sentences = list(self._split_text_into_sentences(org_text=content_text, max_length=word_limit)) - audio_bytes_list = [] - - # Create a thread pool and map the function to the list of sentences - with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: - futures = [executor.submit(self._process_sentence, sentence=sentence, model=model, voice=voice, - credentials=credentials) for sentence in sentences] - for future in futures: - try: - if future.result(): - audio_bytes_list.append(future.result()) - except Exception as ex: - raise InvokeBadRequestError(str(ex)) - - if len(audio_bytes_list) > 0: - audio_segments = [AudioSegment.from_file(BytesIO(audio_bytes), format=audio_type) for audio_bytes in - audio_bytes_list if audio_bytes] - combined_segment = reduce(lambda x, y: x + y, audio_segments) - buffer: BytesIO = BytesIO() - combined_segment.export(buffer, format=audio_type) - buffer.seek(0) - return Response(buffer.read(), status=200, mimetype=f"audio/{audio_type}") - except Exception as ex: - raise InvokeBadRequestError(str(ex)) - def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str, voice: str) -> any: """ @@ -144,7 +101,6 @@ class AzureOpenAIText2SpeechModel(_CommonAzureOpenAI, TTSModel): :param sentence: text content to be translated :return: text translated to audio file """ - # transform credentials to kwargs for model instance credentials_kwargs = self._to_credential_kwargs(credentials) client = AzureOpenAI(**credentials_kwargs) response = client.audio.speech.create(model=model, voice=voice, input=sentence.strip()) 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 d3fcf731f1..afa5d4b88a 100644 --- a/api/core/model_runtime/model_providers/openai/tts/tts.py +++ b/api/core/model_runtime/model_providers/openai/tts/tts.py @@ -1,11 +1,7 @@ import concurrent.futures -from functools import reduce -from io import BytesIO from typing import Optional -from flask import Response from openai import OpenAI -from pydub import AudioSegment from core.model_runtime.errors.invoke import InvokeBadRequestError from core.model_runtime.errors.validate import CredentialsValidateFailedError @@ -32,7 +28,8 @@ class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel): :return: text translated to audio file """ - if not voice or voice not in [d['value'] for d in self.get_tts_model_voices(model=model, credentials=credentials)]: + if not voice or voice not in [d['value'] for d in + self.get_tts_model_voices(model=model, credentials=credentials)]: voice = self._get_model_default_voice(model, credentials) # if streaming: return self._tts_invoke_streaming(model=model, @@ -50,7 +47,7 @@ class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel): :return: text translated to audio file """ try: - self._tts_invoke( + self._tts_invoke_streaming( model=model, credentials=credentials, content_text='Hello Dify!', @@ -59,46 +56,6 @@ class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel): except Exception as ex: raise CredentialsValidateFailedError(str(ex)) - def _tts_invoke(self, model: str, credentials: dict, content_text: str, voice: str) -> Response: - """ - _tts_invoke text2speech model - - :param model: model name - :param credentials: model credentials - :param content_text: text content to be translated - :param voice: model timbre - :return: text translated to audio file - """ - audio_type = self._get_model_audio_type(model, credentials) - word_limit = self._get_model_word_limit(model, credentials) - max_workers = self._get_model_workers_limit(model, credentials) - try: - sentences = list(self._split_text_into_sentences(org_text=content_text, max_length=word_limit)) - audio_bytes_list = [] - - # Create a thread pool and map the function to the list of sentences - with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: - futures = [executor.submit(self._process_sentence, sentence=sentence, model=model, voice=voice, - credentials=credentials) for sentence in sentences] - for future in futures: - try: - if future.result(): - audio_bytes_list.append(future.result()) - except Exception as ex: - raise InvokeBadRequestError(str(ex)) - - if len(audio_bytes_list) > 0: - audio_segments = [AudioSegment.from_file(BytesIO(audio_bytes), format=audio_type) for audio_bytes in - audio_bytes_list if audio_bytes] - combined_segment = reduce(lambda x, y: x + y, audio_segments) - buffer: BytesIO = BytesIO() - combined_segment.export(buffer, format=audio_type) - buffer.seek(0) - return Response(buffer.read(), status=200, mimetype=f"audio/{audio_type}") - except Exception as ex: - raise InvokeBadRequestError(str(ex)) - - def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str, voice: str) -> any: """ @@ -114,7 +71,8 @@ class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel): # doc: https://platform.openai.com/docs/guides/text-to-speech credentials_kwargs = self._to_credential_kwargs(credentials) client = OpenAI(**credentials_kwargs) - model_support_voice = [x.get("value") for x in self.get_tts_model_voices(model=model, credentials=credentials)] + model_support_voice = [x.get("value") for x in + self.get_tts_model_voices(model=model, credentials=credentials)] if not voice or voice not in model_support_voice: voice = self._get_model_default_voice(model, credentials) word_limit = self._get_model_word_limit(model, credentials) diff --git a/api/core/model_runtime/model_providers/tongyi/tts/tts.py b/api/core/model_runtime/model_providers/tongyi/tts/tts.py index 655ed2d1d0..664b02cd92 100644 --- a/api/core/model_runtime/model_providers/tongyi/tts/tts.py +++ b/api/core/model_runtime/model_providers/tongyi/tts/tts.py @@ -1,7 +1,4 @@ -import concurrent.futures import threading -from functools import reduce -from io import BytesIO from queue import Queue from typing import Optional @@ -9,8 +6,6 @@ import dashscope from dashscope import SpeechSynthesizer from dashscope.api_entities.dashscope_response import SpeechSynthesisResponse from dashscope.audio.tts import ResultCallback, SpeechSynthesisResult -from flask import Response -from pydub import AudioSegment from core.model_runtime.errors.invoke import InvokeBadRequestError from core.model_runtime.errors.validate import CredentialsValidateFailedError @@ -55,7 +50,7 @@ class TongyiText2SpeechModel(_CommonTongyi, TTSModel): :return: text translated to audio file """ try: - self._tts_invoke( + self._tts_invoke_streaming( model=model, credentials=credentials, content_text='Hello Dify!', @@ -64,46 +59,6 @@ class TongyiText2SpeechModel(_CommonTongyi, TTSModel): except Exception as ex: raise CredentialsValidateFailedError(str(ex)) - def _tts_invoke(self, model: str, credentials: dict, content_text: str, voice: str) -> Response: - """ - _tts_invoke text2speech model - - :param model: model name - :param credentials: model credentials - :param voice: model timbre - :param content_text: text content to be translated - :return: text translated to audio file - """ - audio_type = self._get_model_audio_type(model, credentials) - word_limit = self._get_model_word_limit(model, credentials) - max_workers = self._get_model_workers_limit(model, credentials) - try: - sentences = list(self._split_text_into_sentences(org_text=content_text, max_length=word_limit)) - audio_bytes_list = [] - - # Create a thread pool and map the function to the list of sentences - with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: - futures = [executor.submit(self._process_sentence, sentence=sentence, - credentials=credentials, voice=voice, audio_type=audio_type) for sentence in - sentences] - for future in futures: - try: - if future.result(): - audio_bytes_list.append(future.result()) - except Exception as ex: - raise InvokeBadRequestError(str(ex)) - - if len(audio_bytes_list) > 0: - audio_segments = [AudioSegment.from_file(BytesIO(audio_bytes), format=audio_type) for audio_bytes in - audio_bytes_list if audio_bytes] - combined_segment = reduce(lambda x, y: x + y, audio_segments) - buffer: BytesIO = BytesIO() - combined_segment.export(buffer, format=audio_type) - buffer.seek(0) - return Response(buffer.read(), status=200, mimetype=f"audio/{audio_type}") - except Exception as ex: - raise InvokeBadRequestError(str(ex)) - def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str, voice: str) -> any: """ From 104c797dd0a0ecbf46bb6e4b69d58cef5aa20b9e Mon Sep 17 00:00:00 2001 From: hursit Date: Thu, 1 Aug 2024 12:30:35 +0300 Subject: [PATCH 18/33] feat: Add support for i18n Turkish language (tr-TR) (#6886) Co-authored-by: hursit --- README.md | 1 + README_AR.md | 1 + README_CN.md | 1 + README_ES.md | 1 + README_FR.md | 1 + README_JA.md | 1 + README_KL.md | 1 + README_KR.md | 1 + README_TR.md | 253 ++++++++++++ api/constants/languages.py | 1 + web/i18n/language.ts | 2 + web/i18n/languages.json | 7 + web/i18n/tr-TR/app-annotation.ts | 87 ++++ web/i18n/tr-TR/app-api.ts | 83 ++++ web/i18n/tr-TR/app-debug.ts | 460 +++++++++++++++++++++ web/i18n/tr-TR/app-log.ts | 91 ++++ web/i18n/tr-TR/app-overview.ts | 156 +++++++ web/i18n/tr-TR/app.ts | 126 ++++++ web/i18n/tr-TR/billing.ts | 118 ++++++ web/i18n/tr-TR/common.ts | 572 ++++++++++++++++++++++++++ web/i18n/tr-TR/custom.ts | 30 ++ web/i18n/tr-TR/dataset-creation.ts | 161 ++++++++ web/i18n/tr-TR/dataset-documents.ts | 351 ++++++++++++++++ web/i18n/tr-TR/dataset-hit-testing.ts | 28 ++ web/i18n/tr-TR/dataset-settings.ts | 35 ++ web/i18n/tr-TR/dataset.ts | 73 ++++ web/i18n/tr-TR/explore.ts | 41 ++ web/i18n/tr-TR/layout.ts | 3 + web/i18n/tr-TR/login.ts | 75 ++++ web/i18n/tr-TR/register.ts | 3 + web/i18n/tr-TR/run-log.ts | 29 ++ web/i18n/tr-TR/share-app.ts | 70 ++++ web/i18n/tr-TR/tools.ts | 153 +++++++ web/i18n/tr-TR/workflow.ts | 499 ++++++++++++++++++++++ 34 files changed, 3515 insertions(+) create mode 100644 README_TR.md create mode 100644 web/i18n/tr-TR/app-annotation.ts create mode 100644 web/i18n/tr-TR/app-api.ts create mode 100644 web/i18n/tr-TR/app-debug.ts create mode 100644 web/i18n/tr-TR/app-log.ts create mode 100644 web/i18n/tr-TR/app-overview.ts create mode 100644 web/i18n/tr-TR/app.ts create mode 100644 web/i18n/tr-TR/billing.ts create mode 100644 web/i18n/tr-TR/common.ts create mode 100644 web/i18n/tr-TR/custom.ts create mode 100644 web/i18n/tr-TR/dataset-creation.ts create mode 100644 web/i18n/tr-TR/dataset-documents.ts create mode 100644 web/i18n/tr-TR/dataset-hit-testing.ts create mode 100644 web/i18n/tr-TR/dataset-settings.ts create mode 100644 web/i18n/tr-TR/dataset.ts create mode 100644 web/i18n/tr-TR/explore.ts create mode 100644 web/i18n/tr-TR/layout.ts create mode 100644 web/i18n/tr-TR/login.ts create mode 100644 web/i18n/tr-TR/register.ts create mode 100644 web/i18n/tr-TR/run-log.ts create mode 100644 web/i18n/tr-TR/share-app.ts create mode 100644 web/i18n/tr-TR/tools.ts create mode 100644 web/i18n/tr-TR/workflow.ts diff --git a/README.md b/README.md index 5d8221bcbd..0dd0d86254 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ README tlhIngan Hol README in Korean README بالعربية + Türkçe README

diff --git a/README_AR.md b/README_AR.md index c91602721e..25229ef460 100644 --- a/README_AR.md +++ b/README_AR.md @@ -37,6 +37,7 @@ README tlhIngan Hol README in Korean README بالعربية + Türkçe README

diff --git a/README_CN.md b/README_CN.md index 8224001f1a..ebbbe25902 100644 --- a/README_CN.md +++ b/README_CN.md @@ -36,6 +36,7 @@ 上个月的提交次数 上个月的提交次数 上个月的提交次数 + Türkçe README
diff --git a/README_ES.md b/README_ES.md index 84c06a2503..52b78da47d 100644 --- a/README_ES.md +++ b/README_ES.md @@ -36,6 +36,7 @@ Actividad de Commits el último mes Actividad de Commits el último mes Actividad de Commits el último mes + Türkçe README

# diff --git a/README_FR.md b/README_FR.md index 768c9390d8..17a0881284 100644 --- a/README_FR.md +++ b/README_FR.md @@ -36,6 +36,7 @@ Commits le mois dernier Commits le mois dernier Commits le mois dernier + Türkçe README

# diff --git a/README_JA.md b/README_JA.md index f4cccd5271..5828379a74 100644 --- a/README_JA.md +++ b/README_JA.md @@ -36,6 +36,7 @@ 先月のコミット 先月のコミット 先月のコミット + Türkçe README

# diff --git a/README_KL.md b/README_KL.md index 6a15f39bc6..64d2d24858 100644 --- a/README_KL.md +++ b/README_KL.md @@ -36,6 +36,7 @@ Commits last month Commits last month Commits last month + Türkçe README

# diff --git a/README_KR.md b/README_KR.md index bb15fac8ef..2d7db3df4c 100644 --- a/README_KR.md +++ b/README_KR.md @@ -36,6 +36,7 @@ README en Français README tlhIngan Hol 한국어 README + Türkçe README

diff --git a/README_TR.md b/README_TR.md new file mode 100644 index 0000000000..2ae7d440a8 --- /dev/null +++ b/README_TR.md @@ -0,0 +1,253 @@ +![cover-v5-optimized](https://github.com/langgenius/dify/assets/13230914/f9e19af5-61ba-4119-b926-d10c4c06ebab) + +

+ Dify Bulut · + Kendi Sunucunuzda Barındırma · + Dokümantasyon · + Kurumsal Sorgu +

+ +

+ + Statik Rozet + + Statik Rozet + + Discord'da sohbet et + + Twitter'da takip et + + Docker Çekmeleri + + Geçen ay yapılan commitler + + Kapatılan sorunlar + + Tartışma gönderileri +

+ +

+ README in English + 简体中文版自述文件 + 日本語のREADME + README en Español + README en Français + README tlhIngan Hol + README in Korean + README بالعربية + Türkçe README +

+ + +Dify, açık kaynaklı bir LLM uygulama geliştirme platformudur. Sezgisel arayüzü, AI iş akışı, RAG pipeline'ı, ajan yetenekleri, model yönetimi, gözlemlenebilirlik özellikleri ve daha fazlasını birleştirerek, prototipten üretime hızlıca geçmenizi sağlar. İşte temel özelliklerin bir listesi: +

+ +**1. Workflow**: +Görsel bir arayüz üzerinde güçlü AI iş akışları oluşturun ve test edin, aşağıdaki tüm özellikleri ve daha fazlasını kullanarak. + + + https://github.com/langgenius/dify/assets/13230914/356df23e-1604-483d-80a6-9517ece318aa + + + +**2. Kapsamlı model desteği**: +Çok sayıda çıkarım sağlayıcısı ve kendi kendine barındırılan çözümlerden yüzlerce özel / açık kaynaklı LLM ile sorunsuz entegrasyon sağlar. GPT, Mistral, Llama3 ve OpenAI API uyumlu tüm modelleri kapsar. Desteklenen model sağlayıcılarının tam listesine [buradan](https://docs.dify.ai/getting-started/readme/model-providers) ulaşabilirsiniz. + +![providers-v5](https://github.com/langgenius/dify/assets/13230914/5a17bdbe-097a-4100-8363-40255b70f6e3) + + +Özür dilerim, haklısınız. Daha anlamlı ve akıcı bir çeviri yapmaya çalışayım. İşte güncellenmiş çeviri: + +**3. Prompt IDE**: + Komut istemlerini oluşturmak, model performansını karşılaştırmak ve sohbet tabanlı uygulamalara metin-konuşma gibi ek özellikler eklemek için kullanıcı dostu bir arayüz. + +**4. RAG Pipeline**: + Belge alımından bilgi çekmeye kadar geniş kapsamlı RAG yetenekleri. PDF'ler, PPT'ler ve diğer yaygın belge formatlarından metin çıkarma için hazır destek sunar. + +**5. Ajan yetenekleri**: + LLM Fonksiyon Çağırma veya ReAct'a dayalı ajanlar tanımlayabilir ve bu ajanlara önceden hazırlanmış veya özel araçlar ekleyebilirsiniz. Dify, AI ajanları için Google Arama, DALL·E, Stable Diffusion ve WolframAlpha gibi 50'den fazla yerleşik araç sağlar. + +**6. LLMOps**: + Uygulama loglarını ve performans metriklerini zaman içinde izleme ve analiz etme imkanı. Üretim ortamından elde edilen verilere ve kullanıcı geri bildirimlerine dayanarak, prompt'ları, veri setlerini ve modelleri sürekli olarak optimize edebilirsiniz. Bu sayede, AI uygulamanızın performansını ve doğruluğunu sürekli olarak artırabilirsiniz. + +**7. Hizmet Olarak Backend**: + Dify'ın tüm özellikleri ilgili API'lerle birlikte gelir, böylece Dify'ı kendi iş mantığınıza kolayca entegre edebilirsiniz. + + +## Özellik karşılaştırması + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ÖzellikDify.AILangChainFlowiseOpenAI Assistants API
Programlama YaklaşımıAPI + Uygulama odaklıPython KoduUygulama odaklıAPI odaklı
Desteklenen LLM'lerZengin ÇeşitlilikZengin ÇeşitlilikZengin ÇeşitlilikYalnızca OpenAI
RAG Motoru
Ajan
İş Akışı
Gözlemlenebilirlik
Kurumsal Özellikler (SSO/Erişim kontrolü)
Yerel Dağıtım
+ +## Dify'ı Kullanma + +- **Cloud
** +İşte verdiğiniz metnin Türkçe çevirisi, kod bloğu içinde: +- +Herkesin sıfır kurulumla denemesi için bir [Dify Cloud](https://dify.ai) hizmeti sunuyoruz. Bu hizmet, kendi kendine dağıtılan versiyonun tüm yeteneklerini sağlar ve sandbox planında 200 ücretsiz GPT-4 çağrısı içerir. + +- **Dify Topluluk Sürümünü Kendi Sunucunuzda Barındırma
** +Bu [başlangıç kılavuzu](#quick-start) ile Dify'ı kendi ortamınızda hızlıca çalıştırın. +Daha fazla referans ve detaylı talimatlar için [dokümantasyonumuzu](https://docs.dify.ai) kullanın. + +- **Kurumlar / organizasyonlar için Dify
** +Ek kurumsal odaklı özellikler sunuyoruz. Kurumsal ihtiyaçları görüşmek için [bizimle bir toplantı planlayın](https://cal.com/guchenhe/30min) veya [bize bir e-posta gönderin](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry).
+ > AWS kullanan startuplar ve küçük işletmeler için, [AWS Marketplace'deki Dify Premium'a](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) göz atın ve tek tıklamayla kendi AWS VPC'nize dağıtın. Bu, özel logo ve marka ile uygulamalar oluşturma seçeneğine sahip uygun fiyatlı bir AMI teklifdir. + +## Güncel Kalma + +GitHub'da Dify'a yıldız verin ve yeni sürümlerden anında haberdar olun. + +![bizi-yıldızlayın](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) + + + +## Hızlı başlangıç +> Dify'ı kurmadan önce, makinenizin aşağıdaki minimum sistem gereksinimlerini karşıladığından emin olun: +> +>- CPU >= 2 Çekirdek +>- RAM >= 4GB + +
+İşte verdiğiniz metnin Türkçe çevirisi, kod bloğu içinde: + +Dify sunucusunu başlatmanın en kolay yolu, [docker-compose.yml](docker/docker-compose.yaml) dosyamızı çalıştırmaktır. Kurulum komutunu çalıştırmadan önce, makinenizde [Docker](https://docs.docker.com/get-docker/) ve [Docker Compose](https://docs.docker.com/compose/install/)'un kurulu olduğundan emin olun: + +```bash +cd docker +cp .env.example .env +docker compose up -d +``` + +Çalıştırdıktan sonra, tarayıcınızda [http://localhost/install](http://localhost/install) adresinden Dify kontrol paneline erişebilir ve başlangıç ayarları sürecini başlatabilirsiniz. + +> Eğer Dify'a katkıda bulunmak veya ek geliştirmeler yapmak isterseniz, [kaynak koddan dağıtım kılavuzumuza](https://docs.dify.ai/getting-started/install-self-hosted/local-source-code) başvurun. + +## Sonraki adımlar + +Yapılandırmayı özelleştirmeniz gerekiyorsa, lütfen [.env.example](docker/.env.example) dosyamızdaki yorumlara bakın ve `.env` dosyanızdaki ilgili değerleri güncelleyin. Ayrıca, spesifik dağıtım ortamınıza ve gereksinimlerinize bağlı olarak `docker-compose.yaml` dosyasının kendisinde de, imaj sürümlerini, port eşlemelerini veya hacim bağlantılarını değiştirmek gibi ayarlamalar yapmanız gerekebilir. Herhangi bir değişiklik yaptıktan sonra, lütfen `docker-compose up -d` komutunu tekrar çalıştırın. Kullanılabilir tüm ortam değişkenlerinin tam listesini [burada](https://docs.dify.ai/getting-started/install-self-hosted/environments) bulabilirsiniz. + +Yüksek kullanılabilirliğe sahip bir kurulum yapılandırmak isterseniz, Dify'ın Kubernetes üzerine dağıtılmasına olanak tanıyan topluluk katkılı [Helm Charts](https://helm.sh/) ve YAML dosyaları mevcuttur. + +- [@LeoQuote tarafından Helm Chart](https://github.com/douban/charts/tree/master/charts/dify) +- [@BorisPolonsky tarafından Helm Chart](https://github.com/BorisPolonsky/dify-helm) +- [@Winson-030 tarafından YAML dosyası](https://github.com/Winson-030/dify-kubernetes) + +#### Dağıtım için Terraform Kullanımı + +##### Azure Global +[Terraform](https://www.terraform.io/) kullanarak Dify'ı Azure'a tek tıklamayla dağıtın. +- [@nikawang tarafından Azure Terraform](https://github.com/nikawang/dify-azure-terraform) + +## Katkıda Bulunma + +Kod katkısında bulunmak isteyenler için [Katkı Kılavuzumuza](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) bakabilirsiniz. +Aynı zamanda, lütfen Dify'ı sosyal medyada, etkinliklerde ve konferanslarda paylaşarak desteklemeyi düşünün. + +> Dify'ı Mandarin veya İngilizce dışındaki dillere çevirmemize yardımcı olacak katkıda bulunanlara ihtiyacımız var. Yardımcı olmakla ilgileniyorsanız, lütfen daha fazla bilgi için [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) dosyasına bakın ve [Discord Topluluk Sunucumuzdaki](https://discord.gg/8Tpq4AcN9c) `global-users` kanalında bize bir yorum bırakın. + +**Katkıda Bulunanlar** + + + + + +## Topluluk & iletişim + +* [Github Tartışmaları](https://github.com/langgenius/dify/discussions). En uygun: geri bildirim paylaşmak ve soru sormak için. +* [GitHub Sorunları](https://github.com/langgenius/dify/issues). En uygun: Dify.AI kullanırken karşılaştığınız hatalar ve özellik önerileri için. [Katkı Kılavuzumuza](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) bakın. +* [Discord](https://discord.gg/FngNHpbcY7). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için. +* [Twitter](https://twitter.com/dify_ai). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için. + +Veya doğrudan bir ekip üyesiyle toplantı planlayın: + + + + + + + + + + + + + + +
İletişim NoktasıAmaç
Git-Hub-README-Button-3xİş sorgulamaları & ürün geri bildirimleri
Git-Hub-README-Button-2xKatkılar, sorunlar & özellik istekleri
+ +## Star history + +[![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) + +## Güvenlik açıklaması + +Gizliliğinizi korumak için, lütfen güvenlik sorunlarını GitHub'da paylaşmaktan kaçının. Bunun yerine, sorularınızı security@dify.ai adresine gönderin ve size daha detaylı bir cevap vereceğiz. + +## Lisans + +Bu depo, temel olarak Apache 2.0 lisansı ve birkaç ek kısıtlama içeren [Dify Açık Kaynak Lisansı](LICENSE) altında kullanıma sunulmuştur. diff --git a/api/constants/languages.py b/api/constants/languages.py index efc668d4ee..023d2f18a6 100644 --- a/api/constants/languages.py +++ b/api/constants/languages.py @@ -15,6 +15,7 @@ language_timezone_mapping = { 'ro-RO': 'Europe/Bucharest', 'pl-PL': 'Europe/Warsaw', 'hi-IN': 'Asia/Kolkata', + 'tr-TR': 'Europe/Istanbul', } languages = list(language_timezone_mapping.keys()) diff --git a/web/i18n/language.ts b/web/i18n/language.ts index 5b489ee8ae..3320dc8ff1 100644 --- a/web/i18n/language.ts +++ b/web/i18n/language.ts @@ -74,6 +74,8 @@ export const NOTICE_I18N = { 'Наша система буде недоступна з 19:00 до 24:00 UTC 28 серпня для оновлення. Якщо у вас виникнуть запитання, будь ласка, зв’яжіться з нашою службою підтримки (support@dify.ai). Дякуємо за терпіння.', vi_VN: 'Hệ thống của chúng tôi sẽ ngừng hoạt động từ 19:00 đến 24:00 UTC vào ngày 28 tháng 8 để nâng cấp. Nếu có thắc mắc, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi (support@dify.ai). Chúng tôi đánh giá cao sự kiên nhẫn của bạn.', + tr_TR: + 'Sistemimiz, 28 Ağustos\'ta 19:00 ile 24:00 UTC saatleri arasında güncelleme nedeniyle kullanılamayacaktır. Sorularınız için lütfen destek ekibimizle iletişime geçin (support@dify.ai). Sabrınız için teşekkür ederiz.', }, href: '#', } diff --git a/web/i18n/languages.json b/web/i18n/languages.json index d2fdb33cf2..c2aa7af717 100644 --- a/web/i18n/languages.json +++ b/web/i18n/languages.json @@ -125,6 +125,13 @@ "prompt_name": "Hindi", "example": "नमस्ते, Dify!", "supported": "true" + }, + { + "value": "tr-TR", + "name": "Türkçe", + "prompt_name": "Türkçe", + "example": "Selam!", + "supported": "true" } ] } diff --git a/web/i18n/tr-TR/app-annotation.ts b/web/i18n/tr-TR/app-annotation.ts new file mode 100644 index 0000000000..bcd6db1fb2 --- /dev/null +++ b/web/i18n/tr-TR/app-annotation.ts @@ -0,0 +1,87 @@ +const translation = { + title: 'Ek Açıklamalar', + name: 'Ek Açıklama Yanıtı', + editBy: '{{author}} tarafından düzenlendi', + noData: { + title: 'Ek açıklama yok', + description: 'Uygulama hata ayıklaması sırasında ek açıklamaları düzenleyebilir veya yüksek kaliteli bir yanıt için burada toplu olarak ek açıklamaları içe aktarabilirsiniz.', + }, + table: { + header: { + question: 'soru', + answer: 'cevap', + createdAt: 'oluşturulma tarihi', + hits: 'vuruşlar', + actions: 'aksiyonlar', + addAnnotation: 'Ek Açıklama Ekle', + bulkImport: 'Toplu İçe Aktarma', + bulkExport: 'Toplu Dışa Aktarma', + clearAll: 'Tüm Ek Açıklamaları Temizle', + }, + }, + editModal: { + title: 'Ek Açıklama Yanıtını Düzenle', + queryName: 'Kullanıcı Sorgusu', + answerName: 'Storyteller Bot', + yourAnswer: 'Senin Cevabın', + answerPlaceholder: 'Cevabınızı buraya yazın', + yourQuery: 'Senin Sorgun', + queryPlaceholder: 'Sorgunuzu buraya yazın', + removeThisCache: 'Bu Ek Açıklamayı Kaldır', + createdAt: 'Oluşturulma Tarihi', + }, + addModal: { + title: 'Ek Açıklama Yantı Ekle', + queryName: 'Soru', + answerName: 'Cevap', + answerPlaceholder: 'Cevabı buraya yazın', + queryPlaceholder: 'Sorguyu buraya yazın', + createNext: 'Başka bir ek açıklamalı yanıt ekle', + }, + batchModal: { + title: 'Toplu İçe Aktarma', + csvUploadTitle: 'CSV dosyanızı buraya sürükleyip bırakın veya ', + browse: 'gözatın', + tip: 'CSV dosyası aşağıdaki yapıya uygun olmalıdır:', + question: 'soru', + answer: 'cevap', + contentTitle: 'içerik parçası', + content: 'içerik', + template: 'Şablonu buradan indir', + cancel: 'İptal', + run: 'Toplu İşlemi Çalıştır', + runError: 'Toplu işlem başarısız oldu', + processing: 'Toplu işlemde', + completed: 'İçe aktarma tamamlandı', + error: 'İçe Aktarma Hatası', + ok: 'Tamam', + }, + errorMessage: { + answerRequired: 'Cevap gerekli', + queryRequired: 'Soru gerekli', + }, + viewModal: { + annotatedResponse: 'Ek Açıklama Yanıtı', + hitHistory: 'Vuruş Geçmişi', + hit: 'Vuruş', + hits: 'Vuruşlar', + noHitHistory: 'Vuruş geçmişi yok', + }, + hitHistoryTable: { + query: 'Sorgu', + match: 'Eşleşme', + response: 'Yanıt', + source: 'Kaynak', + score: 'Puan', + time: 'Zaman', + }, + initSetup: { + title: 'Ek Açıklama Yanıtı İlk Kurulum', + configTitle: 'Ek Açıklama Yanıtı Ayarı', + confirmBtn: 'Kaydet ve Etkinleştir', + configConfirmBtn: 'Kaydet', + }, + embeddingModelSwitchTip: 'Ek açıklama metin vektörleştirme modeli, model değiştirmek yeniden yerleştirilecek ve ek maliyetlere yol açacaktır.', +} + +export default translation diff --git a/web/i18n/tr-TR/app-api.ts b/web/i18n/tr-TR/app-api.ts new file mode 100644 index 0000000000..be6466f001 --- /dev/null +++ b/web/i18n/tr-TR/app-api.ts @@ -0,0 +1,83 @@ +const translation = { + apiServer: 'API Sunucusu', + apiKey: 'API Anahtarı', + status: 'Durum', + disabled: 'Devre Dışı', + ok: 'Hizmette', + copy: 'Kopyala', + copied: 'Kopyalandı', + play: 'Oynat', + pause: 'Duraklat', + playing: 'Oynatılıyor', + loading: 'Yükleniyor', + merMaind: { + rerender: 'Yeniden İşleme', + }, + never: 'Asla', + apiKeyModal: { + apiSecretKey: 'API Gizli Anahtar', + apiSecretKeyTips: 'API suiistimalini önlemek için, API Anahtarınızı koruyunuz. Ön uç kodda düz metin olarak kullanmaktan kaçının. :)', + createNewSecretKey: 'Yeni Gizli Anahtar Oluştur', + secretKey: 'Gizli Anahtar', + created: 'OLUŞTURULDU', + lastUsed: 'SON KULLANIM', + generateTips: 'Bu anahtarı güvenli ve erişilebilir bir yerde saklayın.', + }, + actionMsg: { + deleteConfirmTitle: 'Bu gizli anahtarı silmek istiyor musunuz?', + deleteConfirmTips: 'Bu işlem geri alınamaz.', + ok: 'Tamam', + }, + completionMode: { + title: 'Completion Uygulama API', + info: 'Makale, özet ve çeviri gibi yüksek kaliteli metin üretimi için, completion-messages API\'sini kullanıcı girişi ile birlikte kullanın. Metin üretimi, Dify Prompt Engineering\'de ayarlanan model parametrelerine ve prompt şablonlarına dayanır.', + createCompletionApi: 'Completion Mesajı Oluştur', + createCompletionApiTip: 'Soru-cevap modunu desteklemek için bir Completion Mesajı oluşturun.', + inputsTips: '(İsteğe bağlı) Prompt Eng\'deki değişkenlere karşılık gelen kullanıcı giriş alanlarını anahtar-değer çiftleri olarak sağlayın. Anahtar, değişken adıdır, Değer ise parametre değeridir. Alan türü Select ise, gönderilen Değer önceden ayarlanmış seçeneklerden biri olmalıdır.', + queryTips: 'Kullanıcı giriş metni içeriği.', + blocking: 'Bloke etme tipi, yürütmenin tamamlanmasını bekleyip sonuçları döndürme. (Süreç uzun sürerse istekler kesilebilir)', + streaming: 'Streaming döndürmeleri. SSE (Sunucu Tarafından Gönderilen Etkinlikler) tabanlı streaming döndürme uygulaması.', + messageFeedbackApi: 'Mesaj geri bildirimi (beğeni)', + messageFeedbackApiTip: 'Son kullanıcılar adına beğeni veya beğenmeme ile alınan mesajları değerlendirin. Bu veriler, Günlükler ve Ek Açıklamalar sayfasında görünür ve gelecekteki model ince ayarları için kullanılır.', + messageIDTip: 'Mesaj Kimliği', + ratingTip: 'beğeni veya beğenmeme, null geri almaktır', + parametersApi: 'Uygulama parametre bilgilerini al', + parametersApiTip: 'Değişken adları, alan adları, türleri ve varsayılan değerler dahil olmak üzere yapılandırılmış Giriş parametrelerini alın. Genellikle bu alanları bir formda görüntülemek veya istemci yüklendikten sonra varsayılan değerleri doldurmak için kullanılır.', + }, + chatMode: { + title: 'Chat Uygulama API', + info: 'Soru-Cevap formatını kullanan çok yönlü sohbet uygulamaları için, diyalogu başlatmak üzere chat-messages API\'sini çağırın. conversation_id\'yi ileterek devam eden konuşmaları sürdürün. Yanıt parametreleri ve şablonları, Dify Prompt Engineering ayarlarına bağlıdır.', + createChatApi: 'Sohbet mesajı oluştur', + createChatApiTip: 'Yeni bir konuşma mesajı oluşturun veya mevcut diyaloğu devam ettirin.', + inputsTips: '(İsteğe bağlı) Prompt Eng\'deki değişkenlere karşılık gelen kullanıcı giriş alanlarını anahtar-değer çiftleri olarak sağlayın. Anahtar, değişken adıdır, Değer ise parametre değeridir. Alan türü Select ise, gönderilen Değer önceden ayarlanmış seçeneklerden biri olmalıdır.', + queryTips: 'Kullanıcı girişi/soru içeriği', + blocking: 'Bloke etme tipi, yürütmenin tamamlanmasını bekleyip sonuçları döndürme. (Süreç uzun sürerse istekler kesilebilir)', + streaming: 'Streaming döndürmeleri. SSE (Sunucu Tarafından Gönderilen Etkinlikler) tabanlı streaming döndürme uygulaması.', + conversationIdTip: '(İsteğe bağlı) Konuşma ID: ilk konuşma için boş bırakın; diyaloğu devam ettirmek için context\'ten conversation_id\'yi iletin.', + messageFeedbackApi: 'Mesaj son kullanıcı geri bildirimi, beğeni', + messageFeedbackApiTip: 'Son kullanıcılar adına beğeni veya beğenmeme ile alınan mesajları değerlendirin. Bu veriler, Günlükler ve Ek Açıklamalar sayfasında görünür ve gelecekteki model ince ayarları için kullanılır.', + messageIDTip: 'Mesaj Kimliği', + ratingTip: 'beğeni veya beğenmeme, null geri almaktır', + chatMsgHistoryApi: 'Sohbet geçmişi mesajı al', + chatMsgHistoryApiTip: 'İlk sayfa en son `limit` barını döndürür ve bu ters sıradadır.', + chatMsgHistoryConversationIdTip: 'Konuşma ID', + chatMsgHistoryFirstId: 'Mevcut sayfadaki ilk sohbet kaydının ID\'si. Varsayılan yok.', + chatMsgHistoryLimit: 'Bir istekte kaç sohbet döndürüleceği', + conversationsListApi: 'Konuşma listesini al', + conversationsListApiTip: 'Mevcut kullanıcının oturum listesini alır. Varsayılan olarak, son 20 oturum döndürülür.', + conversationsListFirstIdTip: 'Mevcut sayfadaki son kaydın ID\'si, varsayılan yok.', + conversationsListLimitTip: 'Bir istekte kaç sohbet döndürüleceği', + conversationRenamingApi: 'Konuşma yeniden adlandırma', + conversationRenamingApiTip: 'Konuşmaları yeniden adlandırın; ad, çoklu oturum istemci arayüzlerinde görüntülenir.', + conversationRenamingNameTip: 'Yeni isim', + parametersApi: 'Uygulama parametre bilgilerini al', + parametersApiTip: 'Değişken adları, alan adları, türleri ve varsayılan değerler dahil olmak üzere yapılandırılmış Giriş parametrelerini alın. Genellikle bu alanları bir formda görüntülemek veya istemci yüklendikten sonra varsayılan değerleri doldurmak için kullanılır.', + }, + develop: { + requestBody: 'Request Body', + pathParams: 'Path Params', + query: 'Query', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/app-debug.ts b/web/i18n/tr-TR/app-debug.ts new file mode 100644 index 0000000000..889f48c78e --- /dev/null +++ b/web/i18n/tr-TR/app-debug.ts @@ -0,0 +1,460 @@ +const translation = { + pageTitle: { + line1: 'PROMPT', + line2: 'Engineering', + }, + orchestrate: 'Orchestrate', + promptMode: { + simple: 'Tüm PROMPT\'u düzenlemek için Uzman Moduna geçin', + advanced: 'Uzman Modu', + switchBack: 'Geri Dön', + advancedWarning: { + title: 'Uzman Moduna geçtiniz ve PROMPT\'u değiştirdiğinizde, temel moda geri DÖNEMEZSİNİZ.', + description: 'Uzman Modunda, tüm PROMPT\'u düzenleyebilirsiniz.', + learnMore: 'Daha Fazla Bilgi', + ok: 'Tamam', + }, + operation: { + addMessage: 'Mesaj Ekle', + }, + contextMissing: 'Bağlam bileşeni eksik, promptun etkinliği iyi olmayabilir.', + }, + operation: { + applyConfig: 'Yayınla', + resetConfig: 'Sıfırla', + debugConfig: 'Hata Ayıkla', + addFeature: 'Özellik Ekle', + automatic: 'Oluştur', + stopResponding: 'Yanıtlamayı Durdur', + agree: 'beğeni', + disagree: 'beğenmeme', + cancelAgree: 'Beğeniyi İptal Et', + cancelDisagree: 'Beğenmeme İptal Et', + userAction: 'Kullanıcı', + }, + notSetAPIKey: { + title: 'LLM sağlayıcı anahtarı ayarlanmadı', + trailFinished: 'Deneme süresi sona erdi', + description: 'LLM sağlayıcı anahtarı ayarlanmadı, hata ayıklamadan önce ayarlanması gerekiyor.', + settingBtn: 'Ayarlar\'a git', + }, + trailUseGPT4Info: { + title: 'Şu anda gpt-4 desteklenmiyor', + description: 'Gpt-4 kullanmak için, lütfen API Anahtarını ayarlayın.', + }, + feature: { + groupChat: { + title: 'Sohbet Geliştirme', + description: 'Uygulamalar için ön görüşme ayarları eklemek kullanıcı deneyimini artırabilir.', + }, + groupExperience: { + title: 'Deneyim Geliştirme', + }, + conversationOpener: { + title: 'Konuşma Başlatıcı', + description: 'Bir sohbet uygulamasında, yapay zekanın kullanıcıya aktif olarak söylediği ilk cümle genellikle bir karşılama olarak kullanılır.', + }, + suggestedQuestionsAfterAnswer: { + title: 'Takip Soruları', + description: 'Sonraki soru önerilerini ayarlamak, kullanıcılara daha iyi bir sohbet deneyimi sunabilir.', + resDes: 'Kullanıcı için 3 önerilen sonraki soru.', + tryToAsk: 'Sormayı dene', + }, + moreLikeThis: { + title: 'Bunun gibi daha fazlası', + description: 'Birden fazla metni bir kerede üretin, ardından düzenleyin ve üretmeye devam edin', + generateNumTip: 'Her üretim seferinde üretilen metin sayısı', + tip: 'Bu özelliği kullanmak ek token maliyetine yol açacaktır', + }, + speechToText: { + title: 'Sesten Metne', + description: 'Etkinleştirildiğinde, sesli giriş kullanabilirsiniz.', + resDes: 'Sesli giriş etkinleştirildi', + }, + textToSpeech: { + title: 'Metinden Sese', + description: 'Etkinleştirildiğinde, metin sese dönüştürülebilir.', + resDes: 'Metinden Ses dosyasına dönüştürme etkinleştirildi', + }, + citation: { + title: 'Alıntılar ve Atıflar', + description: 'Etkinleştirildiğinde, oluşturulan içeriğin kaynak belgesi ve atıfta bulunulan bölümü gösterilir.', + resDes: 'Alıntılar ve Atıflar etkinleştirildi', + }, + annotation: { + title: 'Ek Açıklama Yanıtı', + description: 'Benzer kullanıcı sorularıyla öncelikli eşleşme için, yüksek kaliteli yanıtları manuel olarak önbelleğe ekleyebilirsiniz.', + resDes: 'Ek Açıklama Yanıtı etkinleştirildi', + scoreThreshold: { + title: 'Skor Eşiği', + description: 'Ek açıklama yanıtı için benzerlik eşiğini ayarlamak için kullanılır.', + easyMatch: 'Kolay Eşleşme', + accurateMatch: 'Doğru Eşleşme', + }, + matchVariable: { + title: 'Eşleşme Değişkeni', + choosePlaceholder: 'Eşleşme değişkenini seçin', + }, + cacheManagement: 'Ek Açıklamalar', + cached: 'Ek Açıklamalı', + remove: 'Kaldır', + removeConfirm: 'Bu ek açıklamayı silmek istiyor musunuz?', + add: 'Ek açıklama ekle', + edit: 'Ek açıklamayı düzenle', + }, + dataSet: { + title: 'Bağlam', + noData: 'Bağlam olarak Bilgi\'yi içe aktarabilirsiniz', + words: 'Kelimeler', + textBlocks: 'Metin Blokları', + selectTitle: 'Referans Bilgi\'yi seçin', + selected: 'Bilgi seçildi', + noDataSet: 'Bilgi bulunamadı', + toCreate: 'Oluşturmaya git', + notSupportSelectMulti: 'Şu anda sadece bir Bilgi destekleniyor', + queryVariable: { + title: 'Sorgu değişkeni', + tip: 'Bu değişken, bağlam geri alımı için sorgu girişi olarak kullanılacak ve bu değişkenin girdisiyle ilgili bağlam bilgisi elde edilecektir.', + choosePlaceholder: 'Sorgu değişkenini seçin', + noVar: 'Değişken yok', + noVarTip: 'Lütfen Değişkenler bölümünde bir değişken oluşturun', + unableToQueryDataSet: 'Bilgi sorgulanamıyor', + unableToQueryDataSetTip: 'Bilgi başarılı bir şekilde sorgulanamıyor, lütfen bağlam bölümünde bir bağlam sorgu değişkeni seçin.', + ok: 'Tamam', + contextVarNotEmpty: 'Bağlam sorgu değişkeni boş olamaz', + deleteContextVarTitle: 'Değişken "{{varName}}" silinsin mi?', + deleteContextVarTip: 'Bu değişken bağlam sorgu değişkeni olarak ayarlanmış, kaldırılması Bilgi\'nin normal kullanımını etkileyecektir. Yine de silmek istiyorsanız, lütfen bağlam bölümünde yeniden seçin.', + }, + }, + tools: { + title: 'Araçlar', + tips: 'Araçlar, kullanıcı girişi veya değişkenleri istek parametreleri olarak alarak dış verileri bağlam olarak sorgulamak için standart bir API çağrı yöntemi sağlar.', + toolsInUse: '{{count}} araç kullanımda', + modal: { + title: 'Araç', + toolType: { + title: 'Araç Türü', + placeholder: 'Lütfen araç türünü seçin', + }, + name: { + title: 'İsim', + placeholder: 'Lütfen ismi girin', + }, + variableName: { + title: 'Değişken İsmi', + placeholder: 'Lütfen değişken ismini girin', + }, + }, + }, + conversationHistory: { + title: 'Konuşma Geçmişi', + description: 'Konuşma rolleri için ön ek isimler ayarlayın', + tip: 'Konuşma Geçmişi etkin değil, lütfen promptun üst kısmında ekleyin.', + learnMore: 'Daha fazla bilgi', + editModal: { + title: 'Konuşma Rol İsimlerini Düzenle', + userPrefix: 'Kullanıcı ön eki', + assistantPrefix: 'Asistan ön eki', + }, + }, + toolbox: { + title: 'ARAÇLAR', + }, + moderation: { + title: 'İçerik Denetimi', + description: 'Denetim API\'sini kullanarak veya bir hassas kelime listesi oluşturarak model çıktısını güvence altına alın.', + allEnabled: 'GİRİŞ/ÇIKIŞ İçeriği Etkin', + inputEnabled: 'GİRİŞ İçeriği Etkin', + outputEnabled: 'ÇIKIŞ İçeriği Etkin', + modal: { + title: 'İçerik denetim ayarları', + provider: { + title: 'Sağlayıcı', + openai: 'OpenAI Denetim', + openaiTip: { + prefix: 'OpenAI Denetim, Ayarlar sayfasında yapılandırılmış bir OpenAI API anahtarı gerektirir', + suffix: '.', + }, + keywords: 'Anahtar Kelimeler', + }, + keywords: { + tip: 'Her satırda bir tane, satır sonlarıyla ayrılmış. Satır başına en fazla 100 karakter.', + placeholder: 'Her satırda bir tane, satır sonlarıyla ayrılmış', + line: 'Satır', + }, + content: { + input: 'GİRİŞ İçeriğini Denetle', + output: 'ÇIKIŞ İçeriğini Denetle', + preset: 'Önceden Ayarlanmış Yanıtlar', + placeholder: 'Önceden ayarlanmış yanıt içeriği buraya', + condition: 'GİRİŞ ve ÇIKIŞ İçeriği denetimi en az birinde etkin', + fromApi: 'Önceden ayarlanmış yanıtlar API tarafından döndürülür', + errorMessage: 'Önceden ayarlanmış yanıtlar boş olamaz', + supportMarkdown: 'Markdown desteklenir', + }, + openaiNotConfig: { + before: 'OpenAI Denetim, Ayarlar sayfasında yapılandırılmış bir OpenAI API anahtarı gerektirir', + after: '', + }, + }, + }, + }, + generate: { + title: 'Prompt Oluşturucu', + description: 'Prompt Oluşturucu, yapılandırılan modeli kullanarak promptları daha iyi kalite ve yapı için optimize eder. Lütfen açık ve ayrıntılı talimatlar yazın.', + tryIt: 'Deneyin', + instruction: 'Talimatlar', + instructionPlaceHolder: 'Açık ve belirli talimatlar yazın.', + generate: 'Oluştur', + resTitle: 'Oluşturulmuş Prompt', + noDataLine1: 'Kullanım durumunuzu solda açıklayın,', + noDataLine2: 'orkestrasyon önizlemesi burada görünecek.', + apply: 'Uygula', + loading: 'Uygulama orkestrasyonu yapılıyor...', + overwriteTitle: 'Mevcut yapılandırmanın üzerine yazılsın mı?', + overwriteMessage: 'Bu promptu uygulamak mevcut yapılandırmanın üzerine yazacaktır.', + template: { + pythonDebugger: { + name: 'Python hata ayıklayıcı', + instruction: 'Talimatlarınıza göre kod üretebilen ve hata ayıklayabilen bir bot', + }, + translation: { + name: 'Çeviri', + instruction: 'Birden çok dili çevirebilen bir çevirmen', + }, + professionalAnalyst: { + name: 'Profesyonel analist', + instruction: 'Uzun raporlardan içgörüleri çıkarın, riskleri belirleyin ve temel bilgileri tek bir notta özetleyin', + }, + excelFormulaExpert: { + name: 'Excel formül uzmanı', + instruction: 'Kullanıcı talimatlarına dayalı olarak Excel formüllerini anlamaya, kullanmaya ve oluşturmaya yardımcı olan bir sohbet botu', + }, + travelPlanning: { + name: 'Seyahat planlama', + instruction: 'Seyahat Planlama Asistanı, kullanıcıların seyahatlerini zorluk çekmeden planlamalarına yardımcı olmak için tasarlanmış akıllı bir araçtır', + }, + SQLSorcerer: { + name: 'SQL büyücüsü', + instruction: 'Günlük dili SQL sorgularına dönüştürür', + }, + GitGud: { + name: 'Git güd', + instruction: 'Kullanıcı tarafından açıklanan sürüm kontrol eylemlerine dayalı uygun Git komutları oluşturur', + }, + meetingTakeaways: { + name: 'Toplantıdan alınanlar', + instruction: 'Toplantıları anahtar konular, önemli çıkarımlar ve eylem maddeleri dahil olmak üzere özlü özetlere ayırır', + }, + writingsPolisher: { + name: 'Yazma cilalayıcı', + instruction: 'Yazılarınızı geliştirmek için ileri düzeyde kopya düzenleme teknikleri kullanır', + }, + }, + }, + resetConfig: { + title: 'Sıfırlamayı onaylıyor musunuz?', + message: + 'Sıfırlama, son yayımlanan yapılandırmaya geri yükleyerek değişiklikleri atar.', + }, + errorMessage: { + nameOfKeyRequired: 'Anahtar adı: {{key}} gerekli', + valueOfVarRequired: '{{key}} değeri boş olamaz', + queryRequired: 'İstek metni gereklidir.', + waitForResponse: + 'Önceki mesajın yanıtını tamamlamasını bekleyin.', + waitForBatchResponse: + 'Toplu görevin yanıtını tamamlamasını bekleyin.', + notSelectModel: 'Lütfen bir model seçin', + waitForImgUpload: 'Lütfen görüntünün yüklenmesini bekleyin', + }, + chatSubTitle: 'Talimatlar', + completionSubTitle: 'Ön Prompt', + promptTip: + 'Promptlar, yapay zekayı talimatlar ve kısıtlamalarla yönlendirir. {{input}} gibi değişkenler ekleyin. Bu prompt, kullanıcılara görünmeyecek.', + formattingChangedTitle: 'Biçimlendirme değiştirildi', + formattingChangedText: + 'Biçimlendirmeyi değiştirmek hata ayıklama alanını sıfırlayacaktır, emin misiniz?', + variableTitle: 'Değişkenler', + variableTip: + 'Kullanıcılar değişkenleri bir formda doldurur ve otomatik olarak prompt içinde değişkenler değiştirilir.', + notSetVar: 'Değişkenler, kullanıcıların form doldururken prompt kelimelerini veya açılış ifadelerini getirmesine izin verir. Prompt kelimelerine "{{input}}" yazmayı deneyebilirsiniz.', + autoAddVar: 'Ön promptta referans verilen tanımlanmamış değişkenler, kullanıcı giriş formunda eklemek istiyor musunuz?', + variableTable: { + key: 'Değişken Anahtarı', + name: 'Kullanıcı Giriş Alanı Adı', + optional: 'İsteğe Bağlı', + type: 'Giriş Tipi', + action: 'Aksiyonlar', + typeString: 'Metin', + typeSelect: 'Seçim', + }, + varKeyError: { + canNoBeEmpty: 'Değişken anahtarı boş olamaz', + tooLong: 'Değişken anahtarı: {{key}} çok uzun. 30 karakterden uzun olamaz', + notValid: 'Değişken anahtarı: {{key}} geçersizdir. Sadece harfler, rakamlar ve altçizgiler içerebilir', + notStartWithNumber: 'Değişken anahtarı: {{key}} bir rakamla başlamamalıdır', + keyAlreadyExists: 'Değişken anahtarı: {{key}} zaten mevcut', + }, + otherError: { + promptNoBeEmpty: 'Prompt boş olamaz', + historyNoBeEmpty: 'Konuşma geçmişi prompt\'ta ayarlanmalıdır', + queryNoBeEmpty: 'Sorgu prompt\'ta ayarlanmalıdır', + }, + variableConig: { + addModalTitle: 'Giriş Alanı Ekle', + editModalTitle: 'Giriş Alanı Düzenle', + description: 'Değişken ayarı {{varName}}', + fieldType: 'Alan türü', + string: 'Kısa Metin', + textInput: 'Kısa Metin', + paragraph: 'Paragraf', + select: 'Seçim', + number: 'Numara', + notSet: 'Ayarlanmamış, ön promptta {{input}} yazmayı deneyin', + stringTitle: 'Form metin kutusu seçenekleri', + maxLength: 'En uzunluk', + options: 'Seçenekler', + addOption: 'Seçenek ekle', + apiBasedVar: 'API tabanlı Değişken', + varName: 'Değişken Adı', + labelName: 'Etiket Adı', + inputPlaceholder: 'Lütfen girin', + content: 'İçerik', + required: 'Gerekli', + errorMsg: { + varNameRequired: 'Değişken adı gereklidir', + labelNameRequired: 'Etiket adı gereklidir', + varNameCanBeRepeat: 'Değişken adı tekrar edemez', + atLeastOneOption: 'En az bir seçenek gereklidir', + optionRepeat: 'Yinelenen seçenekler var', + }, + }, + vision: { + name: 'Görüş', + description: 'Görüş etkinleştirildiğinde modelin görüntüleri almasını ve bunlarla ilgili soruları yanıtlamasını sağlar.', + settings: 'Ayarlar', + visionSettings: { + title: 'Görüş Ayarları', + resolution: 'Çözünürlük', + resolutionTooltip: 'Düşük çözünürlük, modelin görüntünün düşük çözünürlüklü 512 x 512 versiyonunu almasını sağlar ve görüntüyü 65 token bütçesiyle temsil eder. Bu, API\'nin daha hızlı yanıtlar dönmesini ve daha az giriş tokeni tüketmesini sağlar ve bu yüksek detay gerektirmeyen kullanım durumları için uygundur.\nYüksek çözünürlük, modelin önce düşük çözünürlüklü görüntüyü görmesini sağlar ve ardından giriş görüntüsünün boyutuna göre 512 piksel kareler olarak detaylı kırpma işlemleri gerçekleştirir. Her bir detaylı kırpma işlemi toplamda 129 token bütçesi kullanır.', + high: 'Yüksek', + low: 'Düşük', + uploadMethod: 'Yükleme Yöntemi', + both: 'Her İkisi', + localUpload: 'Yerel Yükleme', + url: 'URL', + uploadLimit: 'Yükleme Limiti', + }, + }, + voice: { + name: 'Konuşma', + defaultDisplay: 'Varsayılan Ses', + description: 'Metinden sese ses ayarları', + settings: 'Ayarlar', + voiceSettings: { + title: 'Ses Ayarları', + language: 'Dil', + resolutionTooltip: 'Metinden sese ses destek dili.', + voice: 'Ses', + autoPlay: 'Otomatik Oynatma', + autoPlayEnabled: 'Açık', + autoPlayDisabled: 'Kapalı', + }, + }, + openingStatement: { + title: 'Konuşma Başlatıcı', + add: 'Ekle', + writeOpener: 'Başlangıç mesajı yaz', + placeholder: 'Başlangıç mesajınızı buraya yazın, değişkenler kullanabilirsiniz, örneğin {{variable}} yazmayı deneyin.', + openingQuestion: 'Açılış Soruları', + noDataPlaceHolder: + 'Kullanıcı ile konuşmayı başlatmak, AI\'ın konuşma uygulamalarında onlarla daha yakın bir bağlantı kurmasına yardımcı olabilir.', + varTip: 'Değişkenler kullanabilirsiniz, örneğin {{variable}} yazmayı deneyin', + tooShort: 'Konuşma için açılış ifadeleri oluşturmak için en az 20 kelimelik başlangıç promptu gereklidir.', + notIncludeKey: 'Başlangıç promptu değişkeni içermiyor: {{key}}. Lütfen bunu başlangıç promptuna ekleyin.', + }, + modelConfig: { + model: 'Model', + setTone: 'Yanıtların tonunu ayarla', + title: 'Model ve Parametreler', + modeType: { + chat: 'Sohbet', + completion: 'Tamamlama', + }, + }, + inputs: { + title: 'Hata ayıklama ve Önizleme', + noPrompt: 'Ön prompt girişine bazı promptlar yazmayı deneyin', + userInputField: 'Kullanıcı Giriş Alanı', + noVar: 'Yeni bir oturum başlatıldığında prompt kelimesinde otomatik olarak değiştirilecek değişkenin değerini doldurun.', + chatVarTip: 'Yeni bir oturum başlatıldığında prompt kelimesinde otomatik olarak değiştirilecek değişkenin değerini doldurun', + completionVarTip: 'Her soru gönderildiğinde prompt kelimelerinde otomatik olarak değiştirilecek değişkenin değerini doldurun.', + previewTitle: 'Prompt önizleme', + queryTitle: 'Sorgu içeriği', + queryPlaceholder: 'Lütfen istek metnini girin.', + run: 'ÇALIŞTIR', + }, + result: 'Çıktı Metni', + datasetConfig: { + settingTitle: 'Geri Alım Ayarları', + knowledgeTip: 'Bilgi eklemek için “+” düğmesine tıklayın', + retrieveOneWay: { + title: 'N-to-1 geri alım', + description: 'Kullanıcı niyetine ve Bilgi tanımına dayanarak, Agent en iyi Bilgi\'yi sorgulamak için özerk bir şekilde seçer. Belirgin, sınırlı Bilgi bulunan uygulamalar için en iyisidir.', + }, + retrieveMultiWay: { + title: 'Çoklu yol geri alım', + description: 'Kullanıcı niyetine dayanarak, tüm Bilgilerde sorgular, çoklu kaynaklardan ilgili metni alır ve yeniden sıraladıktan sonra kullanıcı sorgusuyla eşleşen en iyi sonuçları seçer.', + }, + rerankModelRequired: 'Rerank modeli gereklidir', + params: 'Parametreler', + top_k: 'En İyi K', + top_kTip: 'Kullanıcı sorularına en çok benzeyen parçaları filtrelemek için kullanılır. Sistem ayrıca en iyi K değerini, seçilen modelin max_tokens\'a göre dinamik olarak ayarlar.', + score_threshold: 'Skor Eşiği', + score_thresholdTip: 'Parça filtreleme için benzerlik eşiğini ayarlamak için kullanılır.', + retrieveChangeTip: 'Dizin modunu ve geri alım modunu değiştirmek, bu Bilgi ile ilişkili uygulamaları etkileyebilir.', + }, + debugAsSingleModel: 'Tek Model Olarak Hata Ayıkla', + debugAsMultipleModel: 'Çoklu Model Olarak Hata Ayıkla', + duplicateModel: 'Çoğalt', + publishAs: 'Olarak Yayınla', + assistantType: { + name: 'Asistan Türü', + chatAssistant: { + name: 'Temel Asistan', + description: 'Büyük Dil Modeli kullanarak sohbet tabanlı bir asistan oluşturun', + }, + agentAssistant: { + name: 'Agent Asistanı', + description: 'Görevleri tamamlamak için araçları özerk bir şekilde seçebilen bir zeki Agent oluşturun', + }, + }, + agent: { + agentMode: 'Agent Modu', + agentModeDes: 'Agent için çıkarım modunu ayarlayın', + agentModeType: { + ReACT: 'ReAct', + functionCall: 'Fonksiyon Çağrısı', + }, + setting: { + name: 'Agent Ayarları', + description: 'Agent Asistanı ayarları, Agent modunu ve yerleşik promptlar gibi gelişmiş özellikleri ayarlamanıza olanak tanır. Sadece Agent türünde kullanılabilir.', + maximumIterations: { + name: 'Maksimum Yineleme', + description: 'Bir Agent asistanının gerçekleştirebileceği yineleme sayısını sınırlayın', + }, + }, + buildInPrompt: 'Yerleşik Prompt', + firstPrompt: 'İlk Prompt', + nextIteration: 'Sonraki Yineleme', + promptPlaceholder: 'Promptunuzu buraya yazın', + tools: { + name: 'Araçlar', + description: 'Araçlar kullanmak, internette arama yapmak veya bilimsel hesaplamalar yapmak gibi LLM yeteneklerini genişletebilir', + enabled: 'Etkinleştirildi', + }, + }, +} + +export default translation diff --git a/web/i18n/tr-TR/app-log.ts b/web/i18n/tr-TR/app-log.ts new file mode 100644 index 0000000000..b0dce68959 --- /dev/null +++ b/web/i18n/tr-TR/app-log.ts @@ -0,0 +1,91 @@ +const translation = { + title: 'Günlükler', + description: 'Günlükler, kullanıcının girdileri ve AI tepkileri dahil olmak üzere uygulamanın çalışma durumunu kaydeder.', + dateTimeFormat: 'GG/AA/YYYY ss:dd ÖÖ/ÖS', + table: { + header: { + time: 'Zaman', + endUser: 'Son Kullanıcı', + input: 'Girdi', + output: 'Çıktı', + summary: 'Başlık', + messageCount: 'Mesaj Sayısı', + userRate: 'Kullanıcı Puanı', + adminRate: 'Op. Puanı', + startTime: 'BAŞLANGIÇ ZAMANI', + status: 'DURUM', + runtime: 'ÇALIŞMA SÜRESİ', + tokens: 'TOKENLAR', + user: 'SON KULLANICI', + version: 'VERSİYON', + }, + pagination: { + previous: 'Önceki', + next: 'Sonraki', + }, + empty: { + noChat: 'Henüz konuşma yok', + noOutput: 'Çıktı yok', + element: { + title: 'Kimse var mı?', + content: 'Son kullanıcılar ve AI uygulamaları arasındaki etkileşimleri gözlemleyin ve açıklamalar ekleyin, böylece AI doğruluğunu sürekli olarak artırabilirsiniz. Web Uygulamasını paylaşmayı veya kendiniz test etmeyi deneyebilir, ardından bu sayfaya geri dönebilirsiniz.', + }, + }, + }, + detail: { + time: 'Zaman', + conversationId: 'Konuşma ID', + promptTemplate: 'Prompt Şablonu', + promptTemplateBeforeChat: 'Sohbet Öncesi Prompt Şablonu · Sistem Mesajı Olarak', + annotationTip: '{{user}} tarafından işaretlenen iyileştirmeler', + timeConsuming: 'Geçen Süre', + second: 's', + tokenCost: 'Token harcanan', + loading: 'yükleniyor', + operation: { + like: 'beğeni', + dislike: 'beğenmeme', + addAnnotation: 'İyileştirme Ekle', + editAnnotation: 'İyileştirme Düzenle', + annotationPlaceholder: 'AI\'ın yanıtlamasını istediğiniz beklenen cevabı girin, bu, model ince ayarı ve metin üretim kalitesinin sürekli iyileştirilmesi için kullanılabilir.', + }, + variables: 'Değişkenler', + uploadImages: 'Yüklenen Görseller', + }, + filter: { + period: { + today: 'Bugün', + last7days: 'Son 7 Gün', + last4weeks: 'Son 4 Hafta', + last3months: 'Son 3 Ay', + last12months: 'Son 12 Ay', + monthToDate: 'Ay Başlangıcından İtibaren', + quarterToDate: 'Çeyrek Başlangıcından İtibaren', + yearToDate: 'Yıl Başlangıcından İtibaren', + allTime: 'Tüm Zamanlar', + }, + annotation: { + all: 'Hepsi', + annotated: 'Açıklamalı İyileştirmeler ({{count}} öğe)', + not_annotated: 'Açıklanmamış', + }, + }, + workflowTitle: 'Workflow Günlükleri', + workflowSubtitle: 'Günlük, Automate\'in çalışmasını kaydetmiştir.', + runDetail: { + title: 'Konuşma Günlüğü', + workflowTitle: 'Günlük Detayı', + }, + promptLog: 'Prompt Günlüğü', + agentLog: 'Agent Günlüğü', + viewLog: 'Günlüğü Görüntüle', + agentLogDetail: { + agentMode: 'Agent Modu', + toolUsed: 'Kullanılan Araç', + iterations: 'Yinelemeler', + iteration: 'Yineleme', + finalProcessing: 'Son İşleme', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/app-overview.ts b/web/i18n/tr-TR/app-overview.ts new file mode 100644 index 0000000000..77a54dc4b3 --- /dev/null +++ b/web/i18n/tr-TR/app-overview.ts @@ -0,0 +1,156 @@ +const translation = { + welcome: { + firstStepTip: 'Başlamak için,', + enterKeyTip: 'aşağıya OpenAI API Anahtarınızı girin', + getKeyTip: 'OpenAI kontrol panelinden API Anahtarınızı alın', + placeholder: 'API Anahtarınız (ör. sk-xxxx)', + }, + apiKeyInfo: { + cloud: { + trial: { + title: '{{providerName}} deneme kotasını kullanıyorsunuz.', + description: 'Deneme kotası, test amaçlarınız için sağlanmıştır. Deneme kotası bitmeden önce kendi model sağlayıcınızı ayarlayın veya ek kota satın alın.', + }, + exhausted: { + title: 'Deneme kotanızı kullandınız, lütfen API Anahtarınızı ayarlayın.', + description: 'Deneme kotanızı bitirdiniz. Lütfen kendi model sağlayıcınızı ayarlayın veya ek kota satın alın.', + }, + }, + selfHost: { + title: { + row1: 'Başlamak için,', + row2: 'model sağlayıcınızı ayarlayın.', + }, + }, + callTimes: 'Çağrı süresi', + usedToken: 'Kullanılan token', + setAPIBtn: 'Model sağlayıcısını ayarlamaya git', + tryCloud: 'Veya Dify\'nin bulut sürümünü ücretsiz kotayla deneyin', + }, + overview: { + title: 'Genel Bakış', + appInfo: { + explanation: 'Kullanıma hazır AI WebApp', + accessibleAddress: 'Genel URL', + preview: 'Önizleme', + regenerate: 'Yeniden Oluştur', + regenerateNotice: 'Genel URL\'yi yeniden oluşturmak istiyor musunuz?', + preUseReminder: 'Devam etmeden önce WebApp\'i etkinleştirin.', + settings: { + entry: 'Ayarlar', + title: 'WebApp Ayarları', + webName: 'WebApp İsmi', + webDesc: 'WebApp Açıklaması', + webDescTip: 'Bu metin, uygulamanın nasıl kullanılacağına dair temel açıklamalar sağlar ve istemci tarafında görüntülenir', + webDescPlaceholder: 'WebApp\'in açıklamasını girin', + language: 'Dil', + workflow: { + title: 'Workflow Adımları', + show: 'Göster', + hide: 'Gizle', + }, + chatColorTheme: 'Sohbet renk teması', + chatColorThemeDesc: 'Sohbet botunun renk temasını ayarlayın', + chatColorThemeInverted: 'Tersine çevrilmiş', + invalidHexMessage: 'Geçersiz hex değeri', + more: { + entry: 'Daha fazla ayarı göster', + copyright: 'Telif Hakkı', + copyRightPlaceholder: 'Yazarın veya kuruluşun adını girin', + privacyPolicy: 'Gizlilik Politikası', + privacyPolicyPlaceholder: 'Gizlilik politikası bağlantısını girin', + privacyPolicyTip: 'Ziyaretçilerin uygulamanın topladığı verileri anlamalarına yardımcı olur, Dify\'nin Gizlilik Politikası\'na bakın.', + customDisclaimer: 'Özel İfşa', + customDisclaimerPlaceholder: 'Özel ifşa metnini girin', + customDisclaimerTip: 'Özel ifşa metni istemci tarafında görüntülenecek ve uygulama hakkında ek bilgiler sağlayacak', + }, + }, + embedded: { + entry: 'Gömülü', + title: 'Siteye Yerleştir', + explanation: 'Sohbet uygulamasını web sitenize yerleştirmenin yollarını seçin', + iframe: 'Sohbet uygulamasını web sitenizin herhangi bir yerine eklemek için bu iframe\'i HTML kodunuza ekleyin.', + scripts: 'Sohbet uygulamasını web sitenizin sağ alt köşesine eklemek için bu kodu HTML\'e ekleyin.', + chromePlugin: 'Dify Chatbot Chrome Eklentisini Yükleyin', + copied: 'Kopyalandı', + copy: 'Kopyala', + }, + qrcode: { + title: 'Bağlantı QR Kodu', + scan: 'Paylaşmak İçin Taramak', + download: 'QR Kodu İndir', + }, + customize: { + way: 'yol', + entry: 'Özelleştir', + title: 'AI WebApp\'i Özelleştirin', + explanation: 'Web Uygulamasının ön yüzünü senaryo ve stil ihtiyaçlarınıza uygun şekilde özelleştirebilirsiniz.', + way1: { + name: 'İstemci kodunu forklayarak değiştirin ve Vercel\'e dağıtın (önerilen)', + step1: 'İstemci kodunu forklayarak değiştirin', + step1Tip: 'Kaynak kodunu GitHub hesabınıza forklayarak değiştirmek için buraya tıklayın', + step1Operation: 'Dify-WebClient', + step2: 'Vercel\'e dağıtın', + step2Tip: 'Depoyu Vercel\'e içe aktarmak ve dağıtmak için buraya tıklayın', + step2Operation: 'Depo içe aktar', + step3: 'Çevresel değişkenleri yapılandırın', + step3Tip: 'Vercel\'de aşağıdaki çevresel değişkenleri ekleyin', + }, + way2: { + name: 'İstemci kodunu yazarak API\'yi çağırın ve bir sunucuya dağıtın', + operation: 'Dokümantasyon', + }, + }, + }, + apiInfo: { + title: 'Arka Uç Servis API\'si', + explanation: 'Kolayca uygulamanıza entegre edin', + accessibleAddress: 'Servis API Uç Noktası', + doc: 'API Referansı', + }, + status: { + running: 'Hizmette', + disable: 'Devre Dışı', + }, + }, + analysis: { + title: 'Analiz', + ms: 'ms', + tokenPS: 'Token/s', + totalMessages: { + title: 'Toplam Mesajlar', + explanation: 'Günlük AI etkileşim sayısı; prompt mühendisliği/hata ayıklama hariç.', + }, + activeUsers: { + title: 'Aktif Kullanıcılar', + explanation: 'AI ile Soru-Cevap etkileşiminde bulunan benzersiz kullanıcılar; prompt mühendisliği/hata ayıklama hariç.', + }, + tokenUsage: { + title: 'Token Kullanımı', + explanation: 'Uygulama için dil modelinin günlük token kullanımını yansıtır, maliyet kontrolü amacıyla faydalıdır.', + consumed: 'Tüketilen', + }, + avgSessionInteractions: { + title: 'Ort. Oturum Etkileşimleri', + explanation: 'Sohbete dayalı uygulamalar için sürekli kullanıcı-AI iletişim sayısı.', + }, + avgUserInteractions: { + title: 'Ort. Kullanıcı Etkileşimleri', + explanation: 'Kullanıcıların günlük kullanım sıklığını yansıtır. Bu metrik, kullanıcı bağlılığını yansıtır.', + }, + userSatisfactionRate: { + title: 'Kullanıcı Memnuniyet Oranı', + explanation: 'Her 1.000 mesajda alınan beğeni sayısı. Bu, kullanıcıların çok memnun olduğu cevapların oranını gösterir.', + }, + avgResponseTime: { + title: 'Ort. Yanıt Süresi', + explanation: 'Metin tabanlı uygulamalar için AI\'ın işlem/yanıt süresi (ms).', + }, + tps: { + title: 'Token Çıktı Hızı', + explanation: 'LLM\'nin performansını ölçün. İstekten çıktının tamamlanmasına kadar LLM\'nin Token çıktı hızını sayın.', + }, + }, +} + +export default translation diff --git a/web/i18n/tr-TR/app.ts b/web/i18n/tr-TR/app.ts new file mode 100644 index 0000000000..600b1faecb --- /dev/null +++ b/web/i18n/tr-TR/app.ts @@ -0,0 +1,126 @@ +const translation = { + createApp: 'UYGULAMA OLUŞTUR', + types: { + all: 'Hepsi', + chatbot: 'Chatbot', + agent: 'Agent', + workflow: 'Workflow', + completion: 'Tamamlama', + }, + duplicate: 'Çoğalt', + duplicateTitle: 'Uygulamayı Çoğalt', + export: 'DSL Dışa Aktar', + exportFailed: 'DSL dışa aktarımı başarısız oldu.', + importDSL: 'DSL dosyasını içe aktar', + createFromConfigFile: 'DSL dosyasından oluştur', + importFromDSL: 'DSL içe aktar', + importFromDSLFile: 'DSL dosyasından', + importFromDSLUrl: 'URL\'den', + importFromDSLUrlPlaceholder: 'DSL bağlantısını buraya yapıştır', + deleteAppConfirmTitle: 'Bu uygulamayı silmek istiyor musunuz?', + deleteAppConfirmContent: 'Uygulamanın silinmesi geri alınamaz. Kullanıcılar artık uygulamanıza erişemeyecek ve tüm prompt yapılandırmaları ile loglar kalıcı olarak silinecektir.', + appDeleted: 'Uygulama silindi', + appDeleteFailed: 'Uygulama silinemedi', + join: 'Topluluğa katıl', + communityIntro: 'Farklı kanallarda takım üyeleri, katkıda bulunanlar ve geliştiricilerle tartışın.', + roadmap: 'Yol haritamızı görün', + newApp: { + startFromBlank: 'Boş Oluştur', + startFromTemplate: 'Şablondan Oluştur', + captionAppType: 'Ne tür bir uygulama oluşturmak istiyorsunuz?', + chatbotDescription: 'Sohbete dayalı bir uygulama oluşturun. Bu uygulama, çoklu turlar halinde sürekli konuşmaya izin veren bir soru-cevap formatı kullanır.', + completionDescription: 'Prompt temelinde yüksek kaliteli metinler üreten bir uygulama oluşturun, örneğin makaleler, özetler, çeviriler ve daha fazlasını oluşturmak için.', + completionWarning: 'Bu tür bir uygulama artık desteklenmeyecek.', + agentDescription: 'Görevleri tamamlamak için araçları bağımsız olarak seçebilen bir zeki Agent oluşturun', + workflowDescription: 'Yüksek derecede özelleştirilebilir bir workflow ile yüksek kaliteli metinler üreten bir uygulama oluşturun. Deneyimli kullanıcılar için uygundur.', + workflowWarning: 'Şu anda beta aşamasında', + chatbotType: 'Chatbot düzenleme yöntemi', + basic: 'Temel', + basicTip: 'Yeni başlayanlar için, daha sonra Chatflow\'a geçilebilir', + basicFor: 'YENİ BAŞLAYANLAR İÇİN', + basicDescription: 'Temel Orkestrasyon, yerleşik promptları değiştirme yeteneği olmadan, basit ayarlarla bir Chatbot uygulamasının orkestrasyonuna olanak tanır. Yeni başlayanlar için uygundur.', + advanced: 'Chatflow', + advancedFor: 'Gelişmiş kullanıcılar için', + advancedDescription: 'Workflow Orkestrasyonu, yerleşik promptları düzenleme yeteneği de dahil olmak üzere yüksek derecede özelleştirme sunarak Chatbotları workflow formunda düzenler. Deneyimli kullanıcılar için uygundur.', + captionName: 'Uygulama simgesi & ismi', + appNamePlaceholder: 'Uygulamanıza bir isim verin', + captionDescription: 'Açıklama', + appDescriptionPlaceholder: 'Uygulamanın açıklamasını girin', + useTemplate: 'Bu şablonu kullan', + previewDemo: 'Önizleme demosu', + chatApp: 'Asistan', + chatAppIntro: 'Sohbete dayalı bir uygulama oluşturmak istiyorum. Bu uygulama, çoklu turlar halinde sürekli konuşmaya izin veren bir soru-cevap formatı kullanır.', + agentAssistant: 'Yeni Agent Asistanı', + completeApp: 'Metin Üretici', + completeAppIntro: 'Promptlara dayalı olarak yüksek kaliteli metinler üreten bir uygulama oluşturmak istiyorum, örneğin makaleler, özetler, çeviriler ve daha fazlasını oluşturmak için.', + showTemplates: 'Bir şablondan seçmek istiyorum', + hideTemplates: 'Mod seçim ekranına geri dön', + Create: 'Oluştur', + Cancel: 'İptal', + nameNotEmpty: 'İsim boş olamaz', + appTemplateNotSelected: 'Lütfen bir şablon seçin', + appTypeRequired: 'Lütfen bir uygulama türü seçin', + appCreated: 'Uygulama oluşturuldu', + appCreateFailed: 'Uygulama oluşturulamadı', + }, + editApp: 'Bilgileri Düzenle', + editAppTitle: 'Uygulama Bilgilerini Düzenle', + editDone: 'Uygulama bilgileri güncellendi', + editFailed: 'Uygulama bilgileri güncellenemedi', + emoji: { + ok: 'Tamam', + cancel: 'İptal', + }, + switch: 'Workflow Orkestrasyonuna Geç', + switchTipStart: 'Sizin için yeni bir uygulama kopyası oluşturulacak ve yeni kopya Workflow Orkestrasyonuna geçecektir. Yeni kopya ', + switchTip: 'izin vermeyecek', + switchTipEnd: ' Temel Orkestrasyona geri dönmek.', + switchLabel: 'Oluşturulacak uygulama kopyası', + removeOriginal: 'Orijinal uygulamayı sil', + switchStart: 'Geçişi Başlat', + typeSelector: { + all: 'ALL Types', + chatbot: 'Chatbot', + agent: 'Agent', + workflow: 'Workflow', + completion: 'Completion', + }, + tracing: { + title: 'Uygulama performansını izleme', + description: 'Üçüncü taraf LLMOps sağlayıcısını yapılandırma ve uygulama performansını izleme.', + config: 'Yapılandırma', + collapse: 'Daralt', + expand: 'Genişlet', + tracing: 'İzleme', + disabled: 'Devre Dışı', + disabledTip: 'Lütfen önce sağlayıcıyı yapılandırın', + enabled: 'Hizmette', + tracingDescription: 'Uygulama yürütmesinin tam bağlamını, LLM çağrıları, bağlam, promptlar, HTTP istekleri ve daha fazlası dahil olmak üzere üçüncü taraf izleme platformuna yakalama.', + configProviderTitle: { + configured: 'Yapılandırıldı', + notConfigured: 'İzlemeyi etkinleştirmek için sağlayıcıyı yapılandırın', + moreProvider: 'Daha Fazla Sağlayıcı', + }, + langsmith: { + title: 'LangSmith', + description: 'LLM destekli uygulama yaşam döngüsünün her adımı için her şeyi kapsayan bir geliştirici platformu.', + }, + langfuse: { + title: 'Langfuse', + description: 'LLM uygulamanızı hata ayıklamak ve geliştirmek için izlemeler, değerlendirmeler, prompt yönetimi ve metrikler.', + }, + inUse: 'Kullanımda', + configProvider: { + title: 'Yapılandırma', + placeholder: '{{key}} bilgilerinizi girin', + project: 'Proje', + publicKey: 'Genel Anahtar', + secretKey: 'Gizli Anahtar', + viewDocsLink: '{{key}} dökümanlarını görüntüle', + removeConfirmTitle: '{{key}} yapılandırmasını kaldır?', + removeConfirmContent: 'Mevcut yapılandırma kullanımda, kaldırılması İzleme özelliğini kapatacaktır.', + }, + }, +} + +export default translation diff --git a/web/i18n/tr-TR/billing.ts b/web/i18n/tr-TR/billing.ts new file mode 100644 index 0000000000..1db14bb149 --- /dev/null +++ b/web/i18n/tr-TR/billing.ts @@ -0,0 +1,118 @@ +const translation = { + currentPlan: 'Mevcut Plan', + upgradeBtn: { + plain: 'Planı Yükselt', + encourage: 'Şimdi Yükselt', + encourageShort: 'Yükselt', + }, + viewBilling: 'Faturalandırma ve abonelikleri yönet', + buyPermissionDeniedTip: 'Abone olmak için lütfen işletme yöneticinize başvurun', + plansCommon: { + title: 'Size uygun bir plan seçin', + yearlyTip: 'Yıllık abonelikle 2 ay ücretsiz!', + mostPopular: 'En Popüler', + planRange: { + monthly: 'Aylık', + yearly: 'Yıllık', + }, + month: 'ay', + year: 'yıl', + save: 'Tasarruf et ', + free: 'Ücretsiz', + currentPlan: 'Mevcut Plan', + contractSales: 'Satışla iletişime geçin', + contractOwner: 'Takım yöneticisine başvurun', + startForFree: 'Ücretsiz Başla', + getStartedWith: 'ile başlayın', + contactSales: 'Satışlarla İletişime Geçin', + talkToSales: 'Satışlarla Konuşun', + modelProviders: 'Model Sağlayıcılar', + teamMembers: 'Takım Üyeleri', + annotationQuota: 'Ek Açıklama Kotası', + buildApps: 'Uygulamalar Oluştur', + vectorSpace: 'Vektör Alanı', + vectorSpaceBillingTooltip: 'Her 1MB yaklaşık 1.2 milyon karakter vektörize veri depolayabilir (OpenAI Embeddings ile tahmin edilmiştir, modellere göre farklılık gösterebilir).', + vectorSpaceTooltip: 'Vektör Alanı, LLM\'lerin verilerinizi anlaması için gerekli uzun süreli hafıza sistemidir.', + documentsUploadQuota: 'Doküman Yükleme Kotası', + documentProcessingPriority: 'Doküman İşleme Önceliği', + documentProcessingPriorityTip: 'Daha yüksek doküman işleme önceliği için planınızı yükseltin.', + documentProcessingPriorityUpgrade: 'Daha fazla veriyi daha yüksek doğrulukla ve daha hızlı işleyin.', + priority: { + 'standard': 'Standart', + 'priority': 'Öncelikli', + 'top-priority': 'En Öncelikli', + }, + logsHistory: 'Günlük Geçmişi', + customTools: 'Özel Araçlar', + unavailable: 'Mevcut Değil', + days: 'gün', + unlimited: 'Sınırsız', + support: 'Destek', + supportItems: { + communityForums: 'Topluluk forumları', + emailSupport: 'E-posta desteği', + priorityEmail: 'Öncelikli e-posta ve sohbet desteği', + logoChange: 'Logo değişikliği', + SSOAuthentication: 'SSO kimlik doğrulama', + personalizedSupport: 'Kişiselleştirilmiş destek', + dedicatedAPISupport: 'Özel API desteği', + customIntegration: 'Özel entegrasyon ve destek', + ragAPIRequest: 'RAG API Talepleri', + bulkUpload: 'Toplu doküman yükleme', + agentMode: 'Agent Modu', + workflow: 'Workflow', + llmLoadingBalancing: 'LLM Yük Dengeleme', + llmLoadingBalancingTooltip: 'Modellere birden fazla API anahtarı ekleyin, API hız sınırlarını etkili bir şekilde aşın.', + }, + comingSoon: 'Yakında geliyor', + member: 'Üye', + memberAfter: 'Üye', + messageRequest: { + title: 'Mesaj Kredileri', + tooltip: 'OpenAI modellerini (gpt4 hariç) kullanarak çeşitli planlar için mesaj çağrı kotaları. Limitin üzerindeki mesajlar OpenAI API Anahtarınızı kullanır.', + }, + annotatedResponse: { + title: 'Ek Açıklama Kota Sınırları', + tooltip: 'Yanıtların elle düzenlenmesi ve ek açıklanması, uygulamalar için özelleştirilebilir yüksek kaliteli soru-cevap yetenekleri sağlar. (Sadece sohbet uygulamalarında geçerlidir)', + }, + ragAPIRequestTooltip: 'Dify\'nin sadece bilgi tabanı işleme yeteneklerini çağıran API çağrıları sayısını ifade eder.', + receiptInfo: 'Sadece takım sahibi ve takım yöneticisi abone olabilir ve faturalandırma bilgilerini görüntüleyebilir', + }, + plans: { + sandbox: { + name: 'Sandbox', + description: '200 kez GPT ücretsiz deneme', + includesTitle: 'İçerdikleri:', + }, + professional: { + name: 'Profesyonel', + description: 'Bireyler ve küçük takımlar için daha fazla güç açın.', + includesTitle: 'Ücretsiz plandaki her şey, artı:', + }, + team: { + name: 'Takım', + description: 'Sınırsız işbirliği ve en üst düzey performans.', + includesTitle: 'Profesyonel plandaki her şey, artı:', + }, + enterprise: { + name: 'Kurumsal', + description: 'Büyük ölçekli kritik sistemler için tam yetenekler ve destek.', + includesTitle: 'Takım plandaki her şey, artı:', + }, + }, + vectorSpace: { + fullTip: 'Vektör Alanı dolu.', + fullSolution: 'Daha fazla alan için planınızı yükseltin.', + }, + apps: { + fullTipLine1: 'Daha fazla uygulama oluşturmak için', + fullTipLine2: 'planınızı yükseltin.', + }, + annotatedResponse: { + fullTipLine1: 'Daha fazla konuşmayı açıklamak için', + fullTipLine2: 'planınızı yükseltin.', + quotaTitle: 'Ek Açıklama Yanıtı Kotası', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/common.ts b/web/i18n/tr-TR/common.ts new file mode 100644 index 0000000000..f7981c3f48 --- /dev/null +++ b/web/i18n/tr-TR/common.ts @@ -0,0 +1,572 @@ +const translation = { + api: { + success: 'Başarılı', + actionSuccess: 'İşlem başarılı', + saved: 'Kaydedildi', + create: 'Oluşturuldu', + remove: 'Kaldırıldı', + }, + operation: { + create: 'Oluştur', + confirm: 'Onayla', + cancel: 'İptal', + clear: 'Temizle', + save: 'Kaydet', + saveAndEnable: 'Kaydet ve Etkinleştir', + edit: 'Düzenle', + add: 'Ekle', + added: 'Eklendi', + refresh: 'Yeniden Başlat', + reset: 'Sıfırla', + search: 'Ara', + change: 'Değiştir', + remove: 'Kaldır', + send: 'Gönder', + copy: 'Kopyala', + lineBreak: 'Satır sonu', + sure: 'Eminim', + download: 'İndir', + delete: 'Sil', + settings: 'Ayarlar', + setup: 'Kurulum', + getForFree: 'Ücretsiz edinin', + reload: 'Yeniden Yükle', + ok: 'Tamam', + log: 'log', + learnMore: 'Daha Fazla Bilgi', + params: 'Parametreler', + duplicate: 'Çoğalt', + rename: 'Yeniden Adlandır', + }, + errorMsg: { + fieldRequired: '{{field}} gereklidir', + urlError: 'URL http:// veya https:// ile başlamalıdır', + }, + placeholder: { + input: 'Lütfen girin', + select: 'Lütfen seçin', + }, + voice: { + language: { + zhHans: 'Chinese', + zhHant: 'Traditional Chinese', + enUS: 'English', + deDE: 'German', + frFR: 'French', + esES: 'Spanish', + itIT: 'Italian', + thTH: 'Thai.', + idID: 'Indonesian', + jaJP: 'Japanese', + koKR: 'Korean', + ptBR: 'Portuguese', + ruRU: 'Russian', + ukUA: 'Ukrainian', + viVN: 'Vietnamese', + plPL: 'Polish', + }, + }, + unit: { + char: 'karakter', + }, + actionMsg: { + noModification: 'Şu an için değişiklik yok.', + modifiedSuccessfully: 'Başarıyla değiştirildi', + modifiedUnsuccessfully: 'Değiştirme başarısız oldu', + copySuccessfully: 'Başarıyla kopyalandı', + paySucceeded: 'Ödeme başarılı oldu', + payCancelled: 'Ödeme iptal edildi', + generatedSuccessfully: 'Başarıyla oluşturuldu', + generatedUnsuccessfully: 'Oluşturma başarısız oldu', + }, + model: { + params: { + temperature: 'Sıcaklık', + temperatureTip: + 'Rastgeleliği kontrol eder: Sıcaklık düştükçe daha az rastgele tamamlamalar gerçekleşir. Sıcaklık sıfıra yaklaştıkça model deterministik ve tekrarlı hale gelir.', + top_p: 'Top P', + top_pTip: + 'Çeşitliliği nucleus örnekleme ile kontrol eder: 0.5, tüm olasılık ağırlıklı seçeneklerin yarısının dikkate alındığı anlamına gelir.', + presence_penalty: 'Varlık cezası', + presence_penaltyTip: + 'Şimdiye kadar metinde görünüp görünmediğine bağlı olarak yeni tokenları ne kadar cezalandıracağını belirler.\nModelin yeni konular hakkında konuşma olasılığını artırır.', + frequency_penalty: 'Frekans cezası', + frequency_penaltyTip: + 'Mevcut metindeki frekanslarına göre yeni tokenları ne kadar cezalandıracağını belirler.\nModelin aynı satırı aynen tekrarlama olasılığını azaltır.', + max_tokens: 'Maksimum token', + max_tokensTip: + 'Yanıtın maksimum uzunluğunu token cinsinden sınırlar.\nDaha büyük değerler prompt kelimeleri, sohbet kayıtları ve Bilgiler için bırakılacak alanı sınırlayabilir. \nİki üçün altında ayarlanması önerilir\ngpt-4-1106-preview, gpt-4-vision-preview maksimum token (giriş 128k, çıkış 4k).', + maxTokenSettingTip: 'Maksimum token ayarınız yüksek, bu da promptlar, sorgular ve veriler için alanı sınırlayabilir. Bu değeri 2/3\'ün altında ayarlamayı düşünün.', + setToCurrentModelMaxTokenTip: 'Maksimum token, mevcut modelin maksimum token\'ın %80\'ine {maxToken} olarak güncellendi.', + stop_sequences: 'Stop sıraları', + stop_sequencesTip: 'API, dört adede kadar sıra belirleyerek daha fazla token üretmeyi durduracaktır. Dönülen metin durdurma sırasını içermez.', + stop_sequencesPlaceholder: 'Sıra girin ve Tab tuşuna basın', + }, + tone: { + Creative: 'Yaratıcı', + Balanced: 'Dengeli', + Precise: 'Kesin', + Custom: 'Özel', + }, + addMoreModel: 'Daha fazla model eklemek için ayarlara gidin', + }, + menus: { + status: 'beta', + explore: 'Keşfet', + apps: 'Studio', + plugins: 'Eklentiler', + pluginsTips: 'Üçüncü taraf eklentileri entegre edin veya ChatGPT uyumlu AI-Eklentileri oluşturun.', + datasets: 'Bilgi', + datasetsTips: 'YAKINDA: Kendi metin verilerinizi içe aktarın veya LLM bağlamını geliştirmek için Webhook aracılığıyla gerçek zamanlı veri yazın.', + newApp: 'Yeni Uygulama', + newDataset: 'Bilgi Oluştur', + tools: 'Araçlar', + }, + userProfile: { + settings: 'Ayarlar', + emailSupport: 'E-posta Desteği', + workspace: 'Çalışma Alanı', + createWorkspace: 'Çalışma Alanı Oluştur', + helpCenter: 'Yardım', + roadmapAndFeedback: 'Geri Bildirim', + community: 'Topluluk', + about: 'Hakkında', + logout: 'Çıkış Yap', + }, + settings: { + accountGroup: 'HESAP', + workplaceGroup: 'ÇALIŞMA ALANI', + account: 'Hesabım', + members: 'Üyeler', + billing: 'Faturalandırma', + integrations: 'Entegrasyonlar', + language: 'Dil', + provider: 'Model Sağlayıcı', + dataSource: 'Veri Kaynağı', + plugin: 'Eklentiler', + apiBasedExtension: 'API Uzantısı', + }, + account: { + avatar: 'Avatar', + name: 'İsim', + email: 'E-posta', + password: 'Şifre', + passwordTip: 'Geçici giriş kodlarını kullanmak istemiyorsanız kalıcı bir şifre ayarlayabilirsiniz', + setPassword: 'Şifre Ayarla', + resetPassword: 'Şifreyi Sıfırla', + currentPassword: 'Mevcut şifre', + newPassword: 'Yeni şifre', + confirmPassword: 'Şifreyi onayla', + notEqual: 'İki şifre aynı değil.', + langGeniusAccount: 'Dify hesabı', + langGeniusAccountTip: 'Dify hesabınız ve ilişkili kullanıcı verileri.', + editName: 'İsmi Düzenle', + showAppLength: '{{length}} uygulamayı göster', + delete: 'Hesabı Sil', + deleteTip: 'Hesabınızı silmek tüm verilerinizi kalıcı olarak siler ve geri alınamaz.', + deleteConfirmTip: 'Onaylamak için, kayıtlı e-postanızdan şu adrese e-posta gönderin: ', + }, + members: { + team: 'Takım', + invite: 'Ekle', + name: 'İSİM', + lastActive: 'SON AKTİF', + role: 'ROLLER', + pending: 'Beklemede...', + owner: 'Sahibi', + admin: 'Yönetici', + adminTip: 'Uygulama oluşturabilir ve takım ayarlarını yönetebilir', + normal: 'Normal', + normalTip: 'Sadece uygulamaları kullanabilir, uygulama oluşturamaz', + builder: 'Oluşturucu', + builderTip: 'Kendi uygulamalarını oluşturup düzenleyebilir', + editor: 'Editör', + editorTip: 'Uygulama oluşturabilir ve düzenleyebilir', + datasetOperator: 'Bilgi Yöneticisi', + datasetOperatorTip: 'Sadece bilgi tabanını yönetebilir', + inviteTeamMember: 'Takım Üyesi Ekle', + inviteTeamMemberTip: 'Giriş yaptıktan sonra takım verilerinize doğrudan erişebilirler.', + email: 'E-posta', + emailInvalid: 'Geçersiz E-posta Formatı', + emailPlaceholder: 'Lütfen e-postaları girin', + sendInvite: 'Davet Gönder', + invitedAsRole: '{{role}} kullanıcısı olarak davet edildi', + invitationSent: 'Davet gönderildi', + invitationSentTip: 'Davet gönderildi, Dify\'ye giriş yaparak takım verilerinize erişebilirler.', + invitationLink: 'Davet Linki', + failedinvitationEmails: 'Aşağıdaki kullanıcılar başarıyla davet edilmedi', + ok: 'Tamam', + removeFromTeam: 'Takımdan Kaldır', + removeFromTeamTip: 'Takım erişimi kaldırılacak', + setAdmin: 'Yönetici olarak ayarla', + setMember: 'Normal üye olarak ayarla', + setBuilder: 'Oluşturucu olarak ayarla', + setEditor: 'Editör olarak ayarla', + disinvite: 'Davetiyeyi iptal et', + deleteMember: 'Üyeyi Sil', + you: '(Siz)', + }, + integrations: { + connected: 'Bağlandı', + google: 'Google', + googleAccount: 'Google hesabıyla giriş yap', + github: 'GitHub', + githubAccount: 'GitHub hesabıyla giriş yap', + connect: 'Bağlan', + }, + language: { + displayLanguage: 'Görüntüleme Dili', + timezone: 'Zaman Dilimi', + }, + provider: { + apiKey: 'API Anahtarı', + enterYourKey: 'API anahtarınızı buraya girin', + invalidKey: 'Geçersiz OpenAI API anahtarı', + validatedError: 'Doğrulama hatası: ', + validating: 'Anahtar doğrulanıyor...', + saveFailed: 'API anahtarını kaydetme başarısız oldu', + apiKeyExceedBill: 'Bu API ANAHTARININ kullanılabilir kotası yok, lütfen okuyun', + addKey: 'Anahtar Ekle', + comingSoon: 'Yakında', + editKey: 'Düzenle', + invalidApiKey: 'Geçersiz API anahtarı', + azure: { + apiBase: 'API Tabanı', + apiBasePlaceholder: 'Azure OpenAI Endpoint\'inizin API Tabanı URL\'si.', + apiKey: 'API Anahtarı', + apiKeyPlaceholder: 'API anahtarınızı buraya girin', + helpTip: 'Azure OpenAI Service hakkında bilgi edinin', + }, + openaiHosted: { + openaiHosted: 'Barındırılan OpenAI', + onTrial: 'DENEMEDE', + exhausted: 'KOTA DOLU', + desc: 'Dify tarafından sağlanan OpenAI barındırma hizmeti, GPT-3.5 gibi modelleri kullanmanıza olanak tanır. Deneme kotanız bitmeden önce, diğer model sağlayıcılarını ayarlamanız gerekir.', + callTimes: 'Çağrı süreleri', + usedUp: 'Deneme kotası kullanıldı. Kendi Model Sağlayıcınızı ekleyin.', + useYourModel: 'Şu anda kendi Model Sağlayıcınızı kullanıyorsunuz.', + close: 'Kapat', + }, + anthropicHosted: { + anthropicHosted: 'Anthropic Claude', + onTrial: 'DENEMEDE', + exhausted: 'KOTA DOLU', + desc: 'Güçlü model, karmaşık diyaloglar ve yaratıcı içerik üretiminden ayrıntılı yönlendirmeye kadar geniş bir görev yelpazesi konusunda mükemmeldir.', + callTimes: 'Çağrı Süreleri', + usedUp: 'Deneme kotası kullanıldı. Kendi Model Sağlayıcınızı ekleyin.', + useYourModel: 'Şu anda kendi Model Sağlayıcınızı kullanıyorsunuz.', + close: 'Kapat', + }, + anthropic: { + using: 'Yerleştirme yeteneği,', + enableTip: 'Anthropic modelini etkinleştirmek için önce OpenAI veya Azure OpenAI hizmetine bağlanmanız gerekir.', + notEnabled: 'Etkin değil', + keyFrom: 'API anahtarınızı Anthropic\'ten edinin', + }, + encrypted: { + front: 'API ANAHTARINIZ şu kullanılarak şifrelenip saklanacak:', + back: ' teknolojisi.', + }, + }, + modelProvider: { + notConfigured: 'Sistem modeli henüz tam olarak yapılandırılmadı ve bazı işlevler kullanılamayabilir.', + systemModelSettings: 'Sistem Model Ayarları', + systemModelSettingsLink: 'Sistem modelini ayarlamak neden gereklidir?', + selectModel: 'Modelinizi seçin', + setupModelFirst: 'Lütfen önce modelinizi ayarlayın', + systemReasoningModel: { + key: 'Sistem Çıkarım Modeli', + tip: 'Uygulamalar oluşturmak ve diyalog adı oluşturma ve sonraki soru önerisi gibi özelliklerin otomatikleştirilmesi için kullanılacak varsayılan çıkarım modelini ayarlayın.', + }, + embeddingModel: { + key: 'Yerleştirme Modeli', + tip: 'Bilginin belge yerleştirme işlemi için varsayılan modeli ayarlayın, Bilginin geri alımı ve içe aktarımı için bu Yerleştirme modeli kullanılarak vektörizasyon işlemleri yapılır. Değiştirilmesi, içe aktarılan Bilgilere ve sorulara arasındaki vektör boyutlarının tutarsız olmasına neden olarak geri alım hatasına yol açar. Geri alım hatasını önlemek için önce modeli keyfi olarak değiştirmeyin.', + required: 'Yerleştirme Modeli gereklidir', + }, + speechToTextModel: { + key: 'Konuşmadan Metne Modeli', + tip: 'Konuşmada konuşmadan metne giriş için varsayılan modeli ayarlayın.', + }, + ttsModel: { + key: 'Metinden Konuşmaya Modeli', + tip: 'Konuşmada metinden konuşmaya giriş için varsayılan modeli ayarlayın.', + }, + rerankModel: { + key: 'Yeniden Sıralama Modeli', + tip: 'Yeniden sıralama modeli, kullanıcı sorgusuyla anlam eşleştirmesine dayalı olarak aday belge listesini yeniden sıralayacak ve anlam sıralama sonuçlarını iyileştirecektir.', + }, + apiKey: 'API-KEY', + quota: 'Kota', + searchModel: 'Model ara', + noModelFound: '{{model}} için model bulunamadı', + models: 'Modeller', + showMoreModelProvider: 'Daha fazla model sağlayıcı göster', + selector: { + tip: 'Bu model kaldırıldı. Lütfen bir model ekleyin veya başka bir model seçin.', + emptyTip: 'Kullanılabilir model yok', + emptySetting: 'Lütfen ayarlara gidip yapılandırın', + rerankTip: 'Lütfen Yeniden Sıralama modelini ayarlayın', + }, + card: { + quota: 'KOTA', + onTrial: 'Deneme Sürümünde', + paid: 'Ücretli', + quotaExhausted: 'Kota Tükendi', + callTimes: 'Çağrı Süreleri', + tokens: 'Tokenler', + buyQuota: 'Kota Satın Al', + priorityUse: 'Öncelikli Kullan', + removeKey: 'API Anahtarını Kaldır', + tip: 'Öncelikle ücretli kota kullanılacaktır. Deneme kotası, ücretli kota tükendiğinde kullanılacaktır.', + }, + item: { + deleteDesc: '{{modelName}} şu anda sistem çıkarım modeli olarak kullanılmaktadır. Kaldırıldıktan sonra bazı işlevler kullanılamayabilir. Lütfen onaylayın.', + freeQuota: 'ÜCRETSİZ KOTA', + }, + addApiKey: 'API anahtarınızı ekleyin', + invalidApiKey: 'Geçersiz API anahtarı', + encrypted: { + front: 'API ANAHTARINIZ şu kullanılarak şifrelenip saklanacak:', + back: ' teknolojisi.', + }, + freeQuota: { + howToEarn: 'Nasıl kazanılır', + }, + addMoreModelProvider: 'DAHA FAZLA MODEL SAĞLAYICI EKLEYİN', + addModel: 'Model Ekle', + modelsNum: '{{num}} Model', + showModels: 'Modelleri Göster', + showModelsNum: '{{num}} Modeli Göster', + collapse: 'Daralt', + config: 'Yapılandır', + modelAndParameters: 'Model ve Parametreler', + model: 'Model', + featureSupported: '{{feature}} desteklenir', + callTimes: 'Çağrı Süreleri', + credits: 'Mesaj Kredileri', + buyQuota: 'Kota Satın Al', + getFreeTokens: 'Ücretsiz Token Al', + priorityUsing: 'Öncelikli Kullanım', + deprecated: 'Kullanım dışı', + confirmDelete: 'silme onayı?', + quotaTip: 'Kalan kullanılabilir ücretsiz tokenler', + loadPresets: 'Hazır Ayarları Yükle', + parameters: 'PARAMETRELER', + loadBalancing: 'Yük dengeleme', + loadBalancingDescription: 'Birden fazla kimlik bilgisi grubu ile baskıyı azaltın.', + loadBalancingHeadline: 'Yük Dengeleme', + configLoadBalancing: 'Yük Dengelemeyi Yapılandır', + modelHasBeenDeprecated: 'Bu model kullanım dışıdır', + providerManaged: 'Sağlayıcı tarafından yönetilen', + providerManagedDescription: 'Model sağlayıcı tarafından sağlanan tek bir kimlik bilgisi grubunu kullanın.', + defaultConfig: 'Varsayılan Yapılandırma', + apiKeyStatusNormal: 'API Anahtarının durumu normal', + apiKeyRateLimit: 'Hız sınırına ulaşıldı, {{seconds}} saniye sonra tekrar kullanılabilir', + addConfig: 'Yapılandırma Ekle', + editConfig: 'Yapılandırmayı Düzenle', + loadBalancingLeastKeyWarning: 'Yük dengeleme etkinleştirmek için en az 2 anahtar etkinleştirilmelidir.', + loadBalancingInfo: 'Varsayılan olarak, yük dengeleme Yuvarlakrobin stratejisini kullanır. Hız sınırlaması tetiklenirse, 1 dakikalık bir soğuma süresi uygulanacaktır.', + upgradeForLoadBalancing: 'Yük Dengelemeyi etkinleştirmek için planınızı yükseltin.', + }, + dataSource: { + add: 'Bir veri kaynağı ekle', + connect: 'Bağlan', + configure: 'Yapılandır', + notion: { + title: 'Notion', + description: 'Bilgi için veri kaynağı olarak Notion kullanma.', + connectedWorkspace: 'Bağlı çalışma alanı', + addWorkspace: 'Çalışma alanı ekle', + connected: 'Bağlandı', + disconnected: 'Bağlantı Kesildi', + changeAuthorizedPages: 'Yetkilendirilen sayfaları değiştir', + pagesAuthorized: 'Yetkilendirilen sayfalar', + sync: 'Senkronize et', + remove: 'Kaldır', + selector: { + pageSelected: 'Seçilen Sayfalar', + searchPages: 'Sayfaları ara...', + noSearchResult: 'Arama sonucu yok', + addPages: 'Sayfa ekle', + preview: 'ÖNİZLEME', + }, + }, + website: { + title: 'Web Sitesi', + description: 'Web tarayıcı kullanarak web sitelerinden içerik içe aktarın.', + with: 'İle', + configuredCrawlers: 'Yapılandırılmış tarayıcılar', + active: 'Aktif', + inactive: 'Pasif', + }, + }, + plugin: { + serpapi: { + apiKey: 'API Anahtarı', + apiKeyPlaceholder: 'API anahtarınızı girin', + keyFrom: 'SerpAPI Hesap Sayfasından SerpAPI anahtarınızı alın', + }, + }, + apiBasedExtension: { + title: 'API uzantıları merkezi API yönetimi sağlar, Dify\'nin uygulamaları arasında kolay kullanım için yapılandırmayı basitleştirir.', + link: 'Kendi API Uzantınızı nasıl geliştireceğinizi öğrenin.', + linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension', + add: 'API Uzantısı Ekle', + selector: { + title: 'API Uzantısı', + placeholder: 'Lütfen API uzantısını seçin', + manage: 'API Uzantısını Yönet', + }, + modal: { + title: 'API Uzantısı Ekle', + editTitle: 'API Uzantısını Düzenle', + name: { + title: 'Ad', + placeholder: 'Lütfen adı girin', + }, + apiEndpoint: { + title: 'API Uç Noktası', + placeholder: 'Lütfen API uç noktasını girin', + }, + apiKey: { + title: 'API anahtarı', + placeholder: 'Lütfen API anahtarını girin', + lengthError: 'API anahtarı uzunluğu 5 karakterden az olamaz', + }, + }, + type: 'Tür', + }, + about: { + changeLog: 'Değişiklik Günlüğü', + updateNow: 'Şimdi güncelle', + nowAvailable: 'Dify {{version}} şimdi mevcut.', + latestAvailable: 'Dify {{version}} en son mevcut sürüm.', + }, + appMenus: { + overview: 'İzleme', + promptEng: 'Orchestrate', + apiAccess: 'API Erişimi', + logAndAnn: 'Günlükler & Anlamlandırmalar', + logs: 'Günlükler', + }, + environment: { + testing: 'TEST', + development: 'GELİŞTİRME', + }, + appModes: { + completionApp: 'Metin Üreteci', + chatApp: 'Sohbet Uygulaması', + }, + datasetMenus: { + documents: 'Belgeler', + hitTesting: 'Geri Alım Testi', + settings: 'Ayarlar', + emptyTip: 'Bilgi ilişkilendirilmemiş, ilişkilendirme işlemini tamamlamak için uygulama veya eklentiye gidin.', + viewDoc: 'Dökümantasyon görüntüle', + relatedApp: 'bağlantılı uygulamalar', + }, + voiceInput: { + speaking: 'Şimdi konuş...', + converting: 'Metne dönüştürülüyor...', + notAllow: 'mikrofon yetkilendirilmedi', + }, + modelName: { + 'gpt-3.5-turbo': 'GPT-3.5-Turbo', + 'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K', + 'gpt-4': 'GPT-4', + 'gpt-4-32k': 'GPT-4-32K', + 'text-davinci-003': 'Text-Davinci-003', + 'text-embedding-ada-002': 'Text-Embedding-Ada-002', + 'whisper-1': 'Whisper-1', + 'claude-instant-1': 'Claude-Instant', + 'claude-2': 'Claude-2', + }, + chat: { + renameConversation: 'Konuşmayı Yeniden Adlandır', + conversationName: 'Konuşma adı', + conversationNamePlaceholder: 'Konuşma adını girin', + conversationNameCanNotEmpty: 'Konuşma adı gereklidir', + citation: { + title: 'ALINTILAR', + linkToDataset: 'Bilgiye Bağlantı', + characters: 'Karakterler:', + hitCount: 'Geri Alım Sayısı:', + vectorHash: 'Vektör Hash:', + hitScore: 'Geri Alım Skoru:', + }, + }, + promptEditor: { + placeholder: 'Prompt kelimenizi buraya yazın, değişken eklemek için \'{\' tuşuna, prompt içerik bloğu eklemek için \'/\' tuşuna basın', + context: { + item: { + title: 'Bağlam', + desc: 'Bağlam şablonunu ekle', + }, + modal: { + title: 'Bağlamda {{num}} Knowledge', + add: 'Bağlam Ekle', + footer: 'Bağlamları aşağıdaki Bağlam bölümünde yönetebilirsiniz.', + }, + }, + history: { + item: { + title: 'Konuşma Geçmişi', + desc: 'Tarihi mesaj şablonunu ekle', + }, + modal: { + title: 'ÖRNEK', + user: 'Merhaba', + assistant: 'Merhaba! Bugün size nasıl yardımcı olabilirim?', + edit: 'Konuşma Rol İsimlerini Düzenle', + }, + }, + variable: { + item: { + title: 'Değişkenler & Harici Araçlar', + desc: 'Değişkenler & Harici Araçlar ekle', + }, + outputToolDisabledItem: { + title: 'Değişkenler', + desc: 'Değişkenleri ekle', + }, + modal: { + add: 'Yeni değişken', + addTool: 'Yeni araç', + }, + }, + query: { + item: { + title: 'Sorgu', + desc: 'Kullanıcı sorgu şablonunu ekle', + }, + }, + existed: 'Zaten prompt içinde mevcut', + }, + imageUploader: { + uploadFromComputer: 'Bilgisayardan Yükle', + uploadFromComputerReadError: 'Görüntü okuma başarısız oldu, lütfen tekrar deneyin.', + uploadFromComputerUploadError: 'Görüntü yükleme başarısız oldu, lütfen tekrar yükleyin.', + uploadFromComputerLimit: 'Yükleme görüntüleri {{size}} MB\'yi aşamaz', + pasteImageLink: 'Görüntü bağlantısını yapıştır', + pasteImageLinkInputPlaceholder: 'Görüntü bağlantısını buraya yapıştırın', + pasteImageLinkInvalid: 'Geçersiz görüntü bağlantısı', + imageUpload: 'Görüntü Yükleme', + }, + tag: { + placeholder: 'Tüm Etiketler', + addNew: 'Yeni etiket ekle', + noTag: 'Etiket yok', + noTagYet: 'Henüz etiket yok', + addTag: 'Etiket ekle', + editTag: 'Etiketleri düzenle', + manageTags: 'Etiketleri Yönet', + selectorPlaceholder: 'Aramak veya oluşturmak için yazın', + create: 'Oluştur', + delete: 'Etiketi sil', + deleteTip: 'Etiket kullanılıyor, silinsin mi?', + created: 'Etiket başarıyla oluşturuldu', + failed: 'Etiket oluşturma başarısız oldu', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/custom.ts b/web/i18n/tr-TR/custom.ts new file mode 100644 index 0000000000..d4526074d5 --- /dev/null +++ b/web/i18n/tr-TR/custom.ts @@ -0,0 +1,30 @@ +const translation = { + custom: 'Özelleştirme', + upgradeTip: { + prefix: 'Markanızı özelleştirmek için planınızı yükseltin', + suffix: '.', + }, + webapp: { + title: 'WebApp markasını özelleştir', + removeBrand: 'Powered by Dify\'i kaldır', + changeLogo: 'Powered by Brand Resmini Değiştir', + changeLogoTip: 'SVG veya PNG formatında, en az 40x40px boyutunda', + }, + app: { + title: 'Uygulama başlığı markasını özelleştir', + changeLogoTip: 'SVG veya PNG formatında, en az 80x80px boyutunda', + }, + upload: 'Yükle', + uploading: 'Yükleniyor', + uploadedFail: 'Resim yükleme başarısız oldu, lütfen tekrar yükleyin.', + change: 'Değiştir', + apply: 'Uygula', + restore: 'Varsayılan Ayarları Geri Yükle', + customize: { + contactUs: ' bizimle iletişime geçin ', + prefix: 'Uygulama içindeki marka logosunu özelleştirmek için, lütfen', + suffix: 'Enterprise sürümüne yükseltin.', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/dataset-creation.ts b/web/i18n/tr-TR/dataset-creation.ts new file mode 100644 index 0000000000..b35cbc26b2 --- /dev/null +++ b/web/i18n/tr-TR/dataset-creation.ts @@ -0,0 +1,161 @@ +const translation = { + steps: { + header: { + creation: 'Bilgi Oluştur', + update: 'Veri ekle', + }, + one: 'Veri kaynağı seçin', + two: 'Metin Ön İşleme ve Temizleme', + three: 'Çalıştır ve Bitir', + }, + error: { + unavailable: 'Bu Bilgi kullanılamıyor', + }, + firecrawl: { + configFirecrawl: '🔥Firecrawl\'ı Yapılandır', + apiKeyPlaceholder: 'firecrawl.dev\'den API anahtarı', + getApiKeyLinkText: 'API anahtarınızı firecrawl.dev\'den alın', + }, + stepOne: { + filePreview: 'Dosya Önizleme', + pagePreview: 'Sayfa Önizleme', + dataSourceType: { + file: 'Dosyadan içe aktar', + notion: 'Notion\'dan senkronize et', + web: 'Web sitesinden senkronize et', + }, + uploader: { + title: 'Dosya yükle', + button: 'Dosyayı sürükleyip bırakın veya', + browse: 'Göz atın', + tip: 'Destekler {{supportTypes}}. Her biri en fazla {{size}}MB.', + validation: { + typeError: 'Dosya tipi desteklenmiyor', + size: 'Dosya çok büyük. Maksimum {{size}} MB', + count: 'Birden fazla dosya desteklenmiyor', + filesNumber: 'Toplu yükleme sınırına ulaştınız, {{filesNumber}} dosya.', + }, + cancel: 'İptal', + change: 'Değiştir', + failed: 'Yükleme başarısız', + }, + notionSyncTitle: 'Notion bağlı değil', + notionSyncTip: 'Notion ile senkronize etmek için önce Notion\'a bağlanılmalıdır.', + connect: 'Bağlanmaya git', + button: 'Sonraki', + emptyDatasetCreation: 'Boş bir bilgi oluşturmak istiyorum', + modal: { + title: 'Boş bir bilgi oluştur', + tip: 'Boş bir bilgi hiçbir belge içermeyecektir ve dilediğiniz zaman belge yükleyebilirsiniz.', + input: 'Bilgi adı', + placeholder: 'Lütfen girin', + nameNotEmpty: 'Ad boş olamaz', + nameLengthInvaild: 'Ad 1 ile 40 karakter arasında olmalıdır', + cancelButton: 'İptal', + confirmButton: 'Oluştur', + failed: 'Oluşturma başarısız', + }, + website: { + fireCrawlNotConfigured: 'Firecrawl yapılandırılmamış', + fireCrawlNotConfiguredDescription: 'Firecrawl\'ı kullanmak için API anahtarı ile yapılandırın.', + configure: 'Yapılandır', + run: 'Çalıştır', + firecrawlTitle: '🔥Firecrawl ile web içeriğini çıkarın', + firecrawlDoc: 'Firecrawl dokümanları', + firecrawlDocLink: 'https://docs.dify.ai/guides/knowledge-base/sync-from-website', + options: 'Seçenekler', + crawlSubPage: 'Alt sayfaları tarayın', + limit: 'Sınır', + maxDepth: 'Maksimum derinlik', + excludePaths: 'Yolları hariç tut', + includeOnlyPaths: 'Yalnızca yolları dahil et', + extractOnlyMainContent: 'Sadece ana içeriği çıkar (başlıklar, navigasyonlar, altbilgiler vb. yok)', + exceptionErrorTitle: 'Firecrawl işi çalıştırılırken bir istisna meydana geldi:', + unknownError: 'Bilinmeyen hata', + totalPageScraped: 'Toplam kazınan sayfa:', + selectAll: 'Hepsini Seç', + resetAll: 'Hepsini Sıfırla', + scrapTimeInfo: 'Toplam {{total}} sayfa {{time}}s içinde kazındı', + preview: 'Önizleme', + maxDepthTooltip: 'Girilen URL\'ye göre tarama için maksimum derinlik. Derinlik 0 sadece girilen url sayfasını kazır, derinlik 1 url ve girilen URL + bir / \'dan sonraki her şeyi kazır ve böyle devam eder.', + }, + }, + stepTwo: { + segmentation: 'Parçalanma ayarları', + auto: 'Otomatik', + autoDescription: 'Parçalanma ve ön işleme kurallarını otomatik olarak ayarlayın. Bilgisiz kullanıcıların bunu seçmesi önerilir.', + custom: 'Özel', + customDescription: 'Parçalanma kurallarını, parçalanma uzunluğunu ve ön işleme kurallarını kişiselleştirin.', + separator: 'Parçalanma belirleyicisi', + separatorPlaceholder: 'Örneğin, yeni satır (\\\\n) veya özel ayırıcı (örn. "***")', + maxLength: 'Maksimum parça uzunluğu', + overlap: 'Parça örtüşmesi', + overlapTip: 'Parça örtüşmesini ayarlamak, aralarındaki anlamsal bağı koruyabilir, geri alım etkisini artırır. Maksimum parça boyutunun %10-%25\'ini ayarlamanız önerilir.', + overlapCheck: 'parça örtüşmesi maksimum parça uzunluğundan büyük olmamalıdır', + rules: 'Metin ön işleme kuralları', + removeExtraSpaces: 'Art arda gelen boşlukları, yeni satırları ve sekmeleri değiştirin', + removeUrlEmails: 'Tüm URL\'leri ve e-posta adreslerini silin', + removeStopwords: '"a", "an", "the" gibi durdurma kelimelerini silin', + preview: 'Onayla ve Önizleme', + reset: 'Sıfırla', + indexMode: 'Dizin modu', + qualified: 'Yüksek Kalite', + recommend: 'Önerilen', + qualifiedTip: 'Kullanıcılar sorguladığında daha yüksek doğruluk sağlamak için varsayılan sistem yerleştirme arayüzünü çağırır.', + warning: 'Lütfen önce model sağlayıcı API anahtarını ayarlayın.', + click: 'Ayarlara git', + economical: 'Ekonomik', + economicalTip: 'Doğruluğu azaltmak için çevrimdışı vektör motorlarını, anahtar kelime dizinlerini vb. kullanın, token harcamadan', + QATitle: 'Soru ve Yanıt formatında parçalama', + QATip: 'Bu seçeneği etkinleştirmek daha fazla token tüketecektir', + QALanguage: 'Kullanarak parçalara ayır', + emstimateCost: 'Tahmin', + emstimateSegment: 'Tahmini parçalar', + segmentCount: 'parçalar', + calculating: 'Hesaplanıyor...', + fileSource: 'Belgeleri ön işleme', + notionSource: 'Sayfaları ön işleme', + websiteSource: 'Web sitesini ön işleme', + other: 've diğer', + fileUnit: ' dosyalar', + notionUnit: ' sayfalar', + webpageUnit: ' sayfalar', + previousStep: 'Önceki adım', + nextStep: 'Kaydet ve İşle', + save: 'Kaydet ve İşle', + cancel: 'İptal', + sideTipTitle: 'Neden parçalanma ve ön işleme?', + sideTipP1: 'Metin verileri işlerken, parçalama ve temizleme iki önemli ön işleme adımıdır.', + sideTipP2: 'Parçalanma, uzun metinleri paragraflara böler, böylece modeller daha iyi anlayabilir. Bu, model sonuçlarının kalitesini ve alaka düzeyini artırır.', + sideTipP3: 'Temizleme, gereksiz karakterleri ve formatları kaldırarak Bilginin daha temiz ve daha kolay analiz edilmesini sağlar.', + sideTipP4: 'Uygun parçalama ve temizleme, model performansını iyileştirir, daha doğru ve değerli sonuçlar sağlar.', + previewTitle: 'Önizleme', + previewTitleButton: 'Önizleme', + previewButton: 'Q&A formatına geçiş', + previewSwitchTipStart: 'Geçerli parça önizlemesi metin formatındadır, soru ve yanıt formatına geçiş ek tüketir', + previewSwitchTipEnd: 'token', + characters: 'karakterler', + indexSettedTip: 'Dizin yöntemini değiştirmek için, lütfen', + retrivalSettedTip: 'Dizin yöntemini değiştirmek için, lütfen', + datasetSettingLink: 'Bilgi ayarlarına gidin.', + }, + stepThree: { + creationTitle: '🎉 Bilgi oluşturuldu', + creationContent: 'Bilginin adını otomatik olarak belirledik, dilediğiniz zaman değiştirebilirsiniz', + label: 'Bilgi adı', + additionTitle: '🎉 Belge yüklendi', + additionP1: 'Belge Bilgi\'ye yüklendi', + additionP2: ', bilgi listesinden bulabilirsiniz.', + stop: 'İşlemeyi durdur', + resume: 'İşlemeye devam et', + navTo: 'Belgeye git', + sideTipTitle: 'Sırada ne var', + sideTipContent: 'Belge dizine ekleme işlemi bittikten sonra Bilgi, bağlam olarak uygulamaya entegre edilebilir. Prompt düzenleme sayfasında bağlam ayarlarını bulabilirsiniz. Ayrıca bağımsız bir ChatGPT dizinleme eklentisi olarak yayınlamak için de oluşturabilirsiniz.', + modelTitle: 'Yerleştirmeyi durdurmak istediğinize emin misiniz?', + modelContent: 'İşlemeye daha sonra devam etmeniz gerekirse, kaldığınız yerden devam edeceksiniz.', + modelButtonConfirm: 'Onayla', + modelButtonCancel: 'İptal', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/dataset-documents.ts b/web/i18n/tr-TR/dataset-documents.ts new file mode 100644 index 0000000000..efe5186306 --- /dev/null +++ b/web/i18n/tr-TR/dataset-documents.ts @@ -0,0 +1,351 @@ +const translation = { + list: { + title: 'Belgeler', + desc: 'Bilginin tüm dosyaları burada gösterilir ve Bilginin tamamı Dify alıntılarına veya Sohbet eklentisi üzerinden dizine eklenebilir.', + addFile: 'Dosya Ekle', + addPages: 'Sayfa Ekle', + addUrl: 'URL Ekle', + table: { + header: { + fileName: 'DOSYA ADI', + words: 'KELİMELER', + hitCount: 'GERİ ALIM SAYISI', + uploadTime: 'YÜKLEME ZAMANI', + status: 'DURUM', + action: 'EYLEM', + }, + rename: 'Yeniden Adlandır', + name: 'Ad', + }, + action: { + uploadFile: 'Yeni dosya yükle', + settings: 'Segment ayarları', + addButton: 'Parça ekle', + add: 'Bir parça ekle', + batchAdd: 'Toplu ekle', + archive: 'Arşivle', + unarchive: 'Arşivden Çıkar', + delete: 'Sil', + enableWarning: 'Arşivlenmiş dosya etkinleştirilemez', + sync: 'Senkronize et', + }, + index: { + enable: 'Etkinleştir', + disable: 'Devre Dışı Bırak', + all: 'Hepsi', + enableTip: 'Dosya dizine eklenebilir', + disableTip: 'Dosya dizine eklenemez', + }, + status: { + queuing: 'Kuyrukta', + indexing: 'Dizine Ekleniyor', + paused: 'Durduruldu', + error: 'Hata', + available: 'Kullanılabilir', + enabled: 'Etkin', + disabled: 'Devre Dışı', + archived: 'Arşivlendi', + }, + empty: { + title: 'Henüz belge yok', + upload: { + tip: 'Dosya yükleyebilir, web sitesinden veya Notion, GitHub gibi web uygulamalarından senkronize edebilirsiniz.', + }, + sync: { + tip: 'Dify, Notion\'dan periyodik olarak dosyaları indirir ve işlemeyi tamamlar.', + }, + }, + delete: { + title: 'Silmek istediğinize emin misiniz?', + content: 'İşlemeye daha sonra devam etmeniz gerekirse, kaldığınız yerden devam edeceksiniz', + }, + batchModal: { + title: 'Toplu parçalar ekle', + csvUploadTitle: 'CSV dosyanızı buraya sürükleyip bırakın ya da ', + browse: 'göz atın', + tip: 'CSV dosyası şu yapıya uygun olmalıdır:', + question: 'soru', + answer: 'cevap', + contentTitle: 'parça içeriği', + content: 'içerik', + template: 'Şablonu buradan indir', + cancel: 'İptal', + run: 'Toplu İşlemi Çalıştır', + runError: 'Toplu işlem başarısız oldu', + processing: 'Toplu işlemde', + completed: 'İçe aktarma tamamlandı', + error: 'İçe Aktarma Hatası', + ok: 'Tamam', + }, + }, + metadata: { + title: 'Meta Veri', + desc: 'Belgeler için meta veri etiketleme, AI\'ın bunlara zamanında erişmesini sağlar ve kullanıcılar için referansların kaynağını ortaya çıkarır.', + dateTimeFormat: 'MMMM D, YYYY ss:dd ÖÖ/ÖS', + docTypeSelectTitle: 'Lütfen bir belge türü seçin', + docTypeChangeTitle: 'Belge türünü değiştir', + docTypeSelectWarning: 'Belge türü değiştirilirse, şimdi doldurulan meta veriler artık korunmayacaktır', + firstMetaAction: 'Hadi başlayalım', + placeholder: { + add: 'Ekle ', + select: 'Seç ', + }, + source: { + upload_file: 'Dosya Yükle', + notion: 'Notion\'dan Senkronize Et', + github: 'GitHub\'dan Senkronize Et', + }, + type: { + book: 'Kitap', + webPage: 'Web Sayfası', + paper: 'Makale', + socialMediaPost: 'Sosyal Medya Paylaşımı', + personalDocument: 'Kişisel Belge', + businessDocument: 'İş Belgesi', + IMChat: 'IM Sohbet', + wikipediaEntry: 'Wikipedia Girişi', + notion: 'Notion\'dan Senkronize Et', + github: 'GitHub\'dan Senkronize Et', + technicalParameters: 'Teknik Parametreler', + }, + field: { + processRule: { + processDoc: 'Belgeyi İşle', + segmentRule: 'Parça Kuralı', + segmentLength: 'Parça Uzunluğu', + processClean: 'Metin İşleme Temizliği', + }, + book: { + title: 'Başlık', + language: 'Dil', + author: 'Yazar', + publisher: 'Yayıncı', + publicationDate: 'Yayın Tarihi', + ISBN: 'ISBN', + category: 'Kategori', + }, + webPage: { + title: 'Başlık', + url: 'URL', + language: 'Dil', + authorPublisher: 'Yazar/Yayıncı', + publishDate: 'Yayın Tarihi', + topicsKeywords: 'Konular/Anahtar Kelimeler', + description: 'Açıklama', + }, + paper: { + title: 'Başlık', + language: 'Dil', + author: 'Yazar', + publishDate: 'Yayın Tarihi', + journalConferenceName: 'Dergi/Konferans Adı', + volumeIssuePage: 'Cilt/Sayı/Sayfa', + DOI: 'DOI', + topicsKeywords: 'Konular/Anahtar Kelimeler', + abstract: 'Özet', + }, + socialMediaPost: { + platform: 'Platform', + authorUsername: 'Yazar/Kullanıcı adı', + publishDate: 'Yayın Tarihi', + postURL: 'Gönderi URL\'si', + topicsTags: 'Konular/Etiketler', + }, + personalDocument: { + title: 'Başlık', + author: 'Yazar', + creationDate: 'Oluşturma Tarihi', + lastModifiedDate: 'Son Değiştirme Tarihi', + documentType: 'Belge Türü', + tagsCategory: 'Etiketler/Kategori', + }, + businessDocument: { + title: 'Başlık', + author: 'Yazar', + creationDate: 'Oluşturma Tarihi', + lastModifiedDate: 'Son Değiştirme Tarihi', + documentType: 'Belge Türü', + departmentTeam: 'Bölüm/Takım', + }, + IMChat: { + chatPlatform: 'Sohbet Platformu', + chatPartiesGroupName: 'Sohbet Tarafları/Grup Adı', + participants: 'Katılımcılar', + startDate: 'Başlangıç Tarihi', + endDate: 'Bitiş Tarihi', + topicsKeywords: 'Konular/Anahtar Kelimeler', + fileType: 'Dosya Türü', + }, + wikipediaEntry: { + title: 'Başlık', + language: 'Dil', + webpageURL: 'Web Sayfası URL\'si', + editorContributor: 'Editör/Katılımcı', + lastEditDate: 'Son Düzenleme Tarihi', + summaryIntroduction: 'Özet/Giriş', + }, + notion: { + title: 'Başlık', + language: 'Dil', + author: 'Yazar', + createdTime: 'Oluşturulma Zamanı', + lastModifiedTime: 'Son Değiştirilme Zamanı', + url: 'URL', + tag: 'Etiket', + description: 'Açıklama', + }, + github: { + repoName: 'Depo Adı', + repoDesc: 'Depo Açıklaması', + repoOwner: 'Depo Sahibi', + fileName: 'Dosya Adı', + filePath: 'Dosya Yolu', + programmingLang: 'Programlama Dili', + url: 'URL', + license: 'Lisans', + lastCommitTime: 'Son Commit Zamanı', + lastCommitAuthor: 'Son Commit Yazar', + }, + originInfo: { + originalFilename: 'Orijinal dosya adı', + originalFileSize: 'Orijinal dosya boyutu', + uploadDate: 'Yükleme tarihi', + lastUpdateDate: 'Son güncelleme tarihi', + source: 'Kaynak', + }, + technicalParameters: { + segmentSpecification: 'Parçalar spesifikasyonu', + segmentLength: 'Parçalar uzunluğu', + avgParagraphLength: 'Ort. paragraf uzunluğu', + paragraphs: 'Paragraflar', + hitCount: 'Geri alım sayısı', + embeddingTime: 'Yerleştirme zamanı', + embeddedSpend: 'Yerleştirme harcaması', + }, + }, + languageMap: { + zh: 'Çince', + en: 'İngilizce', + es: 'İspanyolca', + fr: 'Fransızca', + de: 'Almanca', + ja: 'Japonca', + ko: 'Korece', + ru: 'Rusça', + ar: 'Arapça', + pt: 'Portekizce', + it: 'İtalyanca', + nl: 'Flemenkçe', + pl: 'Lehçe', + sv: 'İsveççe', + tr: 'Türkçe', + he: 'İbranice', + hi: 'Hintçe', + da: 'Danca', + fi: 'Fince', + no: 'Norveççe', + hu: 'Macarca', + el: 'Yunanca', + cs: 'Çekçe', + th: 'Tayca', + id: 'Endonezce', + }, + categoryMap: { + book: { + fiction: 'Kurgu', + biography: 'Biyografi', + history: 'Tarih', + science: 'Bilim', + technology: 'Teknoloji', + education: 'Eğitim', + philosophy: 'Felsefe', + religion: 'Din', + socialSciences: 'Sosyal Bilimler', + art: 'Sanat', + travel: 'Gezi', + health: 'Sağlık', + selfHelp: 'Kişisel Gelişim', + businessEconomics: 'İş ve Ekonomi', + cooking: 'Yemek', + childrenYoungAdults: 'Çocuk ve Genç Yetişkin', + comicsGraphicNovels: 'Çizgi Roman ve Grafik Roman', + poetry: 'Şiir', + drama: 'Drama', + other: 'Diğer', + }, + personalDoc: { + notes: 'Notlar', + blogDraft: 'Blog Taslağı', + diary: 'Günlük', + researchReport: 'Araştırma Raporu', + bookExcerpt: 'Kitap Alıntısı', + schedule: 'Takvim', + list: 'Liste', + projectOverview: 'Proje Genel Bakış', + photoCollection: 'Fotoğraf Koleksiyonu', + creativeWriting: 'Yaratıcı Yazma', + codeSnippet: 'Kod Parçacığı', + designDraft: 'Tasarım Taslağı', + personalResume: 'Kişisel Özgeçmiş', + other: 'Diğer', + }, + businessDoc: { + meetingMinutes: 'Toplantı Tutanakları', + researchReport: 'Araştırma Raporu', + proposal: 'Teklif', + employeeHandbook: 'Çalışan El Kitabı', + trainingMaterials: 'Eğitim Materyalleri', + requirementsDocument: 'Gereksinim Dokümanı', + designDocument: 'Tasarım Dokümanı', + productSpecification: 'Ürün Spesifikasyonu', + financialReport: 'Mali Rapor', + marketAnalysis: 'Pazar Analizi', + projectPlan: 'Proje Planı', + teamStructure: 'Takım Yapısı', + policiesProcedures: 'Politikalar ve Prosedürler', + contractsAgreements: 'Sözleşmeler ve Anlaşmalar', + emailCorrespondence: 'E-posta Yazışmaları', + other: 'Diğer', + }, + }, + }, + embedding: { + processing: 'Yerleştirme işlemi...', + paused: 'Yerleştirme duraklatıldı', + completed: 'Yerleştirme tamamlandı', + error: 'Yerleştirme hatası', + docName: 'Belgeler işleniyor', + mode: 'Segmentasyon kuralı', + segmentLength: 'Parçalar uzunluğu', + textCleaning: 'Metin önişleme ve temizlik', + segments: 'Paragraflar', + highQuality: 'Yüksek kaliteli mod', + economy: 'Ekonomik mod', + estimate: 'Tahmini tüketim', + stop: 'İşlemi durdur', + resume: 'İşleme devam et', + automatic: 'Otomatik', + custom: 'Özel', + previewTip: 'Paragraf önizlemesi yerleştirme tamamlandıktan sonra kullanılabilir olacak', + }, + segment: { + paragraphs: 'Paragraflar', + keywords: 'Anahtar Kelimeler', + addKeyWord: 'Anahtar kelime ekle', + keywordError: 'Anahtar kelimenin maksimum uzunluğu 20', + characters: 'karakter', + hitCount: 'Geri alım sayısı', + vectorHash: 'Vektör hash: ', + questionPlaceholder: 'soruyu buraya ekleyin', + questionEmpty: 'Soru boş olamaz', + answerPlaceholder: 'cevabı buraya ekleyin', + answerEmpty: 'Cevap boş olamaz', + contentPlaceholder: 'içeriği buraya ekleyin', + contentEmpty: 'İçerik boş olamaz', + newTextSegment: 'Yeni Metin Parçası', + newQaSegment: 'Yeni Soru-Cevap Parçası', + delete: 'Bu parçayı silmek istiyor musunuz?', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/dataset-hit-testing.ts b/web/i18n/tr-TR/dataset-hit-testing.ts new file mode 100644 index 0000000000..1635e3e331 --- /dev/null +++ b/web/i18n/tr-TR/dataset-hit-testing.ts @@ -0,0 +1,28 @@ +const translation = { + title: 'Geri Alım Testi', + desc: 'Verilen sorgu metnine göre Bilginin isabet etkisini test edin.', + dateTimeFormat: 'GG/AA/YYYY ss:dd ÖÖ/ÖS', + recents: 'Sonuçlar', + table: { + header: { + source: 'Kaynak', + text: 'Metin', + time: 'Zaman', + }, + }, + input: { + title: 'Kaynak metin', + placeholder: 'Bir metin girin, kısa bir bildirim cümlesi önerilir.', + countWarning: 'En fazla 200 karakter.', + indexWarning: 'Yüksek kaliteli Bilgi sadece.', + testing: 'Test Ediliyor', + }, + hit: { + title: 'GERİ ALINAN PARAGRAFLAR', + emptyTip: 'Geri Alım Testi sonuçları burada gösterilecektir', + }, + noRecentTip: 'Burada son sorgu sonuçları yok', + viewChart: 'VEKTÖR GRAFİĞİNİ GÖRÜNTÜLE', +} + +export default translation diff --git a/web/i18n/tr-TR/dataset-settings.ts b/web/i18n/tr-TR/dataset-settings.ts new file mode 100644 index 0000000000..090602e890 --- /dev/null +++ b/web/i18n/tr-TR/dataset-settings.ts @@ -0,0 +1,35 @@ +const translation = { + title: 'Bilgi ayarları', + desc: 'Burada Bilginin özelliklerini ve çalışma yöntemlerini değiştirebilirsiniz.', + form: { + name: 'Bilgi İsmi', + namePlaceholder: 'Bilgi ismini girin', + nameError: 'İsim boş olamaz', + desc: 'Bilgi açıklaması', + descInfo: 'Lütfen Bilginin içeriğini özetlemek için net bir metinsel açıklama yazın. Bu açıklama, çıkarım için birden fazla Bilgi arasından seçim yaparken eşleştirme temeli olarak kullanılacaktır.', + descPlaceholder: 'Bu Bilginin içeriğini açıklayın. Ayrıntılı bir açıklama, AI\'nın Bilginin içeriğine zamanında erişmesini sağlar. Boş bırakılırsa, Dify varsayılan isabet stratejisini kullanır.', + descWrite: 'İyi bir Bilgi açıklamasının nasıl yazılacağını öğrenin.', + permissions: 'İzinler', + permissionsOnlyMe: 'Sadece ben', + permissionsAllMember: 'Tüm takım üyeleri', + permissionsInvitedMembers: 'Bazı takım üyeleri', + me: '(Siz)', + indexMethod: 'Dizin Yöntemi', + indexMethodHighQuality: 'Yüksek Kalite', + indexMethodHighQualityTip: 'Kullanıcılar sorguladığında daha yüksek doğruluk sağlamak için Yerleştirme modelini çağırır.', + indexMethodEconomy: 'Ekonomik', + indexMethodEconomyTip: 'Doğruluğu azaltmak için çevrimdışı vektör motorları, anahtar kelime dizinleri vb. kullanın, token harcamadan', + embeddingModel: 'Yerleştirme Modeli', + embeddingModelTip: 'Yerleştirme modelini değiştirmek için, lütfen ', + embeddingModelTipLink: 'Ayarlar\'a gidin', + retrievalSetting: { + title: 'Geri Alım Ayarı', + learnMore: 'Daha fazla bilgi edinin', + description: ' geri alım yöntemi hakkında.', + longDescription: ' geri alım yöntemi hakkında, bunu Bilgi ayarlarında istediğiniz zaman değiştirebilirsiniz.', + }, + save: 'Kaydet', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/dataset.ts b/web/i18n/tr-TR/dataset.ts new file mode 100644 index 0000000000..68bd5860bb --- /dev/null +++ b/web/i18n/tr-TR/dataset.ts @@ -0,0 +1,73 @@ +const translation = { + knowledge: 'Bilgi', + documentCount: ' belge', + wordCount: ' k kelime', + appCount: ' bağlı uygulamalar', + createDataset: 'Bilgi Oluştur', + createDatasetIntro: 'Kendi metin verilerinizi içe aktarın veya Webhook aracılığıyla gerçek zamanlı olarak veri yazın, LLM bağlamını geliştirin.', + deleteDatasetConfirmTitle: 'Bu Bilgi\'yi silmek istiyor musunuz?', + deleteDatasetConfirmContent: + 'Bilginin silinmesi geri alınamaz. Kullanıcılar artık Bilginize erişemeyecek ve tüm prompt yapılandırmaları ve günlükler kalıcı olarak silinecektir.', + datasetUsedByApp: 'Bilgi bazı uygulamalar tarafından kullanılıyor. Uygulamalar artık bu Bilgiyi kullanamayacak ve tüm prompt yapılandırmaları ve günlükler kalıcı olarak silinecektir.', + datasetDeleted: 'Bilgi silindi', + datasetDeleteFailed: 'Bilgi silinemedi', + didYouKnow: 'Biliyor muydunuz?', + intro1: 'Bilgi, Dify uygulamasına ', + intro2: 'bağlam olarak', + intro3: ' entegre edilebilir,', + intro4: 'veya ', + intro5: 'bağımsız bir ChatGPT dizin eklentisi olarak oluşturulabilir', + intro6: ' ve yayınlanabilir.', + unavailable: 'Kullanılamıyor', + unavailableTip: 'Yerleştirme modeli mevcut değil, varsayılan yerleştirme modelinin yapılandırılması gerekiyor', + datasets: 'BİLGİ', + datasetsApi: 'API ERİŞİMİ', + retrieval: { + semantic_search: { + title: 'Vektör Arama', + description: 'Sorgu yerleştirmelerini oluşturun ve vektör temsiline en benzeyen metin parçasını arayın.', + }, + full_text_search: { + title: 'Tam Metin Arama', + description: 'Belgelerdeki tüm terimleri dizinleyerek, kullanıcıların herhangi bir terimi aramasına ve bu terimleri içeren ilgili metin parçasını geri almasına olanak tanır.', + }, + hybrid_search: { + title: 'Hibrit Arama', + description: 'Tam metin arama ve vektör aramalarını aynı anda çalıştırın, kullanıcı sorgusu için en iyi eşleşmeyi seçmek için yeniden sıralayın. Kullanıcılar ağırlıklar ayarlayabilir veya bir Yeniden Sıralama modeli yapılandırabilir.', + recommend: 'Önerilir', + }, + invertedIndex: { + title: 'Ters Dizine Kayıt', + description: 'Ters Dizine Kayıt, verimli geri alım için kullanılan bir yapıdır. Terimlere göre düzenlenir ve her terim, onu içeren belgelere veya web sayfalarına işaret eder.', + }, + change: 'Değiştir', + changeRetrievalMethod: 'Geri alma yöntemini değiştir', + }, + docsFailedNotice: 'belgeler dizine eklenemedi', + retry: 'Yeniden Dene', + indexingTechnique: { + high_quality: 'Yüksek Kalite', + economy: 'Ekonomi', + }, + indexingMethod: { + semantic_search: 'VEKTÖR', + full_text_search: 'TAM METİN', + hybrid_search: 'HİBRİT', + }, + mixtureHighQualityAndEconomicTip: 'Yüksek kaliteli ve ekonomik bilgi tabanlarının karışımı için Yeniden Sıralama modeli gereklidir.', + inconsistentEmbeddingModelTip: 'Seçilen bilgi tabanlarının Yerleştirme modelleri tutarsızsa Yeniden Sıralama modeli gereklidir.', + retrievalSettings: 'Geri Alım Ayarı', + rerankSettings: 'Yeniden Sıralama Ayarı', + weightedScore: { + title: 'Ağırlıklı Puan', + description: 'Verilen ağırlıkları ayarlayarak bu yeniden sıralama stratejisi, anlamsal mı yoksa anahtar kelime eşleştirmesini mi önceliklendireceğini belirler.', + semanticFirst: 'Anlamsal Öncelikli', + keywordFirst: 'Anahtar Kelime Öncelikli', + customized: 'Özelleştirilmiş', + semantic: 'Anlamsal', + keyword: 'Anahtar Kelime', + }, + nTo1RetrievalLegacy: 'Geri alım stratejisinin optimizasyonu ve yükseltilmesi nedeniyle, N-to-1 geri alımı Eylül ayında resmi olarak kullanım dışı kalacaktır. O zamana kadar normal şekilde kullanabilirsiniz.', +} + +export default translation diff --git a/web/i18n/tr-TR/explore.ts b/web/i18n/tr-TR/explore.ts new file mode 100644 index 0000000000..94aa2a2bfc --- /dev/null +++ b/web/i18n/tr-TR/explore.ts @@ -0,0 +1,41 @@ +const translation = { + title: 'Keşfet', + sidebar: { + discovery: 'Keşif', + chat: 'Sohbet', + workspace: 'Çalışma Alanı', + action: { + pin: 'Sabitle', + unpin: 'Sabitlemeyi Kaldır', + rename: 'Yeniden Adlandır', + delete: 'Sil', + }, + delete: { + title: 'Uygulamayı sil', + content: 'Bu uygulamayı silmek istediğinizden emin misiniz?', + }, + }, + apps: { + title: 'Dify Tarafından Keşfet Uygulamaları', + description: 'Bu şablon uygulamalarını anında kullanın veya şablonlara dayalı kendi uygulamalarınızı özelleştirin.', + allCategories: 'Önerilen', + }, + appCard: { + addToWorkspace: 'Çalışma Alanına Ekle', + customize: 'Özelleştir', + }, + appCustomize: { + title: '{{name}} uygulamasından uygulama oluştur', + subTitle: 'Uygulama simgesi ve ismi', + nameRequired: 'Uygulama ismi gereklidir', + }, + category: { + Assistant: 'Asistan', + Writing: 'Yazma', + Translate: 'Çeviri', + Programming: 'Programlama', + HR: 'İK', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/layout.ts b/web/i18n/tr-TR/layout.ts new file mode 100644 index 0000000000..e2410dd34b --- /dev/null +++ b/web/i18n/tr-TR/layout.ts @@ -0,0 +1,3 @@ +const translation = {} + +export default translation diff --git a/web/i18n/tr-TR/login.ts b/web/i18n/tr-TR/login.ts new file mode 100644 index 0000000000..617b58be36 --- /dev/null +++ b/web/i18n/tr-TR/login.ts @@ -0,0 +1,75 @@ +const translation = { + pageTitle: 'Hey, başlayalım!👋', + welcome: 'Dify\'ye hoş geldiniz, devam etmek için lütfen giriş yapın.', + email: 'E-posta adresi', + emailPlaceholder: 'E-postanız', + password: 'Şifre', + passwordPlaceholder: 'Şifreniz', + name: 'Kullanıcı adı', + namePlaceholder: 'Kullanıcı adınız', + forget: 'Şifrenizi mi unuttunuz?', + signBtn: 'Giriş yap', + sso: 'SSO ile devam et', + installBtn: 'Kurulum', + setAdminAccount: 'Yönetici hesabı ayarlama', + setAdminAccountDesc: 'Yönetici hesabı için maksimum ayrıcalıklar, uygulama oluşturma ve LLM sağlayıcılarını yönetme gibi işlemler için kullanılabilir.', + createAndSignIn: 'Oluştur ve giriş yap', + oneMoreStep: 'Bir adım kaldı', + createSample: 'Bu bilgilere dayanarak, sizin için örnek bir uygulama oluşturacağız', + invitationCode: 'Davet Kodu', + invitationCodePlaceholder: 'Davet kodunuz', + interfaceLanguage: 'Arayüz Dili', + timezone: 'Zaman dilimi', + go: 'Dify\'ye git', + sendUsMail: 'Tanıtımınızı e-posta ile gönderin, davet talebini işleme alalım.', + acceptPP: 'Gizlilik politikasını okudum ve kabul ediyorum', + reset: 'Şifrenizi sıfırlamak için şu komutu çalıştırın', + withGitHub: 'GitHub ile devam et', + withGoogle: 'Google ile devam et', + rightTitle: 'LLM\'nin tam potansiyelini ortaya çıkarın', + rightDesc: 'Görsel olarak çekici, çalışılabilir ve iyileştirilebilir AI uygulamaları oluşturun.', + tos: 'Hizmet Şartları', + pp: 'Gizlilik Politikası', + tosDesc: 'Kaydolarak, Hizmet Şartlarımızı kabul etmiş olursunuz', + goToInit: 'Hesabı başlatmadıysanız, lütfen başlatma sayfasına gidin', + donthave: 'Sahip değil misiniz?', + invalidInvitationCode: 'Geçersiz davet kodu', + accountAlreadyInited: 'Hesap zaten başlatılmış', + forgotPassword: 'Şifrenizi mi unuttunuz?', + resetLinkSent: 'Sıfırlama bağlantısı gönderildi', + sendResetLink: 'Sıfırlama bağlantısı gönder', + backToSignIn: 'Girişe dön', + forgotPasswordDesc: 'Şifrenizi sıfırlamak için e-posta adresinizi girin. Şifrenizi nasıl sıfırlayacağınıza dair talimatları içeren bir e-posta göndereceğiz.', + checkEmailForResetLink: 'Şifrenizi sıfırlamak için bir bağlantı içeren e-postayı kontrol edin. Birkaç dakika içinde görünmezse, spam klasörünüzü kontrol ettiğinizden emin olun.', + passwordChanged: 'Şimdi giriş yapın', + changePassword: 'Şifre Değiştir', + changePasswordTip: 'Hesabınız için yeni bir şifre girin', + invalidToken: 'Geçersiz veya süresi dolmuş token', + confirmPassword: 'Şifreyi Onayla', + confirmPasswordPlaceholder: 'Yeni şifrenizi onaylayın', + passwordChangedTip: 'Şifreniz başarıyla değiştirildi', + error: { + emailEmpty: 'E-posta adresi gereklidir', + emailInValid: 'Geçerli bir e-posta adresi girin', + nameEmpty: 'İsim gereklidir', + passwordEmpty: 'Şifre gereklidir', + passwordLengthInValid: 'Şifre en az 8 karakterden oluşmalıdır', + passwordInvalid: 'Şifre harf ve rakamlardan oluşmalı ve uzunluğu 8 karakterden fazla olmalıdır', + }, + license: { + tip: 'Dify Community Edition\'ı başlatmadan önce GitHub\'daki', + link: 'Açık Kaynak Lisansını', + }, + join: 'Katıl', + joinTipStart: 'Sizi', + joinTipEnd: 'takımına davet ediyor', + invalid: 'Bağlantı süresi doldu', + explore: 'Dify\'yi Keşfet', + activatedTipStart: 'Katıldınız', + activatedTipEnd: 'takımına', + activated: 'Şimdi giriş yapın', + adminInitPassword: 'Yönetici başlangıç şifresi', + validate: 'Doğrula', +} + +export default translation diff --git a/web/i18n/tr-TR/register.ts b/web/i18n/tr-TR/register.ts new file mode 100644 index 0000000000..e2410dd34b --- /dev/null +++ b/web/i18n/tr-TR/register.ts @@ -0,0 +1,3 @@ +const translation = {} + +export default translation diff --git a/web/i18n/tr-TR/run-log.ts b/web/i18n/tr-TR/run-log.ts new file mode 100644 index 0000000000..a04f21bb4a --- /dev/null +++ b/web/i18n/tr-TR/run-log.ts @@ -0,0 +1,29 @@ +const translation = { + input: 'GİRİŞ', + result: 'SONUÇ', + detail: 'DETAY', + tracing: 'İZLEME', + resultPanel: { + status: 'DURUM', + time: 'GEÇEN ZAMAN', + tokens: 'TOPLAM TOKEN', + }, + meta: { + title: 'METADATA', + status: 'Durum', + version: 'Sürüm', + executor: 'Yürütücü', + startTime: 'Başlama Zamanı', + time: 'Geçen Zaman', + tokens: 'Toplam Token', + steps: 'Çalıştırma Adımları', + }, + resultEmpty: { + title: 'Bu çalıştırma sadece JSON formatında çıktı verdi,', + tipLeft: 'lütfen ', + link: 'detay paneli', + tipRight: 'ne gidin ve görüntüleyin.', + }, +} + +export default translation diff --git a/web/i18n/tr-TR/share-app.ts b/web/i18n/tr-TR/share-app.ts new file mode 100644 index 0000000000..4fe58a8b2b --- /dev/null +++ b/web/i18n/tr-TR/share-app.ts @@ -0,0 +1,70 @@ +const translation = { + common: { + welcome: '', + appUnavailable: 'Uygulama kullanılamıyor', + appUnkonwError: 'Uygulama kullanılamıyor', + }, + chat: { + newChat: 'Yeni sohbet', + pinnedTitle: 'Sabitlenmiş', + unpinnedTitle: 'Sohbetler', + newChatDefaultName: 'Yeni konuşma', + resetChat: 'Konuşmayı sıfırla', + powerBy: 'Tarafından desteklenmektedir', + prompt: 'Prompt', + privatePromptConfigTitle: 'Konuşma ayarları', + publicPromptConfigTitle: 'Başlangıç Promptu', + configStatusDes: 'Başlamadan önce, konuşma ayarlarını değiştirebilirsiniz', + configDisabled: 'Bu oturum için önceki oturum ayarları kullanılmıştır.', + startChat: 'Sohbete Başla', + privacyPolicyLeft: 'Lütfen okuyun', + privacyPolicyMiddle: 'gizlilik politikası', + privacyPolicyRight: 'uygulama geliştiricisi tarafından sağlanmıştır.', + deleteConversation: { + title: 'Konuşmayı sil', + content: 'Bu konuşmayı silmek istediğinize emin misiniz?', + }, + tryToSolve: 'Çözmeyi Dene', + temporarySystemIssue: 'Üzgünüz, geçici sistem sorunu.', + }, + generation: { + tabs: { + create: 'Bir Kere Çalıştır', + batch: 'Toplu Çalıştır', + saved: 'Kaydedildi', + }, + savedNoData: { + title: 'Henüz bir sonuç kaydetmediniz!', + description: 'İçerik oluşturmaya başlayın ve kaydedilen sonuçları burada bulun.', + startCreateContent: 'İçerik oluşturmayı başlat', + }, + title: 'AI Tamamlama', + queryTitle: 'Sorgu içeriği', + completionResult: 'Tamamlama sonucu', + queryPlaceholder: 'Sorgu içeriğinizi yazın...', + run: 'Çalıştır', + copy: 'Kopyala', + resultTitle: 'AI Tamamlama', + noData: 'AI burada istediğinizi size verecek.', + csvUploadTitle: 'CSV dosyanızı buraya sürükleyip bırakın ya da ', + browse: 'göz atın', + csvStructureTitle: 'CSV dosyası şu yapıya uygun olmalıdır:', + downloadTemplate: 'Şablonu buradan indir', + field: 'Alan', + batchFailed: { + info: '{{num}} başarısız işlemler', + retry: 'Yeniden dene', + outputPlaceholder: 'Çıktı içeriği yok', + }, + errorMsg: { + empty: 'Lütfen yüklenen dosyada içerik girin.', + fileStructNotMatch: 'Yüklenen CSV dosyası yapıya uymuyor.', + emptyLine: 'Satır {{rowIndex}} boş', + invalidLine: 'Satır {{rowIndex}}: {{varName}} değeri boş olamaz', + moreThanMaxLengthLine: 'Satır {{rowIndex}}: {{varName}} değeri {{maxLength}} karakterden fazla olamaz', + atLeastOne: 'Lütfen yüklenen dosyada en az bir satır girin.', + }, + }, +} + +export default translation diff --git a/web/i18n/tr-TR/tools.ts b/web/i18n/tr-TR/tools.ts new file mode 100644 index 0000000000..00af8ed7f2 --- /dev/null +++ b/web/i18n/tr-TR/tools.ts @@ -0,0 +1,153 @@ +const translation = { + title: 'Araçlar', + createCustomTool: 'Özel Araç Oluştur', + customToolTip: 'Dify özel araçları hakkında daha fazla bilgi edinin', + type: { + all: 'Hepsi', + builtIn: 'Yerleşik', + custom: 'Özel', + workflow: 'Workflow', + }, + contribute: { + line1: 'Dify\'ye ', + line2: 'araçlar eklemekle ilgileniyorum.', + viewGuide: 'Rehberi Görüntüle', + }, + author: 'Tarafından', + auth: { + unauthorized: 'Yetki Ver', + authorized: 'Yetkilendirildi', + setup: 'Kullanmak için yetkilendirmeyi ayarla', + setupModalTitle: 'Yetkilendirmeyi Ayarla', + setupModalTitleDescription: 'Kimlik bilgilerini yapılandırdıktan sonra, çalışma alanındaki tüm üyeler uygulamaları düzenlerken bu aracı kullanabilir.', + }, + includeToolNum: '{{num}} araç dahil', + addTool: 'Araç Ekle', + addToolModal: { + type: 'Tür', + category: 'Kategori', + add: 'Ekle', + added: 'Eklendi', + manageInTools: 'Araçlarda Yönet', + emptyTitle: 'Kullanılabilir workflow aracı yok', + emptyTip: 'Git "Workflow -> Araç olarak Yayınla"', + }, + createTool: { + title: 'Özel Araç Oluştur', + editAction: 'Yapılandır', + editTitle: 'Özel Aracı Düzenle', + name: 'İsim', + toolNamePlaceHolder: 'Araç ismini girin', + nameForToolCall: 'Araç çağrı adı', + nameForToolCallPlaceHolder: 'Makine tanıması için kullanılır, örneğin getCurrentWeather, list_pets', + nameForToolCallTip: 'Sadece rakamlar, harfler ve alt çizgileri destekler.', + description: 'Açıklama', + descriptionPlaceholder: 'Araç amacının kısa açıklaması, örneğin belirli bir yer için sıcaklığı al.', + schema: 'Şema', + schemaPlaceHolder: 'OpenAPI şemanızı buraya girin', + viewSchemaSpec: 'OpenAPI-Swagger Spesifikasyonunu Görüntüle', + importFromUrl: 'URL\'den İçe Aktar', + importFromUrlPlaceHolder: 'https://...', + urlError: 'Geçerli bir URL girin', + examples: 'Örnekler', + exampleOptions: { + json: 'Hava Durumu (JSON)', + yaml: 'Evcil Hayvan Mağazası (YAML)', + blankTemplate: 'Boş Şablon', + }, + availableTools: { + title: 'Kullanılabilir Araçlar', + name: 'İsim', + description: 'Açıklama', + method: 'Yöntem', + path: 'Yol', + action: 'Eylemler', + test: 'Test', + }, + authMethod: { + title: 'Yetkilendirme yöntemi', + type: 'Yetkilendirme türü', + keyTooltip: 'Http Başlığı Anahtarı, ne olduğunu bilmiyorsanız "Authorization" olarak bırakabilirsiniz veya özel bir değere ayarlayabilirsiniz', + types: { + none: 'Yok', + api_key: 'API Anahtarı', + apiKeyPlaceholder: 'API Anahtarı için HTTP başlık adı', + apiValuePlaceholder: 'API Anahtarını girin', + }, + key: 'Anahtar', + value: 'Değer', + }, + authHeaderPrefix: { + title: 'Yetki Türü', + types: { + basic: 'Temel', + bearer: 'Bearer', + custom: 'Özel', + }, + }, + privacyPolicy: 'Gizlilik politikası', + privacyPolicyPlaceholder: 'Gizlilik politikasını girin', + toolInput: { + title: 'Araç Girişi', + name: 'İsim', + required: 'Gerekli', + method: 'Yöntem', + methodSetting: 'Ayar', + methodSettingTip: 'Kullanıcı araç yapılandırmasını doldurur', + methodParameter: 'Parametre', + methodParameterTip: 'Çıkarım sırasında LLM tarafından doldurulur', + label: 'Etiketler', + labelPlaceholder: 'Etiketleri seç (isteğe bağlı)', + description: 'Açıklama', + descriptionPlaceholder: 'Parametrenin anlamının açıklaması', + }, + customDisclaimer: 'Özel feragatname', + customDisclaimerPlaceholder: 'Özel feragatnameyi girin', + confirmTitle: 'Kaydetmek için onaylıyor musunuz?', + confirmTip: 'Bu aracı kullanan uygulamalar etkilenecek', + deleteToolConfirmTitle: 'Bu Aracı silmek istiyor musunuz?', + deleteToolConfirmContent: 'Aracın silinmesi geri alınamaz. Kullanıcılar artık aracınıza erişemeyecek.', + }, + test: { + title: 'Test', + parametersValue: 'Parametreler ve Değer', + parameters: 'Parametreler', + value: 'Değer', + testResult: 'Test Sonuçları', + testResultPlaceholder: 'Test sonucu burada gösterilecektir', + }, + thought: { + using: 'Kullanılıyor', + used: 'Kullanıldı', + requestTitle: 'İstek', + responseTitle: 'Yanıt', + }, + setBuiltInTools: { + info: 'Bilgi', + setting: 'Ayar', + toolDescription: 'Araç açıklaması', + parameters: 'parametreler', + string: 'string', + number: 'numara', + required: 'Gerekli', + infoAndSetting: 'Bilgi ve Ayarlar', + }, + noCustomTool: { + title: 'Özel araç yok!', + content: 'AI uygulamaları oluşturmak için özel araçlarınızı buraya ekleyin ve yönetin.', + createTool: 'Araç Oluştur', + }, + noSearchRes: { + title: 'Üzgünüz, sonuç bulunamadı!', + content: 'Aramanızla eşleşen araçlar bulamadık.', + reset: 'Aramayı Sıfırla', + }, + builtInPromptTitle: 'Prompt', + toolRemoved: 'Araç kaldırıldı', + notAuthorized: 'Araç yetkilendirilmedi', + howToGet: 'Nasıl alınır', + openInStudio: 'Studyoda Aç', + toolNameUsageTip: 'Agent akıl yürütme ve prompt için araç çağrı adı', +} + +export default translation diff --git a/web/i18n/tr-TR/workflow.ts b/web/i18n/tr-TR/workflow.ts new file mode 100644 index 0000000000..ff950a1122 --- /dev/null +++ b/web/i18n/tr-TR/workflow.ts @@ -0,0 +1,499 @@ +const translation = { + common: { + undo: 'Geri Al', + redo: 'Yinele', + editing: 'Düzenleme', + autoSaved: 'Otomatik Kaydedildi', + unpublished: 'Yayınlanmamış', + published: 'Yayınlandı', + publish: 'Yayınla', + update: 'Güncelle', + run: 'Çalıştır', + running: 'Çalışıyor', + inRunMode: 'Çalıştırma Modunda', + inPreview: 'Ön İzlemede', + inPreviewMode: 'Önizleme Modunda', + preview: 'Önizleme', + viewRunHistory: 'Çalıştırma geçmişini görüntüle', + runHistory: 'Çalıştırma Geçmişi', + goBackToEdit: 'Editöre geri dön', + conversationLog: 'Konuşma Günlüğü', + features: 'Özellikler', + debugAndPreview: 'Önizleme', + restart: 'Yeniden Başlat', + currentDraft: 'Geçerli Taslak', + currentDraftUnpublished: 'Mevcut Taslak Yayınlanmamış', + latestPublished: 'Son Yayınlanan', + publishedAt: 'Yayınlandı', + restore: 'Geri Yükle', + runApp: 'Uygulamayı Çalıştır', + batchRunApp: 'Toplu Uygulama Çalıştır', + accessAPIReference: 'API Referansına Eriş', + embedIntoSite: 'Siteye Göm', + addTitle: 'Başlık ekle...', + addDescription: 'Açıklama ekle...', + noVar: 'Değişken yok', + searchVar: 'Değişkeni ara', + variableNamePlaceholder: 'Değişken adı', + setVarValuePlaceholder: 'Değişkeni ayarla', + needConnecttip: 'Bu adım hiçbir şeye bağlı değil', + maxTreeDepth: 'Her dal için maksimum {{depth}} düğüm limiti', + needEndNode: 'Son blok eklenmelidir', + needAnswerNode: 'Yanıt bloğu eklenmelidir', + workflowProcess: 'Workflow Süreci', + notRunning: 'Henüz çalıştırılmadı', + previewPlaceholder: 'Sohbet Robotunu hata ayıklamak için aşağıdaki kutuya içerik girin', + effectVarConfirm: { + title: 'Değişkeni Kaldır', + content: 'Değişken diğer düğümlerde kullanılıyor. Yine de kaldırmak istiyor musunuz?', + }, + insertVarTip: 'Hızlı eklemek için \'/\' tuşuna basın', + processData: 'Veriyi İşle', + input: 'Girdi', + output: 'Çıktı', + jinjaEditorPlaceholder: 'Değişken eklemek için \'/\' veya \'{\' yazın', + viewOnly: 'Sadece Görüntüleme', + showRunHistory: 'Çalıştırma Geçmişini Göster', + enableJinja: 'Jinja şablon desteğini etkinleştir', + learnMore: 'Daha Fazla Bilgi', + copy: 'Kopyala', + duplicate: 'Çoğalt', + addBlock: 'Blok Ekle', + pasteHere: 'Buraya Yapıştır', + pointerMode: 'İşaretçi Modu', + handMode: 'El Modu', + model: 'Model', + workflowAsTool: 'Araç Olarak Workflow', + configureRequired: 'Yapılandırma Gerekli', + configure: 'Yapılandır', + manageInTools: 'Araçlarda Yönet', + workflowAsToolTip: 'Workflow güncellemesinden sonra araç yeniden yapılandırması gereklidir.', + viewDetailInTracingPanel: 'Ayrıntıları görüntüle', + syncingData: 'Veriler senkronize ediliyor, birkaç saniye bekleyin.', + importDSL: 'DSL İçe Aktar', + importDSLTip: 'Geçerli taslak üzerine yazılacak. İçe aktarmadan önce workflow yedekleyin.', + backupCurrentDraft: 'Geçerli Taslağı Yedekleyin', + chooseDSL: 'DSL(yml) dosyasını seçin', + overwriteAndImport: 'Üzerine Yaz ve İçe Aktar', + importFailure: 'İçe Aktarma Başarısız', + importSuccess: 'İçe Aktarma Başarılı', + }, + env: { + envPanelTitle: 'Çevre Değişkenleri', + envDescription: 'Çevre değişkenleri özel bilgileri ve kimlik bilgilerini saklamak için kullanılabilir. Yalnızca okunabilirler ve dışa aktarım sırasında DSL dosyasından ayrılabilirler.', + envPanelButton: 'Değişken Ekle', + modal: { + title: 'Çevre Değişkeni Ekle', + editTitle: 'Çevre Değişkenini Düzenle', + type: 'Tür', + name: 'Ad', + namePlaceholder: 'env adı', + value: 'Değer', + valuePlaceholder: 'env değeri', + secretTip: 'Hassas bilgileri veya verileri tanımlamak için kullanılır, bilgi sızıntısını önlemek için DSL ayarları yapılandırılmıştır.', + }, + export: { + title: 'Gizli çevre değişkenleri dışa aktarılsın mı?', + checkbox: 'Gizli değerleri dışa aktar', + ignore: 'DSL\'yi dışa aktar', + export: 'Gizli değerlerle DSL\'yi dışa aktar', + }, + }, + changeHistory: { + title: 'Değişiklik Geçmişi', + placeholder: 'Henüz hiçbir şey değiştirmediniz', + clearHistory: 'Geçmişi Temizle', + hint: 'İpucu', + hintText: 'Düzenleme işlemleriniz, bu oturum süresince cihazınızda saklanan bir değişiklik geçmişinde izlenir. Bu tarihçesi düzenleyiciden çıktığınızda temizlenir.', + stepBackward_one: '{{count}} adım geri', + stepBackward_other: '{{count}} adım geri', + stepForward_one: '{{count}} adım ileri', + stepForward_other: '{{count}} adım ileri', + sessionStart: 'Oturum Başladı', + currentState: 'Geçerli Durum', + nodeTitleChange: 'Blok başlığı değiştirildi', + nodeDescriptionChange: 'Blok açıklaması değiştirildi', + nodeDragStop: 'Blok taşındı', + nodeChange: 'Blok değiştirildi', + nodeConnect: 'Blok bağlandı', + nodePaste: 'Blok yapıştırıldı', + nodeDelete: 'Blok silindi', + nodeAdd: 'Blok eklendi', + nodeResize: 'Blok yeniden boyutlandırıldı', + noteAdd: 'Not eklendi', + noteChange: 'Not değiştirildi', + noteDelete: 'Not silindi', + edgeDelete: 'Blok bağlantısı kesildi', + }, + errorMsg: { + fieldRequired: '{{field}} gereklidir', + authRequired: 'Yetkilendirme gereklidir', + invalidJson: '{{field}} geçersiz JSON', + fields: { + variable: 'Değişken Adı', + variableValue: 'Değişken Değeri', + code: 'Kod', + model: 'Model', + rerankModel: 'Yeniden Sıralama Modeli', + }, + invalidVariable: 'Geçersiz değişken', + }, + singleRun: { + testRun: 'Test Çalıştırma', + startRun: 'Çalıştırmayı Başlat', + running: 'Çalışıyor', + testRunIteration: 'Test Çalıştırma Yineleme', + back: 'Geri', + iteration: 'Yineleme', + }, + tabs: { + 'searchBlock': 'Blok ara', + 'blocks': 'Bloklar', + 'tools': 'Araçlar', + 'allTool': 'Hepsi', + 'builtInTool': 'Yerleşik', + 'customTool': 'Özel', + 'workflowTool': 'Workflow', + 'question-understand': 'Soruyu Anlama', + 'logic': 'Mantık', + 'transform': 'Dönüştür', + 'utilities': 'Yardımcı Araçlar', + 'noResult': 'Eşleşen bulunamadı', + }, + blocks: { + 'start': 'Başlat', + 'end': 'Son', + 'answer': 'Yanıt', + 'llm': 'LLM', + 'knowledge-retrieval': 'Bilgi Geri Alımı', + 'question-classifier': 'Soru Sınıflandırıcı', + 'if-else': 'IF/ELSE', + 'code': 'Kod', + 'template-transform': 'Şablon', + 'http-request': 'HTTP İsteği', + 'variable-assigner': 'Değişken Ata', + 'variable-aggregator': 'Değişken Toplayıcı', + 'iteration-start': 'Yineleme Başlat', + 'iteration': 'Yineleme', + 'parameter-extractor': 'Parametre Çıkarıcı', + }, + blocksAbout: { + 'start': 'Bir iş akışını başlatmak için başlangıç parametrelerini tanımlayın', + 'end': 'Bir iş akışının sonunu ve sonuç türünü tanımlayın', + 'answer': 'Bir sohbet konuşmasının yanıt içeriğini tanımlayın', + 'llm': 'Büyük dil modellerini soruları yanıtlamak veya doğal dili işlemek için çağırın', + 'knowledge-retrieval': 'Kullanıcı sorularıyla ilgili metin içeriğini Bilgi\'den sorgulamanıza olanak tanır', + 'question-classifier': 'Kullanıcı sorularının sınıflandırma koşullarını tanımlayın, LLM sınıflandırma açıklamasına dayalı olarak konuşmanın nasıl ilerleyeceğini tanımlayabilir', + 'if-else': 'İş akışını if/else koşullarına göre iki dala ayırmanızı sağlar', + 'code': 'Özel mantığı uygulamak için bir Python veya NodeJS kod parçası yürütün', + 'template-transform': 'Jinja şablon sözdizimini kullanarak verileri stringe dönüştürün', + 'http-request': 'HTTP protokolü üzerinden sunucu isteklerinin gönderilmesine izin verin', + 'variable-assigner': 'Çoklu dal değişkenlerini tek bir değişkende toplayın ve sonraki düğümler için birleşik bir yapılandırma sağlayın.', + 'variable-aggregator': 'Çoklu dal değişkenlerini tek bir değişkende toplayın ve sonraki düğümler için birleşik bir yapılandırma sağlayın.', + 'iteration': 'Bir liste nesnesinde birden fazla adım gerçekleştirir ve tüm sonuçlar çıkana kadar devam eder.', + 'parameter-extractor': 'Aracı çağırmak veya HTTP istekleri için doğal dilden yapılandırılmış parametreler çıkarmak için LLM kullanın.', + }, + operator: { + zoomIn: 'Yakınlaştır', + zoomOut: 'Uzaklaştır', + zoomTo50: '%50 Yakınlaştır', + zoomTo100: '%100 Yakınlaştır', + zoomToFit: 'Sığdıracak Şekilde Yakınlaştır', + }, + panel: { + userInputField: 'Kullanıcı Giriş Alanı', + changeBlock: 'Blok Değiştir', + helpLink: 'Yardım Linki', + about: 'Hakkında', + createdBy: 'Oluşturan: ', + nextStep: 'Sonraki Adım', + addNextStep: 'Bu iş akışında sonraki bloğu ekleyin', + selectNextStep: 'Sonraki Bloğu Seç', + runThisStep: 'Bu adımı çalıştır', + checklist: 'Kontrol Listesi', + checklistTip: 'Yayınlamadan önce tüm sorunların çözüldüğünden emin olun', + checklistResolved: 'Tüm sorunlar çözüldü', + organizeBlocks: 'Blokları Düzenle', + change: 'Değiştir', + }, + nodes: { + common: { + outputVars: 'Çıktı Değişkenleri', + insertVarTip: 'Değişken Ekle', + memory: { + memory: 'Bellek', + memoryTip: 'Sohbet belleği ayarları', + windowSize: 'Pencere Boyutu', + conversationRoleName: 'Konuşma Rol Adı', + user: 'Kullanıcı ön eki', + assistant: 'Asistan ön eki', + }, + memories: { + title: 'Bellekler', + tip: 'Sohbet belleği', + builtIn: 'Yerleşik', + }, + }, + start: { + required: 'gerekli', + inputField: 'Giriş Alanı', + builtInVar: 'Yerleşik Değişkenler', + outputVars: { + query: 'Kullanıcı girişi', + memories: { + des: 'Konuşma geçmişi', + type: 'mesaj türü', + content: 'mesaj içeriği', + }, + files: 'Dosya listesi', + }, + noVarTip: 'İş Akışında kullanılabilecek girişleri ayarlayın', + }, + end: { + outputs: 'Çıktılar', + output: { + type: 'çıktı türü', + variable: 'çıktı değişkeni', + }, + type: { + 'none': 'Yok', + 'plain-text': 'Düz Metin', + 'structured': 'Yapılandırılmış', + }, + }, + answer: { + answer: 'Yanıt', + outputVars: 'Çıktı Değişkenleri', + }, + llm: { + model: 'model', + variables: 'değişkenler', + context: 'bağlam', + contextTooltip: 'Bağlam olarak Bilgi ekleyebilirsiniz', + notSetContextInPromptTip: 'Bağlam özelliğini etkinleştirmek için lütfen PROMPT içinde bağlam değişkenini doldurun.', + prompt: 'prompt', + roleDescription: { + system: 'Konuşma için üst düzey talimatlar verin', + user: 'Modele talimatlar, sorgular veya herhangi bir metin tabanlı giriş sağlayın', + assistant: 'Modelin kullanıcı mesajlarına göre verdiği yanıtlar', + }, + addMessage: 'Mesaj Ekle', + vision: 'görsel', + files: 'Dosyalar', + resolution: { + name: 'Çözünürlük', + high: 'Yüksek', + low: 'Düşük', + }, + outputVars: { + output: 'İçerik Üret', + usage: 'Model Kullanım Bilgileri', + }, + singleRun: { + variable: 'Değişken', + }, + sysQueryInUser: 'sys.query kullanıcı mesajında gereklidir', + }, + knowledgeRetrieval: { + queryVariable: 'Sorgu Değişkeni', + knowledge: 'Bilgi', + outputVars: { + output: 'Geri alınmış parça verisi', + content: 'Parça içeriği', + title: 'Parça başlığı', + icon: 'Parça simgesi', + url: 'Parça URL\'si', + metadata: 'Diğer meta veriler', + }, + }, + http: { + inputVars: 'Giriş Değişkenleri', + api: 'API', + apiPlaceholder: 'URL girin, değişken eklemek için ‘/’ tuşuna basın', + notStartWithHttp: 'API http:// veya https:// ile başlamalıdır', + key: 'Anahtar', + value: 'Değer', + bulkEdit: 'Toplu Düzenleme', + keyValueEdit: 'Anahtar-Değer Düzenleme', + headers: 'Başlıklar', + params: 'Parametreler', + body: 'Gövde', + outputVars: { + body: 'Yanıt İçeriği', + statusCode: 'Yanıt Durum Kodu', + headers: 'Yanıt Başlık Listesi JSON', + files: 'Dosya Listesi', + }, + authorization: { + 'authorization': 'Yetkilendirme', + 'authorizationType': 'Yetkilendirme Türü', + 'no-auth': 'Yok', + 'api-key': 'API Anahtarı', + 'authType': 'Yetki Türü', + 'basic': 'Temel', + 'bearer': 'Bearer', + 'custom': 'Özel', + 'api-key-title': 'API Anahtarı', + 'header': 'Başlık', + }, + insertVarPlaceholder: 'değişkeni eklemek için \'/\' yazın', + timeout: { + title: 'Zaman Aşımı', + connectLabel: 'Bağlantı Zaman Aşımı', + connectPlaceholder: 'Bağlantı zaman aşımını saniye cinsinden girin', + readLabel: 'Okuma Zaman Aşımı', + readPlaceholder: 'Okuma zaman aşımını saniye cinsinden girin', + writeLabel: 'Yazma Zaman Aşımı', + writePlaceholder: 'Yazma zaman aşımını saniye cinsinden girin', + }, + }, + code: { + inputVars: 'Giriş Değişkenleri', + outputVars: 'Çıktı Değişkenleri', + advancedDependencies: 'Gelişmiş Bağımlılıklar', + advancedDependenciesTip: 'Burada daha uzun sürede tüketilen veya varsayılan olarak yerleşik olmayan bazı ön yüklenmiş bağımlılıkları ekleyin', + searchDependencies: 'Bağımlılıkları Ara', + }, + templateTransform: { + inputVars: 'Giriş Değişkenleri', + code: 'Kod', + codeSupportTip: 'Sadece Jinja2 destekler', + outputVars: { + output: 'Dönüştürülmüş içerik', + }, + }, + ifElse: { + if: 'Eğer', + else: 'Değilse', + elseDescription: 'Eğer koşulu karşılanmadığında hangi mantığın çalıştırılması gerektiğini tanımlamak için kullanılır.', + and: 've', + or: 'veya', + operator: 'Operatör', + notSetVariable: 'Lütfen önce değişken ayarlayın', + comparisonOperator: { + 'contains': 'içerir', + 'not contains': 'içermez', + 'start with': 'ile başlar', + 'end with': 'ile biter', + 'is': 'eşittir', + 'is not': 'eşit değildir', + 'empty': 'boş', + 'not empty': 'boş değil', + 'null': 'null', + 'not null': 'null değil', + }, + enterValue: 'Değer girin', + addCondition: 'Koşul Ekle', + conditionNotSetup: 'Koşul AYARLANMADI', + selectVariable: 'Değişken seçin...', + }, + + variableAssigner: { + title: 'Değişken ata', + outputType: 'Çıktı Türü', + varNotSet: 'Değişken ayarlanmadı', + noVarTip: 'Atanacak değişkenleri ekleyin', + type: { + string: 'Metin', + number: 'Sayı', + object: 'Nesne', + array: 'Dizi', + }, + aggregationGroup: 'Toplama Grubu', + aggregationGroupTip: 'Bu özelliği etkinleştirmek, değişken toplayıcının birden fazla değişken setini toplamasına olanak tanır.', + addGroup: 'Grup Ekle', + outputVars: { + varDescribe: '{{groupName}} çıktısı', + }, + setAssignVariable: 'Atama değişkenini ayarla', + }, + tool: { + toAuthorize: 'Yetkilendirmek için', + inputVars: 'Giriş Değişkenleri', + outputVars: { + text: 'araç tarafından oluşturulan içerik', + files: { + title: 'araç tarafından oluşturulan dosyalar', + type: 'Desteklenen tür. Şu anda sadece resim destekleniyor', + transfer_method: 'Transfer yöntemi. Değer remote_url veya local_file olabilir', + url: 'Resim URL\'si', + upload_file_id: 'Yüklenen dosya kimliği', + }, + json: 'araç tarafından oluşturulan json', + }, + }, + questionClassifiers: { + model: 'model', + inputVars: 'Giriş Değişkenleri', + outputVars: { + className: 'Sınıf Adı', + }, + class: 'Sınıf', + classNamePlaceholder: 'Sınıf adınızı yazın', + advancedSetting: 'Gelişmiş Ayarlar', + topicName: 'Konu Adı', + topicPlaceholder: 'Konu adınızı yazın', + addClass: 'Sınıf Ekle', + instruction: 'Talimat', + instructionTip: 'Soru sınıflandırıcının soruları nasıl kategorize edeceğini daha iyi anlamasına yardımcı olmak için ek talimatlar girin.', + instructionPlaceholder: 'Talimatınızı yazın', + }, + parameterExtractor: { + inputVar: 'Giriş Değişkeni', + extractParameters: 'Parametreleri Çıkar', + importFromTool: 'Araçlardan içe aktar', + addExtractParameter: 'Çıkarma Parametresi Ekle', + addExtractParameterContent: { + name: 'Ad', + namePlaceholder: 'Çıkarma Parametresi Adı', + type: 'Tür', + typePlaceholder: 'Çıkarma Parametresi Türü', + description: 'Açıklama', + descriptionPlaceholder: 'Çıkarma Parametresi Açıklaması', + required: 'Gerekli', + requiredContent: 'Gerekli sadece model çıkarımı için referans olarak kullanılır ve parametre çıktısının zorunlu doğrulaması için kullanılmaz.', + }, + extractParametersNotSet: 'Çıkarma Parametreleri ayarlanmadı', + instruction: 'Talimat', + instructionTip: 'Parametre çıkarıcının parametreleri nasıl çıkaracağını anlamasına yardımcı olmak için ek talimatlar girin.', + advancedSetting: 'Gelişmiş Ayarlar', + reasoningMode: 'Akıl Yürütme Modu', + reasoningModeTip: 'Modelin fonksiyon çağırma veya istemler için talimatlara yanıt verme yeteneğine bağlı olarak uygun akıl yürütme modunu seçebilirsiniz.', + isSuccess: 'Başarılı mı. Başarılı olduğunda değer 1, başarısız olduğunda değer 0\'dır.', + errorReason: 'Hata Nedeni', + }, + iteration: { + deleteTitle: 'Yineleme Düğümünü Sil?', + deleteDesc: 'Yineleme düğümünü silmek tüm alt düğümleri silecektir', + input: 'Giriş', + output: 'Çıkış Değişkenleri', + iteration_one: '{{count}} Yineleme', + iteration_other: '{{count}} Yineleme', + currentIteration: 'Mevcut Yineleme', + }, + note: { + addNote: 'Not Ekle', + editor: { + placeholder: 'Notunuzu yazın...', + small: 'Küçük', + medium: 'Orta', + large: 'Büyük', + bold: 'Kalın', + italic: 'İtalik', + strikethrough: 'Üstü Çizili', + link: 'Bağlantı', + openLink: 'Aç', + unlink: 'Bağlantıyı Kaldır', + enterUrl: 'URL girin...', + invalidUrl: 'Geçersiz URL', + bulletList: 'Madde İşaretli Liste', + showAuthor: 'Yazarı Göster', + }, + }, + }, + tracing: { + stopBy: '{{user}} tarafından durduruldu', + }, +} + +export default translation From 093f902335225433f84fd349d02cedd638d3f5ec Mon Sep 17 00:00:00 2001 From: ian <69733417+supersaloon@users.noreply.github.com> Date: Thu, 1 Aug 2024 18:41:35 +0900 Subject: [PATCH 19/33] fix: Change API key authentication failure response code from 404 to 401 (#6885) --- api/controllers/inner_api/wraps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/controllers/inner_api/wraps.py b/api/controllers/inner_api/wraps.py index 2c3c870bce..5c37f5276f 100644 --- a/api/controllers/inner_api/wraps.py +++ b/api/controllers/inner_api/wraps.py @@ -19,7 +19,7 @@ def inner_api_only(view): # get header 'X-Inner-Api-Key' inner_api_key = request.headers.get('X-Inner-Api-Key') if not inner_api_key or inner_api_key != dify_config.INNER_API_KEY: - abort(404) + abort(401) return view(*args, **kwargs) From cc4785f094d122dc7b2be67471fc27886eaede38 Mon Sep 17 00:00:00 2001 From: Weaxs <459312872@qq.com> Date: Thu, 1 Aug 2024 19:57:53 +0800 Subject: [PATCH 20/33] fix: xinference reranker return_documents (#6888) --- .../model_runtime/model_providers/xinference/rerank/rerank.py | 3 ++- api/tests/integration_tests/model_runtime/__mock/xinference.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/api/core/model_runtime/model_providers/xinference/rerank/rerank.py b/api/core/model_runtime/model_providers/xinference/rerank/rerank.py index 649898f47a..b361806bcd 100644 --- a/api/core/model_runtime/model_providers/xinference/rerank/rerank.py +++ b/api/core/model_runtime/model_providers/xinference/rerank/rerank.py @@ -57,6 +57,7 @@ class XinferenceRerankModel(RerankModel): documents=docs, query=query, top_n=top_n, + return_documents=True ) except RuntimeError as e: raise InvokeServerUnavailableError(str(e)) @@ -66,7 +67,7 @@ class XinferenceRerankModel(RerankModel): for idx, result in enumerate(response['results']): # format document index = result['index'] - page_content = result['document'] + page_content = result['document'] if isinstance(result['document'], str) else result['document']['text'] rerank_document = RerankDocument( index=index, text=page_content, diff --git a/api/tests/integration_tests/model_runtime/__mock/xinference.py b/api/tests/integration_tests/model_runtime/__mock/xinference.py index ddb18fe919..7cb0a1318e 100644 --- a/api/tests/integration_tests/model_runtime/__mock/xinference.py +++ b/api/tests/integration_tests/model_runtime/__mock/xinference.py @@ -106,7 +106,7 @@ class MockXinferenceClass: def _check_cluster_authenticated(self): self._cluster_authed = True - def rerank(self: RESTfulRerankModelHandle, documents: list[str], query: str, top_n: int) -> dict: + def rerank(self: RESTfulRerankModelHandle, documents: list[str], query: str, top_n: int, return_documents: bool) -> dict: # check if self._model_uid is a valid uuid if not re.match(r'[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}', self._model_uid) and \ self._model_uid != 'rerank': From 24a89f7753112a1c9714da5bd1bcb4846bf49f43 Mon Sep 17 00:00:00 2001 From: Hanqing Zhao Date: Thu, 1 Aug 2024 20:33:35 +0800 Subject: [PATCH 21/33] Modify/modify jp doc (#6889) --- web/i18n/ja-JP/app-debug.ts | 4 ++-- web/i18n/ja-JP/common.ts | 6 +++--- web/i18n/ja-JP/dataset.ts | 2 +- web/i18n/ja-JP/workflow.ts | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/i18n/ja-JP/app-debug.ts b/web/i18n/ja-JP/app-debug.ts index 8535f79b95..39ea3386ed 100644 --- a/web/i18n/ja-JP/app-debug.ts +++ b/web/i18n/ja-JP/app-debug.ts @@ -300,8 +300,8 @@ const translation = { 'editModalTitle': '入力フィールドを編集', 'description': '{{varName}} の変数設定', 'fieldType': 'フィールドタイプ', - 'string': 'ショートテキスト', - 'text-input': 'ショートテキスト', + 'string': '短文', + 'text-input': '短文', 'paragraph': '段落', 'select': '選択', 'number': '数値', diff --git a/web/i18n/ja-JP/common.ts b/web/i18n/ja-JP/common.ts index 081b6dfb65..76d58fa944 100644 --- a/web/i18n/ja-JP/common.ts +++ b/web/i18n/ja-JP/common.ts @@ -292,8 +292,8 @@ const translation = { tip: '会話でのテキスト-to-音声入力に使用するデフォルトモデルを設定します。', }, rerankModel: { - key: '再ランクモデル', - tip: '再ランクモデルは、ユーザークエリとの意味的一致に基づいて候補文書リストを再配置し、意味的ランキングの結果を向上させます。', + key: 'Rerankモデル', + tip: 'Rerankモデルは、ユーザークエリとの意味的一致に基づいて候補文書リストを再配置し、意味的ランキングの結果を向上させます。', }, apiKey: 'API-キー', quota: 'クォータ', @@ -305,7 +305,7 @@ const translation = { tip: 'このモデルは削除されました。別のモデルを追加するか、別のモデルを選択してください。', emptyTip: '利用可能なモデルはありません', emptySetting: '設定に移動して構成してください', - rerankTip: '再ランクモデルを設定してください', + rerankTip: 'Rerankモデルを設定してください', }, card: { quota: 'クォータ', diff --git a/web/i18n/ja-JP/dataset.ts b/web/i18n/ja-JP/dataset.ts index c1160b4206..787b1c1e11 100644 --- a/web/i18n/ja-JP/dataset.ts +++ b/web/i18n/ja-JP/dataset.ts @@ -33,7 +33,7 @@ const translation = { }, hybrid_search: { title: 'ハイブリッド検索', - description: '全文検索とベクトル検索を同時に実行し、ユーザーのクエリに最適なマッチを選択するために再ランク付けを行います。再ランクモデルAPIの設定が必要です。', + description: '全文検索とベクトル検索を同時に実行し、ユーザーのクエリに最適なマッチを選択するためにRerank付けを行います。RerankモデルAPIの設定が必要です。', recommend: 'おすすめ', }, invertedIndex: { diff --git a/web/i18n/ja-JP/workflow.ts b/web/i18n/ja-JP/workflow.ts index cb75516bc5..ed0eebb8db 100644 --- a/web/i18n/ja-JP/workflow.ts +++ b/web/i18n/ja-JP/workflow.ts @@ -134,7 +134,7 @@ const translation = { variableValue: '変数値', code: 'コード', model: 'モデル', - rerankModel: '再ランクモデル', + rerankModel: 'Rerankモデル', }, invalidVariable: '無効な変数', }, @@ -296,7 +296,7 @@ const translation = { }, knowledgeRetrieval: { queryVariable: 'クエリ変数', - knowledge: '知識', + knowledge: 'ナレッジ', outputVars: { output: '検索されたセグメント化されたデータ', content: 'セグメント化されたコンテンツ', From 2ab9af3b3865c123592d2ab3ed08af549bd5332c Mon Sep 17 00:00:00 2001 From: Jyong <76649700+JohnJyong@users.noreply.github.com> Date: Thu, 1 Aug 2024 21:38:59 +0800 Subject: [PATCH 22/33] delete weight_type in knowledge retrieval node (#6892) --- api/core/workflow/nodes/knowledge_retrieval/entities.py | 2 -- .../nodes/knowledge_retrieval/knowledge_retrieval_node.py | 1 - 2 files changed, 3 deletions(-) diff --git a/api/core/workflow/nodes/knowledge_retrieval/entities.py b/api/core/workflow/nodes/knowledge_retrieval/entities.py index 5758b895f3..7cf392277c 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/entities.py +++ b/api/core/workflow/nodes/knowledge_retrieval/entities.py @@ -33,7 +33,6 @@ class WeightedScoreConfig(BaseModel): """ Weighted score Config. """ - weight_type: str vector_setting: VectorSetting keyword_setting: KeywordSetting @@ -49,7 +48,6 @@ class MultipleRetrievalConfig(BaseModel): reranking_model: Optional[RerankingModelConfig] = None weights: Optional[WeightedScoreConfig] = None - class ModelConfig(BaseModel): """ Model Config. 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 7a2b3c8512..01bf6e16e6 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py +++ b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py @@ -147,7 +147,6 @@ class KnowledgeRetrievalNode(BaseNode): elif node_data.multiple_retrieval_config.reranking_mode == 'weighted_score': reranking_model = None weights = { - 'weight_type': node_data.multiple_retrieval_config.weights.weight_type, 'vector_setting': { "vector_weight": node_data.multiple_retrieval_config.weights.vector_setting.vector_weight, "embedding_provider_name": node_data.multiple_retrieval_config.weights.vector_setting.embedding_provider_name, From f8617db01246a2fee2c01a95a1ea29da18a7000a Mon Sep 17 00:00:00 2001 From: dufei <33253618+Dofine-dufei@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:03:43 +0800 Subject: [PATCH 23/33] fix tongyi tool calls (#6896) --- .../model_runtime/model_providers/tongyi/llm/llm.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/api/core/model_runtime/model_providers/tongyi/llm/llm.py b/api/core/model_runtime/model_providers/tongyi/llm/llm.py index 6f768131fb..a75db78d8c 100644 --- a/api/core/model_runtime/model_providers/tongyi/llm/llm.py +++ b/api/core/model_runtime/model_providers/tongyi/llm/llm.py @@ -497,12 +497,13 @@ You should also complete the text started with ``` but not tell ``` directly. content = prompt_message.content if not content: content = ' ' - tongyi_messages.append({ + message = { 'role': 'assistant', - 'content': content if not rich_content else [{"text": content}], - 'tool_calls': [tool_call.model_dump() for tool_call in - prompt_message.tool_calls] if prompt_message.tool_calls else None - }) + 'content': content if not rich_content else [{"text": content}] + } + if prompt_message.tool_calls: + message['tool_calls'] = [tool_call.model_dump() for tool_call in prompt_message.tool_calls] + tongyi_messages.append(message) elif isinstance(prompt_message, ToolPromptMessage): tongyi_messages.append({ "role": "tool", From 56af1a0adf76e97ac12d122e45c4fa4fdc55c71f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=81=B0=E7=81=B0?= Date: Fri, 2 Aug 2024 12:04:47 +0800 Subject: [PATCH 24/33] pref: change ollama embedded api request (#6876) --- .../ollama/text_embedding/text_embedding.py | 44 +++++++++---------- 1 file changed, 20 insertions(+), 24 deletions(-) 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 fd73728b78..069de9acec 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 @@ -59,7 +59,7 @@ class OllamaEmbeddingModel(TextEmbeddingModel): if not endpoint_url.endswith('/'): endpoint_url += '/' - endpoint_url = urljoin(endpoint_url, 'api/embeddings') + endpoint_url = urljoin(endpoint_url, 'api/embed') # get model properties context_size = self._get_context_size(model, credentials) @@ -78,32 +78,28 @@ class OllamaEmbeddingModel(TextEmbeddingModel): else: inputs.append(text) - batched_embeddings = [] + # Prepare the payload for the request + payload = { + 'input': inputs, + 'model': model, + } - for text in inputs: - # Prepare the payload for the request - payload = { - 'prompt': text, - 'model': model, - } + # Make the request to the OpenAI API + response = requests.post( + endpoint_url, + headers=headers, + data=json.dumps(payload), + timeout=(10, 300) + ) - # Make the request to the OpenAI API - response = requests.post( - endpoint_url, - headers=headers, - data=json.dumps(payload), - timeout=(10, 300) - ) + response.raise_for_status() # Raise an exception for HTTP errors + response_data = response.json() - response.raise_for_status() # Raise an exception for HTTP errors - response_data = response.json() + # Extract embeddings and used tokens from the response + embeddings = response_data['embeddings'] + embedding_used_tokens = self.get_num_tokens(model, credentials, inputs) - # Extract embeddings and used tokens from the response - embeddings = response_data['embedding'] - embedding_used_tokens = self.get_num_tokens(model, credentials, [text]) - - used_tokens += embedding_used_tokens - batched_embeddings.append(embeddings) + used_tokens += embedding_used_tokens # calc usage usage = self._calc_response_usage( @@ -113,7 +109,7 @@ class OllamaEmbeddingModel(TextEmbeddingModel): ) return TextEmbeddingResult( - embeddings=batched_embeddings, + embeddings=embeddings, usage=usage, model=model ) From 44801df8f82f89777bd9a4ad18ad23ee8062fff7 Mon Sep 17 00:00:00 2001 From: Jyong <76649700+JohnJyong@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:10:51 +0800 Subject: [PATCH 25/33] fix score threshold limit be None (#6900) --- .../app/app_config/easy_ui_based_app/dataset/manager.py | 3 ++- api/core/app/app_config/entities.py | 3 ++- api/core/rag/retrieval/dataset_retrieval.py | 3 ++- .../unit_tests/services/workflow/test_workflow_converter.py | 6 ++++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/api/core/app/app_config/easy_ui_based_app/dataset/manager.py b/api/core/app/app_config/easy_ui_based_app/dataset/manager.py index 13da5514d1..ec17db5f06 100644 --- a/api/core/app/app_config/easy_ui_based_app/dataset/manager.py +++ b/api/core/app/app_config/easy_ui_based_app/dataset/manager.py @@ -91,7 +91,8 @@ class DatasetConfigManager: top_k=dataset_configs.get('top_k', 4), score_threshold=dataset_configs.get('score_threshold'), reranking_model=dataset_configs.get('reranking_model'), - weights=dataset_configs.get('weights') + weights=dataset_configs.get('weights'), + reranking_enabled=dataset_configs.get('reranking_enabled', True), ) ) diff --git a/api/core/app/app_config/entities.py b/api/core/app/app_config/entities.py index 9133a35c08..a490ddd670 100644 --- a/api/core/app/app_config/entities.py +++ b/api/core/app/app_config/entities.py @@ -158,10 +158,11 @@ class DatasetRetrieveConfigEntity(BaseModel): retrieve_strategy: RetrieveStrategy top_k: Optional[int] = None - score_threshold: Optional[float] = None + score_threshold: Optional[float] = .0 rerank_mode: Optional[str] = 'reranking_model' reranking_model: Optional[dict] = None weights: Optional[dict] = None + reranking_enabled: Optional[bool] = True diff --git a/api/core/rag/retrieval/dataset_retrieval.py b/api/core/rag/retrieval/dataset_retrieval.py index d51ea2942a..a69fcffbb4 100644 --- a/api/core/rag/retrieval/dataset_retrieval.py +++ b/api/core/rag/retrieval/dataset_retrieval.py @@ -138,6 +138,7 @@ class DatasetRetrieval: retrieve_config.rerank_mode, retrieve_config.reranking_model, retrieve_config.weights, + retrieve_config.reranking_enabled, message_id, ) @@ -606,7 +607,7 @@ class DatasetRetrieval: top_k: int, score_threshold: float) -> list[Document]: filter_documents = [] for document in all_documents: - if document.metadata['score'] >= score_threshold: + if score_threshold and document.metadata['score'] >= score_threshold: filter_documents.append(document) if not filter_documents: return [] diff --git a/api/tests/unit_tests/services/workflow/test_workflow_converter.py b/api/tests/unit_tests/services/workflow/test_workflow_converter.py index 29d55df8c3..f589cd2097 100644 --- a/api/tests/unit_tests/services/workflow/test_workflow_converter.py +++ b/api/tests/unit_tests/services/workflow/test_workflow_converter.py @@ -208,7 +208,8 @@ def test__convert_to_knowledge_retrieval_node_for_chatbot(): reranking_model={ 'reranking_provider_name': 'cohere', 'reranking_model_name': 'rerank-english-v2.0' - } + }, + reranking_enabled=True ) ) @@ -251,7 +252,8 @@ def test__convert_to_knowledge_retrieval_node_for_workflow_app(): reranking_model={ 'reranking_provider_name': 'cohere', 'reranking_model_name': 'rerank-english-v2.0' - } + }, + reranking_enabled=True ) ) From 8166a8caf5648405e0b2d30d436bb98c4a89d12d Mon Sep 17 00:00:00 2001 From: sino Date: Fri, 2 Aug 2024 13:13:34 +0800 Subject: [PATCH 26/33] feat: update llama3.1 parameters for openrouter (#6901) --- .../openrouter/llm/llama-3.1-405b-instruct.yaml | 8 ++++---- .../openrouter/llm/llama-3.1-70b-instruct.yaml | 8 ++++---- .../openrouter/llm/llama-3.1-8b-instruct.yaml | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-405b-instruct.yaml b/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-405b-instruct.yaml index 7d68e708b7..a489ce1b5a 100644 --- a/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-405b-instruct.yaml +++ b/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-405b-instruct.yaml @@ -4,7 +4,7 @@ label: model_type: llm model_properties: mode: chat - context_size: 128000 + context_size: 131072 parameter_rules: - name: temperature use_template: temperature @@ -15,9 +15,9 @@ parameter_rules: required: true default: 512 min: 1 - max: 128000 + max: 131072 pricing: - input: "3" - output: "3" + input: "2.7" + output: "2.7" unit: "0.000001" currency: USD diff --git a/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-70b-instruct.yaml b/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-70b-instruct.yaml index 78e3b45435..12037411b1 100644 --- a/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-70b-instruct.yaml +++ b/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-70b-instruct.yaml @@ -4,7 +4,7 @@ label: model_type: llm model_properties: mode: chat - context_size: 128000 + context_size: 131072 parameter_rules: - name: temperature use_template: temperature @@ -15,9 +15,9 @@ parameter_rules: required: true default: 512 min: 1 - max: 128000 + max: 131072 pricing: - input: "0.9" - output: "0.9" + input: "0.52" + output: "0.75" unit: "0.000001" currency: USD diff --git a/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-8b-instruct.yaml b/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-8b-instruct.yaml index 6e69b7deb7..6f06493f29 100644 --- a/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-8b-instruct.yaml +++ b/api/core/model_runtime/model_providers/openrouter/llm/llama-3.1-8b-instruct.yaml @@ -4,7 +4,7 @@ label: model_type: llm model_properties: mode: chat - context_size: 128000 + context_size: 131072 parameter_rules: - name: temperature use_template: temperature @@ -15,9 +15,9 @@ parameter_rules: required: true default: 512 min: 1 - max: 128000 + max: 131072 pricing: - input: "0.2" - output: "0.2" + input: "0.06" + output: "0.06" unit: "0.000001" currency: USD From 33dab4fe5480ddbb0e15b3a881fb7ff201a863f3 Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Fri, 2 Aug 2024 14:05:27 +0800 Subject: [PATCH 27/33] fix: multiple retrieval default weighted score (#6897) --- .../datasets/common/retrieval-param-config/index.tsx | 7 +++---- .../components/workflow/nodes/knowledge-retrieval/utils.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/web/app/components/datasets/common/retrieval-param-config/index.tsx b/web/app/components/datasets/common/retrieval-param-config/index.tsx index b52e3a60b2..98676f2e83 100644 --- a/web/app/components/datasets/common/retrieval-param-config/index.tsx +++ b/web/app/components/datasets/common/retrieval-param-config/index.tsx @@ -16,6 +16,7 @@ import ModelSelector from '@/app/components/header/account-setting/model-provide import { useModelListAndDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks' import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { + DEFAULT_WEIGHTED_SCORE, RerankingModeEnum, WeightedScoreEnum, } from '@/models/datasets' @@ -69,12 +70,12 @@ const RetrievalParamConfig: FC = ({ result.weights = { weight_type: WeightedScoreEnum.Customized, vector_setting: { - vector_weight: 0.5, + vector_weight: DEFAULT_WEIGHTED_SCORE.other.semantic, embedding_provider_name: '', embedding_model_name: '', }, keyword_setting: { - keyword_weight: 0.5, + keyword_weight: DEFAULT_WEIGHTED_SCORE.other.keyword, }, } } @@ -202,7 +203,6 @@ const RetrievalParamConfig: FC = ({ value.reranking_mode === RerankingModeEnum.WeightedScore && ( = ({ ...value, weights: { ...value.weights!, - weight_type: v.type, vector_setting: { ...value.weights!.vector_setting, vector_weight: v.value[0], diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/utils.ts b/web/app/components/workflow/nodes/knowledge-retrieval/utils.ts index 3835e88f90..89ae9b4764 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/utils.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/utils.ts @@ -88,7 +88,7 @@ export const getMultipleRetrievalConfig = (multipleRetrievalConfig: MultipleRetr reranking_mode, reranking_model, weights, - reranking_enable, + reranking_enable: allEconomic ? reranking_enable : true, } if (allEconomic || mixtureHighQualityAndEconomic || inconsistentEmbeddingModel) From e68346141623d176251c850b6c53a1ae148bf60a Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Fri, 2 Aug 2024 14:20:20 +0800 Subject: [PATCH 28/33] fix: knowledge save button visible (#6905) --- .../datasets/settings/form/index.tsx | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/web/app/components/datasets/settings/form/index.tsx b/web/app/components/datasets/settings/form/index.tsx index 7b007f8dd0..f7519248e6 100644 --- a/web/app/components/datasets/settings/form/index.tsx +++ b/web/app/components/datasets/settings/form/index.tsx @@ -264,20 +264,18 @@ const Form = () => { )}
- {currentDataset?.embedding_available && ( -
-
-
- -
+
+
+
+
- )} +
) } From 62cc4077bb207d00dcb9a1f6f7dfba066e571c84 Mon Sep 17 00:00:00 2001 From: KVOJJJin Date: Fri, 2 Aug 2024 15:08:14 +0800 Subject: [PATCH 29/33] Fix: webapp color theme (#6908) --- .../base/chat/chat-with-history/chat-wrapper.tsx | 2 ++ web/app/components/base/chat/chat-with-history/context.tsx | 2 ++ web/app/components/base/chat/chat-with-history/index.tsx | 7 ++++++- web/app/components/base/chat/embedded-chatbot/index.tsx | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/web/app/components/base/chat/chat-with-history/chat-wrapper.tsx b/web/app/components/base/chat/chat-with-history/chat-wrapper.tsx index 9dcd4cc7ab..8eda66c52a 100644 --- a/web/app/components/base/chat/chat-with-history/chat-wrapper.tsx +++ b/web/app/components/base/chat/chat-with-history/chat-wrapper.tsx @@ -30,6 +30,7 @@ const ChatWrapper = () => { handleFeedback, currentChatInstanceRef, appData, + themeBuilder, } = useChatWithHistoryContext() const appConfig = useMemo(() => { const config = appParams || {} @@ -143,6 +144,7 @@ const ChatWrapper = () => { onFeedback={handleFeedback} suggestedQuestions={suggestedQuestions} hideProcessDetail + themeBuilder={themeBuilder} /> ) } diff --git a/web/app/components/base/chat/chat-with-history/context.tsx b/web/app/components/base/chat/chat-with-history/context.tsx index 7808b73b12..e3c144bcd2 100644 --- a/web/app/components/base/chat/chat-with-history/context.tsx +++ b/web/app/components/base/chat/chat-with-history/context.tsx @@ -8,6 +8,7 @@ import type { ChatItem, Feedback, } from '../types' +import type { ThemeBuilder } from '../embedded-chatbot/theme/theme-context' import type { AppConversationData, AppData, @@ -46,6 +47,7 @@ export type ChatWithHistoryContextValue = { appId?: string handleFeedback: (messageId: string, feedback: Feedback) => void currentChatInstanceRef: RefObject<{ handleStop: () => void }> + themeBuilder?: ThemeBuilder } export const ChatWithHistoryContext = createContext({ diff --git a/web/app/components/base/chat/chat-with-history/index.tsx b/web/app/components/base/chat/chat-with-history/index.tsx index b02091231d..5910a7f949 100644 --- a/web/app/components/base/chat/chat-with-history/index.tsx +++ b/web/app/components/base/chat/chat-with-history/index.tsx @@ -4,6 +4,7 @@ import { useState, } from 'react' import { useAsyncEffect } from 'ahooks' +import { useThemeContext } from '../embedded-chatbot/theme/theme-context' import { ChatWithHistoryContext, useChatWithHistoryContext, @@ -34,6 +35,7 @@ const ChatWithHistory: FC = ({ appChatListDataLoading, chatShouldReloadKey, isMobile, + themeBuilder, } = useChatWithHistoryContext() const chatReady = (!showConfigPanelBeforeChat || !!appPrevChatList.length) @@ -41,13 +43,14 @@ const ChatWithHistory: FC = ({ const site = appData?.site useEffect(() => { + themeBuilder?.buildTheme(site?.chat_color_theme, site?.chat_color_theme_inverted) if (site) { if (customConfig) document.title = `${site.title}` else document.title = `${site.title} - Powered by Dify` } - }, [site, customConfig]) + }, [site, customConfig, themeBuilder]) if (appInfoLoading) { return ( @@ -106,6 +109,7 @@ const ChatWithHistoryWrap: FC = ({ }) => { const media = useBreakpoints() const isMobile = media === MediaType.mobile + const themeBuilder = useThemeContext() const { appInfoError, @@ -171,6 +175,7 @@ const ChatWithHistoryWrap: FC = ({ appId, handleFeedback, currentChatInstanceRef, + themeBuilder, }}> diff --git a/web/app/components/base/chat/embedded-chatbot/index.tsx b/web/app/components/base/chat/embedded-chatbot/index.tsx index 6d144f3f3b..d34fe164d1 100644 --- a/web/app/components/base/chat/embedded-chatbot/index.tsx +++ b/web/app/components/base/chat/embedded-chatbot/index.tsx @@ -51,7 +51,7 @@ const Chatbot = () => { else document.title = `${site.title} - Powered by Dify` } - }, [site, customConfig]) + }, [site, customConfig, themeBuilder]) if (appInfoLoading) { return ( From bf3f1027c8e679a3bfe29a8a186ea92b5fe0bed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=9E=E6=B3=95=E6=93=8D=E4=BD=9C?= Date: Fri, 2 Aug 2024 15:36:44 +0800 Subject: [PATCH 30/33] fix: code execution node not display clear reasons when sandbox res error (#6830) --- api/core/helper/code_executor/code_executor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/core/helper/code_executor/code_executor.py b/api/core/helper/code_executor/code_executor.py index 5b69d3af4b..afb2bbbbf3 100644 --- a/api/core/helper/code_executor/code_executor.py +++ b/api/core/helper/code_executor/code_executor.py @@ -107,11 +107,11 @@ class CodeExecutor: response = response.json() except: raise CodeExecutionException('Failed to parse response') + + if (code := response.get('code')) != 0: + raise CodeExecutionException(f"Got error code: {code}. Got error msg: {response.get('message')}") response = CodeExecutionResponse(**response) - - if response.code != 0: - raise CodeExecutionException(response.message) if response.data.error: raise CodeExecutionException(response.data.error) From 7ab04e17e7d08de246a6e609a44cf43f433b80e6 Mon Sep 17 00:00:00 2001 From: crazywoola <100913391+crazywoola@users.noreply.github.com> Date: Fri, 2 Aug 2024 15:48:58 +0800 Subject: [PATCH 31/33] fix: return code in service api (#6911) --- api/controllers/service_api/app/conversation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/controllers/service_api/app/conversation.py b/api/controllers/service_api/app/conversation.py index 02158f8b56..44bda8e771 100644 --- a/api/controllers/service_api/app/conversation.py +++ b/api/controllers/service_api/app/conversation.py @@ -53,7 +53,7 @@ class ConversationDetailApi(Resource): ConversationService.delete(app_model, conversation_id, end_user) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") - return {"result": "success"}, 204 + return {'result': 'success'}, 200 class ConversationRenameApi(Resource): From 6aa02f8c63981b37319e21a76632c678c965a44c Mon Sep 17 00:00:00 2001 From: Bowen Liang Date: Fri, 2 Aug 2024 15:51:23 +0800 Subject: [PATCH 32/33] dep: bump pgvecto-rs client from 0.1.x to 0.2.x (#6891) --- .../datasource/vdb/pgvecto_rs/pgvecto_rs.py | 4 ++-- .../rag/datasource/vdb/relyt/relyt_vector.py | 8 +++---- api/poetry.lock | 21 +++++++++---------- api/pyproject.toml | 4 ++-- docker/docker-compose.yaml | 2 +- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/api/core/rag/datasource/vdb/pgvecto_rs/pgvecto_rs.py b/api/core/rag/datasource/vdb/pgvecto_rs/pgvecto_rs.py index 82bdc5d4b9..a48224070f 100644 --- a/api/core/rag/datasource/vdb/pgvecto_rs/pgvecto_rs.py +++ b/api/core/rag/datasource/vdb/pgvecto_rs/pgvecto_rs.py @@ -4,7 +4,7 @@ from typing import Any from uuid import UUID, uuid4 from numpy import ndarray -from pgvecto_rs.sqlalchemy import Vector +from pgvecto_rs.sqlalchemy import VECTOR from pydantic import BaseModel, model_validator from sqlalchemy import Float, String, create_engine, insert, select, text from sqlalchemy import text as sql_text @@ -67,7 +67,7 @@ class PGVectoRS(BaseVector): ) text: Mapped[str] = mapped_column(String) meta: Mapped[dict] = mapped_column(postgresql.JSONB) - vector: Mapped[ndarray] = mapped_column(Vector(dim)) + vector: Mapped[ndarray] = mapped_column(VECTOR(dim)) self._table = _Table self._distance_op = "<=>" diff --git a/api/core/rag/datasource/vdb/relyt/relyt_vector.py b/api/core/rag/datasource/vdb/relyt/relyt_vector.py index 2e0bd6f303..63ad0682d7 100644 --- a/api/core/rag/datasource/vdb/relyt/relyt_vector.py +++ b/api/core/rag/datasource/vdb/relyt/relyt_vector.py @@ -105,7 +105,7 @@ class RelytVector(BaseVector): redis_client.set(collection_exist_cache_key, 1, ex=3600) def add_texts(self, documents: list[Document], embeddings: list[list[float]], **kwargs): - from pgvecto_rs.sqlalchemy import Vector + from pgvecto_rs.sqlalchemy import VECTOR ids = [str(uuid.uuid1()) for _ in documents] metadatas = [d.metadata for d in documents] @@ -118,7 +118,7 @@ class RelytVector(BaseVector): self._collection_name, Base.metadata, Column("id", TEXT, primary_key=True), - Column("embedding", Vector(len(embeddings[0]))), + Column("embedding", VECTOR(len(embeddings[0]))), Column("document", String, nullable=True), Column("metadata", JSON, nullable=True), extend_existing=True, @@ -169,7 +169,7 @@ class RelytVector(BaseVector): Args: ids: List of ids to delete. """ - from pgvecto_rs.sqlalchemy import Vector + from pgvecto_rs.sqlalchemy import VECTOR if ids is None: raise ValueError("No ids provided to delete.") @@ -179,7 +179,7 @@ class RelytVector(BaseVector): self._collection_name, Base.metadata, Column("id", TEXT, primary_key=True), - Column("embedding", Vector(self.embedding_dimension)), + Column("embedding", VECTOR(self.embedding_dimension)), Column("document", String, nullable=True), Column("metadata", JSON, nullable=True), extend_existing=True, diff --git a/api/poetry.lock b/api/poetry.lock index 3356d11f78..b30cc8ce68 100644 --- a/api/poetry.lock +++ b/api/poetry.lock @@ -5619,23 +5619,25 @@ files = [ [[package]] name = "pgvecto-rs" -version = "0.1.4" +version = "0.2.1" description = "Python binding for pgvecto.rs" optional = false -python-versions = ">=3.8" +python-versions = "<3.13,>=3.8" files = [ - {file = "pgvecto_rs-0.1.4-py3-none-any.whl", hash = "sha256:9b08a9e612f0cd65d1cc6e17a35b9bb5956187e0e3981bf6e997ff9e615c6116"}, - {file = "pgvecto_rs-0.1.4.tar.gz", hash = "sha256:078b96cff1f3d417169ad46cacef7fc4d644978bbd6725a5c24c0675de5030ab"}, + {file = "pgvecto_rs-0.2.1-py3-none-any.whl", hash = "sha256:b3ee2c465219469ad537b3efea2916477c6c576b3d6fd4298980d0733d12bb27"}, + {file = "pgvecto_rs-0.2.1.tar.gz", hash = "sha256:07046eaad2c4f75745f76de9ba483541909f1c595aced8d3434224a4f933daca"}, ] [package.dependencies] numpy = ">=1.23" +SQLAlchemy = {version = ">=2.0.23", optional = true, markers = "extra == \"sqlalchemy\""} toml = ">=0.10" [package.extras] +django = ["Django (>=4.2)"] psycopg3 = ["psycopg[binary] (>=3.1.12)"] sdk = ["openai (>=1.2.2)", "pgvecto_rs[sqlalchemy]"] -sqlalchemy = ["SQLAlchemy (>=2.0.23)", "pgvecto_rs[psycopg3]"] +sqlalchemy = ["SQLAlchemy (>=2.0.23)"] [[package]] name = "pgvector" @@ -6131,10 +6133,7 @@ files = [ [package.dependencies] annotated-types = ">=0.4.0" pydantic-core = "2.20.1" -typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, -] +typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} [package.extras] email = ["email-validator (>=2.0.0)"] @@ -9501,5 +9500,5 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.0" -python-versions = "^3.10" -content-hash = "ca55e4a4bb354fe969cc73c823557525c7598b0375e8791fcd77febc59e03b96" +python-versions = ">=3.10,<3.13" +content-hash = "50acbb78f2a273dfa8683d9d292596e89d13a420c6ecb1afad331f2c38dd1423" diff --git a/api/pyproject.toml b/api/pyproject.toml index 112ea22da8..c2c1d56403 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -154,7 +154,7 @@ pydantic_extra_types = "~2.9.0" pydub = "~0.25.1" pyjwt = "~2.8.0" pypdfium2 = "~4.17.0" -python = "^3.10" +python = ">=3.10,<3.13" python-docx = "~1.1.0" python-dotenv = "1.0.0" pyyaml = "~6.0.1" @@ -204,7 +204,7 @@ cloudscraper = "1.2.71" [tool.poetry.group.vdb.dependencies] chromadb = "0.5.1" oracledb = "~2.2.1" -pgvecto-rs = "0.1.4" +pgvecto-rs = { version = "~0.2.1", extras = ['sqlalchemy'] } pgvector = "0.2.5" pymilvus = "~2.4.4" pymysql = "1.1.1" diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 83a627e21b..1caf244fb1 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -418,7 +418,7 @@ services: # pgvecto-rs vector store pgvecto-rs: - image: tensorchord/pgvecto-rs:pg16-v0.2.0 + image: tensorchord/pgvecto-rs:pg16-v0.3.0 profiles: - pgvecto-rs restart: always From df530b53e5615ad65740038bad749194cb2d88c8 Mon Sep 17 00:00:00 2001 From: NFish Date: Fri, 2 Aug 2024 16:26:16 +0800 Subject: [PATCH 33/33] fix: system model setting missing space between buttons (#6912) --- .../model-provider-page/system-model-selector/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/web/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx b/web/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx index 3be088a502..b2dfe4bfe4 100644 --- a/web/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx @@ -249,6 +249,7 @@ const SystemModel: FC = ({ {t('common.operation.cancel')}