task_entities.py 17 KB

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