You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

task_entities.py 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. from collections.abc import Mapping, Sequence
  2. from enum import Enum
  3. from typing import Any, Optional
  4. from pydantic import BaseModel, ConfigDict
  5. from core.model_runtime.entities.llm_entities import LLMResult
  6. from core.model_runtime.utils.encoders import jsonable_encoder
  7. from core.workflow.entities.node_entities import AgentNodeStrategyInit
  8. from core.workflow.entities.workflow_node_execution import NodeRunMetadataKey, WorkflowNodeExecutionStatus
  9. class TaskState(BaseModel):
  10. """
  11. TaskState entity
  12. """
  13. metadata: dict = {}
  14. class EasyUITaskState(TaskState):
  15. """
  16. EasyUITaskState entity
  17. """
  18. llm_result: LLMResult
  19. class WorkflowTaskState(TaskState):
  20. """
  21. WorkflowTaskState entity
  22. """
  23. answer: str = ""
  24. class StreamEvent(Enum):
  25. """
  26. Stream event
  27. """
  28. PING = "ping"
  29. ERROR = "error"
  30. MESSAGE = "message"
  31. MESSAGE_END = "message_end"
  32. TTS_MESSAGE = "tts_message"
  33. TTS_MESSAGE_END = "tts_message_end"
  34. MESSAGE_FILE = "message_file"
  35. MESSAGE_REPLACE = "message_replace"
  36. AGENT_THOUGHT = "agent_thought"
  37. AGENT_MESSAGE = "agent_message"
  38. WORKFLOW_STARTED = "workflow_started"
  39. WORKFLOW_FINISHED = "workflow_finished"
  40. NODE_STARTED = "node_started"
  41. NODE_FINISHED = "node_finished"
  42. NODE_RETRY = "node_retry"
  43. PARALLEL_BRANCH_STARTED = "parallel_branch_started"
  44. PARALLEL_BRANCH_FINISHED = "parallel_branch_finished"
  45. ITERATION_STARTED = "iteration_started"
  46. ITERATION_NEXT = "iteration_next"
  47. ITERATION_COMPLETED = "iteration_completed"
  48. LOOP_STARTED = "loop_started"
  49. LOOP_NEXT = "loop_next"
  50. LOOP_COMPLETED = "loop_completed"
  51. TEXT_CHUNK = "text_chunk"
  52. TEXT_REPLACE = "text_replace"
  53. AGENT_LOG = "agent_log"
  54. class StreamResponse(BaseModel):
  55. """
  56. StreamResponse entity
  57. """
  58. event: StreamEvent
  59. task_id: str
  60. def to_dict(self):
  61. return jsonable_encoder(self)
  62. class ErrorStreamResponse(StreamResponse):
  63. """
  64. ErrorStreamResponse entity
  65. """
  66. event: StreamEvent = StreamEvent.ERROR
  67. err: Exception
  68. model_config = ConfigDict(arbitrary_types_allowed=True)
  69. class MessageStreamResponse(StreamResponse):
  70. """
  71. MessageStreamResponse entity
  72. """
  73. event: StreamEvent = StreamEvent.MESSAGE
  74. id: str
  75. answer: str
  76. from_variable_selector: Optional[list[str]] = None
  77. class MessageAudioStreamResponse(StreamResponse):
  78. """
  79. MessageStreamResponse entity
  80. """
  81. event: StreamEvent = StreamEvent.TTS_MESSAGE
  82. audio: str
  83. class MessageAudioEndStreamResponse(StreamResponse):
  84. """
  85. MessageStreamResponse entity
  86. """
  87. event: StreamEvent = StreamEvent.TTS_MESSAGE_END
  88. audio: str
  89. class MessageEndStreamResponse(StreamResponse):
  90. """
  91. MessageEndStreamResponse entity
  92. """
  93. event: StreamEvent = StreamEvent.MESSAGE_END
  94. id: str
  95. metadata: dict = {}
  96. files: Optional[Sequence[Mapping[str, Any]]] = None
  97. class MessageFileStreamResponse(StreamResponse):
  98. """
  99. MessageFileStreamResponse entity
  100. """
  101. event: StreamEvent = StreamEvent.MESSAGE_FILE
  102. id: str
  103. type: str
  104. belongs_to: str
  105. url: str
  106. class MessageReplaceStreamResponse(StreamResponse):
  107. """
  108. MessageReplaceStreamResponse entity
  109. """
  110. event: StreamEvent = StreamEvent.MESSAGE_REPLACE
  111. answer: str
  112. reason: str
  113. class AgentThoughtStreamResponse(StreamResponse):
  114. """
  115. AgentThoughtStreamResponse entity
  116. """
  117. event: StreamEvent = StreamEvent.AGENT_THOUGHT
  118. id: str
  119. position: int
  120. thought: Optional[str] = None
  121. observation: Optional[str] = None
  122. tool: Optional[str] = None
  123. tool_labels: Optional[dict] = None
  124. tool_input: Optional[str] = None
  125. message_files: Optional[list[str]] = None
  126. class AgentMessageStreamResponse(StreamResponse):
  127. """
  128. AgentMessageStreamResponse entity
  129. """
  130. event: StreamEvent = StreamEvent.AGENT_MESSAGE
  131. id: str
  132. answer: str
  133. class WorkflowStartStreamResponse(StreamResponse):
  134. """
  135. WorkflowStartStreamResponse entity
  136. """
  137. class Data(BaseModel):
  138. """
  139. Data entity
  140. """
  141. id: str
  142. workflow_id: str
  143. inputs: Mapping[str, Any]
  144. created_at: int
  145. event: StreamEvent = StreamEvent.WORKFLOW_STARTED
  146. workflow_run_id: str
  147. data: Data
  148. class WorkflowFinishStreamResponse(StreamResponse):
  149. """
  150. WorkflowFinishStreamResponse entity
  151. """
  152. class Data(BaseModel):
  153. """
  154. Data entity
  155. """
  156. id: str
  157. workflow_id: str
  158. status: str
  159. outputs: Optional[Mapping[str, Any]] = None
  160. error: Optional[str] = None
  161. elapsed_time: float
  162. total_tokens: int
  163. total_steps: int
  164. created_by: Optional[dict] = None
  165. created_at: int
  166. finished_at: int
  167. exceptions_count: Optional[int] = 0
  168. files: Optional[Sequence[Mapping[str, Any]]] = []
  169. event: StreamEvent = StreamEvent.WORKFLOW_FINISHED
  170. workflow_run_id: str
  171. data: Data
  172. class NodeStartStreamResponse(StreamResponse):
  173. """
  174. NodeStartStreamResponse entity
  175. """
  176. class Data(BaseModel):
  177. """
  178. Data entity
  179. """
  180. id: str
  181. node_id: str
  182. node_type: str
  183. title: str
  184. index: int
  185. predecessor_node_id: Optional[str] = None
  186. inputs: Optional[Mapping[str, Any]] = None
  187. created_at: int
  188. extras: dict = {}
  189. parallel_id: Optional[str] = None
  190. parallel_start_node_id: Optional[str] = None
  191. parent_parallel_id: Optional[str] = None
  192. parent_parallel_start_node_id: Optional[str] = None
  193. iteration_id: Optional[str] = None
  194. loop_id: Optional[str] = None
  195. parallel_run_id: Optional[str] = None
  196. agent_strategy: Optional[AgentNodeStrategyInit] = None
  197. event: StreamEvent = StreamEvent.NODE_STARTED
  198. workflow_run_id: str
  199. data: Data
  200. def to_ignore_detail_dict(self):
  201. return {
  202. "event": self.event.value,
  203. "task_id": self.task_id,
  204. "workflow_run_id": self.workflow_run_id,
  205. "data": {
  206. "id": self.data.id,
  207. "node_id": self.data.node_id,
  208. "node_type": self.data.node_type,
  209. "title": self.data.title,
  210. "index": self.data.index,
  211. "predecessor_node_id": self.data.predecessor_node_id,
  212. "inputs": None,
  213. "created_at": self.data.created_at,
  214. "extras": {},
  215. "parallel_id": self.data.parallel_id,
  216. "parallel_start_node_id": self.data.parallel_start_node_id,
  217. "parent_parallel_id": self.data.parent_parallel_id,
  218. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  219. "iteration_id": self.data.iteration_id,
  220. "loop_id": self.data.loop_id,
  221. },
  222. }
  223. class NodeFinishStreamResponse(StreamResponse):
  224. """
  225. NodeFinishStreamResponse entity
  226. """
  227. class Data(BaseModel):
  228. """
  229. Data entity
  230. """
  231. id: str
  232. node_id: str
  233. node_type: str
  234. title: str
  235. index: int
  236. predecessor_node_id: Optional[str] = None
  237. inputs: Optional[Mapping[str, Any]] = None
  238. process_data: Optional[Mapping[str, Any]] = None
  239. outputs: Optional[Mapping[str, Any]] = None
  240. status: str
  241. error: Optional[str] = None
  242. elapsed_time: float
  243. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  244. created_at: int
  245. finished_at: int
  246. files: Optional[Sequence[Mapping[str, Any]]] = []
  247. parallel_id: Optional[str] = None
  248. parallel_start_node_id: Optional[str] = None
  249. parent_parallel_id: Optional[str] = None
  250. parent_parallel_start_node_id: Optional[str] = None
  251. iteration_id: Optional[str] = None
  252. loop_id: Optional[str] = None
  253. event: StreamEvent = StreamEvent.NODE_FINISHED
  254. workflow_run_id: str
  255. data: Data
  256. def to_ignore_detail_dict(self):
  257. return {
  258. "event": self.event.value,
  259. "task_id": self.task_id,
  260. "workflow_run_id": self.workflow_run_id,
  261. "data": {
  262. "id": self.data.id,
  263. "node_id": self.data.node_id,
  264. "node_type": self.data.node_type,
  265. "title": self.data.title,
  266. "index": self.data.index,
  267. "predecessor_node_id": self.data.predecessor_node_id,
  268. "inputs": None,
  269. "process_data": None,
  270. "outputs": None,
  271. "status": self.data.status,
  272. "error": None,
  273. "elapsed_time": self.data.elapsed_time,
  274. "execution_metadata": None,
  275. "created_at": self.data.created_at,
  276. "finished_at": self.data.finished_at,
  277. "files": [],
  278. "parallel_id": self.data.parallel_id,
  279. "parallel_start_node_id": self.data.parallel_start_node_id,
  280. "parent_parallel_id": self.data.parent_parallel_id,
  281. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  282. "iteration_id": self.data.iteration_id,
  283. "loop_id": self.data.loop_id,
  284. },
  285. }
  286. class NodeRetryStreamResponse(StreamResponse):
  287. """
  288. NodeFinishStreamResponse entity
  289. """
  290. class Data(BaseModel):
  291. """
  292. Data entity
  293. """
  294. id: str
  295. node_id: str
  296. node_type: str
  297. title: str
  298. index: int
  299. predecessor_node_id: Optional[str] = None
  300. inputs: Optional[Mapping[str, Any]] = None
  301. process_data: Optional[Mapping[str, Any]] = None
  302. outputs: Optional[Mapping[str, Any]] = None
  303. status: str
  304. error: Optional[str] = None
  305. elapsed_time: float
  306. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  307. created_at: int
  308. finished_at: int
  309. files: Optional[Sequence[Mapping[str, Any]]] = []
  310. parallel_id: Optional[str] = None
  311. parallel_start_node_id: Optional[str] = None
  312. parent_parallel_id: Optional[str] = None
  313. parent_parallel_start_node_id: Optional[str] = None
  314. iteration_id: Optional[str] = None
  315. loop_id: Optional[str] = None
  316. retry_index: int = 0
  317. event: StreamEvent = StreamEvent.NODE_RETRY
  318. workflow_run_id: str
  319. data: Data
  320. def to_ignore_detail_dict(self):
  321. return {
  322. "event": self.event.value,
  323. "task_id": self.task_id,
  324. "workflow_run_id": self.workflow_run_id,
  325. "data": {
  326. "id": self.data.id,
  327. "node_id": self.data.node_id,
  328. "node_type": self.data.node_type,
  329. "title": self.data.title,
  330. "index": self.data.index,
  331. "predecessor_node_id": self.data.predecessor_node_id,
  332. "inputs": None,
  333. "process_data": None,
  334. "outputs": None,
  335. "status": self.data.status,
  336. "error": None,
  337. "elapsed_time": self.data.elapsed_time,
  338. "execution_metadata": None,
  339. "created_at": self.data.created_at,
  340. "finished_at": self.data.finished_at,
  341. "files": [],
  342. "parallel_id": self.data.parallel_id,
  343. "parallel_start_node_id": self.data.parallel_start_node_id,
  344. "parent_parallel_id": self.data.parent_parallel_id,
  345. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  346. "iteration_id": self.data.iteration_id,
  347. "loop_id": self.data.loop_id,
  348. "retry_index": self.data.retry_index,
  349. },
  350. }
  351. class ParallelBranchStartStreamResponse(StreamResponse):
  352. """
  353. ParallelBranchStartStreamResponse entity
  354. """
  355. class Data(BaseModel):
  356. """
  357. Data entity
  358. """
  359. parallel_id: str
  360. parallel_branch_id: str
  361. parent_parallel_id: Optional[str] = None
  362. parent_parallel_start_node_id: Optional[str] = None
  363. iteration_id: Optional[str] = None
  364. loop_id: Optional[str] = None
  365. created_at: int
  366. event: StreamEvent = StreamEvent.PARALLEL_BRANCH_STARTED
  367. workflow_run_id: str
  368. data: Data
  369. class ParallelBranchFinishedStreamResponse(StreamResponse):
  370. """
  371. ParallelBranchFinishedStreamResponse entity
  372. """
  373. class Data(BaseModel):
  374. """
  375. Data entity
  376. """
  377. parallel_id: str
  378. parallel_branch_id: str
  379. parent_parallel_id: Optional[str] = None
  380. parent_parallel_start_node_id: Optional[str] = None
  381. iteration_id: Optional[str] = None
  382. loop_id: Optional[str] = None
  383. status: str
  384. error: Optional[str] = None
  385. created_at: int
  386. event: StreamEvent = StreamEvent.PARALLEL_BRANCH_FINISHED
  387. workflow_run_id: str
  388. data: Data
  389. class IterationNodeStartStreamResponse(StreamResponse):
  390. """
  391. NodeStartStreamResponse entity
  392. """
  393. class Data(BaseModel):
  394. """
  395. Data entity
  396. """
  397. id: str
  398. node_id: str
  399. node_type: str
  400. title: str
  401. created_at: int
  402. extras: dict = {}
  403. metadata: Mapping = {}
  404. inputs: Mapping = {}
  405. parallel_id: Optional[str] = None
  406. parallel_start_node_id: Optional[str] = None
  407. event: StreamEvent = StreamEvent.ITERATION_STARTED
  408. workflow_run_id: str
  409. data: Data
  410. class IterationNodeNextStreamResponse(StreamResponse):
  411. """
  412. NodeStartStreamResponse entity
  413. """
  414. class Data(BaseModel):
  415. """
  416. Data entity
  417. """
  418. id: str
  419. node_id: str
  420. node_type: str
  421. title: str
  422. index: int
  423. created_at: int
  424. pre_iteration_output: Optional[Any] = None
  425. extras: dict = {}
  426. parallel_id: Optional[str] = None
  427. parallel_start_node_id: Optional[str] = None
  428. parallel_mode_run_id: Optional[str] = None
  429. duration: Optional[float] = None
  430. event: StreamEvent = StreamEvent.ITERATION_NEXT
  431. workflow_run_id: str
  432. data: Data
  433. class IterationNodeCompletedStreamResponse(StreamResponse):
  434. """
  435. NodeCompletedStreamResponse entity
  436. """
  437. class Data(BaseModel):
  438. """
  439. Data entity
  440. """
  441. id: str
  442. node_id: str
  443. node_type: str
  444. title: str
  445. outputs: Optional[Mapping] = None
  446. created_at: int
  447. extras: Optional[dict] = None
  448. inputs: Optional[Mapping] = None
  449. status: WorkflowNodeExecutionStatus
  450. error: Optional[str] = None
  451. elapsed_time: float
  452. total_tokens: int
  453. execution_metadata: Optional[Mapping] = None
  454. finished_at: int
  455. steps: int
  456. parallel_id: Optional[str] = None
  457. parallel_start_node_id: Optional[str] = None
  458. event: StreamEvent = StreamEvent.ITERATION_COMPLETED
  459. workflow_run_id: str
  460. data: Data
  461. class LoopNodeStartStreamResponse(StreamResponse):
  462. """
  463. NodeStartStreamResponse entity
  464. """
  465. class Data(BaseModel):
  466. """
  467. Data entity
  468. """
  469. id: str
  470. node_id: str
  471. node_type: str
  472. title: str
  473. created_at: int
  474. extras: dict = {}
  475. metadata: Mapping = {}
  476. inputs: Mapping = {}
  477. parallel_id: Optional[str] = None
  478. parallel_start_node_id: Optional[str] = None
  479. event: StreamEvent = StreamEvent.LOOP_STARTED
  480. workflow_run_id: str
  481. data: Data
  482. class LoopNodeNextStreamResponse(StreamResponse):
  483. """
  484. NodeStartStreamResponse entity
  485. """
  486. class Data(BaseModel):
  487. """
  488. Data entity
  489. """
  490. id: str
  491. node_id: str
  492. node_type: str
  493. title: str
  494. index: int
  495. created_at: int
  496. pre_loop_output: Optional[Any] = None
  497. extras: dict = {}
  498. parallel_id: Optional[str] = None
  499. parallel_start_node_id: Optional[str] = None
  500. parallel_mode_run_id: Optional[str] = None
  501. duration: Optional[float] = None
  502. event: StreamEvent = StreamEvent.LOOP_NEXT
  503. workflow_run_id: str
  504. data: Data
  505. class LoopNodeCompletedStreamResponse(StreamResponse):
  506. """
  507. NodeCompletedStreamResponse entity
  508. """
  509. class Data(BaseModel):
  510. """
  511. Data entity
  512. """
  513. id: str
  514. node_id: str
  515. node_type: str
  516. title: str
  517. outputs: Optional[Mapping] = None
  518. created_at: int
  519. extras: Optional[dict] = None
  520. inputs: Optional[Mapping] = None
  521. status: WorkflowNodeExecutionStatus
  522. error: Optional[str] = None
  523. elapsed_time: float
  524. total_tokens: int
  525. execution_metadata: Optional[Mapping] = None
  526. finished_at: int
  527. steps: int
  528. parallel_id: Optional[str] = None
  529. parallel_start_node_id: Optional[str] = None
  530. event: StreamEvent = StreamEvent.LOOP_COMPLETED
  531. workflow_run_id: str
  532. data: Data
  533. class TextChunkStreamResponse(StreamResponse):
  534. """
  535. TextChunkStreamResponse entity
  536. """
  537. class Data(BaseModel):
  538. """
  539. Data entity
  540. """
  541. text: str
  542. from_variable_selector: Optional[list[str]] = None
  543. event: StreamEvent = StreamEvent.TEXT_CHUNK
  544. data: Data
  545. class TextReplaceStreamResponse(StreamResponse):
  546. """
  547. TextReplaceStreamResponse entity
  548. """
  549. class Data(BaseModel):
  550. """
  551. Data entity
  552. """
  553. text: str
  554. event: StreamEvent = StreamEvent.TEXT_REPLACE
  555. data: Data
  556. class PingStreamResponse(StreamResponse):
  557. """
  558. PingStreamResponse entity
  559. """
  560. event: StreamEvent = StreamEvent.PING
  561. class AppStreamResponse(BaseModel):
  562. """
  563. AppStreamResponse entity
  564. """
  565. stream_response: StreamResponse
  566. class ChatbotAppStreamResponse(AppStreamResponse):
  567. """
  568. ChatbotAppStreamResponse entity
  569. """
  570. conversation_id: str
  571. message_id: str
  572. created_at: int
  573. class CompletionAppStreamResponse(AppStreamResponse):
  574. """
  575. CompletionAppStreamResponse entity
  576. """
  577. message_id: str
  578. created_at: int
  579. class WorkflowAppStreamResponse(AppStreamResponse):
  580. """
  581. WorkflowAppStreamResponse entity
  582. """
  583. workflow_run_id: Optional[str] = None
  584. class AppBlockingResponse(BaseModel):
  585. """
  586. AppBlockingResponse entity
  587. """
  588. task_id: str
  589. def to_dict(self):
  590. return jsonable_encoder(self)
  591. class ChatbotAppBlockingResponse(AppBlockingResponse):
  592. """
  593. ChatbotAppBlockingResponse entity
  594. """
  595. class Data(BaseModel):
  596. """
  597. Data entity
  598. """
  599. id: str
  600. mode: str
  601. conversation_id: str
  602. message_id: str
  603. answer: str
  604. metadata: dict = {}
  605. created_at: int
  606. data: Data
  607. class CompletionAppBlockingResponse(AppBlockingResponse):
  608. """
  609. CompletionAppBlockingResponse entity
  610. """
  611. class Data(BaseModel):
  612. """
  613. Data entity
  614. """
  615. id: str
  616. mode: str
  617. message_id: str
  618. answer: str
  619. metadata: dict = {}
  620. created_at: int
  621. data: Data
  622. class WorkflowAppBlockingResponse(AppBlockingResponse):
  623. """
  624. WorkflowAppBlockingResponse entity
  625. """
  626. class Data(BaseModel):
  627. """
  628. Data entity
  629. """
  630. id: str
  631. workflow_id: str
  632. status: str
  633. outputs: Optional[Mapping[str, Any]] = None
  634. error: Optional[str] = None
  635. elapsed_time: float
  636. total_tokens: int
  637. total_steps: int
  638. created_at: int
  639. finished_at: int
  640. workflow_run_id: str
  641. data: Data
  642. class AgentLogStreamResponse(StreamResponse):
  643. """
  644. AgentLogStreamResponse entity
  645. """
  646. class Data(BaseModel):
  647. """
  648. Data entity
  649. """
  650. node_execution_id: str
  651. id: str
  652. label: str
  653. parent_id: str | None
  654. error: str | None
  655. status: str
  656. data: Mapping[str, Any]
  657. metadata: Optional[Mapping[str, Any]] = None
  658. node_id: str
  659. event: StreamEvent = StreamEvent.AGENT_LOG
  660. data: Data