mirror of
https://github.com/langgenius/dify.git
synced 2026-02-07 00:23:57 +00:00
Compare commits
7 Commits
1.4.1
...
fix/20326-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f233a64eb5 | ||
|
|
2b81b6673f | ||
|
|
4c46f04d77 | ||
|
|
d467c8536b | ||
|
|
abc32edf28 | ||
|
|
047a1b5166 | ||
|
|
a06fa7374d |
@@ -31,11 +31,19 @@ jobs:
|
||||
echo "FILES_CHANGED=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Set up Node.js
|
||||
if: env.FILES_CHANGED == 'true'
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
cache: pnpm
|
||||
cache-dependency-path: ./web/package.json
|
||||
|
||||
- name: Install dependencies
|
||||
if: env.FILES_CHANGED == 'true'
|
||||
|
||||
@@ -452,7 +452,7 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator):
|
||||
for var, val in context.items():
|
||||
var.set(val)
|
||||
|
||||
# Save current user before entering new app context
|
||||
# FIXME(-LAN-): Save current user before entering new app context
|
||||
from flask import g
|
||||
|
||||
saved_user = None
|
||||
|
||||
@@ -232,7 +232,7 @@ class AgentChatAppGenerator(MessageBasedAppGenerator):
|
||||
for var, val in context.items():
|
||||
var.set(val)
|
||||
|
||||
# Save current user before entering new app context
|
||||
# FIXME(-LAN-): Save current user before entering new app context
|
||||
from flask import g
|
||||
|
||||
saved_user = None
|
||||
|
||||
@@ -411,7 +411,7 @@ class WorkflowAppGenerator(BaseAppGenerator):
|
||||
for var, val in context.items():
|
||||
var.set(val)
|
||||
|
||||
# Save current user before entering new app context
|
||||
# FIXME(-LAN-): Save current user before entering new app context
|
||||
from flask import g
|
||||
|
||||
saved_user = None
|
||||
|
||||
@@ -9,7 +9,7 @@ from copy import copy, deepcopy
|
||||
from datetime import UTC, datetime
|
||||
from typing import Any, Optional, cast
|
||||
|
||||
from flask import Flask, current_app
|
||||
from flask import Flask, current_app, has_request_context
|
||||
|
||||
from configs import dify_config
|
||||
from core.app.apps.base_app_queue_manager import GenerateTaskStoppedError
|
||||
@@ -540,8 +540,21 @@ class GraphEngine:
|
||||
for var, val in context.items():
|
||||
var.set(val)
|
||||
|
||||
# FIXME(-LAN-): Save current user before entering new app context
|
||||
from flask import g
|
||||
|
||||
saved_user = None
|
||||
if has_request_context() and hasattr(g, "_login_user"):
|
||||
saved_user = g._login_user
|
||||
|
||||
with flask_app.app_context():
|
||||
try:
|
||||
# Restore user in new app context
|
||||
if saved_user is not None:
|
||||
from flask import g
|
||||
|
||||
g._login_user = saved_user
|
||||
|
||||
q.put(
|
||||
ParallelBranchRunStartedEvent(
|
||||
parallel_id=parallel_id,
|
||||
|
||||
@@ -7,7 +7,7 @@ from datetime import UTC, datetime
|
||||
from queue import Empty, Queue
|
||||
from typing import TYPE_CHECKING, Any, Optional, cast
|
||||
|
||||
from flask import Flask, current_app
|
||||
from flask import Flask, current_app, has_request_context
|
||||
|
||||
from configs import dify_config
|
||||
from core.variables import ArrayVariable, IntegerVariable, NoneVariable
|
||||
@@ -586,7 +586,21 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||
"""
|
||||
for var, val in context.items():
|
||||
var.set(val)
|
||||
|
||||
# FIXME(-LAN-): Save current user before entering new app context
|
||||
from flask import g
|
||||
|
||||
saved_user = None
|
||||
if has_request_context() and hasattr(g, "_login_user"):
|
||||
saved_user = g._login_user
|
||||
|
||||
with flask_app.app_context():
|
||||
# Restore user in new app context
|
||||
if saved_user is not None:
|
||||
from flask import g
|
||||
|
||||
g._login_user = saved_user
|
||||
|
||||
parallel_mode_run_id = uuid.uuid4().hex
|
||||
graph_engine_copy = graph_engine.create_copy()
|
||||
variable_pool_copy = graph_engine_copy.graph_runtime_state.variable_pool
|
||||
|
||||
@@ -12,19 +12,30 @@ from flask_login import user_loaded_from_request, user_logged_in # type: ignore
|
||||
|
||||
from configs import dify_config
|
||||
from dify_app import DifyApp
|
||||
from models import Account, EndUser
|
||||
|
||||
|
||||
@user_logged_in.connect
|
||||
@user_loaded_from_request.connect
|
||||
def on_user_loaded(_sender, user):
|
||||
def on_user_loaded(_sender, user: Union["Account", "EndUser"]):
|
||||
if dify_config.ENABLE_OTEL:
|
||||
from opentelemetry.trace import get_current_span
|
||||
|
||||
if user:
|
||||
current_span = get_current_span()
|
||||
if current_span:
|
||||
current_span.set_attribute("service.tenant.id", user.current_tenant_id)
|
||||
current_span.set_attribute("service.user.id", user.id)
|
||||
try:
|
||||
current_span = get_current_span()
|
||||
if isinstance(user, Account) and user.current_tenant_id:
|
||||
tenant_id = user.current_tenant_id
|
||||
elif isinstance(user, EndUser):
|
||||
tenant_id = user.tenant_id
|
||||
else:
|
||||
return
|
||||
if current_span:
|
||||
current_span.set_attribute("service.tenant.id", tenant_id)
|
||||
current_span.set_attribute("service.user.id", user.id)
|
||||
except Exception:
|
||||
logging.exception("Error setting tenant and user attributes")
|
||||
pass
|
||||
|
||||
|
||||
def init_app(app: DifyApp):
|
||||
@@ -47,21 +58,25 @@ def init_app(app: DifyApp):
|
||||
|
||||
def response_hook(span: Span, status: str, response_headers: list):
|
||||
if span and span.is_recording():
|
||||
if status.startswith("2"):
|
||||
span.set_status(StatusCode.OK)
|
||||
else:
|
||||
span.set_status(StatusCode.ERROR, status)
|
||||
try:
|
||||
if status.startswith("2"):
|
||||
span.set_status(StatusCode.OK)
|
||||
else:
|
||||
span.set_status(StatusCode.ERROR, status)
|
||||
|
||||
status = status.split(" ")[0]
|
||||
status_code = int(status)
|
||||
status_class = f"{status_code // 100}xx"
|
||||
attributes: dict[str, str | int] = {"status_code": status_code, "status_class": status_class}
|
||||
request = flask.request
|
||||
if request and request.url_rule:
|
||||
attributes[SpanAttributes.HTTP_TARGET] = str(request.url_rule.rule)
|
||||
if request and request.method:
|
||||
attributes[SpanAttributes.HTTP_METHOD] = str(request.method)
|
||||
_http_response_counter.add(1, attributes)
|
||||
status = status.split(" ")[0]
|
||||
status_code = int(status)
|
||||
status_class = f"{status_code // 100}xx"
|
||||
attributes: dict[str, str | int] = {"status_code": status_code, "status_class": status_class}
|
||||
request = flask.request
|
||||
if request and request.url_rule:
|
||||
attributes[SpanAttributes.HTTP_TARGET] = str(request.url_rule.rule)
|
||||
if request and request.method:
|
||||
attributes[SpanAttributes.HTTP_METHOD] = str(request.method)
|
||||
_http_response_counter.add(1, attributes)
|
||||
except Exception:
|
||||
logging.exception("Error setting status and attributes")
|
||||
pass
|
||||
|
||||
instrumentor = FlaskInstrumentor()
|
||||
if dify_config.DEBUG:
|
||||
@@ -92,7 +107,7 @@ def init_app(app: DifyApp):
|
||||
class ExceptionLoggingHandler(logging.Handler):
|
||||
"""Custom logging handler that creates spans for logging.exception() calls"""
|
||||
|
||||
def emit(self, record):
|
||||
def emit(self, record: logging.LogRecord):
|
||||
try:
|
||||
if record.exc_info:
|
||||
tracer = get_tracer_provider().get_tracer("dify.exception.logging")
|
||||
@@ -107,9 +122,12 @@ def init_app(app: DifyApp):
|
||||
},
|
||||
) as span:
|
||||
span.set_status(StatusCode.ERROR)
|
||||
span.record_exception(record.exc_info[1])
|
||||
span.set_attribute("exception.type", record.exc_info[0].__name__)
|
||||
span.set_attribute("exception.message", str(record.exc_info[1]))
|
||||
if record.exc_info[1]:
|
||||
span.record_exception(record.exc_info[1])
|
||||
span.set_attribute("exception.message", str(record.exc_info[1]))
|
||||
if record.exc_info[0]:
|
||||
span.set_attribute("exception.type", record.exc_info[0].__name__)
|
||||
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 60 KiB |
@@ -78,7 +78,7 @@ const ActionList = ({
|
||||
className='w-full'
|
||||
onClick={() => setShowSettingAuth(true)}
|
||||
disabled={!isCurrentWorkspaceManager}
|
||||
>{t('tools.auth.unauthorized')}</Button>
|
||||
>{t('workflow.nodes.tool.authorize')}</Button>
|
||||
)}
|
||||
</div>
|
||||
<div className='flex flex-col gap-2'>
|
||||
|
||||
@@ -141,7 +141,7 @@ const MultipleToolSelector = ({
|
||||
}
|
||||
panelShowState={panelShowState}
|
||||
onPanelShowStateChange={setPanelShowState}
|
||||
|
||||
isEdit={false}
|
||||
/>
|
||||
{value.length === 0 && (
|
||||
<div className='system-xs-regular flex justify-center rounded-[10px] bg-background-section p-3 text-text-tertiary'>{t('plugin.detailPanel.toolSelector.empty')}</div>
|
||||
@@ -158,6 +158,7 @@ const MultipleToolSelector = ({
|
||||
onSelect={item => handleConfigure(item, index)}
|
||||
onDelete={() => handleDelete(index)}
|
||||
supportEnableSwitch
|
||||
isEdit
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
|
||||
@@ -54,6 +54,7 @@ type Props = {
|
||||
scope?: string
|
||||
value?: ToolValue
|
||||
selectedTools?: ToolValue[]
|
||||
isEdit?: boolean
|
||||
onSelect: (tool: {
|
||||
provider_name: string
|
||||
tool_name: string
|
||||
@@ -77,6 +78,7 @@ type Props = {
|
||||
const ToolSelector: FC<Props> = ({
|
||||
value,
|
||||
selectedTools,
|
||||
isEdit,
|
||||
disabled,
|
||||
placement = 'left',
|
||||
offset = 4,
|
||||
@@ -277,7 +279,7 @@ const ToolSelector: FC<Props> = ({
|
||||
<div className={cn('relative max-h-[642px] min-h-20 w-[361px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur pb-4 shadow-lg backdrop-blur-sm', !isShowSettingAuth && 'overflow-y-auto pb-2')}>
|
||||
{!isShowSettingAuth && (
|
||||
<>
|
||||
<div className='system-xl-semibold px-4 pb-1 pt-3.5 text-text-primary'>{t('plugin.detailPanel.toolSelector.title')}</div>
|
||||
<div className='system-xl-semibold px-4 pb-1 pt-3.5 text-text-primary'>{t(`plugin.detailPanel.toolSelector.${isEdit ? 'toolSetting' : 'title'}`)}</div>
|
||||
{/* base form */}
|
||||
<div className='flex flex-col gap-3 px-4 py-2'>
|
||||
<div className='flex flex-col gap-1'>
|
||||
|
||||
@@ -79,7 +79,7 @@ const Panel: FC<NodePanelProps<ToolNodeType>> = ({
|
||||
className='w-full'
|
||||
onClick={showSetAuthModal}
|
||||
>
|
||||
{t(`${i18nPrefix}.toAuthorize`)}
|
||||
{t(`${i18nPrefix}.authorize`)}
|
||||
</Button>
|
||||
</div>
|
||||
</>
|
||||
|
||||
@@ -14,7 +14,6 @@ const translation = {
|
||||
},
|
||||
author: 'Von',
|
||||
auth: {
|
||||
unauthorized: 'Zur Autorisierung',
|
||||
authorized: 'Autorisiert',
|
||||
setup: 'Autorisierung einrichten, um zu nutzen',
|
||||
setupModalTitle: 'Autorisierung einrichten',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'assignedVarsDescription': 'Zugewiesene Variablen müssen beschreibbare Variablen sein, z. B. Konversationsvariablen.',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Autorisieren',
|
||||
inputVars: 'Eingabevariablen',
|
||||
outputVars: {
|
||||
text: 'durch das Tool generierter Inhalt',
|
||||
|
||||
@@ -77,6 +77,7 @@ const translation = {
|
||||
modelNum: '{{num}} MODELS INCLUDED',
|
||||
toolSelector: {
|
||||
title: 'Add tool',
|
||||
toolSetting: 'Tool Settings',
|
||||
toolLabel: 'Tool',
|
||||
descriptionLabel: 'Tool description',
|
||||
descriptionPlaceholder: 'Brief description of the tool\'s purpose, e.g., get the temperature for a specific location.',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'By',
|
||||
auth: {
|
||||
unauthorized: 'To Authorize',
|
||||
authorized: 'Authorized',
|
||||
setup: 'Set up authorization to use',
|
||||
setupModalTitle: 'Set Up Authorization',
|
||||
|
||||
@@ -651,7 +651,7 @@ const translation = {
|
||||
'assignedVarsDescription': 'Assigned variables must be writable variables, such as conversation variables.',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'To authorize',
|
||||
authorize: 'Authorize',
|
||||
inputVars: 'Input Variables',
|
||||
outputVars: {
|
||||
text: 'tool generated content',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'Por',
|
||||
auth: {
|
||||
unauthorized: 'Para Autorizar',
|
||||
authorized: 'Autorizado',
|
||||
setup: 'Configurar la autorización para usar',
|
||||
setupModalTitle: 'Configurar Autorización',
|
||||
|
||||
@@ -646,7 +646,6 @@ const translation = {
|
||||
'assignedVarsDescription': 'Las variables asignadas deben ser variables grabables, como las variables de conversación.',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Para autorizar',
|
||||
inputVars: 'Variables de entrada',
|
||||
outputVars: {
|
||||
text: 'Contenido generado por la herramienta',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'توسط',
|
||||
auth: {
|
||||
unauthorized: 'برای مجوز دادن',
|
||||
authorized: 'مجوز داده شده',
|
||||
setup: 'تنظیم مجوز برای استفاده',
|
||||
setupModalTitle: 'تنظیم مجوز',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'varNotSet': 'متغیر NOT Set',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'برای مجوز دادن',
|
||||
inputVars: 'متغیرهای ورودی',
|
||||
outputVars: {
|
||||
text: 'محتوای تولید شده توسط ابزار',
|
||||
|
||||
@@ -14,7 +14,6 @@ const translation = {
|
||||
},
|
||||
author: 'Par',
|
||||
auth: {
|
||||
unauthorized: 'Pour Autoriser',
|
||||
authorized: 'Autorisé',
|
||||
setup: 'Mettez en place l\'autorisation à utiliser',
|
||||
setupModalTitle: 'Configurer l\'Autorisation',
|
||||
|
||||
@@ -647,7 +647,6 @@ const translation = {
|
||||
'selectAssignedVariable': 'Sélectionner la variable affectée...',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Autoriser',
|
||||
inputVars: 'Variables de saisie',
|
||||
outputVars: {
|
||||
text: 'contenu généré par l\'outil',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'द्वारा',
|
||||
auth: {
|
||||
unauthorized: 'अधिकृत करने के लिए',
|
||||
authorized: 'अधिकृत',
|
||||
setup: 'उपयोग करने के लिए अधिकृति सेटअप करें',
|
||||
setupModalTitle: 'अधिकृति सेटअप करें',
|
||||
|
||||
@@ -664,7 +664,6 @@ const translation = {
|
||||
'noAssignedVars': 'कोई उपलब्ध असाइन किए गए चर नहीं',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'अधिकृत करने के लिए',
|
||||
inputVars: 'इनपुट वेरिएबल्स',
|
||||
outputVars: {
|
||||
text: 'उपकरण द्वारा उत्पन्न सामग्री',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'Di',
|
||||
auth: {
|
||||
unauthorized: 'Per Autorizzare',
|
||||
authorized: 'Autorizzato',
|
||||
setup: 'Configura l\'autorizzazione per utilizzare',
|
||||
setupModalTitle: 'Configura Autorizzazione',
|
||||
|
||||
@@ -666,7 +666,6 @@ const translation = {
|
||||
'noVarTip': 'Fare clic sul pulsante "+" per aggiungere variabili',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Per autorizzare',
|
||||
inputVars: 'Variabili di Input',
|
||||
outputVars: {
|
||||
text: 'contenuto generato dallo strumento',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: '著者:',
|
||||
auth: {
|
||||
unauthorized: '認証する',
|
||||
authorized: '認証済み',
|
||||
setup: '使用するための認証を設定する',
|
||||
setupModalTitle: '認証の設定',
|
||||
|
||||
@@ -654,7 +654,6 @@ const translation = {
|
||||
'assignedVarsDescription': '代入される変数は、会話変数などの書き込み可能な変数である必要があります。',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: '承認するには',
|
||||
inputVars: '入力変数',
|
||||
outputVars: {
|
||||
text: 'ツールが生成したコンテンツ',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: '저자',
|
||||
auth: {
|
||||
unauthorized: '인증되지 않음',
|
||||
authorized: '인증됨',
|
||||
setup: '사용을 위한 인증 설정',
|
||||
setupModalTitle: '인증 설정',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'varNotSet': '변수가 설정되지 않음',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: '승인하기',
|
||||
inputVars: '입력 변수',
|
||||
outputVars: {
|
||||
text: '도구가 생성한 내용',
|
||||
|
||||
@@ -14,7 +14,6 @@ const translation = {
|
||||
},
|
||||
author: 'Przez',
|
||||
auth: {
|
||||
unauthorized: 'Autoryzacja',
|
||||
authorized: 'Zautoryzowane',
|
||||
setup: 'Skonfiguruj autoryzację aby użyć',
|
||||
setupModalTitle: 'Konfiguruj autoryzację',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'noVarTip': 'Kliknij przycisk "+", aby dodać zmienne',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Do autoryzacji',
|
||||
inputVars: 'Zmienne wejściowe',
|
||||
outputVars: {
|
||||
text: 'treść generowana przez narzędzie',
|
||||
|
||||
@@ -14,7 +14,6 @@ const translation = {
|
||||
},
|
||||
author: 'Por',
|
||||
auth: {
|
||||
unauthorized: 'Para Autorizar',
|
||||
authorized: 'Autorizado',
|
||||
setup: 'Configurar autorização para usar',
|
||||
setupModalTitle: 'Configurar Autorização',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'variables': 'Variáveis',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Autorizar',
|
||||
inputVars: 'Variáveis de entrada',
|
||||
outputVars: {
|
||||
text: 'conteúdo gerado pela ferramenta',
|
||||
|
||||
@@ -14,7 +14,6 @@ const translation = {
|
||||
},
|
||||
author: 'De',
|
||||
auth: {
|
||||
unauthorized: 'Pentru a Autoriza',
|
||||
authorized: 'Autorizat',
|
||||
setup: 'Configurează autorizarea pentru a utiliza',
|
||||
setupModalTitle: 'Configurează Autorizarea',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'variables': 'Variabile',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Autorizați',
|
||||
inputVars: 'Variabile de intrare',
|
||||
outputVars: {
|
||||
text: 'conținut generat de instrument',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'Автор',
|
||||
auth: {
|
||||
unauthorized: 'Авторизовать',
|
||||
authorized: 'Авторизовано',
|
||||
setup: 'Настроить авторизацию для использования',
|
||||
setupModalTitle: 'Настроить авторизацию',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'selectAssignedVariable': 'Выберите назначенную переменную...',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Авторизовать',
|
||||
inputVars: 'Входные переменные',
|
||||
outputVars: {
|
||||
text: 'контент, сгенерированный инструментом',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'Avtor',
|
||||
auth: {
|
||||
unauthorized: 'Za avtorizacijo',
|
||||
authorized: 'Avtorizirano',
|
||||
setup: 'Nastavite avtorizacijo za uporabo',
|
||||
setupModalTitle: 'Nastavi avtorizacijo',
|
||||
|
||||
@@ -488,7 +488,6 @@ const translation = {
|
||||
'variable': 'Spremenljivka',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Za avtorizacijo',
|
||||
inputVars: 'Vhodne spremenljivke',
|
||||
outputVars: {
|
||||
text: 'orodje je ustvarilo vsebino',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'โดย',
|
||||
auth: {
|
||||
unauthorized: 'การอนุญาต',
|
||||
authorized: 'อนุญาต',
|
||||
setup: 'ตั้งค่าการให้สิทธิ์เพื่อใช้',
|
||||
setupModalTitle: 'ตั้งค่าการให้สิทธิ์',
|
||||
|
||||
@@ -647,7 +647,6 @@ const translation = {
|
||||
'setParameter': 'ตั้งค่าพารามิเตอร์...',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'เพื่ออนุญาต',
|
||||
inputVars: 'ตัวแปรอินพุต',
|
||||
outputVars: {
|
||||
text: 'เนื้อหาที่สร้างขึ้นด้วยเครื่องมือ',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: 'Tarafından',
|
||||
auth: {
|
||||
unauthorized: 'Yetki Ver',
|
||||
authorized: 'Yetkilendirildi',
|
||||
setup: 'Kullanmak için yetkilendirmeyi ayarla',
|
||||
setupModalTitle: 'Yetkilendirmeyi Ayarla',
|
||||
|
||||
@@ -649,7 +649,6 @@ const translation = {
|
||||
'noAssignedVars': 'Kullanılabilir atanmış değişken yok',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Yetkilendirmek için',
|
||||
inputVars: 'Giriş Değişkenleri',
|
||||
outputVars: {
|
||||
text: 'araç tarafından oluşturulan içerik',
|
||||
|
||||
@@ -14,7 +14,6 @@ const translation = {
|
||||
},
|
||||
author: 'Автор',
|
||||
auth: {
|
||||
unauthorized: 'Авторизуватися',
|
||||
authorized: 'Авторизовано',
|
||||
setup: 'Налаштувати авторизацію, щоб використовувати',
|
||||
setupModalTitle: 'Налаштування авторизації',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'setParameter': 'Встановити параметр...',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Авторизувати',
|
||||
inputVars: 'Вхідні змінні',
|
||||
outputVars: {
|
||||
text: 'генерований вміст інструменту',
|
||||
|
||||
@@ -14,7 +14,6 @@ const translation = {
|
||||
},
|
||||
author: 'Tác giả',
|
||||
auth: {
|
||||
unauthorized: 'Chưa xác thực',
|
||||
authorized: 'Đã xác thực',
|
||||
setup: 'Thiết lập xác thực để sử dụng',
|
||||
setupModalTitle: 'Thiết lập xác thực',
|
||||
|
||||
@@ -648,7 +648,6 @@ const translation = {
|
||||
'variables': 'Biến',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: 'Ủy quyền',
|
||||
inputVars: 'Biến đầu vào',
|
||||
outputVars: {
|
||||
text: 'nội dung do công cụ tạo ra',
|
||||
|
||||
@@ -77,6 +77,7 @@ const translation = {
|
||||
modelNum: '{{num}} 模型已包含',
|
||||
toolSelector: {
|
||||
title: '添加工具',
|
||||
toolSetting: '工具设置',
|
||||
toolLabel: '工具',
|
||||
descriptionLabel: '工具描述',
|
||||
descriptionPlaceholder: '简要描述工具目的,例如,获取特定位置的温度。',
|
||||
|
||||
@@ -15,7 +15,6 @@ const translation = {
|
||||
},
|
||||
author: '作者',
|
||||
auth: {
|
||||
unauthorized: '去授权',
|
||||
authorized: '已授权',
|
||||
setup: '要使用请先授权',
|
||||
setupModalTitle: '设置授权',
|
||||
|
||||
@@ -652,7 +652,7 @@ const translation = {
|
||||
'assignedVarsDescription': '赋值变量必须是可写入的变量,例如会话变量。',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: '授权',
|
||||
authorize: '授权',
|
||||
inputVars: '输入变量',
|
||||
outputVars: {
|
||||
text: '工具生成的内容',
|
||||
|
||||
@@ -14,7 +14,6 @@ const translation = {
|
||||
},
|
||||
author: '作者',
|
||||
auth: {
|
||||
unauthorized: '去授權',
|
||||
authorized: '已授權',
|
||||
setup: '要使用請先授權',
|
||||
setupModalTitle: '設定授權',
|
||||
|
||||
@@ -648,7 +648,7 @@ const translation = {
|
||||
'varNotSet': '未設置變數',
|
||||
},
|
||||
tool: {
|
||||
toAuthorize: '授權',
|
||||
authorize: '授權',
|
||||
inputVars: '輸入變量',
|
||||
outputVars: {
|
||||
text: '工具生成的內容',
|
||||
|
||||
Reference in New Issue
Block a user