task_entities.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  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 models.workflow import 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. class AgentThoughtStreamResponse(StreamResponse):
  113. """
  114. AgentThoughtStreamResponse entity
  115. """
  116. event: StreamEvent = StreamEvent.AGENT_THOUGHT
  117. id: str
  118. position: int
  119. thought: Optional[str] = None
  120. observation: Optional[str] = None
  121. tool: Optional[str] = None
  122. tool_labels: Optional[dict] = None
  123. tool_input: Optional[str] = None
  124. message_files: Optional[list[str]] = None
  125. class AgentMessageStreamResponse(StreamResponse):
  126. """
  127. AgentMessageStreamResponse entity
  128. """
  129. event: StreamEvent = StreamEvent.AGENT_MESSAGE
  130. id: str
  131. answer: str
  132. class WorkflowStartStreamResponse(StreamResponse):
  133. """
  134. WorkflowStartStreamResponse entity
  135. """
  136. class Data(BaseModel):
  137. """
  138. Data entity
  139. """
  140. id: str
  141. workflow_id: str
  142. sequence_number: int
  143. inputs: dict
  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. sequence_number: int
  159. status: str
  160. outputs: Optional[dict] = None
  161. error: Optional[str] = None
  162. elapsed_time: float
  163. total_tokens: int
  164. total_steps: int
  165. created_by: Optional[dict] = None
  166. created_at: int
  167. finished_at: int
  168. exceptions_count: Optional[int] = 0
  169. files: Optional[Sequence[Mapping[str, Any]]] = []
  170. event: StreamEvent = StreamEvent.WORKFLOW_FINISHED
  171. workflow_run_id: str
  172. data: Data
  173. class NodeStartStreamResponse(StreamResponse):
  174. """
  175. NodeStartStreamResponse entity
  176. """
  177. class Data(BaseModel):
  178. """
  179. Data entity
  180. """
  181. id: str
  182. node_id: str
  183. node_type: str
  184. title: str
  185. index: int
  186. predecessor_node_id: Optional[str] = None
  187. inputs: Optional[dict] = None
  188. created_at: int
  189. extras: dict = {}
  190. parallel_id: Optional[str] = None
  191. parallel_start_node_id: Optional[str] = None
  192. parent_parallel_id: Optional[str] = None
  193. parent_parallel_start_node_id: Optional[str] = None
  194. iteration_id: Optional[str] = None
  195. loop_id: Optional[str] = None
  196. parallel_run_id: Optional[str] = None
  197. agent_strategy: Optional[AgentNodeStrategyInit] = None
  198. event: StreamEvent = StreamEvent.NODE_STARTED
  199. workflow_run_id: str
  200. data: Data
  201. def to_ignore_detail_dict(self):
  202. return {
  203. "event": self.event.value,
  204. "task_id": self.task_id,
  205. "workflow_run_id": self.workflow_run_id,
  206. "data": {
  207. "id": self.data.id,
  208. "node_id": self.data.node_id,
  209. "node_type": self.data.node_type,
  210. "title": self.data.title,
  211. "index": self.data.index,
  212. "predecessor_node_id": self.data.predecessor_node_id,
  213. "inputs": None,
  214. "created_at": self.data.created_at,
  215. "extras": {},
  216. "parallel_id": self.data.parallel_id,
  217. "parallel_start_node_id": self.data.parallel_start_node_id,
  218. "parent_parallel_id": self.data.parent_parallel_id,
  219. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  220. "iteration_id": self.data.iteration_id,
  221. "loop_id": self.data.loop_id,
  222. },
  223. }
  224. class NodeFinishStreamResponse(StreamResponse):
  225. """
  226. NodeFinishStreamResponse entity
  227. """
  228. class Data(BaseModel):
  229. """
  230. Data entity
  231. """
  232. id: str
  233. node_id: str
  234. node_type: str
  235. title: str
  236. index: int
  237. predecessor_node_id: Optional[str] = None
  238. inputs: Optional[dict] = None
  239. process_data: Optional[dict] = None
  240. outputs: Optional[dict] = None
  241. status: str
  242. error: Optional[str] = None
  243. elapsed_time: float
  244. execution_metadata: Optional[dict] = None
  245. created_at: int
  246. finished_at: int
  247. files: Optional[Sequence[Mapping[str, Any]]] = []
  248. parallel_id: Optional[str] = None
  249. parallel_start_node_id: Optional[str] = None
  250. parent_parallel_id: Optional[str] = None
  251. parent_parallel_start_node_id: Optional[str] = None
  252. iteration_id: Optional[str] = None
  253. loop_id: Optional[str] = None
  254. event: StreamEvent = StreamEvent.NODE_FINISHED
  255. workflow_run_id: str
  256. data: Data
  257. def to_ignore_detail_dict(self):
  258. return {
  259. "event": self.event.value,
  260. "task_id": self.task_id,
  261. "workflow_run_id": self.workflow_run_id,
  262. "data": {
  263. "id": self.data.id,
  264. "node_id": self.data.node_id,
  265. "node_type": self.data.node_type,
  266. "title": self.data.title,
  267. "index": self.data.index,
  268. "predecessor_node_id": self.data.predecessor_node_id,
  269. "inputs": None,
  270. "process_data": None,
  271. "outputs": None,
  272. "status": self.data.status,
  273. "error": None,
  274. "elapsed_time": self.data.elapsed_time,
  275. "execution_metadata": None,
  276. "created_at": self.data.created_at,
  277. "finished_at": self.data.finished_at,
  278. "files": [],
  279. "parallel_id": self.data.parallel_id,
  280. "parallel_start_node_id": self.data.parallel_start_node_id,
  281. "parent_parallel_id": self.data.parent_parallel_id,
  282. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  283. "iteration_id": self.data.iteration_id,
  284. "loop_id": self.data.loop_id,
  285. },
  286. }
  287. class NodeRetryStreamResponse(StreamResponse):
  288. """
  289. NodeFinishStreamResponse entity
  290. """
  291. class Data(BaseModel):
  292. """
  293. Data entity
  294. """
  295. id: str
  296. node_id: str
  297. node_type: str
  298. title: str
  299. index: int
  300. predecessor_node_id: Optional[str] = None
  301. inputs: Optional[dict] = None
  302. process_data: Optional[dict] = None
  303. outputs: Optional[dict] = None
  304. status: str
  305. error: Optional[str] = None
  306. elapsed_time: float
  307. execution_metadata: Optional[dict] = None
  308. created_at: int
  309. finished_at: int
  310. files: Optional[Sequence[Mapping[str, Any]]] = []
  311. parallel_id: Optional[str] = None
  312. parallel_start_node_id: Optional[str] = None
  313. parent_parallel_id: Optional[str] = None
  314. parent_parallel_start_node_id: Optional[str] = None
  315. iteration_id: Optional[str] = None
  316. loop_id: Optional[str] = None
  317. retry_index: int = 0
  318. event: StreamEvent = StreamEvent.NODE_RETRY
  319. workflow_run_id: str
  320. data: Data
  321. def to_ignore_detail_dict(self):
  322. return {
  323. "event": self.event.value,
  324. "task_id": self.task_id,
  325. "workflow_run_id": self.workflow_run_id,
  326. "data": {
  327. "id": self.data.id,
  328. "node_id": self.data.node_id,
  329. "node_type": self.data.node_type,
  330. "title": self.data.title,
  331. "index": self.data.index,
  332. "predecessor_node_id": self.data.predecessor_node_id,
  333. "inputs": None,
  334. "process_data": None,
  335. "outputs": None,
  336. "status": self.data.status,
  337. "error": None,
  338. "elapsed_time": self.data.elapsed_time,
  339. "execution_metadata": None,
  340. "created_at": self.data.created_at,
  341. "finished_at": self.data.finished_at,
  342. "files": [],
  343. "parallel_id": self.data.parallel_id,
  344. "parallel_start_node_id": self.data.parallel_start_node_id,
  345. "parent_parallel_id": self.data.parent_parallel_id,
  346. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  347. "iteration_id": self.data.iteration_id,
  348. "loop_id": self.data.loop_id,
  349. "retry_index": self.data.retry_index,
  350. },
  351. }
  352. class ParallelBranchStartStreamResponse(StreamResponse):
  353. """
  354. ParallelBranchStartStreamResponse entity
  355. """
  356. class Data(BaseModel):
  357. """
  358. Data entity
  359. """
  360. parallel_id: str
  361. parallel_branch_id: str
  362. parent_parallel_id: Optional[str] = None
  363. parent_parallel_start_node_id: Optional[str] = None
  364. iteration_id: Optional[str] = None
  365. loop_id: Optional[str] = None
  366. created_at: int
  367. event: StreamEvent = StreamEvent.PARALLEL_BRANCH_STARTED
  368. workflow_run_id: str
  369. data: Data
  370. class ParallelBranchFinishedStreamResponse(StreamResponse):
  371. """
  372. ParallelBranchFinishedStreamResponse entity
  373. """
  374. class Data(BaseModel):
  375. """
  376. Data entity
  377. """
  378. parallel_id: str
  379. parallel_branch_id: str
  380. parent_parallel_id: Optional[str] = None
  381. parent_parallel_start_node_id: Optional[str] = None
  382. iteration_id: Optional[str] = None
  383. loop_id: Optional[str] = None
  384. status: str
  385. error: Optional[str] = None
  386. created_at: int
  387. event: StreamEvent = StreamEvent.PARALLEL_BRANCH_FINISHED
  388. workflow_run_id: str
  389. data: Data
  390. class IterationNodeStartStreamResponse(StreamResponse):
  391. """
  392. NodeStartStreamResponse entity
  393. """
  394. class Data(BaseModel):
  395. """
  396. Data entity
  397. """
  398. id: str
  399. node_id: str
  400. node_type: str
  401. title: str
  402. created_at: int
  403. extras: dict = {}
  404. metadata: Mapping = {}
  405. inputs: Mapping = {}
  406. parallel_id: Optional[str] = None
  407. parallel_start_node_id: Optional[str] = None
  408. event: StreamEvent = StreamEvent.ITERATION_STARTED
  409. workflow_run_id: str
  410. data: Data
  411. class IterationNodeNextStreamResponse(StreamResponse):
  412. """
  413. NodeStartStreamResponse entity
  414. """
  415. class Data(BaseModel):
  416. """
  417. Data entity
  418. """
  419. id: str
  420. node_id: str
  421. node_type: str
  422. title: str
  423. index: int
  424. created_at: int
  425. pre_iteration_output: Optional[Any] = None
  426. extras: dict = {}
  427. parallel_id: Optional[str] = None
  428. parallel_start_node_id: Optional[str] = None
  429. parallel_mode_run_id: Optional[str] = None
  430. duration: Optional[float] = None
  431. event: StreamEvent = StreamEvent.ITERATION_NEXT
  432. workflow_run_id: str
  433. data: Data
  434. class IterationNodeCompletedStreamResponse(StreamResponse):
  435. """
  436. NodeCompletedStreamResponse entity
  437. """
  438. class Data(BaseModel):
  439. """
  440. Data entity
  441. """
  442. id: str
  443. node_id: str
  444. node_type: str
  445. title: str
  446. outputs: Optional[Mapping] = None
  447. created_at: int
  448. extras: Optional[dict] = None
  449. inputs: Optional[Mapping] = None
  450. status: WorkflowNodeExecutionStatus
  451. error: Optional[str] = None
  452. elapsed_time: float
  453. total_tokens: int
  454. execution_metadata: Optional[Mapping] = None
  455. finished_at: int
  456. steps: int
  457. parallel_id: Optional[str] = None
  458. parallel_start_node_id: Optional[str] = None
  459. event: StreamEvent = StreamEvent.ITERATION_COMPLETED
  460. workflow_run_id: str
  461. data: Data
  462. class LoopNodeStartStreamResponse(StreamResponse):
  463. """
  464. NodeStartStreamResponse entity
  465. """
  466. class Data(BaseModel):
  467. """
  468. Data entity
  469. """
  470. id: str
  471. node_id: str
  472. node_type: str
  473. title: str
  474. created_at: int
  475. extras: dict = {}
  476. metadata: Mapping = {}
  477. inputs: Mapping = {}
  478. parallel_id: Optional[str] = None
  479. parallel_start_node_id: Optional[str] = None
  480. event: StreamEvent = StreamEvent.LOOP_STARTED
  481. workflow_run_id: str
  482. data: Data
  483. class LoopNodeNextStreamResponse(StreamResponse):
  484. """
  485. NodeStartStreamResponse entity
  486. """
  487. class Data(BaseModel):
  488. """
  489. Data entity
  490. """
  491. id: str
  492. node_id: str
  493. node_type: str
  494. title: str
  495. index: int
  496. created_at: int
  497. pre_loop_output: Optional[Any] = None
  498. extras: dict = {}
  499. parallel_id: Optional[str] = None
  500. parallel_start_node_id: Optional[str] = None
  501. parallel_mode_run_id: Optional[str] = None
  502. duration: Optional[float] = None
  503. event: StreamEvent = StreamEvent.LOOP_NEXT
  504. workflow_run_id: str
  505. data: Data
  506. class LoopNodeCompletedStreamResponse(StreamResponse):
  507. """
  508. NodeCompletedStreamResponse entity
  509. """
  510. class Data(BaseModel):
  511. """
  512. Data entity
  513. """
  514. id: str
  515. node_id: str
  516. node_type: str
  517. title: str
  518. outputs: Optional[Mapping] = None
  519. created_at: int
  520. extras: Optional[dict] = None
  521. inputs: Optional[Mapping] = None
  522. status: WorkflowNodeExecutionStatus
  523. error: Optional[str] = None
  524. elapsed_time: float
  525. total_tokens: int
  526. execution_metadata: Optional[Mapping] = None
  527. finished_at: int
  528. steps: int
  529. parallel_id: Optional[str] = None
  530. parallel_start_node_id: Optional[str] = None
  531. event: StreamEvent = StreamEvent.LOOP_COMPLETED
  532. workflow_run_id: str
  533. data: Data
  534. class TextChunkStreamResponse(StreamResponse):
  535. """
  536. TextChunkStreamResponse entity
  537. """
  538. class Data(BaseModel):
  539. """
  540. Data entity
  541. """
  542. text: str
  543. from_variable_selector: Optional[list[str]] = None
  544. event: StreamEvent = StreamEvent.TEXT_CHUNK
  545. data: Data
  546. class TextReplaceStreamResponse(StreamResponse):
  547. """
  548. TextReplaceStreamResponse entity
  549. """
  550. class Data(BaseModel):
  551. """
  552. Data entity
  553. """
  554. text: str
  555. event: StreamEvent = StreamEvent.TEXT_REPLACE
  556. data: Data
  557. class PingStreamResponse(StreamResponse):
  558. """
  559. PingStreamResponse entity
  560. """
  561. event: StreamEvent = StreamEvent.PING
  562. class AppStreamResponse(BaseModel):
  563. """
  564. AppStreamResponse entity
  565. """
  566. stream_response: StreamResponse
  567. class ChatbotAppStreamResponse(AppStreamResponse):
  568. """
  569. ChatbotAppStreamResponse entity
  570. """
  571. conversation_id: str
  572. message_id: str
  573. created_at: int
  574. class CompletionAppStreamResponse(AppStreamResponse):
  575. """
  576. CompletionAppStreamResponse entity
  577. """
  578. message_id: str
  579. created_at: int
  580. class WorkflowAppStreamResponse(AppStreamResponse):
  581. """
  582. WorkflowAppStreamResponse entity
  583. """
  584. workflow_run_id: Optional[str] = None
  585. class AppBlockingResponse(BaseModel):
  586. """
  587. AppBlockingResponse entity
  588. """
  589. task_id: str
  590. def to_dict(self):
  591. return jsonable_encoder(self)
  592. class ChatbotAppBlockingResponse(AppBlockingResponse):
  593. """
  594. ChatbotAppBlockingResponse entity
  595. """
  596. class Data(BaseModel):
  597. """
  598. Data entity
  599. """
  600. id: str
  601. mode: str
  602. conversation_id: str
  603. message_id: str
  604. answer: str
  605. metadata: dict = {}
  606. created_at: int
  607. data: Data
  608. class CompletionAppBlockingResponse(AppBlockingResponse):
  609. """
  610. CompletionAppBlockingResponse entity
  611. """
  612. class Data(BaseModel):
  613. """
  614. Data entity
  615. """
  616. id: str
  617. mode: str
  618. message_id: str
  619. answer: str
  620. metadata: dict = {}
  621. created_at: int
  622. data: Data
  623. class WorkflowAppBlockingResponse(AppBlockingResponse):
  624. """
  625. WorkflowAppBlockingResponse entity
  626. """
  627. class Data(BaseModel):
  628. """
  629. Data entity
  630. """
  631. id: str
  632. workflow_id: str
  633. status: str
  634. outputs: Optional[dict] = None
  635. error: Optional[str] = None
  636. elapsed_time: float
  637. total_tokens: int
  638. total_steps: int
  639. created_at: int
  640. finished_at: int
  641. workflow_run_id: str
  642. data: Data
  643. class AgentLogStreamResponse(StreamResponse):
  644. """
  645. AgentLogStreamResponse entity
  646. """
  647. class Data(BaseModel):
  648. """
  649. Data entity
  650. """
  651. node_execution_id: str
  652. id: str
  653. label: str
  654. parent_id: str | None
  655. error: str | None
  656. status: str
  657. data: Mapping[str, Any]
  658. metadata: Optional[Mapping[str, Any]] = None
  659. node_id: str
  660. event: StreamEvent = StreamEvent.AGENT_LOG
  661. data: Data