Compare commits

...
Author SHA1 Message Date
takatostandGitHub eabfd84ceb bump to 0.6.14 (#6294) 2024-07-15 21:01:09 +08:00
JyongandGitHub d320d1468d Feat/delete file when clean document (#5882) 2024-07-15 19:57:05 +08:00
OnelevenvyandGitHub b47fa27a35 fix: zhipuai validate error when user's api key not support for chatglm_turbo in issue #6289 (#6290) 2024-07-15 19:27:18 +08:00
Nam VuandGitHub 68ad9a91b2 fix: validateColorHex: cannot read properties of undefined (reading 'length') (#6242) 2024-07-15 19:26:00 +08:00
Koma HumanandGitHub c17a4165c1 6282 i18n add support for Italian (#6288) 2024-07-15 19:25:07 +08:00
thibautleaux-kreactiveandGitHub 96c171805a Update bedrock.yaml (#6281) 2024-07-15 16:53:03 +08:00
zxhlyhandGitHub 9a536979ab feat(frontend): workflow import dsl from url (#6286) 2024-07-15 16:24:03 +08:00
takatostandGitHub 46a5294d94 feat(backend): support import DSL from URL (#6287) 2024-07-15 16:23:40 +08:00
BenjaminandGitHub ec181649ae Update model provider configuration for Triton Inference Server and X… (#6274) 2024-07-15 15:07:28 +08:00
4fdcb30ff8 fix: custom tool input number fail (#6200)
Co-authored-by: jinqi.guo <jinqi.guo@ubtrobot.com>
2024-07-14 22:11:13 +08:00
WaffleandGitHub 07add06c59 Feat/add zhipu CogView 3 tool (#6210) 2024-07-13 17:39:17 +08:00
a7b33b55e8 Fix mermaid render (#6088)
Co-authored-by: 靖谦 <jingqian@kaiwu.cloud>
2024-07-12 20:09:24 +08:00
tangyohaandGitHub 0cbbaf3f68 fix: markdown proc will remove image (#5855) 2024-07-12 20:07:22 +08:00
非法操作andGitHub c564f32ab6 fix: remove the maximum length limit of "paragraph" variable (#6234) 2024-07-12 19:58:42 +08:00
Little 羊andGitHub 7c2c949f01 Update ernie_bot.py (#6236) 2024-07-12 19:54:53 +08:00
zxhlyhandGitHub 066168da52 fix: model-provider-card-style (#6246) 2024-07-12 17:17:07 +08:00
天魂andGitHub 1df71ec64d refactor(api): switch to dify_config with Pydantic in controllers and schedule (#6237) 2024-07-12 16:51:43 +08:00
MatriandGitHub a9ee52f2d7 Fix/firecrawl parameters issue (#6213) 2024-07-12 12:59:50 +08:00
WaffleandGitHub 7b225a5ab0 refactor(services/tasks): Swtich to dify_config witch Pydantic (#6203) 2024-07-12 12:25:38 +08:00
耐小心andGitHub d7a6f25c63 fix: differentiate prompts fields based on function_calling_type (#5880) 2024-07-12 11:07:38 +08:00
JoelandGitHub f46792334c chore: remove underscore in util class name and css variable (#6221) 2024-07-12 11:07:24 +08:00
crazywoolaandGitHub ee3936916f upgrade deepseek params (#6215) 2024-07-12 10:55:44 +08:00
109de52fe2 Fix: When editing an Agent, selecting custom tools does not allow filtering by labels. (#6197)
Co-authored-by: dufei <du_fei@venusgroup.com.cn>
2024-07-12 09:02:25 +08:00
LinJiandGitHub 10dd0f3fa0 fix document error for "/workflows/:task_id/stop" (#6209) 2024-07-12 08:33:50 +08:00
Little 羊andGitHub 2f064c68bc Create ernie-4.0-turbo-8k-preview (#6132) 2024-07-11 20:20:07 +08:00
079583eaa4 fix: Correct environment variable name (#6184)
Co-authored-by: liuzhenghua-jk <liuzhenghua-jk@360shuke.com>
2024-07-11 20:16:52 +08:00
JasonVVandGitHub 0e82072323 Fix if_else node compatibility with historical workflows. (#6186) 2024-07-11 17:13:16 +08:00
JyongandGitHub 678ad6b7eb Fix/file stream azure blob (#6196) 2024-07-11 17:01:03 +08:00
97 changed files with 5063 additions and 852 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ class PackagingInfo(BaseSettings):
CURRENT_VERSION: str = Field(
description='Dify version',
default='0.6.13',
default='0.6.14',
)
COMMIT_SHA: str = Field(
+46 -8
View File
@@ -15,6 +15,7 @@ from fields.app_fields import (
app_pagination_fields,
)
from libs.login import login_required
from services.app_dsl_service import AppDslService
from services.app_service import AppService
ALLOW_CREATE_APP_MODES = ['chat', 'agent-chat', 'advanced-chat', 'workflow', 'completion']
@@ -97,8 +98,42 @@ class AppImportApi(Resource):
parser.add_argument('icon_background', type=str, location='json')
args = parser.parse_args()
app_service = AppService()
app = app_service.import_app(current_user.current_tenant_id, args['data'], args, current_user)
app = AppDslService.import_and_create_new_app(
tenant_id=current_user.current_tenant_id,
data=args['data'],
args=args,
account=current_user
)
return app, 201
class AppImportFromUrlApi(Resource):
@setup_required
@login_required
@account_initialization_required
@marshal_with(app_detail_fields_with_site)
@cloud_edition_billing_resource_check('apps')
def post(self):
"""Import app from url"""
# The role of the current user in the ta table must be admin, owner, or editor
if not current_user.is_editor:
raise Forbidden()
parser = reqparse.RequestParser()
parser.add_argument('url', type=str, required=True, nullable=False, location='json')
parser.add_argument('name', type=str, location='json')
parser.add_argument('description', type=str, location='json')
parser.add_argument('icon', type=str, location='json')
parser.add_argument('icon_background', type=str, location='json')
args = parser.parse_args()
app = AppDslService.import_and_create_new_app_from_url(
tenant_id=current_user.current_tenant_id,
url=args['url'],
args=args,
account=current_user
)
return app, 201
@@ -177,9 +212,13 @@ class AppCopyApi(Resource):
parser.add_argument('icon_background', type=str, location='json')
args = parser.parse_args()
app_service = AppService()
data = app_service.export_app(app_model)
app = app_service.import_app(current_user.current_tenant_id, data, args, current_user)
data = AppDslService.export_dsl(app_model=app_model)
app = AppDslService.import_and_create_new_app(
tenant_id=current_user.current_tenant_id,
data=data,
args=args,
account=current_user
)
return app, 201
@@ -195,10 +234,8 @@ class AppExportApi(Resource):
if not current_user.is_editor:
raise Forbidden()
app_service = AppService()
return {
"data": app_service.export_app(app_model)
"data": AppDslService.export_dsl(app_model=app_model)
}
@@ -322,6 +359,7 @@ class AppTraceApi(Resource):
api.add_resource(AppListApi, '/apps')
api.add_resource(AppImportApi, '/apps/import')
api.add_resource(AppImportFromUrlApi, '/apps/import/url')
api.add_resource(AppApi, '/apps/<uuid:app_id>')
api.add_resource(AppCopyApi, '/apps/<uuid:app_id>/copy')
api.add_resource(AppExportApi, '/apps/<uuid:app_id>/export')
+2 -2
View File
@@ -20,6 +20,7 @@ from libs import helper
from libs.helper import TimestampField, uuid_value
from libs.login import current_user, login_required
from models.model import App, AppMode
from services.app_dsl_service import AppDslService
from services.app_generate_service import AppGenerateService
from services.errors.app import WorkflowHashNotEqualError
from services.workflow_service import WorkflowService
@@ -128,8 +129,7 @@ class DraftWorkflowImportApi(Resource):
parser.add_argument('data', type=str, required=True, nullable=False, location='json')
args = parser.parse_args()
workflow_service = WorkflowService()
workflow = workflow_service.import_draft_workflow(
workflow = AppDslService.import_and_overwrite_workflow(
app_model=app_model,
data=args['data'],
account=current_user
+5 -4
View File
@@ -3,8 +3,9 @@ from functools import wraps
from hashlib import sha1
from hmac import new as hmac_new
from flask import abort, current_app, request
from flask import abort, request
from configs import dify_config
from extensions.ext_database import db
from models.model import EndUser
@@ -12,12 +13,12 @@ from models.model import EndUser
def inner_api_only(view):
@wraps(view)
def decorated(*args, **kwargs):
if not current_app.config['INNER_API']:
if not dify_config.INNER_API:
abort(404)
# 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 != current_app.config['INNER_API_KEY']:
if not inner_api_key or inner_api_key != dify_config.INNER_API_KEY:
abort(404)
return view(*args, **kwargs)
@@ -28,7 +29,7 @@ def inner_api_only(view):
def inner_api_user_auth(view):
@wraps(view)
def decorated(*args, **kwargs):
if not current_app.config['INNER_API']:
if not dify_config.INNER_API:
return view(*args, **kwargs)
# get header 'X-Inner-Api-Key'
+2 -2
View File
@@ -1,7 +1,7 @@
from flask import current_app
from flask_restful import Resource, fields, marshal_with
from configs import dify_config
from controllers.service_api import api
from controllers.service_api.app.error import AppUnavailableError
from controllers.service_api.wraps import validate_app_token
@@ -78,7 +78,7 @@ class AppParameterApi(Resource):
"transfer_methods": ["remote_url", "local_file"]
}}),
'system_parameters': {
'image_file_size_limit': current_app.config.get('UPLOAD_IMAGE_FILE_SIZE_LIMIT')
'image_file_size_limit': dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT
}
}
+2 -2
View File
@@ -1,6 +1,6 @@
from flask import current_app
from flask_restful import Resource
from configs import dify_config
from controllers.service_api import api
@@ -9,7 +9,7 @@ class IndexApi(Resource):
return {
"welcome": "Dify OpenAPI",
"api_version": "v1",
"server_version": current_app.config['CURRENT_VERSION']
"server_version": dify_config.CURRENT_VERSION,
}
+2 -2
View File
@@ -1,6 +1,6 @@
from flask import current_app
from flask_restful import fields, marshal_with
from configs import dify_config
from controllers.web import api
from controllers.web.error import AppUnavailableError
from controllers.web.wraps import WebApiResource
@@ -75,7 +75,7 @@ class AppParameterApi(WebApiResource):
"transfer_methods": ["remote_url", "local_file"]
}}),
'system_parameters': {
'image_file_size_limit': current_app.config.get('UPLOAD_IMAGE_FILE_SIZE_LIMIT')
'image_file_size_limit': dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT
}
}
+2 -2
View File
@@ -1,8 +1,8 @@
from flask import current_app
from flask_restful import fields, marshal_with
from werkzeug.exceptions import Forbidden
from configs import dify_config
from controllers.web import api
from controllers.web.wraps import WebApiResource
from extensions.ext_database import db
@@ -84,7 +84,7 @@ class AppSiteInfo:
self.can_replace_logo = can_replace_logo
if can_replace_logo:
base_url = current_app.config.get('FILES_URL')
base_url = dify_config.FILES_URL
remove_webapp_brand = tenant.custom_config_dict.get('remove_webapp_brand', False)
replace_webapp_logo = f'{base_url}/files/workspaces/{tenant.id}/webapp-logo' if tenant.custom_config_dict.get('replace_webapp_logo') else None
self.custom_config = {
@@ -255,6 +255,12 @@ class AdvancedChatAppRunner(AppRunner):
)
index += 1
time.sleep(0.01)
else:
queue_manager.publish(
QueueTextChunkEvent(
text=text
), PublishFrom.APPLICATION_MANAGER
)
queue_manager.publish(
QueueStopEvent(stopped_by=stopped_by),
@@ -66,6 +66,10 @@ provider_credential_schema:
label:
en_US: Europe (Frankfurt)
zh_Hans: 欧洲 (法兰克福)
- value: eu-west-2
label:
en_US: Eu west London (London)
zh_Hans: 欧洲西部 (伦敦)
- value: us-gov-west-1
label:
en_US: AWS GovCloud (US-West)
@@ -7,7 +7,7 @@ features:
- agent-thought
model_properties:
mode: chat
context_size: 32000
context_size: 128000
parameter_rules:
- name: temperature
use_template: temperature
@@ -7,7 +7,7 @@ features:
- agent-thought
model_properties:
mode: chat
context_size: 32000
context_size: 128000
parameter_rules:
- name: temperature
use_template: temperature
@@ -616,30 +616,34 @@ class OAIAPICompatLargeLanguageModel(_CommonOAI_API_Compat, LargeLanguageModel):
message = cast(AssistantPromptMessage, message)
message_dict = {"role": "assistant", "content": message.content}
if message.tool_calls:
# message_dict["tool_calls"] = [helper.dump_model(PromptMessageFunction(function=tool_call)) for tool_call
# in
# message.tool_calls]
function_call = message.tool_calls[0]
message_dict["function_call"] = {
"name": function_call.function.name,
"arguments": function_call.function.arguments,
}
function_calling_type = credentials.get('function_calling_type', 'no_call')
if function_calling_type == 'tool_call':
message_dict["tool_calls"] = [tool_call.dict() for tool_call in
message.tool_calls]
elif function_calling_type == 'function_call':
function_call = message.tool_calls[0]
message_dict["function_call"] = {
"name": function_call.function.name,
"arguments": function_call.function.arguments,
}
elif isinstance(message, SystemPromptMessage):
message = cast(SystemPromptMessage, message)
message_dict = {"role": "system", "content": message.content}
elif isinstance(message, ToolPromptMessage):
message = cast(ToolPromptMessage, message)
# message_dict = {
# "role": "tool",
# "content": message.content,
# "tool_call_id": message.tool_call_id
# }
message_dict = {
"role": "tool" if credentials and credentials.get('function_calling_type', 'no_call') == 'tool_call' else "function",
"content": message.content,
"name": message.tool_call_id
}
function_calling_type = credentials.get('function_calling_type', 'no_call')
if function_calling_type == 'tool_call':
message_dict = {
"role": "tool",
"content": message.content,
"tool_call_id": message.tool_call_id
}
elif function_calling_type == 'function_call':
message_dict = {
"role": "function",
"content": message.content,
"name": message.tool_call_id
}
else:
raise ValueError(f"Got unknown type {message}")
@@ -29,7 +29,7 @@ model_credential_schema:
label:
zh_Hans: 服务器URL
en_US: Server url
type: secret-input
type: text-input
required: true
placeholder:
zh_Hans: 在此输入 Triton Inference Server 的服务器地址,如 http://192.168.1.100:8000
@@ -0,0 +1,40 @@
model: ernie-4.0-turbo-8k-preview
label:
en_US: Ernie-4.0-turbo-8k-preview
model_type: llm
features:
- agent-thought
model_properties:
mode: chat
context_size: 8192
parameter_rules:
- name: temperature
use_template: temperature
min: 0.1
max: 1.0
default: 0.8
- name: top_p
use_template: top_p
- name: max_tokens
use_template: max_tokens
default: 1024
min: 2
max: 2048
- name: presence_penalty
use_template: presence_penalty
default: 1.0
min: 1.0
max: 2.0
- name: frequency_penalty
use_template: frequency_penalty
- name: response_format
use_template: response_format
- name: disable_search
label:
zh_Hans: 禁用搜索
en_US: Disable Search
type: boolean
help:
zh_Hans: 禁用模型自行进行外部搜索。
en_US: Disable the model to perform external search.
required: false
@@ -138,6 +138,7 @@ class ErnieBotModel:
'ernie-lite-8k-0922': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant',
'ernie-lite-8k-0308': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-lite-8k',
'ernie-character-8k-0321': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-char-8k',
'ernie-4.0-tutbo-8k-preview': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-4.0-turbo-8k-preview',
}
function_calling_supports = [
@@ -149,6 +150,7 @@ class ErnieBotModel:
'ernie-3.5-4k-0205',
'ernie-3.5-128k',
'ernie-4.0-8k'
'ernie-4.0-turbo-8k-preview'
]
api_key: str = ''
@@ -32,7 +32,7 @@ model_credential_schema:
label:
zh_Hans: 服务器URL
en_US: Server url
type: secret-input
type: text-input
required: true
placeholder:
zh_Hans: 在此输入Xinference的服务器地址,如 http://192.168.1.100:9997
@@ -20,7 +20,7 @@ class ZhipuaiProvider(ModelProvider):
model_instance = self.get_model_instance(ModelType.LLM)
model_instance.validate_credentials(
model='chatglm_turbo',
model='glm-4',
credentials=credentials
)
except CredentialsValidateFailedError as ex:
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Optional
import httpx
from ..core._base_api import BaseAPI
from ..core._base_type import NOT_GIVEN, Headers, NotGiven
from ..core._base_type import NOT_GIVEN, Body, Headers, NotGiven
from ..core._http_client import make_user_request_input
from ..types.image import ImagesResponded
@@ -28,7 +28,9 @@ class Images(BaseAPI):
size: Optional[str] | NotGiven = NOT_GIVEN,
style: Optional[str] | NotGiven = NOT_GIVEN,
user: str | NotGiven = NOT_GIVEN,
request_id: Optional[str] | NotGiven = NOT_GIVEN,
extra_headers: Headers | None = None,
extra_body: Body | None = None,
disable_strict_validation: Optional[bool] | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
) -> ImagesResponded:
@@ -46,9 +48,12 @@ class Images(BaseAPI):
"size": size,
"style": style,
"user": user,
"request_id": request_id,
},
options=make_user_request_input(
extra_headers=extra_headers, timeout=timeout
extra_headers=extra_headers,
extra_body=extra_body,
timeout=timeout
),
cast_type=_cast_type,
enable_stream=False,
@@ -11,7 +11,7 @@ from tenacity import retry
from tenacity.stop import stop_after_attempt
from . import _errors
from ._base_type import NOT_GIVEN, Body, Data, Headers, NotGiven, Query, RequestFiles, ResponseT
from ._base_type import NOT_GIVEN, AnyMapping, Body, Data, Headers, NotGiven, Query, RequestFiles, ResponseT
from ._errors import APIResponseValidationError, APIStatusError, APITimeoutError
from ._files import make_httpx_files
from ._request_opt import ClientRequestParam, UserRequestInput
@@ -358,6 +358,7 @@ def make_user_request_input(
max_retries: int | None = None,
timeout: float | Timeout | None | NotGiven = NOT_GIVEN,
extra_headers: Headers = None,
extra_body: Body | None = None,
query: Query | None = None,
) -> UserRequestInput:
options: UserRequestInput = {}
@@ -370,5 +371,7 @@ def make_user_request_input(
options['timeout'] = timeout
if query is not None:
options["params"] = query
if extra_body is not None:
options["extra_json"] = cast(AnyMapping, extra_body)
return options
@@ -1,7 +1,6 @@
from typing import Any
from flask import current_app
from configs import dify_config
from core.rag.datasource.keyword.jieba.jieba import Jieba
from core.rag.datasource.keyword.keyword_base import BaseKeyword
from core.rag.models.document import Document
@@ -14,8 +13,8 @@ class Keyword:
self._keyword_processor = self._init_keyword()
def _init_keyword(self) -> BaseKeyword:
config = current_app.config
keyword_type = config.get('KEYWORD_STORE')
config = dify_config
keyword_type = config.KEYWORD_STORE
if not keyword_type:
raise ValueError("Keyword store must be specified.")
@@ -46,7 +46,6 @@ class FirecrawlApp:
raise Exception(f'Failed to scrape URL. Status code: {response.status_code}')
def crawl_url(self, url, params=None) -> str:
start_time = time.time()
headers = self._prepare_headers()
json_data = {'url': url}
if params:
+2 -2
View File
@@ -18,8 +18,8 @@ class MarkdownExtractor(BaseExtractor):
def __init__(
self,
file_path: str,
remove_hyperlinks: bool = True,
remove_images: bool = True,
remove_hyperlinks: bool = False,
remove_images: bool = False,
encoding: Optional[str] = None,
autodetect_encoding: bool = True,
):
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1,27 @@
""" Provide the input parameters type for the cogview provider class """
from typing import Any
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.cogview.tools.cogview3 import CogView3Tool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
class COGVIEWProvider(BuiltinToolProviderController):
""" cogview provider """
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
CogView3Tool().fork_tool_runtime(
runtime={
"credentials": credentials,
}
).invoke(
user_id='',
tool_parameters={
"prompt": "一个城市在水晶瓶中欢快生活的场景,水彩画风格,展现出微观与珠宝般的美丽。",
"size": "square",
"n": 1
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e)) from e
@@ -0,0 +1,61 @@
identity:
author: Waffle
name: cogview
label:
en_US: CogView
zh_Hans: CogView 绘画
pt_BR: CogView
description:
en_US: CogView art
zh_Hans: CogView 绘画
pt_BR: CogView art
icon: icon.png
tags:
- image
- productivity
credentials_for_provider:
zhipuai_api_key:
type: secret-input
required: true
label:
en_US: ZhipuAI API key
zh_Hans: ZhipuAI API key
pt_BR: ZhipuAI API key
help:
en_US: Please input your ZhipuAI API key
zh_Hans: 请输入你的 ZhipuAI API key
pt_BR: Please input your ZhipuAI API key
placeholder:
en_US: Please input your ZhipuAI API key
zh_Hans: 请输入你的 ZhipuAI API key
pt_BR: Please input your ZhipuAI API key
zhipuai_organizaion_id:
type: text-input
required: false
label:
en_US: ZhipuAI organization ID
zh_Hans: ZhipuAI organization ID
pt_BR: ZhipuAI organization ID
help:
en_US: Please input your ZhipuAI organization ID
zh_Hans: 请输入你的 ZhipuAI organization ID
pt_BR: Please input your ZhipuAI organization ID
placeholder:
en_US: Please input your ZhipuAI organization ID
zh_Hans: 请输入你的 ZhipuAI organization ID
pt_BR: Please input your ZhipuAI organization ID
zhipuai_base_url:
type: text-input
required: false
label:
en_US: ZhipuAI base URL
zh_Hans: ZhipuAI base URL
pt_BR: ZhipuAI base URL
help:
en_US: Please input your ZhipuAI base URL
zh_Hans: 请输入你的 ZhipuAI base URL
pt_BR: Please input your ZhipuAI base URL
placeholder:
en_US: Please input your ZhipuAI base URL
zh_Hans: 请输入你的 ZhipuAI base URL
pt_BR: Please input your ZhipuAI base URL
@@ -0,0 +1,69 @@
import random
from typing import Any, Union
from core.model_runtime.model_providers.zhipuai.zhipuai_sdk._client import ZhipuAI
from core.tools.entities.tool_entities import ToolInvokeMessage
from core.tools.tool.builtin_tool import BuiltinTool
class CogView3Tool(BuiltinTool):
""" CogView3 Tool """
def _invoke(self,
user_id: str,
tool_parameters: dict[str, Any]
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
"""
Invoke CogView3 tool
"""
client = ZhipuAI(
base_url=self.runtime.credentials['zhipuai_base_url'],
api_key=self.runtime.credentials['zhipuai_api_key'],
)
size_mapping = {
'square': '1024x1024',
'vertical': '1024x1792',
'horizontal': '1792x1024',
}
# prompt
prompt = tool_parameters.get('prompt', '')
if not prompt:
return self.create_text_message('Please input prompt')
# get size
print(tool_parameters.get('prompt', 'square'))
size = size_mapping[tool_parameters.get('size', 'square')]
# get n
n = tool_parameters.get('n', 1)
# get quality
quality = tool_parameters.get('quality', 'standard')
if quality not in ['standard', 'hd']:
return self.create_text_message('Invalid quality')
# get style
style = tool_parameters.get('style', 'vivid')
if style not in ['natural', 'vivid']:
return self.create_text_message('Invalid style')
# set extra body
seed_id = tool_parameters.get('seed_id', self._generate_random_id(8))
extra_body = {'seed': seed_id}
response = client.images.generations(
prompt=prompt,
model="cogview-3",
size=size,
n=n,
extra_body=extra_body,
style=style,
quality=quality,
response_format='b64_json'
)
result = []
for image in response.data:
result.append(self.create_image_message(image=image.url))
result.append(self.create_text_message(
f'\nGenerate image source to Seed ID: {seed_id}'))
return result
@staticmethod
def _generate_random_id(length=8):
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
random_id = ''.join(random.choices(characters, k=length))
return random_id
@@ -0,0 +1,123 @@
identity:
name: cogview3
author: Waffle
label:
en_US: CogView 3
zh_Hans: CogView 3 绘画
pt_BR: CogView 3
description:
en_US: CogView 3 is a powerful drawing tool that can draw the image you want based on your prompt
zh_Hans: CogView 3 是一个强大的绘画工具,它可以根据您的提示词绘制出您想要的图像
pt_BR: CogView 3 is a powerful drawing tool that can draw the image you want based on your prompt
description:
human:
en_US: CogView 3 is a text to image tool
zh_Hans: CogView 3 是一个文本到图像的工具
pt_BR: CogView 3 is a text to image tool
llm: CogView 3 is a tool used to generate images from text
parameters:
- name: prompt
type: string
required: true
label:
en_US: Prompt
zh_Hans: 提示词
pt_BR: Prompt
human_description:
en_US: Image prompt, you can check the official documentation of CogView 3
zh_Hans: 图像提示词,您可以查看CogView 3 的官方文档
pt_BR: Image prompt, you can check the official documentation of CogView 3
llm_description: Image prompt of CogView 3, you should describe the image you want to generate as a list of words as possible as detailed
form: llm
- name: size
type: select
required: true
human_description:
en_US: selecting the image size
zh_Hans: 选择图像大小
pt_BR: selecting the image size
label:
en_US: Image size
zh_Hans: 图像大小
pt_BR: Image size
form: form
options:
- value: square
label:
en_US: Squre(1024x1024)
zh_Hans: 方(1024x1024)
pt_BR: Squre(1024x1024)
- value: vertical
label:
en_US: Vertical(1024x1792)
zh_Hans: 竖屏(1024x1792)
pt_BR: Vertical(1024x1792)
- value: horizontal
label:
en_US: Horizontal(1792x1024)
zh_Hans: 横屏(1792x1024)
pt_BR: Horizontal(1792x1024)
default: square
- name: n
type: number
required: true
human_description:
en_US: selecting the number of images
zh_Hans: 选择图像数量
pt_BR: selecting the number of images
label:
en_US: Number of images
zh_Hans: 图像数量
pt_BR: Number of images
form: form
min: 1
max: 1
default: 1
- name: quality
type: select
required: true
human_description:
en_US: selecting the image quality
zh_Hans: 选择图像质量
pt_BR: selecting the image quality
label:
en_US: Image quality
zh_Hans: 图像质量
pt_BR: Image quality
form: form
options:
- value: standard
label:
en_US: Standard
zh_Hans: 标准
pt_BR: Standard
- value: hd
label:
en_US: HD
zh_Hans: 高清
pt_BR: HD
default: standard
- name: style
type: select
required: true
human_description:
en_US: selecting the image style
zh_Hans: 选择图像风格
pt_BR: selecting the image style
label:
en_US: Image style
zh_Hans: 图像风格
pt_BR: Image style
form: form
options:
- value: vivid
label:
en_US: Vivid
zh_Hans: 生动
pt_BR: Vivid
- value: natural
label:
en_US: Natural
zh_Hans: 自然
pt_BR: Natural
default: vivid
@@ -1,3 +1,4 @@
import logging
import time
from collections.abc import Mapping
from typing import Any
@@ -5,6 +6,7 @@ from typing import Any
import requests
from requests.exceptions import HTTPError
logger = logging.getLogger(__name__)
class FirecrawlApp:
def __init__(self, api_key: str | None = None, base_url: str | None = None):
@@ -48,6 +50,7 @@ class FirecrawlApp:
headers = self._prepare_headers()
data = {'url': url, **kwargs}
response = self._request('POST', endpoint, data, headers)
logger.debug(f"Sent request to {endpoint=} body={data}")
if response is None:
raise HTTPError("Failed to scrape URL after multiple retries")
return response
@@ -57,6 +60,7 @@ class FirecrawlApp:
headers = self._prepare_headers()
data = {'query': query, **kwargs}
response = self._request('POST', endpoint, data, headers)
logger.debug(f"Sent request to {endpoint=} body={data}")
if response is None:
raise HTTPError("Failed to perform search after multiple retries")
return response
@@ -66,8 +70,9 @@ class FirecrawlApp:
):
endpoint = f'{self.base_url}/v0/crawl'
headers = self._prepare_headers(idempotency_key)
data = {'url': url, **kwargs}
data = {'url': url, **kwargs['params']}
response = self._request('POST', endpoint, data, headers)
logger.debug(f"Sent request to {endpoint=} body={data}")
if response is None:
raise HTTPError("Failed to initiate crawl after multiple retries")
job_id: str = response['jobId']
+1 -1
View File
@@ -238,7 +238,7 @@ class ApiTool(Tool):
return int(value)
elif property['type'] == 'number':
# check if it is a float
if '.' in value:
if '.' in str(value):
return float(value)
else:
return int(value)
@@ -60,6 +60,8 @@ class IfElseNode(BaseNode):
final_result = all(group_result) if node_data.logical_operator == "and" else any(group_result)
selected_case_id = "true" if final_result else "false"
process_datas["condition_results"].append(
{
"group": "default",
@@ -78,11 +80,7 @@ class IfElseNode(BaseNode):
error=str(e)
)
outputs = {
"result": final_result
}
if node_data.cases:
outputs["selected_case_id"] = selected_case_id
outputs = {"result": final_result, "selected_case_id": selected_case_id}
data = NodeRunResult(
status=WorkflowNodeExecutionStatus.SUCCEEDED,
@@ -7,4 +7,5 @@ def handle(sender, **kwargs):
document_id = sender
dataset_id = kwargs.get('dataset_id')
doc_form = kwargs.get('doc_form')
clean_document_task.delay(document_id, dataset_id, doc_form)
file_id = kwargs.get('file_id')
clean_document_task.delay(document_id, dataset_id, doc_form, file_id)
+2 -3
View File
@@ -38,9 +38,8 @@ class AzureStorage(BaseStorage):
def generate(filename: str = filename) -> Generator:
blob = client.get_blob_client(container=self.bucket_name, blob=filename)
blob_data = blob.download_blob()
for chunk in blob_data.chunks():
yield from chunk
return generate()
yield from blob_data.chunks()
return generate(filename)
def download(self, filename, target_filepath):
client = self._sync_client()
+2 -2
View File
@@ -2,10 +2,10 @@ import datetime
import time
import click
from flask import current_app
from werkzeug.exceptions import NotFound
import app
from configs import dify_config
from extensions.ext_database import db
from models.dataset import Embedding
@@ -13,7 +13,7 @@ from models.dataset import Embedding
@app.celery.task(queue='dataset')
def clean_embedding_cache_task():
click.echo(click.style('Start clean embedding cache.', fg='green'))
clean_days = int(current_app.config.get('CLEAN_DAY_SETTING'))
clean_days = int(dify_config.CLEAN_DAY_SETTING)
start_at = time.perf_counter()
thirty_days_ago = datetime.datetime.now() - datetime.timedelta(days=clean_days)
page = 1
+2 -2
View File
@@ -2,10 +2,10 @@ import datetime
import time
import click
from flask import current_app
from werkzeug.exceptions import NotFound
import app
from configs import dify_config
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
from extensions.ext_database import db
from models.dataset import Dataset, DatasetQuery, Document
@@ -14,7 +14,7 @@ from models.dataset import Dataset, DatasetQuery, Document
@app.celery.task(queue='dataset')
def clean_unused_datasets_task():
click.echo(click.style('Start clean unused datasets indexes.', fg='green'))
clean_days = int(current_app.config.get('CLEAN_DAY_SETTING'))
clean_days = int(dify_config.CLEAN_DAY_SETTING)
start_at = time.perf_counter()
thirty_days_ago = datetime.datetime.now() - datetime.timedelta(days=clean_days)
page = 1
+5 -5
View File
@@ -6,10 +6,10 @@ from datetime import datetime, timedelta, timezone
from hashlib import sha256
from typing import Any, Optional
from flask import current_app
from sqlalchemy import func
from werkzeug.exceptions import Unauthorized
from configs import dify_config
from constants.languages import language_timezone_mapping, languages
from events.tenant_event import tenant_was_created
from extensions.ext_redis import redis_client
@@ -80,7 +80,7 @@ class AccountService:
payload = {
"user_id": account.id,
"exp": datetime.now(timezone.utc).replace(tzinfo=None) + exp,
"iss": current_app.config['EDITION'],
"iss": dify_config.EDITION,
"sub": 'Console API Passport',
}
@@ -524,7 +524,7 @@ class RegisterService:
TenantService.create_owner_tenant_if_not_exist(account)
dify_setup = DifySetup(
version=current_app.config['CURRENT_VERSION']
version=dify_config.CURRENT_VERSION
)
db.session.add(dify_setup)
db.session.commit()
@@ -559,7 +559,7 @@ class RegisterService:
if open_id is not None or provider is not None:
AccountService.link_account_integrate(provider, open_id, account)
if current_app.config['EDITION'] != 'SELF_HOSTED':
if dify_config.EDITION != 'SELF_HOSTED':
tenant = TenantService.create_tenant(f"{account.name}'s Workspace")
TenantService.create_tenant_member(tenant, account, role='owner')
@@ -623,7 +623,7 @@ class RegisterService:
'email': account.email,
'workspace_id': tenant.id,
}
expiryHours = current_app.config['INVITE_EXPIRY_HOURS']
expiryHours = dify_config.INVITE_EXPIRY_HOURS
redis_client.setex(
cls._get_invitation_token_key(token),
expiryHours * 60 * 60,
+407
View File
@@ -0,0 +1,407 @@
import logging
import httpx
import yaml # type: ignore
from events.app_event import app_model_config_was_updated, app_was_created
from extensions.ext_database import db
from models.account import Account
from models.model import App, AppMode, AppModelConfig
from models.workflow import Workflow
from services.workflow_service import WorkflowService
logger = logging.getLogger(__name__)
current_dsl_version = "0.1.0"
dsl_to_dify_version_mapping: dict[str, str] = {
"0.1.0": "0.6.0", # dsl version -> from dify version
}
class AppDslService:
@classmethod
def import_and_create_new_app_from_url(cls, tenant_id: str, url: str, args: dict, account: Account) -> App:
"""
Import app dsl from url and create new app
:param tenant_id: tenant id
:param url: import url
:param args: request args
:param account: Account instance
"""
try:
max_size = 10 * 1024 * 1024 # 10MB
timeout = httpx.Timeout(10.0)
with httpx.stream("GET", url.strip(), follow_redirects=True, timeout=timeout) as response:
response.raise_for_status()
total_size = 0
content = b""
for chunk in response.iter_bytes():
total_size += len(chunk)
if total_size > max_size:
raise ValueError("File size exceeds the limit of 10MB")
content += chunk
except httpx.HTTPStatusError as http_err:
raise ValueError(f"HTTP error occurred: {http_err}")
except httpx.RequestError as req_err:
raise ValueError(f"Request error occurred: {req_err}")
except Exception as e:
raise ValueError(f"Failed to fetch DSL from URL: {e}")
if not content:
raise ValueError("Empty content from url")
try:
data = content.decode("utf-8")
except UnicodeDecodeError as e:
raise ValueError(f"Error decoding content: {e}")
return cls.import_and_create_new_app(tenant_id, data, args, account)
@classmethod
def import_and_create_new_app(cls, tenant_id: str, data: str, args: dict, account: Account) -> App:
"""
Import app dsl and create new app
:param tenant_id: tenant id
:param data: import data
:param args: request args
:param account: Account instance
"""
try:
import_data = yaml.safe_load(data)
except yaml.YAMLError:
raise ValueError("Invalid YAML format in data argument.")
# check or repair dsl version
import_data = cls._check_or_fix_dsl(import_data)
app_data = import_data.get('app')
if not app_data:
raise ValueError("Missing app in data argument")
# get app basic info
name = args.get("name") if args.get("name") else app_data.get('name')
description = args.get("description") if args.get("description") else app_data.get('description', '')
icon = args.get("icon") if args.get("icon") else app_data.get('icon')
icon_background = args.get("icon_background") if args.get("icon_background") \
else app_data.get('icon_background')
# import dsl and create app
app_mode = AppMode.value_of(app_data.get('mode'))
if app_mode in [AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]:
app = cls._import_and_create_new_workflow_based_app(
tenant_id=tenant_id,
app_mode=app_mode,
workflow_data=import_data.get('workflow'),
account=account,
name=name,
description=description,
icon=icon,
icon_background=icon_background
)
elif app_mode in [AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.COMPLETION]:
app = cls._import_and_create_new_model_config_based_app(
tenant_id=tenant_id,
app_mode=app_mode,
model_config_data=import_data.get('model_config'),
account=account,
name=name,
description=description,
icon=icon,
icon_background=icon_background
)
else:
raise ValueError("Invalid app mode")
return app
@classmethod
def import_and_overwrite_workflow(cls, app_model: App, data: str, account: Account) -> Workflow:
"""
Import app dsl and overwrite workflow
:param app_model: App instance
:param data: import data
:param account: Account instance
"""
try:
import_data = yaml.safe_load(data)
except yaml.YAMLError:
raise ValueError("Invalid YAML format in data argument.")
# check or repair dsl version
import_data = cls._check_or_fix_dsl(import_data)
app_data = import_data.get('app')
if not app_data:
raise ValueError("Missing app in data argument")
# import dsl and overwrite app
app_mode = AppMode.value_of(app_data.get('mode'))
if app_mode not in [AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]:
raise ValueError("Only support import workflow in advanced-chat or workflow app.")
if app_data.get('mode') != app_model.mode:
raise ValueError(
f"App mode {app_data.get('mode')} is not matched with current app mode {app_mode.value}")
return cls._import_and_overwrite_workflow_based_app(
app_model=app_model,
workflow_data=import_data.get('workflow'),
account=account,
)
@classmethod
def export_dsl(cls, app_model: App) -> str:
"""
Export app
:param app_model: App instance
:return:
"""
app_mode = AppMode.value_of(app_model.mode)
export_data = {
"version": current_dsl_version,
"kind": "app",
"app": {
"name": app_model.name,
"mode": app_model.mode,
"icon": app_model.icon,
"icon_background": app_model.icon_background,
"description": app_model.description
}
}
if app_mode in [AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]:
cls._append_workflow_export_data(export_data, app_model)
else:
cls._append_model_config_export_data(export_data, app_model)
return yaml.dump(export_data)
@classmethod
def _check_or_fix_dsl(cls, import_data: dict) -> dict:
"""
Check or fix dsl
:param import_data: import data
"""
if not import_data.get('version'):
import_data['version'] = "0.1.0"
if not import_data.get('kind') or import_data.get('kind') != "app":
import_data['kind'] = "app"
if import_data.get('version') != current_dsl_version:
# Currently only one DSL version, so no difference checks or compatibility fixes will be performed.
logger.warning(f"DSL version {import_data.get('version')} is not compatible "
f"with current version {current_dsl_version}, related to "
f"Dify version {dsl_to_dify_version_mapping.get(current_dsl_version)}.")
return import_data
@classmethod
def _import_and_create_new_workflow_based_app(cls,
tenant_id: str,
app_mode: AppMode,
workflow_data: dict,
account: Account,
name: str,
description: str,
icon: str,
icon_background: str) -> App:
"""
Import app dsl and create new workflow based app
:param tenant_id: tenant id
:param app_mode: app mode
:param workflow_data: workflow data
:param account: Account instance
:param name: app name
:param description: app description
:param icon: app icon
:param icon_background: app icon background
"""
if not workflow_data:
raise ValueError("Missing workflow in data argument "
"when app mode is advanced-chat or workflow")
app = cls._create_app(
tenant_id=tenant_id,
app_mode=app_mode,
account=account,
name=name,
description=description,
icon=icon,
icon_background=icon_background
)
# init draft workflow
workflow_service = WorkflowService()
draft_workflow = workflow_service.sync_draft_workflow(
app_model=app,
graph=workflow_data.get('graph', {}),
features=workflow_data.get('../core/app/features', {}),
unique_hash=None,
account=account
)
workflow_service.publish_workflow(
app_model=app,
account=account,
draft_workflow=draft_workflow
)
return app
@classmethod
def _import_and_overwrite_workflow_based_app(cls,
app_model: App,
workflow_data: dict,
account: Account) -> Workflow:
"""
Import app dsl and overwrite workflow based app
:param app_model: App instance
:param workflow_data: workflow data
:param account: Account instance
"""
if not workflow_data:
raise ValueError("Missing workflow in data argument "
"when app mode is advanced-chat or workflow")
# fetch draft workflow by app_model
workflow_service = WorkflowService()
current_draft_workflow = workflow_service.get_draft_workflow(app_model=app_model)
if current_draft_workflow:
unique_hash = current_draft_workflow.unique_hash
else:
unique_hash = None
# sync draft workflow
draft_workflow = workflow_service.sync_draft_workflow(
app_model=app_model,
graph=workflow_data.get('graph', {}),
features=workflow_data.get('features', {}),
unique_hash=unique_hash,
account=account
)
return draft_workflow
@classmethod
def _import_and_create_new_model_config_based_app(cls,
tenant_id: str,
app_mode: AppMode,
model_config_data: dict,
account: Account,
name: str,
description: str,
icon: str,
icon_background: str) -> App:
"""
Import app dsl and create new model config based app
:param tenant_id: tenant id
:param app_mode: app mode
:param model_config_data: model config data
:param account: Account instance
:param name: app name
:param description: app description
:param icon: app icon
:param icon_background: app icon background
"""
if not model_config_data:
raise ValueError("Missing model_config in data argument "
"when app mode is chat, agent-chat or completion")
app = cls._create_app(
tenant_id=tenant_id,
app_mode=app_mode,
account=account,
name=name,
description=description,
icon=icon,
icon_background=icon_background
)
app_model_config = AppModelConfig()
app_model_config = app_model_config.from_model_config_dict(model_config_data)
app_model_config.app_id = app.id
db.session.add(app_model_config)
db.session.commit()
app.app_model_config_id = app_model_config.id
app_model_config_was_updated.send(
app,
app_model_config=app_model_config
)
return app
@classmethod
def _create_app(cls,
tenant_id: str,
app_mode: AppMode,
account: Account,
name: str,
description: str,
icon: str,
icon_background: str) -> App:
"""
Create new app
:param tenant_id: tenant id
:param app_mode: app mode
:param account: Account instance
:param name: app name
:param description: app description
:param icon: app icon
:param icon_background: app icon background
"""
app = App(
tenant_id=tenant_id,
mode=app_mode.value,
name=name,
description=description,
icon=icon,
icon_background=icon_background,
enable_site=True,
enable_api=True
)
db.session.add(app)
db.session.commit()
app_was_created.send(app, account=account)
return app
@classmethod
def _append_workflow_export_data(cls, export_data: dict, app_model: App) -> None:
"""
Append workflow export data
:param export_data: export data
:param app_model: App instance
"""
workflow_service = WorkflowService()
workflow = workflow_service.get_draft_workflow(app_model)
if not workflow:
raise ValueError("Missing draft workflow configuration, please check.")
export_data['workflow'] = {
"graph": workflow.graph_dict,
"features": workflow.features_dict
}
@classmethod
def _append_model_config_export_data(cls, export_data: dict, app_model: App) -> None:
"""
Append model config export data
:param export_data: export data
:param app_model: App instance
"""
app_model_config = app_model.app_model_config
if not app_model_config:
raise ValueError("Missing app configuration, please check.")
export_data['model_config'] = app_model_config.to_dict()
+2 -2
View File
@@ -1,6 +1,7 @@
from collections.abc import Generator
from typing import Any, Union
from configs import dify_config
from core.app.apps.advanced_chat.app_generator import AdvancedChatAppGenerator
from core.app.apps.agent_chat.app_generator import AgentChatAppGenerator
from core.app.apps.chat.app_generator import ChatAppGenerator
@@ -89,8 +90,7 @@ class AppGenerateService:
def _get_max_active_requests(app_model: App) -> int:
max_active_requests = app_model.max_active_requests
if app_model.max_active_requests is None:
from flask import current_app
max_active_requests = int(current_app.config['APP_MAX_ACTIVE_REQUESTS'])
max_active_requests = int(dify_config.APP_MAX_ACTIVE_REQUESTS)
return max_active_requests
@classmethod
+3 -119
View File
@@ -3,11 +3,10 @@ import logging
from datetime import datetime, timezone
from typing import cast
import yaml
from flask import current_app
from flask_login import current_user
from flask_sqlalchemy.pagination import Pagination
from configs import dify_config
from constants.model_template import default_app_templates
from core.agent.entities import AgentToolEntity
from core.app.features.rate_limiting import RateLimit
@@ -17,13 +16,12 @@ from core.model_runtime.entities.model_entities import ModelPropertyKey, ModelTy
from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel
from core.tools.tool_manager import ToolManager
from core.tools.utils.configuration import ToolParameterConfigurationManager
from events.app_event import app_model_config_was_updated, app_was_created
from events.app_event import app_was_created
from extensions.ext_database import db
from models.account import Account
from models.model import App, AppMode, AppModelConfig
from models.tools import ApiToolProvider
from services.tag_service import TagService
from services.workflow_service import WorkflowService
from tasks.remove_app_and_related_data_task import remove_app_and_related_data_task
@@ -144,120 +142,6 @@ class AppService:
return app
def import_app(self, tenant_id: str, data: str, args: dict, account: Account) -> App:
"""
Import app
:param tenant_id: tenant id
:param data: import data
:param args: request args
:param account: Account instance
"""
try:
import_data = yaml.safe_load(data)
except yaml.YAMLError as e:
raise ValueError("Invalid YAML format in data argument.")
app_data = import_data.get('app')
model_config_data = import_data.get('model_config')
workflow = import_data.get('workflow')
if not app_data:
raise ValueError("Missing app in data argument")
app_mode = AppMode.value_of(app_data.get('mode'))
if app_mode in [AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]:
if not workflow:
raise ValueError("Missing workflow in data argument "
"when app mode is advanced-chat or workflow")
elif app_mode in [AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.COMPLETION]:
if not model_config_data:
raise ValueError("Missing model_config in data argument "
"when app mode is chat, agent-chat or completion")
else:
raise ValueError("Invalid app mode")
app = App(
tenant_id=tenant_id,
mode=app_data.get('mode'),
name=args.get("name") if args.get("name") else app_data.get('name'),
description=args.get("description") if args.get("description") else app_data.get('description', ''),
icon=args.get("icon") if args.get("icon") else app_data.get('icon'),
icon_background=args.get("icon_background") if args.get("icon_background") \
else app_data.get('icon_background'),
enable_site=True,
enable_api=True
)
db.session.add(app)
db.session.commit()
app_was_created.send(app, account=account)
if workflow:
# init draft workflow
workflow_service = WorkflowService()
draft_workflow = workflow_service.sync_draft_workflow(
app_model=app,
graph=workflow.get('graph'),
features=workflow.get('features'),
unique_hash=None,
account=account
)
workflow_service.publish_workflow(
app_model=app,
account=account,
draft_workflow=draft_workflow
)
if model_config_data:
app_model_config = AppModelConfig()
app_model_config = app_model_config.from_model_config_dict(model_config_data)
app_model_config.app_id = app.id
db.session.add(app_model_config)
db.session.commit()
app.app_model_config_id = app_model_config.id
app_model_config_was_updated.send(
app,
app_model_config=app_model_config
)
return app
def export_app(self, app: App) -> str:
"""
Export app
:param app: App instance
:return:
"""
app_mode = AppMode.value_of(app.mode)
export_data = {
"app": {
"name": app.name,
"mode": app.mode,
"icon": app.icon,
"icon_background": app.icon_background,
"description": app.description
}
}
if app_mode in [AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]:
workflow_service = WorkflowService()
workflow = workflow_service.get_draft_workflow(app)
export_data['workflow'] = {
"graph": workflow.graph_dict,
"features": workflow.features_dict
}
else:
app_model_config = app.app_model_config
export_data['model_config'] = app_model_config.to_dict()
return yaml.dump(export_data)
def get_app(self, app: App) -> App:
"""
Get App
@@ -446,7 +330,7 @@ class AppService:
# get all tools
tools = agent_config.get('tools', [])
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ "/console/api/workspaces/current/tool-provider/builtin/")
for tool in tools:
+11 -4
View File
@@ -6,10 +6,10 @@ import time
import uuid
from typing import Optional
from flask import current_app
from flask_login import current_user
from sqlalchemy import func
from configs import dify_config
from core.errors.error import LLMBadRequestError, ProviderTokenNotInitError
from core.model_manager import ModelManager
from core.model_runtime.entities.model_entities import ModelType
@@ -524,7 +524,14 @@ class DocumentService:
@staticmethod
def delete_document(document):
# trigger document_was_deleted signal
document_was_deleted.send(document.id, dataset_id=document.dataset_id, doc_form=document.doc_form)
file_id = None
if document.data_source_type == 'upload_file':
if document.data_source_info:
data_source_info = document.data_source_info_dict
if data_source_info and 'upload_file_id' in data_source_info:
file_id = data_source_info['upload_file_id']
document_was_deleted.send(document.id, dataset_id=document.dataset_id,
doc_form=document.doc_form, file_id=file_id)
db.session.delete(document)
db.session.commit()
@@ -650,7 +657,7 @@ class DocumentService:
elif document_data["data_source"]["type"] == "website_crawl":
website_info = document_data["data_source"]['info_list']['website_info_list']
count = len(website_info['urls'])
batch_upload_limit = int(current_app.config['BATCH_UPLOAD_LIMIT'])
batch_upload_limit = int(dify_config.BATCH_UPLOAD_LIMIT)
if count > batch_upload_limit:
raise ValueError(f"You have reached the batch upload limit of {batch_upload_limit}.")
@@ -1028,7 +1035,7 @@ class DocumentService:
elif document_data["data_source"]["type"] == "website_crawl":
website_info = document_data["data_source"]['info_list']['website_info_list']
count = len(website_info['urls'])
batch_upload_limit = int(current_app.config['BATCH_UPLOAD_LIMIT'])
batch_upload_limit = int(dify_config.BATCH_UPLOAD_LIMIT)
if count > batch_upload_limit:
raise ValueError(f"You have reached the batch upload limit of {batch_upload_limit}.")
@@ -1,9 +1,9 @@
from enum import Enum
from typing import Optional
from flask import current_app
from pydantic import BaseModel, ConfigDict
from configs import dify_config
from core.entities.model_entities import ModelWithProviderEntity, ProviderModelWithStatusEntity
from core.entities.provider_entities import QuotaConfiguration
from core.model_runtime.entities.common_entities import I18nObject
@@ -67,7 +67,7 @@ class ProviderResponse(BaseModel):
def __init__(self, **data) -> None:
super().__init__(**data)
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ f"/console/api/workspaces/current/model-providers/{self.provider}")
if self.icon_small is not None:
self.icon_small = I18nObject(
@@ -96,7 +96,7 @@ class ProviderWithModelsResponse(BaseModel):
def __init__(self, **data) -> None:
super().__init__(**data)
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ f"/console/api/workspaces/current/model-providers/{self.provider}")
if self.icon_small is not None:
self.icon_small = I18nObject(
@@ -119,7 +119,7 @@ class SimpleProviderEntityResponse(SimpleProviderEntity):
def __init__(self, **data) -> None:
super().__init__(**data)
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ f"/console/api/workspaces/current/model-providers/{self.provider}")
if self.icon_small is not None:
self.icon_small = I18nObject(
+6 -6
View File
@@ -1,6 +1,6 @@
from flask import current_app
from pydantic import BaseModel, ConfigDict
from configs import dify_config
from services.billing_service import BillingService
from services.enterprise.enterprise_service import EnterpriseService
@@ -51,7 +51,7 @@ class FeatureService:
cls._fulfill_params_from_env(features)
if current_app.config['BILLING_ENABLED']:
if dify_config.BILLING_ENABLED:
cls._fulfill_params_from_billing_api(features, tenant_id)
return features
@@ -60,16 +60,16 @@ class FeatureService:
def get_system_features(cls) -> SystemFeatureModel:
system_features = SystemFeatureModel()
if current_app.config['ENTERPRISE_ENABLED']:
if dify_config.ENTERPRISE_ENABLED:
cls._fulfill_params_from_enterprise(system_features)
return system_features
@classmethod
def _fulfill_params_from_env(cls, features: FeatureModel):
features.can_replace_logo = current_app.config['CAN_REPLACE_LOGO']
features.model_load_balancing_enabled = current_app.config['MODEL_LB_ENABLED']
features.dataset_operator_enabled = current_app.config['DATASET_OPERATOR_ENABLED']
features.can_replace_logo = dify_config.CAN_REPLACE_LOGO
features.model_load_balancing_enabled = dify_config.MODEL_LB_ENABLED
features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED
@classmethod
def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str):
+7 -9
View File
@@ -4,11 +4,11 @@ import uuid
from collections.abc import Generator
from typing import Union
from flask import current_app
from flask_login import current_user
from werkzeug.datastructures import FileStorage
from werkzeug.exceptions import NotFound
from configs import dify_config
from core.file.upload_file_parser import UploadFileParser
from core.rag.extractor.extract_processor import ExtractProcessor
from extensions.ext_database import db
@@ -35,7 +35,7 @@ class FileService:
extension = file.filename.split('.')[-1]
if len(filename) > 200:
filename = filename.split('.')[0][:200] + '.' + extension
etl_type = current_app.config['ETL_TYPE']
etl_type = dify_config.ETL_TYPE
allowed_extensions = UNSTRUCTURED_ALLOWED_EXTENSIONS + IMAGE_EXTENSIONS if etl_type == 'Unstructured' \
else ALLOWED_EXTENSIONS + IMAGE_EXTENSIONS
if extension.lower() not in allowed_extensions:
@@ -50,9 +50,9 @@ class FileService:
file_size = len(file_content)
if extension.lower() in IMAGE_EXTENSIONS:
file_size_limit = current_app.config.get("UPLOAD_IMAGE_FILE_SIZE_LIMIT") * 1024 * 1024
file_size_limit = dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT * 1024 * 1024
else:
file_size_limit = current_app.config.get("UPLOAD_FILE_SIZE_LIMIT") * 1024 * 1024
file_size_limit = dify_config.UPLOAD_FILE_SIZE_LIMIT * 1024 * 1024
if file_size > file_size_limit:
message = f'File size exceeded. {file_size} > {file_size_limit}'
@@ -73,10 +73,9 @@ class FileService:
storage.save(file_key, file_content)
# save file to db
config = current_app.config
upload_file = UploadFile(
tenant_id=current_tenant_id,
storage_type=config['STORAGE_TYPE'],
storage_type=dify_config.STORAGE_TYPE,
key=file_key,
name=filename,
size=file_size,
@@ -106,10 +105,9 @@ class FileService:
storage.save(file_key, text.encode('utf-8'))
# save file to db
config = current_app.config
upload_file = UploadFile(
tenant_id=current_user.current_tenant_id,
storage_type=config['STORAGE_TYPE'],
storage_type=dify_config.STORAGE_TYPE,
key=file_key,
name=text_name + '.txt',
size=len(text),
@@ -138,7 +136,7 @@ class FileService:
# extract text from file
extension = upload_file.extension
etl_type = current_app.config['ETL_TYPE']
etl_type = dify_config.ETL_TYPE
allowed_extensions = UNSTRUCTURED_ALLOWED_EXTENSIONS if etl_type == 'Unstructured' else ALLOWED_EXTENSIONS
if extension.lower() not in allowed_extensions:
raise UnsupportedFileTypeError()
+7 -9
View File
@@ -6,10 +6,11 @@ from typing import Optional
import requests
from flask import current_app
from configs import dify_config
from constants.languages import languages
from extensions.ext_database import db
from models.model import App, RecommendedApp
from services.app_service import AppService
from services.app_dsl_service import AppDslService
logger = logging.getLogger(__name__)
@@ -25,7 +26,7 @@ class RecommendedAppService:
:param language: language
:return:
"""
mode = current_app.config.get('HOSTED_FETCH_APP_TEMPLATES_MODE', 'remote')
mode = dify_config.HOSTED_FETCH_APP_TEMPLATES_MODE
if mode == 'remote':
try:
result = cls._fetch_recommended_apps_from_dify_official(language)
@@ -104,7 +105,7 @@ class RecommendedAppService:
:param language: language
:return:
"""
domain = current_app.config.get('HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN', 'https://tmpl.dify.ai')
domain = dify_config.HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN
url = f'{domain}/apps?language={language}'
response = requests.get(url, timeout=(3, 10))
if response.status_code != 200:
@@ -134,7 +135,7 @@ class RecommendedAppService:
:param app_id: app id
:return:
"""
mode = current_app.config.get('HOSTED_FETCH_APP_TEMPLATES_MODE', 'remote')
mode = dify_config.HOSTED_FETCH_APP_TEMPLATES_MODE
if mode == 'remote':
try:
result = cls._fetch_recommended_app_detail_from_dify_official(app_id)
@@ -157,7 +158,7 @@ class RecommendedAppService:
:param app_id: App ID
:return:
"""
domain = current_app.config.get('HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN', 'https://tmpl.dify.ai')
domain = dify_config.HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN
url = f'{domain}/apps/{app_id}'
response = requests.get(url, timeout=(3, 10))
if response.status_code != 200:
@@ -186,16 +187,13 @@ class RecommendedAppService:
if not app_model or not app_model.is_public:
return None
app_service = AppService()
export_str = app_service.export_app(app_model)
return {
'id': app_model.id,
'name': app_model.name,
'icon': app_model.icon,
'icon_background': app_model.icon_background,
'mode': app_model.mode,
'export_data': export_str
'export_data': AppDslService.export_dsl(app_model=app_model)
}
@classmethod
@@ -429,6 +429,7 @@ class ApiToolManageService:
db_provider=provider,
decrypt_credentials=True
)
user_provider.labels = labels
# add icon
ToolTransformService.repack_provider(user_provider)
@@ -2,8 +2,7 @@ import json
import logging
from typing import Optional, Union
from flask import current_app
from configs import dify_config
from core.tools.entities.api_entities import UserTool, UserToolProvider
from core.tools.entities.common_entities import I18nObject
from core.tools.entities.tool_bundle import ApiToolBundle
@@ -29,7 +28,7 @@ class ToolTransformService:
"""
get tool provider icon url
"""
url_prefix = (current_app.config.get("CONSOLE_API_URL")
url_prefix = (dify_config.CONSOLE_API_URL
+ "/console/api/workspaces/current/tool-provider/")
if provider_type == ToolProviderType.BUILT_IN.value:
-52
View File
@@ -3,8 +3,6 @@ import time
from datetime import datetime, timezone
from typing import Optional
import yaml
from core.app.apps.advanced_chat.app_config_manager import AdvancedChatAppConfigManager
from core.app.apps.workflow.app_config_manager import WorkflowAppConfigManager
from core.model_runtime.utils.encoders import jsonable_encoder
@@ -114,56 +112,6 @@ class WorkflowService:
# return draft workflow
return workflow
def import_draft_workflow(self, app_model: App,
data: str,
account: Account) -> Workflow:
"""
Import draft workflow
:param app_model: App instance
:param data: import data
:param account: Account instance
:return:
"""
try:
import_data = yaml.safe_load(data)
except yaml.YAMLError as e:
raise ValueError("Invalid YAML format in data argument.")
app_data = import_data.get('app')
workflow = import_data.get('workflow')
if not app_data:
raise ValueError("Missing app in data argument")
app_mode = AppMode.value_of(app_data.get('mode'))
if app_mode not in [AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]:
raise ValueError("Only support import workflow in advanced-chat or workflow app.")
if app_data.get('mode') != app_model.mode:
raise ValueError(f"App mode {app_data.get('mode')} is not matched with current app mode {app_model.mode}")
if not workflow:
raise ValueError("Missing workflow in data argument "
"when app mode is advanced-chat or workflow")
# fetch draft workflow by app_model
current_draft_workflow = self.get_draft_workflow(app_model=app_model)
if current_draft_workflow:
unique_hash = current_draft_workflow.unique_hash
else:
unique_hash = None
# sync draft workflow
draft_workflow = self.sync_draft_workflow(
app_model=app_model,
graph=workflow.get('graph'),
features=workflow.get('features'),
unique_hash=unique_hash,
account=account
)
return draft_workflow
def publish_workflow(self, app_model: App,
account: Account,
draft_workflow: Optional[Workflow] = None) -> Workflow:
+2 -2
View File
@@ -1,7 +1,7 @@
from flask import current_app
from flask_login import current_user
from configs import dify_config
from extensions.ext_database import db
from models.account import Tenant, TenantAccountJoin, TenantAccountJoinRole
from services.account_service import TenantService
@@ -35,7 +35,7 @@ class WorkspaceService:
if can_replace_logo and TenantService.has_roles(tenant,
[TenantAccountJoinRole.OWNER, TenantAccountJoinRole.ADMIN]):
base_url = current_app.config.get('FILES_URL')
base_url = dify_config.FILES_URL
replace_webapp_logo = f'{base_url}/files/workspaces/{tenant.id}/webapp-logo' if tenant.custom_config_dict.get('replace_webapp_logo') else None
remove_webapp_brand = tenant.custom_config_dict.get('remove_webapp_brand', False)
+22 -1
View File
@@ -6,6 +6,7 @@ from celery import shared_task
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
from extensions.ext_database import db
from extensions.ext_storage import storage
from models.dataset import (
AppDatasetJoin,
Dataset,
@@ -14,6 +15,7 @@ from models.dataset import (
Document,
DocumentSegment,
)
from models.model import UploadFile
# Add import statement for ValueError
@@ -65,8 +67,27 @@ def clean_dataset_task(dataset_id: str, tenant_id: str, indexing_technique: str,
db.session.query(DatasetQuery).filter(DatasetQuery.dataset_id == dataset_id).delete()
db.session.query(AppDatasetJoin).filter(AppDatasetJoin.dataset_id == dataset_id).delete()
db.session.commit()
# delete files
if documents:
for document in documents:
try:
if document.data_source_type == 'upload_file':
if document.data_source_info:
data_source_info = document.data_source_info_dict
if data_source_info and 'upload_file_id' in data_source_info:
file_id = data_source_info['upload_file_id']
file = db.session.query(UploadFile).filter(
UploadFile.tenant_id == document.tenant_id,
UploadFile.id == file_id
).first()
if not file:
continue
storage.delete(file.key)
db.session.delete(file)
except Exception:
continue
db.session.commit()
end_at = time.perf_counter()
logging.info(
click.style('Cleaned dataset when dataset deleted: {} latency: {}'.format(dataset_id, end_at - start_at), fg='green'))
+20 -4
View File
@@ -1,21 +1,25 @@
import logging
import time
from typing import Optional
import click
from celery import shared_task
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
from extensions.ext_database import db
from extensions.ext_storage import storage
from models.dataset import Dataset, DocumentSegment
from models.model import UploadFile
@shared_task(queue='dataset')
def clean_document_task(document_id: str, dataset_id: str, doc_form: str):
def clean_document_task(document_id: str, dataset_id: str, doc_form: str, file_id: Optional[str]):
"""
Clean document when document deleted.
:param document_id: document id
:param dataset_id: dataset id
:param doc_form: doc_form
:param file_id: file id
Usage: clean_document_task.delay(document_id, dataset_id)
"""
@@ -39,8 +43,20 @@ def clean_document_task(document_id: str, dataset_id: str, doc_form: str):
db.session.delete(segment)
db.session.commit()
end_at = time.perf_counter()
logging.info(
click.style('Cleaned document when document deleted: {} latency: {}'.format(document_id, end_at - start_at), fg='green'))
if file_id:
file = db.session.query(UploadFile).filter(
UploadFile.id == file_id
).first()
if file:
try:
storage.delete(file.key)
except Exception:
logging.exception("Delete file failed when document deleted, file_id: {}".format(file_id))
db.session.delete(file)
db.session.commit()
end_at = time.perf_counter()
logging.info(
click.style('Cleaned document when document deleted: {} latency: {}'.format(document_id, end_at - start_at), fg='green'))
except Exception:
logging.exception("Cleaned document when document deleted failed")
+2 -2
View File
@@ -4,8 +4,8 @@ import time
import click
from celery import shared_task
from flask import current_app
from configs import dify_config
from core.indexing_runner import DocumentIsPausedException, IndexingRunner
from extensions.ext_database import db
from models.dataset import Dataset, Document
@@ -32,7 +32,7 @@ def document_indexing_task(dataset_id: str, document_ids: list):
if features.billing.enabled:
vector_space = features.vector_space
count = len(document_ids)
batch_upload_limit = int(current_app.config['BATCH_UPLOAD_LIMIT'])
batch_upload_limit = int(dify_config.BATCH_UPLOAD_LIMIT)
if count > batch_upload_limit:
raise ValueError(f"You have reached the batch upload limit of {batch_upload_limit}.")
if 0 < vector_space.limit <= vector_space.size:
@@ -4,8 +4,8 @@ import time
import click
from celery import shared_task
from flask import current_app
from configs import dify_config
from core.indexing_runner import DocumentIsPausedException, IndexingRunner
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
from extensions.ext_database import db
@@ -33,7 +33,7 @@ def duplicate_document_indexing_task(dataset_id: str, document_ids: list):
if features.billing.enabled:
vector_space = features.vector_space
count = len(document_ids)
batch_upload_limit = int(current_app.config['BATCH_UPLOAD_LIMIT'])
batch_upload_limit = int(dify_config.BATCH_UPLOAD_LIMIT)
if count > batch_upload_limit:
raise ValueError(f"You have reached the batch upload limit of {batch_upload_limit}.")
if 0 < vector_space.limit <= vector_space.size:
+3 -2
View File
@@ -3,8 +3,9 @@ import time
import click
from celery import shared_task
from flask import current_app, render_template
from flask import render_template
from configs import dify_config
from extensions.ext_mail import mail
@@ -29,7 +30,7 @@ def send_invite_member_mail_task(language: str, to: str, token: str, inviter_nam
# send invite member mail using different languages
try:
url = f'{current_app.config.get("CONSOLE_WEB_URL")}/activate?token={token}'
url = f'{dify_config.CONSOLE_WEB_URL}/activate?token={token}'
if language == 'zh-Hans':
html_content = render_template('invite_member_mail_template_zh-CN.html',
to=to,
+3 -2
View File
@@ -3,8 +3,9 @@ import time
import click
from celery import shared_task
from flask import current_app, render_template
from flask import render_template
from configs import dify_config
from extensions.ext_mail import mail
@@ -24,7 +25,7 @@ def send_reset_password_mail_task(language: str, to: str, token: str):
# send reset password mail using different languages
try:
url = f'{current_app.config.get("CONSOLE_WEB_URL")}/forgot-password?token={token}'
url = f'{dify_config.CONSOLE_WEB_URL}/forgot-password?token={token}'
if language == 'zh-Hans':
html_content = render_template('reset_password_mail_template_zh-CN.html',
to=to,
+4 -4
View File
@@ -2,7 +2,7 @@ version: '3'
services:
# API service
api:
image: langgenius/dify-api:0.6.13
image: langgenius/dify-api:0.6.14
restart: always
environment:
# Startup mode, 'api' starts the API server.
@@ -40,7 +40,7 @@ services:
# The default value is 300 seconds.
FILES_ACCESS_TIMEOUT: 300
# The maximum number of active requests for the application, where 0 means unlimited, should be a non-negative integer.
APP_MAX_ACTIVE_REQUESTS: ${FILES_ACCESS_TIMEOUT:-0}
APP_MAX_ACTIVE_REQUESTS: 0
# When enabled, migrations will be executed prior to application startup and the application will start after the migrations have completed.
MIGRATION_ENABLED: 'true'
# The configurations of postgres database connection.
@@ -224,7 +224,7 @@ services:
# worker service
# The Celery worker for processing the queue.
worker:
image: langgenius/dify-api:0.6.13
image: langgenius/dify-api:0.6.14
restart: always
environment:
CONSOLE_WEB_URL: ''
@@ -390,7 +390,7 @@ services:
# Frontend web application.
web:
image: langgenius/dify-web:0.6.13
image: langgenius/dify-web:0.6.14
restart: always
environment:
# The base URL of console application api server, refers to the Console base URL of WEB service if console domain is
+4 -4
View File
@@ -12,7 +12,7 @@ x-shared-env: &shared-api-worker-env
OPENAI_API_BASE: ${OPENAI_API_BASE:-https://api.openai.com/v1}
FILES_URL: ${FILES_URL:-}
FILES_ACCESS_TIMEOUT: ${FILES_ACCESS_TIMEOUT:-300}
APP_MAX_ACTIVE_REQUESTS: ${FILES_ACCESS_TIMEOUT:-0}
APP_MAX_ACTIVE_REQUESTS: ${APP_MAX_ACTIVE_REQUESTS:-0}
MIGRATION_ENABLED: ${MIGRATION_ENABLED:-true}
DEPLOY_ENV: ${DEPLOY_ENV:-PRODUCTION}
DIFY_BIND_ADDRESS: ${DIFY_BIND_ADDRESS:-0.0.0.0}
@@ -177,7 +177,7 @@ x-shared-env: &shared-api-worker-env
services:
# API service
api:
image: langgenius/dify-api:0.6.13
image: langgenius/dify-api:0.6.14
restart: always
environment:
# Use the shared environment variables.
@@ -197,7 +197,7 @@ services:
# worker service
# The Celery worker for processing the queue.
worker:
image: langgenius/dify-api:0.6.13
image: langgenius/dify-api:0.6.14
restart: always
environment:
# Use the shared environment variables.
@@ -216,7 +216,7 @@ services:
# Frontend web application.
web:
image: langgenius/dify-web:0.6.13
image: langgenius/dify-web:0.6.14
restart: always
environment:
CONSOLE_API_URL: ${CONSOLE_API_URL:-}
+26 -4
View File
@@ -1,10 +1,14 @@
'use client'
import { forwardRef, useState } from 'react'
import { forwardRef, useMemo, useState } from 'react'
import {
useRouter,
useSearchParams,
} from 'next/navigation'
import { useTranslation } from 'react-i18next'
import CreateAppTemplateDialog from '@/app/components/app/create-app-dialog'
import CreateAppModal from '@/app/components/app/create-app-modal'
import CreateFromDSLModal from '@/app/components/app/create-from-dsl-modal'
import CreateFromDSLModal, { CreateFromDSLModalTab } from '@/app/components/app/create-from-dsl-modal'
import { useProviderContext } from '@/context/provider-context'
import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files'
@@ -16,10 +20,21 @@ export type CreateAppCardProps = {
const CreateAppCard = forwardRef<HTMLAnchorElement, CreateAppCardProps>(({ onSuccess }, ref) => {
const { t } = useTranslation()
const { onPlanInfoChanged } = useProviderContext()
const searchParams = useSearchParams()
const { replace } = useRouter()
const dslUrl = searchParams.get('remoteInstallUrl') || undefined
const [showNewAppTemplateDialog, setShowNewAppTemplateDialog] = useState(false)
const [showNewAppModal, setShowNewAppModal] = useState(false)
const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(false)
const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(!!dslUrl)
const activeTab = useMemo(() => {
if (dslUrl)
return CreateFromDSLModalTab.FROM_URL
return undefined
}, [dslUrl])
return (
<a
ref={ref}
@@ -65,7 +80,14 @@ const CreateAppCard = forwardRef<HTMLAnchorElement, CreateAppCardProps>(({ onSuc
/>
<CreateFromDSLModal
show={showCreateFromDSLModal}
onClose={() => setShowCreateFromDSLModal(false)}
onClose={() => {
setShowCreateFromDSLModal(false)
if (dslUrl)
replace('/')
}}
activeTab={activeTab}
dslUrl={dslUrl}
onSuccess={() => {
onPlanInfoChanged()
if (onSuccess)
@@ -17,7 +17,6 @@ import Switch from '@/app/components/base/switch'
import { ChangeType, InputVarType } from '@/app/components/workflow/types'
const TEXT_MAX_LENGTH = 256
const PARAGRAPH_MAX_LENGTH = 1032 * 32
export type IConfigModalProps = {
isCreate?: boolean
@@ -167,7 +166,7 @@ const ConfigModal: FC<IConfigModalProps> = ({
{isStringInput && (
<Field title={t('appDebug.variableConig.maxLength')}>
<ConfigString maxLength={type === InputVarType.textInput ? TEXT_MAX_LENGTH : PARAGRAPH_MAX_LENGTH} modelId={modelConfig.model_id} value={max_length} onChange={handlePayloadChange('max_length')} />
<ConfigString maxLength={type === InputVarType.textInput ? TEXT_MAX_LENGTH : Infinity} modelId={modelConfig.model_id} value={max_length} onChange={handlePayloadChange('max_length')} />
</Field>
)}
@@ -1,7 +1,7 @@
'use client'
import type { MouseEventHandler } from 'react'
import { useRef, useState } from 'react'
import { useMemo, useRef, useState } from 'react'
import { useRouter } from 'next/navigation'
import { useContext } from 'use-context-selector'
import { useTranslation } from 'react-i18next'
@@ -10,25 +10,38 @@ import Uploader from './uploader'
import Button from '@/app/components/base/button'
import Modal from '@/app/components/base/modal'
import { ToastContext } from '@/app/components/base/toast'
import { importApp } from '@/service/apps'
import {
importApp,
importAppFromUrl,
} from '@/service/apps'
import { useAppContext } from '@/context/app-context'
import { useProviderContext } from '@/context/provider-context'
import AppsFull from '@/app/components/billing/apps-full-in-dialog'
import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
import { getRedirection } from '@/utils/app-redirection'
import cn from '@/utils/classnames'
type CreateFromDSLModalProps = {
show: boolean
onSuccess?: () => void
onClose: () => void
activeTab?: string
dslUrl?: string
}
const CreateFromDSLModal = ({ show, onSuccess, onClose }: CreateFromDSLModalProps) => {
export enum CreateFromDSLModalTab {
FROM_FILE = 'from-file',
FROM_URL = 'from-url',
}
const CreateFromDSLModal = ({ show, onSuccess, onClose, activeTab = CreateFromDSLModalTab.FROM_FILE, dslUrl = '' }: CreateFromDSLModalProps) => {
const { push } = useRouter()
const { t } = useTranslation()
const { notify } = useContext(ToastContext)
const [currentFile, setDSLFile] = useState<File>()
const [fileContent, setFileContent] = useState<string>()
const [currentTab, setCurrentTab] = useState(activeTab)
const [dslUrlValue, setDslUrlValue] = useState(dslUrl)
const readFile = (file: File) => {
const reader = new FileReader()
@@ -53,15 +66,26 @@ const CreateFromDSLModal = ({ show, onSuccess, onClose }: CreateFromDSLModalProp
const isCreatingRef = useRef(false)
const onCreate: MouseEventHandler = async () => {
if (currentTab === CreateFromDSLModalTab.FROM_FILE && !currentFile)
return
if (currentTab === CreateFromDSLModalTab.FROM_URL && !dslUrlValue)
return
if (isCreatingRef.current)
return
isCreatingRef.current = true
if (!currentFile)
return
try {
const app = await importApp({
data: fileContent || '',
})
let app
if (currentTab === CreateFromDSLModalTab.FROM_FILE) {
app = await importApp({
data: fileContent || '',
})
}
if (currentTab === CreateFromDSLModalTab.FROM_URL) {
app = await importAppFromUrl({
url: dslUrlValue || '',
})
}
if (onSuccess)
onSuccess()
if (onClose)
@@ -76,24 +100,95 @@ const CreateFromDSLModal = ({ show, onSuccess, onClose }: CreateFromDSLModalProp
isCreatingRef.current = false
}
const tabs = [
{
key: CreateFromDSLModalTab.FROM_FILE,
label: t('app.importFromDSLFile'),
},
{
key: CreateFromDSLModalTab.FROM_URL,
label: t('app.importFromDSLUrl'),
},
]
const buttonDisabled = useMemo(() => {
if (isAppsFull)
return true
if (currentTab === CreateFromDSLModalTab.FROM_FILE)
return !currentFile
if (currentTab === CreateFromDSLModalTab.FROM_URL)
return !dslUrlValue
return false
}, [isAppsFull, currentTab, currentFile, dslUrlValue])
return (
<Modal
className='px-8 py-6 max-w-[520px] w-[520px] rounded-xl'
className='p-0 w-[520px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'
isShow={show}
onClose={() => { }}
>
<div className='relative pb-2 text-xl font-medium leading-[30px] text-gray-900'>{t('app.createFromConfigFile')}</div>
<div className='absolute right-4 top-4 p-2 cursor-pointer' onClick={onClose}>
<RiCloseLine className='w-4 h-4 text-gray-500' />
<div className='flex items-center justify-between pt-6 pl-6 pr-5 pb-3 text-text-primary title-2xl-semi-bold'>
{t('app.importFromDSL')}
<div
className='flex items-center w-8 h-8 cursor-pointer'
onClick={() => onClose()}
>
<RiCloseLine className='w-5 h-5 text-text-tertiary' />
</div>
</div>
<Uploader
file={currentFile}
updateFile={handleFile}
/>
{isAppsFull && <AppsFull loc='app-create-dsl' />}
<div className='pt-6 flex justify-end'>
<div className='flex items-center px-6 h-9 space-x-6 system-md-semibold text-text-tertiary border-b border-divider-subtle'>
{
tabs.map(tab => (
<div
key={tab.key}
className={cn(
'relative flex items-center h-full cursor-pointer',
currentTab === tab.key && 'text-text-primary',
)}
onClick={() => setCurrentTab(tab.key)}
>
{tab.label}
{
currentTab === tab.key && (
<div className='absolute bottom-0 w-full h-[2px] bg-util-colors-blue-brand-blue-brand-600'></div>
)
}
</div>
))
}
</div>
<div className='px-6 py-4'>
{
currentTab === CreateFromDSLModalTab.FROM_FILE && (
<Uploader
className='mt-0'
file={currentFile}
updateFile={handleFile}
/>
)
}
{
currentTab === CreateFromDSLModalTab.FROM_URL && (
<div>
<div className='mb-1 system-md-semibold leading6'>DSL URL</div>
<input
placeholder={t('app.importFromDSLUrlPlaceholder') || ''}
className='px-2 w-full h-8 border border-components-input-border-active bg-components-input-bg-active rounded-lg outline-none appearance-none placeholder:text-components-input-text-placeholder system-sm-regular'
value={dslUrlValue}
onChange={e => setDslUrlValue(e.target.value)}
/>
</div>
)
}
</div>
{isAppsFull && (
<div className='px-6'>
<AppsFull className='mt-0' loc='app-create-dsl' />
</div>
)}
<div className='flex justify-end px-6 py-5'>
<Button className='mr-2' onClick={onClose}>{t('app.newApp.Cancel')}</Button>
<Button disabled={isAppsFull || !currentFile} variant="primary" onClick={onCreate}>{t('app.newApp.Create')}</Button>
<Button disabled={buttonDisabled} variant="primary" onClick={onCreate}>{t('app.newApp.Create')}</Button>
</div>
</Modal>
)
@@ -109,7 +109,7 @@ const SettingsModal: FC<ISettingsModalProps> = ({
}
const validateColorHex = (hex: string | null) => {
if (hex === null || hex.length === 0)
if (hex === null || hex?.length === 0)
return true
const regex = /#([A-Fa-f0-9]{6})/
+32 -43
View File
@@ -1,6 +1,8 @@
import React, { useEffect, useRef, useState } from 'react'
import mermaid from 'mermaid'
import { usePrevious } from 'ahooks'
import CryptoJS from 'crypto-js'
import { ExclamationTriangleIcon } from '@heroicons/react/24/outline'
import LoadingAnim from '@/app/components/base/chat/chat/loading-anim'
let mermaidAPI: any
@@ -40,32 +42,15 @@ const Flowchart = React.forwardRef((props: {
}, ref) => {
const [svgCode, setSvgCode] = useState(null)
const chartId = useRef(`flowchart_${CryptoJS.MD5(props.PrimitiveCode).toString()}`)
const [isRender, setIsRender] = useState(false)
const prevPrimitiveCode = usePrevious(props.PrimitiveCode)
const [isLoading, setIsLoading] = useState(true)
const clearFlowchartCache = () => {
for (let i = localStorage.length - 1; i >= 0; --i) {
const key = localStorage.key(i)
if (key && key.startsWith('flowchart_'))
localStorage.removeItem(key)
}
}
const timeRef = useRef<NodeJS.Timeout>()
const [errMsg, setErrMsg] = useState('')
const renderFlowchart = async (PrimitiveCode: string) => {
try {
const cachedSvg: any = localStorage.getItem(chartId.current)
if (cachedSvg) {
setSvgCode(cachedSvg)
setIsLoading(false)
return
}
if (typeof window !== 'undefined' && mermaidAPI) {
const svgGraph = await mermaidAPI.render(chartId.current, PrimitiveCode)
const dom = new DOMParser().parseFromString(svgGraph.svg, 'text/xml')
if (!dom.querySelector('g.main'))
throw new Error('empty svg')
const base64Svg: any = await svgToBase64(svgGraph.svg)
setSvgCode(base64Svg)
setIsLoading(false)
@@ -74,30 +59,26 @@ const Flowchart = React.forwardRef((props: {
}
}
catch (error) {
clearFlowchartCache()
// eslint-disable-next-line @typescript-eslint/no-use-before-define
handleReRender()
if (prevPrimitiveCode === props.PrimitiveCode) {
setIsLoading(false)
setErrMsg((error as Error).message)
}
}
}
const handleReRender = () => {
setIsRender(false)
setSvgCode(null)
if (chartId.current)
localStorage.removeItem(chartId.current)
setTimeout(() => {
setIsRender(true)
renderFlowchart(props.PrimitiveCode)
}, 100)
}
useEffect(() => {
setIsRender(false)
setTimeout(() => {
setIsRender(true)
const cachedSvg: any = localStorage.getItem(chartId.current)
if (cachedSvg) {
setSvgCode(cachedSvg)
setIsLoading(false)
return
}
if (timeRef.current)
clearTimeout(timeRef.current)
timeRef.current = setTimeout(() => {
renderFlowchart(props.PrimitiveCode)
}, 100)
}, 300)
}, [props.PrimitiveCode])
return (
@@ -105,16 +86,24 @@ const Flowchart = React.forwardRef((props: {
// @ts-expect-error
<div ref={ref}>
{
isRender
&& <div className="mermaid" style={style}>
{svgCode && <img src={svgCode} style={{ width: '100%', height: 'auto' }} alt="Mermaid chart" />}
</div>
svgCode
&& <div className="mermaid" style={style}>
{svgCode && <img src={svgCode} style={{ width: '100%', height: 'auto' }} alt="Mermaid chart" />}
</div>
}
{isLoading
&& <div className='py-4 px-[26px]'>
<LoadingAnim type='text' />
</div>
}
{
errMsg
&& <div className='py-4 px-[26px]'>
<ExclamationTriangleIcon className='w-6 h-6 text-red-500' />
&nbsp;
{errMsg}
</div>
}
</div>
)
})
@@ -8,14 +8,18 @@ import s from './style.module.css'
import cn from '@/utils/classnames'
import GridMask from '@/app/components/base/grid-mask'
const AppsFull: FC<{ loc: string }> = ({
const AppsFull: FC<{ loc: string; className?: string }> = ({
loc,
className,
}) => {
const { t } = useTranslation()
return (
<GridMask wrapperClassName='rounded-lg' canvasClassName='rounded-lg' gradientClassName='rounded-lg'>
<div className='mt-6 px-3.5 py-4 border-2 border-solid border-transparent rounded-lg shadow-md flex flex-col transition-all duration-200 ease-in-out cursor-pointer'>
<div className={cn(
'mt-6 px-3.5 py-4 border-2 border-solid border-transparent rounded-lg shadow-md flex flex-col transition-all duration-200 ease-in-out cursor-pointer',
className,
)}>
<div className='flex justify-between items-center'>
<div className={cn(s.textGradient, 'leading-[24px] text-base font-semibold')}>
<div>{t('billing.apps.fullTipLine1')}</div>
@@ -213,7 +213,7 @@ Workflow applications offers non-session support and is ideal for translation, a
---
<Heading
url='/workflows/:task_id/stop'
url='/workflows/tasks/:task_id/stop'
method='POST'
title='Stop Generate'
name='#stop-generatebacks'
@@ -231,9 +231,9 @@ Workflow applications offers non-session support and is ideal for translation, a
</Col>
<Col sticky>
### Request Example
<CodeGroup title="Request" tag="POST" label="/workflows/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
<CodeGroup title="Request" tag="POST" label="/workflows/tasks/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
```bash {{ title: 'cURL' }}
curl -X POST '${props.appDetail.api_base_url}/workflows/:task_id/stop' \
curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \
-H 'Authorization: Bearer {api_key}' \
-H 'Content-Type: application/json' \
--data-raw '{
@@ -209,7 +209,7 @@ Workflow 应用无会话支持,适合用于翻译/文章写作/总结 AI 等
---
<Heading
url='/workflows/:task_id/stop'
url='/workflows/tasks/:task_id/stop'
method='POST'
title='停止响应'
name='#stop-generatebacks'
@@ -227,9 +227,9 @@ Workflow 应用无会话支持,适合用于翻译/文章写作/总结 AI 等
</Col>
<Col sticky>
### Request Example
<CodeGroup title="Request" tag="POST" label="/workflows/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
<CodeGroup title="Request" tag="POST" label="/workflows/tasks/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
```bash {{ title: 'cURL' }}
curl -X POST '${props.appDetail.api_base_url}/workflows/:task_id/stop' \
curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \
-H 'Authorization: Bearer {api_key}' \
-H 'Content-Type: application/json' \
--data-raw '{
@@ -35,20 +35,25 @@ const ProviderCard: FC<ProviderCardProps> = ({
return (
<div
className='group relative flex flex-col justify-between px-4 py-3 h-[148px] border-[0.5px] border-black/5 rounded-xl shadow-xs hover:shadow-lg'
className='group relative flex flex-col px-4 py-3 h-[148px] border-[0.5px] border-black/5 rounded-xl shadow-xs hover:shadow-lg'
style={{ background: provider.background || DEFAULT_BACKGROUND_COLOR }}
>
<div>
<div className='grow h-0'>
<div className='py-0.5'>
<ProviderIcon provider={provider} />
</div>
{
provider.description && (
<div className='mt-1 leading-4 text-xs text-black/[48]'>{provider.description[language] || provider.description.en_US}</div>
<div
className='mt-1 leading-4 text-xs text-black/[48] line-clamp-4'
title={provider.description[language] || provider.description.en_US}
>
{provider.description[language] || provider.description.en_US}
</div>
)
}
</div>
<div>
<div className='shrink-0'>
<div className={'flex flex-wrap group-hover:hidden gap-0.5'}>
{
provider.supported_model_types.map(modelType => (
+4
View File
@@ -13,6 +13,10 @@ const translation = {
exportFailed: 'Export DSL failed.',
importDSL: 'Import DSL file',
createFromConfigFile: 'Create from DSL file',
importFromDSL: 'Import from DSL',
importFromDSLFile: 'From DSL file',
importFromDSLUrl: 'From URL',
importFromDSLUrlPlaceholder: 'Paste DSL link here',
deleteAppConfirmTitle: 'Delete this app?',
deleteAppConfirmContent:
'Deleting the app is irreversible. Users will no longer be able to access your app, and all prompt configurations and logs will be permanently deleted.',
+89
View File
@@ -0,0 +1,89 @@
const translation = {
title: 'Annotazioni',
name: 'Risposta Annotazione',
editBy: 'Risposta modificata da {{author}}',
noData: {
title: 'Nessuna annotazione',
description:
'Puoi modificare le annotazioni durante il debug dell\'app o importare annotazioni in blocco qui per una risposta di alta qualità.',
},
table: {
header: {
question: 'domanda',
answer: 'risposta',
createdAt: 'creato il',
hits: 'hit',
actions: 'azioni',
addAnnotation: 'Aggiungi Annotazione',
bulkImport: 'Importazione Bulk',
bulkExport: 'Esportazione Bulk',
clearAll: 'Cancella Tutte le Annotazioni',
},
},
editModal: {
title: 'Modifica Risposta Annotazione',
queryName: 'Query Utente',
answerName: 'Bot Narratore',
yourAnswer: 'La tua Risposta',
answerPlaceholder: 'Scrivi qui la tua risposta',
yourQuery: 'La tua Query',
queryPlaceholder: 'Scrivi qui la tua query',
removeThisCache: 'Rimuovi questa Annotazione',
createdAt: 'Creato il',
},
addModal: {
title: 'Aggiungi Risposta Annotazione',
queryName: 'Domanda',
answerName: 'Risposta',
answerPlaceholder: 'Scrivi qui la risposta',
queryPlaceholder: 'Scrivi qui la query',
createNext: 'Aggiungi un\'altra risposta annotata',
},
batchModal: {
title: 'Importazione Bulk',
csvUploadTitle: 'Trascina e rilascia il tuo file CSV qui, oppure ',
browse: 'sfoglia',
tip: 'Il file CSV deve conformarsi alla seguente struttura:',
question: 'domanda',
answer: 'risposta',
contentTitle: 'contenuto chunk',
content: 'contenuto',
template: 'Scarica il modello qui',
cancel: 'Annulla',
run: 'Esegui Batch',
runError: 'Errore nell\'esecuzione del batch',
processing: 'Elaborazione batch in corso',
completed: 'Importazione completata',
error: 'Errore di Importazione',
ok: 'OK',
},
errorMessage: {
answerRequired: 'La risposta è obbligatoria',
queryRequired: 'La domanda è obbligatoria',
},
viewModal: {
annotatedResponse: 'Risposta Annotazione',
hitHistory: 'Storico Hit',
hit: 'Hit',
hits: 'Hit',
noHitHistory: 'Nessuno storico hit',
},
hitHistoryTable: {
query: 'Query',
match: 'Corrispondenza',
response: 'Risposta',
source: 'Fonte',
score: 'Punteggio',
time: 'Ora',
},
initSetup: {
title: 'Configurazione Iniziale Risposta Annotazione',
configTitle: 'Configurazione Risposta Annotazione',
confirmBtn: 'Salva & Abilita',
configConfirmBtn: 'Salva',
},
embeddingModelSwitchTip:
'Modello di vettorizzazione del testo di annotazione, il cambio di modello comporterà una nuova integrazione, comportando costi aggiuntivi.',
}
export default translation
+104
View File
@@ -0,0 +1,104 @@
const translation = {
apiServer: 'Server API',
apiKey: 'Chiave API',
status: 'Stato',
disabled: 'Disabilitato',
ok: 'In Servizio',
copy: 'Copia',
copied: 'Copiato',
play: 'Riproduci',
pause: 'Pausa',
playing: 'In Riproduzione',
loading: 'Caricamento',
merMaind: {
rerender: 'Rifare il rendering',
},
never: 'Mai',
apiKeyModal: {
apiSecretKey: 'Chiave segreta API',
apiSecretKeyTips:
'Per prevenire l\'abuso dell\'API, proteggi la tua chiave API. Evita di usarla come testo semplice nel codice front-end. :)',
createNewSecretKey: 'Crea nuova chiave segreta',
secretKey: 'Chiave Segreta',
created: 'CREATA',
lastUsed: 'ULTIMO UTILIZZO',
generateTips: 'Conserva questa chiave in un luogo sicuro e accessibile.',
},
actionMsg: {
deleteConfirmTitle: 'Eliminare questa chiave segreta?',
deleteConfirmTips: 'Questa azione non può essere annullata.',
ok: 'OK',
},
completionMode: {
title: 'API dell\'App di Completamento',
info: 'Per una generazione di testo di alta qualità, come articoli, riassunti e traduzioni, utilizza l\'API completion-messages con l\'input dell\'utente. La generazione del testo si basa sui parametri del modello e sui modelli di prompt impostati in Dify Prompt Engineering.',
createCompletionApi: 'Crea Messaggio di Completamento',
createCompletionApiTip:
'Crea un Messaggio di Completamento per supportare la modalità domanda e risposta.',
inputsTips:
'(Opzionale) Fornisci campi di input utente come coppie chiave-valore, corrispondenti alle variabili in Prompt Eng. La chiave è il nome della variabile, il Valore è il valore del parametro. Se il tipo di campo è Select, il Valore inviato deve essere una delle scelte preimpostate.',
queryTips: 'Contenuto del testo di input dell\'utente.',
blocking:
'Tipo bloccante, in attesa che l\'esecuzione sia completata e restituisca i risultati. (Le richieste possono essere interrotte se il processo è lungo)',
streaming:
'restituzioni in streaming. Implementazione della restituzione in streaming basata su SSE (Server-Sent Events).',
messageFeedbackApi: 'Feedback sul messaggio (mi piace)',
messageFeedbackApiTip:
'Valuta i messaggi ricevuti per conto degli utenti finali con mi piace o non mi piace. Questi dati sono visibili nella pagina Log & Annotazioni e utilizzati per futuri affinamenti del modello.',
messageIDTip: 'ID del Messaggio',
ratingTip: 'mi piace o non mi piace, null è annulla',
parametersApi: 'Ottenere informazioni sui parametri dell\'applicazione',
parametersApiTip:
'Recupera i parametri di input configurati, inclusi nomi delle variabili, nomi dei campi, tipi e valori predefiniti. Tipicamente utilizzato per visualizzare questi campi in un modulo o per riempire i valori predefiniti dopo il caricamento del client.',
},
chatMode: {
title: 'API dell\'App di Chat',
info: 'Per app conversazionali versatili utilizzando un formato Q&A, chiama l\'API chat-messages per avviare il dialogo. Mantieni conversazioni in corso passando l\'conversation_id restituito. I parametri di risposta e i modelli dipendono dalle impostazioni di Dify Prompt Eng.',
createChatApi: 'Crea messaggio di chat',
createChatApiTip:
'Crea un nuovo messaggio di conversazione o continua un dialogo esistente.',
inputsTips:
'(Opzionale) Fornisci campi di input utente come coppie chiave-valore, corrispondenti alle variabili in Prompt Eng. La chiave è il nome della variabile, il Valore è il valore del parametro. Se il tipo di campo è Select, il Valore inviato deve essere una delle scelte preimpostate.',
queryTips: 'Contenuto della domanda di input dell\'utente',
blocking:
'Tipo bloccante, in attesa che l\'esecuzione sia completata e restituisca i risultati. (Le richieste possono essere interrotte se il processo è lungo)',
streaming:
'restituzioni in streaming. Implementazione della restituzione in streaming basata su SSE (Server-Sent Events).',
conversationIdTip:
'(Opzionale) ID della Conversazione: lasciare vuoto per la prima conversazione; passare l\'conversation_id dal contesto per continuare il dialogo.',
messageFeedbackApi:
'Feedback terminale del messaggio dell\'utente, mi piace',
messageFeedbackApiTip:
'Valuta i messaggi ricevuti per conto degli utenti finali con mi piace o non mi piace. Questi dati sono visibili nella pagina Log & Annotazioni e utilizzati per futuri affinamenti del modello.',
messageIDTip: 'ID del Messaggio',
ratingTip: 'mi piace o non mi piace, null è annulla',
chatMsgHistoryApi: 'Ottieni la cronologia dei messaggi della chat',
chatMsgHistoryApiTip:
'La prima pagina restituisce l\'ultimo `limite` barra, che è in ordine inverso.',
chatMsgHistoryConversationIdTip: 'ID della Conversazione',
chatMsgHistoryFirstId:
'ID del primo record di chat nella pagina corrente. L\'impostazione predefinita è nessuna.',
chatMsgHistoryLimit: 'Quante chat vengono restituite in una richiesta',
conversationsListApi: 'Ottieni l\'elenco delle conversazioni',
conversationsListApiTip:
'Ottiene l\'elenco delle sessioni dell\'utente corrente. Per impostazione predefinita, vengono restituite le ultime 20 sessioni.',
conversationsListFirstIdTip:
'ID dell\'ultimo record nella pagina corrente, predefinito nessuno.',
conversationsListLimitTip:
'Quante chat vengono restituite in una richiesta',
conversationRenamingApi: 'Rinomina conversazione',
conversationRenamingApiTip:
'Rinomina conversazioni; il nome viene visualizzato nelle interfacce client multi-sessione.',
conversationRenamingNameTip: 'Nuovo nome',
parametersApi: 'Ottenere informazioni sui parametri dell\'applicazione',
parametersApiTip:
'Recupera i parametri di input configurati, inclusi nomi delle variabili, nomi dei campi, tipi e valori predefiniti. Tipicamente utilizzato per visualizzare questi campi in un modulo o per riempire i valori predefiniti dopo il caricamento del client.',
},
develop: {
requestBody: 'Corpo della Richiesta',
pathParams: 'Parametri del Percorso',
query: 'Query',
},
}
export default translation
+471
View File
@@ -0,0 +1,471 @@
const translation = {
pageTitle: {
line1: 'PROMPT',
line2: 'Engineering',
},
orchestrate: 'Orchestra',
promptMode: {
simple: 'Passa alla modalità esperto per modificare tutto il PROMPT',
advanced: 'Modalità esperto',
switchBack: 'Torna indietro',
advancedWarning: {
title:
'Sei passato alla modalità esperto e una volta modificato il PROMPT, NON potrai tornare alla modalità base.',
description: 'In modalità esperto, puoi modificare tutto il PROMPT.',
learnMore: 'Scopri di più',
ok: 'OK',
},
operation: {
addMessage: 'Aggiungi messaggio',
},
contextMissing:
'Componente del contesto mancante, l\'efficacia del prompt potrebbe non essere buona.',
},
operation: {
applyConfig: 'Pubblica',
resetConfig: 'Ripristina',
debugConfig: 'Debug',
addFeature: 'Aggiungi funzione',
automatic: 'Automatico',
stopResponding: 'Interrompi la risposta',
agree: 'mi piace',
disagree: 'non mi piace',
cancelAgree: 'Annulla mi piace',
cancelDisagree: 'Annulla non mi piace',
userAction: 'Azione utente',
},
notSetAPIKey: {
title: 'La chiave del provider LLM non è stata impostata',
trailFinished: 'Periodo di prova terminato',
description:
'La chiave del provider LLM non è stata impostata e deve essere impostata prima del debug.',
settingBtn: 'Vai alle impostazioni',
},
trailUseGPT4Info: {
title: 'Non supporta gpt-4 adesso',
description: 'Per utilizzare gpt-4, per favore imposta la chiave API.',
},
feature: {
groupChat: {
title: 'Migliora chat',
description:
'Aggiungere impostazioni pre-conversazione per le app può migliorare l\'esperienza utente.',
},
groupExperience: {
title: 'Migliora esperienza',
},
conversationOpener: {
title: 'Iniziatore di conversazione',
description:
'In un\'app di chat, la prima frase che l\'IA pronuncia attivamente all\'utente viene solitamente usata come benvenuto.',
},
suggestedQuestionsAfterAnswer: {
title: 'Follow-up',
description:
'Impostare suggerimenti per le prossime domande può offrire agli utenti una chat migliore.',
resDes: '3 suggerimenti per la prossima domanda dell\'utente.',
tryToAsk: 'Prova a chiedere',
},
moreLikeThis: {
title: 'Altri simili',
description:
'Genera più testi contemporaneamente, poi modifica e continua a generare',
generateNumTip: 'Numero di ogni generazione',
tip: 'L\'utilizzo di questa funzione comporterà un costo aggiuntivo di token',
},
speechToText: {
title: 'Da voce a testo',
description: 'Una volta abilitato, puoi usare l\'input vocale.',
resDes: 'L\'input vocale è abilitato',
},
textToSpeech: {
title: 'Da testo a voce',
description:
'Una volta abilitato, il testo può essere convertito in voce.',
resDes: 'Il testo in audio è abilitato',
},
citation: {
title: 'Citazioni e attribuzioni',
description:
'Una volta abilitato, mostra il documento sorgente e la sezione attribuita del contenuto generato.',
resDes: 'Citazioni e attribuzioni sono abilitate',
},
annotation: {
title: 'Risposta annotata',
description:
'Puoi aggiungere manualmente una risposta di alta qualità alla cache per una corrispondenza prioritaria con domande utente simili.',
resDes: 'Risposta annotata è abilitata',
scoreThreshold: {
title: 'Soglia di punteggio',
description:
'Utilizzata per impostare la soglia di somiglianza per la risposta annotata.',
easyMatch: 'Corrispondenza facile',
accurateMatch: 'Corrispondenza accurata',
},
matchVariable: {
title: 'Variabile di corrispondenza',
choosePlaceholder: 'Scegli la variabile di corrispondenza',
},
cacheManagement: 'Annotazioni',
cached: 'Annotato',
remove: 'Rimuovi',
removeConfirm: 'Eliminare questa annotazione?',
add: 'Aggiungi annotazione',
edit: 'Modifica annotazione',
},
dataSet: {
title: 'Contesto',
noData: 'Puoi importare Conoscenza come contesto',
words: 'Parole',
textBlocks: 'Blocchi di testo',
selectTitle: 'Seleziona Conoscenza di riferimento',
selected: 'Conoscenza selezionata',
noDataSet: 'Nessuna Conoscenza trovata',
toCreate: 'Vai a creare',
notSupportSelectMulti: 'Attualmente supporta solo una Conoscenza',
queryVariable: {
title: 'Variabile di query',
tip: 'Questa variabile verrà utilizzata come input di query per il recupero del contesto, ottenendo informazioni contestuali relative all\'input di questa variabile.',
choosePlaceholder: 'Scegli la variabile di query',
noVar: 'Nessuna variabile',
noVarTip: 'per favore crea una variabile nella sezione Variabili',
unableToQueryDataSet: 'Impossibile interrogare la Conoscenza',
unableToQueryDataSetTip:
'Impossibile interrogare la Conoscenza correttamente, per favore scegli una variabile di query nel contesto.',
ok: 'OK',
contextVarNotEmpty:
'La variabile di query del contesto non può essere vuota',
deleteContextVarTitle: 'Eliminare la variabile “{{varName}}”?',
deleteContextVarTip:
'Questa variabile è stata impostata come variabile di query del contesto, rimuoverla influenzerà l\'uso normale della Conoscenza. Se hai ancora bisogno di eliminarla, per favore riselezionala nella sezione del contesto.',
},
},
tools: {
title: 'Strumenti',
tips: 'Gli strumenti forniscono un metodo di chiamata API standard, prendendo input dell\'utente o variabili come parametri di richiesta per interrogare dati esterni come contesto.',
toolsInUse: '{{count}} strumenti in uso',
modal: {
title: 'Strumento',
toolType: {
title: 'Tipo di strumento',
placeholder: 'Per favore seleziona il tipo di strumento',
},
name: {
title: 'Nome',
placeholder: 'Per favore inserisci il nome',
},
variableName: {
title: 'Nome della variabile',
placeholder: 'Per favore inserisci il nome della variabile',
},
},
},
conversationHistory: {
title: 'Cronologia della conversazione',
description: 'Imposta i nomi di prefisso per i ruoli di conversazione',
tip: 'La Cronologia della Conversazione non è abilitata, per favore aggiungi <histories> nel prompt sopra.',
learnMore: 'Scopri di più',
editModal: {
title: 'Modifica i nomi dei ruoli della conversazione',
userPrefix: 'Prefisso utente',
assistantPrefix: 'Prefisso assistente',
},
},
toolbox: {
title: 'CASSETTA DEGLI ATTREZZI',
},
moderation: {
title: 'Moderazione del contenuto',
description:
'Proteggi l\'output del modello utilizzando l\'API di moderazione o mantenendo un elenco di parole sensibili.',
allEnabled: 'Contenuto INPUT/OUTPUT abilitato',
inputEnabled: 'Contenuto INPUT abilitato',
outputEnabled: 'Contenuto OUTPUT abilitato',
modal: {
title: 'Impostazioni di moderazione del contenuto',
provider: {
title: 'Provider',
openai: 'Moderazione OpenAI',
openaiTip: {
prefix:
'La moderazione OpenAI richiede una chiave API OpenAI configurata nel',
suffix: '.',
},
keywords: 'Parole chiave',
},
keywords: {
tip: 'Una per linea, separate da interruzioni di linea. Fino a 100 caratteri per linea.',
placeholder: 'Una per linea, separate da interruzioni di linea',
line: 'Linea',
},
content: {
input: 'Modera contenuto INPUT',
output: 'Modera contenuto OUTPUT',
preset: 'Risposte preimpostate',
placeholder: 'Contenuto delle risposte preimpostate qui',
condition:
'Moderazione contenuto INPUT e OUTPUT abilitato almeno uno',
fromApi: 'Le risposte preimpostate sono restituite dall\'API',
errorMessage: 'Le risposte preimpostate non possono essere vuote',
supportMarkdown: 'Markdown supportato',
},
openaiNotConfig: {
before:
'La moderazione OpenAI richiede una chiave API OpenAI configurata nel',
after: '',
},
},
},
},
automatic: {
title: 'Orchestrazione automatizzata delle applicazioni',
description:
'Descrivi il tuo scenario, Dify orchestrerà un\'applicazione per te.',
intendedAudience: 'Chi è il pubblico di destinazione?',
intendedAudiencePlaceHolder: 'es. Studente',
solveProblem: 'Quali problemi sperano che l\'IA possa risolvere per loro?',
solveProblemPlaceHolder:
'es. Estrarre approfondimenti e riassumere informazioni da lunghi rapporti e articoli',
generate: 'Genera',
audiencesRequired: 'Pubblico richiesto',
problemRequired: 'Problema richiesto',
resTitle: 'Abbiamo orchestrato la seguente applicazione per te.',
apply: 'Applica questa orchestrazione',
noData:
'Descrivi il tuo caso d\'uso a sinistra, l\'anteprima dell\'orchestrazione verrà mostrata qui.',
loading: 'Orchestrazione dell\'applicazione per te...',
overwriteTitle: 'Sovrascrivere la configurazione esistente?',
overwriteMessage:
'Applicando questa orchestrazione sovrascriverai la configurazione esistente.',
},
resetConfig: {
title: 'Confermare il ripristino?',
message:
'Il ripristino scarta le modifiche, ripristinando l\'ultima configurazione pubblicata.',
},
errorMessage: {
nameOfKeyRequired: 'nome della chiave: {{key}} richiesto',
valueOfVarRequired: 'il valore di {{key}} non può essere vuoto',
queryRequired: 'Il testo della richiesta è richiesto.',
waitForResponse:
'Per favore attendi che la risposta al messaggio precedente sia completata.',
waitForBatchResponse:
'Per favore attendi che la risposta all\'attività batch sia completata.',
notSelectModel: 'Per favore scegli un modello',
waitForImgUpload: 'Per favore attendi il caricamento dell\'immagine',
},
chatSubTitle: 'Istruzioni',
completionSubTitle: 'Prompt di prefisso',
promptTip:
'I prompt guidano le risposte dell\'IA con istruzioni e vincoli. Inserisci variabili come {{input}}. Questo prompt non sarà visibile agli utenti.',
formattingChangedTitle: 'Formato modificato',
formattingChangedText:
'Modificare il formato resetterà l\'area di debug, sei sicuro?',
variableTitle: 'Variabili',
variableTip:
'Gli utenti riempiono le variabili in un modulo, sostituendo automaticamente le variabili nel prompt.',
notSetVar:
'Le variabili consentono agli utenti di introdurre parole del prompt o osservazioni di apertura quando compilano i moduli. Puoi provare a inserire `{{input}}` nelle parole del prompt.',
autoAddVar:
'Le variabili non definite riferite nel pre-prompt, vuoi aggiungerle nel modulo di input dell\'utente?',
variableTable: {
key: 'Chiave Variabile',
name: 'Nome Campo Input Utente',
optional: 'Opzionale',
type: 'Tipo di Input',
action: 'Azioni',
typeString: 'Stringa',
typeSelect: 'Seleziona',
},
varKeyError: {
canNoBeEmpty: 'La chiave della variabile non può essere vuota',
tooLong:
'La chiave della variabile: {{key}} è troppo lunga. Non può essere più lunga di 30 caratteri',
notValid:
'La chiave della variabile: {{key}} non è valida. Può contenere solo lettere, numeri e underscore',
notStartWithNumber:
'La chiave della variabile: {{key}} non può iniziare con un numero',
keyAlreadyExists: 'La chiave della variabile: {{key}} esiste già',
},
otherError: {
promptNoBeEmpty: 'Il prompt non può essere vuoto',
historyNoBeEmpty:
'La cronologia delle conversazioni deve essere impostata nel prompt',
queryNoBeEmpty: 'La query deve essere impostata nel prompt',
},
variableConig: {
'addModalTitle': 'Aggiungi Campo Input',
'editModalTitle': 'Modifica Campo Input',
'description': 'Impostazione per la variabile {{varName}}',
'fieldType': 'Tipo di campo',
'string': 'Testo breve',
'text-input': 'Testo breve',
'paragraph': 'Paragrafo',
'select': 'Seleziona',
'number': 'Numero',
'notSet': 'Non impostato, prova a scrivere {{input}} nel prompt di prefisso',
'stringTitle': 'Opzioni della casella di testo del modulo',
'maxLength': 'Lunghezza massima',
'options': 'Opzioni',
'addOption': 'Aggiungi opzione',
'apiBasedVar': 'Variabile basata su API',
'varName': 'Nome Variabile',
'labelName': 'Nome Etichetta',
'inputPlaceholder': 'Per favore inserisci',
'content': 'Contenuto',
'required': 'Richiesto',
'errorMsg': {
varNameRequired: 'Il nome della variabile è richiesto',
labelNameRequired: 'Il nome dell\'etichetta è richiesto',
varNameCanBeRepeat: 'Il nome della variabile non può essere ripetuto',
atLeastOneOption: 'È richiesta almeno un\'opzione',
optionRepeat: 'Ci sono opzioni ripetute',
},
},
vision: {
name: 'Visione',
description:
'Abilitare la visione permetterà al modello di prendere immagini e rispondere a domande su di esse.',
settings: 'Impostazioni',
visionSettings: {
title: 'Impostazioni di visione',
resolution: 'Risoluzione',
resolutionTooltip: `La bassa risoluzione permetterà al modello di ricevere una versione a bassa risoluzione 512 x 512 dell\\'immagine e di rappresentare l\\'immagine con un budget di 65 token. Questo permette all\\'API di restituire risposte più veloci e di consumare meno token di input per casi d\\'uso che non richiedono alta definizione.
\n
L\\'alta risoluzione permetterà al modello di vedere prima l\\'immagine a bassa risoluzione e poi di creare ritagli dettagliati delle immagini di input come quadrati 512px basati sulla dimensione dell\\'immagine di input. Ciascuno dei ritagli dettagliati utilizza il doppio del budget dei token per un totale di 129 token.`,
high: 'Alta',
low: 'Bassa',
uploadMethod: 'Metodo di caricamento',
both: 'Entrambi',
localUpload: 'Caricamento locale',
url: 'URL',
uploadLimit: 'Limite di caricamento',
},
},
voice: {
name: 'Voce',
defaultDisplay: 'Voce predefinita',
description: 'Impostazioni della voce da testo a voce',
settings: 'Impostazioni',
voiceSettings: {
title: 'Impostazioni della voce',
language: 'Lingua',
resolutionTooltip: 'Supporto per la lingua della voce da testo a voce.',
voice: 'Voce',
autoPlay: 'Riproduzione automatica',
autoPlayEnabled: 'Acceso',
autoPlayDisabled: 'Spento',
},
},
openingStatement: {
title: 'Iniziatore di conversazione',
add: 'Aggiungi',
writeOpener: 'Scrivi introduzione',
placeholder:
'Scrivi qui il tuo messaggio introduttivo, puoi usare variabili, prova a scrivere {{variable}}.',
openingQuestion: 'Domande iniziali',
noDataPlaceHolder:
'Iniziare la conversazione con l\'utente può aiutare l\'IA a stabilire un legame più stretto con loro nelle applicazioni conversazionali.',
varTip: 'Puoi usare variabili, prova a scrivere {{variable}}',
tooShort:
'Sono richieste almeno 20 parole di prompt iniziale per generare un\'introduzione alla conversazione.',
notIncludeKey:
'Il prompt iniziale non include la variabile: {{key}}. Per favore aggiungila al prompt iniziale.',
},
modelConfig: {
model: 'Modello',
setTone: 'Imposta tono delle risposte',
title: 'Modello e Parametri',
modeType: {
chat: 'Chat',
completion: 'Completamento',
},
},
inputs: {
title: 'Debug e Anteprima',
noPrompt: 'Prova a scrivere qualche prompt nell\'input pre-prompt',
userInputField: 'Campo Input Utente',
noVar:
'Compila il valore della variabile, che verrà automaticamente sostituito nel prompt ogni volta che inizia una nuova sessione.',
chatVarTip:
'Compila il valore della variabile, che verrà automaticamente sostituito nel prompt ogni volta che inizia una nuova sessione',
completionVarTip:
'Compila il valore della variabile, che verrà automaticamente sostituito nelle parole del prompt ogni volta che viene inviata una domanda.',
previewTitle: 'Anteprima prompt',
queryTitle: 'Contenuto query',
queryPlaceholder: 'Per favore inserisci il testo della richiesta.',
run: 'ESEGUI',
},
result: 'Testo di output',
datasetConfig: {
settingTitle: 'Impostazioni di recupero',
knowledgeTip: 'Clicca sul pulsante “+” per aggiungere conoscenza',
retrieveOneWay: {
title: 'Recupero N-a-1',
description:
'Basato sull\'intento dell\'utente e le descrizioni della Conoscenza, l\'Agente seleziona autonomamente la migliore Conoscenza per la query. Ideale per applicazioni con Conoscenze distinte e limitate.',
},
retrieveMultiWay: {
title: 'Recupero multipath',
description:
'Basato sull\'intento dell\'utente, esegue query su tutte le Conoscenze, recupera testo rilevante da più fonti e seleziona i migliori risultati corrispondenti alla query dell\'utente dopo il reranking. È richiesta la configurazione dell\'API del modello di reranking.',
},
rerankModelRequired: 'Il modello di reranking è richiesto',
params: 'Parametri',
top_k: 'Top K',
top_kTip:
'Usato per filtrare i chunk più simili alle domande degli utenti. Il sistema regolerà anche dinamicamente il valore di Top K, in base ai max_tokens del modello selezionato.',
score_threshold: 'Soglia di punteggio',
score_thresholdTip:
'Usato per impostare la soglia di somiglianza per il filtraggio dei chunk.',
retrieveChangeTip:
'Modificare la modalità di indicizzazione e la modalità di recupero può influenzare le applicazioni associate a questa Conoscenza.',
},
debugAsSingleModel: 'Debug come modello singolo',
debugAsMultipleModel: 'Debug come modelli multipli',
duplicateModel: 'Duplica',
publishAs: 'Pubblica come',
assistantType: {
name: 'Tipo di assistente',
chatAssistant: {
name: 'Assistente base',
description:
'Costruisci un assistente basato su chat utilizzando un grande modello linguistico',
},
agentAssistant: {
name: 'Assistente Agente',
description:
'Costruisci un Agente intelligente che può scegliere autonomamente strumenti per completare i compiti',
},
},
agent: {
agentMode: 'Modalità Agente',
agentModeDes: 'Imposta il tipo di modalità di inferenza per l\'agente',
agentModeType: {
ReACT: 'ReAct',
functionCall: 'Chiamata di Funzione',
},
setting: {
name: 'Impostazioni Agente',
description:
'Le impostazioni dell\'Assistente Agente permettono di impostare la modalità agente e funzionalità avanzate come prompt integrati, disponibili solo nel tipo Agente.',
maximumIterations: {
name: 'Iterazioni massime',
description:
'Limita il numero di iterazioni che un assistente agente può eseguire',
},
},
buildInPrompt: 'Prompt Integrato',
firstPrompt: 'Primo Prompt',
nextIteration: 'Prossima Iterazione',
promptPlaceholder: 'Scrivi qui il tuo prompt',
tools: {
name: 'Strumenti',
description:
'L\'utilizzo degli strumenti può estendere le capacità del LLM, come cercare su internet o eseguire calcoli scientifici',
enabled: 'Abilitato',
},
},
}
export default translation
+95
View File
@@ -0,0 +1,95 @@
const translation = {
title: 'Registri',
description:
'I registri registrano lo stato di esecuzione dell\'applicazione, inclusi input degli utenti e risposte AI.',
dateTimeFormat: 'MM/DD/YYYY hh:mm A',
table: {
header: {
time: 'Ora',
endUser: 'Utente Finale',
input: 'Input',
output: 'Output',
summary: 'Titolo',
messageCount: 'Conteggio Messaggi',
userRate: 'Valutazione Utente',
adminRate: 'Valutazione Op.',
startTime: 'ORA INIZIO',
status: 'STATO',
runtime: 'TEMPO DI ESECUZIONE',
tokens: 'TOKEN',
user: 'UTENTE FINALE',
version: 'VERSIONE',
},
pagination: {
previous: 'Prec',
next: 'Succ',
},
empty: {
noChat: 'Nessuna conversazione ancora',
noOutput: 'Nessun output',
element: {
title: 'C\'è qualcuno?',
content:
'Osserva e annota le interazioni tra gli utenti finali e le applicazioni AI qui per migliorare continuamente l\'accuratezza dell\'AI. Puoi provare a <shareLink>condividere</shareLink> o a <testLink>testare</testLink> l\'app Web tu stesso, quindi tornare a questa pagina.',
},
},
},
detail: {
time: 'Ora',
conversationId: 'ID Conversazione',
promptTemplate: 'Template Prompt',
promptTemplateBeforeChat:
'Template Prompt Prima della Chat · Come Messaggio di Sistema',
annotationTip: 'Miglioramenti Segnalati da {{user}}',
timeConsuming: 'Tempo Trascorso',
second: 's',
tokenCost: 'Token spesi',
loading: 'caricamento',
operation: {
like: 'mi piace',
dislike: 'non mi piace',
addAnnotation: 'Aggiungi Miglioramento',
editAnnotation: 'Modifica Miglioramento',
annotationPlaceholder:
'Inserisci la risposta prevista che desideri che l\'AI dia, che può essere utilizzata per il perfezionamento del modello e il miglioramento continuo della qualità della generazione di testo in futuro.',
},
variables: 'Variabili',
uploadImages: 'Immagini Caricate',
},
filter: {
period: {
today: 'Oggi',
last7days: 'Ultimi 7 Giorni',
last4weeks: 'Ultime 4 settimane',
last3months: 'Ultimi 3 mesi',
last12months: 'Ultimi 12 mesi',
monthToDate: 'Mese corrente',
quarterToDate: 'Trimestre corrente',
yearToDate: 'Anno corrente',
allTime: 'Tutto il tempo',
},
annotation: {
all: 'Tutti',
annotated: 'Miglioramenti Annotati ({{count}} elementi)',
not_annotated: 'Non Annotati',
},
},
workflowTitle: 'Registri del Workflow',
workflowSubtitle: 'Il registro ha registrato il funzionamento di Automate.',
runDetail: {
title: 'Registro Conversazione',
workflowTitle: 'Dettagli Registro',
},
promptLog: 'Registro Prompt',
agentLog: 'Registro Agente',
viewLog: 'Visualizza Registro',
agentLogDetail: {
agentMode: 'Modalità Agente',
toolUsed: 'Strumento Usato',
iterations: 'Iterazioni',
iteration: 'Iterazione',
finalProcessing: 'Elaborazione Finale',
},
}
export default translation
+177
View File
@@ -0,0 +1,177 @@
const translation = {
welcome: {
firstStepTip: 'Per iniziare,',
enterKeyTip: 'inserisci la tua OpenAI API Key qui sotto',
getKeyTip: 'Ottieni la tua API Key dalla dashboard di OpenAI',
placeholder: 'La tua OpenAI API Key(es. sk-xxxx)',
},
apiKeyInfo: {
cloud: {
trial: {
title: 'Stai usando la quota di prova di {{providerName}}.',
description:
'La quota di prova è fornita per il tuo utilizzo di test. Prima che le chiamate della quota di prova siano esaurite, configura il tuo fornitore di modelli o acquista una quota aggiuntiva.',
},
exhausted: {
title:
'La tua quota di prova è stata utilizzata, configura la tua APIKey.',
description:
'La tua quota di prova è stata esaurita. Configura il tuo fornitore di modelli o acquista una quota aggiuntiva.',
},
},
selfHost: {
title: {
row1: 'Per iniziare,',
row2: 'configura prima il tuo fornitore di modelli.',
},
},
callTimes: 'Numero di chiamate',
usedToken: 'Token utilizzati',
setAPIBtn: 'Vai a configurare il fornitore di modelli',
tryCloud: 'O prova la versione cloud di Dify con quota gratuita',
},
overview: {
title: 'Panoramica',
appInfo: {
explanation: 'AI WebApp pronta all\'uso',
accessibleAddress: 'URL Pubblico',
preview: 'Anteprima',
regenerate: 'Rigenera',
regenerateNotice: 'Vuoi rigenerare l\'URL pubblico?',
preUseReminder: 'Attiva WebApp prima di continuare.',
settings: {
entry: 'Impostazioni',
title: 'Impostazioni WebApp',
webName: 'Nome WebApp',
webDesc: 'Descrizione WebApp',
webDescTip:
'Questo testo verrà visualizzato sul lato client, fornendo una guida di base su come utilizzare l\'applicazione',
webDescPlaceholder: 'Inserisci la descrizione della WebApp',
language: 'Lingua',
workflow: {
title: 'Fasi del Workflow',
show: 'Mostra',
hide: 'Nascondi',
},
chatColorTheme: 'Tema colore chat',
chatColorThemeDesc: 'Imposta il tema colore del chatbot',
chatColorThemeInverted: 'Inverso',
invalidHexMessage: 'Valore esadecimale non valido',
more: {
entry: 'Mostra più impostazioni',
copyright: 'Copyright',
copyRightPlaceholder:
'Inserisci il nome dell\'autore o dell\'organizzazione',
privacyPolicy: 'Privacy Policy',
privacyPolicyPlaceholder: 'Inserisci il link alla privacy policy',
privacyPolicyTip:
'Aiuta i visitatori a capire i dati raccolti dall\'applicazione, vedi la <privacyPolicyLink>Privacy Policy</privacyPolicyLink> di Dify.',
customDisclaimer: 'Disclaimer Personalizzato',
customDisclaimerPlaceholder:
'Inserisci il testo del disclaimer personalizzato',
customDisclaimerTip:
'Il testo del disclaimer personalizzato verrà visualizzato sul lato client, fornendo informazioni aggiuntive sull\'applicazione',
},
},
embedded: {
entry: 'Incorporato',
title: 'Incorpora sul sito web',
explanation: 'Scegli come incorporare l\'app chat nel tuo sito web',
iframe:
'Per aggiungere l\'app chat ovunque sul tuo sito web, aggiungi questo iframe al tuo codice HTML.',
scripts:
'Per aggiungere un\'app chat in basso a destra del tuo sito web, aggiungi questo codice al tuo HTML.',
chromePlugin: 'Installa l\'estensione Chrome di Dify Chatbot',
copied: 'Copiato',
copy: 'Copia',
},
qrcode: {
title: 'Codice QR per condividere',
scan: 'Scansiona Condividi Applicazione',
download: 'Scarica Codice QR',
},
customize: {
way: 'modo',
entry: 'Personalizza',
title: 'Personalizza AI WebApp',
explanation:
'Puoi personalizzare il frontend della Web App per adattarla alle tue esigenze di scenario e stile.',
way1: {
name: 'Fork il codice client, modificalo e distribuiscilo su Vercel (consigliato)',
step1: 'Fork il codice client e modificalo',
step1Tip:
'Clicca qui per fork il codice sorgente nel tuo account GitHub e modifica il codice',
step1Operation: 'Dify-WebClient',
step2: 'Distribuisci su Vercel',
step2Tip:
'Clicca qui per importare il repository su Vercel e distribuisci',
step2Operation: 'Importa repository',
step3: 'Configura le variabili di ambiente',
step3Tip: 'Aggiungi le seguenti variabili di ambiente su Vercel',
},
way2: {
name: 'Scrivi codice lato client per chiamare l\'API e distribuiscilo su un server',
operation: 'Documentazione',
},
},
},
apiInfo: {
title: 'API del servizio backend',
explanation: 'Facilmente integrabile nella tua applicazione',
accessibleAddress: 'Endpoint del servizio API',
doc: 'Riferimento API',
},
status: {
running: 'In servizio',
disable: 'Disabilita',
},
},
analysis: {
title: 'Analisi',
ms: 'ms',
tokenPS: 'Token/s',
totalMessages: {
title: 'Totale Messaggi',
explanation:
'Conteggio delle interazioni giornaliere con l\'AI; ingegneria dei prompt/debug esclusi.',
},
activeUsers: {
title: 'Utenti Attivi',
explanation:
'Utenti unici che interagiscono in Q&A con l\'AI; ingegneria dei prompt/debug esclusi.',
},
tokenUsage: {
title: 'Uso dei Token',
explanation:
'Riflette l\'uso giornaliero dei token del modello linguistico per l\'applicazione, utile per il controllo dei costi.',
consumed: 'Consumati',
},
avgSessionInteractions: {
title: 'Interazioni Medie per Sessione',
explanation:
'Conteggio continuo delle comunicazioni utente-AI; per applicazioni basate su conversazione.',
},
avgUserInteractions: {
title: 'Interazioni Medie per Utente',
explanation:
'Riflette la frequenza giornaliera di utilizzo degli utenti. Questo parametro riflette la fedeltà degli utenti.',
},
userSatisfactionRate: {
title: 'Tasso di Soddisfazione degli Utenti',
explanation:
'Il numero di mi piace per 1.000 messaggi. Indica la proporzione di risposte con cui gli utenti sono molto soddisfatti.',
},
avgResponseTime: {
title: 'Tempo Medio di Risposta',
explanation:
'Tempo (ms) per l\'AI per elaborare/rispondere; per applicazioni basate su testo.',
},
tps: {
title: 'Velocità di Output dei Token',
explanation:
'Misura le prestazioni del LLM. Conta la velocità di output dei token del LLM dall\'inizio della richiesta al completamento dell\'output.',
},
},
}
export default translation
+138
View File
@@ -0,0 +1,138 @@
const translation = {
createApp: 'CREA APP',
types: {
all: 'Tutti',
chatbot: 'Chatbot',
agent: 'Agente',
workflow: 'Flusso di lavoro',
completion: 'Completamento',
},
duplicate: 'Duplica',
duplicateTitle: 'Duplica App',
export: 'Esporta DSL',
exportFailed: 'Esportazione DSL fallita.',
importDSL: 'Importa file DSL',
createFromConfigFile: 'Crea da file DSL',
deleteAppConfirmTitle: 'Eliminare questa app?',
deleteAppConfirmContent:
'Eliminare l\'app è irreversibile. Gli utenti non potranno più accedere alla tua app e tutte le configurazioni e i log dei prompt verranno eliminati permanentemente.',
appDeleted: 'App eliminata',
appDeleteFailed: 'Eliminazione dell\'app fallita',
join: 'Unisciti alla comunità',
communityIntro:
'Discuta con membri del team, collaboratori e sviluppatori su diversi canali.',
roadmap: 'Vedi la nostra roadmap',
newApp: {
startFromBlank: 'Crea da zero',
startFromTemplate: 'Crea da modello',
captionAppType: 'Che tipo di app vuoi creare?',
chatbotDescription:
'Crea un\'applicazione basata sulla chat. Questa app utilizza un formato domanda-e-risposta, consentendo più round di conversazione continua.',
completionDescription:
'Crea un\'applicazione che genera testo di alta qualità basato sui prompt, come articoli, riassunti, traduzioni e altro.',
completionWarning: 'Questo tipo di app non sarà più supportato.',
agentDescription:
'Crea un Agente intelligente che può scegliere autonomamente gli strumenti per completare i compiti',
workflowDescription:
'Crea un\'applicazione che genera testo di alta qualità basato su flussi di lavoro orchestrati con un alto grado di personalizzazione. È adatto per utenti esperti.',
workflowWarning: 'Attualmente in beta',
chatbotType: 'Metodo di orchestrazione Chatbot',
basic: 'Base',
basicTip: 'Per principianti, può passare a Chatflow in seguito',
basicFor: 'PER PRINCIPIANTI',
basicDescription:
'L\'Orchestrazione di base consente l\'orchestrazione di un\'app Chatbot utilizzando impostazioni semplici, senza la possibilità di modificare i prompt integrati. È adatta per principianti.',
advanced: 'Chatflow',
advancedFor: 'Per utenti avanzati',
advancedDescription:
'L\'Orchestrazione del flusso di lavoro orchestra i Chatbot sotto forma di flussi di lavoro, offrendo un alto grado di personalizzazione, inclusa la possibilità di modificare i prompt integrati. È adatta per utenti esperti.',
captionName: 'Icona e nome dell\'app',
appNamePlaceholder: 'Dai un nome alla tua app',
captionDescription: 'Descrizione',
appDescriptionPlaceholder: 'Inserisci la descrizione dell\'app',
useTemplate: 'Usa questo modello',
previewDemo: 'Anteprima demo',
chatApp: 'Assistente',
chatAppIntro:
'Voglio creare un\'applicazione basata sulla chat. Questa app utilizza un formato domanda-e-risposta, consentendo più round di conversazione continua.',
agentAssistant: 'Nuovo Agente Assistente',
completeApp: 'Generatore di Testi',
completeAppIntro:
'Voglio creare un\'applicazione che genera testo di alta qualità basato sui prompt, come articoli, riassunti, traduzioni e altro.',
showTemplates: 'Voglio scegliere da un modello',
hideTemplates: 'Torna alla selezione della modalità',
Create: 'Crea',
Cancel: 'Annulla',
nameNotEmpty: 'Il nome non può essere vuoto',
appTemplateNotSelected: 'Seleziona un modello',
appTypeRequired: 'Seleziona un tipo di app',
appCreated: 'App creata',
appCreateFailed: 'Creazione dell\'app fallita',
},
editApp: 'Modifica Info',
editAppTitle: 'Modifica Info App',
editDone: 'Info app aggiornata',
editFailed: 'Aggiornamento delle info dell\'app fallito',
emoji: {
ok: 'OK',
cancel: 'Annulla',
},
switch: 'Passa a Orchestrazione del flusso di lavoro',
switchTipStart:
'Verrà creata una nuova copia dell\'app per te, e la nuova copia passerà a Orchestrazione del flusso di lavoro. La nuova copia ',
switchTip: 'non permetterà',
switchTipEnd: ' di tornare a Orchestrazione di base.',
switchLabel: 'La copia dell\'app da creare',
removeOriginal: 'Elimina l\'app originale',
switchStart: 'Inizia il passaggio',
typeSelector: {
all: 'TUTTI I Tipi',
chatbot: 'Chatbot',
agent: 'Agente',
workflow: 'Flusso di lavoro',
completion: 'Completamento',
},
tracing: {
title: 'Tracciamento delle prestazioni dell\'app',
description:
'Configurazione di un provider LLMOps di terze parti e tracciamento delle prestazioni dell\'app.',
config: 'Config',
collapse: 'Comprimi',
expand: 'Espandi',
tracing: 'Tracciamento',
disabled: 'Disabilitato',
disabledTip: 'Configura prima il provider',
enabled: 'In servizio',
tracingDescription:
'Cattura il contesto completo dell\'esecuzione dell\'app, incluse chiamate LLM, contesto, prompt, richieste HTTP e altro, su una piattaforma di tracciamento di terze parti.',
configProviderTitle: {
configured: 'Configurato',
notConfigured: 'Configura il provider per abilitare il tracciamento',
moreProvider: 'Altri Provider',
},
langsmith: {
title: 'LangSmith',
description:
'Una piattaforma all-in-one per sviluppatori per ogni fase del ciclo di vita delle applicazioni alimentate da LLM.',
},
langfuse: {
title: 'Langfuse',
description:
'Tracce, valutazioni, gestione dei prompt e metriche per debug e miglioramento della tua applicazione LLM.',
},
inUse: 'In uso',
configProvider: {
title: 'Config ',
placeholder: 'Inserisci il tuo {{key}}',
project: 'Progetto',
publicKey: 'Chiave pubblica',
secretKey: 'Chiave segreta',
viewDocsLink: 'Visualizza documenti di {{key}}',
removeConfirmTitle: 'Rimuovere la configurazione di {{key}}?',
removeConfirmContent:
'La configurazione attuale è in uso, rimuovendola disattiverà la funzione di Tracciamento.',
},
},
}
export default translation
+131
View File
@@ -0,0 +1,131 @@
const translation = {
currentPlan: 'Piano Attuale',
upgradeBtn: {
plain: 'Aggiorna Piano',
encourage: 'Aggiorna Ora',
encourageShort: 'Aggiorna',
},
viewBilling: 'Gestisci fatturazione e abbonamenti',
buyPermissionDeniedTip:
'Contatta l\'amministratore della tua azienda per abbonarti',
plansCommon: {
title: 'Scegli un piano adatto a te',
yearlyTip: 'Ottieni 2 mesi gratis abbonandoti annualmente!',
mostPopular: 'Più Popolare',
planRange: {
monthly: 'Mensile',
yearly: 'Annuale',
},
month: 'mese',
year: 'anno',
save: 'Risparmia ',
free: 'Gratuito',
currentPlan: 'Piano Attuale',
contractSales: 'Contatta vendite',
contractOwner: 'Contatta il responsabile del team',
startForFree: 'Inizia gratis',
getStartedWith: 'Inizia con ',
contactSales: 'Contatta le vendite',
talkToSales: 'Parla con le vendite',
modelProviders: 'Fornitori di Modelli',
teamMembers: 'Membri del Team',
annotationQuota: 'Quota di Annotazione',
buildApps: 'Crea App',
vectorSpace: 'Spazio Vettoriale',
vectorSpaceBillingTooltip:
'Ogni 1MB può memorizzare circa 1,2 milioni di caratteri di dati vettoriali (stimato utilizzando OpenAI Embeddings, varia tra i modelli).',
vectorSpaceTooltip:
'Lo Spazio Vettoriale è il sistema di memoria a lungo termine necessario per permettere agli LLM di comprendere i tuoi dati.',
documentsUploadQuota: 'Quota di Caricamento Documenti',
documentProcessingPriority: 'Priorità di Elaborazione Documenti',
documentProcessingPriorityTip:
'Per una maggiore priorità di elaborazione dei documenti, aggiorna il tuo piano.',
documentProcessingPriorityUpgrade:
'Elabora più dati con maggiore precisione a velocità più elevate.',
priority: {
'standard': 'Standard',
'priority': 'Priorità',
'top-priority': 'Massima Priorità',
},
logsHistory: 'Storico dei Log',
customTools: 'Strumenti Personalizzati',
unavailable: 'Non Disponibile',
days: 'giorni',
unlimited: 'Illimitato',
support: 'Supporto',
supportItems: {
communityForums: 'Forum della comunità',
emailSupport: 'Supporto via email',
priorityEmail: 'Supporto via email e chat prioritario',
logoChange: 'Cambia logo',
SSOAuthentication: 'Autenticazione SSO',
personalizedSupport: 'Supporto personalizzato',
dedicatedAPISupport: 'Supporto API dedicato',
customIntegration: 'Integrazione e supporto personalizzato',
ragAPIRequest: 'Richieste API RAG',
bulkUpload: 'Caricamento massivo di documenti',
agentMode: 'Modalità Agente',
workflow: 'Flusso di Lavoro',
llmLoadingBalancing: 'Bilanciamento del Carico LLM',
llmLoadingBalancingTooltip:
'Aggiungi più chiavi API ai modelli, bypassando efficacemente i limiti di velocità dell\'API.',
},
comingSoon: 'In arrivo',
member: 'Membro',
memberAfter: 'Membro',
messageRequest: {
title: 'Crediti Messaggi',
tooltip:
'Quote di invocazione dei messaggi per vari piani utilizzando i modelli OpenAI (eccetto gpt4). I messaggi oltre il limite utilizzeranno la tua chiave API OpenAI.',
},
annotatedResponse: {
title: 'Limiti di Quota di Annotazione',
tooltip:
'La modifica manuale e l\'annotazione delle risposte forniscono capacità di risposta a domande personalizzabili di alta qualità per le app. (Applicabile solo nelle app di chat)',
},
ragAPIRequestTooltip:
'Si riferisce al numero di chiamate API che invocano solo le capacità di elaborazione della base di conoscenza di Dify.',
receiptInfo:
'Solo il proprietario del team e l\'amministratore del team possono abbonarsi e visualizzare le informazioni di fatturazione',
},
plans: {
sandbox: {
name: 'Sandbox',
description: '200 prove gratuite di GPT',
includesTitle: 'Include:',
},
professional: {
name: 'Professional',
description:
'Per individui e piccoli team per sbloccare più potenza a prezzi accessibili.',
includesTitle: 'Tutto nel piano gratuito, più:',
},
team: {
name: 'Team',
description:
'Collabora senza limiti e goditi prestazioni di alto livello.',
includesTitle: 'Tutto nel piano Professional, più:',
},
enterprise: {
name: 'Enterprise',
description:
'Ottieni tutte le capacità e il supporto per sistemi mission-critical su larga scala.',
includesTitle: 'Tutto nel piano Team, più:',
},
},
vectorSpace: {
fullTip: 'Lo Spazio Vettoriale è pieno.',
fullSolution: 'Aggiorna il tuo piano per ottenere più spazio.',
},
apps: {
fullTipLine1: 'Aggiorna il tuo piano per',
fullTipLine2: 'creare più app.',
},
annotatedResponse: {
fullTipLine1: 'Aggiorna il tuo piano per',
fullTipLine2: 'annotare più conversazioni.',
quotaTitle: 'Quota di Risposta Annotata',
},
}
export default translation
+602
View File
@@ -0,0 +1,602 @@
const translation = {
api: {
success: 'Successo',
actionSuccess: 'Azione riuscita',
saved: 'Salvato',
create: 'Creato',
remove: 'Rimosso',
},
operation: {
create: 'Crea',
confirm: 'Conferma',
cancel: 'Annulla',
clear: 'Cancella',
save: 'Salva',
saveAndEnable: 'Salva & Abilita',
edit: 'Modifica',
add: 'Aggiungi',
added: 'Aggiunto',
refresh: 'Riavvia',
reset: 'Reimposta',
search: 'Cerca',
change: 'Cambia',
remove: 'Rimuovi',
send: 'Invia',
copy: 'Copia',
lineBreak: 'A capo',
sure: 'Sono sicuro',
download: 'Scarica',
delete: 'Elimina',
settings: 'Impostazioni',
setup: 'Configurazione',
getForFree: 'Ottieni gratuitamente',
reload: 'Ricarica',
ok: 'OK',
log: 'Log',
learnMore: 'Scopri di più',
params: 'Parametri',
duplicate: 'Duplica',
rename: 'Rinomina',
},
errorMsg: {
fieldRequired: '{{field}} è obbligatorio',
urlError: 'L\'URL deve iniziare con http:// o https://',
},
placeholder: {
input: 'Per favore inserisci',
select: 'Per favore seleziona',
},
voice: {
language: {
zhHans: 'Cinese',
zhHant: 'Cinese Tradizionale',
enUS: 'Inglese',
deDE: 'Tedesco',
frFR: 'Francese',
esES: 'Spagnolo',
itIT: 'Italiano',
thTH: 'Thailandese',
idID: 'Indonesiano',
jaJP: 'Giapponese',
koKR: 'Coreano',
ptBR: 'Portoghese',
ruRU: 'Russo',
ukUA: 'Ucraino',
viVN: 'Vietnamita',
plPL: 'Polacco',
},
},
unit: {
char: 'caratteri',
},
actionMsg: {
noModification: 'Nessuna modifica al momento.',
modifiedSuccessfully: 'Modificato con successo',
modifiedUnsuccessfully: 'Modifica non riuscita',
copySuccessfully: 'Copiato con successo',
paySucceeded: 'Pagamento riuscito',
payCancelled: 'Pagamento annullato',
generatedSuccessfully: 'Generato con successo',
generatedUnsuccessfully: 'Generazione non riuscita',
},
model: {
params: {
temperature: 'Temperatura',
temperatureTip:
'Controlla la casualità: Abbassando si ottengono completamenti meno casuali. Man mano che la temperatura si avvicina a zero, il modello diventa deterministico e ripetitivo.',
top_p: 'Top P',
top_pTip:
'Controlla la diversità tramite campionamento nucleare: 0.5 significa che vengono considerati la metà di tutte le opzioni ponderate per probabilità.',
presence_penalty: 'Penalità di presenza',
presence_penaltyTip:
'Quanto penalizzare i nuovi token in base alla loro presenza nel testo finora. Aumenta la probabilità che il modello parli di nuovi argomenti.',
frequency_penalty: 'Penalità di frequenza',
frequency_penaltyTip:
'Quanto penalizzare i nuovi token in base alla loro frequenza esistente nel testo finora. Diminuisce la probabilità che il modello ripeta la stessa riga alla lettera.',
max_tokens: 'Token massimo',
max_tokensTip:
'Utilizzato per limitare la lunghezza massima della risposta, in token. Valori maggiori possono limitare lo spazio lasciato per le parole del prompt, i log della chat e la Conoscenza. Si consiglia di impostarlo al di sotto dei due terzi\ngpt-4-1106-preview, gpt-4-vision-preview max token (input 128k output 4k)',
maxTokenSettingTip:
'La tua impostazione di token massimo è alta, potenzialmente limitando lo spazio per prompt, query e dati. Considera di impostarlo al di sotto dei 2/3.',
setToCurrentModelMaxTokenTip:
'Il token massimo è aggiornato all\'80% del token massimo del modello corrente {{maxToken}}.',
stop_sequences: 'Sequenze di stop',
stop_sequencesTip:
'Fino a quattro sequenze in cui l\'API smetterà di generare ulteriori token. Il testo restituito non conterrà la sequenza di stop.',
stop_sequencesPlaceholder: 'Inserisci la sequenza e premi Tab',
},
tone: {
Creative: 'Creativo',
Balanced: 'Bilanciato',
Precise: 'Preciso',
Custom: 'Personalizzato',
},
addMoreModel: 'Vai alle impostazioni per aggiungere altri modelli',
},
menus: {
status: 'beta',
explore: 'Esplora',
apps: 'Studio',
plugins: 'Plugin',
pluginsTips:
'Integra plugin di terze parti o crea plugin AI compatibili con ChatGPT.',
datasets: 'Conoscenza',
datasetsTips:
'PROSSIMAMENTE: Importa i tuoi dati testuali o scrivi dati in tempo reale tramite Webhook per migliorare il contesto LLM.',
newApp: 'Nuova App',
newDataset: 'Crea Conoscenza',
tools: 'Strumenti',
},
userProfile: {
settings: 'Impostazioni',
workspace: 'Workspace',
createWorkspace: 'Crea Workspace',
helpCenter: 'Aiuto',
roadmapAndFeedback: 'Feedback',
community: 'Comunità',
about: 'Informazioni',
logout: 'Esci',
},
settings: {
accountGroup: 'ACCOUNT',
workplaceGroup: 'WORKSPACE',
account: 'Il mio account',
members: 'Membri',
billing: 'Fatturazione',
integrations: 'Integrazioni',
language: 'Lingua',
provider: 'Fornitore di Modelli',
dataSource: 'Fonte Dati',
plugin: 'Plugin',
apiBasedExtension: 'Estensione API',
},
account: {
avatar: 'Avatar',
name: 'Nome',
email: 'Email',
password: 'Password',
passwordTip:
'Puoi impostare una password permanente se non vuoi utilizzare codici di accesso temporanei',
setPassword: 'Imposta una password',
resetPassword: 'Reimposta password',
currentPassword: 'Password attuale',
newPassword: 'Nuova password',
confirmPassword: 'Conferma password',
notEqual: 'Le due password sono diverse.',
langGeniusAccount: 'Account Dify',
langGeniusAccountTip: 'Il tuo account Dify e i dati utente associati.',
editName: 'Modifica Nome',
showAppLength: 'Mostra {{length}} app',
delete: 'Elimina Account',
deleteTip:
'Eliminando il tuo account cancellerai permanentemente tutti i tuoi dati e non sarà possibile recuperarli.',
deleteConfirmTip:
'Per confermare, invia il seguente messaggio dalla tua email registrata a ',
},
members: {
team: 'Team',
invite: 'Aggiungi',
name: 'NOME',
lastActive: 'ULTIMA ATTIVITÀ',
role: 'RUOLI',
pending: 'In attesa...',
owner: 'Proprietario',
admin: 'Admin',
adminTip: 'Può creare app e gestire le impostazioni del team',
normal: 'Normale',
normalTip: 'Può solo usare le app, non può crearle',
builder: 'Builder',
builderTip: 'Può creare e modificare le proprie app',
editor: 'Editor',
editorTip: 'Può creare e modificare app',
datasetOperator: 'Admin della Conoscenza',
datasetOperatorTip: 'Può solo gestire la base di conoscenza',
inviteTeamMember: 'Aggiungi membro del team',
inviteTeamMemberTip:
'Potranno accedere ai dati del tuo team direttamente dopo aver effettuato l\'accesso.',
email: 'Email',
emailInvalid: 'Formato Email non valido',
emailPlaceholder: 'Per favore inserisci le email',
sendInvite: 'Invia Invito',
invitedAsRole: 'Invitato come utente {{role}}',
invitationSent: 'Invito inviato',
invitationSentTip:
'Invito inviato, e possono accedere a Dify per accedere ai dati del tuo team.',
invitationLink: 'Link di Invito',
failedinvitationEmails:
'Gli utenti seguenti non sono stati invitati con successo',
ok: 'OK',
removeFromTeam: 'Rimuovi dal team',
removeFromTeamTip: 'Rimuoverà l\'accesso al team',
setAdmin: 'Imposta come amministratore',
setMember: 'Imposta come membro ordinario',
setBuilder: 'Imposta come builder',
setEditor: 'Imposta come editor',
disinvite: 'Annulla l\'invito',
deleteMember: 'Elimina Membro',
you: '(Tu)',
},
integrations: {
connected: 'Connesso',
google: 'Google',
googleAccount: 'Accedi con l\'account Google',
github: 'GitHub',
githubAccount: 'Accedi con l\'account GitHub',
connect: 'Connetti',
},
language: {
displayLanguage: 'Lingua di visualizzazione',
timezone: 'Fuso orario',
},
provider: {
apiKey: 'API Key',
enterYourKey: 'Inserisci qui la tua API key',
invalidKey: 'Chiave API OpenAI non valida',
validatedError: 'Convalida fallita: ',
validating: 'Convalida chiave in corso...',
saveFailed: 'Salvataggio della chiave API fallito',
apiKeyExceedBill:
'Questa API KEY non ha più quota disponibile, per favore leggi',
addKey: 'Aggiungi Chiave',
comingSoon: 'Prossimamente',
editKey: 'Modifica',
invalidApiKey: 'Chiave API non valida',
azure: {
apiBase: 'Base API',
apiBasePlaceholder: 'L\'URL Base API del tuo Endpoint Azure OpenAI.',
apiKey: 'API Key',
apiKeyPlaceholder: 'Inserisci qui la tua API key',
helpTip: 'Scopri di più su Azure OpenAI Service',
},
openaiHosted: {
openaiHosted: 'OpenAI Ospitato',
onTrial: 'IN PROVA',
exhausted: 'QUOTA ESAURITA',
desc: 'Il servizio di hosting OpenAI fornito da Dify ti consente di utilizzare modelli come GPT-3.5. Prima che la tua quota di prova sia esaurita, devi configurare altri fornitori di modelli.',
callTimes: 'Numero di chiamate',
usedUp: 'Quota di prova esaurita. Aggiungi il tuo fornitore di modelli.',
useYourModel: 'Attualmente utilizzando il proprio fornitore di modelli.',
close: 'Chiudi',
},
anthropicHosted: {
anthropicHosted: 'Anthropic Claude',
onTrial: 'IN PROVA',
exhausted: 'QUOTA ESAURITA',
desc: 'Modello potente, eccelle in una vasta gamma di compiti dal dialogo sofisticato alla generazione di contenuti creativi fino alle istruzioni dettagliate.',
callTimes: 'Numero di chiamate',
usedUp: 'Quota di prova esaurita. Aggiungi il tuo fornitore di modelli.',
useYourModel: 'Attualmente utilizzando il proprio fornitore di modelli.',
close: 'Chiudi',
},
anthropic: {
using: 'La capacità di embedding è in uso',
enableTip:
'Per abilitare il modello Anthropic, devi prima collegarti a OpenAI o Azure OpenAI Service.',
notEnabled: 'Non abilitato',
keyFrom: 'Ottieni la tua API key da Anthropic',
},
encrypted: {
front:
'La tua API KEY sarà crittografata e archiviata utilizzando la tecnologia',
back: '.',
},
},
modelProvider: {
notConfigured:
'Il modello di sistema non è ancora stato completamente configurato e alcune funzioni potrebbero non essere disponibili.',
systemModelSettings: 'Impostazioni Modello di Sistema',
systemModelSettingsLink:
'Perché è necessario configurare un modello di sistema?',
selectModel: 'Seleziona il tuo modello',
setupModelFirst: 'Per favore, configura prima il tuo modello',
systemReasoningModel: {
key: 'Modello di Ragionamento di Sistema',
tip: 'Imposta il modello di inferenza predefinito da utilizzare per creare applicazioni, così come funzionalità come la generazione del nome del dialogo e il suggerimento della domanda successiva utilizzeranno anche il modello di inferenza predefinito.',
},
embeddingModel: {
key: 'Modello di Embedding',
tip: 'Imposta il modello predefinito per l\'elaborazione degli embedding dei documenti della Conoscenza, sia il recupero che l\'importazione della Conoscenza utilizzano questo modello di Embedding per il processo di vettorizzazione. Il cambio causerà l\'incoerenza della dimensione del vettore tra la Conoscenza importata e la domanda, causando un fallimento nel recupero. Per evitare fallimenti nel recupero, non cambiare questo modello a piacimento.',
required: 'Il Modello di Embedding è obbligatorio',
},
speechToTextModel: {
key: 'Modello da Voce a Testo',
tip: 'Imposta il modello predefinito per l\'input da voce a testo nella conversazione.',
},
ttsModel: {
key: 'Modello da Testo a Voce',
tip: 'Imposta il modello predefinito per l\'input da testo a voce nella conversazione.',
},
rerankModel: {
key: 'Modello di Rerank',
tip: 'Il modello di rerank riordinerà la lista dei documenti candidati basandosi sulla corrispondenza semantica con la query dell\'utente, migliorando i risultati del ranking semantico',
},
apiKey: 'API-KEY',
quota: 'Quota',
searchModel: 'Modello di ricerca',
noModelFound: 'Nessun modello trovato per {{model}}',
models: 'Modelli',
showMoreModelProvider: 'Mostra più fornitori di modelli',
selector: {
tip: 'Questo modello è stato rimosso. Per favore aggiungi un modello o seleziona un altro modello.',
emptyTip: 'Nessun modello disponibile',
emptySetting: 'Per favore vai alle impostazioni per configurare',
rerankTip: 'Per favore, configura il modello di Rerank',
},
card: {
quota: 'QUOTA',
onTrial: 'In Prova',
paid: 'Pagato',
quotaExhausted: 'Quota esaurita',
callTimes: 'Numero di chiamate',
tokens: 'Token',
buyQuota: 'Acquista Quota',
priorityUse: 'Uso prioritario',
removeKey: 'Rimuovi API Key',
tip: 'Verrà data priorità alla quota pagata. La quota di prova sarà utilizzata dopo l\'esaurimento della quota pagata.',
},
item: {
deleteDesc:
'{{modelName}} è utilizzato come modello di ragionamento di sistema. Alcune funzioni non saranno disponibili dopo la rimozione. Si prega di confermare.',
freeQuota: 'QUOTA GRATUITA',
},
addApiKey: 'Aggiungi la tua API key',
invalidApiKey: 'API key non valida',
encrypted: {
front:
'La tua API KEY sarà crittografata e archiviata utilizzando la tecnologia',
back: '.',
},
freeQuota: {
howToEarn: 'Come guadagnare',
},
addMoreModelProvider: 'AGGIUNGI PIÙ FORNITORI DI MODELLI',
addModel: 'Aggiungi Modello',
modelsNum: '{{num}} Modelli',
showModels: 'Mostra Modelli',
showModelsNum: 'Mostra {{num}} Modelli',
collapse: 'Comprimi',
config: 'Configura',
modelAndParameters: 'Modello e Parametri',
model: 'Modello',
featureSupported: '{{feature}} supportato',
callTimes: 'Numero di chiamate',
credits: 'Crediti Messaggi',
buyQuota: 'Acquista Quota',
getFreeTokens: 'Ottieni Token gratuiti',
priorityUsing: 'Utilizzo prioritario',
deprecated: 'Deprecato',
confirmDelete: 'confermare l\'eliminazione?',
quotaTip: 'Token gratuiti rimanenti disponibili',
loadPresets: 'Carica Preset',
parameters: 'PARAMETRI',
loadBalancing: 'Bilanciamento del Carico',
loadBalancingDescription: 'Riduci la pressione con più set di credenziali.',
loadBalancingHeadline: 'Bilanciamento del Carico',
configLoadBalancing: 'Configura Bilanciamento del Carico',
modelHasBeenDeprecated: 'Questo modello è stato deprecato',
providerManaged: 'Gestito dal fornitore',
providerManagedDescription:
'Usa il singolo set di credenziali fornito dal fornitore del modello.',
defaultConfig: 'Config predefinito',
apiKeyStatusNormal: 'Stato APIKey normale',
apiKeyRateLimit:
'Il limite di velocità è stato raggiunto, disponibile dopo {{seconds}}s',
addConfig: 'Aggiungi Configurazione',
editConfig: 'Modifica Configurazione',
loadBalancingLeastKeyWarning:
'Per abilitare il bilanciamento del carico devono essere abilitate almeno 2 chiavi.',
loadBalancingInfo:
'Per impostazione predefinita, il bilanciamento del carico utilizza la strategia Round-robin. Se viene attivato il rate limiting, verrà applicato un periodo di cooldown di 1 minuto.',
upgradeForLoadBalancing:
'Aggiorna il tuo piano per abilitare il Bilanciamento del Carico.',
},
dataSource: {
add: 'Aggiungi una fonte di dati',
connect: 'Connetti',
configure: 'Configura',
notion: {
title: 'Notion',
description: 'Usa Notion come fonte di dati per la Conoscenza.',
connectedWorkspace: 'Workspace connesso',
addWorkspace: 'Aggiungi workspace',
connected: 'Connesso',
disconnected: 'Disconnesso',
changeAuthorizedPages: 'Cambia pagine autorizzate',
pagesAuthorized: 'Pagine autorizzate',
sync: 'Sincronizza',
remove: 'Rimuovi',
selector: {
pageSelected: 'Pagine selezionate',
searchPages: 'Cerca pagine...',
noSearchResult: 'Nessun risultato di ricerca',
addPages: 'Aggiungi pagine',
preview: 'ANTEPRIMA',
},
},
website: {
title: 'Sito web',
description: 'Importa contenuti dai siti web utilizzando il web crawler.',
with: 'Con',
configuredCrawlers: 'Crawler configurati',
active: 'Attivo',
inactive: 'Inattivo',
},
},
plugin: {
serpapi: {
apiKey: 'API Key',
apiKeyPlaceholder: 'Inserisci la tua API key',
keyFrom: 'Ottieni la tua API key dalla pagina dell\'account SerpAPI',
},
},
apiBasedExtension: {
title:
'Le estensioni API forniscono una gestione centralizzata delle API, semplificando la configurazione per un facile utilizzo nelle applicazioni di Dify.',
link: 'Scopri come sviluppare la tua estensione API.',
linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension',
add: 'Aggiungi Estensione API',
selector: {
title: 'Estensione API',
placeholder: 'Per favore seleziona l\'estensione API',
manage: 'Gestisci Estensione API',
},
modal: {
title: 'Aggiungi Estensione API',
editTitle: 'Modifica Estensione API',
name: {
title: 'Nome',
placeholder: 'Per favore inserisci il nome',
},
apiEndpoint: {
title: 'Endpoint API',
placeholder: 'Per favore inserisci l\'endpoint API',
},
apiKey: {
title: 'API-key',
placeholder: 'Per favore inserisci l\'API-key',
lengthError:
'La lunghezza della chiave API non può essere inferiore a 5 caratteri',
},
},
type: 'Tipo',
},
about: {
changeLog: 'Registro delle modifiche',
updateNow: 'Aggiorna ora',
nowAvailable: 'Dify {{version}} è ora disponibile.',
latestAvailable: 'Dify {{version}} è l\'ultima versione disponibile.',
},
appMenus: {
overview: 'Monitoraggio',
promptEng: 'Orchestrazione',
apiAccess: 'Accesso API',
logAndAnn: 'Log & Ann.',
logs: 'Log',
},
environment: {
testing: 'TEST',
development: 'SVILUPPO',
},
appModes: {
completionApp: 'Generatore di Testi',
chatApp: 'App di Chat',
},
datasetMenus: {
documents: 'Documenti',
hitTesting: 'Test di Recupero',
settings: 'Impostazioni',
emptyTip:
'La Conoscenza non è stata associata, per favore vai all\'applicazione o al plug-in per completare l\'associazione.',
viewDoc: 'Visualizza documentazione',
relatedApp: 'app collegate',
},
voiceInput: {
speaking: 'Parla ora...',
converting: 'Conversione in testo...',
notAllow: 'microfono non autorizzato',
},
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: 'Rinomina Conversazione',
conversationName: 'Nome della conversazione',
conversationNamePlaceholder:
'Per favore inserisci il nome della conversazione',
conversationNameCanNotEmpty: 'Nome della conversazione obbligatorio',
citation: {
title: 'CITAZIONI',
linkToDataset: 'Collegamento alla Conoscenza',
characters: 'Caratteri:',
hitCount: 'Conteggio dei recuperi:',
vectorHash: 'Hash del vettore:',
hitScore: 'Punteggio di recupero:',
},
},
promptEditor: {
placeholder:
'Scrivi qui il tuo prompt, inserisci \'{\' per inserire una variabile, inserisci \'/\' per inserire un blocco di contenuto del prompt',
context: {
item: {
title: 'Contesto',
desc: 'Inserisci modello di contesto',
},
modal: {
title: '{{num}} Conoscenza nel Contesto',
add: 'Aggiungi Contesto ',
footer: 'Puoi gestire i contesti nella sezione Contesto qui sotto.',
},
},
history: {
item: {
title: 'Cronologia della Conversazione',
desc: 'Inserisci modello di messaggio storico',
},
modal: {
title: 'ESEMPIO',
user: 'Ciao',
assistant: 'Ciao! Come posso aiutarti oggi?',
edit: 'Modifica i Nomi dei Ruoli della Conversazione',
},
},
variable: {
item: {
title: 'Variabili & Strumenti Esterni',
desc: 'Inserisci Variabili & Strumenti Esterni',
},
outputToolDisabledItem: {
title: 'Variabili',
desc: 'Inserisci Variabili',
},
modal: {
add: 'Nuova variabile',
addTool: 'Nuovo strumento',
},
},
query: {
item: {
title: 'Query',
desc: 'Inserisci modello di query dell\'utente',
},
},
existed: 'Esiste già nel prompt',
},
imageUploader: {
uploadFromComputer: 'Carica dal Computer',
uploadFromComputerReadError:
'Lettura dell\'immagine fallita, per favore riprova.',
uploadFromComputerUploadError:
'Caricamento dell\'immagine fallito, per favore ricarica.',
uploadFromComputerLimit:
'Le immagini caricate non possono superare i {{size}} MB',
pasteImageLink: 'Incolla link immagine',
pasteImageLinkInputPlaceholder: 'Incolla qui il link immagine',
pasteImageLinkInvalid: 'Link immagine non valido',
imageUpload: 'Caricamento Immagine',
},
tag: {
placeholder: 'Tutti i Tag',
addNew: 'Aggiungi nuovo tag',
noTag: 'Nessun tag',
noTagYet: 'Nessun tag ancora',
addTag: 'Aggiungi tag',
editTag: 'Modifica tag',
manageTags: 'Gestisci Tag',
selectorPlaceholder: 'Scrivi per cercare o creare',
create: 'Crea',
delete: 'Elimina tag',
deleteTip: 'Il tag è in uso, eliminarlo?',
created: 'Tag creato con successo',
failed: 'Creazione del tag fallita',
},
}
export default translation
+31
View File
@@ -0,0 +1,31 @@
const translation = {
custom: 'Personalizzazione',
upgradeTip: {
prefix: 'Aggiorna il tuo piano per',
suffix: 'personalizzare il tuo marchio.',
},
webapp: {
title: 'Personalizza il marchio WebApp',
removeBrand: 'Rimuovi Powered by Dify',
changeLogo: 'Cambia immagine del marchio Powered by',
changeLogoTip: 'Formato SVG o PNG con una dimensione minima di 40x40px',
},
app: {
title: 'Personalizza l\'intestazione del marchio dell\'app',
changeLogoTip: 'Formato SVG o PNG con una dimensione minima di 80x80px',
},
upload: 'Carica',
uploading: 'Caricamento in corso',
uploadedFail: 'Caricamento dell\'immagine fallito, per favore ricarica.',
change: 'Cambia',
apply: 'Applica',
restore: 'Ripristina Impostazioni Predefinite',
customize: {
contactUs: ' contattaci ',
prefix:
'Per personalizzare il logo del marchio all\'interno dell\'app, per favore',
suffix: 'per aggiornare alla versione Enterprise.',
},
}
export default translation
+184
View File
@@ -0,0 +1,184 @@
const translation = {
steps: {
header: {
creation: 'Crea Conoscenza',
update: 'Aggiungi dati',
},
one: 'Scegli fonte dati',
two: 'Preprocessamento e Pulizia del Testo',
three: 'Esegui e termina',
},
error: {
unavailable: 'Questa Conoscenza non è disponibile',
},
firecrawl: {
configFirecrawl: 'Configura 🔥Firecrawl',
apiKeyPlaceholder: 'Chiave API da firecrawl.dev',
getApiKeyLinkText: 'Ottieni la tua chiave API da firecrawl.dev',
},
stepOne: {
filePreview: 'Anteprima del File',
pagePreview: 'Anteprima della Pagina',
dataSourceType: {
file: 'Importa da file',
notion: 'Sincronizza da Notion',
web: 'Sincronizza da sito web',
},
uploader: {
title: 'Carica file',
button: 'Trascina e rilascia il file, o',
browse: 'Sfoglia',
tip: 'Supporta {{supportTypes}}. Max {{size}}MB ciascuno.',
validation: {
typeError: 'Tipo di file non supportato',
size: 'File troppo grande. Il massimo è {{size}}MB',
count: 'Più file non supportati',
filesNumber:
'Hai raggiunto il limite di caricamento batch di {{filesNumber}}.',
},
cancel: 'Annulla',
change: 'Cambia',
failed: 'Caricamento fallito',
},
notionSyncTitle: 'Notion non è connesso',
notionSyncTip:
'Per sincronizzare con Notion, deve essere stabilita prima la connessione a Notion.',
connect: 'Vai a connettere',
button: 'Avanti',
emptyDatasetCreation: 'Voglio creare una Conoscenza vuota',
modal: {
title: 'Crea una Conoscenza vuota',
tip: 'Una Conoscenza vuota non conterrà documenti, e potrai caricare documenti in qualsiasi momento.',
input: 'Nome della Conoscenza',
placeholder: 'Per favore inserisci',
nameNotEmpty: 'Il nome non può essere vuoto',
nameLengthInvaild: 'Il nome deve essere tra 1 e 40 caratteri',
cancelButton: 'Annulla',
confirmButton: 'Crea',
failed: 'Creazione fallita',
},
website: {
fireCrawlNotConfigured: 'Firecrawl non è configurato',
fireCrawlNotConfiguredDescription:
'Configura Firecrawl con la chiave API per usarlo.',
configure: 'Configura',
run: 'Esegui',
firecrawlTitle: 'Estrai contenuti web con 🔥Firecrawl',
firecrawlDoc: 'Documenti Firecrawl',
firecrawlDocLink:
'https://docs.dify.ai/guides/knowledge-base/sync_from_website',
options: 'Opzioni',
crawlSubPage: 'Crawl sotto-pagine',
limit: 'Limite',
maxDepth: 'Profondità massima',
excludePaths: 'Escludi percorsi',
includeOnlyPaths: 'Includi solo percorsi',
extractOnlyMainContent:
'Estrai solo il contenuto principale (senza intestazioni, nav, piè di pagina, ecc.)',
exceptionErrorTitle:
'Si è verificata un\'eccezione durante l\'esecuzione del lavoro Firecrawl:',
unknownError: 'Errore sconosciuto',
totalPageScraped: 'Pagine totali estratte:',
selectAll: 'Seleziona tutto',
resetAll: 'Reimposta tutto',
scrapTimeInfo: 'Estratte {{total}} pagine in totale in {{time}}s',
preview: 'Anteprima',
maxDepthTooltip:
'Profondità massima da eseguire rispetto all\'URL inserito. La profondità 0 estrae solo la pagina dell\'URL inserito, la profondità 1 estrae l\'URL e tutto ciò che segue l\'URL inserito + uno /, e così via.',
},
},
stepTwo: {
segmentation: 'Impostazioni dei blocchi',
auto: 'Automatico',
autoDescription:
'Imposta automaticamente le regole dei blocchi e del preprocessamento. Gli utenti non familiari sono consigliati di selezionare questo.',
custom: 'Personalizzato',
customDescription:
'Personalizza le regole dei blocchi, la lunghezza dei blocchi e le regole di preprocessamento, ecc.',
separator: 'Identificatore di segmento',
separatorPlaceholder:
'Ad esempio, nuova linea (\\\\n) o separatore speciale (come `***`)',
maxLength: 'Lunghezza massima del blocco',
overlap: 'Sovrapposizione del blocco',
overlapTip:
'Impostare la sovrapposizione del blocco può mantenere la rilevanza semantica tra di loro, migliorando l\'effetto di recupero. Si consiglia di impostare il 10%-25% della dimensione massima del blocco.',
overlapCheck:
'la sovrapposizione del blocco non dovrebbe essere maggiore della lunghezza massima del blocco',
rules: 'Regole di preprocessamento del testo',
removeExtraSpaces: 'Sostituisci spazi, nuove linee e tab consecutivi',
removeUrlEmails: 'Elimina tutti gli URL e gli indirizzi email',
removeStopwords: 'Rimuovi parole vuote come `a`, `an`, `the`',
preview: 'Conferma & Anteprima',
reset: 'Reimposta',
indexMode: 'Modalità indice',
qualified: 'Alta Qualità',
recommend: 'Consigliato',
qualifiedTip:
'Chiama l\'interfaccia di embedding di sistema predefinita per l\'elaborazione per fornire maggiore accuratezza quando gli utenti fanno query.',
warning:
'Per favore configura prima la chiave API del fornitore del modello.',
click: 'Vai alle impostazioni',
economical: 'Economico',
economicalTip:
'Usa motori vettoriali offline, indici di parole chiave, ecc. per ridurre l\'accuratezza senza spendere token',
QATitle: 'Segmentazione in formato Domanda & Risposta',
QATip: 'Abilitare questa opzione consumerà più token',
QALanguage: 'Segmenta usando',
emstimateCost: 'Stima',
emstimateSegment: 'Blocchi stimati',
segmentCount: 'blocchi',
calculating: 'Calcolo in corso...',
fileSource: 'Preprocessa documenti',
notionSource: 'Preprocessa pagine',
websiteSource: 'Preprocessa sito web',
other: 'e altri ',
fileUnit: ' file',
notionUnit: ' pagine',
webpageUnit: ' pagine',
previousStep: 'Passo precedente',
nextStep: 'Salva & Elabora',
save: 'Salva & Elabora',
cancel: 'Annulla',
sideTipTitle: 'Perché segmentare e preprocessare?',
sideTipP1:
'Quando si elabora dati testuali, la segmentazione e la pulizia sono due passaggi di preprocessamento importanti.',
sideTipP2:
'La segmentazione divide il testo lungo in paragrafi così i modelli possono comprendere meglio. Questo migliora la qualità e la rilevanza dei risultati del modello.',
sideTipP3:
'La pulizia rimuove caratteri e formati non necessari, rendendo la Conoscenza più pulita e facile da analizzare.',
sideTipP4:
'Una corretta segmentazione e pulizia migliorano le prestazioni del modello, fornendo risultati più accurati e preziosi.',
previewTitle: 'Anteprima',
previewTitleButton: 'Anteprima',
previewButton: 'Passaggio al formato Domanda & Risposta',
previewSwitchTipStart:
'L\'anteprima del blocco corrente è in formato testo, il passaggio a un\'anteprima in formato domanda e risposta',
previewSwitchTipEnd: ' consumerà token aggiuntivi',
characters: 'caratteri',
indexSettedTip: 'Per cambiare il metodo di indicizzazione, vai alle ',
retrivalSettedTip: 'Per cambiare il metodo di indicizzazione, vai alle ',
datasetSettingLink: 'impostazioni della Conoscenza.',
},
stepThree: {
creationTitle: '🎉 Conoscenza creata',
creationContent:
'Abbiamo automaticamente nominato la Conoscenza, puoi modificarla in qualsiasi momento',
label: 'Nome della Conoscenza',
additionTitle: '🎉 Documento caricato',
additionP1: 'Il documento è stato caricato nella Conoscenza',
additionP2: ', puoi trovarlo nella lista dei documenti della Conoscenza.',
stop: 'Ferma l\'elaborazione',
resume: 'Riprendi l\'elaborazione',
navTo: 'Vai al documento',
sideTipTitle: 'Cosa succede dopo',
sideTipContent:
'Dopo che il documento ha terminato l\'indicizzazione, la Conoscenza può essere integrata nell\'applicazione come contesto, puoi trovare l\'impostazione del contesto nella pagina di orchestrazione del prompt. Puoi anche crearla come un plugin di indicizzazione indipendente di ChatGPT per la pubblicazione.',
modelTitle: 'Sei sicuro di fermare l\'embedding?',
modelContent:
'Se hai bisogno di riprendere l\'elaborazione in seguito, continuerai da dove hai interrotto.',
modelButtonConfirm: 'Conferma',
modelButtonCancel: 'Annulla',
},
}
export default translation
+354
View File
@@ -0,0 +1,354 @@
const translation = {
list: {
title: 'Documenti',
desc: 'Tutti i file della Conoscenza sono mostrati qui, e l\'intera Conoscenza può essere collegata alle citazioni di Dify o indicizzata tramite il plugin di Chat.',
addFile: 'Aggiungi file',
addPages: 'Aggiungi Pagine',
addUrl: 'Aggiungi URL',
table: {
header: {
fileName: 'NOME FILE',
words: 'PAROLE',
hitCount: 'CONTEGGIO RECUPERI',
uploadTime: 'ORA DI CARICAMENTO',
status: 'STATO',
action: 'AZIONE',
},
rename: 'Rinomina',
name: 'Nome',
},
action: {
uploadFile: 'Carica nuovo file',
settings: 'Impostazioni segmenti',
addButton: 'Aggiungi blocco',
add: 'Aggiungi un blocco',
batchAdd: 'Aggiungi in batch',
archive: 'Archivia',
unarchive: 'Disarchivia',
delete: 'Elimina',
enableWarning: 'Il file archiviato non può essere abilitato',
sync: 'Sincronizza',
},
index: {
enable: 'Abilita',
disable: 'Disabilita',
all: 'Tutti',
enableTip: 'Il file può essere indicizzato',
disableTip: 'Il file non può essere indicizzato',
},
status: {
queuing: 'In coda',
indexing: 'Indicizzazione',
paused: 'In pausa',
error: 'Errore',
available: 'Disponibile',
enabled: 'Abilitato',
disabled: 'Disabilitato',
archived: 'Archiviato',
},
empty: {
title: 'Non ci sono ancora documenti',
upload: {
tip: 'Puoi caricare file, sincronizzare dal sito web o da app web come Notion, GitHub, ecc.',
},
sync: {
tip: 'Dify scaricherà periodicamente i file dal tuo Notion e completerà l\'elaborazione.',
},
},
delete: {
title: 'Sei sicuro di voler eliminare?',
content:
'Se hai bisogno di riprendere l\'elaborazione in seguito, continuerai da dove hai interrotto',
},
batchModal: {
title: 'Aggiungi blocchi in batch',
csvUploadTitle: 'Trascina e rilascia il tuo file CSV qui, o ',
browse: 'sfoglia',
tip: 'Il file CSV deve rispettare la seguente struttura:',
question: 'domanda',
answer: 'risposta',
contentTitle: 'contenuto del blocco',
content: 'contenuto',
template: 'Scarica qui il modello',
cancel: 'Annulla',
run: 'Esegui Batch',
runError: 'Esecuzione batch fallita',
processing: 'Elaborazione batch in corso',
completed: 'Importazione completata',
error: 'Errore di importazione',
ok: 'OK',
},
},
metadata: {
title: 'Metadati',
desc: 'L\'etichettatura dei metadati per i documenti consente all\'IA di accedervi in modo tempestivo ed espone la fonte delle referenze per gli utenti.',
dateTimeFormat: 'MMMM D, YYYY hh:mm A',
docTypeSelectTitle: 'Per favore seleziona un tipo di documento',
docTypeChangeTitle: 'Cambia tipo di documento',
docTypeSelectWarning:
'Se il tipo di documento viene cambiato, i metadati attualmente compilati non saranno più conservati',
firstMetaAction: 'Andiamo',
placeholder: {
add: 'Aggiungi ',
select: 'Seleziona ',
},
source: {
upload_file: 'Carica File',
notion: 'Sincronizza da Notion',
github: 'Sincronizza da Github',
},
type: {
book: 'Libro',
webPage: 'Pagina Web',
paper: 'Documento',
socialMediaPost: 'Post sui Social Media',
personalDocument: 'Documento Personale',
businessDocument: 'Documento Aziendale',
IMChat: 'Chat IM',
wikipediaEntry: 'Voce Wikipedia',
notion: 'Sincronizza da Notion',
github: 'Sincronizza da Github',
technicalParameters: 'Parametri Tecnici',
},
field: {
processRule: {
processDoc: 'Elabora Documento',
segmentRule: 'Regola di Segmentazione',
segmentLength: 'Lunghezza dei Segmenti',
processClean: 'Pulizia del Testo',
},
book: {
title: 'Titolo',
language: 'Lingua',
author: 'Autore',
publisher: 'Editore',
publicationDate: 'Data di Pubblicazione',
ISBN: 'ISBN',
category: 'Categoria',
},
webPage: {
title: 'Titolo',
url: 'URL',
language: 'Lingua',
authorPublisher: 'Autore/Editore',
publishDate: 'Data di Pubblicazione',
topicsKeywords: 'Argomenti/Parole Chiave',
description: 'Descrizione',
},
paper: {
title: 'Titolo',
language: 'Lingua',
author: 'Autore',
publishDate: 'Data di Pubblicazione',
journalConferenceName: 'Nome del Journal/Conferenza',
volumeIssuePage: 'Volume/Numero/Pagina',
DOI: 'DOI',
topicsKeywords: 'Argomenti/Parole Chiave',
abstract: 'Abstract',
},
socialMediaPost: {
platform: 'Piattaforma',
authorUsername: 'Autore/Username',
publishDate: 'Data di Pubblicazione',
postURL: 'URL del Post',
topicsTags: 'Argomenti/Tag',
},
personalDocument: {
title: 'Titolo',
author: 'Autore',
creationDate: 'Data di Creazione',
lastModifiedDate: 'Data di Ultima Modifica',
documentType: 'Tipo di Documento',
tagsCategory: 'Tag/Categoria',
},
businessDocument: {
title: 'Titolo',
author: 'Autore',
creationDate: 'Data di Creazione',
lastModifiedDate: 'Data di Ultima Modifica',
documentType: 'Tipo di Documento',
departmentTeam: 'Dipartimento/Team',
},
IMChat: {
chatPlatform: 'Piattaforma di Chat',
chatPartiesGroupName: 'Parti della Chat/Nome del Gruppo',
participants: 'Partecipanti',
startDate: 'Data di Inizio',
endDate: 'Data di Fine',
topicsKeywords: 'Argomenti/Parole Chiave',
fileType: 'Tipo di File',
},
wikipediaEntry: {
title: 'Titolo',
language: 'Lingua',
webpageURL: 'URL della Pagina Web',
editorContributor: 'Editore/Contributore',
lastEditDate: 'Data di Ultima Modifica',
summaryIntroduction: 'Sommario/Introduzione',
},
notion: {
title: 'Titolo',
language: 'Lingua',
author: 'Autore',
createdTime: 'Ora di Creazione',
lastModifiedTime: 'Ora di Ultima Modifica',
url: 'URL',
tag: 'Tag',
description: 'Descrizione',
},
github: {
repoName: 'Nome del Repo',
repoDesc: 'Descrizione del Repo',
repoOwner: 'Proprietario del Repo',
fileName: 'Nome del File',
filePath: 'Percorso del File',
programmingLang: 'Linguaggio di Programmazione',
url: 'URL',
license: 'Licenza',
lastCommitTime: 'Ora dell\'Ultimo Commit',
lastCommitAuthor: 'Autore dell\'Ultimo Commit',
},
originInfo: {
originalFilename: 'Nome file originale',
originalFileSize: 'Dimensione file originale',
uploadDate: 'Data di caricamento',
lastUpdateDate: 'Data di ultimo aggiornamento',
source: 'Fonte',
},
technicalParameters: {
segmentSpecification: 'Specifiche dei segmenti',
segmentLength: 'Lunghezza dei segmenti',
avgParagraphLength: 'Lunghezza media del paragrafo',
paragraphs: 'Paragrafi',
hitCount: 'Conteggio recuperi',
embeddingTime: 'Tempo di embedding',
embeddedSpend: 'Spesa di embedding',
},
},
languageMap: {
zh: 'Cinese',
en: 'Inglese',
es: 'Spagnolo',
fr: 'Francese',
de: 'Tedesco',
ja: 'Giapponese',
ko: 'Coreano',
ru: 'Russo',
ar: 'Arabo',
pt: 'Portoghese',
it: 'Italiano',
nl: 'Olandese',
pl: 'Polacco',
sv: 'Svedese',
tr: 'Turco',
he: 'Ebraico',
hi: 'Hindi',
da: 'Danese',
fi: 'Finlandese',
no: 'Norvegese',
hu: 'Ungherese',
el: 'Greco',
cs: 'Ceco',
th: 'Thailandese',
id: 'Indonesiano',
},
categoryMap: {
book: {
fiction: 'Narrativa',
biography: 'Biografia',
history: 'Storia',
science: 'Scienza',
technology: 'Tecnologia',
education: 'Educazione',
philosophy: 'Filosofia',
religion: 'Religione',
socialSciences: 'Scienze Sociali',
art: 'Arte',
travel: 'Viaggio',
health: 'Salute',
selfHelp: 'Auto-aiuto',
businessEconomics: 'Economia Aziendale',
cooking: 'Cucina',
childrenYoungAdults: 'Bambini e Giovani Adulti',
comicsGraphicNovels: 'Fumetti e Graphic Novels',
poetry: 'Poesia',
drama: 'Teatro',
other: 'Altro',
},
personalDoc: {
notes: 'Note',
blogDraft: 'Bozza di Blog',
diary: 'Diario',
researchReport: 'Rapporto di Ricerca',
bookExcerpt: 'Estratto di Libro',
schedule: 'Pianificazione',
list: 'Lista',
projectOverview: 'Panoramica del Progetto',
photoCollection: 'Collezione Fotografica',
creativeWriting: 'Scrittura Creativa',
codeSnippet: 'Frammento di Codice',
designDraft: 'Bozza di Design',
personalResume: 'Curriculum Vitae',
other: 'Altro',
},
businessDoc: {
meetingMinutes: 'Verbale della Riunione',
researchReport: 'Rapporto di Ricerca',
proposal: 'Proposta',
employeeHandbook: 'Manuale del Dipendente',
trainingMaterials: 'Materiali di Formazione',
requirementsDocument: 'Documento di Requisiti',
designDocument: 'Documento di Design',
productSpecification: 'Specifiche del Prodotto',
financialReport: 'Rapporto Finanziario',
marketAnalysis: 'Analisi di Mercato',
projectPlan: 'Piano di Progetto',
teamStructure: 'Struttura del Team',
policiesProcedures: 'Politiche e Procedure',
contractsAgreements: 'Contratti e Accordi',
emailCorrespondence: 'Corrispondenza Email',
other: 'Altro',
},
},
},
embedding: {
processing: 'Elaborazione embedding...',
paused: 'Embedding in pausa',
completed: 'Embedding completato',
error: 'Errore embedding',
docName: 'Elaborazione documento',
mode: 'Regola di segmentazione',
segmentLength: 'Lunghezza dei segmenti',
textCleaning: 'Pre-definizione e pulizia del testo',
segments: 'Paragrafi',
highQuality: 'Modalità alta qualità',
economy: 'Modalità economica',
estimate: 'Consumo stimato',
stop: 'Ferma elaborazione',
resume: 'Riprendi elaborazione',
automatic: 'Automatico',
custom: 'Personalizzato',
previewTip:
'L\'anteprima del paragrafo sarà disponibile dopo il completamento dell\'embedding',
},
segment: {
paragraphs: 'Paragrafi',
keywords: 'Parole Chiave',
addKeyWord: 'Aggiungi parola chiave',
keywordError: 'La lunghezza massima della parola chiave è 20',
characters: 'caratteri',
hitCount: 'Conteggio recuperi',
vectorHash: 'Hash del vettore: ',
questionPlaceholder: 'aggiungi domanda qui',
questionEmpty: 'La domanda non può essere vuota',
answerPlaceholder: 'aggiungi risposta qui',
answerEmpty: 'La risposta non può essere vuota',
contentPlaceholder: 'aggiungi contenuto qui',
contentEmpty: 'Il contenuto non può essere vuoto',
newTextSegment: 'Nuovo Segmento di Testo',
newQaSegment: 'Nuovo Segmento di Domanda & Risposta',
delete: 'Eliminare questo blocco?',
},
}
export default translation
+29
View File
@@ -0,0 +1,29 @@
const translation = {
title: 'Test di Recupero',
desc: 'Testa l\'effetto di recupero della Conoscenza basato sul testo di query fornito.',
dateTimeFormat: 'MM/DD/YYYY hh:mm A',
recents: 'Recenti',
table: {
header: {
source: 'Fonte',
text: 'Testo',
time: 'Ora',
},
},
input: {
title: 'Testo di origine',
placeholder:
'Per favore inserisci un testo, si consiglia una frase dichiarativa breve.',
countWarning: 'Fino a 200 caratteri.',
indexWarning: 'Solo Conoscenza di alta qualità.',
testing: 'Test in corso',
},
hit: {
title: 'PARAGRAFI RECUPERATI',
emptyTip: 'I risultati del Test di Recupero verranno mostrati qui',
},
noRecentTip: 'Nessun risultato di query recente qui',
viewChart: 'Visualizza GRAFICO VETTORIALE',
}
export default translation
+40
View File
@@ -0,0 +1,40 @@
const translation = {
title: 'Impostazioni della Conoscenza',
desc: 'Qui puoi modificare le proprietà e i metodi di funzionamento della Conoscenza.',
form: {
name: 'Nome della Conoscenza',
namePlaceholder: 'Per favore inserisci il nome della Conoscenza',
nameError: 'Il nome non può essere vuoto',
desc: 'Descrizione della Conoscenza',
descInfo:
'Per favore scrivi una descrizione chiara per delineare il contenuto della Conoscenza. Questa descrizione sarà utilizzata come base per la corrispondenza quando si seleziona tra più Conoscenze per l\'inferenza.',
descPlaceholder:
'Descrivi cosa c\'è in questa Conoscenza. Una descrizione dettagliata permette all\'IA di accedere al contenuto della Conoscenza in modo tempestivo. Se vuota, Dify utilizzerà la strategia di recupero predefinita.',
descWrite: 'Scopri come scrivere una buona descrizione della Conoscenza.',
permissions: 'Permessi',
permissionsOnlyMe: 'Solo io',
permissionsAllMember: 'Tutti i membri del team',
permissionsInvitedMembers: 'Membri del team parziali',
me: '(Tu)',
indexMethod: 'Metodo di Indicizzazione',
indexMethodHighQuality: 'Alta Qualità',
indexMethodHighQualityTip:
'Chiama il modello di Embedding per l\'elaborazione per fornire maggiore accuratezza quando gli utenti fanno query.',
indexMethodEconomy: 'Economico',
indexMethodEconomyTip:
'Usa motori vettoriali offline, indici di parole chiave, ecc. per ridurre l\'accuratezza senza spendere token',
embeddingModel: 'Modello di Embedding',
embeddingModelTip: 'Per cambiare il modello di embedding, vai alle ',
embeddingModelTipLink: 'Impostazioni',
retrievalSetting: {
title: 'Impostazione di Recupero',
learnMore: 'Scopri di più',
description: ' sul metodo di recupero.',
longDescription:
' sul metodo di recupero, puoi cambiare questo in qualsiasi momento nelle impostazioni della Conoscenza.',
},
save: 'Salva',
},
}
export default translation
+57
View File
@@ -0,0 +1,57 @@
const translation = {
knowledge: 'Conoscenza',
documentCount: ' documenti',
wordCount: ' k parole',
appCount: ' app collegate',
createDataset: 'Crea Conoscenza',
createDatasetIntro:
'Importa i tuoi dati testuali o scrivi dati in tempo reale tramite Webhook per migliorare il contesto LLM.',
deleteDatasetConfirmTitle: 'Eliminare questa Conoscenza?',
deleteDatasetConfirmContent:
'L\'eliminazione della Conoscenza è irreversibile. Gli utenti non potranno più accedere alla tua Conoscenza e tutte le configurazioni dei prompt e i log verranno eliminati permanentemente.',
datasetUsedByApp:
'La Conoscenza è utilizzata da alcune app. Le app non potranno più utilizzare questa Conoscenza e tutte le configurazioni dei prompt e i log verranno eliminati permanentemente.',
datasetDeleted: 'Conoscenza eliminata',
datasetDeleteFailed: 'Eliminazione della Conoscenza fallita',
didYouKnow: 'Lo sapevi?',
intro1: 'La Conoscenza può essere integrata nell\'applicazione Dify ',
intro2: 'come un contesto',
intro3: ',',
intro4: 'oppure ',
intro5: 'può essere creata',
intro6: ' come un plug-in di indicizzazione ChatGPT autonomo da pubblicare',
unavailable: 'Non disponibile',
unavailableTip:
'Il modello di embedding non è disponibile, è necessario configurare il modello di embedding predefinito',
datasets: 'CONOSCENZA',
datasetsApi: 'ACCESSO API',
retrieval: {
semantic_search: {
title: 'Ricerca Vettoriale',
description:
'Genera embedding delle query e cerca il blocco di testo più simile alla sua rappresentazione vettoriale.',
},
full_text_search: {
title: 'Ricerca Full-Text',
description:
'Indicizza tutti i termini nel documento, consentendo agli utenti di cercare qualsiasi termine e recuperare il blocco di testo rilevante contenente quei termini.',
},
hybrid_search: {
title: 'Ricerca Ibrida',
description:
'Esegui contemporaneamente la ricerca full-text e la ricerca vettoriale, riordina per selezionare la migliore corrispondenza per la query dell\'utente. È necessaria la configurazione delle API del modello Rerank.',
recommend: 'Consigliato',
},
invertedIndex: {
title: 'Indice Invertito',
description:
'L\'Indice Invertito è una struttura utilizzata per il recupero efficiente. Organizzato per termini, ogni termine punta ai documenti o alle pagine web che lo contengono.',
},
change: 'Cambia',
changeRetrievalMethod: 'Cambia metodo di recupero',
},
docsFailedNotice: 'documenti non riusciti a essere indicizzati',
retry: 'Riprova',
}
export default translation
+42
View File
@@ -0,0 +1,42 @@
const translation = {
title: 'Esplora',
sidebar: {
discovery: 'Scoperta',
chat: 'Chat',
workspace: 'Workspace',
action: {
pin: 'Fissa',
unpin: 'Sblocca',
rename: 'Rinomina',
delete: 'Elimina',
},
delete: {
title: 'Elimina app',
content: 'Sei sicuro di voler eliminare questa app?',
},
},
apps: {
title: 'Esplora App di Dify',
description:
'Usa queste app modello istantaneamente o personalizza le tue app basate sui modelli.',
allCategories: 'Consigliato',
},
appCard: {
addToWorkspace: 'Aggiungi a Workspace',
customize: 'Personalizza',
},
appCustomize: {
title: 'Crea app da {{name}}',
subTitle: 'Icona & nome dell\'app',
nameRequired: 'Il nome dell\'app è obbligatorio',
},
category: {
Assistant: 'Assistente',
Writing: 'Scrittura',
Translate: 'Traduzione',
Programming: 'Programmazione',
HR: 'Risorse Umane',
},
}
export default translation
+4
View File
@@ -0,0 +1,4 @@
const translation = {
}
export default translation
+85
View File
@@ -0,0 +1,85 @@
const translation = {
pageTitle: 'Ehi, iniziamo!👋',
welcome: 'Benvenuto su Dify, per favore accedi per continuare.',
email: 'Indirizzo email',
emailPlaceholder: 'La tua email',
password: 'Password',
passwordPlaceholder: 'La tua password',
name: 'Nome utente',
namePlaceholder: 'Il tuo nome utente',
forget: 'Hai dimenticato la password?',
signBtn: 'Accedi',
sso: 'Continua con SSO',
installBtn: 'Configura',
setAdminAccount: 'Impostazione di un account amministratore',
setAdminAccountDesc:
'Privilegi massimi per l\'account amministratore, che può essere utilizzato per creare applicazioni e gestire i fornitori di LLM, ecc.',
createAndSignIn: 'Crea e accedi',
oneMoreStep: 'Un altro passo',
createSample:
'In base a queste informazioni, creeremo un\'applicazione di esempio per te',
invitationCode: 'Codice di invito',
invitationCodePlaceholder: 'Il tuo codice di invito',
interfaceLanguage: 'Lingua dell\'interfaccia',
timezone: 'Fuso orario',
go: 'Vai a Dify',
sendUsMail:
'Inviaci una email con la tua presentazione e gestiremo la richiesta di invito.',
acceptPP: 'Ho letto e accetto l\'informativa sulla privacy',
reset:
'Per favore esegui il seguente comando per reimpostare la tua password',
withGitHub: 'Continua con GitHub',
withGoogle: 'Continua con Google',
rightTitle: 'Sblocca tutto il potenziale di LLM',
rightDesc:
'Costruisci senza sforzo applicazioni AI visivamente accattivanti, operabili e migliorabili.',
tos: 'Termini di servizio',
pp: 'Informativa sulla privacy',
tosDesc: 'Iscrivendoti, accetti i nostri',
goToInit:
'Se non hai inizializzato l\'account, vai alla pagina di inizializzazione',
donthave: 'Non hai?',
invalidInvitationCode: 'Codice di invito non valido',
accountAlreadyInited: 'Account già inizializzato',
forgotPassword: 'Hai dimenticato la password?',
resetLinkSent: 'Link per il reset inviato',
sendResetLink: 'Invia link per il reset',
backToSignIn: 'Torna al login',
forgotPasswordDesc:
'Per favore inserisci il tuo indirizzo email per reimpostare la tua password. Ti invieremo una email con le istruzioni su come reimpostare la tua password.',
checkEmailForResetLink:
'Per favore controlla la tua email per un link per reimpostare la password. Se non compare entro pochi minuti, assicurati di controllare la cartella spam.',
passwordChanged: 'Accedi ora',
changePassword: 'Cambia Password',
changePasswordTip:
'Per favore inserisci una nuova password per il tuo account',
invalidToken: 'Token non valido o scaduto',
confirmPassword: 'Conferma Password',
confirmPasswordPlaceholder: 'Conferma la tua nuova password',
passwordChangedTip: 'La tua password è stata cambiata con successo',
error: {
emailEmpty: 'L\'indirizzo email è obbligatorio',
emailInValid: 'Per favore inserisci un indirizzo email valido',
nameEmpty: 'Il nome è obbligatorio',
passwordEmpty: 'La password è obbligatoria',
passwordLengthInValid: 'La password deve essere di almeno 8 caratteri',
passwordInvalid:
'La password deve contenere lettere e numeri, e la lunghezza deve essere maggiore di 8',
},
license: {
tip: 'Prima di avviare Dify Community Edition, leggi su GitHub',
link: 'Licenza open-source',
},
join: 'Unisciti',
joinTipStart: 'Invitato a unirti al',
joinTipEnd: 'team su Dify',
invalid: 'Il link è scaduto',
explore: 'Esplora Dify',
activatedTipStart: 'Sei entrato nel team',
activatedTipEnd: '',
activated: 'Accedi ora',
adminInitPassword: 'Password di inizializzazione amministratore',
validate: 'Convalida',
}
export default translation
+4
View File
@@ -0,0 +1,4 @@
const translation = {
}
export default translation
+29
View File
@@ -0,0 +1,29 @@
const translation = {
input: 'INPUT',
result: 'RISULTATO',
detail: 'DETTAGLIO',
tracing: 'TRACCIAMENTO',
resultPanel: {
status: 'STATO',
time: 'TEMPO TRASCORSO',
tokens: 'TOKEN TOTALI',
},
meta: {
title: 'METADATI',
status: 'Stato',
version: 'Versione',
executor: 'Esecutore',
startTime: 'Ora di Inizio',
time: 'Tempo Trascorso',
tokens: 'Token Totali',
steps: 'Fasi Eseguite',
},
resultEmpty: {
title: 'Questa esecuzione ha prodotto solo output in formato JSON,',
tipLeft: 'per favore vai al ',
link: 'pannello dei dettagli',
tipRight: ' per visualizzarlo.',
},
}
export default translation
+76
View File
@@ -0,0 +1,76 @@
const translation = {
common: {
welcome: '',
appUnavailable: 'L\'app non è disponibile',
appUnkonwError: 'L\'app non è disponibile',
},
chat: {
newChat: 'Nuova chat',
pinnedTitle: 'Fissati',
unpinnedTitle: 'Chat',
newChatDefaultName: 'Nuova conversazione',
resetChat: 'Reimposta conversazione',
powerBy: 'Powered by',
prompt: 'Prompt',
privatePromptConfigTitle: 'Impostazioni conversazione',
publicPromptConfigTitle: 'Prompt iniziale',
configStatusDes:
'Prima di iniziare, puoi modificare le impostazioni della conversazione',
configDisabled:
'Le impostazioni della sessione precedente sono state utilizzate per questa sessione.',
startChat: 'Inizia Chat',
privacyPolicyLeft: 'Per favore leggi la ',
privacyPolicyMiddle: 'politica sulla privacy',
privacyPolicyRight: ' fornita dallo sviluppatore dell\'app.',
deleteConversation: {
title: 'Elimina conversazione',
content: 'Sei sicuro di voler eliminare questa conversazione?',
},
tryToSolve: 'Prova a risolvere',
temporarySystemIssue: 'Spiacente, problema temporaneo del sistema.',
},
generation: {
tabs: {
create: 'Esegui una volta',
batch: 'Esegui batch',
saved: 'Salvato',
},
savedNoData: {
title: 'Non hai ancora salvato un risultato!',
description:
'Inizia a generare contenuti e trova i tuoi risultati salvati qui.',
startCreateContent: 'Inizia a creare contenuti',
},
title: 'Completamento AI',
queryTitle: 'Contenuto della query',
completionResult: 'Risultato del completamento',
queryPlaceholder: 'Scrivi il contenuto della tua query...',
run: 'Esegui',
copy: 'Copia',
resultTitle: 'Completamento AI',
noData: 'L\'AI ti darà ciò che desideri qui.',
csvUploadTitle: 'Trascina e rilascia il tuo file CSV qui, oppure ',
browse: 'sfoglia',
csvStructureTitle: 'Il file CSV deve rispettare la seguente struttura:',
downloadTemplate: 'Scarica qui il modello',
field: 'Campo',
batchFailed: {
info: '{{num}} esecuzioni fallite',
retry: 'Riprova',
outputPlaceholder: 'Nessun contenuto di output',
},
errorMsg: {
empty: 'Per favore inserisci contenuto nel file caricato.',
fileStructNotMatch:
'Il file CSV caricato non corrisponde alla struttura.',
emptyLine: 'Riga {{rowIndex}} è vuota',
invalidLine:
'Riga {{rowIndex}}: il valore di {{varName}} non può essere vuoto',
moreThanMaxLengthLine:
'Riga {{rowIndex}}: il valore di {{varName}} non può essere superiore a {{maxLength}} caratteri',
atLeastOne: 'Per favore inserisci almeno una riga nel file caricato.',
},
},
}
export default translation
+163
View File
@@ -0,0 +1,163 @@
const translation = {
title: 'Strumenti',
createCustomTool: 'Crea Strumento Personalizzato',
customToolTip: 'Scopri di più sugli strumenti personalizzati di Dify',
type: {
all: 'Tutti',
builtIn: 'Integrato',
custom: 'Personalizzato',
workflow: 'Flusso di lavoro',
},
contribute: {
line1: 'Sono interessato a ',
line2: 'contribuire con strumenti a Dify.',
viewGuide: 'Visualizza la guida',
},
author: 'Di',
auth: {
unauthorized: 'Per Autorizzare',
authorized: 'Autorizzato',
setup: 'Configura l\'autorizzazione per utilizzare',
setupModalTitle: 'Configura Autorizzazione',
setupModalTitleDescription:
'Dopo aver configurato le credenziali, tutti i membri all\'interno del workspace possono utilizzare questo strumento durante l\'orchestrazione delle applicazioni.',
},
includeToolNum: '{{num}} strumenti inclusi',
addTool: 'Aggiungi Strumento',
addToolModal: {
type: 'tipo',
category: 'categoria',
add: 'aggiungi',
added: 'aggiunto',
manageInTools: 'Gestisci in Strumenti',
emptyTitle: 'Nessun strumento di flusso di lavoro disponibile',
emptyTip: 'Vai a `Flusso di lavoro -> Pubblica come Strumento`',
},
createTool: {
title: 'Crea Strumento Personalizzato',
editAction: 'Configura',
editTitle: 'Modifica Strumento Personalizzato',
name: 'Nome',
toolNamePlaceHolder: 'Inserisci il nome dello strumento',
nameForToolCall: 'Nome chiamata strumento',
nameForToolCallPlaceHolder:
'Usato per il riconoscimento della macchina, ad esempio getCurrentWeather, list_pets',
nameForToolCallTip: 'Supporta solo numeri, lettere e underscore.',
description: 'Descrizione',
descriptionPlaceholder:
'Breve descrizione dello scopo dello strumento, ad esempio, ottenere la temperatura per una posizione specifica.',
schema: 'Schema',
schemaPlaceHolder: 'Inserisci qui il tuo schema OpenAPI',
viewSchemaSpec: 'Visualizza la Specifica OpenAPI-Swagger',
importFromUrl: 'Importa da URL',
importFromUrlPlaceHolder: 'https://...',
urlError: 'Per favore inserisci un URL valido',
examples: 'Esempi',
exampleOptions: {
json: 'Weather(JSON)',
yaml: 'Pet Store(YAML)',
blankTemplate: 'Modello Vuoto',
},
availableTools: {
title: 'Strumenti Disponibili',
name: 'Nome',
description: 'Descrizione',
method: 'Metodo',
path: 'Percorso',
action: 'Azioni',
test: 'Test',
},
authMethod: {
title: 'Metodo di autorizzazione',
type: 'Tipo di autorizzazione',
keyTooltip:
'Http Header Key, Puoi lasciarlo come `Authorization` se non sai cos\'è o impostarlo su un valore personalizzato',
types: {
none: 'Nessuno',
api_key: 'API Key',
apiKeyPlaceholder: 'Nome dell\'intestazione HTTP per API Key',
apiValuePlaceholder: 'Inserisci API Key',
},
key: 'Chiave',
value: 'Valore',
},
authHeaderPrefix: {
title: 'Tipo di Auth',
types: {
basic: 'Basic',
bearer: 'Bearer',
custom: 'Custom',
},
},
privacyPolicy: 'Informativa sulla privacy',
privacyPolicyPlaceholder:
'Per favore inserisci l\'informativa sulla privacy',
toolInput: {
title: 'Input Strumento',
name: 'Nome',
required: 'Richiesto',
method: 'Metodo',
methodSetting: 'Impostazione',
methodSettingTip: 'L\'utente compila la configurazione dello strumento',
methodParameter: 'Parametro',
methodParameterTip: 'LLM compila durante l\'inferenza',
label: 'Tag',
labelPlaceholder: 'Scegli tag (opzionale)',
description: 'Descrizione',
descriptionPlaceholder: 'Descrizione del significato del parametro',
},
customDisclaimer: 'Disclaimer personalizzato',
customDisclaimerPlaceholder:
'Per favore inserisci disclaimer personalizzato',
confirmTitle: 'Confermare per salvare?',
confirmTip: 'Le app che utilizzano questo strumento saranno influenzate',
deleteToolConfirmTitle: 'Eliminare questo Strumento?',
deleteToolConfirmContent:
'L\'eliminazione dello Strumento è irreversibile. Gli utenti non potranno più accedere al tuo Strumento.',
},
test: {
title: 'Test',
parametersValue: 'Parametri & Valore',
parameters: 'Parametri',
value: 'Valore',
testResult: 'Risultati del Test',
testResultPlaceholder: 'I risultati del test verranno mostrati qui',
},
thought: {
using: 'Utilizzando',
used: 'Usato',
requestTitle: 'Richiesta a',
responseTitle: 'Risposta da',
},
setBuiltInTools: {
info: 'Info',
setting: 'Impostazione',
toolDescription: 'Descrizione dello strumento',
parameters: 'parametri',
string: 'stringa',
number: 'numero',
required: 'Richiesto',
infoAndSetting: 'Info & Impostazioni',
},
noCustomTool: {
title: 'Nessun strumento personalizzato!',
content:
'Aggiungi e gestisci i tuoi strumenti personalizzati qui per costruire app AI.',
createTool: 'Crea Strumento',
},
noSearchRes: {
title: 'Spiacenti, nessun risultato!',
content:
'Non abbiamo trovato strumenti che corrispondono alla tua ricerca.',
reset: 'Reimposta Ricerca',
},
builtInPromptTitle: 'Prompt',
toolRemoved: 'Strumento rimosso',
notAuthorized: 'Strumento non autorizzato',
howToGet: 'Come ottenere',
openInStudio: 'Apri in Studio',
toolNameUsageTip:
'Nome chiamata strumento per il ragionamento e il prompting dell\'agente',
}
export default translation
+504
View File
@@ -0,0 +1,504 @@
const translation = {
common: {
undo: 'Annulla',
redo: 'Ripeti',
editing: 'Modifica in corso',
autoSaved: 'Salvataggio automatico',
unpublished: 'Non pubblicato',
published: 'Pubblicato',
publish: 'Pubblica',
update: 'Aggiorna',
run: 'Esegui',
running: 'In esecuzione',
inRunMode: 'In modalità di esecuzione',
inPreview: 'In anteprima',
inPreviewMode: 'In modalità anteprima',
preview: 'Anteprima',
viewRunHistory: 'Visualizza cronologia esecuzioni',
runHistory: 'Cronologia esecuzioni',
goBackToEdit: 'Torna all\'editor',
conversationLog: 'Registro conversazioni',
features: 'Caratteristiche',
debugAndPreview: 'Debug e Anteprima',
restart: 'Riavvia',
currentDraft: 'Bozza corrente',
currentDraftUnpublished: 'Bozza corrente non pubblicata',
latestPublished: 'Ultimo pubblicato',
publishedAt: 'Pubblicato',
restore: 'Ripristina',
runApp: 'Esegui App',
batchRunApp: 'Esegui App in Batch',
accessAPIReference: 'Accedi alla Riferimento API',
embedIntoSite: 'Incorpora nel Sito',
addTitle: 'Aggiungi titolo...',
addDescription: 'Aggiungi descrizione...',
noVar: 'Nessuna variabile',
searchVar: 'Cerca variabile',
variableNamePlaceholder: 'Nome variabile',
setVarValuePlaceholder: 'Imposta variabile',
needConnecttip: 'Questo passaggio non è collegato a nulla',
maxTreeDepth: 'Limite massimo di {{depth}} nodi per ramo',
needEndNode: 'Deve essere aggiunto il blocco di Fine',
needAnswerNode: 'Deve essere aggiunto il blocco di Risposta',
workflowProcess: 'Processo di flusso di lavoro',
notRunning: 'Non ancora in esecuzione',
previewPlaceholder:
'Inserisci contenuto nella casella sottostante per avviare il debug del Chatbot',
effectVarConfirm: {
title: 'Rimuovi Variabile',
content:
'La variabile è utilizzata in altri nodi. Vuoi comunque rimuoverla?',
},
insertVarTip: 'Premi il tasto \'/\' per inserire rapidamente',
processData: 'Elabora Dati',
input: 'Input',
output: 'Output',
jinjaEditorPlaceholder: 'Digita \'/\' o \'{\' per inserire variabile',
viewOnly: 'Solo visualizzazione',
showRunHistory: 'Mostra cronologia esecuzioni',
enableJinja: 'Abilita supporto template Jinja',
learnMore: 'Scopri di più',
copy: 'Copia',
duplicate: 'Duplica',
addBlock: 'Aggiungi Blocco',
pasteHere: 'Incolla Qui',
pointerMode: 'Modalità Puntatore',
handMode: 'Modalità Mano',
model: 'Modello',
workflowAsTool: 'Flusso di lavoro come Strumento',
configureRequired: 'Configurazione Richiesta',
configure: 'Configura',
manageInTools: 'Gestisci in Strumenti',
workflowAsToolTip:
'È richiesta una nuova configurazione dello strumento dopo l\'aggiornamento del flusso di lavoro.',
viewDetailInTracingPanel: 'Visualizza dettagli',
syncingData: 'Sincronizzazione dei dati in corso, solo pochi secondi.',
importDSL: 'Importa DSL',
importDSLTip:
'La bozza corrente verrà sovrascritta. Esporta il flusso di lavoro come backup prima di importare.',
backupCurrentDraft: 'Backup Bozza Corrente',
chooseDSL: 'Scegli file DSL(yml)',
overwriteAndImport: 'Sovrascrivi e Importa',
importFailure: 'Importazione fallita',
importSuccess: 'Importazione riuscita',
},
changeHistory: {
title: 'Cronologia Modifiche',
placeholder: 'Non hai ancora modificato nulla',
clearHistory: 'Cancella Cronologia',
hint: 'Suggerimento',
hintText:
'Le tue azioni di modifica vengono tracciate in una cronologia delle modifiche, che viene memorizzata sul tuo dispositivo per tutta la durata di questa sessione. Questa cronologia verrà cancellata quando lascerai l\'editor.',
stepBackward_one: '{{count}} passo indietro',
stepBackward_other: '{{count}} passi indietro',
stepForward_one: '{{count}} passo avanti',
stepForward_other: '{{count}} passi avanti',
sessionStart: 'Inizio sessione',
currentState: 'Stato attuale',
nodeTitleChange: 'Titolo del blocco modificato',
nodeDescriptionChange: 'Descrizione del blocco modificata',
nodeDragStop: 'Blocco spostato',
nodeChange: 'Blocco modificato',
nodeConnect: 'Blocco collegato',
nodePaste: 'Blocco incollato',
nodeDelete: 'Blocco eliminato',
nodeAdd: 'Blocco aggiunto',
nodeResize: 'Blocco ridimensionato',
noteAdd: 'Nota aggiunta',
noteChange: 'Nota modificata',
noteDelete: 'Nota eliminata',
edgeDelete: 'Blocco scollegato',
},
errorMsg: {
fieldRequired: '{{field}} è richiesto',
authRequired: 'È richiesta l\'autorizzazione',
invalidJson: '{{field}} è un JSON non valido',
fields: {
variable: 'Nome Variabile',
variableValue: 'Valore Variabile',
code: 'Codice',
model: 'Modello',
rerankModel: 'Modello Rerank',
},
invalidVariable: 'Variabile non valida',
},
singleRun: {
testRun: 'Esecuzione Test ',
startRun: 'Avvia Esecuzione',
running: 'In esecuzione',
testRunIteration: 'Iterazione Esecuzione Test',
back: 'Indietro',
iteration: 'Iterazione',
},
tabs: {
'searchBlock': 'Cerca blocco',
'blocks': 'Blocchi',
'tools': 'Strumenti',
'allTool': 'Tutti',
'builtInTool': 'Integrato',
'customTool': 'Personalizzato',
'workflowTool': 'Flusso di lavoro',
'question-understand': 'Comprensione Domanda',
'logic': 'Logica',
'transform': 'Trasforma',
'utilities': 'Utility',
'noResult': 'Nessuna corrispondenza trovata',
},
blocks: {
'start': 'Inizio',
'end': 'Fine',
'answer': 'Risposta',
'llm': 'LLM',
'knowledge-retrieval': 'Recupero Conoscenza',
'question-classifier': 'Classificatore Domande',
'if-else': 'SE/ALTRIMENTI',
'code': 'Codice',
'template-transform': 'Template',
'http-request': 'Richiesta HTTP',
'variable-assigner': 'Assegnatore Variabili',
'variable-aggregator': 'Aggregatore Variabili',
'iteration-start': 'Inizio Iterazione',
'iteration': 'Iterazione',
'parameter-extractor': 'Estrattore Parametri',
},
blocksAbout: {
'start': 'Definisci i parametri iniziali per l\'avvio di un flusso di lavoro',
'end': 'Definisci la fine e il tipo di risultato di un flusso di lavoro',
'answer': 'Definisci il contenuto della risposta di una conversazione chat',
'llm': 'Invoca modelli di linguaggio di grandi dimensioni per rispondere a domande o elaborare il linguaggio naturale',
'knowledge-retrieval':
'Ti consente di interrogare il contenuto del testo relativo alle domande dell\'utente dalla Conoscenza',
'question-classifier':
'Definisci le condizioni di classificazione delle domande dell\'utente, LLM può definire come prosegue la conversazione in base alla descrizione della classificazione',
'if-else':
'Ti consente di dividere il flusso di lavoro in due rami basati su condizioni se/altrimenti',
'code': 'Esegui un pezzo di codice Python o NodeJS per implementare la logica personalizzata',
'template-transform':
'Converti i dati in stringa usando la sintassi del template Jinja',
'http-request':
'Consenti l\'invio di richieste server tramite il protocollo HTTP',
'variable-assigner':
'Aggrega variabili multi-ramo in una singola variabile per la configurazione unificata dei nodi a valle.',
'variable-aggregator':
'Aggrega variabili multi-ramo in una singola variabile per la configurazione unificata dei nodi a valle.',
'iteration':
'Esegui più passaggi su un oggetto lista fino a quando tutti i risultati non sono stati prodotti.',
'parameter-extractor':
'Usa LLM per estrarre parametri strutturati dal linguaggio naturale per invocazioni di strumenti o richieste HTTP.',
},
operator: {
zoomIn: 'Zoom In',
zoomOut: 'Zoom Out',
zoomTo50: 'Zoom al 50%',
zoomTo100: 'Zoom al 100%',
zoomToFit: 'Zoom per Adattare',
},
panel: {
userInputField: 'Campo di Input Utente',
changeBlock: 'Cambia Blocco',
helpLink: 'Link di Aiuto',
about: 'Informazioni',
createdBy: 'Creato da ',
nextStep: 'Prossimo Passo',
addNextStep: 'Aggiungi il prossimo blocco in questo flusso di lavoro',
selectNextStep: 'Seleziona Prossimo Blocco',
runThisStep: 'Esegui questo passo',
checklist: 'Checklist',
checklistTip:
'Assicurati che tutti i problemi siano risolti prima di pubblicare',
checklistResolved: 'Tutti i problemi sono risolti',
organizeBlocks: 'Organizza blocchi',
change: 'Cambia',
},
nodes: {
common: {
outputVars: 'Variabili di Output',
insertVarTip: 'Inserisci Variabile',
memory: {
memory: 'Memoria',
memoryTip: 'Impostazioni memoria chat',
windowSize: 'Dimensione Finestra',
conversationRoleName: 'Nome Ruolo Conversazione',
user: 'Prefisso Utente',
assistant: 'Prefisso Assistente',
},
memories: {
title: 'Memorie',
tip: 'Memoria chat',
builtIn: 'Integrato',
},
},
start: {
required: 'richiesto',
inputField: 'Campo di Input',
builtInVar: 'Variabili Integrate',
outputVars: {
query: 'Input Utente',
memories: {
des: 'Cronologia conversazioni',
type: 'tipo di messaggio',
content: 'contenuto del messaggio',
},
files: 'Elenco file',
},
noVarTip:
'Imposta gli input che possono essere utilizzati nel Flusso di lavoro',
},
end: {
outputs: 'Output',
output: {
type: 'tipo di output',
variable: 'variabile di output',
},
type: {
'none': 'Nessuno',
'plain-text': 'Testo Semplice',
'structured': 'Strutturato',
},
},
answer: {
answer: 'Risposta',
outputVars: 'Variabili di Output',
},
llm: {
model: 'modello',
variables: 'variabili',
context: 'contesto',
contextTooltip: 'Puoi importare Conoscenza come contesto',
notSetContextInPromptTip:
'Per abilitare la funzionalità di contesto, compila la variabile del contesto nel PROMPT.',
prompt: 'prompt',
roleDescription: {
system: 'Fornisci istruzioni di alto livello per la conversazione',
user: 'Fornisci istruzioni, query o qualsiasi input basato su testo al modello',
assistant: 'Le risposte del modello basate sui messaggi dell\'utente',
},
addMessage: 'Aggiungi Messaggio',
vision: 'vision',
files: 'File',
resolution: {
name: 'Risoluzione',
high: 'Alta',
low: 'Bassa',
},
outputVars: {
output: 'Genera contenuto',
usage: 'Informazioni sull\'utilizzo del modello',
},
singleRun: {
variable: 'Variabile',
},
sysQueryInUser: 'sys.query nel messaggio utente è richiesto',
},
knowledgeRetrieval: {
queryVariable: 'Variabile Query',
knowledge: 'Conoscenza',
outputVars: {
output: 'Dati segmentati di recupero',
content: 'Contenuto segmentato',
title: 'Titolo segmentato',
icon: 'Icona segmentata',
url: 'URL segmentato',
metadata: 'Altri metadati',
},
},
http: {
inputVars: 'Variabili di Input',
api: 'API',
apiPlaceholder: 'Inserisci URL, digita / per inserire variabile',
notStartWithHttp: 'L\'API deve iniziare con http:// o https://',
key: 'Chiave',
value: 'Valore',
bulkEdit: 'Modifica di massa',
keyValueEdit: 'Modifica Chiave-Valore',
headers: 'Intestazioni',
params: 'Parametri',
body: 'Corpo',
outputVars: {
body: 'Contenuto Risposta',
statusCode: 'Codice Stato Risposta',
headers: 'Elenco Intestazioni Risposta JSON',
files: 'Elenco File',
},
authorization: {
'authorization': 'Autorizzazione',
'authorizationType': 'Tipo di Autorizzazione',
'no-auth': 'Nessuno',
'api-key': 'API-Key',
'auth-type': 'Tipo Auth',
'basic': 'Basic',
'bearer': 'Bearer',
'custom': 'Custom',
'api-key-title': 'API Key',
'header': 'Intestazione',
},
insertVarPlaceholder: 'digita \'/\' per inserire variabile',
timeout: {
title: 'Timeout',
connectLabel: 'Timeout Connessione',
connectPlaceholder: 'Inserisci timeout connessione in secondi',
readLabel: 'Timeout Lettura',
readPlaceholder: 'Inserisci timeout lettura in secondi',
writeLabel: 'Timeout Scrittura',
writePlaceholder: 'Inserisci timeout scrittura in secondi',
},
},
code: {
inputVars: 'Variabili di Input',
outputVars: 'Variabili di Output',
advancedDependencies: 'Dipendenze Avanzate',
advancedDependenciesTip:
'Aggiungi alcune dipendenze precaricate che richiedono più tempo per essere consumate o che non sono predefinite qui',
searchDependencies: 'Cerca Dipendenze',
},
templateTransform: {
inputVars: 'Variabili di Input',
code: 'Codice',
codeSupportTip: 'Supporta solo Jinja2',
outputVars: {
output: 'Contenuto trasformato',
},
},
ifElse: {
if: 'Se',
else: 'Altrimenti',
elseDescription:
'Utilizzato per definire la logica che dovrebbe essere eseguita quando la condizione se non è soddisfatta.',
and: 'e',
or: 'o',
operator: 'Operatore',
notSetVariable: 'Si prega di impostare prima la variabile',
comparisonOperator: {
'contains': 'contiene',
'not contains': 'non contiene',
'start with': 'inizia con',
'end with': 'finisce con',
'is': 'è',
'is not': 'non è',
'empty': 'è vuoto',
'not empty': 'non è vuoto',
'null': 'è nullo',
'not null': 'non è nullo',
},
enterValue: 'Inserisci valore',
addCondition: 'Aggiungi Condizione',
conditionNotSetup: 'Condizione NON impostata',
selectVariable: 'Seleziona variabile...',
},
variableAssigner: {
title: 'Assegna variabili',
outputType: 'Tipo di Output',
varNotSet: 'Variabile non impostata',
noVarTip: 'Aggiungi le variabili da assegnare',
type: {
string: 'Stringa',
number: 'Numero',
object: 'Oggetto',
array: 'Array',
},
aggregationGroup: 'Gruppo di Aggregazione',
aggregationGroupTip:
'Abilitando questa funzione, l\'aggregatore di variabili potrà aggregare più set di variabili.',
addGroup: 'Aggiungi Gruppo',
outputVars: {
varDescribe: 'Output {{groupName}}',
},
setAssignVariable: 'Imposta variabile assegnata',
},
tool: {
toAuthorize: 'Per autorizzare',
inputVars: 'Variabili di Input',
outputVars: {
text: 'contenuto generato dallo strumento',
files: {
title: 'file generati dallo strumento',
type: 'Tipo supportato. Attualmente supporta solo immagini',
transfer_method:
'Metodo di trasferimento. Il valore è remote_url o local_file',
url: 'URL immagine',
upload_file_id: 'ID file caricato',
},
json: 'json generato dallo strumento',
},
},
questionClassifiers: {
model: 'modello',
inputVars: 'Variabili di Input',
outputVars: {
className: 'Nome Classe',
},
class: 'Classe',
classNamePlaceholder: 'Scrivi il nome della tua classe',
advancedSetting: 'Impostazione Avanzata',
topicName: 'Nome Argomento',
topicPlaceholder: 'Scrivi il nome del tuo argomento',
addClass: 'Aggiungi Classe',
instruction: 'Istruzione',
instructionTip:
'Inserisci istruzioni aggiuntive per aiutare il classificatore di domande a capire meglio come categorizzare le domande.',
instructionPlaceholder: 'Scrivi la tua istruzione',
},
parameterExtractor: {
inputVar: 'Variabile di Input',
extractParameters: 'Estrai Parametri',
importFromTool: 'Importa dagli strumenti',
addExtractParameter: 'Aggiungi Parametro Estratto',
addExtractParameterContent: {
name: 'Nome',
namePlaceholder: 'Nome Parametro Estratto',
type: 'Tipo',
typePlaceholder: 'Tipo Parametro Estratto',
description: 'Descrizione',
descriptionPlaceholder: 'Descrizione Parametro Estratto',
required: 'Richiesto',
requiredContent:
'Richiesto viene utilizzato solo come riferimento per l\'inferenza del modello, e non per la convalida obbligatoria dell\'output del parametro.',
},
extractParametersNotSet: 'Parametri Estratti non impostati',
instruction: 'Istruzione',
instructionTip:
'Inserisci istruzioni aggiuntive per aiutare l\'estrattore di parametri a capire come estrarre i parametri.',
advancedSetting: 'Impostazione Avanzata',
reasoningMode: 'Modalità di ragionamento',
reasoningModeTip:
'Puoi scegliere la modalità di ragionamento appropriata in base alla capacità del modello di rispondere alle istruzioni per la chiamata delle funzioni o i prompt.',
isSuccess:
'È successo. In caso di successo il valore è 1, in caso di fallimento il valore è 0.',
errorReason: 'Motivo dell\'errore',
},
iteration: {
deleteTitle: 'Eliminare Nodo Iterazione?',
deleteDesc:
'Eliminando il nodo iterazione verranno eliminati tutti i nodi figlio',
input: 'Input',
output: 'Variabili di Output',
iteration_one: '{{count}} Iterazione',
iteration_other: '{{count}} Iterazioni',
currentIteration: 'Iterazione Corrente',
},
note: {
addNote: 'Aggiungi Nota',
editor: {
placeholder: 'Scrivi la tua nota...',
small: 'Piccolo',
medium: 'Medio',
large: 'Grande',
bold: 'Grassetto',
italic: 'Corsivo',
strikethrough: 'Barrato',
link: 'Link',
openLink: 'Apri',
unlink: 'Rimuovi link',
enterUrl: 'Inserisci URL...',
invalidUrl: 'URL non valido',
bulletList: 'Elenco puntato',
showAuthor: 'Mostra Autore',
},
},
},
tracing: {
stopBy: 'Interrotto da {{user}}',
},
}
export default translation
+23 -11
View File
@@ -49,19 +49,31 @@ export const NOTICE_I18N = {
pl_PL: 'Ważne ogłoszenie',
uk_UA: 'Важливе повідомлення',
vi_VN: 'Thông báo quan trọng',
it_IT: 'Avviso Importante',
},
desc: {
en_US: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
zh_Hans: '为了有效提升数据检索能力及稳定性,Dify 将于 2023 年 8 月 29 日 03:00 至 08:00 期间进行服务升级,届时 Dify 云端版及应用将无法访问。感谢您的耐心与支持。',
pt_BR: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
es_ES: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
fr_FR: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
de_DE: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
ja_JP: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
ko_KR: '시스템이 업그레이드를 위해 UTC 시간대로 8월 28일 19:00 ~ 24:00에 사용 불가될 예정입니다. 질문이 있으시면 지원 팀에 연락주세요 (support@dify.ai). 최선을 다해 답변해드리겠습니다.',
pl_PL: 'Nasz system będzie niedostępny od 19:00 do 24:00 UTC 28 sierpnia w celu aktualizacji. W przypadku pytań prosimy o kontakt z naszym zespołem wsparcia (support@dify.ai). Doceniamy Twoją cierpliwość.',
uk_UA: 'Наша система буде недоступна з 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.',
en_US:
'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
zh_Hans:
'为了有效提升数据检索能力及稳定性,Dify 将于 2023 年 8 月 29 日 03:00 至 08:00 期间进行服务升级,届时 Dify 云端版及应用将无法访问。感谢您的耐心与支持。',
pt_BR:
'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
es_ES:
'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
fr_FR:
'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
de_DE:
'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
ja_JP:
'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
ko_KR:
'시스템이 업그레이드를 위해 UTC 시간대로 8월 28일 19:00 ~ 24:00에 사용 불가될 예정입니다. 질문이 있으시면 지원 팀에 연락주세요 (support@dify.ai). 최선을 다해 답변해드리겠습니다.',
pl_PL:
'Nasz system będzie niedostępny od 19:00 do 24:00 UTC 28 sierpnia w celu aktualizacji. W przypadku pytań prosimy o kontakt z naszym zespołem wsparcia (support@dify.ai). Doceniamy Twoją cierpliwość.',
uk_UA:
'Наша система буде недоступна з 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.',
},
href: '#',
}
+1 -1
View File
@@ -75,7 +75,7 @@
"name": "Italiano (Italia)",
"prompt_name": "Italian",
"example": "Ciao, Dify!",
"supported": false
"supported": true
},
{
"value": "th-TH",
+4
View File
@@ -13,6 +13,10 @@ const translation = {
exportFailed: '导出 DSL 失败',
importDSL: '导入 DSL 文件',
createFromConfigFile: '通过 DSL 文件创建',
importFromDSL: '导入 DSL',
importFromDSLFile: '文件',
importFromDSLUrl: 'URL',
importFromDSLUrlPlaceholder: '输入 DSL 文件的 URL',
deleteAppConfirmTitle: '确认删除应用?',
deleteAppConfirmContent:
'删除应用将无法撤销。用户将不能访问你的应用,所有 Prompt 编排配置和日志均将一并被删除。',
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "dify-web",
"version": "0.6.13",
"version": "0.6.14",
"private": true,
"engines": {
"node": ">=18.17.0"
+4
View File
@@ -37,6 +37,10 @@ export const importApp: Fetcher<AppDetailResponse, { data: string; name?: string
return post<AppDetailResponse>('apps/import', { body: { data, name, description, icon, icon_background } })
}
export const importAppFromUrl: Fetcher<AppDetailResponse, { url: string; name?: string; description?: string; icon?: string; icon_background?: string }> = ({ url, name, description, icon, icon_background }) => {
return post<AppDetailResponse>('apps/import/url', { body: { url, name, description, icon, icon_background } })
}
export const switchApp: Fetcher<{ new_app_id: string }, { appID: string; name: string; icon: string; icon_background: string }> = ({ appID, name, icon, icon_background }) => {
return post<{ new_app_id: string }>(`apps/${appID}/convert-to-workflow`, { body: { name, icon, icon_background } })
}
+150 -150
View File
@@ -174,7 +174,7 @@ html[data-theme="dark"] {
--color-components-badge-status-light-success-halo: #17B26A4D;
--color-components-badge-status-light-border-outer: #222225;
--color-components-badge-status-light-_high-light: #FFFFFF4D;
--color-components-badge-status-light-high-light: #FFFFFF4D;
--color-components-badge-status-light-warning-bg: #F79009;
--color-components-badge-status-light-warning-border-inner: #FDB022;
--color-components-badge-status-light-warning-halo: #F790094D;
@@ -249,7 +249,7 @@ html[data-theme="dark"] {
--color-text-accent-secondary: #84ABFF;
--color-text-accent-light-mode-only: #D9D9DE;
--color-text-text-selected: #155AEF4D;
--color-text-_secondary-on-surface: #FFFFFFE5;
--color-text-secondary-on-surface: #FFFFFFE5;
--color-text-logo-text: #E9E9EC;
--color-text-empty-state-icon: #C8CEDA4D;
@@ -298,12 +298,12 @@ html[data-theme="dark"] {
--color-shadow-shadow-2: #00000014;
--color-shadow-shadow-10: #00000066;
--color-workflow-block-_border: #FFFFFF14;
--color-workflow-block-_panel-bg: #27272B;
--color-workflow-block-border: #FFFFFF14;
--color-workflow-block-panel-bg: #27272B;
--color-workflow-block-border: #FFFFFF14;
--color-workflow-block-parma-bg: #FFFFFF0D;
--color-workflow-block-_nav-bg: #1D1D20;
--color-workflow-block-_nav-border-right: #FFFFFF0D;
--color-workflow-block-nav-bg: #1D1D20;
--color-workflow-block-nav-border-right: #FFFFFF0D;
--color-workflow-block-bg: #27272B;
--color-workflow-canvas-workflow-dot-color: #8585AD26;
@@ -395,167 +395,167 @@ html[data-theme="dark"] {
--color-effects-highlight-lightmode-off: #C8CEDA14;
--color-effects-image-frame: #FFFFFF;
--color-_util-colors-orange-dark-orange-dark-50: #57130A;
--color-_util-colors-orange-dark-orange-dark-100: #771A0D;
--color-_util-colors-orange-dark-orange-dark-200: #97180C;
--color-_util-colors-orange-dark-orange-dark-300: #BC1B06;
--color-_util-colors-orange-dark-orange-dark-400: #E62E05;
--color-_util-colors-orange-dark-orange-dark-500: #FF4405;
--color-_util-colors-orange-dark-orange-dark-600: #FF692E;
--color-_util-colors-orange-dark-orange-dark-700: #FF9C66;
--color-util-colors-orange-dark-orange-dark-50: #57130A;
--color-util-colors-orange-dark-orange-dark-100: #771A0D;
--color-util-colors-orange-dark-orange-dark-200: #97180C;
--color-util-colors-orange-dark-orange-dark-300: #BC1B06;
--color-util-colors-orange-dark-orange-dark-400: #E62E05;
--color-util-colors-orange-dark-orange-dark-500: #FF4405;
--color-util-colors-orange-dark-orange-dark-600: #FF692E;
--color-util-colors-orange-dark-orange-dark-700: #FF9C66;
--color-_util-colors-orange-orange-50: #511C10;
--color-_util-colors-orange-orange-100: #772917;
--color-_util-colors-orange-orange-200: #932F19;
--color-_util-colors-orange-orange-300: #B93815;
--color-_util-colors-orange-orange-400: #E04F16;
--color-_util-colors-orange-orange-500: #EF6820;
--color-_util-colors-orange-orange-600: #F38744;
--color-_util-colors-orange-orange-700: #F7B27A;
--color-util-colors-orange-orange-50: #511C10;
--color-util-colors-orange-orange-100: #772917;
--color-util-colors-orange-orange-200: #932F19;
--color-util-colors-orange-orange-300: #B93815;
--color-util-colors-orange-orange-400: #E04F16;
--color-util-colors-orange-orange-500: #EF6820;
--color-util-colors-orange-orange-600: #F38744;
--color-util-colors-orange-orange-700: #F7B27A;
--color-_util-colors-pink-pink-50: #4E0D30;
--color-_util-colors-pink-pink-100: #851651;
--color-_util-colors-pink-pink-200: #9E165F;
--color-_util-colors-pink-pink-300: #C11574;
--color-_util-colors-pink-pink-400: #DD2590;
--color-_util-colors-pink-pink-500: #EE46BC;
--color-_util-colors-pink-pink-600: #F670C7;
--color-_util-colors-pink-pink-700: #FAA7E0;
--color-util-colors-pink-pink-50: #4E0D30;
--color-util-colors-pink-pink-100: #851651;
--color-util-colors-pink-pink-200: #9E165F;
--color-util-colors-pink-pink-300: #C11574;
--color-util-colors-pink-pink-400: #DD2590;
--color-util-colors-pink-pink-500: #EE46BC;
--color-util-colors-pink-pink-600: #F670C7;
--color-util-colors-pink-pink-700: #FAA7E0;
--color-_util-colors-fuchsia-fuchsia-50: #47104C;
--color-_util-colors-fuchsia-fuchsia-100: #6F1877;
--color-_util-colors-fuchsia-fuchsia-200: #821890;
--color-_util-colors-fuchsia-fuchsia-300: #9F1AB1;
--color-_util-colors-fuchsia-fuchsia-400: #BA24D5;
--color-_util-colors-fuchsia-fuchsia-500: #D444F1;
--color-_util-colors-fuchsia-fuchsia-600: #E478FA;
--color-_util-colors-fuchsia-fuchsia-700: #EEAAFD;
--color-util-colors-fuchsia-fuchsia-50: #47104C;
--color-util-colors-fuchsia-fuchsia-100: #6F1877;
--color-util-colors-fuchsia-fuchsia-200: #821890;
--color-util-colors-fuchsia-fuchsia-300: #9F1AB1;
--color-util-colors-fuchsia-fuchsia-400: #BA24D5;
--color-util-colors-fuchsia-fuchsia-500: #D444F1;
--color-util-colors-fuchsia-fuchsia-600: #E478FA;
--color-util-colors-fuchsia-fuchsia-700: #EEAAFD;
--color-_util-colors-purple-purple-50: #27115F;
--color-_util-colors-purple-purple-100: #3E1C96;
--color-_util-colors-purple-purple-200: #4A1FB8;
--color-_util-colors-purple-purple-300: #5925DC;
--color-_util-colors-purple-purple-400: #6938EF;
--color-_util-colors-purple-purple-500: #7A5AF8;
--color-_util-colors-purple-purple-600: #9B8AFB;
--color-_util-colors-purple-purple-700: #BDB4FE;
--color-util-colors-purple-purple-50: #27115F;
--color-util-colors-purple-purple-100: #3E1C96;
--color-util-colors-purple-purple-200: #4A1FB8;
--color-util-colors-purple-purple-300: #5925DC;
--color-util-colors-purple-purple-400: #6938EF;
--color-util-colors-purple-purple-500: #7A5AF8;
--color-util-colors-purple-purple-600: #9B8AFB;
--color-util-colors-purple-purple-700: #BDB4FE;
--color-_util-colors-indigo-indigo-50: #1F235B;
--color-_util-colors-indigo-indigo-100: #2D3282;
--color-_util-colors-indigo-indigo-200: #2D31A6;
--color-_util-colors-indigo-indigo-300: #3538CD;
--color-_util-colors-indigo-indigo-400: #444CE7;
--color-_util-colors-indigo-indigo-500: #6172F3;
--color-_util-colors-indigo-indigo-600: #8098F9;
--color-_util-colors-indigo-indigo-700: #A4BCFD;
--color-util-colors-indigo-indigo-50: #1F235B;
--color-util-colors-indigo-indigo-100: #2D3282;
--color-util-colors-indigo-indigo-200: #2D31A6;
--color-util-colors-indigo-indigo-300: #3538CD;
--color-util-colors-indigo-indigo-400: #444CE7;
--color-util-colors-indigo-indigo-500: #6172F3;
--color-util-colors-indigo-indigo-600: #8098F9;
--color-util-colors-indigo-indigo-700: #A4BCFD;
--color-_util-colors-blue-blue-50: #102A56;
--color-_util-colors-blue-blue-100: #194185;
--color-_util-colors-blue-blue-200: #1849A9;
--color-_util-colors-blue-blue-300: #175CD3;
--color-_util-colors-blue-blue-400: #1570EF;
--color-_util-colors-blue-blue-500: #2E90FA;
--color-_util-colors-blue-blue-600: #53B1FD;
--color-_util-colors-blue-blue-700: #84CAFF;
--color-util-colors-blue-blue-50: #102A56;
--color-util-colors-blue-blue-100: #194185;
--color-util-colors-blue-blue-200: #1849A9;
--color-util-colors-blue-blue-300: #175CD3;
--color-util-colors-blue-blue-400: #1570EF;
--color-util-colors-blue-blue-500: #2E90FA;
--color-util-colors-blue-blue-600: #53B1FD;
--color-util-colors-blue-blue-700: #84CAFF;
--color-_util-colors-blue-light-blue-light-50: #062C41;
--color-_util-colors-blue-light-blue-light-100: #0B4A6F;
--color-_util-colors-blue-light-blue-light-200: #065986;
--color-_util-colors-blue-light-blue-light-300: #026AA2;
--color-_util-colors-blue-light-blue-light-400: #0086C9;
--color-_util-colors-blue-light-blue-light-500: #0BA5EC;
--color-_util-colors-blue-light-blue-light-600: #36BFFA;
--color-_util-colors-blue-light-blue-light-700: #7CD4FD;
--color-util-colors-blue-light-blue-light-50: #062C41;
--color-util-colors-blue-light-blue-light-100: #0B4A6F;
--color-util-colors-blue-light-blue-light-200: #065986;
--color-util-colors-blue-light-blue-light-300: #026AA2;
--color-util-colors-blue-light-blue-light-400: #0086C9;
--color-util-colors-blue-light-blue-light-500: #0BA5EC;
--color-util-colors-blue-light-blue-light-600: #36BFFA;
--color-util-colors-blue-light-blue-light-700: #7CD4FD;
--color-_util-colors-gray-blue-gray-blue-50: #0D0F1C;
--color-_util-colors-gray-blue-gray-blue-100: #101323;
--color-_util-colors-gray-blue-gray-blue-200: #293056;
--color-_util-colors-gray-blue-gray-blue-300: #363F72;
--color-_util-colors-gray-blue-gray-blue-400: #3E4784;
--color-_util-colors-gray-blue-gray-blue-500: #4E5BA6;
--color-_util-colors-gray-blue-gray-blue-600: #717BBC;
--color-_util-colors-gray-blue-gray-blue-700: #B3B8DB;
--color-util-colors-gray-blue-gray-blue-50: #0D0F1C;
--color-util-colors-gray-blue-gray-blue-100: #101323;
--color-util-colors-gray-blue-gray-blue-200: #293056;
--color-util-colors-gray-blue-gray-blue-300: #363F72;
--color-util-colors-gray-blue-gray-blue-400: #3E4784;
--color-util-colors-gray-blue-gray-blue-500: #4E5BA6;
--color-util-colors-gray-blue-gray-blue-600: #717BBC;
--color-util-colors-gray-blue-gray-blue-700: #B3B8DB;
--color-_util-colors-blue-brand-blue-brand-50: #002066;
--color-_util-colors-blue-brand-blue-brand-100: #00329E;
--color-_util-colors-blue-brand-blue-brand-200: #003DC1;
--color-_util-colors-blue-brand-blue-brand-300: #004AEB;
--color-_util-colors-blue-brand-blue-brand-400: #155AEF;
--color-_util-colors-blue-brand-blue-brand-500: #296DFF;
--color-_util-colors-blue-brand-blue-brand-600: #5289FF;
--color-_util-colors-blue-brand-blue-brand-700: #84ABFF;
--color-util-colors-blue-brand-blue-brand-50: #002066;
--color-util-colors-blue-brand-blue-brand-100: #00329E;
--color-util-colors-blue-brand-blue-brand-200: #003DC1;
--color-util-colors-blue-brand-blue-brand-300: #004AEB;
--color-util-colors-blue-brand-blue-brand-400: #155AEF;
--color-util-colors-blue-brand-blue-brand-500: #296DFF;
--color-util-colors-blue-brand-blue-brand-600: #5289FF;
--color-util-colors-blue-brand-blue-brand-700: #84ABFF;
--color-_util-colors-red-red-50: #55160C;
--color-_util-colors-red-red-100: #7A271A;
--color-_util-colors-red-red-200: #912018;
--color-_util-colors-red-red-300: #B42318;
--color-_util-colors-red-red-400: #D92D20;
--color-_util-colors-red-red-500: #F04438;
--color-_util-colors-red-red-600: #F97066;
--color-_util-colors-red-red-700: #FDA29B;
--color-util-colors-red-red-50: #55160C;
--color-util-colors-red-red-100: #7A271A;
--color-util-colors-red-red-200: #912018;
--color-util-colors-red-red-300: #B42318;
--color-util-colors-red-red-400: #D92D20;
--color-util-colors-red-red-500: #F04438;
--color-util-colors-red-red-600: #F97066;
--color-util-colors-red-red-700: #FDA29B;
--color-_util-colors-green-green-50: #053321;
--color-_util-colors-green-green-100: #074D31;
--color-_util-colors-green-green-200: #085D3A;
--color-_util-colors-green-green-300: #067647;
--color-_util-colors-green-green-400: #079455;
--color-_util-colors-green-green-500: #17B26A;
--color-_util-colors-green-green-600: #47CD89;
--color-_util-colors-green-green-700: #75E0A7;
--color-util-colors-green-green-50: #053321;
--color-util-colors-green-green-100: #074D31;
--color-util-colors-green-green-200: #085D3A;
--color-util-colors-green-green-300: #067647;
--color-util-colors-green-green-400: #079455;
--color-util-colors-green-green-500: #17B26A;
--color-util-colors-green-green-600: #47CD89;
--color-util-colors-green-green-700: #75E0A7;
--color-_util-colors-warning-warning-50: #4E1D09;
--color-_util-colors-warning-warning-100: #7A2E0E;
--color-_util-colors-warning-warning-200: #93370D;
--color-_util-colors-warning-warning-300: #B54708;
--color-_util-colors-warning-warning-400: #DC6803;
--color-_util-colors-warning-warning-500: #F79009;
--color-_util-colors-warning-warning-600: #FDB022;
--color-_util-colors-warning-warning-700: #FEC84B;
--color-util-colors-warning-warning-50: #4E1D09;
--color-util-colors-warning-warning-100: #7A2E0E;
--color-util-colors-warning-warning-200: #93370D;
--color-util-colors-warning-warning-300: #B54708;
--color-util-colors-warning-warning-400: #DC6803;
--color-util-colors-warning-warning-500: #F79009;
--color-util-colors-warning-warning-600: #FDB022;
--color-util-colors-warning-warning-700: #FEC84B;
--color-_util-colors-yellow-yellow-50: #542C0D;
--color-_util-colors-yellow-yellow-100: #713B12;
--color-_util-colors-yellow-yellow-200: #854A0E;
--color-_util-colors-yellow-yellow-300: #A15C07;
--color-_util-colors-yellow-yellow-400: #CA8504;
--color-_util-colors-yellow-yellow-500: #EAAA08;
--color-_util-colors-yellow-yellow-600: #FAC515;
--color-_util-colors-yellow-yellow-700: #FDE272;
--color-util-colors-yellow-yellow-50: #542C0D;
--color-util-colors-yellow-yellow-100: #713B12;
--color-util-colors-yellow-yellow-200: #854A0E;
--color-util-colors-yellow-yellow-300: #A15C07;
--color-util-colors-yellow-yellow-400: #CA8504;
--color-util-colors-yellow-yellow-500: #EAAA08;
--color-util-colors-yellow-yellow-600: #FAC515;
--color-util-colors-yellow-yellow-700: #FDE272;
--color-_util-colors-teal-teal-50: #0A2926;
--color-_util-colors-teal-teal-100: #134E48;
--color-_util-colors-teal-teal-200: #125D56;
--color-_util-colors-teal-teal-300: #107569;
--color-_util-colors-teal-teal-400: #0E9384;
--color-_util-colors-teal-teal-500: #15B79E;
--color-_util-colors-teal-teal-600: #2ED3B7;
--color-_util-colors-teal-teal-700: #5FE9D0;
--color-util-colors-teal-teal-50: #0A2926;
--color-util-colors-teal-teal-100: #134E48;
--color-util-colors-teal-teal-200: #125D56;
--color-util-colors-teal-teal-300: #107569;
--color-util-colors-teal-teal-400: #0E9384;
--color-util-colors-teal-teal-500: #15B79E;
--color-util-colors-teal-teal-600: #2ED3B7;
--color-util-colors-teal-teal-700: #5FE9D0;
--color-_util-colors-cyan-cyan-50: #0D2D3A;
--color-_util-colors-cyan-cyan-100: #164C63;
--color-_util-colors-cyan-cyan-200: #155B75;
--color-_util-colors-cyan-cyan-300: #0E7090;
--color-_util-colors-cyan-cyan-400: #088AB2;
--color-_util-colors-cyan-cyan-500: #06AED4;
--color-_util-colors-cyan-cyan-600: #22CCEE;
--color-_util-colors-cyan-cyan-700: #67E3F9;
--color-util-colors-cyan-cyan-50: #0D2D3A;
--color-util-colors-cyan-cyan-100: #164C63;
--color-util-colors-cyan-cyan-200: #155B75;
--color-util-colors-cyan-cyan-300: #0E7090;
--color-util-colors-cyan-cyan-400: #088AB2;
--color-util-colors-cyan-cyan-500: #06AED4;
--color-util-colors-cyan-cyan-600: #22CCEE;
--color-util-colors-cyan-cyan-700: #67E3F9;
--color-_util-colors-violet-violet-50: #2E125E;
--color-_util-colors-violet-violet-100: #491C96;
--color-_util-colors-violet-violet-200: #5720B7;
--color-_util-colors-violet-violet-300: #6927DA;
--color-_util-colors-violet-violet-400: #7839EE;
--color-_util-colors-violet-violet-500: #875BF7;
--color-_util-colors-violet-violet-600: #A48AFB;
--color-_util-colors-violet-violet-700: #C3B5FD;
--color-util-colors-violet-violet-50: #2E125E;
--color-util-colors-violet-violet-100: #491C96;
--color-util-colors-violet-violet-200: #5720B7;
--color-util-colors-violet-violet-300: #6927DA;
--color-util-colors-violet-violet-400: #7839EE;
--color-util-colors-violet-violet-500: #875BF7;
--color-util-colors-violet-violet-600: #A48AFB;
--color-util-colors-violet-violet-700: #C3B5FD;
--color-_util-colors-gray-gray-50: #0C111C;
--color-_util-colors-gray-gray-100: #101828;
--color-_util-colors-gray-gray-200: #18222F;
--color-_util-colors-gray-gray-300: #354052;
--color-_util-colors-gray-gray-400: #495464;
--color-_util-colors-gray-gray-500: #676F83;
--color-_util-colors-gray-gray-600: #98A2B2;
--color-_util-colors-gray-gray-700: #D0D5DC;
--color-util-colors-gray-gray-50: #0C111C;
--color-util-colors-gray-gray-100: #101828;
--color-util-colors-gray-gray-200: #18222F;
--color-util-colors-gray-gray-300: #354052;
--color-util-colors-gray-gray-400: #495464;
--color-util-colors-gray-gray-500: #676F83;
--color-util-colors-gray-gray-600: #98A2B2;
--color-util-colors-gray-gray-700: #D0D5DC;
--color-third-party-LangChain: #FFFFFF;
--color-third-party-Langfuse: #FFFFFF;
+150 -150
View File
@@ -174,7 +174,7 @@ html[data-theme="light"] {
--color-components-badge-status-light-success-halo: #17B26A40;
--color-components-badge-status-light-border-outer: #FFFFFF;
--color-components-badge-status-light-_high-light: #FFFFFF4D;
--color-components-badge-status-light-high-light: #FFFFFF4D;
--color-components-badge-status-light-warning-bg: #FDB022;
--color-components-badge-status-light-warning-border-inner: #F79009;
--color-components-badge-status-light-warning-halo: #F7900940;
@@ -249,7 +249,7 @@ html[data-theme="light"] {
--color-text-accent-secondary: #296DFF;
--color-text-accent-light-mode-only: #155AEF;
--color-text-text-selected: #155AEF24;
--color-text-_secondary-on-surface: #FFFFFFE5;
--color-text-secondary-on-surface: #FFFFFFE5;
--color-text-logo-text: #18222F;
--color-text-empty-state-icon: #D0D5DC;
@@ -298,12 +298,12 @@ html[data-theme="light"] {
--color-shadow-shadow-2: #09090B0A;
--color-shadow-shadow-10: #09090B0D;
--color-workflow-block-_border: #18181B14;
--color-workflow-block-_panel-bg: #FFFFFF;
--color-workflow-block-border: #18181B14;
--color-workflow-block-panel-bg: #FFFFFF;
--color-workflow-block-border: #FFFFFF;
--color-workflow-block-parma-bg: #F2F4F7;
--color-workflow-block-_nav-bg: #FFFFFF;
--color-workflow-block-_nav-border-right: #FFFFFF;
--color-workflow-block-nav-bg: #FFFFFF;
--color-workflow-block-nav-border-right: #FFFFFF;
--color-workflow-block-bg: #FCFCFD;
--color-workflow-canvas-workflow-dot-color: #8585AD26;
@@ -395,167 +395,167 @@ html[data-theme="light"] {
--color-effects-highlight-lightmode-off: #FFFFFF00;
--color-effects-image-frame: #FFFFFF;
--color-_util-colors-orange-dark-orange-dark-50: #FFF4ED;
--color-_util-colors-orange-dark-orange-dark-100: #FFE6D5;
--color-_util-colors-orange-dark-orange-dark-200: #FFD6AE;
--color-_util-colors-orange-dark-orange-dark-300: #FF9C66;
--color-_util-colors-orange-dark-orange-dark-400: #FF692E;
--color-_util-colors-orange-dark-orange-dark-500: #FF4405;
--color-_util-colors-orange-dark-orange-dark-600: #E62E05;
--color-_util-colors-orange-dark-orange-dark-700: #BC1B06;
--color-util-colors-orange-dark-orange-dark-50: #FFF4ED;
--color-util-colors-orange-dark-orange-dark-100: #FFE6D5;
--color-util-colors-orange-dark-orange-dark-200: #FFD6AE;
--color-util-colors-orange-dark-orange-dark-300: #FF9C66;
--color-util-colors-orange-dark-orange-dark-400: #FF692E;
--color-util-colors-orange-dark-orange-dark-500: #FF4405;
--color-util-colors-orange-dark-orange-dark-600: #E62E05;
--color-util-colors-orange-dark-orange-dark-700: #BC1B06;
--color-_util-colors-orange-orange-50: #FEF6EE;
--color-_util-colors-orange-orange-100: #FDEAD7;
--color-_util-colors-orange-orange-200: #F9DBAF;
--color-_util-colors-orange-orange-300: #F7B27A;
--color-_util-colors-orange-orange-400: #F38744;
--color-_util-colors-orange-orange-500: #EF6820;
--color-_util-colors-orange-orange-600: #E04F16;
--color-_util-colors-orange-orange-700: #B93815;
--color-util-colors-orange-orange-50: #FEF6EE;
--color-util-colors-orange-orange-100: #FDEAD7;
--color-util-colors-orange-orange-200: #F9DBAF;
--color-util-colors-orange-orange-300: #F7B27A;
--color-util-colors-orange-orange-400: #F38744;
--color-util-colors-orange-orange-500: #EF6820;
--color-util-colors-orange-orange-600: #E04F16;
--color-util-colors-orange-orange-700: #B93815;
--color-_util-colors-pink-pink-50: #FDF2FA;
--color-_util-colors-pink-pink-100: #FCE7F6;
--color-_util-colors-pink-pink-200: #FCCEEE;
--color-_util-colors-pink-pink-300: #FAA7E0;
--color-_util-colors-pink-pink-400: #F670C7;
--color-_util-colors-pink-pink-500: #EE46BC;
--color-_util-colors-pink-pink-600: #DD2590;
--color-_util-colors-pink-pink-700: #C11574;
--color-util-colors-pink-pink-50: #FDF2FA;
--color-util-colors-pink-pink-100: #FCE7F6;
--color-util-colors-pink-pink-200: #FCCEEE;
--color-util-colors-pink-pink-300: #FAA7E0;
--color-util-colors-pink-pink-400: #F670C7;
--color-util-colors-pink-pink-500: #EE46BC;
--color-util-colors-pink-pink-600: #DD2590;
--color-util-colors-pink-pink-700: #C11574;
--color-_util-colors-fuchsia-fuchsia-50: #FDF4FF;
--color-_util-colors-fuchsia-fuchsia-100: #FBE8FF;
--color-_util-colors-fuchsia-fuchsia-200: #F6D0FE;
--color-_util-colors-fuchsia-fuchsia-300: #EEAAFD;
--color-_util-colors-fuchsia-fuchsia-400: #E478FA;
--color-_util-colors-fuchsia-fuchsia-500: #D444F1;
--color-_util-colors-fuchsia-fuchsia-600: #BA24D5;
--color-_util-colors-fuchsia-fuchsia-700: #9F1AB1;
--color-util-colors-fuchsia-fuchsia-50: #FDF4FF;
--color-util-colors-fuchsia-fuchsia-100: #FBE8FF;
--color-util-colors-fuchsia-fuchsia-200: #F6D0FE;
--color-util-colors-fuchsia-fuchsia-300: #EEAAFD;
--color-util-colors-fuchsia-fuchsia-400: #E478FA;
--color-util-colors-fuchsia-fuchsia-500: #D444F1;
--color-util-colors-fuchsia-fuchsia-600: #BA24D5;
--color-util-colors-fuchsia-fuchsia-700: #9F1AB1;
--color-_util-colors-purple-purple-50: #F4F3FF;
--color-_util-colors-purple-purple-100: #EBE9FE;
--color-_util-colors-purple-purple-200: #D9D6FE;
--color-_util-colors-purple-purple-300: #BDB4FE;
--color-_util-colors-purple-purple-400: #9B8AFB;
--color-_util-colors-purple-purple-500: #7A5AF8;
--color-_util-colors-purple-purple-600: #6938EF;
--color-_util-colors-purple-purple-700: #5925DC;
--color-util-colors-purple-purple-50: #F4F3FF;
--color-util-colors-purple-purple-100: #EBE9FE;
--color-util-colors-purple-purple-200: #D9D6FE;
--color-util-colors-purple-purple-300: #BDB4FE;
--color-util-colors-purple-purple-400: #9B8AFB;
--color-util-colors-purple-purple-500: #7A5AF8;
--color-util-colors-purple-purple-600: #6938EF;
--color-util-colors-purple-purple-700: #5925DC;
--color-_util-colors-indigo-indigo-50: #EEF4FF;
--color-_util-colors-indigo-indigo-100: #E0EAFF;
--color-_util-colors-indigo-indigo-200: #C7D7FE;
--color-_util-colors-indigo-indigo-300: #A4BCFD;
--color-_util-colors-indigo-indigo-400: #8098F9;
--color-_util-colors-indigo-indigo-500: #6172F3;
--color-_util-colors-indigo-indigo-600: #444CE7;
--color-_util-colors-indigo-indigo-700: #3538CD;
--color-util-colors-indigo-indigo-50: #EEF4FF;
--color-util-colors-indigo-indigo-100: #E0EAFF;
--color-util-colors-indigo-indigo-200: #C7D7FE;
--color-util-colors-indigo-indigo-300: #A4BCFD;
--color-util-colors-indigo-indigo-400: #8098F9;
--color-util-colors-indigo-indigo-500: #6172F3;
--color-util-colors-indigo-indigo-600: #444CE7;
--color-util-colors-indigo-indigo-700: #3538CD;
--color-_util-colors-blue-blue-50: #EFF8FF;
--color-_util-colors-blue-blue-100: #D1E9FF;
--color-_util-colors-blue-blue-200: #B2DDFF;
--color-_util-colors-blue-blue-300: #84CAFF;
--color-_util-colors-blue-blue-400: #53B1FD;
--color-_util-colors-blue-blue-500: #2E90FA;
--color-_util-colors-blue-blue-600: #1570EF;
--color-_util-colors-blue-blue-700: #175CD3;
--color-util-colors-blue-blue-50: #EFF8FF;
--color-util-colors-blue-blue-100: #D1E9FF;
--color-util-colors-blue-blue-200: #B2DDFF;
--color-util-colors-blue-blue-300: #84CAFF;
--color-util-colors-blue-blue-400: #53B1FD;
--color-util-colors-blue-blue-500: #2E90FA;
--color-util-colors-blue-blue-600: #1570EF;
--color-util-colors-blue-blue-700: #175CD3;
--color-_util-colors-blue-light-blue-light-50: #F0F9FF;
--color-_util-colors-blue-light-blue-light-100: #E0F2FE;
--color-_util-colors-blue-light-blue-light-200: #B9E6FE;
--color-_util-colors-blue-light-blue-light-300: #7CD4FD;
--color-_util-colors-blue-light-blue-light-400: #36BFFA;
--color-_util-colors-blue-light-blue-light-500: #0BA5EC;
--color-_util-colors-blue-light-blue-light-600: #0086C9;
--color-_util-colors-blue-light-blue-light-700: #026AA2;
--color-util-colors-blue-light-blue-light-50: #F0F9FF;
--color-util-colors-blue-light-blue-light-100: #E0F2FE;
--color-util-colors-blue-light-blue-light-200: #B9E6FE;
--color-util-colors-blue-light-blue-light-300: #7CD4FD;
--color-util-colors-blue-light-blue-light-400: #36BFFA;
--color-util-colors-blue-light-blue-light-500: #0BA5EC;
--color-util-colors-blue-light-blue-light-600: #0086C9;
--color-util-colors-blue-light-blue-light-700: #026AA2;
--color-_util-colors-gray-blue-gray-blue-50: #F8F9FC;
--color-_util-colors-gray-blue-gray-blue-100: #EAECF5;
--color-_util-colors-gray-blue-gray-blue-200: #D5D9EB;
--color-_util-colors-gray-blue-gray-blue-300: #B3B8DB;
--color-_util-colors-gray-blue-gray-blue-400: #717BBC;
--color-_util-colors-gray-blue-gray-blue-500: #4E5BA6;
--color-_util-colors-gray-blue-gray-blue-600: #3E4784;
--color-_util-colors-gray-blue-gray-blue-700: #363F72;
--color-util-colors-gray-blue-gray-blue-50: #F8F9FC;
--color-util-colors-gray-blue-gray-blue-100: #EAECF5;
--color-util-colors-gray-blue-gray-blue-200: #D5D9EB;
--color-util-colors-gray-blue-gray-blue-300: #B3B8DB;
--color-util-colors-gray-blue-gray-blue-400: #717BBC;
--color-util-colors-gray-blue-gray-blue-500: #4E5BA6;
--color-util-colors-gray-blue-gray-blue-600: #3E4784;
--color-util-colors-gray-blue-gray-blue-700: #363F72;
--color-_util-colors-blue-brand-blue-brand-50: #F5F7FF;
--color-_util-colors-blue-brand-blue-brand-100: #D1E0FF;
--color-_util-colors-blue-brand-blue-brand-200: #B2CAFF;
--color-_util-colors-blue-brand-blue-brand-300: #84ABFF;
--color-_util-colors-blue-brand-blue-brand-400: #5289FF;
--color-_util-colors-blue-brand-blue-brand-500: #296DFF;
--color-_util-colors-blue-brand-blue-brand-600: #155AEF;
--color-_util-colors-blue-brand-blue-brand-700: #004AEB;
--color-util-colors-blue-brand-blue-brand-50: #F5F7FF;
--color-util-colors-blue-brand-blue-brand-100: #D1E0FF;
--color-util-colors-blue-brand-blue-brand-200: #B2CAFF;
--color-util-colors-blue-brand-blue-brand-300: #84ABFF;
--color-util-colors-blue-brand-blue-brand-400: #5289FF;
--color-util-colors-blue-brand-blue-brand-500: #296DFF;
--color-util-colors-blue-brand-blue-brand-600: #155AEF;
--color-util-colors-blue-brand-blue-brand-700: #004AEB;
--color-_util-colors-red-red-50: #FEF3F2;
--color-_util-colors-red-red-100: #FEE4E2;
--color-_util-colors-red-red-200: #FECDCA;
--color-_util-colors-red-red-300: #FDA29B;
--color-_util-colors-red-red-400: #F97066;
--color-_util-colors-red-red-500: #F04438;
--color-_util-colors-red-red-600: #D92D20;
--color-_util-colors-red-red-700: #B42318;
--color-util-colors-red-red-50: #FEF3F2;
--color-util-colors-red-red-100: #FEE4E2;
--color-util-colors-red-red-200: #FECDCA;
--color-util-colors-red-red-300: #FDA29B;
--color-util-colors-red-red-400: #F97066;
--color-util-colors-red-red-500: #F04438;
--color-util-colors-red-red-600: #D92D20;
--color-util-colors-red-red-700: #B42318;
--color-_util-colors-green-green-50: #ECFDF3;
--color-_util-colors-green-green-100: #DCFAE6;
--color-_util-colors-green-green-200: #ABEFC6;
--color-_util-colors-green-green-300: #75E0A7;
--color-_util-colors-green-green-400: #47CD89;
--color-_util-colors-green-green-500: #17B26A;
--color-_util-colors-green-green-600: #079455;
--color-_util-colors-green-green-700: #067647;
--color-util-colors-green-green-50: #ECFDF3;
--color-util-colors-green-green-100: #DCFAE6;
--color-util-colors-green-green-200: #ABEFC6;
--color-util-colors-green-green-300: #75E0A7;
--color-util-colors-green-green-400: #47CD89;
--color-util-colors-green-green-500: #17B26A;
--color-util-colors-green-green-600: #079455;
--color-util-colors-green-green-700: #067647;
--color-_util-colors-warning-warning-50: #FFFAEB;
--color-_util-colors-warning-warning-100: #FEF0C7;
--color-_util-colors-warning-warning-200: #FEDF89;
--color-_util-colors-warning-warning-300: #FEC84B;
--color-_util-colors-warning-warning-400: #FDB022;
--color-_util-colors-warning-warning-500: #F79009;
--color-_util-colors-warning-warning-600: #DC6803;
--color-_util-colors-warning-warning-700: #B54708;
--color-util-colors-warning-warning-50: #FFFAEB;
--color-util-colors-warning-warning-100: #FEF0C7;
--color-util-colors-warning-warning-200: #FEDF89;
--color-util-colors-warning-warning-300: #FEC84B;
--color-util-colors-warning-warning-400: #FDB022;
--color-util-colors-warning-warning-500: #F79009;
--color-util-colors-warning-warning-600: #DC6803;
--color-util-colors-warning-warning-700: #B54708;
--color-_util-colors-yellow-yellow-50: #FEFBE8;
--color-_util-colors-yellow-yellow-100: #FEF7C3;
--color-_util-colors-yellow-yellow-200: #FEEE95;
--color-_util-colors-yellow-yellow-300: #FDE272;
--color-_util-colors-yellow-yellow-400: #FAC515;
--color-_util-colors-yellow-yellow-500: #EAAA08;
--color-_util-colors-yellow-yellow-600: #CA8504;
--color-_util-colors-yellow-yellow-700: #A15C07;
--color-util-colors-yellow-yellow-50: #FEFBE8;
--color-util-colors-yellow-yellow-100: #FEF7C3;
--color-util-colors-yellow-yellow-200: #FEEE95;
--color-util-colors-yellow-yellow-300: #FDE272;
--color-util-colors-yellow-yellow-400: #FAC515;
--color-util-colors-yellow-yellow-500: #EAAA08;
--color-util-colors-yellow-yellow-600: #CA8504;
--color-util-colors-yellow-yellow-700: #A15C07;
--color-_util-colors-teal-teal-50: #F0FDF9;
--color-_util-colors-teal-teal-100: #CCFBEF;
--color-_util-colors-teal-teal-200: #99F6E0;
--color-_util-colors-teal-teal-300: #5FE9D0;
--color-_util-colors-teal-teal-400: #2ED3B7;
--color-_util-colors-teal-teal-500: #15B79E;
--color-_util-colors-teal-teal-600: #0E9384;
--color-_util-colors-teal-teal-700: #107569;
--color-util-colors-teal-teal-50: #F0FDF9;
--color-util-colors-teal-teal-100: #CCFBEF;
--color-util-colors-teal-teal-200: #99F6E0;
--color-util-colors-teal-teal-300: #5FE9D0;
--color-util-colors-teal-teal-400: #2ED3B7;
--color-util-colors-teal-teal-500: #15B79E;
--color-util-colors-teal-teal-600: #0E9384;
--color-util-colors-teal-teal-700: #107569;
--color-_util-colors-cyan-cyan-50: #ECFDFF;
--color-_util-colors-cyan-cyan-100: #CFF9FE;
--color-_util-colors-cyan-cyan-200: #A5F0FC;
--color-_util-colors-cyan-cyan-300: #67E3F9;
--color-_util-colors-cyan-cyan-400: #22CCEE;
--color-_util-colors-cyan-cyan-500: #06AED4;
--color-_util-colors-cyan-cyan-600: #088AB2;
--color-_util-colors-cyan-cyan-700: #0E7090;
--color-util-colors-cyan-cyan-50: #ECFDFF;
--color-util-colors-cyan-cyan-100: #CFF9FE;
--color-util-colors-cyan-cyan-200: #A5F0FC;
--color-util-colors-cyan-cyan-300: #67E3F9;
--color-util-colors-cyan-cyan-400: #22CCEE;
--color-util-colors-cyan-cyan-500: #06AED4;
--color-util-colors-cyan-cyan-600: #088AB2;
--color-util-colors-cyan-cyan-700: #0E7090;
--color-_util-colors-violet-violet-50: #F5F3FF;
--color-_util-colors-violet-violet-100: #ECE9FE;
--color-_util-colors-violet-violet-200: #DDD6FE;
--color-_util-colors-violet-violet-300: #C3B5FD;
--color-_util-colors-violet-violet-400: #A48AFB;
--color-_util-colors-violet-violet-500: #875BF7;
--color-_util-colors-violet-violet-600: #7839EE;
--color-_util-colors-violet-violet-700: #6927DA;
--color-util-colors-violet-violet-50: #F5F3FF;
--color-util-colors-violet-violet-100: #ECE9FE;
--color-util-colors-violet-violet-200: #DDD6FE;
--color-util-colors-violet-violet-300: #C3B5FD;
--color-util-colors-violet-violet-400: #A48AFB;
--color-util-colors-violet-violet-500: #875BF7;
--color-util-colors-violet-violet-600: #7839EE;
--color-util-colors-violet-violet-700: #6927DA;
--color-_util-colors-gray-gray-50: #F9FAFB;
--color-_util-colors-gray-gray-100: #F2F4F7;
--color-_util-colors-gray-gray-200: #E9EBF0;
--color-_util-colors-gray-gray-300: #D0D5DC;
--color-_util-colors-gray-gray-400: #98A2B2;
--color-_util-colors-gray-gray-500: #676F83;
--color-_util-colors-gray-gray-600: #495464;
--color-_util-colors-gray-gray-700: #354052;
--color-util-colors-gray-gray-50: #F9FAFB;
--color-util-colors-gray-gray-100: #F2F4F7;
--color-util-colors-gray-gray-200: #E9EBF0;
--color-util-colors-gray-gray-300: #D0D5DC;
--color-util-colors-gray-gray-400: #98A2B2;
--color-util-colors-gray-gray-500: #676F83;
--color-util-colors-gray-gray-600: #495464;
--color-util-colors-gray-gray-700: #354052;
--color-third-party-LangChain: #1C3C3C;
--color-third-party-Langfuse: #000000;
+149 -150
View File
@@ -174,7 +174,7 @@ const vars = {
'components-badge-status-light-success-halo': 'var(--color-components-badge-status-light-success-halo)',
'components-badge-status-light-border-outer': 'var(--color-components-badge-status-light-border-outer)',
'components-badge-status-light-_high-light': 'var(--color-components-badge-status-light-_high-light)',
'components-badge-status-light-high-light': 'var(--color-components-badge-status-light-high-light)',
'components-badge-status-light-warning-bg': 'var(--color-components-badge-status-light-warning-bg)',
'components-badge-status-light-warning-border-inner': 'var(--color-components-badge-status-light-warning-border-inner)',
'components-badge-status-light-warning-halo': 'var(--color-components-badge-status-light-warning-halo)',
@@ -249,7 +249,7 @@ const vars = {
'text-accent-secondary': 'var(--color-text-accent-secondary)',
'text-accent-light-mode-only': 'var(--color-text-accent-light-mode-only)',
'text-text-selected': 'var(--color-text-text-selected)',
'text-_secondary-on-surface': 'var(--color-text-_secondary-on-surface)',
'text-secondary-on-surface': 'var(--color-text-secondary-on-surface)',
'text-logo-text': 'var(--color-text-logo-text)',
'text-empty-state-icon': 'var(--color-text-empty-state-icon)',
@@ -298,12 +298,11 @@ const vars = {
'shadow-shadow-2': 'var(--color-shadow-shadow-2)',
'shadow-shadow-10': 'var(--color-shadow-shadow-10)',
'workflow-block-_border': 'var(--color-workflow-block-_border)',
'workflow-block-_panel-bg': 'var(--color-workflow-block-_panel-bg)',
'workflow-block-border': 'var(--color-workflow-block-border)',
'workflow-block-panel-bg': 'var(--color-workflow-block-panel-bg)',
'workflow-block-parma-bg': 'var(--color-workflow-block-parma-bg)',
'workflow-block-_nav-bg': 'var(--color-workflow-block-_nav-bg)',
'workflow-block-_nav-border-right': 'var(--color-workflow-block-_nav-border-right)',
'workflow-block-nav-bg': 'var(--color-workflow-block-nav-bg)',
'workflow-block-nav-border-right': 'var(--color-workflow-block-nav-border-right)',
'workflow-block-bg': 'var(--color-workflow-block-bg)',
'workflow-canvas-workflow-dot-color': 'var(--color-workflow-canvas-workflow-dot-color)',
@@ -395,167 +394,167 @@ const vars = {
'effects-highlight-lightmode-off': 'var(--color-effects-highlight-lightmode-off)',
'effects-image-frame': 'var(--color-effects-image-frame)',
'_util-colors-orange-dark-orange-dark-50': 'var(--color-_util-colors-orange-dark-orange-dark-50)',
'_util-colors-orange-dark-orange-dark-100': 'var(--color-_util-colors-orange-dark-orange-dark-100)',
'_util-colors-orange-dark-orange-dark-200': 'var(--color-_util-colors-orange-dark-orange-dark-200)',
'_util-colors-orange-dark-orange-dark-300': 'var(--color-_util-colors-orange-dark-orange-dark-300)',
'_util-colors-orange-dark-orange-dark-400': 'var(--color-_util-colors-orange-dark-orange-dark-400)',
'_util-colors-orange-dark-orange-dark-500': 'var(--color-_util-colors-orange-dark-orange-dark-500)',
'_util-colors-orange-dark-orange-dark-600': 'var(--color-_util-colors-orange-dark-orange-dark-600)',
'_util-colors-orange-dark-orange-dark-700': 'var(--color-_util-colors-orange-dark-orange-dark-700)',
'util-colors-orange-dark-orange-dark-50': 'var(--color-util-colors-orange-dark-orange-dark-50)',
'util-colors-orange-dark-orange-dark-100': 'var(--color-util-colors-orange-dark-orange-dark-100)',
'util-colors-orange-dark-orange-dark-200': 'var(--color-util-colors-orange-dark-orange-dark-200)',
'util-colors-orange-dark-orange-dark-300': 'var(--color-util-colors-orange-dark-orange-dark-300)',
'util-colors-orange-dark-orange-dark-400': 'var(--color-util-colors-orange-dark-orange-dark-400)',
'util-colors-orange-dark-orange-dark-500': 'var(--color-util-colors-orange-dark-orange-dark-500)',
'util-colors-orange-dark-orange-dark-600': 'var(--color-util-colors-orange-dark-orange-dark-600)',
'util-colors-orange-dark-orange-dark-700': 'var(--color-util-colors-orange-dark-orange-dark-700)',
'_util-colors-orange-orange-50': 'var(--color-_util-colors-orange-orange-50)',
'_util-colors-orange-orange-100': 'var(--color-_util-colors-orange-orange-100)',
'_util-colors-orange-orange-200': 'var(--color-_util-colors-orange-orange-200)',
'_util-colors-orange-orange-300': 'var(--color-_util-colors-orange-orange-300)',
'_util-colors-orange-orange-400': 'var(--color-_util-colors-orange-orange-400)',
'_util-colors-orange-orange-500': 'var(--color-_util-colors-orange-orange-500)',
'_util-colors-orange-orange-600': 'var(--color-_util-colors-orange-orange-600)',
'_util-colors-orange-orange-700': 'var(--color-_util-colors-orange-orange-700)',
'util-colors-orange-orange-50': 'var(--color-util-colors-orange-orange-50)',
'util-colors-orange-orange-100': 'var(--color-util-colors-orange-orange-100)',
'util-colors-orange-orange-200': 'var(--color-util-colors-orange-orange-200)',
'util-colors-orange-orange-300': 'var(--color-util-colors-orange-orange-300)',
'util-colors-orange-orange-400': 'var(--color-util-colors-orange-orange-400)',
'util-colors-orange-orange-500': 'var(--color-util-colors-orange-orange-500)',
'util-colors-orange-orange-600': 'var(--color-util-colors-orange-orange-600)',
'util-colors-orange-orange-700': 'var(--color-util-colors-orange-orange-700)',
'_util-colors-pink-pink-50': 'var(--color-_util-colors-pink-pink-50)',
'_util-colors-pink-pink-100': 'var(--color-_util-colors-pink-pink-100)',
'_util-colors-pink-pink-200': 'var(--color-_util-colors-pink-pink-200)',
'_util-colors-pink-pink-300': 'var(--color-_util-colors-pink-pink-300)',
'_util-colors-pink-pink-400': 'var(--color-_util-colors-pink-pink-400)',
'_util-colors-pink-pink-500': 'var(--color-_util-colors-pink-pink-500)',
'_util-colors-pink-pink-600': 'var(--color-_util-colors-pink-pink-600)',
'_util-colors-pink-pink-700': 'var(--color-_util-colors-pink-pink-700)',
'util-colors-pink-pink-50': 'var(--color-util-colors-pink-pink-50)',
'util-colors-pink-pink-100': 'var(--color-util-colors-pink-pink-100)',
'util-colors-pink-pink-200': 'var(--color-util-colors-pink-pink-200)',
'util-colors-pink-pink-300': 'var(--color-util-colors-pink-pink-300)',
'util-colors-pink-pink-400': 'var(--color-util-colors-pink-pink-400)',
'util-colors-pink-pink-500': 'var(--color-util-colors-pink-pink-500)',
'util-colors-pink-pink-600': 'var(--color-util-colors-pink-pink-600)',
'util-colors-pink-pink-700': 'var(--color-util-colors-pink-pink-700)',
'_util-colors-fuchsia-fuchsia-50': 'var(--color-_util-colors-fuchsia-fuchsia-50)',
'_util-colors-fuchsia-fuchsia-100': 'var(--color-_util-colors-fuchsia-fuchsia-100)',
'_util-colors-fuchsia-fuchsia-200': 'var(--color-_util-colors-fuchsia-fuchsia-200)',
'_util-colors-fuchsia-fuchsia-300': 'var(--color-_util-colors-fuchsia-fuchsia-300)',
'_util-colors-fuchsia-fuchsia-400': 'var(--color-_util-colors-fuchsia-fuchsia-400)',
'_util-colors-fuchsia-fuchsia-500': 'var(--color-_util-colors-fuchsia-fuchsia-500)',
'_util-colors-fuchsia-fuchsia-600': 'var(--color-_util-colors-fuchsia-fuchsia-600)',
'_util-colors-fuchsia-fuchsia-700': 'var(--color-_util-colors-fuchsia-fuchsia-700)',
'util-colors-fuchsia-fuchsia-50': 'var(--color-util-colors-fuchsia-fuchsia-50)',
'util-colors-fuchsia-fuchsia-100': 'var(--color-util-colors-fuchsia-fuchsia-100)',
'util-colors-fuchsia-fuchsia-200': 'var(--color-util-colors-fuchsia-fuchsia-200)',
'util-colors-fuchsia-fuchsia-300': 'var(--color-util-colors-fuchsia-fuchsia-300)',
'util-colors-fuchsia-fuchsia-400': 'var(--color-util-colors-fuchsia-fuchsia-400)',
'util-colors-fuchsia-fuchsia-500': 'var(--color-util-colors-fuchsia-fuchsia-500)',
'util-colors-fuchsia-fuchsia-600': 'var(--color-util-colors-fuchsia-fuchsia-600)',
'util-colors-fuchsia-fuchsia-700': 'var(--color-util-colors-fuchsia-fuchsia-700)',
'_util-colors-purple-purple-50': 'var(--color-_util-colors-purple-purple-50)',
'_util-colors-purple-purple-100': 'var(--color-_util-colors-purple-purple-100)',
'_util-colors-purple-purple-200': 'var(--color-_util-colors-purple-purple-200)',
'_util-colors-purple-purple-300': 'var(--color-_util-colors-purple-purple-300)',
'_util-colors-purple-purple-400': 'var(--color-_util-colors-purple-purple-400)',
'_util-colors-purple-purple-500': 'var(--color-_util-colors-purple-purple-500)',
'_util-colors-purple-purple-600': 'var(--color-_util-colors-purple-purple-600)',
'_util-colors-purple-purple-700': 'var(--color-_util-colors-purple-purple-700)',
'util-colors-purple-purple-50': 'var(--color-util-colors-purple-purple-50)',
'util-colors-purple-purple-100': 'var(--color-util-colors-purple-purple-100)',
'util-colors-purple-purple-200': 'var(--color-util-colors-purple-purple-200)',
'util-colors-purple-purple-300': 'var(--color-util-colors-purple-purple-300)',
'util-colors-purple-purple-400': 'var(--color-util-colors-purple-purple-400)',
'util-colors-purple-purple-500': 'var(--color-util-colors-purple-purple-500)',
'util-colors-purple-purple-600': 'var(--color-util-colors-purple-purple-600)',
'util-colors-purple-purple-700': 'var(--color-util-colors-purple-purple-700)',
'_util-colors-indigo-indigo-50': 'var(--color-_util-colors-indigo-indigo-50)',
'_util-colors-indigo-indigo-100': 'var(--color-_util-colors-indigo-indigo-100)',
'_util-colors-indigo-indigo-200': 'var(--color-_util-colors-indigo-indigo-200)',
'_util-colors-indigo-indigo-300': 'var(--color-_util-colors-indigo-indigo-300)',
'_util-colors-indigo-indigo-400': 'var(--color-_util-colors-indigo-indigo-400)',
'_util-colors-indigo-indigo-500': 'var(--color-_util-colors-indigo-indigo-500)',
'_util-colors-indigo-indigo-600': 'var(--color-_util-colors-indigo-indigo-600)',
'_util-colors-indigo-indigo-700': 'var(--color-_util-colors-indigo-indigo-700)',
'util-colors-indigo-indigo-50': 'var(--color-util-colors-indigo-indigo-50)',
'util-colors-indigo-indigo-100': 'var(--color-util-colors-indigo-indigo-100)',
'util-colors-indigo-indigo-200': 'var(--color-util-colors-indigo-indigo-200)',
'util-colors-indigo-indigo-300': 'var(--color-util-colors-indigo-indigo-300)',
'util-colors-indigo-indigo-400': 'var(--color-util-colors-indigo-indigo-400)',
'util-colors-indigo-indigo-500': 'var(--color-util-colors-indigo-indigo-500)',
'util-colors-indigo-indigo-600': 'var(--color-util-colors-indigo-indigo-600)',
'util-colors-indigo-indigo-700': 'var(--color-util-colors-indigo-indigo-700)',
'_util-colors-blue-blue-50': 'var(--color-_util-colors-blue-blue-50)',
'_util-colors-blue-blue-100': 'var(--color-_util-colors-blue-blue-100)',
'_util-colors-blue-blue-200': 'var(--color-_util-colors-blue-blue-200)',
'_util-colors-blue-blue-300': 'var(--color-_util-colors-blue-blue-300)',
'_util-colors-blue-blue-400': 'var(--color-_util-colors-blue-blue-400)',
'_util-colors-blue-blue-500': 'var(--color-_util-colors-blue-blue-500)',
'_util-colors-blue-blue-600': 'var(--color-_util-colors-blue-blue-600)',
'_util-colors-blue-blue-700': 'var(--color-_util-colors-blue-blue-700)',
'util-colors-blue-blue-50': 'var(--color-util-colors-blue-blue-50)',
'util-colors-blue-blue-100': 'var(--color-util-colors-blue-blue-100)',
'util-colors-blue-blue-200': 'var(--color-util-colors-blue-blue-200)',
'util-colors-blue-blue-300': 'var(--color-util-colors-blue-blue-300)',
'util-colors-blue-blue-400': 'var(--color-util-colors-blue-blue-400)',
'util-colors-blue-blue-500': 'var(--color-util-colors-blue-blue-500)',
'util-colors-blue-blue-600': 'var(--color-util-colors-blue-blue-600)',
'util-colors-blue-blue-700': 'var(--color-util-colors-blue-blue-700)',
'_util-colors-blue-light-blue-light-50': 'var(--color-_util-colors-blue-light-blue-light-50)',
'_util-colors-blue-light-blue-light-100': 'var(--color-_util-colors-blue-light-blue-light-100)',
'_util-colors-blue-light-blue-light-200': 'var(--color-_util-colors-blue-light-blue-light-200)',
'_util-colors-blue-light-blue-light-300': 'var(--color-_util-colors-blue-light-blue-light-300)',
'_util-colors-blue-light-blue-light-400': 'var(--color-_util-colors-blue-light-blue-light-400)',
'_util-colors-blue-light-blue-light-500': 'var(--color-_util-colors-blue-light-blue-light-500)',
'_util-colors-blue-light-blue-light-600': 'var(--color-_util-colors-blue-light-blue-light-600)',
'_util-colors-blue-light-blue-light-700': 'var(--color-_util-colors-blue-light-blue-light-700)',
'util-colors-blue-light-blue-light-50': 'var(--color-util-colors-blue-light-blue-light-50)',
'util-colors-blue-light-blue-light-100': 'var(--color-util-colors-blue-light-blue-light-100)',
'util-colors-blue-light-blue-light-200': 'var(--color-util-colors-blue-light-blue-light-200)',
'util-colors-blue-light-blue-light-300': 'var(--color-util-colors-blue-light-blue-light-300)',
'util-colors-blue-light-blue-light-400': 'var(--color-util-colors-blue-light-blue-light-400)',
'util-colors-blue-light-blue-light-500': 'var(--color-util-colors-blue-light-blue-light-500)',
'util-colors-blue-light-blue-light-600': 'var(--color-util-colors-blue-light-blue-light-600)',
'util-colors-blue-light-blue-light-700': 'var(--color-util-colors-blue-light-blue-light-700)',
'_util-colors-gray-blue-gray-blue-50': 'var(--color-_util-colors-gray-blue-gray-blue-50)',
'_util-colors-gray-blue-gray-blue-100': 'var(--color-_util-colors-gray-blue-gray-blue-100)',
'_util-colors-gray-blue-gray-blue-200': 'var(--color-_util-colors-gray-blue-gray-blue-200)',
'_util-colors-gray-blue-gray-blue-300': 'var(--color-_util-colors-gray-blue-gray-blue-300)',
'_util-colors-gray-blue-gray-blue-400': 'var(--color-_util-colors-gray-blue-gray-blue-400)',
'_util-colors-gray-blue-gray-blue-500': 'var(--color-_util-colors-gray-blue-gray-blue-500)',
'_util-colors-gray-blue-gray-blue-600': 'var(--color-_util-colors-gray-blue-gray-blue-600)',
'_util-colors-gray-blue-gray-blue-700': 'var(--color-_util-colors-gray-blue-gray-blue-700)',
'util-colors-gray-blue-gray-blue-50': 'var(--color-util-colors-gray-blue-gray-blue-50)',
'util-colors-gray-blue-gray-blue-100': 'var(--color-util-colors-gray-blue-gray-blue-100)',
'util-colors-gray-blue-gray-blue-200': 'var(--color-util-colors-gray-blue-gray-blue-200)',
'util-colors-gray-blue-gray-blue-300': 'var(--color-util-colors-gray-blue-gray-blue-300)',
'util-colors-gray-blue-gray-blue-400': 'var(--color-util-colors-gray-blue-gray-blue-400)',
'util-colors-gray-blue-gray-blue-500': 'var(--color-util-colors-gray-blue-gray-blue-500)',
'util-colors-gray-blue-gray-blue-600': 'var(--color-util-colors-gray-blue-gray-blue-600)',
'util-colors-gray-blue-gray-blue-700': 'var(--color-util-colors-gray-blue-gray-blue-700)',
'_util-colors-blue-brand-blue-brand-50': 'var(--color-_util-colors-blue-brand-blue-brand-50)',
'_util-colors-blue-brand-blue-brand-100': 'var(--color-_util-colors-blue-brand-blue-brand-100)',
'_util-colors-blue-brand-blue-brand-200': 'var(--color-_util-colors-blue-brand-blue-brand-200)',
'_util-colors-blue-brand-blue-brand-300': 'var(--color-_util-colors-blue-brand-blue-brand-300)',
'_util-colors-blue-brand-blue-brand-400': 'var(--color-_util-colors-blue-brand-blue-brand-400)',
'_util-colors-blue-brand-blue-brand-500': 'var(--color-_util-colors-blue-brand-blue-brand-500)',
'_util-colors-blue-brand-blue-brand-600': 'var(--color-_util-colors-blue-brand-blue-brand-600)',
'_util-colors-blue-brand-blue-brand-700': 'var(--color-_util-colors-blue-brand-blue-brand-700)',
'util-colors-blue-brand-blue-brand-50': 'var(--color-util-colors-blue-brand-blue-brand-50)',
'util-colors-blue-brand-blue-brand-100': 'var(--color-util-colors-blue-brand-blue-brand-100)',
'util-colors-blue-brand-blue-brand-200': 'var(--color-util-colors-blue-brand-blue-brand-200)',
'util-colors-blue-brand-blue-brand-300': 'var(--color-util-colors-blue-brand-blue-brand-300)',
'util-colors-blue-brand-blue-brand-400': 'var(--color-util-colors-blue-brand-blue-brand-400)',
'util-colors-blue-brand-blue-brand-500': 'var(--color-util-colors-blue-brand-blue-brand-500)',
'util-colors-blue-brand-blue-brand-600': 'var(--color-util-colors-blue-brand-blue-brand-600)',
'util-colors-blue-brand-blue-brand-700': 'var(--color-util-colors-blue-brand-blue-brand-700)',
'_util-colors-red-red-50': 'var(--color-_util-colors-red-red-50)',
'_util-colors-red-red-100': 'var(--color-_util-colors-red-red-100)',
'_util-colors-red-red-200': 'var(--color-_util-colors-red-red-200)',
'_util-colors-red-red-300': 'var(--color-_util-colors-red-red-300)',
'_util-colors-red-red-400': 'var(--color-_util-colors-red-red-400)',
'_util-colors-red-red-500': 'var(--color-_util-colors-red-red-500)',
'_util-colors-red-red-600': 'var(--color-_util-colors-red-red-600)',
'_util-colors-red-red-700': 'var(--color-_util-colors-red-red-700)',
'util-colors-red-red-50': 'var(--color-util-colors-red-red-50)',
'util-colors-red-red-100': 'var(--color-util-colors-red-red-100)',
'util-colors-red-red-200': 'var(--color-util-colors-red-red-200)',
'util-colors-red-red-300': 'var(--color-util-colors-red-red-300)',
'util-colors-red-red-400': 'var(--color-util-colors-red-red-400)',
'util-colors-red-red-500': 'var(--color-util-colors-red-red-500)',
'util-colors-red-red-600': 'var(--color-util-colors-red-red-600)',
'util-colors-red-red-700': 'var(--color-util-colors-red-red-700)',
'_util-colors-green-green-50': 'var(--color-_util-colors-green-green-50)',
'_util-colors-green-green-100': 'var(--color-_util-colors-green-green-100)',
'_util-colors-green-green-200': 'var(--color-_util-colors-green-green-200)',
'_util-colors-green-green-300': 'var(--color-_util-colors-green-green-300)',
'_util-colors-green-green-400': 'var(--color-_util-colors-green-green-400)',
'_util-colors-green-green-500': 'var(--color-_util-colors-green-green-500)',
'_util-colors-green-green-600': 'var(--color-_util-colors-green-green-600)',
'_util-colors-green-green-700': 'var(--color-_util-colors-green-green-700)',
'util-colors-green-green-50': 'var(--color-util-colors-green-green-50)',
'util-colors-green-green-100': 'var(--color-util-colors-green-green-100)',
'util-colors-green-green-200': 'var(--color-util-colors-green-green-200)',
'util-colors-green-green-300': 'var(--color-util-colors-green-green-300)',
'util-colors-green-green-400': 'var(--color-util-colors-green-green-400)',
'util-colors-green-green-500': 'var(--color-util-colors-green-green-500)',
'util-colors-green-green-600': 'var(--color-util-colors-green-green-600)',
'util-colors-green-green-700': 'var(--color-util-colors-green-green-700)',
'_util-colors-warning-warning-50': 'var(--color-_util-colors-warning-warning-50)',
'_util-colors-warning-warning-100': 'var(--color-_util-colors-warning-warning-100)',
'_util-colors-warning-warning-200': 'var(--color-_util-colors-warning-warning-200)',
'_util-colors-warning-warning-300': 'var(--color-_util-colors-warning-warning-300)',
'_util-colors-warning-warning-400': 'var(--color-_util-colors-warning-warning-400)',
'_util-colors-warning-warning-500': 'var(--color-_util-colors-warning-warning-500)',
'_util-colors-warning-warning-600': 'var(--color-_util-colors-warning-warning-600)',
'_util-colors-warning-warning-700': 'var(--color-_util-colors-warning-warning-700)',
'util-colors-warning-warning-50': 'var(--color-util-colors-warning-warning-50)',
'util-colors-warning-warning-100': 'var(--color-util-colors-warning-warning-100)',
'util-colors-warning-warning-200': 'var(--color-util-colors-warning-warning-200)',
'util-colors-warning-warning-300': 'var(--color-util-colors-warning-warning-300)',
'util-colors-warning-warning-400': 'var(--color-util-colors-warning-warning-400)',
'util-colors-warning-warning-500': 'var(--color-util-colors-warning-warning-500)',
'util-colors-warning-warning-600': 'var(--color-util-colors-warning-warning-600)',
'util-colors-warning-warning-700': 'var(--color-util-colors-warning-warning-700)',
'_util-colors-yellow-yellow-50': 'var(--color-_util-colors-yellow-yellow-50)',
'_util-colors-yellow-yellow-100': 'var(--color-_util-colors-yellow-yellow-100)',
'_util-colors-yellow-yellow-200': 'var(--color-_util-colors-yellow-yellow-200)',
'_util-colors-yellow-yellow-300': 'var(--color-_util-colors-yellow-yellow-300)',
'_util-colors-yellow-yellow-400': 'var(--color-_util-colors-yellow-yellow-400)',
'_util-colors-yellow-yellow-500': 'var(--color-_util-colors-yellow-yellow-500)',
'_util-colors-yellow-yellow-600': 'var(--color-_util-colors-yellow-yellow-600)',
'_util-colors-yellow-yellow-700': 'var(--color-_util-colors-yellow-yellow-700)',
'util-colors-yellow-yellow-50': 'var(--color-util-colors-yellow-yellow-50)',
'util-colors-yellow-yellow-100': 'var(--color-util-colors-yellow-yellow-100)',
'util-colors-yellow-yellow-200': 'var(--color-util-colors-yellow-yellow-200)',
'util-colors-yellow-yellow-300': 'var(--color-util-colors-yellow-yellow-300)',
'util-colors-yellow-yellow-400': 'var(--color-util-colors-yellow-yellow-400)',
'util-colors-yellow-yellow-500': 'var(--color-util-colors-yellow-yellow-500)',
'util-colors-yellow-yellow-600': 'var(--color-util-colors-yellow-yellow-600)',
'util-colors-yellow-yellow-700': 'var(--color-util-colors-yellow-yellow-700)',
'_util-colors-teal-teal-50': 'var(--color-_util-colors-teal-teal-50)',
'_util-colors-teal-teal-100': 'var(--color-_util-colors-teal-teal-100)',
'_util-colors-teal-teal-200': 'var(--color-_util-colors-teal-teal-200)',
'_util-colors-teal-teal-300': 'var(--color-_util-colors-teal-teal-300)',
'_util-colors-teal-teal-400': 'var(--color-_util-colors-teal-teal-400)',
'_util-colors-teal-teal-500': 'var(--color-_util-colors-teal-teal-500)',
'_util-colors-teal-teal-600': 'var(--color-_util-colors-teal-teal-600)',
'_util-colors-teal-teal-700': 'var(--color-_util-colors-teal-teal-700)',
'util-colors-teal-teal-50': 'var(--color-util-colors-teal-teal-50)',
'util-colors-teal-teal-100': 'var(--color-util-colors-teal-teal-100)',
'util-colors-teal-teal-200': 'var(--color-util-colors-teal-teal-200)',
'util-colors-teal-teal-300': 'var(--color-util-colors-teal-teal-300)',
'util-colors-teal-teal-400': 'var(--color-util-colors-teal-teal-400)',
'util-colors-teal-teal-500': 'var(--color-util-colors-teal-teal-500)',
'util-colors-teal-teal-600': 'var(--color-util-colors-teal-teal-600)',
'util-colors-teal-teal-700': 'var(--color-util-colors-teal-teal-700)',
'_util-colors-cyan-cyan-50': 'var(--color-_util-colors-cyan-cyan-50)',
'_util-colors-cyan-cyan-100': 'var(--color-_util-colors-cyan-cyan-100)',
'_util-colors-cyan-cyan-200': 'var(--color-_util-colors-cyan-cyan-200)',
'_util-colors-cyan-cyan-300': 'var(--color-_util-colors-cyan-cyan-300)',
'_util-colors-cyan-cyan-400': 'var(--color-_util-colors-cyan-cyan-400)',
'_util-colors-cyan-cyan-500': 'var(--color-_util-colors-cyan-cyan-500)',
'_util-colors-cyan-cyan-600': 'var(--color-_util-colors-cyan-cyan-600)',
'_util-colors-cyan-cyan-700': 'var(--color-_util-colors-cyan-cyan-700)',
'util-colors-cyan-cyan-50': 'var(--color-util-colors-cyan-cyan-50)',
'util-colors-cyan-cyan-100': 'var(--color-util-colors-cyan-cyan-100)',
'util-colors-cyan-cyan-200': 'var(--color-util-colors-cyan-cyan-200)',
'util-colors-cyan-cyan-300': 'var(--color-util-colors-cyan-cyan-300)',
'util-colors-cyan-cyan-400': 'var(--color-util-colors-cyan-cyan-400)',
'util-colors-cyan-cyan-500': 'var(--color-util-colors-cyan-cyan-500)',
'util-colors-cyan-cyan-600': 'var(--color-util-colors-cyan-cyan-600)',
'util-colors-cyan-cyan-700': 'var(--color-util-colors-cyan-cyan-700)',
'_util-colors-violet-violet-50': 'var(--color-_util-colors-violet-violet-50)',
'_util-colors-violet-violet-100': 'var(--color-_util-colors-violet-violet-100)',
'_util-colors-violet-violet-200': 'var(--color-_util-colors-violet-violet-200)',
'_util-colors-violet-violet-300': 'var(--color-_util-colors-violet-violet-300)',
'_util-colors-violet-violet-400': 'var(--color-_util-colors-violet-violet-400)',
'_util-colors-violet-violet-500': 'var(--color-_util-colors-violet-violet-500)',
'_util-colors-violet-violet-600': 'var(--color-_util-colors-violet-violet-600)',
'_util-colors-violet-violet-700': 'var(--color-_util-colors-violet-violet-700)',
'util-colors-violet-violet-50': 'var(--color-util-colors-violet-violet-50)',
'util-colors-violet-violet-100': 'var(--color-util-colors-violet-violet-100)',
'util-colors-violet-violet-200': 'var(--color-util-colors-violet-violet-200)',
'util-colors-violet-violet-300': 'var(--color-util-colors-violet-violet-300)',
'util-colors-violet-violet-400': 'var(--color-util-colors-violet-violet-400)',
'util-colors-violet-violet-500': 'var(--color-util-colors-violet-violet-500)',
'util-colors-violet-violet-600': 'var(--color-util-colors-violet-violet-600)',
'util-colors-violet-violet-700': 'var(--color-util-colors-violet-violet-700)',
'_util-colors-gray-gray-50': 'var(--color-_util-colors-gray-gray-50)',
'_util-colors-gray-gray-100': 'var(--color-_util-colors-gray-gray-100)',
'_util-colors-gray-gray-200': 'var(--color-_util-colors-gray-gray-200)',
'_util-colors-gray-gray-300': 'var(--color-_util-colors-gray-gray-300)',
'_util-colors-gray-gray-400': 'var(--color-_util-colors-gray-gray-400)',
'_util-colors-gray-gray-500': 'var(--color-_util-colors-gray-gray-500)',
'_util-colors-gray-gray-600': 'var(--color-_util-colors-gray-gray-600)',
'_util-colors-gray-gray-700': 'var(--color-_util-colors-gray-gray-700)',
'util-colors-gray-gray-50': 'var(--color-util-colors-gray-gray-50)',
'util-colors-gray-gray-100': 'var(--color-util-colors-gray-gray-100)',
'util-colors-gray-gray-200': 'var(--color-util-colors-gray-gray-200)',
'util-colors-gray-gray-300': 'var(--color-util-colors-gray-gray-300)',
'util-colors-gray-gray-400': 'var(--color-util-colors-gray-gray-400)',
'util-colors-gray-gray-500': 'var(--color-util-colors-gray-gray-500)',
'util-colors-gray-gray-600': 'var(--color-util-colors-gray-gray-600)',
'util-colors-gray-gray-700': 'var(--color-util-colors-gray-gray-700)',
'third-party-LangChain': 'var(--color-third-party-LangChain)',
'third-party-Langfuse': 'var(--color-third-party-Langfuse)',