constants.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. import type { Var } from './types'
  2. import { BlockEnum, VarType } from './types'
  3. import StartNodeDefault from './nodes/start/default'
  4. import AnswerDefault from './nodes/answer/default'
  5. import LLMDefault from './nodes/llm/default'
  6. import KnowledgeRetrievalDefault from './nodes/knowledge-retrieval/default'
  7. import QuestionClassifierDefault from './nodes/question-classifier/default'
  8. import IfElseDefault from './nodes/if-else/default'
  9. import CodeDefault from './nodes/code/default'
  10. import TemplateTransformDefault from './nodes/template-transform/default'
  11. import HttpRequestDefault from './nodes/http/default'
  12. import ToolDefault from './nodes/tool/default'
  13. import VariableAssignerDefault from './nodes/variable-assigner/default'
  14. import EndNodeDefault from './nodes/end/default'
  15. type NodesExtraData = {
  16. author: string
  17. about: string
  18. availablePrevNodes: BlockEnum[]
  19. availableNextNodes: BlockEnum[]
  20. getAvailablePrevNodes: (isChatMode: boolean) => BlockEnum[]
  21. getAvailableNextNodes: (isChatMode: boolean) => BlockEnum[]
  22. checkValid: any
  23. }
  24. export const NODES_EXTRA_DATA: Record<BlockEnum, NodesExtraData> = {
  25. [BlockEnum.Start]: {
  26. author: 'Dify',
  27. about: '',
  28. availablePrevNodes: [],
  29. availableNextNodes: [],
  30. getAvailablePrevNodes: StartNodeDefault.getAvailablePrevNodes,
  31. getAvailableNextNodes: StartNodeDefault.getAvailableNextNodes,
  32. checkValid: StartNodeDefault.checkValid,
  33. },
  34. [BlockEnum.End]: {
  35. author: 'Dify',
  36. about: '',
  37. availablePrevNodes: [],
  38. availableNextNodes: [],
  39. getAvailablePrevNodes: EndNodeDefault.getAvailablePrevNodes,
  40. getAvailableNextNodes: EndNodeDefault.getAvailableNextNodes,
  41. checkValid: EndNodeDefault.checkValid,
  42. },
  43. [BlockEnum.Answer]: {
  44. author: 'Dify',
  45. about: '',
  46. availablePrevNodes: [],
  47. availableNextNodes: [],
  48. getAvailablePrevNodes: AnswerDefault.getAvailablePrevNodes,
  49. getAvailableNextNodes: AnswerDefault.getAvailableNextNodes,
  50. checkValid: AnswerDefault.checkValid,
  51. },
  52. [BlockEnum.LLM]: {
  53. author: 'Dify',
  54. about: '',
  55. availablePrevNodes: [],
  56. availableNextNodes: [],
  57. getAvailablePrevNodes: LLMDefault.getAvailablePrevNodes,
  58. getAvailableNextNodes: LLMDefault.getAvailableNextNodes,
  59. checkValid: LLMDefault.checkValid,
  60. },
  61. [BlockEnum.KnowledgeRetrieval]: {
  62. author: 'Dify',
  63. about: '',
  64. availablePrevNodes: [],
  65. availableNextNodes: [],
  66. getAvailablePrevNodes: KnowledgeRetrievalDefault.getAvailablePrevNodes,
  67. getAvailableNextNodes: KnowledgeRetrievalDefault.getAvailableNextNodes,
  68. checkValid: KnowledgeRetrievalDefault.checkValid,
  69. },
  70. [BlockEnum.IfElse]: {
  71. author: 'Dify',
  72. about: '',
  73. availablePrevNodes: [],
  74. availableNextNodes: [],
  75. getAvailablePrevNodes: IfElseDefault.getAvailablePrevNodes,
  76. getAvailableNextNodes: IfElseDefault.getAvailableNextNodes,
  77. checkValid: IfElseDefault.checkValid,
  78. },
  79. [BlockEnum.Code]: {
  80. author: 'Dify',
  81. about: '',
  82. availablePrevNodes: [],
  83. availableNextNodes: [],
  84. getAvailablePrevNodes: CodeDefault.getAvailablePrevNodes,
  85. getAvailableNextNodes: CodeDefault.getAvailableNextNodes,
  86. checkValid: CodeDefault.checkValid,
  87. },
  88. [BlockEnum.TemplateTransform]: {
  89. author: 'Dify',
  90. about: '',
  91. availablePrevNodes: [],
  92. availableNextNodes: [],
  93. getAvailablePrevNodes: TemplateTransformDefault.getAvailablePrevNodes,
  94. getAvailableNextNodes: TemplateTransformDefault.getAvailableNextNodes,
  95. checkValid: TemplateTransformDefault.checkValid,
  96. },
  97. [BlockEnum.QuestionClassifier]: {
  98. author: 'Dify',
  99. about: '',
  100. availablePrevNodes: [],
  101. availableNextNodes: [],
  102. getAvailablePrevNodes: QuestionClassifierDefault.getAvailablePrevNodes,
  103. getAvailableNextNodes: QuestionClassifierDefault.getAvailableNextNodes,
  104. checkValid: QuestionClassifierDefault.checkValid,
  105. },
  106. [BlockEnum.HttpRequest]: {
  107. author: 'Dify',
  108. about: '',
  109. availablePrevNodes: [],
  110. availableNextNodes: [],
  111. getAvailablePrevNodes: HttpRequestDefault.getAvailablePrevNodes,
  112. getAvailableNextNodes: HttpRequestDefault.getAvailableNextNodes,
  113. checkValid: HttpRequestDefault.checkValid,
  114. },
  115. [BlockEnum.VariableAssigner]: {
  116. author: 'Dify',
  117. about: '',
  118. availablePrevNodes: [],
  119. availableNextNodes: [],
  120. getAvailablePrevNodes: VariableAssignerDefault.getAvailablePrevNodes,
  121. getAvailableNextNodes: VariableAssignerDefault.getAvailableNextNodes,
  122. checkValid: VariableAssignerDefault.checkValid,
  123. },
  124. [BlockEnum.Tool]: {
  125. author: 'Dify',
  126. about: '',
  127. availablePrevNodes: [],
  128. availableNextNodes: [],
  129. getAvailablePrevNodes: ToolDefault.getAvailablePrevNodes,
  130. getAvailableNextNodes: ToolDefault.getAvailableNextNodes,
  131. checkValid: ToolDefault.checkValid,
  132. },
  133. }
  134. export const ALL_CHAT_AVAILABLE_BLOCKS = Object.keys(NODES_EXTRA_DATA).filter(key => key !== BlockEnum.End && key !== BlockEnum.Start) as BlockEnum[]
  135. export const ALL_COMPLETION_AVAILABLE_BLOCKS = Object.keys(NODES_EXTRA_DATA).filter(key => key !== BlockEnum.Answer && key !== BlockEnum.Start) as BlockEnum[]
  136. export const NODES_INITIAL_DATA = {
  137. [BlockEnum.Start]: {
  138. type: BlockEnum.Start,
  139. title: '',
  140. desc: '',
  141. ...StartNodeDefault.defaultValue,
  142. },
  143. [BlockEnum.End]: {
  144. type: BlockEnum.End,
  145. title: '',
  146. desc: '',
  147. ...EndNodeDefault.defaultValue,
  148. },
  149. [BlockEnum.Answer]: {
  150. type: BlockEnum.Answer,
  151. title: '',
  152. desc: '',
  153. ...AnswerDefault.defaultValue,
  154. },
  155. [BlockEnum.LLM]: {
  156. type: BlockEnum.LLM,
  157. title: '',
  158. desc: '',
  159. variables: [],
  160. ...LLMDefault.defaultValue,
  161. },
  162. [BlockEnum.KnowledgeRetrieval]: {
  163. type: BlockEnum.KnowledgeRetrieval,
  164. title: '',
  165. desc: '',
  166. query_variable_selector: [],
  167. dataset_ids: [],
  168. retrieval_mode: 'single',
  169. ...KnowledgeRetrievalDefault.defaultValue,
  170. },
  171. [BlockEnum.IfElse]: {
  172. type: BlockEnum.IfElse,
  173. title: '',
  174. desc: '',
  175. ...IfElseDefault.defaultValue,
  176. },
  177. [BlockEnum.Code]: {
  178. type: BlockEnum.Code,
  179. title: '',
  180. desc: '',
  181. variables: [],
  182. code_language: 'python3',
  183. code: '',
  184. outputs: [],
  185. ...CodeDefault.defaultValue,
  186. },
  187. [BlockEnum.TemplateTransform]: {
  188. type: BlockEnum.TemplateTransform,
  189. title: '',
  190. desc: '',
  191. variables: [],
  192. template: '',
  193. ...TemplateTransformDefault.defaultValue,
  194. },
  195. [BlockEnum.QuestionClassifier]: {
  196. type: BlockEnum.QuestionClassifier,
  197. title: '',
  198. desc: '',
  199. query_variable_selector: [],
  200. topics: [],
  201. ...QuestionClassifierDefault.defaultValue,
  202. },
  203. [BlockEnum.HttpRequest]: {
  204. type: BlockEnum.HttpRequest,
  205. title: '',
  206. desc: '',
  207. variables: [],
  208. ...HttpRequestDefault.defaultValue,
  209. },
  210. [BlockEnum.VariableAssigner]: {
  211. type: BlockEnum.VariableAssigner,
  212. title: '',
  213. desc: '',
  214. variables: [],
  215. output_type: '',
  216. ...VariableAssignerDefault.defaultValue,
  217. },
  218. [BlockEnum.Tool]: {
  219. type: BlockEnum.Tool,
  220. title: '',
  221. desc: '',
  222. ...ToolDefault.defaultValue,
  223. },
  224. }
  225. export const NODE_WIDTH = 240
  226. export const X_OFFSET = 60
  227. export const NODE_WIDTH_X_OFFSET = NODE_WIDTH + X_OFFSET
  228. export const Y_OFFSET = 39
  229. export const MAX_TREE_DEEPTH = 30
  230. export const START_INITIAL_POSITION = { x: 80, y: 282 }
  231. export const AUTO_LAYOUT_OFFSET = {
  232. x: -42,
  233. y: 243,
  234. }
  235. export const RETRIEVAL_OUTPUT_STRUCT = `{
  236. "content": "",
  237. "title": "",
  238. "url": "",
  239. "icon": "",
  240. "metadata": {
  241. "dataset_id": "",
  242. "dataset_name": "",
  243. "document_id": [],
  244. "document_name": "",
  245. "document_data_source_type": "",
  246. "segment_id": "",
  247. "segment_position": "",
  248. "segment_word_count": "",
  249. "segment_hit_count": "",
  250. "segment_index_node_hash": "",
  251. "score": ""
  252. }
  253. }`
  254. export const SUPPORT_OUTPUT_VARS_NODE = [
  255. BlockEnum.Start, BlockEnum.LLM, BlockEnum.KnowledgeRetrieval, BlockEnum.Code, BlockEnum.TemplateTransform,
  256. BlockEnum.HttpRequest, BlockEnum.Tool, BlockEnum.VariableAssigner,
  257. ]
  258. const USAGE = {
  259. variable: 'usage',
  260. type: VarType.object,
  261. children: [
  262. {
  263. variable: 'prompt_tokens',
  264. type: VarType.number,
  265. },
  266. {
  267. variable: 'prompt_unit_price',
  268. type: VarType.number,
  269. },
  270. {
  271. variable: 'prompt_price_unit',
  272. type: VarType.number,
  273. },
  274. {
  275. variable: 'prompt_price',
  276. type: VarType.number,
  277. },
  278. {
  279. variable: 'completion_tokens',
  280. type: VarType.number,
  281. },
  282. {
  283. variable: 'completion_unit_price',
  284. type: VarType.number,
  285. },
  286. {
  287. variable: 'completion_price_unit',
  288. type: VarType.number,
  289. },
  290. {
  291. variable: 'completion_unit_price',
  292. type: VarType.number,
  293. },
  294. {
  295. variable: 'completion_price',
  296. type: VarType.number,
  297. },
  298. {
  299. variable: 'total_tokens',
  300. type: VarType.number,
  301. },
  302. {
  303. variable: 'total_price',
  304. type: VarType.number,
  305. },
  306. {
  307. variable: 'currency',
  308. type: VarType.string,
  309. },
  310. {
  311. variable: 'latency',
  312. type: VarType.number,
  313. },
  314. ],
  315. }
  316. export const LLM_OUTPUT_STRUCT: Var[] = [
  317. {
  318. variable: 'text',
  319. type: VarType.string,
  320. },
  321. ]
  322. export const KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT: Var[] = [
  323. {
  324. variable: 'result',
  325. type: VarType.arrayObject,
  326. },
  327. ]
  328. export const TEMPLATE_TRANSFORM_OUTPUT_STRUCT: Var[] = [
  329. {
  330. variable: 'output',
  331. type: VarType.string,
  332. },
  333. ]
  334. const QUESTION_CLASSIFIER_OUTPUT_STRUCT_COMMON: Var[] = [
  335. USAGE,
  336. {
  337. variable: 'topic',
  338. type: VarType.string,
  339. },
  340. ]
  341. export const CHAT_QUESTION_CLASSIFIER_OUTPUT_STRUCT = [
  342. {
  343. variable: 'model_mode',
  344. type: VarType.string,
  345. },
  346. {
  347. variable: 'messages',
  348. type: VarType.arrayObject,
  349. },
  350. ...QUESTION_CLASSIFIER_OUTPUT_STRUCT_COMMON,
  351. ]
  352. export const COMPLETION_QUESTION_CLASSIFIER_OUTPUT_STRUCT = [
  353. {
  354. variable: 'model_mode',
  355. type: VarType.string,
  356. },
  357. {
  358. variable: 'text',
  359. type: VarType.string,
  360. },
  361. ...QUESTION_CLASSIFIER_OUTPUT_STRUCT_COMMON,
  362. ]
  363. export const HTTP_REQUEST_OUTPUT_STRUCT: Var[] = [
  364. {
  365. variable: 'body',
  366. type: VarType.string,
  367. },
  368. {
  369. variable: 'status_code',
  370. type: VarType.number,
  371. },
  372. {
  373. variable: 'headers',
  374. type: VarType.string,
  375. },
  376. {
  377. variable: 'files',
  378. type: VarType.arrayFile,
  379. },
  380. ]
  381. export const TOOL_OUTPUT_STRUCT: Var[] = [
  382. {
  383. variable: 'text',
  384. type: VarType.string,
  385. },
  386. {
  387. variable: 'files',
  388. type: VarType.arrayFile,
  389. },
  390. ]