task_entities.py 13 KB

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