queue_entities.py 16 KB

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