queue_entities.py 16 KB

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