| # The timeout for the text generation in millisecond | # The timeout for the text generation in millisecond | ||||
| TEXT_GENERATION_TIMEOUT_MS=60000 | TEXT_GENERATION_TIMEOUT_MS=60000 | ||||
| # Allow rendering unsafe URLs which have "data:" scheme. | |||||
| ALLOW_UNSAFE_DATA_SCHEME=false | |||||
| # ------------------------------ | # ------------------------------ | ||||
| # Environment Variables for db Service | # Environment Variables for db Service | ||||
| # ------------------------------ | # ------------------------------ |
| TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} | TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} | ||||
| CSP_WHITELIST: ${CSP_WHITELIST:-} | CSP_WHITELIST: ${CSP_WHITELIST:-} | ||||
| ALLOW_EMBED: ${ALLOW_EMBED:-false} | ALLOW_EMBED: ${ALLOW_EMBED:-false} | ||||
| ALLOW_UNSAFE_DATA_SCHEME: ${ALLOW_UNSAFE_DATA_SCHEME:-false} | |||||
| MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai} | MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai} | ||||
| MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai} | MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai} | ||||
| TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-} | TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-} |
| MAX_PARALLEL_LIMIT: ${MAX_PARALLEL_LIMIT:-10} | MAX_PARALLEL_LIMIT: ${MAX_PARALLEL_LIMIT:-10} | ||||
| MAX_ITERATIONS_NUM: ${MAX_ITERATIONS_NUM:-99} | MAX_ITERATIONS_NUM: ${MAX_ITERATIONS_NUM:-99} | ||||
| TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} | TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} | ||||
| ALLOW_UNSAFE_DATA_SCHEME: ${ALLOW_UNSAFE_DATA_SCHEME:-false} | |||||
| POSTGRES_USER: ${POSTGRES_USER:-${DB_USERNAME}} | POSTGRES_USER: ${POSTGRES_USER:-${DB_USERNAME}} | ||||
| POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-${DB_PASSWORD}} | POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-${DB_PASSWORD}} | ||||
| POSTGRES_DB: ${POSTGRES_DB:-${DB_DATABASE}} | POSTGRES_DB: ${POSTGRES_DB:-${DB_DATABASE}} | ||||
| TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} | TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} | ||||
| CSP_WHITELIST: ${CSP_WHITELIST:-} | CSP_WHITELIST: ${CSP_WHITELIST:-} | ||||
| ALLOW_EMBED: ${ALLOW_EMBED:-false} | ALLOW_EMBED: ${ALLOW_EMBED:-false} | ||||
| ALLOW_UNSAFE_DATA_SCHEME: ${ALLOW_UNSAFE_DATA_SCHEME:-false} | |||||
| MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai} | MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai} | ||||
| MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai} | MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai} | ||||
| TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-} | TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-} |
| # Default is not allow to embed into iframe to prevent Clickjacking: https://owasp.org/www-community/attacks/Clickjacking | # Default is not allow to embed into iframe to prevent Clickjacking: https://owasp.org/www-community/attacks/Clickjacking | ||||
| NEXT_PUBLIC_ALLOW_EMBED= | NEXT_PUBLIC_ALLOW_EMBED= | ||||
| # Allow rendering unsafe URLs which have "data:" scheme. | |||||
| NEXT_PUBLIC_ALLOW_UNSAFE_DATA_SCHEME=false | |||||
| # Github Access Token, used for invoking Github API | # Github Access Token, used for invoking Github API | ||||
| NEXT_PUBLIC_GITHUB_ACCESS_TOKEN= | NEXT_PUBLIC_GITHUB_ACCESS_TOKEN= | ||||
| # The maximum number of top-k value for RAG. | # The maximum number of top-k value for RAG. |
| import { ALLOW_UNSAFE_DATA_SCHEME } from '@/config' | |||||
| export const isValidUrl = (url: string): boolean => { | export const isValidUrl = (url: string): boolean => { | ||||
| return ['http:', 'https:', '//', 'mailto:'].some(prefix => url.startsWith(prefix)) | |||||
| const validPrefixes = ['http:', 'https:', '//', 'mailto:'] | |||||
| if (ALLOW_UNSAFE_DATA_SCHEME) validPrefixes.push('data:') | |||||
| return validPrefixes.some(prefix => url.startsWith(prefix)) | |||||
| } | } |
| * Includes preprocessing for LaTeX and custom "think" tags. | * Includes preprocessing for LaTeX and custom "think" tags. | ||||
| */ | */ | ||||
| import { flow } from 'lodash-es' | import { flow } from 'lodash-es' | ||||
| import { ALLOW_UNSAFE_DATA_SCHEME } from '@/config' | |||||
| export const preprocessLaTeX = (content: string) => { | export const preprocessLaTeX = (content: string) => { | ||||
| if (typeof content !== 'string') | if (typeof content !== 'string') | ||||
| if (PERMITTED_SCHEME_REGEX.test(scheme)) | if (PERMITTED_SCHEME_REGEX.test(scheme)) | ||||
| return uri | return uri | ||||
| if (ALLOW_UNSAFE_DATA_SCHEME && scheme === 'data:') | |||||
| return uri | |||||
| return undefined | return undefined | ||||
| } | } |
| [DatasetAttr.DATA_PUBLIC_LOOP_NODE_MAX_COUNT]: process.env.NEXT_PUBLIC_LOOP_NODE_MAX_COUNT, | [DatasetAttr.DATA_PUBLIC_LOOP_NODE_MAX_COUNT]: process.env.NEXT_PUBLIC_LOOP_NODE_MAX_COUNT, | ||||
| [DatasetAttr.DATA_PUBLIC_MAX_ITERATIONS_NUM]: process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM, | [DatasetAttr.DATA_PUBLIC_MAX_ITERATIONS_NUM]: process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM, | ||||
| [DatasetAttr.DATA_PUBLIC_MAX_TREE_DEPTH]: process.env.NEXT_PUBLIC_MAX_TREE_DEPTH, | [DatasetAttr.DATA_PUBLIC_MAX_TREE_DEPTH]: process.env.NEXT_PUBLIC_MAX_TREE_DEPTH, | ||||
| [DatasetAttr.DATA_PUBLIC_ALLOW_UNSAFE_DATA_SCHEME]: process.env.NEXT_PUBLIC_ALLOW_UNSAFE_DATA_SCHEME, | |||||
| [DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_JINAREADER]: process.env.NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER, | [DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_JINAREADER]: process.env.NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER, | ||||
| [DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_FIRECRAWL]: process.env.NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL, | [DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_FIRECRAWL]: process.env.NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL, | ||||
| [DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_WATERCRAWL]: process.env.NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL, | [DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_WATERCRAWL]: process.env.NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL, |
| export const MAX_ITERATIONS_NUM = getNumberConfig(process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM, DatasetAttr.DATA_PUBLIC_MAX_ITERATIONS_NUM, 99) | export const MAX_ITERATIONS_NUM = getNumberConfig(process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM, DatasetAttr.DATA_PUBLIC_MAX_ITERATIONS_NUM, 99) | ||||
| export const MAX_TREE_DEPTH = getNumberConfig(process.env.NEXT_PUBLIC_MAX_TREE_DEPTH, DatasetAttr.DATA_PUBLIC_MAX_TREE_DEPTH, 50) | export const MAX_TREE_DEPTH = getNumberConfig(process.env.NEXT_PUBLIC_MAX_TREE_DEPTH, DatasetAttr.DATA_PUBLIC_MAX_TREE_DEPTH, 50) | ||||
| export const ALLOW_UNSAFE_DATA_SCHEME = getBooleanConfig(process.env.NEXT_PUBLIC_ALLOW_UNSAFE_DATA_SCHEME, DatasetAttr.DATA_PUBLIC_ALLOW_UNSAFE_DATA_SCHEME, false) | |||||
| export const ENABLE_WEBSITE_JINAREADER = getBooleanConfig(process.env.NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER, DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_JINAREADER, true) | export const ENABLE_WEBSITE_JINAREADER = getBooleanConfig(process.env.NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER, DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_JINAREADER, true) | ||||
| export const ENABLE_WEBSITE_FIRECRAWL = getBooleanConfig(process.env.NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL, DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_FIRECRAWL, true) | export const ENABLE_WEBSITE_FIRECRAWL = getBooleanConfig(process.env.NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL, DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_FIRECRAWL, true) | ||||
| export const ENABLE_WEBSITE_WATERCRAWL = getBooleanConfig(process.env.NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL, DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_WATERCRAWL, false) | export const ENABLE_WEBSITE_WATERCRAWL = getBooleanConfig(process.env.NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL, DatasetAttr.DATA_PUBLIC_ENABLE_WEBSITE_WATERCRAWL, false) |
| export NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS=${TEXT_GENERATION_TIMEOUT_MS} | export NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS=${TEXT_GENERATION_TIMEOUT_MS} | ||||
| export NEXT_PUBLIC_CSP_WHITELIST=${CSP_WHITELIST} | export NEXT_PUBLIC_CSP_WHITELIST=${CSP_WHITELIST} | ||||
| export NEXT_PUBLIC_ALLOW_EMBED=${ALLOW_EMBED} | export NEXT_PUBLIC_ALLOW_EMBED=${ALLOW_EMBED} | ||||
| export NEXT_PUBLIC_ALLOW_UNSAFE_DATA_SCHEME=${ALLOW_UNSAFE_DATA_SCHEME:-false} | |||||
| export NEXT_PUBLIC_TOP_K_MAX_VALUE=${TOP_K_MAX_VALUE} | export NEXT_PUBLIC_TOP_K_MAX_VALUE=${TOP_K_MAX_VALUE} | ||||
| export NEXT_PUBLIC_INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH} | export NEXT_PUBLIC_INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH} | ||||
| export NEXT_PUBLIC_MAX_TOOLS_NUM=${MAX_TOOLS_NUM} | export NEXT_PUBLIC_MAX_TOOLS_NUM=${MAX_TOOLS_NUM} |
| DATA_PUBLIC_LOOP_NODE_MAX_COUNT = 'data-public-loop-node-max-count', | DATA_PUBLIC_LOOP_NODE_MAX_COUNT = 'data-public-loop-node-max-count', | ||||
| DATA_PUBLIC_MAX_ITERATIONS_NUM = 'data-public-max-iterations-num', | DATA_PUBLIC_MAX_ITERATIONS_NUM = 'data-public-max-iterations-num', | ||||
| DATA_PUBLIC_MAX_TREE_DEPTH = 'data-public-max-tree-depth', | DATA_PUBLIC_MAX_TREE_DEPTH = 'data-public-max-tree-depth', | ||||
| DATA_PUBLIC_ALLOW_UNSAFE_DATA_SCHEME = 'data-public-allow-unsafe-data-scheme', | |||||
| DATA_PUBLIC_ENABLE_WEBSITE_JINAREADER = 'data-public-enable-website-jinareader', | DATA_PUBLIC_ENABLE_WEBSITE_JINAREADER = 'data-public-enable-website-jinareader', | ||||
| DATA_PUBLIC_ENABLE_WEBSITE_FIRECRAWL = 'data-public-enable-website-firecrawl', | DATA_PUBLIC_ENABLE_WEBSITE_FIRECRAWL = 'data-public-enable-website-firecrawl', | ||||
| DATA_PUBLIC_ENABLE_WEBSITE_WATERCRAWL = 'data-public-enable-website-watercrawl', | DATA_PUBLIC_ENABLE_WEBSITE_WATERCRAWL = 'data-public-enable-website-watercrawl', |