4848use Dtyq \SuperMagic \Infrastructure \ExternalAPI \Sandbox \SandboxResult ;
4949use Dtyq \SuperMagic \Infrastructure \ExternalAPI \Sandbox \SandboxStruct ;
5050use Dtyq \SuperMagic \Infrastructure \ExternalAPI \Sandbox \Volcengine \SandboxService ;
51- // use Dtyq\BillingManager\Service\QuotaService;
5251use Dtyq \SuperMagic \Infrastructure \ExternalAPI \Sandbox \WebSocket \WebSocketSession ;
53- use Dtyq \SuperMagic \Infrastructure \Utils \ToolFileIdMatcher ;
52+ use Dtyq \SuperMagic \Infrastructure \Utils \ToolProcessor ;
5453use Dtyq \SuperMagic \Interfaces \SuperAgent \DTO \TopicTaskMessageDTO ;
5554use Error ;
5655use Exception ;
@@ -70,11 +69,6 @@ class TaskAppService extends AbstractAppService
7069 */
7170 private MessageBuilderDomainService $ messageBuilder ;
7271
73- /**
74- * 工具文件ID匹配器
75- */
76- private ToolFileIdMatcher $ toolFileIdMatcher ;
77-
7872 public function __construct (
7973 private readonly WorkspaceDomainService $ workspaceDomainService ,
8074 private readonly TopicDomainService $ topicDomainService ,
@@ -91,7 +85,6 @@ public function __construct(
9185 ) {
9286 $ this ->messageBuilder = new MessageBuilderDomainService ();
9387 $ this ->logger = $ loggerFactory ->get (get_class ($ this ));
94- $ this ->toolFileIdMatcher = new ToolFileIdMatcher ($ this ->logger );
9588 }
9689
9790 /**
@@ -690,6 +683,7 @@ private function handleReceivedMessage(TopicTaskMessageDTO $messageDTO, TaskCont
690683 $ attachments = $ payload ->getAttachments () ?? [];
691684 $ projectArchive = $ payload ->getProjectArchive () ?? [];
692685 $ showInUi = $ payload ->getShowInUi () ?? true ;
686+ $ messageId = $ payload ->getMessageId ();
693687
694688 // 2. 处理未知消息类型
695689 if (! MessageType::isValid ($ messageType )) {
@@ -711,8 +705,8 @@ private function handleReceivedMessage(TopicTaskMessageDTO $messageDTO, TaskCont
711705 try {
712706 if ($ tool !== null && ! empty ($ tool ['attachments ' ])) {
713707 $ this ->processToolAttachments ($ tool , $ taskContext );
714- // 使用工具文件ID匹配器处理各种工具类型
715- $ this -> toolFileIdMatcher -> matchFileIdForTools ($ tool );
708+ // 使用工具处理器处理文件ID匹配
709+ ToolProcessor:: processToolAttachments ($ tool );
716710 }
717711
718712 // 处理消息附件
@@ -722,7 +716,11 @@ private function handleReceivedMessage(TopicTaskMessageDTO $messageDTO, TaskCont
722716 if ($ status === TaskStatus::Suspended->value ) {
723717 $ this ->pauseTaskSteps ($ steps );
724718 } elseif ($ status === TaskStatus::FINISHED ->value ) {
725- $ this ->getOutputContent ($ taskContext , $ attachments , $ tool );
719+ // 使用工具处理器生成输出内容工具
720+ $ outputTool = ToolProcessor::generateOutputContentTool ($ attachments );
721+ if ($ outputTool !== null ) {
722+ $ tool = $ outputTool ;
723+ }
726724 }
727725
728726 // 4. 记录AI消息
@@ -739,7 +737,8 @@ private function handleReceivedMessage(TopicTaskMessageDTO $messageDTO, TaskCont
739737 $ task ->getTopicId (),
740738 $ event ,
741739 $ attachments ,
742- $ showInUi
740+ $ showInUi ,
741+ $ messageId
743742 );
744743
745744 // 5. 发送消息到客户端
@@ -790,80 +789,6 @@ private function pauseTaskSteps(array &$steps): void
790789 }
791790 }
792791
793- private function getOutputContent (TaskContext $ taskContext , array $ attachments , ?array &$ tool )
794- {
795- if (empty ($ attachments )) {
796- return ;
797- }
798-
799- $ file = [];
800- $ htmlFiles = [];
801- $ mdFiles = [];
802-
803- // 首先将文件按类型分组
804- foreach ($ attachments as $ attachment ) {
805- $ extension = strtolower ($ attachment ['file_extension ' ] ?? '' );
806- if ($ extension === 'html ' ) {
807- $ htmlFiles [] = $ attachment ;
808- } elseif ($ extension === 'md ' ) {
809- $ mdFiles [] = $ attachment ;
810- }
811- }
812-
813- // 优先处理HTML文件
814- if (! empty ($ htmlFiles )) {
815- // 检查是否有包含关键词的HTML文件
816- $ finalHtmlFiles = array_filter ($ htmlFiles , function ($ item ) {
817- $ filename = strtolower ($ item ['filename ' ]);
818- return strpos ($ filename , 'final ' ) !== false || strpos ($ filename , 'report ' ) !== false ;
819- });
820-
821- if (! empty ($ finalHtmlFiles )) {
822- // 如果有多个包含关键词的文件,选择最大的
823- $ file = $ this ->getMaxSizeFile ($ finalHtmlFiles );
824- } else {
825- // 如果没有包含关键词的文件,选择最大的HTML文件
826- $ file = $ this ->getMaxSizeFile ($ htmlFiles );
827- }
828- }
829- // 如果没有HTML文件,处理MD文件
830- elseif (! empty ($ mdFiles )) {
831- // 检查是否有包含关键词的MD文件
832- $ finalMdFiles = array_filter ($ mdFiles , function ($ item ) {
833- $ filename = strtolower ($ item ['filename ' ]);
834- return strpos ($ filename , 'final ' ) !== false || strpos ($ filename , 'report ' ) !== false ;
835- });
836-
837- if (! empty ($ finalMdFiles )) {
838- // 如果有多个包含关键词的文件,选择最大的
839- $ file = $ this ->getMaxSizeFile ($ finalMdFiles );
840- } else {
841- // 如果没有包含关键词的文件,选择最大的MD文件
842- $ file = $ this ->getMaxSizeFile ($ mdFiles );
843- }
844- }
845-
846- if (! empty ($ file )) {
847- $ tool = [
848- 'id ' => (string ) IdGenerator::getSnowId (),
849- 'name ' => 'finish_task ' ,
850- 'action ' => '已完成结果文件的输出 ' ,
851- 'detail ' => [
852- // 如果文件类型是 html 就使用 html , 如果文件类型是 md 就使用 md, 其他为 text
853- 'type ' => $ file ['file_extension ' ] === 'html ' ? 'html ' : ($ file ['file_extension ' ] === 'md ' ? 'md ' : 'text ' ),
854- 'data ' => [
855- 'file_name ' => $ file ['filename ' ],
856- 'content ' => '' ,
857- 'file_id ' => $ file ['file_id ' ],
858- ],
859- ],
860- 'remark ' => '' ,
861- 'status ' => 'finished ' ,
862- 'attachments ' => [],
863- ];
864- }
865- }
866-
867792 private function sendErrorMessageToClient (int $ topicId , string $ taskId , string $ chatTopicId , string $ chatConversationId , string $ message ): void
868793 {
869794 $ this ->sendMessageToClient (
@@ -1242,24 +1167,4 @@ private function convertWebSocketMessageToDTO(array $message): TopicTaskMessageD
12421167 // 创建DTO
12431168 return new TopicTaskMessageDTO ($ metadata , $ payload );
12441169 }
1245-
1246- /**
1247- * 从文件数组中获取最大尺寸的文件.
1248- *
1249- * @param array $files 文件数组
1250- * @return null|array 最大尺寸的文件,如果数组为空则返回null
1251- */
1252- private function getMaxSizeFile (array $ files )
1253- {
1254- if (empty ($ files )) {
1255- return null ;
1256- }
1257-
1258- return array_reduce ($ files , function ($ carry , $ item ) {
1259- if ($ carry === null || (int ) ($ item ['file_size ' ] ?? 0 ) > (int ) ($ carry ['file_size ' ] ?? 0 )) {
1260- return $ item ;
1261- }
1262- return $ carry ;
1263- });
1264- }
12651170}
0 commit comments