Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

task_entities.py 20KB

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