queue_entities.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. from datetime import datetime
  2. from enum import Enum, StrEnum
  3. from typing import Any, Optional
  4. from pydantic import BaseModel
  5. from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk
  6. from core.workflow.entities.node_entities import NodeRunMetadataKey
  7. from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState
  8. from core.workflow.nodes import NodeType
  9. from core.workflow.nodes.base import BaseNodeData
  10. class QueueEvent(StrEnum):
  11. """
  12. QueueEvent enum
  13. """
  14. LLM_CHUNK = "llm_chunk"
  15. TEXT_CHUNK = "text_chunk"
  16. AGENT_MESSAGE = "agent_message"
  17. MESSAGE_REPLACE = "message_replace"
  18. MESSAGE_END = "message_end"
  19. ADVANCED_CHAT_MESSAGE_END = "advanced_chat_message_end"
  20. WORKFLOW_STARTED = "workflow_started"
  21. WORKFLOW_SUCCEEDED = "workflow_succeeded"
  22. WORKFLOW_FAILED = "workflow_failed"
  23. WORKFLOW_PARTIAL_SUCCEEDED = "workflow_partial_succeeded"
  24. ITERATION_START = "iteration_start"
  25. ITERATION_NEXT = "iteration_next"
  26. ITERATION_COMPLETED = "iteration_completed"
  27. NODE_STARTED = "node_started"
  28. NODE_SUCCEEDED = "node_succeeded"
  29. NODE_FAILED = "node_failed"
  30. NODE_EXCEPTION = "node_exception"
  31. RETRIEVER_RESOURCES = "retriever_resources"
  32. ANNOTATION_REPLY = "annotation_reply"
  33. AGENT_THOUGHT = "agent_thought"
  34. MESSAGE_FILE = "message_file"
  35. PARALLEL_BRANCH_RUN_STARTED = "parallel_branch_run_started"
  36. PARALLEL_BRANCH_RUN_SUCCEEDED = "parallel_branch_run_succeeded"
  37. PARALLEL_BRANCH_RUN_FAILED = "parallel_branch_run_failed"
  38. ERROR = "error"
  39. PING = "ping"
  40. STOP = "stop"
  41. class AppQueueEvent(BaseModel):
  42. """
  43. QueueEvent abstract entity
  44. """
  45. event: QueueEvent
  46. class QueueLLMChunkEvent(AppQueueEvent):
  47. """
  48. QueueLLMChunkEvent entity
  49. Only for basic mode apps
  50. """
  51. event: QueueEvent = QueueEvent.LLM_CHUNK
  52. chunk: LLMResultChunk
  53. class QueueIterationStartEvent(AppQueueEvent):
  54. """
  55. QueueIterationStartEvent entity
  56. """
  57. event: QueueEvent = QueueEvent.ITERATION_START
  58. node_execution_id: str
  59. node_id: str
  60. node_type: NodeType
  61. node_data: BaseNodeData
  62. parallel_id: Optional[str] = None
  63. """parallel id if node is in parallel"""
  64. parallel_start_node_id: Optional[str] = None
  65. """parallel start node id if node is in parallel"""
  66. parent_parallel_id: Optional[str] = None
  67. """parent parallel id if node is in parallel"""
  68. parent_parallel_start_node_id: Optional[str] = None
  69. """parent parallel start node id if node is in parallel"""
  70. start_at: datetime
  71. node_run_index: int
  72. inputs: Optional[dict[str, Any]] = None
  73. predecessor_node_id: Optional[str] = None
  74. metadata: Optional[dict[str, Any]] = None
  75. class QueueIterationNextEvent(AppQueueEvent):
  76. """
  77. QueueIterationNextEvent entity
  78. """
  79. event: QueueEvent = QueueEvent.ITERATION_NEXT
  80. index: int
  81. node_execution_id: str
  82. node_id: str
  83. node_type: NodeType
  84. node_data: BaseNodeData
  85. parallel_id: Optional[str] = None
  86. """parallel id if node is in parallel"""
  87. parallel_start_node_id: Optional[str] = None
  88. """parallel start node id if node is in parallel"""
  89. parent_parallel_id: Optional[str] = None
  90. """parent parallel id if node is in parallel"""
  91. parent_parallel_start_node_id: Optional[str] = None
  92. """parent parallel start node id if node is in parallel"""
  93. parallel_mode_run_id: Optional[str] = None
  94. """iteratoin run in parallel mode run id"""
  95. node_run_index: int
  96. output: Optional[Any] = None # output for the current iteration
  97. duration: Optional[float] = None
  98. class QueueIterationCompletedEvent(AppQueueEvent):
  99. """
  100. QueueIterationCompletedEvent entity
  101. """
  102. event: QueueEvent = QueueEvent.ITERATION_COMPLETED
  103. node_execution_id: str
  104. node_id: str
  105. node_type: NodeType
  106. node_data: BaseNodeData
  107. parallel_id: Optional[str] = None
  108. """parallel id if node is in parallel"""
  109. parallel_start_node_id: Optional[str] = None
  110. """parallel start node id if node is in parallel"""
  111. parent_parallel_id: Optional[str] = None
  112. """parent parallel id if node is in parallel"""
  113. parent_parallel_start_node_id: Optional[str] = None
  114. """parent parallel start node id if node is in parallel"""
  115. start_at: datetime
  116. node_run_index: int
  117. inputs: Optional[dict[str, Any]] = None
  118. outputs: Optional[dict[str, Any]] = None
  119. metadata: Optional[dict[str, Any]] = None
  120. steps: int = 0
  121. error: Optional[str] = None
  122. class QueueTextChunkEvent(AppQueueEvent):
  123. """
  124. QueueTextChunkEvent entity
  125. """
  126. event: QueueEvent = QueueEvent.TEXT_CHUNK
  127. text: str
  128. from_variable_selector: Optional[list[str]] = None
  129. """from variable selector"""
  130. in_iteration_id: Optional[str] = None
  131. """iteration id if node is in iteration"""
  132. class QueueAgentMessageEvent(AppQueueEvent):
  133. """
  134. QueueMessageEvent entity
  135. """
  136. event: QueueEvent = QueueEvent.AGENT_MESSAGE
  137. chunk: LLMResultChunk
  138. class QueueMessageReplaceEvent(AppQueueEvent):
  139. """
  140. QueueMessageReplaceEvent entity
  141. """
  142. event: QueueEvent = QueueEvent.MESSAGE_REPLACE
  143. text: str
  144. class QueueRetrieverResourcesEvent(AppQueueEvent):
  145. """
  146. QueueRetrieverResourcesEvent entity
  147. """
  148. event: QueueEvent = QueueEvent.RETRIEVER_RESOURCES
  149. retriever_resources: list[dict]
  150. in_iteration_id: Optional[str] = None
  151. """iteration id if node is in iteration"""
  152. class QueueAnnotationReplyEvent(AppQueueEvent):
  153. """
  154. QueueAnnotationReplyEvent entity
  155. """
  156. event: QueueEvent = QueueEvent.ANNOTATION_REPLY
  157. message_annotation_id: str
  158. class QueueMessageEndEvent(AppQueueEvent):
  159. """
  160. QueueMessageEndEvent entity
  161. """
  162. event: QueueEvent = QueueEvent.MESSAGE_END
  163. llm_result: Optional[LLMResult] = None
  164. class QueueAdvancedChatMessageEndEvent(AppQueueEvent):
  165. """
  166. QueueAdvancedChatMessageEndEvent entity
  167. """
  168. event: QueueEvent = QueueEvent.ADVANCED_CHAT_MESSAGE_END
  169. class QueueWorkflowStartedEvent(AppQueueEvent):
  170. """
  171. QueueWorkflowStartedEvent entity
  172. """
  173. event: QueueEvent = QueueEvent.WORKFLOW_STARTED
  174. graph_runtime_state: GraphRuntimeState
  175. class QueueWorkflowSucceededEvent(AppQueueEvent):
  176. """
  177. QueueWorkflowSucceededEvent entity
  178. """
  179. event: QueueEvent = QueueEvent.WORKFLOW_SUCCEEDED
  180. outputs: Optional[dict[str, Any]] = None
  181. class QueueWorkflowFailedEvent(AppQueueEvent):
  182. """
  183. QueueWorkflowFailedEvent entity
  184. """
  185. event: QueueEvent = QueueEvent.WORKFLOW_FAILED
  186. error: str
  187. exceptions_count: int
  188. class QueueWorkflowPartialSuccessEvent(AppQueueEvent):
  189. """
  190. QueueWorkflowFailedEvent entity
  191. """
  192. event: QueueEvent = QueueEvent.WORKFLOW_PARTIAL_SUCCEEDED
  193. exceptions_count: int
  194. outputs: Optional[dict[str, Any]] = None
  195. class QueueNodeStartedEvent(AppQueueEvent):
  196. """
  197. QueueNodeStartedEvent entity
  198. """
  199. event: QueueEvent = QueueEvent.NODE_STARTED
  200. node_execution_id: str
  201. node_id: str
  202. node_type: NodeType
  203. node_data: BaseNodeData
  204. node_run_index: int = 1
  205. predecessor_node_id: Optional[str] = None
  206. parallel_id: Optional[str] = None
  207. """parallel id if node is in parallel"""
  208. parallel_start_node_id: Optional[str] = None
  209. """parallel start node id if node is in parallel"""
  210. parent_parallel_id: Optional[str] = None
  211. """parent parallel id if node is in parallel"""
  212. parent_parallel_start_node_id: Optional[str] = None
  213. """parent parallel start node id if node is in parallel"""
  214. in_iteration_id: Optional[str] = None
  215. """iteration id if node is in iteration"""
  216. start_at: datetime
  217. parallel_mode_run_id: Optional[str] = None
  218. """iteratoin run in parallel mode run id"""
  219. class QueueNodeSucceededEvent(AppQueueEvent):
  220. """
  221. QueueNodeSucceededEvent entity
  222. """
  223. event: QueueEvent = QueueEvent.NODE_SUCCEEDED
  224. node_execution_id: str
  225. node_id: str
  226. node_type: NodeType
  227. node_data: BaseNodeData
  228. parallel_id: Optional[str] = None
  229. """parallel id if node is in parallel"""
  230. parallel_start_node_id: Optional[str] = None
  231. """parallel start node id if node is in parallel"""
  232. parent_parallel_id: Optional[str] = None
  233. """parent parallel id if node is in parallel"""
  234. parent_parallel_start_node_id: Optional[str] = None
  235. """parent parallel start node id if node is in parallel"""
  236. in_iteration_id: Optional[str] = None
  237. """iteration id if node is in iteration"""
  238. start_at: datetime
  239. inputs: Optional[dict[str, Any]] = None
  240. process_data: Optional[dict[str, Any]] = None
  241. outputs: Optional[dict[str, Any]] = None
  242. execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
  243. error: Optional[str] = None
  244. """single iteration duration map"""
  245. iteration_duration_map: Optional[dict[str, float]] = None
  246. class QueueNodeInIterationFailedEvent(AppQueueEvent):
  247. """
  248. QueueNodeInIterationFailedEvent entity
  249. """
  250. event: QueueEvent = QueueEvent.NODE_FAILED
  251. node_execution_id: str
  252. node_id: str
  253. node_type: NodeType
  254. node_data: BaseNodeData
  255. parallel_id: Optional[str] = None
  256. """parallel id if node is in parallel"""
  257. parallel_start_node_id: Optional[str] = None
  258. """parallel start node id if node is in parallel"""
  259. parent_parallel_id: Optional[str] = None
  260. """parent parallel id if node is in parallel"""
  261. parent_parallel_start_node_id: Optional[str] = None
  262. """parent parallel start node id if node is in parallel"""
  263. in_iteration_id: Optional[str] = None
  264. """iteration id if node is in iteration"""
  265. start_at: datetime
  266. inputs: Optional[dict[str, Any]] = None
  267. process_data: Optional[dict[str, Any]] = None
  268. outputs: Optional[dict[str, Any]] = None
  269. execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
  270. error: str
  271. class QueueNodeExceptionEvent(AppQueueEvent):
  272. """
  273. QueueNodeExceptionEvent entity
  274. """
  275. event: QueueEvent = QueueEvent.NODE_EXCEPTION
  276. node_execution_id: str
  277. node_id: str
  278. node_type: NodeType
  279. node_data: BaseNodeData
  280. parallel_id: Optional[str] = None
  281. """parallel id if node is in parallel"""
  282. parallel_start_node_id: Optional[str] = None
  283. """parallel start node id if node is in parallel"""
  284. parent_parallel_id: Optional[str] = None
  285. """parent parallel id if node is in parallel"""
  286. parent_parallel_start_node_id: Optional[str] = None
  287. """parent parallel start node id if node is in parallel"""
  288. in_iteration_id: Optional[str] = None
  289. """iteration id if node is in iteration"""
  290. start_at: datetime
  291. inputs: Optional[dict[str, Any]] = None
  292. process_data: Optional[dict[str, Any]] = None
  293. outputs: Optional[dict[str, Any]] = None
  294. execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
  295. error: str
  296. class QueueNodeFailedEvent(AppQueueEvent):
  297. """
  298. QueueNodeFailedEvent entity
  299. """
  300. event: QueueEvent = QueueEvent.NODE_FAILED
  301. node_execution_id: str
  302. node_id: str
  303. node_type: NodeType
  304. node_data: BaseNodeData
  305. parallel_id: Optional[str] = None
  306. """parallel id if node is in parallel"""
  307. parallel_start_node_id: Optional[str] = None
  308. """parallel start node id if node is in parallel"""
  309. parent_parallel_id: Optional[str] = None
  310. """parent parallel id if node is in parallel"""
  311. parent_parallel_start_node_id: Optional[str] = None
  312. """parent parallel start node id if node is in parallel"""
  313. in_iteration_id: Optional[str] = None
  314. """iteration id if node is in iteration"""
  315. start_at: datetime
  316. inputs: Optional[dict[str, Any]] = None
  317. process_data: Optional[dict[str, Any]] = None
  318. outputs: Optional[dict[str, Any]] = None
  319. execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
  320. error: str
  321. class QueueAgentThoughtEvent(AppQueueEvent):
  322. """
  323. QueueAgentThoughtEvent entity
  324. """
  325. event: QueueEvent = QueueEvent.AGENT_THOUGHT
  326. agent_thought_id: str
  327. class QueueMessageFileEvent(AppQueueEvent):
  328. """
  329. QueueAgentThoughtEvent entity
  330. """
  331. event: QueueEvent = QueueEvent.MESSAGE_FILE
  332. message_file_id: str
  333. class QueueErrorEvent(AppQueueEvent):
  334. """
  335. QueueErrorEvent entity
  336. """
  337. event: QueueEvent = QueueEvent.ERROR
  338. error: Any = None
  339. class QueuePingEvent(AppQueueEvent):
  340. """
  341. QueuePingEvent entity
  342. """
  343. event: QueueEvent = QueueEvent.PING
  344. class QueueStopEvent(AppQueueEvent):
  345. """
  346. QueueStopEvent entity
  347. """
  348. class StopBy(Enum):
  349. """
  350. Stop by enum
  351. """
  352. USER_MANUAL = "user-manual"
  353. ANNOTATION_REPLY = "annotation-reply"
  354. OUTPUT_MODERATION = "output-moderation"
  355. INPUT_MODERATION = "input-moderation"
  356. event: QueueEvent = QueueEvent.STOP
  357. stopped_by: StopBy
  358. def get_stop_reason(self) -> str:
  359. """
  360. To stop reason
  361. """
  362. reason_mapping = {
  363. QueueStopEvent.StopBy.USER_MANUAL: "Stopped by user.",
  364. QueueStopEvent.StopBy.ANNOTATION_REPLY: "Stopped by annotation reply.",
  365. QueueStopEvent.StopBy.OUTPUT_MODERATION: "Stopped by output moderation.",
  366. QueueStopEvent.StopBy.INPUT_MODERATION: "Stopped by input moderation.",
  367. }
  368. return reason_mapping.get(self.stopped_by, "Stopped by unknown reason.")
  369. class QueueMessage(BaseModel):
  370. """
  371. QueueMessage abstract entity
  372. """
  373. task_id: str
  374. app_mode: str
  375. event: AppQueueEvent
  376. class MessageQueueMessage(QueueMessage):
  377. """
  378. MessageQueueMessage entity
  379. """
  380. message_id: str
  381. conversation_id: str
  382. class WorkflowQueueMessage(QueueMessage):
  383. """
  384. WorkflowQueueMessage entity
  385. """
  386. pass
  387. class QueueParallelBranchRunStartedEvent(AppQueueEvent):
  388. """
  389. QueueParallelBranchRunStartedEvent entity
  390. """
  391. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_STARTED
  392. parallel_id: str
  393. parallel_start_node_id: str
  394. parent_parallel_id: Optional[str] = None
  395. """parent parallel id if node is in parallel"""
  396. parent_parallel_start_node_id: Optional[str] = None
  397. """parent parallel start node id if node is in parallel"""
  398. in_iteration_id: Optional[str] = None
  399. """iteration id if node is in iteration"""
  400. class QueueParallelBranchRunSucceededEvent(AppQueueEvent):
  401. """
  402. QueueParallelBranchRunSucceededEvent entity
  403. """
  404. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_SUCCEEDED
  405. parallel_id: str
  406. parallel_start_node_id: str
  407. parent_parallel_id: Optional[str] = None
  408. """parent parallel id if node is in parallel"""
  409. parent_parallel_start_node_id: Optional[str] = None
  410. """parent parallel start node id if node is in parallel"""
  411. in_iteration_id: Optional[str] = None
  412. """iteration id if node is in iteration"""
  413. class QueueParallelBranchRunFailedEvent(AppQueueEvent):
  414. """
  415. QueueParallelBranchRunFailedEvent entity
  416. """
  417. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_FAILED
  418. parallel_id: str
  419. parallel_start_node_id: str
  420. parent_parallel_id: Optional[str] = None
  421. """parent parallel id if node is in parallel"""
  422. parent_parallel_start_node_id: Optional[str] = None
  423. """parent parallel start node id if node is in parallel"""
  424. in_iteration_id: Optional[str] = None
  425. """iteration id if node is in iteration"""
  426. error: str