Merge branch 'main' into feat/rag-pipeline

This commit is contained in:
twwu
2025-05-30 15:10:16 +08:00
265 changed files with 3761 additions and 1208 deletions

View File

@ -50,7 +50,7 @@ NEXT_PUBLIC_MAX_TOOLS_NUM=10
NEXT_PUBLIC_MAX_PARALLEL_LIMIT=10
# The maximum number of iterations for agent setting
NEXT_PUBLIC_MAX_ITERATIONS_NUM=5
NEXT_PUBLIC_MAX_ITERATIONS_NUM=99
NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER=true
NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL=true

View File

@ -1,6 +1,6 @@
'use client'
import type { FC } from 'react'
import React, { useMemo, useState } from 'react'
import React, { useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector'
import copy from 'copy-to-clipboard'
@ -32,6 +32,7 @@ import cn from '@/utils/classnames'
import ToolPicker from '@/app/components/workflow/block-selector/tool-picker'
import type { ToolDefaultValue } from '@/app/components/workflow/block-selector/types'
import { canFindTool } from '@/utils'
import { useMittContextSelector } from '@/context/mitt-context'
type AgentToolWithMoreInfo = AgentTool & { icon: any; collection?: Collection } | null
const AgentTools: FC = () => {
@ -39,7 +40,6 @@ const AgentTools: FC = () => {
const [isShowChooseTool, setIsShowChooseTool] = useState(false)
const { modelConfig, setModelConfig, collectionList } = useContext(ConfigContext)
const formattingChangedDispatcher = useFormattingChangedDispatcher()
const [currentTool, setCurrentTool] = useState<AgentToolWithMoreInfo>(null)
const currentCollection = useMemo(() => {
if (!currentTool) return null
@ -61,6 +61,17 @@ const AgentTools: FC = () => {
collection,
}
})
const useSubscribe = useMittContextSelector(s => s.useSubscribe)
const handleUpdateToolsWhenInstallToolSuccess = useCallback((installedPluginNames: string[]) => {
const newModelConfig = produce(modelConfig, (draft) => {
draft.agentConfig.tools.forEach((item: any) => {
if (item.isDeleted && installedPluginNames.includes(item.provider_id))
item.isDeleted = false
})
})
setModelConfig(newModelConfig)
}, [modelConfig, setModelConfig])
useSubscribe('plugin:install:success', handleUpdateToolsWhenInstallToolSuccess as any)
const handleToolSettingChange = (value: Record<string, any>) => {
const newModelConfig = produce(modelConfig, (draft) => {
@ -132,7 +143,7 @@ const AgentTools: FC = () => {
disabled={false}
supportAddCustomTool
onSelect={handleSelectTool}
selectedTools={tools}
selectedTools={tools as any}
/>
</>
)}

View File

@ -99,7 +99,15 @@ const DebugWithMultipleModel = () => {
}, [twoLine, threeLine, fourLine])
const setShowAppConfigureFeaturesModal = useAppStore(s => s.setShowAppConfigureFeaturesModal)
const inputsForm = modelConfig.configs.prompt_variables.filter(item => item.type !== 'api').map(item => ({ ...item, label: item.name, variable: item.key })) as InputForm[]
const inputsForm = modelConfig.configs.prompt_variables
.filter(item => item.type !== 'api')
.map(item => ({
...item,
label: item.name,
variable: item.key,
hide: item.hide ?? false,
required: item.required ?? false,
})) as InputForm[]
return (
<div className='flex h-full flex-col'>
@ -133,6 +141,7 @@ const DebugWithMultipleModel = () => {
{isChatMode && (
<div className='shrink-0 px-6 pb-0'>
<ChatInputArea
botName='Bot'
showFeatureBar
showFileUpload={false}
onFeatureBarClick={setShowAppConfigureFeaturesModal}

View File

@ -79,6 +79,7 @@ import {
} from '@/utils'
import PluginDependency from '@/app/components/workflow/plugin-dependency'
import { supportFunctionCall } from '@/utils/tool-call'
import { MittProvider } from '@/context/mitt-context'
type PublishConfig = {
modelConfig: ModelConfig
@ -908,7 +909,7 @@ const Configuration: FC = () => {
}}
>
<FeaturesProvider features={featuresData}>
<>
<MittProvider>
<div className="flex h-full flex-col">
<div className='relative flex h-[200px] grow pt-14'>
{/* Header */}
@ -1060,7 +1061,7 @@ const Configuration: FC = () => {
/>
)}
<PluginDependency />
</>
</MittProvider>
</FeaturesProvider>
</ConfigContext.Provider>
)

View File

@ -29,6 +29,7 @@ import type { FileUpload } from '@/app/components/base/features/types'
import { TransferMethod } from '@/types/app'
type ChatInputAreaProps = {
botName?: string
showFeatureBar?: boolean
showFileUpload?: boolean
featureBarDisabled?: boolean
@ -43,6 +44,7 @@ type ChatInputAreaProps = {
disabled?: boolean
}
const ChatInputArea = ({
botName,
showFeatureBar,
showFileUpload,
featureBarDisabled,
@ -192,7 +194,7 @@ const ChatInputArea = ({
className={cn(
'body-lg-regular w-full resize-none bg-transparent p-1 leading-6 text-text-tertiary outline-none',
)}
placeholder={t('common.chat.inputPlaceholder') || ''}
placeholder={t('common.chat.inputPlaceholder', { botName }) || ''}
autoFocus
minRows={1}
onResize={handleTextareaResize}

View File

@ -303,6 +303,7 @@ const Chat: FC<ChatProps> = ({
{
!noChatInput && (
<ChatInputArea
botName={appData?.site.title || ''}
disabled={inputDisabled}
showFeatureBar={showFeatureBar}
showFileUpload={showFileUpload}

View File

@ -117,7 +117,7 @@ const Question: FC<QuestionProps> = ({
</div>
<div
ref={contentRef}
className='w-full rounded-2xl bg-[#D1E9FF]/50 px-4 py-3 text-sm text-gray-900'
className='w-full rounded-2xl bg-background-gradient-bg-fill-chat-bubble-bg-3 px-4 py-3 text-sm text-text-primary'
style={theme?.chatBubbleColorStyle ? CssTransform(theme.chatBubbleColorStyle) : {}}
>
{

View File

@ -12,8 +12,7 @@ export class Theme {
public colorPathOnHeader = 'text-text-primary-on-surface'
public backgroundButtonDefaultColorStyle = 'backgroundColor: #1C64F2'
public roundedBackgroundColorStyle = 'backgroundColor: rgb(245 248 255)'
public chatBubbleColorStyle = 'backgroundColor: rgb(225 239 254)'
public chatBubbleColor = 'rgb(225 239 254)'
public chatBubbleColorStyle = ''
constructor(chatColorTheme: string | null = null, chatColorThemeInverted = false) {
this.chatColorTheme = chatColorTheme
@ -29,7 +28,6 @@ export class Theme {
this.backgroundButtonDefaultColorStyle = `backgroundColor: ${this.primaryColor}; color: ${this.colorFontOnHeaderStyle};`
this.roundedBackgroundColorStyle = `backgroundColor: ${hexToRGBA(this.primaryColor, 0.05)}`
this.chatBubbleColorStyle = `backgroundColor: ${hexToRGBA(this.primaryColor, 0.15)}`
this.chatBubbleColor = `${hexToRGBA(this.primaryColor, 0.15)}`
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,20 @@
// GENERATE BY script
// DON NOT EDIT IT MANUALLY
import * as React from 'react'
import data from './OpenaiTale.json'
import IconBase from '@/app/components/base/icons/IconBase'
import type { IconData } from '@/app/components/base/icons/IconBase'
const Icon = (
{
ref,
...props
}: React.SVGProps<SVGSVGElement> & {
ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
},
) => <IconBase {...props} ref={ref} data={data as IconData} />
Icon.displayName = 'OpenaiTale'
export default Icon

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,20 @@
// GENERATE BY script
// DON NOT EDIT IT MANUALLY
import * as React from 'react'
import data from './OpenaiYellow.json'
import IconBase from '@/app/components/base/icons/IconBase'
import type { IconData } from '@/app/components/base/icons/IconBase'
const Icon = (
{
ref,
...props
}: React.SVGProps<SVGSVGElement> & {
ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
},
) => <IconBase {...props} ref={ref} data={data as IconData} />
Icon.displayName = 'OpenaiYellow'
export default Icon

View File

@ -30,7 +30,9 @@ export { default as OpenaiBlue } from './OpenaiBlue'
export { default as OpenaiGreen } from './OpenaiGreen'
export { default as OpenaiText } from './OpenaiText'
export { default as OpenaiTransparent } from './OpenaiTransparent'
export { default as OpenaiTale } from './OpenaiTale'
export { default as OpenaiViolet } from './OpenaiViolet'
export { default as OpenaiYellow } from './OpenaiYellow'
export { default as OpenllmText } from './OpenllmText'
export { default as Openllm } from './Openllm'
export { default as ReplicateText } from './ReplicateText'

View File

@ -0,0 +1,21 @@
/**
* @fileoverview AudioBlock component for rendering audio elements in Markdown.
* Extracted from the main markdown renderer for modularity.
* Uses the AudioGallery component to display audio players.
*/
import React, { memo } from 'react'
import AudioGallery from '@/app/components/base/audio-gallery'
const AudioBlock: any = memo(({ node }: any) => {
const srcs = node.children.filter((child: any) => 'properties' in child).map((child: any) => (child as any).properties.src)
if (srcs.length === 0) {
const src = node.properties?.src
if (src)
return <AudioGallery key={src} srcs={[src]} />
return null
}
return <AudioGallery key={srcs.join()} srcs={srcs} />
})
AudioBlock.displayName = 'AudioBlock'
export default AudioBlock

View File

@ -1,34 +1,19 @@
import ReactMarkdown from 'react-markdown'
import { memo, useEffect, useMemo, useRef, useState } from 'react'
import ReactEcharts from 'echarts-for-react'
import 'katex/dist/katex.min.css'
import RemarkMath from 'remark-math'
import RemarkBreaks from 'remark-breaks'
import RehypeKatex from 'rehype-katex'
import RemarkGfm from 'remark-gfm'
import RehypeRaw from 'rehype-raw'
import SyntaxHighlighter from 'react-syntax-highlighter'
import {
atelierHeathDark,
atelierHeathLight,
} from 'react-syntax-highlighter/dist/esm/styles/hljs'
import { Component, memo, useEffect, useMemo, useRef, useState } from 'react'
import { flow } from 'lodash-es'
import ActionButton from '@/app/components/base/action-button'
import CopyIcon from '@/app/components/base/copy-icon'
import SVGBtn from '@/app/components/base/svg'
import Flowchart from '@/app/components/base/mermaid'
import ImageGallery from '@/app/components/base/image-gallery'
import { useChatContext } from '@/app/components/base/chat/chat/context'
import VideoGallery from '@/app/components/base/video-gallery'
import AudioGallery from '@/app/components/base/audio-gallery'
import MarkdownButton from '@/app/components/base/markdown-blocks/button'
import MarkdownForm from '@/app/components/base/markdown-blocks/form'
import MarkdownMusic from '@/app/components/base/markdown-blocks/music'
import ThinkBlock from '@/app/components/base/markdown-blocks/think-block'
import { Theme } from '@/types/app'
import useTheme from '@/hooks/use-theme'
import cn from '@/utils/classnames'
import SVGRenderer from './svg-gallery'
import SVGRenderer from '../svg-gallery' // Assumes svg-gallery.tsx is in /base directory
import MarkdownMusic from '@/app/components/base/markdown-blocks/music'
import ErrorBoundary from '@/app/components/base/markdown/error-boundary'
// Available language https://github.com/react-syntax-highlighter/react-syntax-highlighter/blob/master/AVAILABLE_LANGUAGES_HLJS.MD
const capitalizationLanguageNameMap: Record<string, string> = {
@ -64,50 +49,6 @@ const getCorrectCapitalizationLanguageName = (language: string) => {
return language.charAt(0).toUpperCase() + language.substring(1)
}
const preprocessLaTeX = (content: string) => {
if (typeof content !== 'string')
return content
const codeBlockRegex = /```[\s\S]*?```/g
const codeBlocks = content.match(codeBlockRegex) || []
let processedContent = content.replace(codeBlockRegex, 'CODE_BLOCK_PLACEHOLDER')
processedContent = flow([
(str: string) => str.replace(/\\\[(.*?)\\\]/g, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/\\\[([\s\S]*?)\\\]/g, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/\\\((.*?)\\\)/g, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/(^|[^\\])\$(.+?)\$/g, (_, prefix, equation) => `${prefix}$${equation}$`),
])(processedContent)
codeBlocks.forEach((block) => {
processedContent = processedContent.replace('CODE_BLOCK_PLACEHOLDER', block)
})
return processedContent
}
const preprocessThinkTag = (content: string) => {
const thinkOpenTagRegex = /<think>\n/g
const thinkCloseTagRegex = /\n<\/think>/g
return flow([
(str: string) => str.replace(thinkOpenTagRegex, '<details data-think=true>\n'),
(str: string) => str.replace(thinkCloseTagRegex, '\n[ENDTHINKFLAG]</details>'),
])(content)
}
export function PreCode(props: { children: any }) {
const ref = useRef<HTMLPreElement>(null)
return (
<pre ref={ref}>
<span
className="copy-code-button"
></span>
{props.children}
</pre>
)
}
// **Add code block
// Avoid error #185 (Maximum update depth exceeded.
// This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate.
@ -444,150 +385,4 @@ const CodeBlock: any = memo(({ inline, className, children = '', ...props }: any
})
CodeBlock.displayName = 'CodeBlock'
const VideoBlock: any = memo(({ node }: any) => {
const srcs = node.children.filter((child: any) => 'properties' in child).map((child: any) => (child as any).properties.src)
if (srcs.length === 0) {
const src = node.properties?.src
if (src)
return <VideoGallery key={src} srcs={[src]} />
return null
}
return <VideoGallery key={srcs.join()} srcs={srcs} />
})
VideoBlock.displayName = 'VideoBlock'
const AudioBlock: any = memo(({ node }: any) => {
const srcs = node.children.filter((child: any) => 'properties' in child).map((child: any) => (child as any).properties.src)
if (srcs.length === 0) {
const src = node.properties?.src
if (src)
return <AudioGallery key={src} srcs={[src]} />
return null
}
return <AudioGallery key={srcs.join()} srcs={srcs} />
})
AudioBlock.displayName = 'AudioBlock'
const ScriptBlock = memo(({ node }: any) => {
const scriptContent = node.children[0]?.value || ''
return `<script>${scriptContent}</script>`
})
ScriptBlock.displayName = 'ScriptBlock'
const Paragraph = (paragraph: any) => {
const { node }: any = paragraph
const children_node = node.children
if (children_node && children_node[0] && 'tagName' in children_node[0] && children_node[0].tagName === 'img') {
return (
<div className="markdown-img-wrapper">
<ImageGallery srcs={[children_node[0].properties.src]} />
{
Array.isArray(paragraph.children) && paragraph.children.length > 1 && (
<div className="mt-2">{paragraph.children.slice(1)}</div>
)
}
</div>
)
}
return <p>{paragraph.children}</p>
}
const Img = ({ src }: any) => {
return <div className="markdown-img-wrapper"><ImageGallery srcs={[src]} /></div>
}
const Link = ({ node, children, ...props }: any) => {
if (node.properties?.href && node.properties.href?.toString().startsWith('abbr')) {
// eslint-disable-next-line react-hooks/rules-of-hooks
const { onSend } = useChatContext()
const hidden_text = decodeURIComponent(node.properties.href.toString().split('abbr:')[1])
return <abbr className="cursor-pointer underline !decoration-primary-700 decoration-dashed" onClick={() => onSend?.(hidden_text)} title={node.children[0]?.value || ''}>{node.children[0]?.value || ''}</abbr>
}
else {
return <a {...props} target="_blank" className="cursor-pointer underline !decoration-primary-700 decoration-dashed">{children || 'Download'}</a>
}
}
export function Markdown(props: { content: string; className?: string; customDisallowedElements?: string[] }) {
const latexContent = flow([
preprocessThinkTag,
preprocessLaTeX,
])(props.content)
return (
<div className={cn('markdown-body', '!text-text-primary', props.className)}>
<ReactMarkdown
remarkPlugins={[
RemarkGfm,
[RemarkMath, { singleDollarTextMath: false }],
RemarkBreaks,
]}
rehypePlugins={[
RehypeKatex,
RehypeRaw as any,
// The Rehype plug-in is used to remove the ref attribute of an element
() => {
return (tree) => {
const iterate = (node: any) => {
if (node.type === 'element' && node.properties?.ref)
delete node.properties.ref
if (node.type === 'element' && !/^[a-z][a-z0-9]*$/i.test(node.tagName)) {
node.type = 'text'
node.value = `<${node.tagName}`
}
if (node.children)
node.children.forEach(iterate)
}
tree.children.forEach(iterate)
}
},
]}
disallowedElements={['iframe', 'head', 'html', 'meta', 'link', 'style', 'body', ...(props.customDisallowedElements || [])]}
components={{
code: CodeBlock,
img: Img,
video: VideoBlock,
audio: AudioBlock,
a: Link,
p: Paragraph,
button: MarkdownButton,
form: MarkdownForm,
script: ScriptBlock as any,
details: ThinkBlock,
}}
>
{/* Markdown detect has problem. */}
{latexContent}
</ReactMarkdown>
</div>
)
}
// **Add an ECharts runtime error handler
// Avoid error #7832 (Crash when ECharts accesses undefined objects)
// This can happen when a component attempts to access an undefined object that references an unregistered map, causing the program to crash.
export default class ErrorBoundary extends Component {
constructor(props: any) {
super(props)
this.state = { hasError: false }
}
componentDidCatch(error: any, errorInfo: any) {
this.setState({ hasError: true })
console.error(error, errorInfo)
}
render() {
// eslint-disable-next-line ts/ban-ts-comment
// @ts-expect-error
if (this.state.hasError)
return <div>Oops! An error occurred. This could be due to an ECharts runtime error or invalid SVG content. <br />(see the browser console for more information)</div>
// eslint-disable-next-line ts/ban-ts-comment
// @ts-expect-error
return this.props.children
}
}
export default CodeBlock

View File

@ -0,0 +1,13 @@
/**
* @fileoverview Img component for rendering <img> tags in Markdown.
* Extracted from the main markdown renderer for modularity.
* Uses the ImageGallery component to display images.
*/
import React from 'react'
import ImageGallery from '@/app/components/base/image-gallery'
const Img = ({ src }: any) => {
return <div className="markdown-img-wrapper"><ImageGallery srcs={[src]} /></div>
}
export default Img

View File

@ -0,0 +1,18 @@
/**
* @fileoverview Barrel file for all markdown block components.
* This allows for cleaner imports in other parts of the application.
*/
export { default as AudioBlock } from './audio-block'
export { default as CodeBlock } from './code-block'
export { default as Img } from './img'
export { default as Link } from './link'
export { default as Paragraph } from './paragraph'
export { default as PreCode } from './pre-code'
export { default as ScriptBlock } from './script-block'
export { default as VideoBlock } from './video-block'
// Assuming these are also standalone components in this directory intended for Markdown rendering
export { default as MarkdownButton } from './button'
export { default as MarkdownForm } from './form'
export { default as ThinkBlock } from './think-block'

View File

@ -0,0 +1,21 @@
/**
* @fileoverview Link component for rendering <a> tags in Markdown.
* Extracted from the main markdown renderer for modularity.
* Handles special rendering for "abbr:" type links for interactive chat actions.
*/
import React from 'react'
import { useChatContext } from '@/app/components/base/chat/chat/context'
const Link = ({ node, children, ...props }: any) => {
const { onSend } = useChatContext()
if (node.properties?.href && node.properties.href?.toString().startsWith('abbr')) {
const hidden_text = decodeURIComponent(node.properties.href.toString().split('abbr:')[1])
return <abbr className="cursor-pointer underline !decoration-primary-700 decoration-dashed" onClick={() => onSend?.(hidden_text)} title={node.children[0]?.value || ''}>{node.children[0]?.value || ''}</abbr>
}
else {
return <a {...props} target="_blank" className="cursor-pointer underline !decoration-primary-700 decoration-dashed">{children || 'Download'}</a>
}
}
export default Link

View File

@ -0,0 +1,27 @@
/**
* @fileoverview Paragraph component for rendering <p> tags in Markdown.
* Extracted from the main markdown renderer for modularity.
* Handles special rendering for paragraphs that directly contain an image.
*/
import React from 'react'
import ImageGallery from '@/app/components/base/image-gallery'
const Paragraph = (paragraph: any) => {
const { node }: any = paragraph
const children_node = node.children
if (children_node && children_node[0] && 'tagName' in children_node[0] && children_node[0].tagName === 'img') {
return (
<div className="markdown-img-wrapper">
<ImageGallery srcs={[children_node[0].properties.src]} />
{
Array.isArray(paragraph.children) && paragraph.children.length > 1 && (
<div className="mt-2">{paragraph.children.slice(1)}</div>
)
}
</div>
)
}
return <p>{paragraph.children}</p>
}
export default Paragraph

View File

@ -0,0 +1,21 @@
/**
* @fileoverview PreCode component for rendering <pre> tags in Markdown.
* Extracted from the main markdown renderer for modularity.
* This is a simple wrapper around the HTML <pre> element.
*/
import React, { useRef } from 'react'
function PreCode(props: { children: any }) {
const ref = useRef<HTMLPreElement>(null)
return (
<pre ref={ref}>
<span
className="copy-code-button"
></span>
{props.children}
</pre>
)
}
export default PreCode

View File

@ -0,0 +1,15 @@
/**
* @fileoverview ScriptBlock component for handling <script> tags in Markdown.
* Extracted from the main markdown renderer for modularity.
* Note: Current implementation returns the script tag as a string, which might not execute as expected in React.
* This behavior is preserved from the original implementation and may need review for security and functionality.
*/
import { memo } from 'react'
const ScriptBlock = memo(({ node }: any) => {
const scriptContent = node.children[0]?.value || ''
return `<script>${scriptContent}</script>`
})
ScriptBlock.displayName = 'ScriptBlock'
export default ScriptBlock

View File

@ -0,0 +1,21 @@
/**
* @fileoverview VideoBlock component for rendering video elements in Markdown.
* Extracted from the main markdown renderer for modularity.
* Uses the VideoGallery component to display videos.
*/
import React, { memo } from 'react'
import VideoGallery from '@/app/components/base/video-gallery'
const VideoBlock: any = memo(({ node }: any) => {
const srcs = node.children.filter((child: any) => 'properties' in child).map((child: any) => (child as any).properties.src)
if (srcs.length === 0) {
const src = node.properties?.src
if (src)
return <VideoGallery key={src} srcs={[src]} />
return null
}
return <VideoGallery key={srcs.join()} srcs={srcs} />
})
VideoBlock.displayName = 'VideoBlock'
export default VideoBlock

View File

@ -0,0 +1,33 @@
/**
* @fileoverview ErrorBoundary component for React.
* This component was extracted from the main markdown renderer.
* It catches JavaScript errors anywhere in its child component tree,
* logs those errors, and displays a fallback UI instead of the crashed component tree.
* Primarily used around complex rendering logic like ECharts or SVG within Markdown.
*/
import React, { Component } from 'react'
// **Add an ECharts runtime error handler
// Avoid error #7832 (Crash when ECharts accesses undefined objects)
// This can happen when a component attempts to access an undefined object that references an unregistered map, causing the program to crash.
export default class ErrorBoundary extends Component {
constructor(props: any) {
super(props)
this.state = { hasError: false }
}
componentDidCatch(error: any, errorInfo: any) {
this.setState({ hasError: true })
console.error(error, errorInfo)
}
render() {
// eslint-disable-next-line ts/ban-ts-comment
// @ts-expect-error
if (this.state.hasError)
return <div>Oops! An error occurred. This could be due to an ECharts runtime error or invalid SVG content. <br />(see the browser console for more information)</div>
// eslint-disable-next-line ts/ban-ts-comment
// @ts-expect-error
return this.props.children
}
}

View File

@ -0,0 +1,87 @@
import ReactMarkdown from 'react-markdown'
import 'katex/dist/katex.min.css'
import RemarkMath from 'remark-math'
import RemarkBreaks from 'remark-breaks'
import RehypeKatex from 'rehype-katex'
import RemarkGfm from 'remark-gfm'
import RehypeRaw from 'rehype-raw'
import { flow } from 'lodash-es'
import cn from '@/utils/classnames'
import { preprocessLaTeX, preprocessThinkTag } from './markdown-utils'
import {
AudioBlock,
CodeBlock,
Img,
Link,
MarkdownButton,
MarkdownForm,
Paragraph,
ScriptBlock,
ThinkBlock,
VideoBlock,
} from '@/app/components/base/markdown-blocks'
/**
* @fileoverview Main Markdown rendering component.
* This file was refactored to extract individual block renderers and utility functions
* into separate modules for better organization and maintainability as of [Date of refactor].
* Further refactoring candidates (custom block components not fitting general categories)
* are noted in their respective files if applicable.
*/
export function Markdown(props: { content: string; className?: string; customDisallowedElements?: string[] }) {
const latexContent = flow([
preprocessThinkTag,
preprocessLaTeX,
])(props.content)
return (
<div className={cn('markdown-body', '!text-text-primary', props.className)}>
<ReactMarkdown
remarkPlugins={[
RemarkGfm,
[RemarkMath, { singleDollarTextMath: false }],
RemarkBreaks,
]}
rehypePlugins={[
RehypeKatex,
RehypeRaw as any,
// The Rehype plug-in is used to remove the ref attribute of an element
() => {
return (tree: any) => {
const iterate = (node: any) => {
if (node.type === 'element' && node.properties?.ref)
delete node.properties.ref
if (node.type === 'element' && !/^[a-z][a-z0-9]*$/i.test(node.tagName)) {
node.type = 'text'
node.value = `<${node.tagName}`
}
if (node.children)
node.children.forEach(iterate)
}
tree.children.forEach(iterate)
}
},
]}
disallowedElements={['iframe', 'head', 'html', 'meta', 'link', 'style', 'body', ...(props.customDisallowedElements || [])]}
components={{
code: CodeBlock,
img: Img,
video: VideoBlock,
audio: AudioBlock,
a: Link,
p: Paragraph,
button: MarkdownButton,
form: MarkdownForm,
script: ScriptBlock as any,
details: ThinkBlock,
}}
>
{/* Markdown detect has problem. */}
{latexContent}
</ReactMarkdown>
</div>
)
}

View File

@ -0,0 +1,37 @@
/**
* @fileoverview Utility functions for preprocessing Markdown content.
* These functions were extracted from the main markdown renderer for better separation of concerns.
* Includes preprocessing for LaTeX and custom "think" tags.
*/
import { flow } from 'lodash-es'
export const preprocessLaTeX = (content: string) => {
if (typeof content !== 'string')
return content
const codeBlockRegex = /```[\s\S]*?```/g
const codeBlocks = content.match(codeBlockRegex) || []
let processedContent = content.replace(codeBlockRegex, 'CODE_BLOCK_PLACEHOLDER')
processedContent = flow([
(str: string) => str.replace(/\\\[(.*?)\\\]/g, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/\\\[([\s\S]*?)\\\]/g, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/\\\((.*?)\\\)/g, (_, equation) => `$$${equation}$$`),
(str: string) => str.replace(/(^|[^\\])\$(.+?)\$/g, (_, prefix, equation) => `${prefix}$${equation}$`),
])(processedContent)
codeBlocks.forEach((block) => {
processedContent = processedContent.replace('CODE_BLOCK_PLACEHOLDER', block)
})
return processedContent
}
export const preprocessThinkTag = (content: string) => {
const thinkOpenTagRegex = /<think>\n/g
const thinkCloseTagRegex = /\n<\/think>/g
return flow([
(str: string) => str.replace(thinkOpenTagRegex, '<details data-think=true>\n'),
(str: string) => str.replace(thinkCloseTagRegex, '\n[ENDTHINKFLAG]</details>'),
])(content)
}

View File

@ -130,7 +130,7 @@ const CustomWebAppBrand = () => {
<div className='system-xs-regular text-text-tertiary'>{t('custom.webapp.changeLogoTip')}</div>
</div>
<div className='flex items-center'>
{(uploadDisabled || (!webappLogo && !webappBrandRemoved)) && (
{(!uploadDisabled && webappLogo && !webappBrandRemoved) && (
<>
<Button
variant='ghost'

View File

@ -866,10 +866,10 @@ const StepTwo = ({
<>
<CustomDialog show={isQAConfirmDialogOpen} onClose={() => setIsQAConfirmDialogOpen(false)} className='w-[432px]'>
<header className='mb-4 pt-6'>
<h2 className='text-lg font-semibold'>
<h2 className='text-lg font-semibold text-text-primary'>
{t('datasetCreation.stepTwo.qaSwitchHighQualityTipTitle')}
</h2>
<p className='mt-2 text-sm font-normal'>
<p className='mt-2 text-sm font-normal text-text-secondary'>
{t('datasetCreation.stepTwo.qaSwitchHighQualityTipContent')}
</p>
</header>
@ -929,7 +929,7 @@ const StepTwo = ({
</div>
)}
{hasSetIndexType && indexType === IndexingType.ECONOMICAL && (
<div className='system-xs-medium mt-2'>
<div className='system-xs-medium mt-2 text-text-tertiary'>
{t('datasetCreation.stepTwo.indexSettingTip')}
<Link className='text-text-accent' href={`/datasets/${datasetId}/settings`}>{t('datasetCreation.stepTwo.datasetSettingLink')}</Link>
</div>

View File

@ -50,20 +50,20 @@ const CSVDownload: FC<{ docForm: ChunkingMode }> = ({ docForm }) => {
return (
<div className='mt-6'>
<div className='text-sm font-medium text-gray-900'>{t('share.generation.csvStructureTitle')}</div>
<div className='text-sm font-medium text-text-primary'>{t('share.generation.csvStructureTitle')}</div>
<div className='mt-2 max-h-[500px] overflow-auto'>
{docForm === ChunkingMode.qa && (
<table className='w-full table-fixed border-separate border-spacing-0 rounded-lg border border-gray-200 text-xs'>
<thead className='text-gray-500'>
<table className='w-full table-fixed border-separate border-spacing-0 rounded-lg border border-divider-subtle text-xs'>
<thead className='text-text-secondary'>
<tr>
<td className='h-9 border-b border-gray-200 pl-3 pr-2'>{t('datasetDocuments.list.batchModal.question')}</td>
<td className='h-9 border-b border-gray-200 pl-3 pr-2'>{t('datasetDocuments.list.batchModal.answer')}</td>
<td className='h-9 border-b border-divider-subtle pl-3 pr-2'>{t('datasetDocuments.list.batchModal.question')}</td>
<td className='h-9 border-b border-divider-subtle pl-3 pr-2'>{t('datasetDocuments.list.batchModal.answer')}</td>
</tr>
</thead>
<tbody className='text-gray-700'>
<tbody className='text-text-tertiary'>
<tr>
<td className='h-9 border-b border-gray-100 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.question')} 1</td>
<td className='h-9 border-b border-gray-100 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.answer')} 1</td>
<td className='h-9 border-b border-divider-subtle pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.question')} 1</td>
<td className='h-9 border-b border-divider-subtle pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.answer')} 1</td>
</tr>
<tr>
<td className='h-9 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.question')} 2</td>
@ -73,15 +73,15 @@ const CSVDownload: FC<{ docForm: ChunkingMode }> = ({ docForm }) => {
</table>
)}
{docForm === ChunkingMode.text && (
<table className='w-full table-fixed border-separate border-spacing-0 rounded-lg border border-gray-200 text-xs'>
<thead className='text-gray-500'>
<table className='w-full table-fixed border-separate border-spacing-0 rounded-lg border border-divider-subtle text-xs'>
<thead className='text-text-secondary'>
<tr>
<td className='h-9 border-b border-gray-200 pl-3 pr-2'>{t('datasetDocuments.list.batchModal.contentTitle')}</td>
<td className='h-9 border-b border-divider-subtle pl-3 pr-2'>{t('datasetDocuments.list.batchModal.contentTitle')}</td>
</tr>
</thead>
<tbody className='text-gray-700'>
<tbody className='text-text-tertiary'>
<tr>
<td className='h-9 border-b border-gray-100 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.content')} 1</td>
<td className='h-9 border-b border-divider-subtle pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.content')} 1</td>
</tr>
<tr>
<td className='h-9 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.content')} 2</td>

View File

@ -93,29 +93,29 @@ const CSVUploader: FC<Props> = ({
/>
<div ref={dropRef}>
{!file && (
<div className={cn('flex h-20 items-center rounded-xl border border-dashed border-gray-200 bg-gray-50 text-sm font-normal', dragging && 'border border-[#B2CCFF] bg-[#F5F8FF]')}>
<div className={cn('flex h-20 items-center rounded-xl border border-dashed border-components-panel-border bg-components-panel-bg-blur text-sm font-normal', dragging && 'border border-divider-subtle bg-components-panel-on-panel-item-bg-hover')}>
<div className='flex w-full items-center justify-center space-x-2'>
<CSVIcon className="shrink-0" />
<div className='text-gray-500'>
<div className='text-text-secondary'>
{t('datasetDocuments.list.batchModal.csvUploadTitle')}
<span className='cursor-pointer text-primary-400' onClick={selectHandle}>{t('datasetDocuments.list.batchModal.browse')}</span>
<span className='cursor-pointer text-text-accent' onClick={selectHandle}>{t('datasetDocuments.list.batchModal.browse')}</span>
</div>
</div>
{dragging && <div ref={dragRef} className='absolute left-0 top-0 h-full w-full' />}
</div>
)}
{file && (
<div className={cn('group flex h-20 items-center rounded-xl border border-gray-200 bg-gray-50 px-6 text-sm font-normal', 'hover:border-[#B2CCFF] hover:bg-[#F5F8FF]')}>
<div className={cn('group flex h-20 items-center rounded-xl border border-components-panel-border bg-components-panel-bg-blur px-6 text-sm font-normal', 'hover:border-divider-subtle hover:bg-components-panel-on-panel-item-bg-hover')}>
<CSVIcon className="shrink-0" />
<div className='ml-2 flex w-0 grow'>
<span className='max-w-[calc(100%_-_30px)] overflow-hidden text-ellipsis whitespace-nowrap text-gray-800'>{file.name.replace(/.csv$/, '')}</span>
<span className='shrink-0 text-gray-500'>.csv</span>
<span className='max-w-[calc(100%_-_30px)] overflow-hidden text-ellipsis whitespace-nowrap text-text-primary'>{file.name.replace(/.csv$/, '')}</span>
<span className='shrink-0 text-text-secondary'>.csv</span>
</div>
<div className='hidden items-center group-hover:flex'>
<Button onClick={selectHandle}>{t('datasetCreation.stepOne.uploader.change')}</Button>
<div className='mx-2 h-4 w-px bg-gray-200' />
<div className='mx-2 h-4 w-px bg-text-secondary' />
<div className='cursor-pointer p-2' onClick={removeFile}>
<RiDeleteBinLine className='h-4 w-4 text-gray-500' />
<RiDeleteBinLine className='h-4 w-4 text-text-secondary' />
</div>
</div>
</div>

View File

@ -41,9 +41,9 @@ const BatchModal: FC<IBatchModalProps> = ({
return (
<Modal isShow={isShow} onClose={noop} className='!max-w-[520px] !rounded-xl px-8 py-6'>
<div className='relative pb-1 text-xl font-medium leading-[30px] text-gray-900'>{t('datasetDocuments.list.batchModal.title')}</div>
<div className='relative pb-1 text-xl font-medium leading-[30px] text-text-primary'>{t('datasetDocuments.list.batchModal.title')}</div>
<div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onCancel}>
<RiCloseLine className='h-4 w-4 text-gray-500' />
<RiCloseLine className='h-4 w-4 text-text-secondary' />
</div>
<CSVUploader
file={currentCSV}

View File

@ -1298,6 +1298,76 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
method='GET'
title='Get a Chunk Details in a Document'
name='#view_document_chunk'
/>
<Row>
<Col>
Get details of a specific document segment in the specified knowledge base
### Path
<Properties>
<Property name='dataset_id' type='string' key='dataset_id'>
Knowledge Base ID
</Property>
<Property name='document_id' type='string' key='document_id'>
Document ID
</Property>
<Property name='segment_id' type='string' key='segment_id'>
Segment ID
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="GET"
label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
--header 'Authorization: Bearer {api_key}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"data": {
"id": "chunk_id",
"position": 2,
"document_id": "document_id",
"content": "Segment content text",
"sign_content": "Signature content text",
"answer": "Answer content (if in Q&A mode)",
"word_count": 470,
"tokens": 382,
"keywords": ["keyword1", "keyword2"],
"index_node_id": "index_node_id",
"index_node_hash": "index_node_hash",
"hit_count": 0,
"enabled": true,
"status": "completed",
"created_by": "creator_id",
"created_at": creation_timestamp,
"updated_at": update_timestamp,
"indexing_at": indexing_timestamp,
"completed_at": completion_timestamp,
"error": null,
"child_chunks": []
},
"doc_form": "text_model"
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
method='DELETE'
@ -1771,20 +1841,45 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
Query keyword
</Property>
<Property name='retrieval_model' type='object' key='retrieval_model'>
Retrieval model (optional, if not filled, it will be recalled according to the default method)
- <code>search_method</code> (text) Search method: One of the following four keywords is required
- <code>keyword_search</code> Keyword search
- <code>semantic_search</code> Semantic search
- <code>full_text_search</code> Full-text search
- <code>hybrid_search</code> Hybrid search
- <code>reranking_enable</code> (bool) Whether to enable reranking, required if the search mode is semantic_search or hybrid_search (optional)
- <code>reranking_mode</code> (object) Rerank model configuration, required if reranking is enabled
- <code>reranking_provider_name</code> (string) Rerank model provider
- <code>reranking_model_name</code> (string) Rerank model name
- <code>weights</code> (float) Semantic search weight setting in hybrid search mode
- <code>top_k</code> (integer) Number of results to return (optional)
- <code>score_threshold_enabled</code> (bool) Whether to enable score threshold
- <code>score_threshold</code> (float) Score threshold
Retrieval parameters (optional, if not filled, it will be recalled according to the default method)
- <code>search_method</code> (text) Search method: One of the following four keywords is required
- <code>keyword_search</code> Keyword search
- <code>semantic_search</code> Semantic search
- <code>full_text_search</code> Full-text search
- <code>hybrid_search</code> Hybrid search
- <code>reranking_enable</code> (bool) Whether to enable reranking, required if the search mode is semantic_search or hybrid_search (optional)
- <code>reranking_mode</code> (object) Rerank model configuration, required if reranking is enabled
- <code>reranking_provider_name</code> (string) Rerank model provider
- <code>reranking_model_name</code> (string) Rerank model name
- <code>weights</code> (float) Semantic search weight setting in hybrid search mode
- <code>top_k</code> (integer) Number of results to return (optional)
- <code>score_threshold_enabled</code> (bool) Whether to enable score threshold
- <code>score_threshold</code> (float) Score threshold
- <code>metadata_filtering_conditions</code> (object) Metadata filtering conditions
- <code>logical_operator</code> (string) Logical operator: <code>and</code> | <code>or</code>
- <code>conditions</code> (array[object]) Conditions list
- <code>name</code> (string) Metadata field name
- <code>comparison_operator</code> (string) Comparison operator, allowed values:
- String comparison:
- <code>contains</code>: Contains
- <code>not contains</code>: Does not contain
- <code>start with</code>: Starts with
- <code>end with</code>: Ends with
- <code>is</code>: Equals
- <code>is not</code>: Does not equal
- <code>empty</code>: Is empty
- <code>not empty</code>: Is not empty
- Numeric comparison:
- <code>=</code>: Equals
- <code>≠</code>: Does not equal
- <code>></code>: Greater than
- <code>< </code>: Less than
- <code>≥</code>: Greater than or equal
- <code>≤</code>: Less than or equal
- Time comparison:
- <code>before</code>: Before
- <code>after</code>: After
- <code>value</code> (string|number|null) Comparison value
</Property>
<Property name='external_retrieval_model' type='object' key='external_retrieval_model'>
Unused field
@ -1809,7 +1904,17 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
"weights": null,
"top_k": 1,
"score_threshold_enabled": false,
"score_threshold": null
"score_threshold": null,
"metadata_filtering_conditions": {
"logical_operator": "and",
"conditions": [
{
"name": "document_name",
"comparison_operator": "contains",
"value": "test"
}
]
}
}
}'`}
>
@ -2089,9 +2194,7 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
label="/datasets/{dataset_id}/documents/metadata"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/metadata' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"operation_data": [{"document_id": "document_id", "metadata_list": [{"id": "id", "value": "value", "name": "name"}]}]}'`}
>
```bash {{ title: 'cURL' }}
```
</CodeGroup>
```bash {{ title: 'cURL' }} </CodeGroup>
</Col>
</Row>
@ -2246,6 +2349,316 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
</Row>
<hr className='ml-0 mr-0' />
Okay, I will translate the Chinese text in your document while keeping all formatting and code content unchanged.
<Heading
url='/datasets/tags'
method='POST'
title='Create New Knowledge Base Type Tag'
name='#create_new_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='name' type='string'>
(text) New tag name, required, maximum length 50
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "testtag1"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "testtag1"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"id": "eddb66c2-04a1-4e3a-8cb2-75abd01e12a6",
"name": "testtag1",
"type": "knowledge",
"binding_count": 0
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='GET'
title='Get Knowledge Base Type Tags'
name='#get_knowledge_type_tags'
/>
<Row>
<Col>
### Request Body
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="GET"
label="/datasets/tags"
targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
>
```bash {{ title: 'cURL' }}
curl --location --request GET '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
[
{
"id": "39d6934c-ed36-463d-b4a7-377fa1503dc0",
"name": "testtag1",
"type": "knowledge",
"binding_count": "0"
},
...
]
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='PATCH'
title='Modify Knowledge Base Type Tag Name'
name='#modify_knowledge_tag_name'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='name' type='string'>
(text) Modified tag name, required, maximum length 50
</Property>
<Property name='tag_id' type='string'>
(text) Tag ID, required
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="PATCH"
label="/datasets/tags"
targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "testtag2", "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}`}
>
```bash {{ title: 'cURL' }}
curl --location --request PATCH '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "testtag2", "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"id": "eddb66c2-04a1-4e3a-8cb2-75abd01e12a6",
"name": "tag-renamed",
"type": "knowledge",
"binding_count": 0
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='DELETE'
title='Delete Knowledge Base Type Tag'
name='#delete_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_id' type='string'>
(text) Tag ID, required
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="DELETE"
label="/datasets/tags"
targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}`}
>
```bash {{ title: 'cURL' }}
curl --location --request DELETE '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags/binding'
method='POST'
title='Bind Dataset to Knowledge Base Type Tag'
name='#bind_dataset_to_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_ids' type='list'>
(list) List of Tag IDs, required
</Property>
<Property name='target_id' type='string'>
(text) Dataset ID, required
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags/binding"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags/binding' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"tag_ids": ["65cc29be-d072-4e26-adf4-2f727644da29","1e5348f3-d3ff-42b8-a1b7-0a86d518001a"], "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags/binding' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_ids": ["65cc29be-d072-4e26-adf4-2f727644da29","1e5348f3-d3ff-42b8-a1b7-0a86d518001a"], "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags/unbinding'
method='POST'
title='Unbind Dataset and Knowledge Base Type Tag'
name='#unbind_dataset_and_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_id' type='string'>
(text) Tag ID, required
</Property>
<Property name='target_id' type='string'>
(text) Dataset ID, required
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags/unbinding"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags/unbinding' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"tag_id": "1e5348f3-d3ff-42b8-a1b7-0a86d518001a", "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags/unbinding' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_id": "1e5348f3-d3ff-42b8-a1b7-0a86d518001a", "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/<uuid:dataset_id>/tags'
method='POST'
title='Query Tags Bound to a Dataset'
name='#query_dataset_tags'
/>
<Row>
<Col>
### Path
<Properties>
<Property name='dataset_id' type='string'>
(text) Dataset ID
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/<uuid:dataset_id>/tags"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/<uuid:dataset_id>/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/<uuid:dataset_id>/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"data":
[
{"id": "4a601f4f-f8a2-4166-ae7c-58c3b252a524",
"name": "123"
},
...
],
"total": 3
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Row>
<Col>

View File

@ -1057,6 +1057,75 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
<Heading
url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
method='GET'
title='ドキュメントセグメントの詳細を表示'
name='#view_document_segment'
/>
<Row>
<Col>
指定されたナレッジベース内の特定のドキュメントセグメントの詳細を表示します
### パス
<Properties>
<Property name='dataset_id' type='string' key='dataset_id'>
ナレッジベースID
</Property>
<Property name='document_id' type='string' key='document_id'>
ドキュメントID
</Property>
<Property name='segment_id' type='string' key='segment_id'>
セグメントID
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="リクエスト"
tag="GET"
label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
--header 'Authorization: Bearer {api_key}'
```
</CodeGroup>
<CodeGroup title="レスポンス">
```json {{ title: 'Response' }}
{
"data": {
"id": "セグメントID",
"position": 2,
"document_id": "ドキュメントID",
"content": "セグメント内容テキスト",
"sign_content": "署名内容テキスト",
"answer": "回答内容(Q&Aモードの場合)",
"word_count": 470,
"tokens": 382,
"keywords": ["キーワード1", "キーワード2"],
"index_node_id": "インデックスードID",
"index_node_hash": "インデックスノードハッシュ",
"hit_count": 0,
"enabled": true,
"status": "completed",
"created_by": "作成者ID",
"created_at": 作成タイムスタンプ,
"updated_at": 更新タイムスタンプ,
"indexing_at": インデックス作成タイムスタンプ,
"completed_at": 完了タイムスタンプ,
"error": null,
"child_chunks": []
},
"doc_form": "text_model"
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
method='DELETE'
title='ドキュメント内のチャンクを削除'
name='#delete_segment'
@ -1100,7 +1169,6 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
method='POST'
title='ドキュメント内のチャンクを更新'
name='#update_segment'
@ -1528,20 +1596,45 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
クエリキーワード
</Property>
<Property name='retrieval_model' type='object' key='retrieval_model'>
検索モデル (オプション、入力されない場合はデフォルトの方法でリコールされます)
- <code>search_method</code> (text) 検索方法: 以下の 4 つのキーワードのいずれかが必要です
- <code>keyword_search</code> キーワード検索
- <code>semantic_search</code> セマンティック検索
- <code>full_text_search</code> 全文検索
- <code>hybrid_search</code> ハイブリッド検索
- <code>reranking_enable</code> (bool) 再ランキングを有効にするかどうか、検索モードが semantic_search または hybrid_search の場合に必須 (オプション)
- <code>reranking_mode</code> (object) 再ランキングモデル構成、再ランキングが有効な場合に必須
- <code>reranking_provider_name</code> (string) 再ランキングモデルプロバイダー
- <code>reranking_model_name</code> (string) 再ランキングモデル名
- <code>weights</code> (float) ハイブリッド検索モードでのセマンティック検索の重み設定
- <code>top_k</code> (integer) 返される結果の数 (オプション)
- <code>score_threshold_enabled</code> (bool) スコア閾値を有効にするかどうか
- <code>score_threshold</code> (float) スコア閾値
検索パラメータ(オプション、入力されない場合はデフォルトの方法でリコールされます
- <code>search_method</code> (text) 検索方法: 以下の4つのキーワードのいずれかが必要です
- <code>keyword_search</code> キーワード検索
- <code>semantic_search</code> セマンティック検索
- <code>full_text_search</code> 全文検索
- <code>hybrid_search</code> ハイブリッド検索
- <code>reranking_enable</code> (bool) 再ランキングを有効にするかどうか、検索モードがsemantic_searchまたはhybrid_searchの場合に必須オプション
- <code>reranking_mode</code> (object) 再ランキングモデル構成、再ランキングが有効な場合に必須
- <code>reranking_provider_name</code> (string) 再ランキングモデルプロバイダー
- <code>reranking_model_name</code> (string) 再ランキングモデル名
- <code>weights</code> (float) ハイブリッド検索モードでのセマンティック検索の重み設定
- <code>top_k</code> (integer) 返される結果の数オプション
- <code>score_threshold_enabled</code> (bool) スコア閾値を有効にするかどうか
- <code>score_threshold</code> (float) スコア閾値
- <code>metadata_filtering_conditions</code> (object) メタデータフィルタリング条件
- <code>logical_operator</code> (string) 論理演算子: <code>and</code> | <code>or</code>
- <code>conditions</code> (array[object]) 条件リスト
- <code>name</code> (string) メタデータフィールド名
- <code>comparison_operator</code> (string) 比較演算子、許可される値:
- 文字列比較:
- <code>contains</code>: 含む
- <code>not contains</code>: 含まない
- <code>start with</code>: で始まる
- <code>end with</code>: で終わる
- <code>is</code>: 等しい
- <code>is not</code>: 等しくない
- <code>empty</code>: 空
- <code>not empty</code>: 空でない
- 数値比較:
- <code>=</code>: 等しい
- <code>≠</code>: 等しくない
- <code>></code>: より大きい
- <code>< </code>: より小さい
- <code>≥</code>: 以上
- <code>≤</code>: 以下
- 時間比較:
- <code>before</code>: より前
- <code>after</code>: より後
- <code>value</code> (string|number|null) 比較値
</Property>
<Property name='external_retrieval_model' type='object' key='external_retrieval_model'>
未使用フィールド
@ -1566,7 +1659,17 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
"weights": null,
"top_k": 1,
"score_threshold_enabled": false,
"score_threshold": null
"score_threshold": null,
"metadata_filtering_conditions": {
"logical_operator": "and",
"conditions": [
{
"name": "document_name",
"comparison_operator": "contains",
"value": "test"
}
]
}
}
}'`}
>
@ -1898,6 +2001,313 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='POST'
title='ナレッジベースタイプタグの新規作成'
name='#create_new_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='name' type='string'>
(text) 新しいタグ名、必須、最大長50文字
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "testtag1"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "testtag1"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"id": "eddb66c2-04a1-4e3a-8cb2-75abd01e12a6",
"name": "testtag1",
"type": "knowledge",
"binding_count": 0
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='GET'
title='ナレッジベースタイプタグの取得'
name='#get_knowledge_type_tags'
/>
<Row>
<Col>
### Request Body
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="GET"
label="/datasets/tags"
targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
>
```bash {{ title: 'cURL' }}
curl --location --request GET '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
[
{
"id": "39d6934c-ed36-463d-b4a7-377fa1503dc0",
"name": "testtag1",
"type": "knowledge",
"binding_count": "0"
},
...
]
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='PATCH'
title='ナレッジベースタイプタグ名の変更'
name='#modify_knowledge_tag_name'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='name' type='string'>
(text) 変更後のタグ名、必須、最大長50文字
</Property>
<Property name='tag_id' type='string'>
(text) タグID、必須
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="PATCH"
label="/datasets/tags"
targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "testtag2", "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}`}
>
```bash {{ title: 'cURL' }}
curl --location --request PATCH '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "testtag2", "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"id": "eddb66c2-04a1-4e3a-8cb2-75abd01e12a6",
"name": "tag-renamed",
"type": "knowledge",
"binding_count": 0
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='DELETE'
title='ナレッジベースタイプタグの削除'
name='#delete_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_id' type='string'>
(text) タグID、必須
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="DELETE"
label="/datasets/tags"
targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}`}
>
```bash {{ title: 'cURL' }}
curl --location --request DELETE '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags/binding'
method='POST'
title='ナレッジベースをナレッジベースタイプタグに紐付け'
name='#bind_dataset_to_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_ids' type='list'>
(list) タグIDリスト、必須
</Property>
<Property name='target_id' type='string'>
(text) ナレッジベースID、必須
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags/binding"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags/binding' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"tag_ids": ["65cc29be-d072-4e26-adf4-2f727644da29","1e5348f3-d3ff-42b8-a1b7-0a86d518001a"], "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags/binding' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_ids": ["65cc29be-d072-4e26-adf4-2f727644da29","1e5348f3-d3ff-42b8-a1b7-0a86d518001a"], "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags/unbinding'
method='POST'
title='ナレッジベースとナレッジベースタイプタグの紐付け解除'
name='#unbind_dataset_and_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_id' type='string'>
(text) タグID、必須
</Property>
<Property name='target_id' type='string'>
(text) ナレッジベースID、必須
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags/unbinding"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags/unbinding' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"tag_id": "1e5348f3-d3ff-42b8-a1b7-0a86d518001a", "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags/unbinding' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_id": "1e5348f3-d3ff-42b8-a1b7-0a86d518001a", "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/<uuid:dataset_id>/tags'
method='POST'
title='ナレッジベースに紐付けられたタグの照会'
name='#query_dataset_tags'
/>
<Row>
<Col>
### Path
<Properties>
<Property name='dataset_id' type='string'>
(text) ナレッジベースID
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/<uuid:dataset_id>/tags"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/<uuid:dataset_id>/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/<uuid:dataset_id>/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"data":
[
{"id": "4a601f4f-f8a2-4166-ae7c-58c3b252a524",
"name": "123"
},
...
],
"total": 3
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Row>

View File

@ -1351,6 +1351,75 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
<Heading
url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
method='GET'
title='查看文档分段详情'
name='#view_document_segment'
/>
<Row>
<Col>
查看指定知识库中特定文档的分段详情
### Path
<Properties>
<Property name='dataset_id' type='string' key='dataset_id'>
知识库 ID
</Property>
<Property name='document_id' type='string' key='document_id'>
文档 ID
</Property>
<Property name='segment_id' type='string' key='segment_id'>
分段 ID
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="GET"
label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
--header 'Authorization: Bearer {api_key}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"data": {
"id": "分段唯一ID",
"position": 2,
"document_id": "所属文档ID",
"content": "分段内容文本",
"sign_content": "签名内容文本",
"answer": "答案内容(如果有)",
"word_count": 470,
"tokens": 382,
"keywords": ["关键词1", "关键词2"],
"index_node_id": "索引节点ID",
"index_node_hash": "索引节点哈希值",
"hit_count": 0,
"enabled": true,
"status": "completed",
"created_by": "创建者ID",
"created_at": 创建时间戳,
"updated_at": 更新时间戳,
"indexing_at": 索引时间戳,
"completed_at": 完成时间戳,
"error": null,
"child_chunks": []
},
"doc_form": "text_model"
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
method='POST'
title='更新文档分段'
name='#update_segment'
@ -1827,6 +1896,31 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
- <code>top_k</code> (integer) 返回结果数量,非必填
- <code>score_threshold_enabled</code> (bool) 是否开启 score 阈值
- <code>score_threshold</code> (float) Score 阈值
- <code>metadata_filtering_conditions</code> (object) 元数据过滤条件
- <code>logical_operator</code> (string) 逻辑运算符: <code>and</code> | <code>or</code>
- <code>conditions</code> (array[object]) 条件列表
- <code>name</code> (string) 元数据字段名
- <code>comparison_operator</code> (string) 比较运算符,可选值:
- 字符串比较:
- <code>contains</code>: 包含
- <code>not contains</code>: 不包含
- <code>start with</code>: 以...开头
- <code>end with</code>: 以...结尾
- <code>is</code>: 等于
- <code>is not</code>: 不等于
- <code>empty</code>: 为空
- <code>not empty</code>: 不为空
- 数值比较:
- <code>=</code>: 等于
- <code>≠</code>: 不等于
- <code>></code>: 大于
- <code> < </code>: 小于
- <code>≥</code>: 大于等于
- <code>≤</code>: 小于等于
- 时间比较:
- <code>before</code>: 早于
- <code>after</code>: 晚于
- <code>value</code> (string|number|null) 比较值
</Property>
<Property name='external_retrieval_model' type='object' key='external_retrieval_model'>
未启用字段
@ -1851,7 +1945,17 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
"weights": null,
"top_k": 1,
"score_threshold_enabled": false,
"score_threshold": null
"score_threshold": null,
"metadata_filtering_conditions": {
"logical_operator": "and",
"conditions": [
{
"name": "document_name",
"comparison_operator": "contains",
"value": "test"
}
]
}
}
}'`}
>
@ -2287,6 +2391,314 @@ import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstructi
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='POST'
title='新增知识库类型标签'
name='#create_new_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='name' type='string'>
(text) 新标签名称必填最大长度为50
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "testtag1"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "testtag1"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"id": "eddb66c2-04a1-4e3a-8cb2-75abd01e12a6",
"name": "testtag1",
"type": "knowledge",
"binding_count": 0
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='GET'
title='获取知识库类型标签'
name='#get_knowledge_type_tags'
/>
<Row>
<Col>
### Request Body
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="GET"
label="/datasets/tags"
targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
>
```bash {{ title: 'cURL' }}
curl --location --request GET '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
[
{
"id": "39d6934c-ed36-463d-b4a7-377fa1503dc0",
"name": "testtag1",
"type": "knowledge",
"binding_count": "0"
},
...
]
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='PATCH'
title='修改知识库类型标签名称'
name='#modify_knowledge_tag_name'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='name' type='string'>
(text) 修改后的标签名称必填最大长度为50
</Property>
<Property name='tag_id' type='string'>
(text) 标签ID必填
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="PATCH"
label="/datasets/tags"
targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "testtag2", "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}`}
>
```bash {{ title: 'cURL' }}
curl --location --request PATCH '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "testtag2", "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"id": "eddb66c2-04a1-4e3a-8cb2-75abd01e12a6",
"name": "tag-renamed",
"type": "knowledge",
"binding_count": 0
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags'
method='DELETE'
title='删除知识库类型标签'
name='#delete_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_id' type='string'>
(text) 标签ID必填
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="DELETE"
label="/datasets/tags"
targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ "tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}`}
>
```bash {{ title: 'cURL' }}
curl --location --request DELETE '${props.apiBaseUrl}/datasets/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_id": "e1a0a3db-ee34-4e04-842a-81555d5316fd"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags/binding'
method='POST'
title='绑定知识库到知识库类型标签'
name='#bind_dataset_to_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_ids' type='list'>
(list) 标签ID列表必填
</Property>
<Property name='target_id' type='string'>
(text) 知识库ID必填
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags/binding"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags/binding' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"tag_ids": ["65cc29be-d072-4e26-adf4-2f727644da29","1e5348f3-d3ff-42b8-a1b7-0a86d518001a"], "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags/binding' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_ids": ["65cc29be-d072-4e26-adf4-2f727644da29","1e5348f3-d3ff-42b8-a1b7-0a86d518001a"], "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/tags/unbinding'
method='POST'
title='解绑知识库和知识库类型标签'
name='#unbind_dataset_and_knowledge_tag'
/>
<Row>
<Col>
### Request Body
<Properties>
<Property name='tag_id' type='string'>
(text) 标签ID必填
</Property>
<Property name='target_id' type='string'>
(text) 知识库ID必填
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/tags/unbinding"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/tags/unbinding' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"tag_id": "1e5348f3-d3ff-42b8-a1b7-0a86d518001a", "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/tags/unbinding' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"tag_id": "1e5348f3-d3ff-42b8-a1b7-0a86d518001a", "target_id": "a932ea9f-fae1-4b2c-9b65-71c56e2cacd6"}'
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{"result": "success"}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Heading
url='/datasets/<uuid:dataset_id>/tags'
method='POST'
title='查询知识库已绑定的标签'
name='#query_dataset_tags'
/>
<Row>
<Col>
### Path
<Properties>
<Property name='dataset_id' type='string'>
(text) 知识库ID
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup
title="Request"
tag="POST"
label="/datasets/<uuid:dataset_id>/tags"
targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/<uuid:dataset_id>/tags' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n`}
>
```bash {{ title: 'cURL' }}
curl --location --request POST '${props.apiBaseUrl}/datasets/<uuid:dataset_id>/tags' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Response' }}
{
"data":
[
{"id": "4a601f4f-f8a2-4166-ae7c-58c3b252a524",
"name": "123"
},
...
],
"total": 3
}
```
</CodeGroup>
</Col>
</Row>
<hr className='ml-0 mr-0' />
<Row>

View File

@ -5,7 +5,7 @@ import type {
} from '../declarations'
import { useLanguage } from '../hooks'
import { Group } from '@/app/components/base/icons/src/vender/other'
import { OpenaiBlue, OpenaiViolet } from '@/app/components/base/icons/src/public/llm'
import { OpenaiBlue, OpenaiTale, OpenaiViolet, OpenaiYellow } from '@/app/components/base/icons/src/public/llm'
import cn from '@/utils/classnames'
import { renderI18nObject } from '@/i18n'
@ -22,6 +22,10 @@ const ModelIcon: FC<ModelIconProps> = ({
isDeprecated = false,
}) => {
const language = useLanguage()
if (provider?.provider && ['openai', 'langgenius/openai/openai'].includes(provider.provider) && modelName?.startsWith('o'))
return <div className='flex items-center justify-center'><OpenaiYellow className={cn('h-5 w-5', className)} /></div>
if (provider?.provider && ['openai', 'langgenius/openai/openai'].includes(provider.provider) && modelName?.includes('gpt-4.1'))
return <div className='flex items-center justify-center'><OpenaiTale className={cn('h-5 w-5', className)} /></div>
if (provider?.provider && ['openai', 'langgenius/openai/openai'].includes(provider.provider) && modelName?.includes('gpt-4o'))
return <div className='flex items-center justify-center'><OpenaiBlue className={cn('h-5 w-5', className)} /></div>
if (provider?.provider && ['openai', 'langgenius/openai/openai'].includes(provider.provider) && modelName?.startsWith('gpt-4'))

View File

@ -9,6 +9,7 @@ import InstallMulti from './install-multi'
import { useInstallOrUpdate } from '@/service/use-plugins'
import useRefreshPluginList from '../../hooks/use-refresh-plugin-list'
import { useCanInstallPluginFromMarketplace } from '@/app/components/plugins/plugin-page/use-permission'
import { useMittContextSelector } from '@/context/mitt-context'
const i18nPrefix = 'plugin.installModal'
type Props = {
@ -29,6 +30,7 @@ const Install: FC<Props> = ({
isHideButton,
}) => {
const { t } = useTranslation()
const emit = useMittContextSelector(s => s.emit)
const [selectedPlugins, setSelectedPlugins] = React.useState<Plugin[]>([])
const [selectedIndexes, setSelectedIndexes] = React.useState<number[]>([])
const selectedPluginsNum = selectedPlugins.length
@ -63,8 +65,12 @@ const Install: FC<Props> = ({
})
}))
const hasInstallSuccess = res.some(r => r.success)
if (hasInstallSuccess)
if (hasInstallSuccess) {
refreshPluginList(undefined, true)
emit('plugin:install:success', selectedPlugins.map((p) => {
return `${p.plugin_id}/${p.name}`
}))
}
},
})
const handleInstall = () => {

View File

@ -2,7 +2,7 @@
import type { FC } from 'react'
import React, { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { BodyType, type HttpNodeType, Method } from '../types'
import { BodyPayloadValueType, BodyType, type HttpNodeType, Method } from '../types'
import Modal from '@/app/components/base/modal'
import Button from '@/app/components/base/button'
import Textarea from '@/app/components/base/textarea'
@ -51,11 +51,16 @@ const parseCurl = (curlCommand: string): { node: HttpNodeType | null; error: str
case '-d':
case '--data':
case '--data-raw':
case '--data-binary':
case '--data-binary': {
if (i + 1 >= args.length)
return { node: null, error: 'Missing data value after -d, --data, --data-raw, or --data-binary.' }
node.body = { type: BodyType.rawText, data: args[++i].replace(/^['"]|['"]$/g, '') }
const bodyPayload = [{
type: BodyPayloadValueType.text,
value: args[++i].replace(/^['"]|['"]$/g, ''),
}]
node.body = { type: BodyType.rawText, data: bodyPayload }
break
}
case '-F':
case '--form': {
if (i + 1 >= args.length)

View File

@ -28,6 +28,7 @@ const CodeEditor: FC<CodeEditorProps> = ({
const { theme } = useTheme()
const monacoRef = useRef<any>(null)
const editorRef = useRef<any>(null)
const containerRef = useRef<HTMLDivElement>(null)
useEffect(() => {
if (monacoRef.current) {
@ -74,6 +75,19 @@ const CodeEditor: FC<CodeEditorProps> = ({
onUpdate?.(value)
}, [onUpdate])
useEffect(() => {
const resizeObserver = new ResizeObserver(() => {
editorRef.current?.layout()
})
if (containerRef.current)
resizeObserver.observe(containerRef.current)
return () => {
resizeObserver.disconnect()
}
}, [])
return (
<div className={classNames('flex flex-col h-full bg-components-input-bg-normal overflow-hidden', className)}>
<div className='flex items-center justify-between pl-2 pr-1 pt-1'>
@ -102,9 +116,11 @@ const CodeEditor: FC<CodeEditorProps> = ({
</Tooltip>
</div>
</div>
<div className={classNames('relative', editorWrapperClassName)}>
<div
ref={containerRef}
className={classNames('relative overflow-hidden', editorWrapperClassName)}
>
<Editor
height='100%'
defaultLanguage='json'
value={value}
onChange={handleEditorChange}
@ -117,7 +133,6 @@ const CodeEditor: FC<CodeEditorProps> = ({
scrollBeyondLastLine: false,
wordWrap: 'on',
wrappingIndent: 'same',
// Add these options
overviewRulerBorder: false,
hideCursorInOverviewRuler: true,
renderLineHighlightOnlyWhenFocus: false,

View File

@ -21,7 +21,7 @@ import { MittProvider, VisualEditorContextProvider, useMittContext } from './vis
import ErrorMessage from './error-message'
import { useVisualEditorStore } from './visual-editor/store'
import Toast from '@/app/components/base/toast'
import { useGetLanguage } from '@/context/i18n'
import { useGetDocLanguage } from '@/context/i18n'
import { JSON_SCHEMA_MAX_DEPTH } from '@/config'
type JsonSchemaConfigProps = {
@ -47,21 +47,13 @@ const DEFAULT_SCHEMA: SchemaRoot = {
additionalProperties: false,
}
const HELP_DOC_URL = {
zh_Hans: 'https://docs.dify.ai/zh-hans/guides/workflow/structured-outputs',
en_US: 'https://docs.dify.ai/en/guides/workflow/structured-outputs',
ja_JP: 'https://docs.dify.ai/ja-jp/guides/workflow/structured-outputs',
}
type LocaleKey = keyof typeof HELP_DOC_URL
const JsonSchemaConfig: FC<JsonSchemaConfigProps> = ({
defaultSchema,
onSave,
onClose,
}) => {
const { t } = useTranslation()
const locale = useGetLanguage() as LocaleKey
const docLanguage = useGetDocLanguage()
const [currentTab, setCurrentTab] = useState(SchemaView.VisualEditor)
const [jsonSchema, setJsonSchema] = useState(defaultSchema || DEFAULT_SCHEMA)
const [json, setJson] = useState(JSON.stringify(jsonSchema, null, 2))
@ -260,7 +252,7 @@ const JsonSchemaConfig: FC<JsonSchemaConfigProps> = ({
<div className='flex items-center gap-x-2 p-6 pt-5'>
<a
className='flex grow items-center gap-x-1 text-text-accent'
href={HELP_DOC_URL[locale]}
href={`https://docs.dify.ai/${docLanguage}/guides/workflow/structured-outputs`}
target='_blank'
rel='noopener noreferrer'
>

View File

@ -12,7 +12,7 @@ const SchemaEditor: FC<SchemaEditorProps> = ({
}) => {
return (
<CodeEditor
className='rounded-xl'
className='grow rounded-xl'
editorWrapperClassName='grow'
value={schema}
onUpdate={onUpdate}

View File

@ -34,7 +34,7 @@ const UserInput = () => {
return null
return (
<div className={cn('sticky top-0 z-[1] rounded-xl border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg shadow-xs')}>
<div className={cn('relative z-[1] rounded-xl border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg shadow-xs')}>
<div className='px-4 pb-4 pt-3'>
{visibleVariables.map((variable, index) => (
<div

View File

@ -183,7 +183,7 @@ export const MAX_TOOLS_NUM = maxToolsNum
export const DEFAULT_AGENT_SETTING = {
enabled: false,
max_iteration: 5,
max_iteration: 10,
strategy: AgentStrategy.functionCall,
tools: [],
}
@ -305,7 +305,7 @@ else if (globalThis.document?.body?.getAttribute('data-public-loop-node-max-coun
export const LOOP_NODE_MAX_COUNT = loopNodeMaxCount
let maxIterationsNum = 5
let maxIterationsNum = 99
if (process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM && process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM !== '')
maxIterationsNum = Number.parseInt(process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM)

View File

@ -0,0 +1,27 @@
import { createContext, useContext, useContextSelector } from 'use-context-selector'
import { useMitt } from '@/hooks/use-mitt'
import { noop } from 'lodash-es'
type ContextValueType = ReturnType<typeof useMitt>
export const MittContext = createContext<ContextValueType>({
emit: noop,
useSubscribe: noop,
})
export const MittProvider = ({ children }: { children: React.ReactNode }) => {
const mitt = useMitt()
return (
<MittContext.Provider value={mitt}>
{children}
</MittContext.Provider>
)
}
export const useMittContext = () => {
return useContext(MittContext)
}
export function useMittContextSelector<T>(selector: (value: ContextValueType) => T): T {
return useContextSelector(MittContext, selector)
}

View File

@ -216,6 +216,41 @@ const translation = {
moreFillTip: 'Maximal 10 Ebenen der Verschachtelung anzeigen',
LLMResponse: 'LLM-Antwort',
},
accessItemsDescription: {
anyone: 'Jeder kann auf die Webanwendung zugreifen.',
specific: 'Nur bestimmte Gruppen oder Mitglieder können auf die Webanwendung zugreifen.',
organization: 'Jeder in der Organisation kann auf die Webanwendung zugreifen.',
},
accessControlDialog: {
accessItems: {
anyone: 'Jeder mit dem Link',
specific: 'Spezifische Gruppen oder Mitglieder',
organization: 'Nur Mitglieder innerhalb des Unternehmens',
},
operateGroupAndMember: {
searchPlaceholder: 'Gruppen und Mitglieder suchen',
allMembers: 'Alle Mitglieder',
expand: 'Erweitern',
noResult: 'Kein Ergebnis',
},
title: 'Zugriffskontrolle für Webanwendungen',
description: 'Webanwendungszugriffsberechtigungen festlegen',
accessLabel: 'Wer hat Zugang',
groups_one: '{{count}} GRUPPE',
members_one: '{{count}} MITGLIED',
members_other: '{{count}} MITGLIEDER',
noGroupsOrMembers: 'Keine Gruppen oder Mitglieder ausgewählt',
webAppSSONotEnabledTip: 'Bitte kontaktieren Sie den Unternehmensadministrator, um die Authentifizierungsmethode der Webanwendung zu konfigurieren.',
updateSuccess: 'Erfolgreich aktualisiert',
groups_other: '{{count}} GRUPPEN',
},
publishApp: {
title: 'Wer kann auf die Webanwendung zugreifen?',
notSetDesc: 'Derzeit kann niemand auf die Webanwendung zugreifen. Bitte setzen Sie die Berechtigungen.',
notSet: 'Nicht festgelegt',
},
accessControl: 'Zugriffskontrolle für Webanwendungen',
noAccessPermission: 'Keine Berechtigung zum Zugriff auf die Webanwendung',
}
export default translation

View File

@ -145,6 +145,8 @@ const translation = {
newDataset: 'Wissen erstellen',
tools: 'Werkzeuge',
exploreMarketplace: 'Marketplace erkunden',
appDetail: 'App-Details',
account: 'Konto',
},
userProfile: {
settings: 'Einstellungen',
@ -550,7 +552,7 @@ const translation = {
vectorHash: 'Vektorhash:',
hitScore: 'Abrufwertung:',
},
inputPlaceholder: 'Sprechen Sie mit dem Bot',
inputPlaceholder: 'Sprechen Sie mit dem {{botName}}',
thought: 'Gedanke',
thinking: 'Denken...',
resend: 'Erneut senden',
@ -644,6 +646,7 @@ const translation = {
license: {
expiring: 'Läuft an einem Tag ab',
expiring_plural: 'Läuft in {{count}} Tagen ab',
unlimited: 'Unbegrenzt',
},
pagination: {
perPage: 'Artikel pro Seite',
@ -667,6 +670,7 @@ const translation = {
browse: 'blättern',
supportedFormats: 'Unterstützt PNG, JPG, JPEG, WEBP und GIF',
},
you: 'Du',
}
export default translation

View File

@ -105,6 +105,11 @@ const translation = {
licenseInactiveTip: 'Die Dify Enterprise-Lizenz für Ihren Arbeitsbereich ist inaktiv. Wenden Sie sich an Ihren Administrator, um Dify weiterhin zu verwenden.',
licenseExpiredTip: 'Die Dify Enterprise-Lizenz für Ihren Arbeitsbereich ist abgelaufen. Wenden Sie sich an Ihren Administrator, um Dify weiterhin zu verwenden.',
licenseLost: 'Lizenz verloren',
webapp: {
noLoginMethod: 'Authentifizierungsmethode ist nicht für die Webanwendung konfiguriert',
noLoginMethodTip: 'Bitte kontaktieren Sie den Systemadministrator, um eine Authentifizierungsmethode hinzuzufügen.',
disabled: 'Die Webanmeldeauthentifizierung ist deaktiviert. Bitte kontaktieren Sie den Systemadministrator, um sie zu aktivieren. Sie können versuchen, die App direkt zu verwenden.',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
uninstalledTitle: 'Tool nicht installiert',
toolLabel: 'Werkzeug',
uninstalledContent: 'Dieses Plugin wird aus dem lokalen/GitHub-Repository installiert. Bitte nach der Installation verwenden.',
toolSetting: 'Werkzeugs Einstellungen',
},
strategyNum: '{{num}} {{Strategie}} IINKLUSIVE',
configureApp: 'App konfigurieren',
@ -210,6 +211,7 @@ const translation = {
title: 'Plugins',
},
difyVersionNotCompatible: 'Die aktuelle Dify-Version ist mit diesem Plugin nicht kompatibel, bitte aktualisieren Sie auf die erforderliche Mindestversion: {{minimalDifyVersion}}',
requestAPlugin: 'Ein Plugin anfordern',
}
export default translation

View File

@ -660,6 +660,7 @@ const translation = {
},
json: 'von einem Tool generiertes JSON',
},
authorize: 'Autorisieren',
},
questionClassifiers: {
model: 'Modell',

View File

@ -573,7 +573,7 @@ const translation = {
vectorHash: 'Vector hash:',
hitScore: 'Retrieval Score:',
},
inputPlaceholder: 'Talk to Bot',
inputPlaceholder: 'Talk to {{botName}}',
thinking: 'Thinking...',
thought: 'Thought',
resend: 'Resend',

View File

@ -208,6 +208,41 @@ const translation = {
structuredTip: 'Las Salidas Estructuradas son una función que garantiza que el modelo siempre generará respuestas que se ajusten a su esquema JSON proporcionado.',
modelNotSupported: 'Modelo no soportado',
},
accessItemsDescription: {
anyone: 'Cualquiera puede acceder a la aplicación web.',
specific: 'Solo grupos o miembros específicos pueden acceder a la aplicación web',
organization: 'Cualquiera en la organización puede acceder a la aplicación web',
},
accessControlDialog: {
accessItems: {
anyone: 'Cualquiera con el enlace',
specific: 'Grupos o miembros específicos',
organization: 'Solo miembros dentro de la empresa',
},
operateGroupAndMember: {
searchPlaceholder: 'Buscar grupos y miembros',
allMembers: 'Todos los miembros',
expand: 'Expandir',
noResult: 'Sin resultado',
},
title: 'Control de Acceso a la Aplicación Web',
description: 'Establecer permisos de acceso a la aplicación web',
accessLabel: '¿Quién tiene acceso?',
groups_one: '{{count}} GRUPO',
groups_other: '{{count}} GRUPOS',
members_one: '{{count}} MIEMBRO',
members_other: '{{count}} MIEMBROS',
noGroupsOrMembers: 'No grupos o miembros seleccionados',
webAppSSONotEnabledTip: 'Por favor, contacte al administrador de la empresa para configurar el método de autenticación de la aplicación web.',
updateSuccess: 'Actualización exitosa',
},
publishApp: {
title: '¿Quién puede acceder a la aplicación web?',
notSet: 'No establecido',
notSetDesc: 'Actualmente nadie puede acceder a la aplicación web. Por favor, configure los permisos.',
},
accessControl: 'Control de Acceso a la Aplicación Web',
noAccessPermission: 'No se permite el acceso a la aplicación web',
}
export default translation

View File

@ -149,6 +149,8 @@ const translation = {
newDataset: 'Crear Conocimiento',
tools: 'Herramientas',
exploreMarketplace: 'Explora el mercado',
appDetail: 'Detalles de la aplicación',
account: 'Cuenta',
},
userProfile: {
settings: 'Configuraciones',
@ -554,7 +556,7 @@ const translation = {
vectorHash: 'Hash de vector:',
hitScore: 'Puntuación de recuperación:',
},
inputPlaceholder: 'Hablar con el bot',
inputPlaceholder: 'Hablar con el {{botName}}',
thinking: 'Pensamiento...',
thought: 'Pensamiento',
resend: 'Reenviar',
@ -666,6 +668,7 @@ const translation = {
browse: 'navegar',
dropImageHere: 'Deja tu imagen aquí, o',
},
you: 'Tú',
}
export default translation

View File

@ -105,6 +105,11 @@ const translation = {
licenseLost: 'Licencia perdida',
licenseExpiredTip: 'La licencia de Dify Enterprise para su espacio de trabajo ha caducado. Póngase en contacto con su administrador para seguir utilizando Dify.',
licenseLostTip: 'No se pudo conectar el servidor de licencias de Dife. Póngase en contacto con su administrador para seguir utilizando Dify.',
webapp: {
disabled: 'La autenticación de la aplicación web está desactivada. Por favor, contacte al administrador del sistema para habilitarla. Puede intentar usar la aplicación directamente.',
noLoginMethodTip: 'Por favor, contacta al administrador del sistema para agregar un método de autenticación.',
noLoginMethod: 'Método de autenticación no configurado para la aplicación web',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
unsupportedTitle: 'Acción no admitida',
params: 'CONFIGURACIÓN DE RAZONAMIENTO',
uninstalledLink: 'Administrar en Plugins',
toolSetting: 'Configuraciones de la herramienta',
},
endpointDeleteContent: '¿Te gustaría eliminar {{nombre}}?',
endpointDisableTip: 'Deshabilitar punto de conexión',
@ -210,6 +211,7 @@ const translation = {
title: 'Complementos',
},
difyVersionNotCompatible: 'La versión actual de Dify no es compatible con este plugin, por favor actualiza a la versión mínima requerida: {{minimalDifyVersion}}',
requestAPlugin: 'Solicitar un plugin',
}
export default translation

View File

@ -658,6 +658,7 @@ const translation = {
},
json: 'JSON generado por la herramienta',
},
authorize: 'autorizar',
},
questionClassifiers: {
model: 'modelo',

View File

@ -209,6 +209,41 @@ const translation = {
modelNotSupportedTip: 'مدل فعلی این ویژگی را پشتیبانی نمی‌کند و به‌طور خودکار به تزریق درخواست تنزل پیدا می‌کند.',
structuredTip: 'خروجی‌های ساختاری یک ویژگی است که تضمین می‌کند مدل همیشه پاسخ‌هایی تولید می‌کند که به طرح JSON ارائه شده شما پایبند باشد.',
},
accessItemsDescription: {
specific: 'فقط گروه‌ها یا اعضای خاصی می‌توانند به اپلیکیشن وب دسترسی پیدا کنند.',
anyone: 'هر کسی می‌تواند به وب‌اپلیکیشن دسترسی پیدا کند',
organization: 'هر کسی در سازمان می‌تواند به اپلیکیشن وب دسترسی پیدا کند.',
},
accessControlDialog: {
accessItems: {
specific: 'گروه‌ها یا اعضای خاص',
organization: 'فقط اعضای داخل سازمان',
anyone: 'هر کسی که لینک را داشته باشد',
},
operateGroupAndMember: {
searchPlaceholder: 'گروه‌ها و اعضا را جستجو کنید',
allMembers: 'تمام اعضا',
noResult: 'نتیجه‌ای نیست',
expand: 'گسترش',
},
description: 'مجوزهای دسترسی به برنامه وب را تنظیم کنید',
accessLabel: 'چه کسی به آن دسترسی دارد',
groups_one: '{{count}} گروه',
groups_other: '{{count}} گروه',
members_one: '{{count}} عضو',
members_other: '{{count}} عضو',
noGroupsOrMembers: 'هیچ گروه یا عضوی انتخاب نشده است',
title: 'کنترل دسترسی به وب اپلیکیشن',
updateSuccess: 'به‌روز رسانی با موفقیت انجام شد',
webAppSSONotEnabledTip: 'لطفاً با مدیر شرکت تماس بگیرید تا روش احراز هویت برنامه وب را پیکربندی کند.',
},
publishApp: {
notSet: 'تنظیم نشده است',
notSetDesc: 'در حال حاضر هیچ‌کس نمی‌تواند به برنامه وب دسترسی پیدا کند. لطفاً مجوزها را تنظیم کنید.',
title: 'چه کسی می‌تواند به برنامه وب دسترسی داشته باشد؟',
},
accessControl: 'کنترل دسترسی به وب اپلیکیشن',
noAccessPermission: 'دسترسی به برنامه وب مجاز نیست',
}
export default translation

View File

@ -149,6 +149,8 @@ const translation = {
newDataset: 'ایجاد دانش',
tools: 'ابزارها',
exploreMarketplace: 'بازار را کاوش کنید',
appDetail: 'جزئیات برنامه',
account: 'حساب',
},
userProfile: {
settings: 'تنظیمات',
@ -644,6 +646,7 @@ const translation = {
license: {
expiring_plural: 'انقضا در {{count}} روز',
expiring: 'انقضا در یک روز',
unlimited: 'نامحدود',
},
pagination: {
perPage: 'موارد در هر صفحه',
@ -667,6 +670,7 @@ const translation = {
supportedFormats: 'از فرمت‌های PNG، JPG، JPEG، WEBP و GIF پشتیبانی می‌کند',
browse: 'مرورگر',
},
you: 'تو',
}
export default translation

View File

@ -105,6 +105,11 @@ const translation = {
licenseExpiredTip: 'مجوز Dify Enterprise برای فضای کاری شما منقضی شده است. لطفا برای ادامه استفاده از Dify با سرپرست خود تماس بگیرید.',
licenseInactiveTip: 'مجوز Dify Enterprise برای فضای کاری شما غیرفعال است. لطفا برای ادامه استفاده از Dify با سرپرست خود تماس بگیرید.',
licenseLostTip: 'اتصال سرور مجوز Dify انجام نشد. لطفا برای ادامه استفاده از Dify با سرپرست خود تماس بگیرید.',
webapp: {
disabled: 'احراز هویت وب اپ غیرفعال است. لطفاً با مدیر سیستم تماس بگیرید تا آن را فعال کند. می‌توانید سعی کنید مستقیماً از اپلیکیشن استفاده کنید.',
noLoginMethodTip: 'لطفاً با مدیر سیستم تماس بگیرید تا یک روش احراز هویت اضافه کند.',
noLoginMethod: 'روش احراز هویت برای برنامه وب پیکربندی نشده است',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
uninstalledContent: 'این افزونه از مخزن local/GitHub نصب شده است. لطفا پس از نصب استفاده کنید.',
unsupportedTitle: 'اکشن پشتیبانی نشده',
unsupportedContent2: 'برای تغییر نسخه کلیک کنید.',
toolSetting: 'تنظیمات ابزار',
},
endpointDeleteTip: 'حذف نقطه پایانی',
disabled: 'غیر فعال',
@ -210,6 +211,7 @@ const translation = {
title: 'پلاگین ها',
},
difyVersionNotCompatible: 'نسخه فعلی دیفی با این پلاگین سازگار نیست، لطفاً به نسخه حداقل مورد نیاز به‌روزرسانی کنید: {{minimalDifyVersion}}',
requestAPlugin: 'درخواست یک افزونه',
}
export default translation

View File

@ -660,6 +660,7 @@ const translation = {
},
json: 'json تولید شده توسط ابزار',
},
authorize: 'مجوز دادن',
},
questionClassifiers: {
model: 'مدل',

View File

@ -208,6 +208,41 @@ const translation = {
moreFillTip: 'Affichage d\'un maximum de 10 niveaux d\'imbrication',
configure: 'Configurer',
},
accessItemsDescription: {
anyone: 'Tout le monde peut accéder à l\'application web.',
specific: 'Seules des groupes ou membres spécifiques peuvent accéder à l\'application web.',
organization: 'Toute personne dans l\'organisation peut accéder à l\'application web.',
},
accessControlDialog: {
accessItems: {
anyone: 'Quiconque avec le lien',
specific: 'Groupes ou membres spécifiques',
organization: 'Seuls les membres au sein de l\'entreprise',
},
operateGroupAndMember: {
searchPlaceholder: 'Rechercher des groupes et des membres',
allMembers: 'Tous les membres',
expand: 'Développer',
noResult: 'Aucun résultat',
},
title: 'Contrôle d\'accès à l\'application Web',
description: 'Définir les autorisations d\'accès à l\'application web',
accessLabel: 'Qui a accès',
groups_one: '{{count}} GROUPE',
groups_other: '{{count}} GROUPES',
members_one: '{{count}} MEMBRE',
members_other: '{{count}} MEMBRES',
noGroupsOrMembers: 'Aucun groupe ou membre sélectionné',
webAppSSONotEnabledTip: 'Veuillez contacter l\'administrateur de l\'entreprise pour configurer la méthode d\'authentification de l\'application web.',
updateSuccess: 'Mise à jour réussie',
},
publishApp: {
title: 'Qui peut accéder à l\'application web',
notSet: 'Non défini',
notSetDesc: 'Actuellement, personne ne peut accéder à l\'application web. Veuillez définir les autorisations.',
},
accessControl: 'Contrôle d\'accès à l\'application Web',
noAccessPermission: 'Pas de permission d\'accéder à l\'application web',
}
export default translation

View File

@ -145,6 +145,8 @@ const translation = {
newDataset: 'Créer des Connaissances',
tools: 'Outils',
exploreMarketplace: 'Explorer Marketplace',
appDetail: 'Détails de l\'application',
account: 'Compte',
},
userProfile: {
settings: 'Paramètres',
@ -550,7 +552,7 @@ const translation = {
vectorHash: 'Hachage vectoriel:',
hitScore: 'Score de Récupération:',
},
inputPlaceholder: 'Parler au bot',
inputPlaceholder: 'Parler au {{botName}}',
thinking: 'Pensée...',
thought: 'Pensée',
resend: 'Renvoyer',
@ -644,6 +646,7 @@ const translation = {
license: {
expiring: 'Expirant dans un jour',
expiring_plural: 'Expirant dans {{count}} jours',
unlimited: 'Illimité',
},
pagination: {
perPage: 'Articles par page',
@ -667,6 +670,7 @@ const translation = {
dropImageHere: 'Déposez votre image ici, ou',
supportedFormats: 'Prend en charge PNG, JPG, JPEG, WEBP et GIF',
},
you: 'Vous',
}
export default translation

View File

@ -203,6 +203,7 @@ const translation = {
values: '{{num}} Valeurs',
deleteContent: 'Êtes-vous sûr de vouloir supprimer les métadonnées "{{name}}" ?',
name: 'Nom',
disabled: 'handicapés',
},
documentMetadata: {
technicalParameters: 'Paramètres techniques',

View File

@ -105,6 +105,11 @@ const translation = {
licenseLost: 'Licence perdue',
licenseExpiredTip: 'La licence Dify Enterprise de votre espace de travail a expiré. Veuillez contacter votre administrateur pour continuer à utiliser Dify.',
licenseInactive: 'Licence inactive',
webapp: {
noLoginMethodTip: 'Veuillez contacter l\'administrateur système pour ajouter une méthode d\'authentification.',
noLoginMethod: 'Méthode d\'authentification non configurée pour l\'application web',
disabled: 'L\'authentification de l\'application web est désactivée. Veuillez contacter l\'administrateur du système pour l\'activer. Vous pouvez essayer d\'utiliser l\'application directement.',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
settings: 'PARAMÈTRES UTILISATEUR',
paramsTip2: 'Lorsque « Automatique » est désactivé, la valeur par défaut est utilisée.',
paramsTip1: 'Contrôle les paramètres dinférence LLM.',
toolSetting: 'Paramètres de l\'outil',
},
modelNum: '{{num}} MODÈLES INCLUS',
endpointDeleteTip: 'Supprimer le point de terminaison',
@ -210,6 +211,7 @@ const translation = {
title: 'Plugins',
},
difyVersionNotCompatible: 'La version actuelle de Dify n\'est pas compatible avec ce plugin, veuillez mettre à niveau vers la version minimale requise : {{minimalDifyVersion}}',
requestAPlugin: 'Demander un plugin',
}
export default translation

View File

@ -659,6 +659,7 @@ const translation = {
},
json: 'JSON généré par un outil',
},
authorize: 'Autoriser',
},
questionClassifiers: {
model: 'modèle',

View File

@ -209,6 +209,41 @@ const translation = {
structuredTip: 'संरचित आउटपुट एक विशेषता है जो यह सुनिश्चित करती है कि मॉडल हमेशा आपके प्रदान किए गए JSON स्कीमा के अनुसार प्रतिक्रियाएँ生成 करेगा।',
modelNotSupportedTip: 'वर्तमान मॉडल इस सुविधा का समर्थन नहीं करता है और स्वचालित रूप से प्रॉम्प्ट इंजेक्शन में डाउनग्रेड किया जाता है।',
},
accessItemsDescription: {
anyone: 'कोई भी वेब ऐप तक पहुँच सकता है',
organization: 'संस्थान के किसी भी व्यक्ति को वेब ऐप तक पहुंच प्राप्त है',
specific: 'केवल विशेष समूह या सदस्य ही वेब ऐप तक पहुंच सकते हैं',
},
accessControlDialog: {
accessItems: {
anyone: 'लिंक के साथ कोई भी',
specific: 'विशिष्ट समूह या सदस्य',
organization: 'केवल उद्यम के भीतर के सदस्य',
},
operateGroupAndMember: {
searchPlaceholder: 'समूहों और सदस्यों की खोज करें',
allMembers: 'सभी सदस्य',
expand: 'व्याप्त करें',
noResult: 'कोई परिणाम नहीं',
},
title: 'वेब एप्लिकेशन पहुँच नियंत्रण',
description: 'वेब ऐप एक्सेस अनुमतियाँ सेट करें',
groups_one: '{{count}} समूह',
groups_other: '{{count}} समूह',
members_one: '{{count}} सदस्य',
members_other: '{{count}} सदस्य',
noGroupsOrMembers: 'कोई समूह या सदस्य चयनित नहीं किया गया',
updateSuccess: 'सफलता से अपडेट किया गया',
accessLabel: 'किसके पास पहुँच है',
webAppSSONotEnabledTip: 'कृपया वेब ऐप प्रमाणीकरण विधि कॉन्फ़िगर करने के लिए उद्यम प्रशासक से संपर्क करें।',
},
publishApp: {
title: 'वेब ऐप तक कौन पहुँच सकता है',
notSet: 'अनुबंधित नहीं किया गया',
notSetDesc: 'वर्तमान में कोई भी वेब ऐप तक पहुंच नहीं बना सकता। कृपया अनुमतियाँ सेट करें।',
},
accessControl: 'वेब एप्लिकेशन पहुँच नियंत्रण',
noAccessPermission: 'वेब एप्लिकेशन तक पहुँचने की अनुमति नहीं है',
}
export default translation

View File

@ -154,6 +154,8 @@ const translation = {
newDataset: 'ज्ञान बनाएं',
tools: 'उपकरण',
exploreMarketplace: 'मार्केटप्लेस का अन्वेषण करें',
appDetail: 'ऐप विवरण',
account: 'खाता',
},
userProfile: {
settings: 'सेटिंग्स',
@ -666,6 +668,7 @@ const translation = {
license: {
expiring: 'एक दिन में समाप्त हो रहा है',
expiring_plural: '{{गिनती}} दिनों में समाप्त हो रहा है',
unlimited: 'असीमित',
},
pagination: {
perPage: 'प्रति पृष्ठ आइटम',
@ -689,6 +692,7 @@ const translation = {
browse: 'ब्राउज़ करें',
dropImageHere: 'अपनी छवि यहाँ छोड़ें, या',
},
you: 'आप',
}
export default translation

View File

@ -110,6 +110,11 @@ const translation = {
licenseLostTip: 'Dify लायसेंस सर्वर से कनेक्ट करने में विफल. Dify का उपयोग जारी रखने के लिए कृपया अपने व्यवस्थापक से संपर्क करें.',
licenseInactiveTip: 'आपके कार्यस्थल के लिए डिफाई एंटरप्राइज लाइसेंस निष्क्रिय है। कृपया डिफाई का उपयोग जारी रखने के लिए अपने प्रशासक से संपर्क करें।',
licenseExpiredTip: 'आपके कार्यस्थल के लिए डिफाई एंटरप्राइज लाइसेंस समाप्त हो गया है। कृपया डिफाई का उपयोग जारी रखने के लिए अपने प्रशासक से संपर्क करें।',
webapp: {
noLoginMethodTip: 'कृपया एक प्रमाणीकरण विधि जोड़ने के लिए सिस्टम प्रशासक से संपर्क करें।',
noLoginMethod: 'वेब ऐप के लिए प्रमाणीकरण विधि कॉन्फ़िगर नहीं की गई है',
disabled: 'वेब ऐप प्रमाणीकरण अक्षम है। कृपया इसे सक्षम करने के लिए सिस्टम प्रशासक से संपर्क करें। आप सीधे ऐप का उपयोग करने की कोशिश कर सकते हैं।',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
paramsTip2: 'जब \'स्वचालित\' बंद होता है, तो डिफ़ॉल्ट मान का उपयोग किया जाता है।',
descriptionPlaceholder: 'उपकरण के उद्देश्य का संक्षिप्त विवरण, जैसे, किसी विशेष स्थान के लिए तापमान प्राप्त करना।',
paramsTip1: 'एलएलएम अनुमान पैरामीटर को नियंत्रित करता है।',
toolSetting: 'टूल सेटिंग्स',
},
switchVersion: 'स्विच संस्करण',
endpointModalDesc: 'एक बार कॉन्फ़िगर होने के बाद, प्लगइन द्वारा API एंडपॉइंट्स के माध्यम से प्रदान की गई सुविधाओं का उपयोग किया जा सकता है।',
@ -210,6 +211,7 @@ const translation = {
title: 'प्लगइन्स',
},
difyVersionNotCompatible: 'वर्तमान डिफाई संस्करण इस प्लगइन के साथ संगत नहीं है, कृपया आवश्यक न्यूनतम संस्करण में अपग्रेड करें: {{minimalDifyVersion}}',
requestAPlugin: 'एक प्लगइन का अनुरोध करें',
}
export default translation

View File

@ -676,6 +676,7 @@ const translation = {
},
json: 'उपकरण द्वारा उत्पन्न JSON',
},
authorize: 'अधिकृत करें',
},
questionClassifiers: {
model: 'मॉडल',

View File

@ -220,6 +220,41 @@ const translation = {
notConfiguredTip: 'L\'output strutturato non è stato ancora configurato.',
modelNotSupportedTip: 'Il modello attuale non supporta questa funzione e viene automaticamente downgradato a iniezione di prompt.',
},
accessItemsDescription: {
anyone: 'Chiunque può accedere all\'app web',
specific: 'Solo gruppi o membri specifici possono accedere all\'app web.',
organization: 'Qualsiasi persona nell\'organizzazione può accedere all\'app web',
},
accessControlDialog: {
accessItems: {
anyone: 'Chiunque con il link',
specific: 'Gruppi o membri specifici',
organization: 'Solo i membri all\'interno dell\'impresa',
},
operateGroupAndMember: {
searchPlaceholder: 'Cerca gruppi e membri',
allMembers: 'Tutti i membri',
expand: 'Espandere',
noResult: 'Nessun risultato',
},
title: 'Controllo di accesso all\'app web',
description: 'Imposta le autorizzazioni di accesso all\'app web',
accessLabel: 'Chi ha accesso',
groups_one: '{{count}} GRUPPO',
groups_other: '{{count}} GRUPPI',
members_one: '{{count}} MEMBRO',
members_other: '{{count}} MEMBRI',
noGroupsOrMembers: 'Nessun gruppo o membro selezionato',
webAppSSONotEnabledTip: 'Si prega di contattare l\'amministratore dell\'impresa per configurare il metodo di autenticazione dell\'app web.',
updateSuccess: 'Aggiornamento avvenuto con successo',
},
publishApp: {
title: 'Chi può accedere all\'app web',
notSet: 'Non impostato',
notSetDesc: 'Attualmente nessuno può accedere all\'app web. Si prega di impostare i permessi.',
},
accessControl: 'Controllo di accesso all\'app web',
noAccessPermission: 'Nessun permesso per accedere all\'app web',
}
export default translation

View File

@ -154,6 +154,8 @@ const translation = {
newDataset: 'Crea Conoscenza',
tools: 'Strumenti',
exploreMarketplace: 'Esplora il Marketplace',
appDetail: 'Dettagli dell\'app',
account: 'Account',
},
userProfile: {
settings: 'Impostazioni',
@ -581,7 +583,7 @@ const translation = {
vectorHash: 'Hash del vettore:',
hitScore: 'Punteggio di recupero:',
},
inputPlaceholder: 'Parla con il bot',
inputPlaceholder: 'Parla con il {{botName}}',
thinking: 'Pensante...',
thought: 'Pensiero',
resend: 'Reinvia',
@ -675,6 +677,7 @@ const translation = {
license: {
expiring_plural: 'Scadenza tra {{count}} giorni',
expiring: 'Scadenza in un giorno',
unlimited: 'Illimitato',
},
pagination: {
perPage: 'Articoli per pagina',
@ -698,6 +701,7 @@ const translation = {
browse: 'sfogliare',
dropImageHere: 'Trascina la tua immagine qui, oppure',
},
you: 'Tu',
}
export default translation

View File

@ -115,6 +115,11 @@ const translation = {
licenseExpiredTip: 'La licenza Dify Enterprise per la tua area di lavoro è scaduta. Contatta il tuo amministratore per continuare a utilizzare Dify.',
licenseInactiveTip: 'La licenza Dify Enterprise per la tua area di lavoro è inattiva. Contatta il tuo amministratore per continuare a utilizzare Dify.',
licenseInactive: 'Licenza inattiva',
webapp: {
noLoginMethod: 'Metodo di autenticazione non configurato per l\'app web',
noLoginMethodTip: 'Si prega di contattare l\'amministratore del sistema per aggiungere un metodo di autenticazione.',
disabled: 'L\'autenticazione dell\'app web è disabilitata. Si prega di contattare l\'amministratore di sistema per abilitarla. Puoi provare a utilizzare l\'app direttamente.',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
descriptionLabel: 'Descrizione dell\'utensile',
auto: 'Automatico',
paramsTip2: 'Quando \'Automatico\' è disattivato, viene utilizzato il valore predefinito.',
toolSetting: 'Impostazioni degli strumenti',
},
modelNum: '{{num}} MODELLI INCLUSI',
endpointModalTitle: 'Endpoint di configurazione',
@ -210,6 +211,7 @@ const translation = {
title: 'Plugin',
},
difyVersionNotCompatible: 'L\'attuale versione di Dify non è compatibile con questo plugin, si prega di aggiornare alla versione minima richiesta: {{minimalDifyVersion}}',
requestAPlugin: 'Richiedi un plugin',
}
export default translation

View File

@ -679,6 +679,7 @@ const translation = {
},
json: 'json generato dallo strumento',
},
authorize: 'Autorizza',
},
questionClassifiers: {
model: 'modello',

View File

@ -570,7 +570,7 @@ const translation = {
vectorHash: 'ベクトルハッシュ:',
hitScore: '検索スコア:',
},
inputPlaceholder: 'ボットと話す',
inputPlaceholder: '{{botName}} と話す',
thought: '思考',
thinking: '考え中...',
resend: '再送信してください',
@ -660,6 +660,7 @@ const translation = {
license: {
expiring_plural: '有効期限 {{count}} 日',
expiring: '1日で有効期限が切れます',
unlimited: '無制限',
},
pagination: {
perPage: 'ページあたりのアイテム数',

View File

@ -62,6 +62,7 @@ const translation = {
paramsTip1: 'LLM推論パラメータを制御します。',
toolLabel: '道具',
unsupportedTitle: 'サポートされていないアクション',
toolSetting: 'ツール設定',
},
endpointDisableTip: 'エンドポイントを無効にする',
endpointModalDesc: '設定が完了すると、APIエンドポイントを介してプラグインが提供する機能を使用できます。',
@ -210,6 +211,7 @@ const translation = {
metadata: {
title: 'プラグイン',
},
requestAPlugin: 'プラグインをリクエストする',
}
export default translation

View File

@ -666,6 +666,7 @@ const translation = {
},
json: 'ツールで生成されたJSON',
},
authorize: '認証する',
},
questionClassifiers: {
model: 'モデル',

View File

@ -205,6 +205,41 @@ const translation = {
modelNotSupportedTip: '현재 모델은 이 기능을 지원하지 않으며 자동으로 프롬프트 주입으로 다운그레이드됩니다.',
structuredTip: '구조화된 출력은 모델이 제공한 JSON 스키마를 항상 준수하는 응답을 생성하도록 보장하는 기능입니다.',
},
accessItemsDescription: {
anyone: '누구나 웹 앱에 접근할 수 있습니다.',
specific: '특정 그룹이나 회원만 웹 앱에 접근할 수 있습니다.',
organization: '조직 내 모든 사람이 웹 애플리케이션에 접근할 수 있습니다.',
},
accessControlDialog: {
accessItems: {
anyone: '링크가 있는 누구나',
specific: '특정 그룹 또는 구성원',
organization: '기업 내의 회원만',
},
operateGroupAndMember: {
searchPlaceholder: '그룹 및 구성원 검색',
allMembers: '모든 멤버들',
expand: '확장하다',
noResult: '결과 없음',
},
title: '웹 애플리케이션 접근 제어',
accessLabel: '누가 접근할 수 있습니까?',
groups_one: '{{count}} 그룹',
groups_other: '{{count}} 그룹',
members_one: '{{count}} 회원',
members_other: '{{count}} 회원',
noGroupsOrMembers: '선택된 그룹 또는 멤버가 없습니다.',
webAppSSONotEnabledTip: '웹 앱 인증 방법을 구성하려면 엔터프라이즈 관리자인에게 문의하십시오.',
updateSuccess: '업데이트가 성공적으로 완료되었습니다.',
description: '웹 앱 접근 권한 설정',
},
publishApp: {
title: '누가 웹 애플리케이션에 접근할 수 있나요?',
notSet: '설정되지 않음',
notSetDesc: '현재 아무도 웹 앱에 접근할 수 없습니다. 권한을 설정해 주세요.',
},
accessControl: '웹 애플리케이션 접근 제어',
noAccessPermission: '웹 앱에 대한 접근 권한이 없습니다.',
}
export default translation

View File

@ -141,6 +141,8 @@ const translation = {
newDataset: '지식 만들기',
tools: '도구',
exploreMarketplace: 'Marketplace 둘러보기',
appDetail: '앱 세부정보',
account: '계정',
},
userProfile: {
settings: '설정',
@ -640,6 +642,7 @@ const translation = {
license: {
expiring_plural: '{{count}}일 후에 만료',
expiring: '하루 후에 만료',
unlimited: '무제한',
},
pagination: {
perPage: '페이지당 항목 수',
@ -663,6 +666,7 @@ const translation = {
browse: '브라우즈',
dropImageHere: '여기에 이미지를 드롭하거나',
},
you: '너',
}
export default translation

View File

@ -105,6 +105,11 @@ const translation = {
licenseInactive: 'License Inactive(라이선스 비활성)',
licenseExpired: '라이센스가 만료되었습니다.',
licenseExpiredTip: '작업 영역에 대한 Dify Enterprise 라이선스가 만료되었습니다. Dify를 계속 사용하려면 관리자에게 문의하십시오.',
webapp: {
noLoginMethod: '웹 애플리케이션에 대한 인증 방법이 구성되어 있지 않습니다.',
disabled: '웹앱 인증이 비활성화되었습니다. 이를 활성화하려면 시스템 관리자에게 문의하십시오. 앱을 직접 사용해 볼 수 있습니다.',
noLoginMethodTip: '인증 방법을 추가하려면 시스템 관리자에게 연락하십시오.',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
placeholder: '도구 선택...',
paramsTip2: '\'자동\'이 꺼져 있으면 기본값이 사용됩니다.',
unsupportedContent: '설치된 플러그인 버전은 이 작업을 제공하지 않습니다.',
toolSetting: '도구 설정',
},
configureApp: '앱 구성',
strategyNum: '{{번호}} {{전략}} 포함',
@ -210,6 +211,7 @@ const translation = {
title: '플러그인',
},
difyVersionNotCompatible: '현재 Dify 버전이 이 플러그인과 호환되지 않습니다. 필요한 최소 버전으로 업그레이드하십시오: {{minimalDifyVersion}}',
requestAPlugin: '플러그인을 요청하세요',
}
export default translation

View File

@ -660,6 +660,7 @@ const translation = {
},
json: '도구로 생성된 JSON',
},
authorize: '권한 부여',
},
questionClassifiers: {
model: '모델',

View File

@ -216,6 +216,41 @@ const translation = {
modelNotSupported: 'Model nie jest obsługiwany',
modelNotSupportedTip: 'Aktualny model nie obsługuje tej funkcji i zostaje automatycznie obniżony do wstrzyknięcia zapytania.',
},
accessItemsDescription: {
anyone: 'Każdy może uzyskać dostęp do aplikacji webowej',
specific: 'Tylko określone grupy lub członkowie mogą uzyskać dostęp do aplikacji internetowej',
organization: 'Każdy w organizacji ma dostęp do aplikacji internetowej.',
},
accessControlDialog: {
accessItems: {
anyone: 'Każdy z linkiem',
specific: 'Specyficzne grupy lub członkowie',
organization: 'Tylko członkowie w obrębie przedsiębiorstwa',
},
operateGroupAndMember: {
searchPlaceholder: 'Szukaj grup i członków',
allMembers: 'Wszyscy członkowie',
expand: 'Rozszerz',
noResult: 'Brak wyniku',
},
title: 'Kontrola dostępu do aplikacji internetowej',
description: 'Ustaw uprawnienia dostępu do aplikacji webowej',
accessLabel: 'Kto ma dostęp',
groups_one: '{{count}} GRUPA',
groups_other: '{{count}} GRUPY',
members_one: '{{count}} CZŁONEK',
members_other: '{{count}} CZŁONKÓW',
noGroupsOrMembers: 'Nie wybrano żadnych grup ani członków',
webAppSSONotEnabledTip: 'Proszę skontaktować się z administratorem przedsiębiorstwa, aby skonfigurować metodę uwierzytelniania aplikacji internetowej.',
updateSuccess: 'Aktualizacja powiodła się',
},
publishApp: {
title: 'Kto ma dostęp do aplikacji internetowej',
notSet: 'Nie ustawiono',
notSetDesc: 'Obecnie nikt nie może uzyskać dostępu do aplikacji internetowej. Proszę ustawić uprawnienia.',
},
accessControl: 'Kontrola dostępu do aplikacji internetowej',
noAccessPermission: 'Brak uprawnień do dostępu do aplikacji internetowej',
}
export default translation

View File

@ -150,6 +150,8 @@ const translation = {
newDataset: 'Utwórz Wiedzę',
tools: 'Narzędzia',
exploreMarketplace: 'Zapoznaj się z Marketplace',
appDetail: 'Szczegóły aplikacji',
account: 'klient',
},
userProfile: {
settings: 'Ustawienia',
@ -565,7 +567,7 @@ const translation = {
vectorHash: 'Wektor hash:',
hitScore: 'Wynik trafień:',
},
inputPlaceholder: 'Porozmawiaj z botem',
inputPlaceholder: 'Porozmawiaj z {{botName}}',
thought: 'Myśl',
thinking: 'Myślenie...',
resend: 'Prześlij ponownie',
@ -662,6 +664,7 @@ const translation = {
license: {
expiring_plural: 'Wygasa za {{count}} dni',
expiring: 'Wygasa w ciągu jednego dnia',
unlimited: 'Nieograniczony',
},
pagination: {
perPage: 'Ilość elementów na stronie',
@ -685,6 +688,7 @@ const translation = {
browse: 'przeglądaj',
supportedFormats: 'Obsługuje PNG, JPG, JPEG, WEBP i GIF',
},
you: 'Ty',
}
export default translation

View File

@ -110,6 +110,11 @@ const translation = {
licenseExpiredTip: 'Licencja Dify Enterprise dla Twojego obszaru roboczego wygasła. Skontaktuj się z administratorem, aby kontynuować korzystanie z Dify.',
licenseLostTip: 'Nie udało się nawiązać połączenia z serwerem licencji Dify. Skontaktuj się z administratorem, aby kontynuować korzystanie z Dify.',
licenseInactiveTip: 'Licencja Dify Enterprise dla Twojego obszaru roboczego jest nieaktywna. Skontaktuj się z administratorem, aby kontynuować korzystanie z Dify.',
webapp: {
noLoginMethod: 'Metoda uwierzytelniania nie jest skonfigurowana dla aplikacji internetowej',
noLoginMethodTip: 'Proszę skontaktować się z administratorem systemu, aby dodać metodę uwierzytelniania.',
disabled: 'Uwierzytelnianie aplikacji internetowej jest wyłączone. Proszę skontaktować się z administratorem systemu, aby je włączyć. Możesz spróbować użyć aplikacji bezpośrednio.',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
uninstalledTitle: 'Narzędzie nie jest zainstalowane',
paramsTip2: 'Gdy opcja "Automatycznie" jest wyłączona, używana jest wartość domyślna.',
toolLabel: 'Narzędzie',
toolSetting: 'Ustawienia narzędzi',
},
strategyNum: '{{liczba}} {{strategia}} ZAWARTE',
endpointsEmpty: 'Kliknij przycisk "+", aby dodać punkt końcowy',
@ -210,6 +211,7 @@ const translation = {
title: 'Wtyczki',
},
difyVersionNotCompatible: 'Obecna wersja Dify nie jest kompatybilna z tym wtyczką, proszę zaktualizować do minimalnej wymaganej wersji: {{minimalDifyVersion}}',
requestAPlugin: 'Poproś o wtyczkę',
}
export default translation

View File

@ -660,6 +660,7 @@ const translation = {
},
json: 'JSON wygenerowany przez narzędzien',
},
authorize: 'Autoryzuj',
},
questionClassifiers: {
model: 'model',

View File

@ -209,6 +209,41 @@ const translation = {
moreFillTip: 'Mostrando um máximo de 10 níveis de aninhamento',
notConfiguredTip: 'A saída estruturada ainda não foi configurada.',
},
accessItemsDescription: {
anyone: 'Qualquer pessoa pode acessar o aplicativo web',
specific: 'Apenas grupos ou membros específicos podem acessar o aplicativo web',
organization: 'Qualquer pessoa na organização pode acessar o aplicativo web',
},
accessControlDialog: {
accessItems: {
anyone: 'Qualquer pessoa com o link',
specific: 'Grupos específicos ou membros',
organization: 'Apenas membros dentro da empresa',
},
operateGroupAndMember: {
searchPlaceholder: 'Pesquisar grupos e membros',
allMembers: 'Todos os membros',
expand: 'Expandir',
noResult: 'Nenhum resultado',
},
title: 'Controle de Acesso do Aplicativo Web',
description: 'Defina as permissões de acesso do aplicativo da web',
accessLabel: 'Quem tem acesso',
groups_one: '{{count}} GRUPO',
groups_other: '{{count}} GRUPOS',
members_other: '{{count}} MEMBROS',
noGroupsOrMembers: 'Nenhum grupo ou membro selecionado',
updateSuccess: 'Atualização bem-sucedida',
members_one: '{{count}} MEMBRO',
webAppSSONotEnabledTip: 'Por favor, entre em contato com o administrador da empresa para configurar o método de autenticação da aplicação web.',
},
publishApp: {
title: 'Quem pode acessar o aplicativo web',
notSet: 'Não definido',
notSetDesc: 'Atualmente, ninguém pode acessar o aplicativo web. Por favor, defina as permissões.',
},
accessControl: 'Controle de Acesso do Aplicativo Web',
noAccessPermission: 'Sem permissão para acessar o aplicativo web',
}
export default translation

View File

@ -145,6 +145,8 @@ const translation = {
newDataset: 'Criar Conhecimento',
tools: 'Ferramentas',
exploreMarketplace: 'Explorar Mercado',
appDetail: 'Detalhes do aplicativo',
account: 'Conta',
},
userProfile: {
settings: 'Configurações',
@ -550,7 +552,7 @@ const translation = {
vectorHash: 'Hash de vetor:',
hitScore: 'Pontuação de recuperação:',
},
inputPlaceholder: 'Fale com o bot',
inputPlaceholder: 'Fale com o {{botName}}',
thinking: 'Pensante...',
thought: 'Pensamento',
resend: 'Reenviar',
@ -644,6 +646,7 @@ const translation = {
license: {
expiring: 'Expirando em um dia',
expiring_plural: 'Expirando em {{count}} dias',
unlimited: 'Ilimitado',
},
pagination: {
perPage: 'Itens por página',
@ -667,6 +670,7 @@ const translation = {
supportedFormats: 'Suporta PNG, JPG, JPEG, WEBP e GIF',
browse: 'navegar',
},
you: 'Você',
}
export default translation

View File

@ -105,6 +105,11 @@ const translation = {
licenseLost: 'Licença perdida',
licenseInactive: 'Licença inativa',
licenseExpiredTip: 'A licença do Dify Enterprise para seu espaço de trabalho expirou. Entre em contato com o administrador para continuar usando o Dify.',
webapp: {
noLoginMethod: 'Método de autenticação não configurado para o aplicativo web',
disabled: 'A autenticação do aplicativo da web está desativada. Por favor, entre em contato com o administrador do sistema para habilitá-la. Você pode tentar usar o aplicativo diretamente.',
noLoginMethodTip: 'Por favor, entre em contato com o administrador do sistema para adicionar um método de autenticação.',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
descriptionPlaceholder: 'Breve descrição da finalidade da ferramenta, por exemplo, obter a temperatura para um local específico.',
uninstalledTitle: 'Ferramenta não instalada',
unsupportedTitle: 'Ação sem suporte',
toolSetting: 'Configurações da Ferramenta',
},
serviceOk: 'Serviço OK',
endpointsTip: 'Este plug-in fornece funcionalidades específicas por meio de endpoints e você pode configurar vários conjuntos de endpoints para o workspace atual.',
@ -210,6 +211,7 @@ const translation = {
title: 'Plugins',
},
difyVersionNotCompatible: 'A versão atual do Dify não é compatível com este plugin, por favor atualize para a versão mínima exigida: {{minimalDifyVersion}}',
requestAPlugin: 'Solicitar um plugin',
}
export default translation

View File

@ -660,6 +660,7 @@ const translation = {
},
json: 'JSON gerado por ferramenta',
},
authorize: 'Autorizar',
},
questionClassifiers: {
model: 'modelo',

View File

@ -209,6 +209,41 @@ const translation = {
configure: 'Configurează',
modelNotSupportedTip: 'Modelul actual nu suportă această funcție și este downgradat automat la injecția de prompt.',
},
accessItemsDescription: {
specific: 'Numai grupuri sau membri specifici pot accesa aplicația web.',
organization: 'Oricine din organizație poate accesa aplicația web',
anyone: 'Oricine poate accesa aplicația web',
},
accessControlDialog: {
accessItems: {
anyone: 'Oricine are linkul',
specific: 'Grupuri sau membri specifici',
organization: 'Numai membrii din cadrul întreprinderii',
},
operateGroupAndMember: {
searchPlaceholder: 'Caută grupuri și membri',
allMembers: 'Toți membrii',
expand: 'Expandează',
noResult: 'Niciun rezultat',
},
title: 'Controlul Accesului la Aplicația Web',
description: 'Setați permisiunile de acces la aplicația web',
accessLabel: 'Cine are acces',
groups_one: '{{count}} GRUP',
groups_other: '{{count}} GRUPURI',
members_one: '{{count}} MEMBRU',
members_other: '{{count}} MEMBRI',
noGroupsOrMembers: 'Niciun grup sau membri selectați',
webAppSSONotEnabledTip: 'Vă rugăm să contactați administratorul de întreprindere pentru a configura metoda de autentificare a aplicației web.',
updateSuccess: 'Actualizare reușită',
},
publishApp: {
title: 'Cine poate accesa aplicația web',
notSet: 'Nu este setat',
notSetDesc: 'În prezent, nimeni nu poate accesa aplicația web. Vă rugăm să setați permisiunile.',
},
accessControl: 'Controlul Accesului la Aplicația Web',
noAccessPermission: 'Nici o permisiune pentru a accesa aplicația web',
}
export default translation

View File

@ -145,6 +145,8 @@ const translation = {
newDataset: 'Creează Cunoștințe',
tools: 'Instrumente',
exploreMarketplace: 'Explorați Marketplace',
appDetail: 'Detalii aplicație',
account: 'Cont',
},
userProfile: {
settings: 'Setări',
@ -550,7 +552,7 @@ const translation = {
vectorHash: 'Hash vector:',
hitScore: 'Scor de recuperare:',
},
inputPlaceholder: 'Vorbește cu Bot',
inputPlaceholder: 'Vorbește cu {{botName}}',
thinking: 'Gândire...',
thought: 'Gând',
resend: 'Reexpediați',
@ -644,6 +646,7 @@ const translation = {
license: {
expiring: 'Expiră într-o zi',
expiring_plural: 'Expiră în {{count}} zile',
unlimited: 'Nelimitat',
},
pagination: {
perPage: 'Articole pe pagină',
@ -667,6 +670,7 @@ const translation = {
browse: 'naviga',
dropImageHere: 'Trageți imaginea aici sau',
},
you: 'Tu',
}
export default translation

View File

@ -105,6 +105,11 @@ const translation = {
licenseExpired: 'Licență expirată',
licenseLost: 'Licență pierdută',
licenseExpiredTip: 'Licența Dify Enterprise pentru spațiul de lucru a expirat. Contactați administratorul pentru a continua să utilizați Dify.',
webapp: {
noLoginMethod: 'Metoda de autentificare nu este configurată pentru aplicația web',
noLoginMethodTip: 'Vă rugăm să contactați administratorul sistemului pentru a adăuga o metodă de autentificare.',
disabled: 'Autentificarea webapp-ului este dezactivată. Vă rugăm să contactați administratorul sistemului pentru a o activa. Puteți încerca să folosiți aplicația direct.',
},
}
export default translation

View File

@ -62,6 +62,7 @@ const translation = {
descriptionPlaceholder: 'Scurtă descriere a scopului instrumentului, de exemplu, obțineți temperatura pentru o anumită locație.',
toolLabel: 'Unealtă',
uninstalledTitle: 'Instrumentul nu este instalat',
toolSetting: 'Setările instrumentului',
},
endpointDeleteContent: 'Doriți să eliminați {{name}}?',
strategyNum: '{{num}} {{strategie}} INCLUS',
@ -210,6 +211,7 @@ const translation = {
title: 'Pluginuri',
},
difyVersionNotCompatible: 'Versiunea curentă Dify nu este compatibilă cu acest plugin, vă rugăm să faceți upgrade la versiunea minimă necesară: {{minimalDifyVersion}}',
requestAPlugin: 'Solicitați un plugin',
}
export default translation

View File

@ -660,6 +660,7 @@ const translation = {
},
json: 'JSON generat de instrument',
},
authorize: 'Autorizați',
},
questionClassifiers: {
model: 'model',

View File

@ -209,6 +209,41 @@ const translation = {
modelNotSupportedTip: 'Текущая модель не поддерживает эту функцию и автоматически понижается до инъекции подсказок.',
structuredTip: 'Структурированные выходные данные — это функция, которая гарантирует, что модель всегда будет генерировать ответы, соответствующие вашей предоставленной JSON-схеме.',
},
accessItemsDescription: {
anyone: 'Любой может получить доступ к веб-приложению',
specific: 'Только определенные группы или участники могут получить доступ к веб-приложению.',
organization: 'Любой в организации может получить доступ к веб-приложению',
},
accessControlDialog: {
accessItems: {
anyone: 'Кто угодно с ссылкой',
specific: 'Конкретные группы или члены',
organization: 'Только члены внутри предприятия',
},
operateGroupAndMember: {
searchPlaceholder: 'Искать группы и участников',
expand: 'Расширить',
noResult: 'Нет результата',
allMembers: 'Все члены',
},
title: 'Управление доступом к веб-приложению',
description: 'Установите разрешения на доступ к веб-приложению',
accessLabel: 'Кто имеет доступ',
groups_one: '{{count}} ГРУППА',
groups_other: '{{count}} ГРУПП',
members_one: '{{count}} УЧАСТНИК',
members_other: '{{count}} УЧАСТНИКИ',
noGroupsOrMembers: 'Группы или участники не выбраны',
updateSuccess: 'Обновление прошло успешно',
webAppSSONotEnabledTip: 'Пожалуйста, свяжитесь с администратором предприятия, чтобы настроить метод аутентификации веб-приложения.',
},
publishApp: {
title: 'Кто может получить доступ к веб-приложению',
notSet: 'Не установлено',
notSetDesc: 'В настоящее время никто не может получить доступ к веб-приложению. Пожалуйста, установите права доступа.',
},
accessControl: 'Управление доступом к веб-приложению',
noAccessPermission: 'Нет разрешения на доступ к веб-приложению',
}
export default translation

View File

@ -149,6 +149,8 @@ const translation = {
newDataset: 'Создать знания',
tools: 'Инструменты',
exploreMarketplace: 'Подробнее о Marketplace',
appDetail: 'Детали приложения',
account: 'Учетная запись',
},
userProfile: {
settings: 'Настройки',
@ -644,6 +646,7 @@ const translation = {
license: {
expiring: 'Срок действия истекает за один день',
expiring_plural: 'Срок действия истекает через {{count}} дней',
unlimited: 'Неограниченный',
},
pagination: {
perPage: 'Элементов на странице',
@ -667,6 +670,7 @@ const translation = {
dropImageHere: 'Перетащите ваше изображение сюда или',
supportedFormats: 'Поддерживает PNG, JPG, JPEG, WEBP и GIF',
},
you: 'Ты',
}
export default translation

View File

@ -105,6 +105,11 @@ const translation = {
licenseLost: 'Утеряна лицензия',
licenseInactiveTip: 'Лицензия Dify Enterprise для рабочего пространства неактивна. Обратитесь к своему администратору, чтобы продолжить использование Dify.',
licenseExpiredTip: 'Срок действия лицензии Dify Enterprise для рабочего пространства истек. Обратитесь к своему администратору, чтобы продолжить использование Dify.',
webapp: {
noLoginMethod: 'Метод аутентификации не настроен для веб-приложения',
noLoginMethodTip: 'Пожалуйста, свяжитесь с администратором системы, чтобы добавить метод аутентификации.',
disabled: 'Аутентификация веб-приложения отключена. Пожалуйста, свяжитесь с администратором системы, чтобы включить ее. Вы можете попробовать использовать приложение напрямую.',
},
}
export default translation

Some files were not shown because too many files have changed in this diff Show More