task_entities.py 13 KB

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