queue_entities.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  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 AgentNodeStrategyInit, 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. agent_strategy: Optional[AgentNodeStrategyInit] = None
  223. class QueueNodeSucceededEvent(AppQueueEvent):
  224. """
  225. QueueNodeSucceededEvent entity
  226. """
  227. event: QueueEvent = QueueEvent.NODE_SUCCEEDED
  228. node_execution_id: str
  229. node_id: str
  230. node_type: NodeType
  231. node_data: BaseNodeData
  232. parallel_id: Optional[str] = None
  233. """parallel id if node is in parallel"""
  234. parallel_start_node_id: Optional[str] = None
  235. """parallel start node id if node is in parallel"""
  236. parent_parallel_id: Optional[str] = None
  237. """parent parallel id if node is in parallel"""
  238. parent_parallel_start_node_id: Optional[str] = None
  239. """parent parallel start node id if node is in parallel"""
  240. in_iteration_id: Optional[str] = None
  241. """iteration id if node is in iteration"""
  242. start_at: datetime
  243. inputs: Optional[Mapping[str, Any]] = None
  244. process_data: Optional[Mapping[str, Any]] = None
  245. outputs: Optional[Mapping[str, Any]] = None
  246. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  247. error: Optional[str] = None
  248. """single iteration duration map"""
  249. iteration_duration_map: Optional[dict[str, float]] = None
  250. class QueueAgentLogEvent(AppQueueEvent):
  251. """
  252. QueueAgentLogEvent entity
  253. """
  254. event: QueueEvent = QueueEvent.AGENT_LOG
  255. id: str
  256. label: str
  257. node_execution_id: str
  258. parent_id: str | None
  259. error: str | None
  260. status: str
  261. data: Mapping[str, Any]
  262. metadata: Optional[Mapping[str, Any]] = None
  263. class QueueNodeRetryEvent(QueueNodeStartedEvent):
  264. """QueueNodeRetryEvent entity"""
  265. event: QueueEvent = QueueEvent.RETRY
  266. inputs: Optional[Mapping[str, Any]] = None
  267. process_data: Optional[Mapping[str, Any]] = None
  268. outputs: Optional[Mapping[str, Any]] = None
  269. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  270. error: str
  271. retry_index: int # retry 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[Mapping[str, Any]] = None
  293. process_data: Optional[Mapping[str, Any]] = None
  294. outputs: Optional[Mapping[str, Any]] = None
  295. execution_metadata: Optional[Mapping[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[Mapping[str, Any]] = None
  318. process_data: Optional[Mapping[str, Any]] = None
  319. outputs: Optional[Mapping[str, Any]] = None
  320. execution_metadata: Optional[Mapping[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[Mapping[str, Any]] = None
  343. process_data: Optional[Mapping[str, Any]] = None
  344. outputs: Optional[Mapping[str, Any]] = None
  345. execution_metadata: Optional[Mapping[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