您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

queue_entities.py 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. from collections.abc import Mapping, Sequence
  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.rag.entities.citation_metadata import RetrievalSourceMetadata
  8. from core.workflow.entities import AgentNodeStrategyInit, GraphRuntimeState
  9. from core.workflow.enums import WorkflowNodeExecutionMetadataKey
  10. from core.workflow.nodes import NodeType
  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. LOOP_START = "loop_start"
  29. LOOP_NEXT = "loop_next"
  30. LOOP_COMPLETED = "loop_completed"
  31. NODE_STARTED = "node_started"
  32. NODE_SUCCEEDED = "node_succeeded"
  33. NODE_FAILED = "node_failed"
  34. NODE_EXCEPTION = "node_exception"
  35. RETRIEVER_RESOURCES = "retriever_resources"
  36. ANNOTATION_REPLY = "annotation_reply"
  37. AGENT_THOUGHT = "agent_thought"
  38. MESSAGE_FILE = "message_file"
  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_title: str
  65. start_at: datetime
  66. node_run_index: int
  67. inputs: Optional[Mapping[str, Any]] = None
  68. predecessor_node_id: Optional[str] = None
  69. metadata: Optional[Mapping[str, Any]] = None
  70. class QueueIterationNextEvent(AppQueueEvent):
  71. """
  72. QueueIterationNextEvent entity
  73. """
  74. event: QueueEvent = QueueEvent.ITERATION_NEXT
  75. index: int
  76. node_execution_id: str
  77. node_id: str
  78. node_type: NodeType
  79. node_title: str
  80. node_run_index: int
  81. output: Optional[Any] = None # output for the current iteration
  82. class QueueIterationCompletedEvent(AppQueueEvent):
  83. """
  84. QueueIterationCompletedEvent entity
  85. """
  86. event: QueueEvent = QueueEvent.ITERATION_COMPLETED
  87. node_execution_id: str
  88. node_id: str
  89. node_type: NodeType
  90. node_title: str
  91. start_at: datetime
  92. node_run_index: int
  93. inputs: Optional[Mapping[str, Any]] = None
  94. outputs: Optional[Mapping[str, Any]] = None
  95. metadata: Optional[Mapping[str, Any]] = None
  96. steps: int = 0
  97. error: Optional[str] = None
  98. class QueueLoopStartEvent(AppQueueEvent):
  99. """
  100. QueueLoopStartEvent entity
  101. """
  102. event: QueueEvent = QueueEvent.LOOP_START
  103. node_execution_id: str
  104. node_id: str
  105. node_type: NodeType
  106. node_title: str
  107. parallel_id: Optional[str] = None
  108. """parallel id if node is in parallel"""
  109. parallel_start_node_id: Optional[str] = None
  110. """parallel start node id if node is in parallel"""
  111. parent_parallel_id: Optional[str] = None
  112. """parent parallel id if node is in parallel"""
  113. parent_parallel_start_node_id: Optional[str] = None
  114. """parent parallel start node id if node is in parallel"""
  115. start_at: datetime
  116. node_run_index: int
  117. inputs: Optional[Mapping[str, Any]] = None
  118. predecessor_node_id: Optional[str] = None
  119. metadata: Optional[Mapping[str, Any]] = None
  120. class QueueLoopNextEvent(AppQueueEvent):
  121. """
  122. QueueLoopNextEvent entity
  123. """
  124. event: QueueEvent = QueueEvent.LOOP_NEXT
  125. index: int
  126. node_execution_id: str
  127. node_id: str
  128. node_type: NodeType
  129. node_title: str
  130. parallel_id: Optional[str] = None
  131. """parallel id if node is in parallel"""
  132. parallel_start_node_id: Optional[str] = None
  133. """parallel start node id if node is in parallel"""
  134. parent_parallel_id: Optional[str] = None
  135. """parent parallel id if node is in parallel"""
  136. parent_parallel_start_node_id: Optional[str] = None
  137. """parent parallel start node id if node is in parallel"""
  138. parallel_mode_run_id: Optional[str] = None
  139. """iteration run in parallel mode run id"""
  140. node_run_index: int
  141. output: Optional[Any] = None # output for the current loop
  142. class QueueLoopCompletedEvent(AppQueueEvent):
  143. """
  144. QueueLoopCompletedEvent entity
  145. """
  146. event: QueueEvent = QueueEvent.LOOP_COMPLETED
  147. node_execution_id: str
  148. node_id: str
  149. node_type: NodeType
  150. node_title: str
  151. parallel_id: Optional[str] = None
  152. """parallel id if node is in parallel"""
  153. parallel_start_node_id: Optional[str] = None
  154. """parallel start node id if node is in parallel"""
  155. parent_parallel_id: Optional[str] = None
  156. """parent parallel id if node is in parallel"""
  157. parent_parallel_start_node_id: Optional[str] = None
  158. """parent parallel start node id if node is in parallel"""
  159. start_at: datetime
  160. node_run_index: int
  161. inputs: Optional[Mapping[str, Any]] = None
  162. outputs: Optional[Mapping[str, Any]] = None
  163. metadata: Optional[Mapping[str, Any]] = None
  164. steps: int = 0
  165. error: Optional[str] = None
  166. class QueueTextChunkEvent(AppQueueEvent):
  167. """
  168. QueueTextChunkEvent entity
  169. """
  170. event: QueueEvent = QueueEvent.TEXT_CHUNK
  171. text: str
  172. from_variable_selector: Optional[list[str]] = None
  173. """from variable selector"""
  174. in_iteration_id: Optional[str] = None
  175. """iteration id if node is in iteration"""
  176. in_loop_id: Optional[str] = None
  177. """loop id if node is in loop"""
  178. class QueueAgentMessageEvent(AppQueueEvent):
  179. """
  180. QueueMessageEvent entity
  181. """
  182. event: QueueEvent = QueueEvent.AGENT_MESSAGE
  183. chunk: LLMResultChunk
  184. class QueueMessageReplaceEvent(AppQueueEvent):
  185. """
  186. QueueMessageReplaceEvent entity
  187. """
  188. class MessageReplaceReason(StrEnum):
  189. """
  190. Reason for message replace event
  191. """
  192. OUTPUT_MODERATION = "output_moderation"
  193. event: QueueEvent = QueueEvent.MESSAGE_REPLACE
  194. text: str
  195. reason: str
  196. class QueueRetrieverResourcesEvent(AppQueueEvent):
  197. """
  198. QueueRetrieverResourcesEvent entity
  199. """
  200. event: QueueEvent = QueueEvent.RETRIEVER_RESOURCES
  201. retriever_resources: Sequence[RetrievalSourceMetadata]
  202. in_iteration_id: Optional[str] = None
  203. """iteration id if node is in iteration"""
  204. in_loop_id: Optional[str] = None
  205. """loop id if node is in loop"""
  206. class QueueAnnotationReplyEvent(AppQueueEvent):
  207. """
  208. QueueAnnotationReplyEvent entity
  209. """
  210. event: QueueEvent = QueueEvent.ANNOTATION_REPLY
  211. message_annotation_id: str
  212. class QueueMessageEndEvent(AppQueueEvent):
  213. """
  214. QueueMessageEndEvent entity
  215. """
  216. event: QueueEvent = QueueEvent.MESSAGE_END
  217. llm_result: Optional[LLMResult] = None
  218. class QueueAdvancedChatMessageEndEvent(AppQueueEvent):
  219. """
  220. QueueAdvancedChatMessageEndEvent entity
  221. """
  222. event: QueueEvent = QueueEvent.ADVANCED_CHAT_MESSAGE_END
  223. class QueueWorkflowStartedEvent(AppQueueEvent):
  224. """
  225. QueueWorkflowStartedEvent entity
  226. """
  227. event: QueueEvent = QueueEvent.WORKFLOW_STARTED
  228. graph_runtime_state: GraphRuntimeState
  229. class QueueWorkflowSucceededEvent(AppQueueEvent):
  230. """
  231. QueueWorkflowSucceededEvent entity
  232. """
  233. event: QueueEvent = QueueEvent.WORKFLOW_SUCCEEDED
  234. outputs: Optional[dict[str, Any]] = None
  235. class QueueWorkflowFailedEvent(AppQueueEvent):
  236. """
  237. QueueWorkflowFailedEvent entity
  238. """
  239. event: QueueEvent = QueueEvent.WORKFLOW_FAILED
  240. error: str
  241. exceptions_count: int
  242. class QueueWorkflowPartialSuccessEvent(AppQueueEvent):
  243. """
  244. QueueWorkflowFailedEvent entity
  245. """
  246. event: QueueEvent = QueueEvent.WORKFLOW_PARTIAL_SUCCEEDED
  247. exceptions_count: int
  248. outputs: Optional[dict[str, Any]] = None
  249. class QueueNodeStartedEvent(AppQueueEvent):
  250. """
  251. QueueNodeStartedEvent entity
  252. """
  253. event: QueueEvent = QueueEvent.NODE_STARTED
  254. node_execution_id: str
  255. node_id: str
  256. node_title: str
  257. node_type: NodeType
  258. node_run_index: int = 1 # FIXME(-LAN-): may not used
  259. predecessor_node_id: Optional[str] = None
  260. parallel_id: Optional[str] = None
  261. parallel_start_node_id: Optional[str] = None
  262. parent_parallel_id: Optional[str] = None
  263. parent_parallel_start_node_id: Optional[str] = None
  264. in_iteration_id: Optional[str] = None
  265. in_loop_id: Optional[str] = None
  266. start_at: datetime
  267. parallel_mode_run_id: Optional[str] = None
  268. agent_strategy: Optional[AgentNodeStrategyInit] = None
  269. # FIXME(-LAN-): only for ToolNode, need to refactor
  270. provider_type: str # should be a core.tools.entities.tool_entities.ToolProviderType
  271. provider_id: str
  272. class QueueNodeSucceededEvent(AppQueueEvent):
  273. """
  274. QueueNodeSucceededEvent entity
  275. """
  276. event: QueueEvent = QueueEvent.NODE_SUCCEEDED
  277. node_execution_id: str
  278. node_id: str
  279. node_type: NodeType
  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. in_loop_id: Optional[str] = None
  291. """loop id if node is in loop"""
  292. start_at: datetime
  293. inputs: Optional[Mapping[str, Any]] = None
  294. process_data: Optional[Mapping[str, Any]] = None
  295. outputs: Optional[Mapping[str, Any]] = None
  296. execution_metadata: Optional[Mapping[WorkflowNodeExecutionMetadataKey, Any]] = None
  297. error: Optional[str] = None
  298. class QueueAgentLogEvent(AppQueueEvent):
  299. """
  300. QueueAgentLogEvent entity
  301. """
  302. event: QueueEvent = QueueEvent.AGENT_LOG
  303. id: str
  304. label: str
  305. node_execution_id: str
  306. parent_id: str | None
  307. error: str | None
  308. status: str
  309. data: Mapping[str, Any]
  310. metadata: Optional[Mapping[str, Any]] = None
  311. node_id: str
  312. class QueueNodeRetryEvent(QueueNodeStartedEvent):
  313. """QueueNodeRetryEvent entity"""
  314. event: QueueEvent = QueueEvent.RETRY
  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[WorkflowNodeExecutionMetadataKey, Any]] = None
  319. error: str
  320. retry_index: int # retry index
  321. class QueueNodeExceptionEvent(AppQueueEvent):
  322. """
  323. QueueNodeExceptionEvent entity
  324. """
  325. event: QueueEvent = QueueEvent.NODE_EXCEPTION
  326. node_execution_id: str
  327. node_id: str
  328. node_type: NodeType
  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. in_loop_id: Optional[str] = None
  340. """loop id if node is in loop"""
  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[WorkflowNodeExecutionMetadataKey, Any]] = None
  346. error: str
  347. class QueueNodeFailedEvent(AppQueueEvent):
  348. """
  349. QueueNodeFailedEvent entity
  350. """
  351. event: QueueEvent = QueueEvent.NODE_FAILED
  352. node_execution_id: str
  353. node_id: str
  354. node_type: NodeType
  355. parallel_id: Optional[str] = None
  356. in_iteration_id: Optional[str] = None
  357. """iteration id if node is in iteration"""
  358. in_loop_id: Optional[str] = None
  359. """loop id if node is in loop"""
  360. start_at: datetime
  361. inputs: Optional[Mapping[str, Any]] = None
  362. process_data: Optional[Mapping[str, Any]] = None
  363. outputs: Optional[Mapping[str, Any]] = None
  364. execution_metadata: Optional[Mapping[WorkflowNodeExecutionMetadataKey, Any]] = None
  365. error: str
  366. class QueueAgentThoughtEvent(AppQueueEvent):
  367. """
  368. QueueAgentThoughtEvent entity
  369. """
  370. event: QueueEvent = QueueEvent.AGENT_THOUGHT
  371. agent_thought_id: str
  372. class QueueMessageFileEvent(AppQueueEvent):
  373. """
  374. QueueAgentThoughtEvent entity
  375. """
  376. event: QueueEvent = QueueEvent.MESSAGE_FILE
  377. message_file_id: str
  378. class QueueErrorEvent(AppQueueEvent):
  379. """
  380. QueueErrorEvent entity
  381. """
  382. event: QueueEvent = QueueEvent.ERROR
  383. error: Optional[Any] = None
  384. class QueuePingEvent(AppQueueEvent):
  385. """
  386. QueuePingEvent entity
  387. """
  388. event: QueueEvent = QueueEvent.PING
  389. class QueueStopEvent(AppQueueEvent):
  390. """
  391. QueueStopEvent entity
  392. """
  393. class StopBy(Enum):
  394. """
  395. Stop by enum
  396. """
  397. USER_MANUAL = "user-manual"
  398. ANNOTATION_REPLY = "annotation-reply"
  399. OUTPUT_MODERATION = "output-moderation"
  400. INPUT_MODERATION = "input-moderation"
  401. event: QueueEvent = QueueEvent.STOP
  402. stopped_by: StopBy
  403. def get_stop_reason(self) -> str:
  404. """
  405. To stop reason
  406. """
  407. reason_mapping = {
  408. QueueStopEvent.StopBy.USER_MANUAL: "Stopped by user.",
  409. QueueStopEvent.StopBy.ANNOTATION_REPLY: "Stopped by annotation reply.",
  410. QueueStopEvent.StopBy.OUTPUT_MODERATION: "Stopped by output moderation.",
  411. QueueStopEvent.StopBy.INPUT_MODERATION: "Stopped by input moderation.",
  412. }
  413. return reason_mapping.get(self.stopped_by, "Stopped by unknown reason.")
  414. class QueueMessage(BaseModel):
  415. """
  416. QueueMessage abstract entity
  417. """
  418. task_id: str
  419. app_mode: str
  420. event: AppQueueEvent
  421. class MessageQueueMessage(QueueMessage):
  422. """
  423. MessageQueueMessage entity
  424. """
  425. message_id: str
  426. conversation_id: str
  427. class WorkflowQueueMessage(QueueMessage):
  428. """
  429. WorkflowQueueMessage entity
  430. """
  431. pass