task_entities.py 14 KB

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