task_entities.py 17 KB

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