task_entities.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. from enum import Enum
  2. from typing import Optional
  3. from pydantic import BaseModel
  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.node_entities import NodeType
  7. from core.workflow.nodes.answer.entities import GenerateRouteChunk
  8. class WorkflowStreamGenerateNodes(BaseModel):
  9. """
  10. WorkflowStreamGenerateNodes entity
  11. """
  12. end_node_id: str
  13. stream_node_ids: list[str]
  14. class ChatflowStreamGenerateRoute(BaseModel):
  15. """
  16. ChatflowStreamGenerateRoute entity
  17. """
  18. answer_node_id: str
  19. generate_route: list[GenerateRouteChunk]
  20. current_route_position: int = 0
  21. class NodeExecutionInfo(BaseModel):
  22. """
  23. NodeExecutionInfo entity
  24. """
  25. workflow_node_execution_id: str
  26. node_type: NodeType
  27. start_at: float
  28. class TaskState(BaseModel):
  29. """
  30. TaskState entity
  31. """
  32. metadata: dict = {}
  33. class EasyUITaskState(TaskState):
  34. """
  35. EasyUITaskState entity
  36. """
  37. llm_result: LLMResult
  38. class WorkflowTaskState(TaskState):
  39. """
  40. WorkflowTaskState entity
  41. """
  42. answer: str = ""
  43. workflow_run_id: Optional[str] = None
  44. start_at: Optional[float] = None
  45. total_tokens: int = 0
  46. total_steps: int = 0
  47. ran_node_execution_infos: dict[str, NodeExecutionInfo] = {}
  48. latest_node_execution_info: Optional[NodeExecutionInfo] = None
  49. current_stream_generate_state: Optional[WorkflowStreamGenerateNodes] = None
  50. class AdvancedChatTaskState(WorkflowTaskState):
  51. """
  52. AdvancedChatTaskState entity
  53. """
  54. usage: LLMUsage
  55. current_stream_generate_state: Optional[ChatflowStreamGenerateRoute] = None
  56. class StreamEvent(Enum):
  57. """
  58. Stream event
  59. """
  60. PING = "ping"
  61. ERROR = "error"
  62. MESSAGE = "message"
  63. MESSAGE_END = "message_end"
  64. MESSAGE_FILE = "message_file"
  65. MESSAGE_REPLACE = "message_replace"
  66. AGENT_THOUGHT = "agent_thought"
  67. AGENT_MESSAGE = "agent_message"
  68. WORKFLOW_STARTED = "workflow_started"
  69. WORKFLOW_FINISHED = "workflow_finished"
  70. NODE_STARTED = "node_started"
  71. NODE_FINISHED = "node_finished"
  72. TEXT_CHUNK = "text_chunk"
  73. TEXT_REPLACE = "text_replace"
  74. class StreamResponse(BaseModel):
  75. """
  76. StreamResponse entity
  77. """
  78. event: StreamEvent
  79. task_id: str
  80. def to_dict(self) -> dict:
  81. return jsonable_encoder(self)
  82. class ErrorStreamResponse(StreamResponse):
  83. """
  84. ErrorStreamResponse entity
  85. """
  86. event: StreamEvent = StreamEvent.ERROR
  87. err: Exception
  88. class Config:
  89. arbitrary_types_allowed = True
  90. class MessageStreamResponse(StreamResponse):
  91. """
  92. MessageStreamResponse entity
  93. """
  94. event: StreamEvent = StreamEvent.MESSAGE
  95. id: str
  96. answer: str
  97. class MessageEndStreamResponse(StreamResponse):
  98. """
  99. MessageEndStreamResponse entity
  100. """
  101. event: StreamEvent = StreamEvent.MESSAGE_END
  102. id: str
  103. metadata: dict = {}
  104. class MessageFileStreamResponse(StreamResponse):
  105. """
  106. MessageFileStreamResponse entity
  107. """
  108. event: StreamEvent = StreamEvent.MESSAGE_FILE
  109. id: str
  110. type: str
  111. belongs_to: str
  112. url: str
  113. class MessageReplaceStreamResponse(StreamResponse):
  114. """
  115. MessageReplaceStreamResponse entity
  116. """
  117. event: StreamEvent = StreamEvent.MESSAGE_REPLACE
  118. answer: str
  119. class AgentThoughtStreamResponse(StreamResponse):
  120. """
  121. AgentThoughtStreamResponse entity
  122. """
  123. event: StreamEvent = StreamEvent.AGENT_THOUGHT
  124. id: str
  125. position: int
  126. thought: Optional[str] = None
  127. observation: Optional[str] = None
  128. tool: Optional[str] = None
  129. tool_labels: Optional[dict] = None
  130. tool_input: Optional[str] = None
  131. message_files: Optional[list[str]] = None
  132. class AgentMessageStreamResponse(StreamResponse):
  133. """
  134. AgentMessageStreamResponse entity
  135. """
  136. event: StreamEvent = StreamEvent.AGENT_MESSAGE
  137. id: str
  138. answer: str
  139. class WorkflowStartStreamResponse(StreamResponse):
  140. """
  141. WorkflowStartStreamResponse entity
  142. """
  143. class Data(BaseModel):
  144. """
  145. Data entity
  146. """
  147. id: str
  148. workflow_id: str
  149. sequence_number: int
  150. inputs: dict
  151. created_at: int
  152. event: StreamEvent = StreamEvent.WORKFLOW_STARTED
  153. workflow_run_id: str
  154. data: Data
  155. class WorkflowFinishStreamResponse(StreamResponse):
  156. """
  157. WorkflowFinishStreamResponse entity
  158. """
  159. class Data(BaseModel):
  160. """
  161. Data entity
  162. """
  163. id: str
  164. workflow_id: str
  165. sequence_number: int
  166. status: str
  167. outputs: Optional[dict] = None
  168. error: Optional[str] = None
  169. elapsed_time: float
  170. total_tokens: int
  171. total_steps: int
  172. created_by: Optional[dict] = None
  173. created_at: int
  174. finished_at: int
  175. files: Optional[list[dict]] = []
  176. event: StreamEvent = StreamEvent.WORKFLOW_FINISHED
  177. workflow_run_id: str
  178. data: Data
  179. class NodeStartStreamResponse(StreamResponse):
  180. """
  181. NodeStartStreamResponse entity
  182. """
  183. class Data(BaseModel):
  184. """
  185. Data entity
  186. """
  187. id: str
  188. node_id: str
  189. node_type: str
  190. title: str
  191. index: int
  192. predecessor_node_id: Optional[str] = None
  193. inputs: Optional[dict] = None
  194. created_at: int
  195. extras: dict = {}
  196. event: StreamEvent = StreamEvent.NODE_STARTED
  197. workflow_run_id: str
  198. data: Data
  199. class NodeFinishStreamResponse(StreamResponse):
  200. """
  201. NodeFinishStreamResponse entity
  202. """
  203. class Data(BaseModel):
  204. """
  205. Data entity
  206. """
  207. id: str
  208. node_id: str
  209. node_type: str
  210. title: str
  211. index: int
  212. predecessor_node_id: Optional[str] = None
  213. inputs: Optional[dict] = None
  214. process_data: Optional[dict] = None
  215. outputs: Optional[dict] = None
  216. status: str
  217. error: Optional[str] = None
  218. elapsed_time: float
  219. execution_metadata: Optional[dict] = None
  220. created_at: int
  221. finished_at: int
  222. files: Optional[list[dict]] = []
  223. event: StreamEvent = StreamEvent.NODE_FINISHED
  224. workflow_run_id: str
  225. data: Data
  226. class TextChunkStreamResponse(StreamResponse):
  227. """
  228. TextChunkStreamResponse entity
  229. """
  230. class Data(BaseModel):
  231. """
  232. Data entity
  233. """
  234. text: str
  235. event: StreamEvent = StreamEvent.TEXT_CHUNK
  236. data: Data
  237. class TextReplaceStreamResponse(StreamResponse):
  238. """
  239. TextReplaceStreamResponse entity
  240. """
  241. class Data(BaseModel):
  242. """
  243. Data entity
  244. """
  245. text: str
  246. event: StreamEvent = StreamEvent.TEXT_REPLACE
  247. data: Data
  248. class PingStreamResponse(StreamResponse):
  249. """
  250. PingStreamResponse entity
  251. """
  252. event: StreamEvent = StreamEvent.PING
  253. class AppStreamResponse(BaseModel):
  254. """
  255. AppStreamResponse entity
  256. """
  257. stream_response: StreamResponse
  258. class ChatbotAppStreamResponse(AppStreamResponse):
  259. """
  260. ChatbotAppStreamResponse entity
  261. """
  262. conversation_id: str
  263. message_id: str
  264. created_at: int
  265. class CompletionAppStreamResponse(AppStreamResponse):
  266. """
  267. CompletionAppStreamResponse entity
  268. """
  269. message_id: str
  270. created_at: int
  271. class WorkflowAppStreamResponse(AppStreamResponse):
  272. """
  273. WorkflowAppStreamResponse entity
  274. """
  275. workflow_run_id: str
  276. class AppBlockingResponse(BaseModel):
  277. """
  278. AppBlockingResponse entity
  279. """
  280. task_id: str
  281. def to_dict(self) -> dict:
  282. return jsonable_encoder(self)
  283. class ChatbotAppBlockingResponse(AppBlockingResponse):
  284. """
  285. ChatbotAppBlockingResponse entity
  286. """
  287. class Data(BaseModel):
  288. """
  289. Data entity
  290. """
  291. id: str
  292. mode: str
  293. conversation_id: str
  294. message_id: str
  295. answer: str
  296. metadata: dict = {}
  297. created_at: int
  298. data: Data
  299. class CompletionAppBlockingResponse(AppBlockingResponse):
  300. """
  301. CompletionAppBlockingResponse entity
  302. """
  303. class Data(BaseModel):
  304. """
  305. Data entity
  306. """
  307. id: str
  308. mode: str
  309. message_id: str
  310. answer: str
  311. metadata: dict = {}
  312. created_at: int
  313. data: Data
  314. class WorkflowAppBlockingResponse(AppBlockingResponse):
  315. """
  316. WorkflowAppBlockingResponse entity
  317. """
  318. class Data(BaseModel):
  319. """
  320. Data entity
  321. """
  322. id: str
  323. workflow_id: str
  324. status: str
  325. outputs: Optional[dict] = None
  326. error: Optional[str] = None
  327. elapsed_time: float
  328. total_tokens: int
  329. total_steps: int
  330. created_at: int
  331. finished_at: int
  332. workflow_run_id: str
  333. data: Data