task_entities.py 14 KB

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