task_entities.py 14 KB

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