task_entities.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  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. TEXT_CHUNK = "text_chunk"
  49. TEXT_REPLACE = "text_replace"
  50. AGENT_LOG = "agent_log"
  51. class StreamResponse(BaseModel):
  52. """
  53. StreamResponse entity
  54. """
  55. event: StreamEvent
  56. task_id: str
  57. def to_dict(self):
  58. return jsonable_encoder(self)
  59. class ErrorStreamResponse(StreamResponse):
  60. """
  61. ErrorStreamResponse entity
  62. """
  63. event: StreamEvent = StreamEvent.ERROR
  64. err: Exception
  65. model_config = ConfigDict(arbitrary_types_allowed=True)
  66. class MessageStreamResponse(StreamResponse):
  67. """
  68. MessageStreamResponse entity
  69. """
  70. event: StreamEvent = StreamEvent.MESSAGE
  71. id: str
  72. answer: str
  73. from_variable_selector: Optional[list[str]] = None
  74. class MessageAudioStreamResponse(StreamResponse):
  75. """
  76. MessageStreamResponse entity
  77. """
  78. event: StreamEvent = StreamEvent.TTS_MESSAGE
  79. audio: str
  80. class MessageAudioEndStreamResponse(StreamResponse):
  81. """
  82. MessageStreamResponse entity
  83. """
  84. event: StreamEvent = StreamEvent.TTS_MESSAGE_END
  85. audio: str
  86. class MessageEndStreamResponse(StreamResponse):
  87. """
  88. MessageEndStreamResponse entity
  89. """
  90. event: StreamEvent = StreamEvent.MESSAGE_END
  91. id: str
  92. metadata: dict = {}
  93. files: Optional[Sequence[Mapping[str, Any]]] = None
  94. class MessageFileStreamResponse(StreamResponse):
  95. """
  96. MessageFileStreamResponse entity
  97. """
  98. event: StreamEvent = StreamEvent.MESSAGE_FILE
  99. id: str
  100. type: str
  101. belongs_to: str
  102. url: str
  103. class MessageReplaceStreamResponse(StreamResponse):
  104. """
  105. MessageReplaceStreamResponse entity
  106. """
  107. event: StreamEvent = StreamEvent.MESSAGE_REPLACE
  108. answer: str
  109. class AgentThoughtStreamResponse(StreamResponse):
  110. """
  111. AgentThoughtStreamResponse entity
  112. """
  113. event: StreamEvent = StreamEvent.AGENT_THOUGHT
  114. id: str
  115. position: int
  116. thought: Optional[str] = None
  117. observation: Optional[str] = None
  118. tool: Optional[str] = None
  119. tool_labels: Optional[dict] = None
  120. tool_input: Optional[str] = None
  121. message_files: Optional[list[str]] = None
  122. class AgentMessageStreamResponse(StreamResponse):
  123. """
  124. AgentMessageStreamResponse entity
  125. """
  126. event: StreamEvent = StreamEvent.AGENT_MESSAGE
  127. id: str
  128. answer: str
  129. class WorkflowStartStreamResponse(StreamResponse):
  130. """
  131. WorkflowStartStreamResponse entity
  132. """
  133. class Data(BaseModel):
  134. """
  135. Data entity
  136. """
  137. id: str
  138. workflow_id: str
  139. sequence_number: int
  140. inputs: dict
  141. created_at: int
  142. event: StreamEvent = StreamEvent.WORKFLOW_STARTED
  143. workflow_run_id: str
  144. data: Data
  145. class WorkflowFinishStreamResponse(StreamResponse):
  146. """
  147. WorkflowFinishStreamResponse entity
  148. """
  149. class Data(BaseModel):
  150. """
  151. Data entity
  152. """
  153. id: str
  154. workflow_id: str
  155. sequence_number: int
  156. status: str
  157. outputs: Optional[dict] = None
  158. error: Optional[str] = None
  159. elapsed_time: float
  160. total_tokens: int
  161. total_steps: int
  162. created_by: Optional[dict] = None
  163. created_at: int
  164. finished_at: int
  165. exceptions_count: Optional[int] = 0
  166. files: Optional[Sequence[Mapping[str, Any]]] = []
  167. event: StreamEvent = StreamEvent.WORKFLOW_FINISHED
  168. workflow_run_id: str
  169. data: Data
  170. class NodeStartStreamResponse(StreamResponse):
  171. """
  172. NodeStartStreamResponse entity
  173. """
  174. class Data(BaseModel):
  175. """
  176. Data entity
  177. """
  178. id: str
  179. node_id: str
  180. node_type: str
  181. title: str
  182. index: int
  183. predecessor_node_id: Optional[str] = None
  184. inputs: Optional[dict] = None
  185. created_at: int
  186. extras: dict = {}
  187. parallel_id: Optional[str] = None
  188. parallel_start_node_id: Optional[str] = None
  189. parent_parallel_id: Optional[str] = None
  190. parent_parallel_start_node_id: Optional[str] = None
  191. iteration_id: Optional[str] = None
  192. parallel_run_id: Optional[str] = None
  193. agent_strategy: Optional[AgentNodeStrategyInit] = None
  194. event: StreamEvent = StreamEvent.NODE_STARTED
  195. workflow_run_id: str
  196. data: Data
  197. def to_ignore_detail_dict(self):
  198. return {
  199. "event": self.event.value,
  200. "task_id": self.task_id,
  201. "workflow_run_id": self.workflow_run_id,
  202. "data": {
  203. "id": self.data.id,
  204. "node_id": self.data.node_id,
  205. "node_type": self.data.node_type,
  206. "title": self.data.title,
  207. "index": self.data.index,
  208. "predecessor_node_id": self.data.predecessor_node_id,
  209. "inputs": None,
  210. "created_at": self.data.created_at,
  211. "extras": {},
  212. "parallel_id": self.data.parallel_id,
  213. "parallel_start_node_id": self.data.parallel_start_node_id,
  214. "parent_parallel_id": self.data.parent_parallel_id,
  215. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  216. "iteration_id": self.data.iteration_id,
  217. },
  218. }
  219. class NodeFinishStreamResponse(StreamResponse):
  220. """
  221. NodeFinishStreamResponse entity
  222. """
  223. class Data(BaseModel):
  224. """
  225. Data entity
  226. """
  227. id: str
  228. node_id: str
  229. node_type: str
  230. title: str
  231. index: int
  232. predecessor_node_id: Optional[str] = None
  233. inputs: Optional[dict] = None
  234. process_data: Optional[dict] = None
  235. outputs: Optional[dict] = None
  236. status: str
  237. error: Optional[str] = None
  238. elapsed_time: float
  239. execution_metadata: Optional[dict] = None
  240. created_at: int
  241. finished_at: int
  242. files: Optional[Sequence[Mapping[str, Any]]] = []
  243. parallel_id: Optional[str] = None
  244. parallel_start_node_id: Optional[str] = None
  245. parent_parallel_id: Optional[str] = None
  246. parent_parallel_start_node_id: Optional[str] = None
  247. iteration_id: Optional[str] = None
  248. event: StreamEvent = StreamEvent.NODE_FINISHED
  249. workflow_run_id: str
  250. data: Data
  251. def to_ignore_detail_dict(self):
  252. return {
  253. "event": self.event.value,
  254. "task_id": self.task_id,
  255. "workflow_run_id": self.workflow_run_id,
  256. "data": {
  257. "id": self.data.id,
  258. "node_id": self.data.node_id,
  259. "node_type": self.data.node_type,
  260. "title": self.data.title,
  261. "index": self.data.index,
  262. "predecessor_node_id": self.data.predecessor_node_id,
  263. "inputs": None,
  264. "process_data": None,
  265. "outputs": None,
  266. "status": self.data.status,
  267. "error": None,
  268. "elapsed_time": self.data.elapsed_time,
  269. "execution_metadata": None,
  270. "created_at": self.data.created_at,
  271. "finished_at": self.data.finished_at,
  272. "files": [],
  273. "parallel_id": self.data.parallel_id,
  274. "parallel_start_node_id": self.data.parallel_start_node_id,
  275. "parent_parallel_id": self.data.parent_parallel_id,
  276. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  277. "iteration_id": self.data.iteration_id,
  278. },
  279. }
  280. class NodeRetryStreamResponse(StreamResponse):
  281. """
  282. NodeFinishStreamResponse entity
  283. """
  284. class Data(BaseModel):
  285. """
  286. Data entity
  287. """
  288. id: str
  289. node_id: str
  290. node_type: str
  291. title: str
  292. index: int
  293. predecessor_node_id: Optional[str] = None
  294. inputs: Optional[dict] = None
  295. process_data: Optional[dict] = None
  296. outputs: Optional[dict] = None
  297. status: str
  298. error: Optional[str] = None
  299. elapsed_time: float
  300. execution_metadata: Optional[dict] = None
  301. created_at: int
  302. finished_at: int
  303. files: Optional[Sequence[Mapping[str, Any]]] = []
  304. parallel_id: Optional[str] = None
  305. parallel_start_node_id: Optional[str] = None
  306. parent_parallel_id: Optional[str] = None
  307. parent_parallel_start_node_id: Optional[str] = None
  308. iteration_id: Optional[str] = None
  309. retry_index: int = 0
  310. event: StreamEvent = StreamEvent.NODE_RETRY
  311. workflow_run_id: str
  312. data: Data
  313. def to_ignore_detail_dict(self):
  314. return {
  315. "event": self.event.value,
  316. "task_id": self.task_id,
  317. "workflow_run_id": self.workflow_run_id,
  318. "data": {
  319. "id": self.data.id,
  320. "node_id": self.data.node_id,
  321. "node_type": self.data.node_type,
  322. "title": self.data.title,
  323. "index": self.data.index,
  324. "predecessor_node_id": self.data.predecessor_node_id,
  325. "inputs": None,
  326. "process_data": None,
  327. "outputs": None,
  328. "status": self.data.status,
  329. "error": None,
  330. "elapsed_time": self.data.elapsed_time,
  331. "execution_metadata": None,
  332. "created_at": self.data.created_at,
  333. "finished_at": self.data.finished_at,
  334. "files": [],
  335. "parallel_id": self.data.parallel_id,
  336. "parallel_start_node_id": self.data.parallel_start_node_id,
  337. "parent_parallel_id": self.data.parent_parallel_id,
  338. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  339. "iteration_id": self.data.iteration_id,
  340. "retry_index": self.data.retry_index,
  341. },
  342. }
  343. class ParallelBranchStartStreamResponse(StreamResponse):
  344. """
  345. ParallelBranchStartStreamResponse entity
  346. """
  347. class Data(BaseModel):
  348. """
  349. Data entity
  350. """
  351. parallel_id: str
  352. parallel_branch_id: str
  353. parent_parallel_id: Optional[str] = None
  354. parent_parallel_start_node_id: Optional[str] = None
  355. iteration_id: Optional[str] = None
  356. created_at: int
  357. event: StreamEvent = StreamEvent.PARALLEL_BRANCH_STARTED
  358. workflow_run_id: str
  359. data: Data
  360. class ParallelBranchFinishedStreamResponse(StreamResponse):
  361. """
  362. ParallelBranchFinishedStreamResponse entity
  363. """
  364. class Data(BaseModel):
  365. """
  366. Data entity
  367. """
  368. parallel_id: str
  369. parallel_branch_id: str
  370. parent_parallel_id: Optional[str] = None
  371. parent_parallel_start_node_id: Optional[str] = None
  372. iteration_id: Optional[str] = None
  373. status: str
  374. error: Optional[str] = None
  375. created_at: int
  376. event: StreamEvent = StreamEvent.PARALLEL_BRANCH_FINISHED
  377. workflow_run_id: str
  378. data: Data
  379. class IterationNodeStartStreamResponse(StreamResponse):
  380. """
  381. NodeStartStreamResponse entity
  382. """
  383. class Data(BaseModel):
  384. """
  385. Data entity
  386. """
  387. id: str
  388. node_id: str
  389. node_type: str
  390. title: str
  391. created_at: int
  392. extras: dict = {}
  393. metadata: Mapping = {}
  394. inputs: Mapping = {}
  395. parallel_id: Optional[str] = None
  396. parallel_start_node_id: Optional[str] = None
  397. event: StreamEvent = StreamEvent.ITERATION_STARTED
  398. workflow_run_id: str
  399. data: Data
  400. class IterationNodeNextStreamResponse(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. index: int
  413. created_at: int
  414. pre_iteration_output: Optional[Any] = None
  415. extras: dict = {}
  416. parallel_id: Optional[str] = None
  417. parallel_start_node_id: Optional[str] = None
  418. parallel_mode_run_id: Optional[str] = None
  419. duration: Optional[float] = None
  420. event: StreamEvent = StreamEvent.ITERATION_NEXT
  421. workflow_run_id: str
  422. data: Data
  423. class IterationNodeCompletedStreamResponse(StreamResponse):
  424. """
  425. NodeCompletedStreamResponse entity
  426. """
  427. class Data(BaseModel):
  428. """
  429. Data entity
  430. """
  431. id: str
  432. node_id: str
  433. node_type: str
  434. title: str
  435. outputs: Optional[Mapping] = None
  436. created_at: int
  437. extras: Optional[dict] = None
  438. inputs: Optional[Mapping] = None
  439. status: WorkflowNodeExecutionStatus
  440. error: Optional[str] = None
  441. elapsed_time: float
  442. total_tokens: int
  443. execution_metadata: Optional[Mapping] = None
  444. finished_at: int
  445. steps: int
  446. parallel_id: Optional[str] = None
  447. parallel_start_node_id: Optional[str] = None
  448. event: StreamEvent = StreamEvent.ITERATION_COMPLETED
  449. workflow_run_id: str
  450. data: Data
  451. class TextChunkStreamResponse(StreamResponse):
  452. """
  453. TextChunkStreamResponse entity
  454. """
  455. class Data(BaseModel):
  456. """
  457. Data entity
  458. """
  459. text: str
  460. from_variable_selector: Optional[list[str]] = None
  461. event: StreamEvent = StreamEvent.TEXT_CHUNK
  462. data: Data
  463. class TextReplaceStreamResponse(StreamResponse):
  464. """
  465. TextReplaceStreamResponse entity
  466. """
  467. class Data(BaseModel):
  468. """
  469. Data entity
  470. """
  471. text: str
  472. event: StreamEvent = StreamEvent.TEXT_REPLACE
  473. data: Data
  474. class PingStreamResponse(StreamResponse):
  475. """
  476. PingStreamResponse entity
  477. """
  478. event: StreamEvent = StreamEvent.PING
  479. class AppStreamResponse(BaseModel):
  480. """
  481. AppStreamResponse entity
  482. """
  483. stream_response: StreamResponse
  484. class ChatbotAppStreamResponse(AppStreamResponse):
  485. """
  486. ChatbotAppStreamResponse entity
  487. """
  488. conversation_id: str
  489. message_id: str
  490. created_at: int
  491. class CompletionAppStreamResponse(AppStreamResponse):
  492. """
  493. CompletionAppStreamResponse entity
  494. """
  495. message_id: str
  496. created_at: int
  497. class WorkflowAppStreamResponse(AppStreamResponse):
  498. """
  499. WorkflowAppStreamResponse entity
  500. """
  501. workflow_run_id: Optional[str] = None
  502. class AppBlockingResponse(BaseModel):
  503. """
  504. AppBlockingResponse entity
  505. """
  506. task_id: str
  507. def to_dict(self):
  508. return jsonable_encoder(self)
  509. class ChatbotAppBlockingResponse(AppBlockingResponse):
  510. """
  511. ChatbotAppBlockingResponse entity
  512. """
  513. class Data(BaseModel):
  514. """
  515. Data entity
  516. """
  517. id: str
  518. mode: str
  519. conversation_id: str
  520. message_id: str
  521. answer: str
  522. metadata: dict = {}
  523. created_at: int
  524. data: Data
  525. class CompletionAppBlockingResponse(AppBlockingResponse):
  526. """
  527. CompletionAppBlockingResponse entity
  528. """
  529. class Data(BaseModel):
  530. """
  531. Data entity
  532. """
  533. id: str
  534. mode: str
  535. message_id: str
  536. answer: str
  537. metadata: dict = {}
  538. created_at: int
  539. data: Data
  540. class WorkflowAppBlockingResponse(AppBlockingResponse):
  541. """
  542. WorkflowAppBlockingResponse entity
  543. """
  544. class Data(BaseModel):
  545. """
  546. Data entity
  547. """
  548. id: str
  549. workflow_id: str
  550. status: str
  551. outputs: Optional[dict] = None
  552. error: Optional[str] = None
  553. elapsed_time: float
  554. total_tokens: int
  555. total_steps: int
  556. created_at: int
  557. finished_at: int
  558. workflow_run_id: str
  559. data: Data
  560. class AgentLogStreamResponse(StreamResponse):
  561. """
  562. AgentLogStreamResponse entity
  563. """
  564. class Data(BaseModel):
  565. """
  566. Data entity
  567. """
  568. node_execution_id: str
  569. id: str
  570. label: str
  571. parent_id: str | None
  572. error: str | None
  573. status: str
  574. data: Mapping[str, Any]
  575. metadata: Optional[Mapping[str, Any]] = None
  576. event: StreamEvent = StreamEvent.AGENT_LOG
  577. data: Data