queue_entities.py 14 KB

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