queue_entities.py 16 KB

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