選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

task_entities.py 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. from collections.abc import Mapping, Sequence
  2. from enum import Enum
  3. from typing import Any, Optional
  4. from pydantic import BaseModel, ConfigDict
  5. from core.model_runtime.entities.llm_entities import LLMResult
  6. from core.model_runtime.utils.encoders import jsonable_encoder
  7. from core.workflow.entities.node_entities import AgentNodeStrategyInit, NodeRunMetadataKey
  8. from models.workflow import WorkflowNodeExecutionStatus
  9. class TaskState(BaseModel):
  10. """
  11. TaskState entity
  12. """
  13. metadata: dict = {}
  14. class EasyUITaskState(TaskState):
  15. """
  16. EasyUITaskState entity
  17. """
  18. llm_result: LLMResult
  19. class WorkflowTaskState(TaskState):
  20. """
  21. WorkflowTaskState entity
  22. """
  23. answer: str = ""
  24. class StreamEvent(Enum):
  25. """
  26. Stream event
  27. """
  28. PING = "ping"
  29. ERROR = "error"
  30. MESSAGE = "message"
  31. MESSAGE_END = "message_end"
  32. TTS_MESSAGE = "tts_message"
  33. TTS_MESSAGE_END = "tts_message_end"
  34. MESSAGE_FILE = "message_file"
  35. MESSAGE_REPLACE = "message_replace"
  36. AGENT_THOUGHT = "agent_thought"
  37. AGENT_MESSAGE = "agent_message"
  38. WORKFLOW_STARTED = "workflow_started"
  39. WORKFLOW_FINISHED = "workflow_finished"
  40. NODE_STARTED = "node_started"
  41. NODE_FINISHED = "node_finished"
  42. NODE_RETRY = "node_retry"
  43. PARALLEL_BRANCH_STARTED = "parallel_branch_started"
  44. PARALLEL_BRANCH_FINISHED = "parallel_branch_finished"
  45. ITERATION_STARTED = "iteration_started"
  46. ITERATION_NEXT = "iteration_next"
  47. ITERATION_COMPLETED = "iteration_completed"
  48. LOOP_STARTED = "loop_started"
  49. LOOP_NEXT = "loop_next"
  50. LOOP_COMPLETED = "loop_completed"
  51. TEXT_CHUNK = "text_chunk"
  52. TEXT_REPLACE = "text_replace"
  53. AGENT_LOG = "agent_log"
  54. class StreamResponse(BaseModel):
  55. """
  56. StreamResponse entity
  57. """
  58. event: StreamEvent
  59. task_id: str
  60. def to_dict(self):
  61. return jsonable_encoder(self)
  62. class ErrorStreamResponse(StreamResponse):
  63. """
  64. ErrorStreamResponse entity
  65. """
  66. event: StreamEvent = StreamEvent.ERROR
  67. err: Exception
  68. model_config = ConfigDict(arbitrary_types_allowed=True)
  69. class MessageStreamResponse(StreamResponse):
  70. """
  71. MessageStreamResponse entity
  72. """
  73. event: StreamEvent = StreamEvent.MESSAGE
  74. id: str
  75. answer: str
  76. from_variable_selector: Optional[list[str]] = None
  77. class MessageAudioStreamResponse(StreamResponse):
  78. """
  79. MessageStreamResponse entity
  80. """
  81. event: StreamEvent = StreamEvent.TTS_MESSAGE
  82. audio: str
  83. class MessageAudioEndStreamResponse(StreamResponse):
  84. """
  85. MessageStreamResponse entity
  86. """
  87. event: StreamEvent = StreamEvent.TTS_MESSAGE_END
  88. audio: str
  89. class MessageEndStreamResponse(StreamResponse):
  90. """
  91. MessageEndStreamResponse entity
  92. """
  93. event: StreamEvent = StreamEvent.MESSAGE_END
  94. id: str
  95. metadata: dict = {}
  96. files: Optional[Sequence[Mapping[str, Any]]] = None
  97. class MessageFileStreamResponse(StreamResponse):
  98. """
  99. MessageFileStreamResponse entity
  100. """
  101. event: StreamEvent = StreamEvent.MESSAGE_FILE
  102. id: str
  103. type: str
  104. belongs_to: str
  105. url: str
  106. class MessageReplaceStreamResponse(StreamResponse):
  107. """
  108. MessageReplaceStreamResponse entity
  109. """
  110. event: StreamEvent = StreamEvent.MESSAGE_REPLACE
  111. answer: str
  112. reason: str
  113. class AgentThoughtStreamResponse(StreamResponse):
  114. """
  115. AgentThoughtStreamResponse entity
  116. """
  117. event: StreamEvent = StreamEvent.AGENT_THOUGHT
  118. id: str
  119. position: int
  120. thought: Optional[str] = None
  121. observation: Optional[str] = None
  122. tool: Optional[str] = None
  123. tool_labels: Optional[dict] = None
  124. tool_input: Optional[str] = None
  125. message_files: Optional[list[str]] = None
  126. class AgentMessageStreamResponse(StreamResponse):
  127. """
  128. AgentMessageStreamResponse entity
  129. """
  130. event: StreamEvent = StreamEvent.AGENT_MESSAGE
  131. id: str
  132. answer: str
  133. class WorkflowStartStreamResponse(StreamResponse):
  134. """
  135. WorkflowStartStreamResponse entity
  136. """
  137. class Data(BaseModel):
  138. """
  139. Data entity
  140. """
  141. id: str
  142. workflow_id: str
  143. sequence_number: int
  144. inputs: dict
  145. created_at: int
  146. event: StreamEvent = StreamEvent.WORKFLOW_STARTED
  147. workflow_run_id: str
  148. data: Data
  149. class WorkflowFinishStreamResponse(StreamResponse):
  150. """
  151. WorkflowFinishStreamResponse entity
  152. """
  153. class Data(BaseModel):
  154. """
  155. Data entity
  156. """
  157. id: str
  158. workflow_id: str
  159. sequence_number: int
  160. status: str
  161. outputs: Optional[dict] = None
  162. error: Optional[str] = None
  163. elapsed_time: float
  164. total_tokens: int
  165. total_steps: int
  166. created_by: Optional[dict] = None
  167. created_at: int
  168. finished_at: int
  169. exceptions_count: Optional[int] = 0
  170. files: Optional[Sequence[Mapping[str, Any]]] = []
  171. event: StreamEvent = StreamEvent.WORKFLOW_FINISHED
  172. workflow_run_id: str
  173. data: Data
  174. class NodeStartStreamResponse(StreamResponse):
  175. """
  176. NodeStartStreamResponse entity
  177. """
  178. class Data(BaseModel):
  179. """
  180. Data entity
  181. """
  182. id: str
  183. node_id: str
  184. node_type: str
  185. title: str
  186. index: int
  187. predecessor_node_id: Optional[str] = None
  188. inputs: Optional[Mapping[str, Any]] = None
  189. created_at: int
  190. extras: dict = {}
  191. parallel_id: Optional[str] = None
  192. parallel_start_node_id: Optional[str] = None
  193. parent_parallel_id: Optional[str] = None
  194. parent_parallel_start_node_id: Optional[str] = None
  195. iteration_id: Optional[str] = None
  196. loop_id: Optional[str] = None
  197. parallel_run_id: Optional[str] = None
  198. agent_strategy: Optional[AgentNodeStrategyInit] = None
  199. event: StreamEvent = StreamEvent.NODE_STARTED
  200. workflow_run_id: str
  201. data: Data
  202. def to_ignore_detail_dict(self):
  203. return {
  204. "event": self.event.value,
  205. "task_id": self.task_id,
  206. "workflow_run_id": self.workflow_run_id,
  207. "data": {
  208. "id": self.data.id,
  209. "node_id": self.data.node_id,
  210. "node_type": self.data.node_type,
  211. "title": self.data.title,
  212. "index": self.data.index,
  213. "predecessor_node_id": self.data.predecessor_node_id,
  214. "inputs": None,
  215. "created_at": self.data.created_at,
  216. "extras": {},
  217. "parallel_id": self.data.parallel_id,
  218. "parallel_start_node_id": self.data.parallel_start_node_id,
  219. "parent_parallel_id": self.data.parent_parallel_id,
  220. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  221. "iteration_id": self.data.iteration_id,
  222. "loop_id": self.data.loop_id,
  223. },
  224. }
  225. class NodeFinishStreamResponse(StreamResponse):
  226. """
  227. NodeFinishStreamResponse entity
  228. """
  229. class Data(BaseModel):
  230. """
  231. Data entity
  232. """
  233. id: str
  234. node_id: str
  235. node_type: str
  236. title: str
  237. index: int
  238. predecessor_node_id: Optional[str] = None
  239. inputs: Optional[Mapping[str, Any]] = None
  240. process_data: Optional[Mapping[str, Any]] = None
  241. outputs: Optional[Mapping[str, Any]] = None
  242. status: str
  243. error: Optional[str] = None
  244. elapsed_time: float
  245. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  246. created_at: int
  247. finished_at: int
  248. files: Optional[Sequence[Mapping[str, Any]]] = []
  249. parallel_id: Optional[str] = None
  250. parallel_start_node_id: Optional[str] = None
  251. parent_parallel_id: Optional[str] = None
  252. parent_parallel_start_node_id: Optional[str] = None
  253. iteration_id: Optional[str] = None
  254. loop_id: Optional[str] = None
  255. event: StreamEvent = StreamEvent.NODE_FINISHED
  256. workflow_run_id: str
  257. data: Data
  258. def to_ignore_detail_dict(self):
  259. return {
  260. "event": self.event.value,
  261. "task_id": self.task_id,
  262. "workflow_run_id": self.workflow_run_id,
  263. "data": {
  264. "id": self.data.id,
  265. "node_id": self.data.node_id,
  266. "node_type": self.data.node_type,
  267. "title": self.data.title,
  268. "index": self.data.index,
  269. "predecessor_node_id": self.data.predecessor_node_id,
  270. "inputs": None,
  271. "process_data": None,
  272. "outputs": None,
  273. "status": self.data.status,
  274. "error": None,
  275. "elapsed_time": self.data.elapsed_time,
  276. "execution_metadata": None,
  277. "created_at": self.data.created_at,
  278. "finished_at": self.data.finished_at,
  279. "files": [],
  280. "parallel_id": self.data.parallel_id,
  281. "parallel_start_node_id": self.data.parallel_start_node_id,
  282. "parent_parallel_id": self.data.parent_parallel_id,
  283. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  284. "iteration_id": self.data.iteration_id,
  285. "loop_id": self.data.loop_id,
  286. },
  287. }
  288. class NodeRetryStreamResponse(StreamResponse):
  289. """
  290. NodeFinishStreamResponse entity
  291. """
  292. class Data(BaseModel):
  293. """
  294. Data entity
  295. """
  296. id: str
  297. node_id: str
  298. node_type: str
  299. title: str
  300. index: int
  301. predecessor_node_id: Optional[str] = None
  302. inputs: Optional[Mapping[str, Any]] = None
  303. process_data: Optional[Mapping[str, Any]] = None
  304. outputs: Optional[Mapping[str, Any]] = None
  305. status: str
  306. error: Optional[str] = None
  307. elapsed_time: float
  308. execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = None
  309. created_at: int
  310. finished_at: int
  311. files: Optional[Sequence[Mapping[str, Any]]] = []
  312. parallel_id: Optional[str] = None
  313. parallel_start_node_id: Optional[str] = None
  314. parent_parallel_id: Optional[str] = None
  315. parent_parallel_start_node_id: Optional[str] = None
  316. iteration_id: Optional[str] = None
  317. loop_id: Optional[str] = None
  318. retry_index: int = 0
  319. event: StreamEvent = StreamEvent.NODE_RETRY
  320. workflow_run_id: str
  321. data: Data
  322. def to_ignore_detail_dict(self):
  323. return {
  324. "event": self.event.value,
  325. "task_id": self.task_id,
  326. "workflow_run_id": self.workflow_run_id,
  327. "data": {
  328. "id": self.data.id,
  329. "node_id": self.data.node_id,
  330. "node_type": self.data.node_type,
  331. "title": self.data.title,
  332. "index": self.data.index,
  333. "predecessor_node_id": self.data.predecessor_node_id,
  334. "inputs": None,
  335. "process_data": None,
  336. "outputs": None,
  337. "status": self.data.status,
  338. "error": None,
  339. "elapsed_time": self.data.elapsed_time,
  340. "execution_metadata": None,
  341. "created_at": self.data.created_at,
  342. "finished_at": self.data.finished_at,
  343. "files": [],
  344. "parallel_id": self.data.parallel_id,
  345. "parallel_start_node_id": self.data.parallel_start_node_id,
  346. "parent_parallel_id": self.data.parent_parallel_id,
  347. "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id,
  348. "iteration_id": self.data.iteration_id,
  349. "loop_id": self.data.loop_id,
  350. "retry_index": self.data.retry_index,
  351. },
  352. }
  353. class ParallelBranchStartStreamResponse(StreamResponse):
  354. """
  355. ParallelBranchStartStreamResponse entity
  356. """
  357. class Data(BaseModel):
  358. """
  359. Data entity
  360. """
  361. parallel_id: str
  362. parallel_branch_id: str
  363. parent_parallel_id: Optional[str] = None
  364. parent_parallel_start_node_id: Optional[str] = None
  365. iteration_id: Optional[str] = None
  366. loop_id: Optional[str] = None
  367. created_at: int
  368. event: StreamEvent = StreamEvent.PARALLEL_BRANCH_STARTED
  369. workflow_run_id: str
  370. data: Data
  371. class ParallelBranchFinishedStreamResponse(StreamResponse):
  372. """
  373. ParallelBranchFinishedStreamResponse entity
  374. """
  375. class Data(BaseModel):
  376. """
  377. Data entity
  378. """
  379. parallel_id: str
  380. parallel_branch_id: str
  381. parent_parallel_id: Optional[str] = None
  382. parent_parallel_start_node_id: Optional[str] = None
  383. iteration_id: Optional[str] = None
  384. loop_id: Optional[str] = None
  385. status: str
  386. error: Optional[str] = None
  387. created_at: int
  388. event: StreamEvent = StreamEvent.PARALLEL_BRANCH_FINISHED
  389. workflow_run_id: str
  390. data: Data
  391. class IterationNodeStartStreamResponse(StreamResponse):
  392. """
  393. NodeStartStreamResponse entity
  394. """
  395. class Data(BaseModel):
  396. """
  397. Data entity
  398. """
  399. id: str
  400. node_id: str
  401. node_type: str
  402. title: str
  403. created_at: int
  404. extras: dict = {}
  405. metadata: Mapping = {}
  406. inputs: Mapping = {}
  407. parallel_id: Optional[str] = None
  408. parallel_start_node_id: Optional[str] = None
  409. event: StreamEvent = StreamEvent.ITERATION_STARTED
  410. workflow_run_id: str
  411. data: Data
  412. class IterationNodeNextStreamResponse(StreamResponse):
  413. """
  414. NodeStartStreamResponse entity
  415. """
  416. class Data(BaseModel):
  417. """
  418. Data entity
  419. """
  420. id: str
  421. node_id: str
  422. node_type: str
  423. title: str
  424. index: int
  425. created_at: int
  426. pre_iteration_output: Optional[Any] = None
  427. extras: dict = {}
  428. parallel_id: Optional[str] = None
  429. parallel_start_node_id: Optional[str] = None
  430. parallel_mode_run_id: Optional[str] = None
  431. duration: Optional[float] = None
  432. event: StreamEvent = StreamEvent.ITERATION_NEXT
  433. workflow_run_id: str
  434. data: Data
  435. class IterationNodeCompletedStreamResponse(StreamResponse):
  436. """
  437. NodeCompletedStreamResponse entity
  438. """
  439. class Data(BaseModel):
  440. """
  441. Data entity
  442. """
  443. id: str
  444. node_id: str
  445. node_type: str
  446. title: str
  447. outputs: Optional[Mapping] = None
  448. created_at: int
  449. extras: Optional[dict] = None
  450. inputs: Optional[Mapping] = None
  451. status: WorkflowNodeExecutionStatus
  452. error: Optional[str] = None
  453. elapsed_time: float
  454. total_tokens: int
  455. execution_metadata: Optional[Mapping] = None
  456. finished_at: int
  457. steps: int
  458. parallel_id: Optional[str] = None
  459. parallel_start_node_id: Optional[str] = None
  460. event: StreamEvent = StreamEvent.ITERATION_COMPLETED
  461. workflow_run_id: str
  462. data: Data
  463. class LoopNodeStartStreamResponse(StreamResponse):
  464. """
  465. NodeStartStreamResponse entity
  466. """
  467. class Data(BaseModel):
  468. """
  469. Data entity
  470. """
  471. id: str
  472. node_id: str
  473. node_type: str
  474. title: str
  475. created_at: int
  476. extras: dict = {}
  477. metadata: Mapping = {}
  478. inputs: Mapping = {}
  479. parallel_id: Optional[str] = None
  480. parallel_start_node_id: Optional[str] = None
  481. event: StreamEvent = StreamEvent.LOOP_STARTED
  482. workflow_run_id: str
  483. data: Data
  484. class LoopNodeNextStreamResponse(StreamResponse):
  485. """
  486. NodeStartStreamResponse entity
  487. """
  488. class Data(BaseModel):
  489. """
  490. Data entity
  491. """
  492. id: str
  493. node_id: str
  494. node_type: str
  495. title: str
  496. index: int
  497. created_at: int
  498. pre_loop_output: Optional[Any] = None
  499. extras: dict = {}
  500. parallel_id: Optional[str] = None
  501. parallel_start_node_id: Optional[str] = None
  502. parallel_mode_run_id: Optional[str] = None
  503. duration: Optional[float] = None
  504. event: StreamEvent = StreamEvent.LOOP_NEXT
  505. workflow_run_id: str
  506. data: Data
  507. class LoopNodeCompletedStreamResponse(StreamResponse):
  508. """
  509. NodeCompletedStreamResponse entity
  510. """
  511. class Data(BaseModel):
  512. """
  513. Data entity
  514. """
  515. id: str
  516. node_id: str
  517. node_type: str
  518. title: str
  519. outputs: Optional[Mapping] = None
  520. created_at: int
  521. extras: Optional[dict] = None
  522. inputs: Optional[Mapping] = None
  523. status: WorkflowNodeExecutionStatus
  524. error: Optional[str] = None
  525. elapsed_time: float
  526. total_tokens: int
  527. execution_metadata: Optional[Mapping] = None
  528. finished_at: int
  529. steps: int
  530. parallel_id: Optional[str] = None
  531. parallel_start_node_id: Optional[str] = None
  532. event: StreamEvent = StreamEvent.LOOP_COMPLETED
  533. workflow_run_id: str
  534. data: Data
  535. class TextChunkStreamResponse(StreamResponse):
  536. """
  537. TextChunkStreamResponse entity
  538. """
  539. class Data(BaseModel):
  540. """
  541. Data entity
  542. """
  543. text: str
  544. from_variable_selector: Optional[list[str]] = None
  545. event: StreamEvent = StreamEvent.TEXT_CHUNK
  546. data: Data
  547. class TextReplaceStreamResponse(StreamResponse):
  548. """
  549. TextReplaceStreamResponse entity
  550. """
  551. class Data(BaseModel):
  552. """
  553. Data entity
  554. """
  555. text: str
  556. event: StreamEvent = StreamEvent.TEXT_REPLACE
  557. data: Data
  558. class PingStreamResponse(StreamResponse):
  559. """
  560. PingStreamResponse entity
  561. """
  562. event: StreamEvent = StreamEvent.PING
  563. class AppStreamResponse(BaseModel):
  564. """
  565. AppStreamResponse entity
  566. """
  567. stream_response: StreamResponse
  568. class ChatbotAppStreamResponse(AppStreamResponse):
  569. """
  570. ChatbotAppStreamResponse entity
  571. """
  572. conversation_id: str
  573. message_id: str
  574. created_at: int
  575. class CompletionAppStreamResponse(AppStreamResponse):
  576. """
  577. CompletionAppStreamResponse entity
  578. """
  579. message_id: str
  580. created_at: int
  581. class WorkflowAppStreamResponse(AppStreamResponse):
  582. """
  583. WorkflowAppStreamResponse entity
  584. """
  585. workflow_run_id: Optional[str] = None
  586. class AppBlockingResponse(BaseModel):
  587. """
  588. AppBlockingResponse entity
  589. """
  590. task_id: str
  591. def to_dict(self):
  592. return jsonable_encoder(self)
  593. class ChatbotAppBlockingResponse(AppBlockingResponse):
  594. """
  595. ChatbotAppBlockingResponse entity
  596. """
  597. class Data(BaseModel):
  598. """
  599. Data entity
  600. """
  601. id: str
  602. mode: str
  603. conversation_id: str
  604. message_id: str
  605. answer: str
  606. metadata: dict = {}
  607. created_at: int
  608. data: Data
  609. class CompletionAppBlockingResponse(AppBlockingResponse):
  610. """
  611. CompletionAppBlockingResponse entity
  612. """
  613. class Data(BaseModel):
  614. """
  615. Data entity
  616. """
  617. id: str
  618. mode: str
  619. message_id: str
  620. answer: str
  621. metadata: dict = {}
  622. created_at: int
  623. data: Data
  624. class WorkflowAppBlockingResponse(AppBlockingResponse):
  625. """
  626. WorkflowAppBlockingResponse entity
  627. """
  628. class Data(BaseModel):
  629. """
  630. Data entity
  631. """
  632. id: str
  633. workflow_id: str
  634. status: str
  635. outputs: Optional[dict] = None
  636. error: Optional[str] = None
  637. elapsed_time: float
  638. total_tokens: int
  639. total_steps: int
  640. created_at: int
  641. finished_at: int
  642. workflow_run_id: str
  643. data: Data
  644. class AgentLogStreamResponse(StreamResponse):
  645. """
  646. AgentLogStreamResponse entity
  647. """
  648. class Data(BaseModel):
  649. """
  650. Data entity
  651. """
  652. node_execution_id: str
  653. id: str
  654. label: str
  655. parent_id: str | None
  656. error: str | None
  657. status: str
  658. data: Mapping[str, Any]
  659. metadata: Optional[Mapping[str, Any]] = None
  660. node_id: str
  661. event: StreamEvent = StreamEvent.AGENT_LOG
  662. data: Data