queue_entities.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. from datetime import datetime
  2. from enum import Enum, StrEnum
  3. from typing import Any, Optional
  4. from pydantic import BaseModel, field_validator
  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. ERROR = "error"
  37. PING = "ping"
  38. STOP = "stop"
  39. class AppQueueEvent(BaseModel):
  40. """
  41. QueueEvent abstract entity
  42. """
  43. event: QueueEvent
  44. class QueueLLMChunkEvent(AppQueueEvent):
  45. """
  46. QueueLLMChunkEvent entity
  47. Only for basic mode apps
  48. """
  49. event: QueueEvent = QueueEvent.LLM_CHUNK
  50. chunk: LLMResultChunk
  51. class QueueIterationStartEvent(AppQueueEvent):
  52. """
  53. QueueIterationStartEvent entity
  54. """
  55. event: QueueEvent = QueueEvent.ITERATION_START
  56. node_execution_id: str
  57. node_id: str
  58. node_type: NodeType
  59. node_data: BaseNodeData
  60. parallel_id: Optional[str] = None
  61. """parallel id if node is in parallel"""
  62. parallel_start_node_id: Optional[str] = None
  63. """parallel start node id if node is in parallel"""
  64. parent_parallel_id: Optional[str] = None
  65. """parent parallel id if node is in parallel"""
  66. parent_parallel_start_node_id: Optional[str] = None
  67. """parent parallel start node id if node is in parallel"""
  68. start_at: datetime
  69. node_run_index: int
  70. inputs: Optional[dict[str, Any]] = None
  71. predecessor_node_id: Optional[str] = None
  72. metadata: Optional[dict[str, Any]] = None
  73. class QueueIterationNextEvent(AppQueueEvent):
  74. """
  75. QueueIterationNextEvent entity
  76. """
  77. event: QueueEvent = QueueEvent.ITERATION_NEXT
  78. index: int
  79. node_execution_id: str
  80. node_id: str
  81. node_type: NodeType
  82. node_data: BaseNodeData
  83. parallel_id: Optional[str] = None
  84. """parallel id if node is in parallel"""
  85. parallel_start_node_id: Optional[str] = None
  86. """parallel start node id if node is in parallel"""
  87. parent_parallel_id: Optional[str] = None
  88. """parent parallel id if node is in parallel"""
  89. parent_parallel_start_node_id: Optional[str] = None
  90. """parent parallel start node id if node is in parallel"""
  91. parallel_mode_run_id: Optional[str] = None
  92. """iteratoin run in parallel mode run id"""
  93. node_run_index: int
  94. output: Optional[Any] = None # output for the current iteration
  95. duration: Optional[float] = None
  96. @field_validator("output", mode="before")
  97. @classmethod
  98. def set_output(cls, v):
  99. """
  100. Set output
  101. """
  102. if v is None:
  103. return None
  104. if isinstance(v, int | float | str | bool | dict | list):
  105. return v
  106. raise ValueError("output must be a valid type")
  107. class QueueIterationCompletedEvent(AppQueueEvent):
  108. """
  109. QueueIterationCompletedEvent entity
  110. """
  111. event: QueueEvent = QueueEvent.ITERATION_COMPLETED
  112. node_execution_id: str
  113. node_id: str
  114. node_type: NodeType
  115. node_data: BaseNodeData
  116. parallel_id: Optional[str] = None
  117. """parallel id if node is in parallel"""
  118. parallel_start_node_id: Optional[str] = None
  119. """parallel start node id if node is in parallel"""
  120. parent_parallel_id: Optional[str] = None
  121. """parent parallel id if node is in parallel"""
  122. parent_parallel_start_node_id: Optional[str] = None
  123. """parent parallel start node id if node is in parallel"""
  124. start_at: datetime
  125. node_run_index: int
  126. inputs: Optional[dict[str, Any]] = None
  127. outputs: Optional[dict[str, Any]] = None
  128. metadata: Optional[dict[str, Any]] = None
  129. steps: int = 0
  130. error: Optional[str] = None
  131. class QueueTextChunkEvent(AppQueueEvent):
  132. """
  133. QueueTextChunkEvent entity
  134. """
  135. event: QueueEvent = QueueEvent.TEXT_CHUNK
  136. text: str
  137. from_variable_selector: Optional[list[str]] = None
  138. """from variable selector"""
  139. in_iteration_id: Optional[str] = None
  140. """iteration id if node is in iteration"""
  141. class QueueAgentMessageEvent(AppQueueEvent):
  142. """
  143. QueueMessageEvent entity
  144. """
  145. event: QueueEvent = QueueEvent.AGENT_MESSAGE
  146. chunk: LLMResultChunk
  147. class QueueMessageReplaceEvent(AppQueueEvent):
  148. """
  149. QueueMessageReplaceEvent entity
  150. """
  151. event: QueueEvent = QueueEvent.MESSAGE_REPLACE
  152. text: str
  153. class QueueRetrieverResourcesEvent(AppQueueEvent):
  154. """
  155. QueueRetrieverResourcesEvent entity
  156. """
  157. event: QueueEvent = QueueEvent.RETRIEVER_RESOURCES
  158. retriever_resources: list[dict]
  159. in_iteration_id: Optional[str] = None
  160. """iteration id if node is in iteration"""
  161. class QueueAnnotationReplyEvent(AppQueueEvent):
  162. """
  163. QueueAnnotationReplyEvent entity
  164. """
  165. event: QueueEvent = QueueEvent.ANNOTATION_REPLY
  166. message_annotation_id: str
  167. class QueueMessageEndEvent(AppQueueEvent):
  168. """
  169. QueueMessageEndEvent entity
  170. """
  171. event: QueueEvent = QueueEvent.MESSAGE_END
  172. llm_result: Optional[LLMResult] = None
  173. class QueueAdvancedChatMessageEndEvent(AppQueueEvent):
  174. """
  175. QueueAdvancedChatMessageEndEvent entity
  176. """
  177. event: QueueEvent = QueueEvent.ADVANCED_CHAT_MESSAGE_END
  178. class QueueWorkflowStartedEvent(AppQueueEvent):
  179. """
  180. QueueWorkflowStartedEvent entity
  181. """
  182. event: QueueEvent = QueueEvent.WORKFLOW_STARTED
  183. graph_runtime_state: GraphRuntimeState
  184. class QueueWorkflowSucceededEvent(AppQueueEvent):
  185. """
  186. QueueWorkflowSucceededEvent entity
  187. """
  188. event: QueueEvent = QueueEvent.WORKFLOW_SUCCEEDED
  189. outputs: Optional[dict[str, Any]] = None
  190. class QueueWorkflowFailedEvent(AppQueueEvent):
  191. """
  192. QueueWorkflowFailedEvent entity
  193. """
  194. event: QueueEvent = QueueEvent.WORKFLOW_FAILED
  195. error: str
  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 QueueNodeInIterationFailedEvent(AppQueueEvent):
  248. """
  249. QueueNodeInIterationFailedEvent entity
  250. """
  251. event: QueueEvent = QueueEvent.NODE_FAILED
  252. node_execution_id: str
  253. node_id: str
  254. node_type: NodeType
  255. node_data: BaseNodeData
  256. parallel_id: Optional[str] = None
  257. """parallel id if node is in parallel"""
  258. parallel_start_node_id: Optional[str] = None
  259. """parallel start node id if node is in parallel"""
  260. parent_parallel_id: Optional[str] = None
  261. """parent parallel id if node is in parallel"""
  262. parent_parallel_start_node_id: Optional[str] = None
  263. """parent parallel start node id if node is in parallel"""
  264. in_iteration_id: Optional[str] = None
  265. """iteration id if node is in iteration"""
  266. start_at: datetime
  267. inputs: Optional[dict[str, Any]] = None
  268. process_data: Optional[dict[str, Any]] = None
  269. outputs: Optional[dict[str, Any]] = None
  270. execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
  271. error: str
  272. class QueueNodeFailedEvent(AppQueueEvent):
  273. """
  274. QueueNodeFailedEvent 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 QueueAgentThoughtEvent(AppQueueEvent):
  298. """
  299. QueueAgentThoughtEvent entity
  300. """
  301. event: QueueEvent = QueueEvent.AGENT_THOUGHT
  302. agent_thought_id: str
  303. class QueueMessageFileEvent(AppQueueEvent):
  304. """
  305. QueueAgentThoughtEvent entity
  306. """
  307. event: QueueEvent = QueueEvent.MESSAGE_FILE
  308. message_file_id: str
  309. class QueueErrorEvent(AppQueueEvent):
  310. """
  311. QueueErrorEvent entity
  312. """
  313. event: QueueEvent = QueueEvent.ERROR
  314. error: Any = None
  315. class QueuePingEvent(AppQueueEvent):
  316. """
  317. QueuePingEvent entity
  318. """
  319. event: QueueEvent = QueueEvent.PING
  320. class QueueStopEvent(AppQueueEvent):
  321. """
  322. QueueStopEvent entity
  323. """
  324. class StopBy(Enum):
  325. """
  326. Stop by enum
  327. """
  328. USER_MANUAL = "user-manual"
  329. ANNOTATION_REPLY = "annotation-reply"
  330. OUTPUT_MODERATION = "output-moderation"
  331. INPUT_MODERATION = "input-moderation"
  332. event: QueueEvent = QueueEvent.STOP
  333. stopped_by: StopBy
  334. def get_stop_reason(self) -> str:
  335. """
  336. To stop reason
  337. """
  338. reason_mapping = {
  339. QueueStopEvent.StopBy.USER_MANUAL: "Stopped by user.",
  340. QueueStopEvent.StopBy.ANNOTATION_REPLY: "Stopped by annotation reply.",
  341. QueueStopEvent.StopBy.OUTPUT_MODERATION: "Stopped by output moderation.",
  342. QueueStopEvent.StopBy.INPUT_MODERATION: "Stopped by input moderation.",
  343. }
  344. return reason_mapping.get(self.stopped_by, "Stopped by unknown reason.")
  345. class QueueMessage(BaseModel):
  346. """
  347. QueueMessage abstract entity
  348. """
  349. task_id: str
  350. app_mode: str
  351. event: AppQueueEvent
  352. class MessageQueueMessage(QueueMessage):
  353. """
  354. MessageQueueMessage entity
  355. """
  356. message_id: str
  357. conversation_id: str
  358. class WorkflowQueueMessage(QueueMessage):
  359. """
  360. WorkflowQueueMessage entity
  361. """
  362. pass
  363. class QueueParallelBranchRunStartedEvent(AppQueueEvent):
  364. """
  365. QueueParallelBranchRunStartedEvent entity
  366. """
  367. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_STARTED
  368. parallel_id: str
  369. parallel_start_node_id: str
  370. parent_parallel_id: Optional[str] = None
  371. """parent parallel id if node is in parallel"""
  372. parent_parallel_start_node_id: Optional[str] = None
  373. """parent parallel start node id if node is in parallel"""
  374. in_iteration_id: Optional[str] = None
  375. """iteration id if node is in iteration"""
  376. class QueueParallelBranchRunSucceededEvent(AppQueueEvent):
  377. """
  378. QueueParallelBranchRunSucceededEvent entity
  379. """
  380. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_SUCCEEDED
  381. parallel_id: str
  382. parallel_start_node_id: str
  383. parent_parallel_id: Optional[str] = None
  384. """parent parallel id if node is in parallel"""
  385. parent_parallel_start_node_id: Optional[str] = None
  386. """parent parallel start node id if node is in parallel"""
  387. in_iteration_id: Optional[str] = None
  388. """iteration id if node is in iteration"""
  389. class QueueParallelBranchRunFailedEvent(AppQueueEvent):
  390. """
  391. QueueParallelBranchRunFailedEvent entity
  392. """
  393. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_FAILED
  394. parallel_id: str
  395. parallel_start_node_id: str
  396. parent_parallel_id: Optional[str] = None
  397. """parent parallel id if node is in parallel"""
  398. parent_parallel_start_node_id: Optional[str] = None
  399. """parent parallel start node id if node is in parallel"""
  400. in_iteration_id: Optional[str] = None
  401. """iteration id if node is in iteration"""
  402. error: str