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 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. metadata: Optional[Mapping[str, Any]] = None
  262. class QueueNodeRetryEvent(QueueNodeStartedEvent):
  263. """QueueNodeRetryEvent entity"""
  264. event: QueueEvent = QueueEvent.RETRY
  265. inputs: Optional[Mapping[str, Any]] = None
  266. process_data: Optional[Mapping[str, Any]] = None
  267. outputs: Optional[Mapping[str, Any]] = None
  268. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  269. error: str
  270. retry_index: int # retry index
  271. class QueueNodeInIterationFailedEvent(AppQueueEvent):
  272. """
  273. QueueNodeInIterationFailedEvent entity
  274. """
  275. event: QueueEvent = QueueEvent.NODE_FAILED
  276. node_execution_id: str
  277. node_id: str
  278. node_type: NodeType
  279. node_data: BaseNodeData
  280. parallel_id: Optional[str] = None
  281. """parallel id if node is in parallel"""
  282. parallel_start_node_id: Optional[str] = None
  283. """parallel start node id if node is in parallel"""
  284. parent_parallel_id: Optional[str] = None
  285. """parent parallel id if node is in parallel"""
  286. parent_parallel_start_node_id: Optional[str] = None
  287. """parent parallel start node id if node is in parallel"""
  288. in_iteration_id: Optional[str] = None
  289. """iteration id if node is in iteration"""
  290. start_at: datetime
  291. inputs: Optional[Mapping[str, Any]] = None
  292. process_data: Optional[Mapping[str, Any]] = None
  293. outputs: Optional[Mapping[str, Any]] = None
  294. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  295. error: str
  296. class QueueNodeExceptionEvent(AppQueueEvent):
  297. """
  298. QueueNodeExceptionEvent entity
  299. """
  300. event: QueueEvent = QueueEvent.NODE_EXCEPTION
  301. node_execution_id: str
  302. node_id: str
  303. node_type: NodeType
  304. node_data: BaseNodeData
  305. parallel_id: Optional[str] = None
  306. """parallel id if node is in parallel"""
  307. parallel_start_node_id: Optional[str] = None
  308. """parallel start node id if node is in parallel"""
  309. parent_parallel_id: Optional[str] = None
  310. """parent parallel id if node is in parallel"""
  311. parent_parallel_start_node_id: Optional[str] = None
  312. """parent parallel start node id if node is in parallel"""
  313. in_iteration_id: Optional[str] = None
  314. """iteration id if node is in iteration"""
  315. start_at: datetime
  316. inputs: Optional[Mapping[str, Any]] = None
  317. process_data: Optional[Mapping[str, Any]] = None
  318. outputs: Optional[Mapping[str, Any]] = None
  319. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  320. error: str
  321. class QueueNodeFailedEvent(AppQueueEvent):
  322. """
  323. QueueNodeFailedEvent entity
  324. """
  325. event: QueueEvent = QueueEvent.NODE_FAILED
  326. node_execution_id: str
  327. node_id: str
  328. node_type: NodeType
  329. node_data: BaseNodeData
  330. parallel_id: Optional[str] = None
  331. """parallel id if node is in parallel"""
  332. parallel_start_node_id: Optional[str] = None
  333. """parallel start node id if node is in parallel"""
  334. parent_parallel_id: Optional[str] = None
  335. """parent parallel id if node is in parallel"""
  336. parent_parallel_start_node_id: Optional[str] = None
  337. """parent parallel start node id if node is in parallel"""
  338. in_iteration_id: Optional[str] = None
  339. """iteration id if node is in iteration"""
  340. start_at: datetime
  341. inputs: Optional[Mapping[str, Any]] = None
  342. process_data: Optional[Mapping[str, Any]] = None
  343. outputs: Optional[Mapping[str, Any]] = None
  344. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  345. error: str
  346. class QueueAgentThoughtEvent(AppQueueEvent):
  347. """
  348. QueueAgentThoughtEvent entity
  349. """
  350. event: QueueEvent = QueueEvent.AGENT_THOUGHT
  351. agent_thought_id: str
  352. class QueueMessageFileEvent(AppQueueEvent):
  353. """
  354. QueueAgentThoughtEvent entity
  355. """
  356. event: QueueEvent = QueueEvent.MESSAGE_FILE
  357. message_file_id: str
  358. class QueueErrorEvent(AppQueueEvent):
  359. """
  360. QueueErrorEvent entity
  361. """
  362. event: QueueEvent = QueueEvent.ERROR
  363. error: Any = None
  364. class QueuePingEvent(AppQueueEvent):
  365. """
  366. QueuePingEvent entity
  367. """
  368. event: QueueEvent = QueueEvent.PING
  369. class QueueStopEvent(AppQueueEvent):
  370. """
  371. QueueStopEvent entity
  372. """
  373. class StopBy(Enum):
  374. """
  375. Stop by enum
  376. """
  377. USER_MANUAL = "user-manual"
  378. ANNOTATION_REPLY = "annotation-reply"
  379. OUTPUT_MODERATION = "output-moderation"
  380. INPUT_MODERATION = "input-moderation"
  381. event: QueueEvent = QueueEvent.STOP
  382. stopped_by: StopBy
  383. def get_stop_reason(self) -> str:
  384. """
  385. To stop reason
  386. """
  387. reason_mapping = {
  388. QueueStopEvent.StopBy.USER_MANUAL: "Stopped by user.",
  389. QueueStopEvent.StopBy.ANNOTATION_REPLY: "Stopped by annotation reply.",
  390. QueueStopEvent.StopBy.OUTPUT_MODERATION: "Stopped by output moderation.",
  391. QueueStopEvent.StopBy.INPUT_MODERATION: "Stopped by input moderation.",
  392. }
  393. return reason_mapping.get(self.stopped_by, "Stopped by unknown reason.")
  394. class QueueMessage(BaseModel):
  395. """
  396. QueueMessage abstract entity
  397. """
  398. task_id: str
  399. app_mode: str
  400. event: AppQueueEvent
  401. class MessageQueueMessage(QueueMessage):
  402. """
  403. MessageQueueMessage entity
  404. """
  405. message_id: str
  406. conversation_id: str
  407. class WorkflowQueueMessage(QueueMessage):
  408. """
  409. WorkflowQueueMessage entity
  410. """
  411. pass
  412. class QueueParallelBranchRunStartedEvent(AppQueueEvent):
  413. """
  414. QueueParallelBranchRunStartedEvent entity
  415. """
  416. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_STARTED
  417. parallel_id: str
  418. parallel_start_node_id: str
  419. parent_parallel_id: Optional[str] = None
  420. """parent parallel id if node is in parallel"""
  421. parent_parallel_start_node_id: Optional[str] = None
  422. """parent parallel start node id if node is in parallel"""
  423. in_iteration_id: Optional[str] = None
  424. """iteration id if node is in iteration"""
  425. class QueueParallelBranchRunSucceededEvent(AppQueueEvent):
  426. """
  427. QueueParallelBranchRunSucceededEvent entity
  428. """
  429. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_SUCCEEDED
  430. parallel_id: str
  431. parallel_start_node_id: str
  432. parent_parallel_id: Optional[str] = None
  433. """parent parallel id if node is in parallel"""
  434. parent_parallel_start_node_id: Optional[str] = None
  435. """parent parallel start node id if node is in parallel"""
  436. in_iteration_id: Optional[str] = None
  437. """iteration id if node is in iteration"""
  438. class QueueParallelBranchRunFailedEvent(AppQueueEvent):
  439. """
  440. QueueParallelBranchRunFailedEvent entity
  441. """
  442. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_FAILED
  443. parallel_id: str
  444. parallel_start_node_id: str
  445. parent_parallel_id: Optional[str] = None
  446. """parent parallel id if node is in parallel"""
  447. parent_parallel_start_node_id: Optional[str] = None
  448. """parent parallel start node id if node is in parallel"""
  449. in_iteration_id: Optional[str] = None
  450. """iteration id if node is in iteration"""
  451. error: str