2024-04-08 18:51:46 +08:00
import { InputVarType } from '@/app/components/workflow/types'
2024-01-31 12:32:13 +08:00
import { AgentStrategy } from '@/types/app'
2024-04-08 21:36:27 +08:00
import { PromptRole } from '@/models/debug'
2023-05-15 08:51:32 +08:00
2023-06-01 23:19:36 +08:00
export let apiPrefix = ''
export let publicApiPrefix = ''
2025-02-17 17:05:13 +08:00
export let marketplaceApiPrefix = ''
export let marketplaceUrlPrefix = ''
2023-05-15 08:51:32 +08:00
// NEXT_PUBLIC_API_PREFIX=/console/api NEXT_PUBLIC_PUBLIC_API_PREFIX=/api npm run start
2025-05-17 12:32:27 +08:00
if ( process . env . NEXT_PUBLIC_API_PREFIX && process . env . NEXT_PUBLIC_PUBLIC_API_PREFIX ) {
2023-06-01 23:19:36 +08:00
apiPrefix = process . env . NEXT_PUBLIC_API_PREFIX
publicApiPrefix = process . env . NEXT_PUBLIC_PUBLIC_API_PREFIX
}
else if (
globalThis . document ? . body ? . getAttribute ( 'data-api-prefix' )
&& globalThis . document ? . body ? . getAttribute ( 'data-pubic-api-prefix' )
2023-05-15 08:51:32 +08:00
) {
2024-05-09 13:49:19 +08:00
// Not build can not get env from process.env.NEXT_PUBLIC_ in browser https://nextjs.org/docs/basic-features/environment-variables#exposing-environment-variables-to-the-browser
2023-05-15 08:51:32 +08:00
apiPrefix = globalThis . document . body . getAttribute ( 'data-api-prefix' ) as string
publicApiPrefix = globalThis . document . body . getAttribute ( 'data-pubic-api-prefix' ) as string
2023-06-01 23:19:36 +08:00
}
else {
2024-01-31 12:32:13 +08:00
// const domainParts = globalThis.location?.host?.split('.');
// in production env, the host is dify.app . In other env, the host is [dev].dify.app
// const env = domainParts.length === 2 ? 'ai' : domainParts?.[0];
apiPrefix = 'http://localhost:5001/console/api'
publicApiPrefix = 'http://localhost:5001/api' // avoid browser private mode api cross origin
2025-02-17 17:05:13 +08:00
marketplaceApiPrefix = 'http://localhost:5002/api'
}
if ( process . env . NEXT_PUBLIC_MARKETPLACE_API_PREFIX && process . env . NEXT_PUBLIC_MARKETPLACE_URL_PREFIX ) {
marketplaceApiPrefix = process . env . NEXT_PUBLIC_MARKETPLACE_API_PREFIX
marketplaceUrlPrefix = process . env . NEXT_PUBLIC_MARKETPLACE_URL_PREFIX
}
else {
marketplaceApiPrefix = globalThis . document ? . body ? . getAttribute ( 'data-marketplace-api-prefix' ) || ''
marketplaceUrlPrefix = globalThis . document ? . body ? . getAttribute ( 'data-marketplace-url-prefix' ) || ''
2023-05-15 08:51:32 +08:00
}
2023-06-01 23:19:36 +08:00
export const API_PREFIX : string = apiPrefix
export const PUBLIC_API_PREFIX : string = publicApiPrefix
2025-02-17 17:05:13 +08:00
export const MARKETPLACE_API_PREFIX : string = marketplaceApiPrefix
export const MARKETPLACE_URL_PREFIX : string = marketplaceUrlPrefix
2023-05-15 08:51:32 +08:00
2024-01-31 12:32:13 +08:00
const EDITION = process . env . NEXT_PUBLIC_EDITION || globalThis . document ? . body ? . getAttribute ( 'data-public-edition' ) || 'SELF_HOSTED'
2023-05-15 08:51:32 +08:00
export const IS_CE_EDITION = EDITION === 'SELF_HOSTED'
2025-03-06 10:25:18 +08:00
export const IS_CLOUD_EDITION = EDITION === 'CLOUD'
2023-05-15 08:51:32 +08:00
2024-06-06 15:01:58 +08:00
export const SUPPORT_MAIL_LOGIN = ! ! ( process . env . NEXT_PUBLIC_SUPPORT_MAIL_LOGIN || globalThis . document ? . body ? . getAttribute ( 'data-public-support-mail-login' ) )
2023-05-15 08:51:32 +08:00
export const TONE_LIST = [
{
id : 1 ,
name : 'Creative' ,
config : {
temperature : 0.8 ,
top_p : 0.9 ,
presence_penalty : 0.1 ,
frequency_penalty : 0.1 ,
} ,
} ,
{
id : 2 ,
name : 'Balanced' ,
config : {
temperature : 0.5 ,
top_p : 0.85 ,
presence_penalty : 0.2 ,
frequency_penalty : 0.3 ,
} ,
} ,
{
id : 3 ,
name : 'Precise' ,
config : {
temperature : 0.2 ,
top_p : 0.75 ,
presence_penalty : 0.5 ,
frequency_penalty : 0.5 ,
} ,
} ,
{
id : 4 ,
name : 'Custom' ,
} ,
]
2023-10-12 23:14:28 +08:00
export const DEFAULT_CHAT_PROMPT_CONFIG = {
2024-04-08 21:36:27 +08:00
prompt : [
{
role : PromptRole.system ,
text : '' ,
} ,
] ,
2023-10-12 23:14:28 +08:00
}
export const DEFAULT_COMPLETION_PROMPT_CONFIG = {
prompt : {
text : '' ,
} ,
conversation_histories_role : {
user_prefix : '' ,
assistant_prefix : '' ,
} ,
}
2023-09-10 00:12:34 +08:00
export const getMaxToken = ( modelId : string ) = > {
return ( modelId === 'gpt-4' || modelId === 'gpt-3.5-turbo-16k' ) ? 8000 : 4000
}
2023-05-15 08:51:32 +08:00
export const LOCALE_COOKIE_NAME = 'locale'
export const DEFAULT_VALUE_MAX_LEN = 48
2023-09-10 00:12:34 +08:00
export const DEFAULT_PARAGRAPH_VALUE_MAX_LEN = 1000
2023-05-15 08:51:32 +08:00
2023-06-01 23:19:36 +08:00
export const zhRegex = /^[\u4E00-\u9FA5]$/m
2023-05-22 10:39:51 +08:00
export const emojiRegex = /^[\uD800-\uDBFF][\uDC00-\uDFFF]$/m
2024-06-17 22:32:59 +09:00
export const emailRegex = /^[\w.!#$%&'*+\-/=?^{|}~]+@([\w-]+\.)+[\w-]{2,}$/m
2024-09-08 12:14:11 +07:00
const MAX_ZN_VAR_NAME_LENGTH = 8
const MAX_EN_VAR_VALUE_LENGTH = 30
2023-05-15 08:51:32 +08:00
export const getMaxVarNameLength = ( value : string ) = > {
2023-06-01 23:19:36 +08:00
if ( zhRegex . test ( value ) )
2024-09-08 12:14:11 +07:00
return MAX_ZN_VAR_NAME_LENGTH
2023-06-01 23:19:36 +08:00
2024-09-08 12:14:11 +07:00
return MAX_EN_VAR_VALUE_LENGTH
2023-05-15 08:51:32 +08:00
}
2024-09-08 12:14:11 +07:00
export const MAX_VAR_KEY_LENGTH = 30
2023-10-12 23:14:28 +08:00
export const MAX_PROMPT_MESSAGE_LENGTH = 10
2023-05-15 08:51:32 +08:00
export const VAR_ITEM_TEMPLATE = {
key : '' ,
name : '' ,
type : 'string' ,
max_length : DEFAULT_VALUE_MAX_LEN ,
2023-06-01 23:19:36 +08:00
required : true ,
2023-05-15 08:51:32 +08:00
}
2024-04-08 18:51:46 +08:00
export const VAR_ITEM_TEMPLATE_IN_WORKFLOW = {
variable : '' ,
label : '' ,
type : InputVarType . textInput ,
max_length : DEFAULT_VALUE_MAX_LEN ,
required : true ,
options : [ ] ,
}
2023-05-25 16:59:47 +08:00
export const appDefaultIconBackground = '#D5F5F6'
export const NEED_REFRESH_APP_LIST_KEY = 'needRefreshAppList'
2023-11-18 11:53:35 +08:00
export const DATASET_DEFAULT = {
2024-07-24 12:50:48 +08:00
top_k : 4 ,
score_threshold : 0.8 ,
2023-11-18 11:53:35 +08:00
}
2023-12-18 15:41:24 +08:00
export const APP_PAGE_LIMIT = 10
export const ANNOTATION_DEFAULT = {
score_threshold : 0.9 ,
}
2024-01-23 19:31:56 +08:00
2025-03-12 01:57:05 -03:00
export let maxToolsNum = 10
if ( process . env . NEXT_PUBLIC_MAX_TOOLS_NUM && process . env . NEXT_PUBLIC_MAX_TOOLS_NUM !== '' )
maxToolsNum = Number . parseInt ( process . env . NEXT_PUBLIC_MAX_TOOLS_NUM )
else if ( globalThis . document ? . body ? . getAttribute ( 'data-public-max-tools-num' ) && globalThis . document . body . getAttribute ( 'data-public-max-tools-num' ) !== '' )
maxToolsNum = Number . parseInt ( globalThis . document . body . getAttribute ( 'data-public-max-tools-num' ) as string )
export const MAX_TOOLS_NUM = maxToolsNum
2024-01-23 19:31:56 +08:00
export const DEFAULT_AGENT_SETTING = {
enabled : false ,
2025-05-29 09:51:56 +08:00
max_iteration : 10 ,
2024-01-23 19:31:56 +08:00
strategy : AgentStrategy.functionCall ,
tools : [ ] ,
}
export const DEFAULT_AGENT_PROMPT = {
2024-10-09 10:22:20 +08:00
chat : ` Respond to the human as helpfully and accurately as possible.
2024-01-23 19:31:56 +08:00
{ { instruction } }
2024-10-09 10:22:20 +08:00
2024-01-23 19:31:56 +08:00
You have access to the following tools :
2024-10-09 10:22:20 +08:00
2024-01-23 19:31:56 +08:00
{ { tools } }
2024-10-09 10:22:20 +08:00
2024-01-23 19:31:56 +08:00
Use a json blob to specify a tool by providing an { { TOOL_NAME_KEY } } key ( tool name ) and an { { ACTION_INPUT_KEY } } key ( tool input ) .
Valid "{{TOOL_NAME_KEY}}" values : "Final Answer" or { { tool_names } }
2024-10-09 10:22:20 +08:00
2024-01-23 19:31:56 +08:00
Provide only ONE action per $JSON_BLOB , as shown :
2024-10-09 10:22:20 +08:00
2024-01-23 19:31:56 +08:00
\ ` \` \`
{
"{{TOOL_NAME_KEY}}" : $TOOL_NAME ,
"{{ACTION_INPUT_KEY}}" : $ACTION_INPUT
}
\ ` \` \`
2024-10-09 10:22:20 +08:00
2024-01-23 19:31:56 +08:00
Follow this format :
2024-10-09 10:22:20 +08:00
2024-01-23 19:31:56 +08:00
Question : input question to answer
Thought : consider previous and subsequent steps
Action :
\ ` \` \`
$JSON_BLOB
\ ` \` \`
Observation : action result
. . . ( repeat Thought / Action / Observation N times )
Thought : I know what to respond
Action :
\ ` \` \`
{
"{{TOOL_NAME_KEY}}" : "Final Answer" ,
"{{ACTION_INPUT_KEY}}" : "Final response to human"
}
\ ` \` \`
2024-10-09 10:22:20 +08:00
2024-01-23 19:31:56 +08:00
Begin ! Reminder to ALWAYS respond with a valid json blob of a single action . Use tools if necessary . Respond directly if appropriate . Format is Action : \ ` \` \` $ JSON_BLOB \` \` \` then Observation:. ` ,
completion : `
2024-10-09 10:22:20 +08:00
Respond to the human as helpfully and accurately as possible .
2024-01-23 19:31:56 +08:00
{ { instruction } }
You have access to the following tools :
{ { tools } }
Use a json blob to specify a tool by providing an { { TOOL_NAME_KEY } } key ( tool name ) and an { { ACTION_INPUT_KEY } } key ( tool input ) .
Valid "{{TOOL_NAME_KEY}}" values : "Final Answer" or { { tool_names } }
Provide only ONE action per $JSON_BLOB , as shown :
\ ` \` \`
{ { { {
"{{TOOL_NAME_KEY}}" : $TOOL_NAME ,
"{{ACTION_INPUT_KEY}}" : $ACTION_INPUT
} } } }
\ ` \` \`
Follow this format :
Question : input question to answer
Thought : consider previous and subsequent steps
Action :
\ ` \` \`
$JSON_BLOB
\ ` \` \`
Observation : action result
. . . ( repeat Thought / Action / Observation N times )
Thought : I know what to respond
Action :
\ ` \` \`
{ { { {
"{{TOOL_NAME_KEY}}" : "Final Answer" ,
"{{ACTION_INPUT_KEY}}" : "Final response to human"
} } } }
\ ` \` \`
Begin ! Reminder to ALWAYS respond with a valid json blob of a single action . Use tools if necessary . Respond directly if appropriate . Format is Action : \ ` \` \` $ JSON_BLOB \` \` \` then Observation:.
Question : { { query } }
Thought : { { agent_scratchpad } }
` ,
}
2024-04-08 18:51:46 +08:00
2025-04-14 15:28:20 +08:00
export const VAR_REGEX = /\{\{(#[a-zA-Z0-9_-]{1,50}(\.[a-zA-Z_]\w{0,29}){1,10}#)\}\}/gi
2024-07-19 13:54:15 +09:00
2024-10-09 10:22:20 +08:00
export const resetReg = ( ) = > VAR_REGEX . lastIndex = 0
2024-09-14 15:11:45 +09:00
export let textGenerationTimeoutMs = 60000
if ( process . env . NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS && process . env . NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS !== '' )
2025-02-17 17:05:13 +08:00
textGenerationTimeoutMs = Number . parseInt ( process . env . NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS )
2024-09-14 15:11:45 +09:00
else if ( globalThis . document ? . body ? . getAttribute ( 'data-public-text-generation-timeout-ms' ) && globalThis . document . body . getAttribute ( 'data-public-text-generation-timeout-ms' ) !== '' )
2025-02-17 17:05:13 +08:00
textGenerationTimeoutMs = Number . parseInt ( globalThis . document . body . getAttribute ( 'data-public-text-generation-timeout-ms' ) as string )
2024-09-14 15:11:45 +09:00
export const TEXT_GENERATION_TIMEOUT_MS = textGenerationTimeoutMs
2024-08-19 09:16:33 +08:00
export const DISABLE_UPLOAD_IMAGE_AS_ICON = process . env . NEXT_PUBLIC_DISABLE_UPLOAD_IMAGE_AS_ICON === 'true'
2025-01-02 18:36:49 +08:00
2025-02-17 17:05:13 +08:00
export const GITHUB_ACCESS_TOKEN = process . env . NEXT_PUBLIC_GITHUB_ACCESS_TOKEN || ''
export const SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS = '.difypkg,.difybndl'
2025-01-02 18:36:49 +08:00
export const FULL_DOC_PREVIEW_LENGTH = 50
2025-03-05 17:41:15 +08:00
2025-04-18 16:53:43 +08:00
export const JSON_SCHEMA_MAX_DEPTH = 10
2025-03-05 17:41:15 +08:00
let loopNodeMaxCount = 100
if ( process . env . NEXT_PUBLIC_LOOP_NODE_MAX_COUNT && process . env . NEXT_PUBLIC_LOOP_NODE_MAX_COUNT !== '' )
loopNodeMaxCount = Number . parseInt ( process . env . NEXT_PUBLIC_LOOP_NODE_MAX_COUNT )
else if ( globalThis . document ? . body ? . getAttribute ( 'data-public-loop-node-max-count' ) && globalThis . document . body . getAttribute ( 'data-public-loop-node-max-count' ) !== '' )
loopNodeMaxCount = Number . parseInt ( globalThis . document . body . getAttribute ( 'data-public-loop-node-max-count' ) as string )
export const LOOP_NODE_MAX_COUNT = loopNodeMaxCount
2025-03-26 14:17:59 +08:00
2025-05-29 09:51:56 +08:00
let maxIterationsNum = 99
2025-03-26 14:17:59 +08:00
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 )
else if ( globalThis . document ? . body ? . getAttribute ( 'data-public-max-iterations-num' ) && globalThis . document . body . getAttribute ( 'data-public-max-iterations-num' ) !== '' )
maxIterationsNum = Number . parseInt ( globalThis . document . body . getAttribute ( 'data-public-max-iterations-num' ) as string )
export const MAX_ITERATIONS_NUM = maxIterationsNum
2025-04-16 15:50:15 +08:00
export const ENABLE_WEBSITE_JINAREADER = process . env . NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER !== undefined
? process . env . NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER === 'true'
2025-04-23 18:02:18 +08:00
: globalThis . document ? . body ? . getAttribute ( 'data-public-enable-website-jinareader' ) === 'true' || true
2025-04-16 15:50:15 +08:00
export const ENABLE_WEBSITE_FIRECRAWL = process . env . NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL !== undefined
? process . env . NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL === 'true'
2025-04-23 18:02:18 +08:00
: globalThis . document ? . body ? . getAttribute ( 'data-public-enable-website-firecrawl' ) === 'true' || true
2025-04-16 15:50:15 +08:00
export const ENABLE_WEBSITE_WATERCRAWL = process . env . NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL !== undefined
? process . env . NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL === 'true'
2025-04-23 18:02:18 +08:00
: globalThis . document ? . body ? . getAttribute ( 'data-public-enable-website-watercrawl' ) === 'true' || true