Skip to content

Commit 88185c9

Browse files
committed
refactor(AIImage): remove MagicAIImageAgent and streamline AI image processing logic
2 parents 5b4637a + 0627f15 commit 88185c9

File tree

15 files changed

+106
-196
lines changed

15 files changed

+106
-196
lines changed

backend/magic-service/app/Application/Chat/Event/Subscribe/Agent/Agents/MagicAIImageAgent.php

Lines changed: 0 additions & 47 deletions
This file was deleted.

backend/magic-service/app/Application/Chat/Service/MagicChatMessageAppService.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,9 @@ public function checkSendMessageAuth(MagicSeqEntity $senderSeqDTO, MagicMessageE
253253
));
254254
throw $exception;
255255
}
256-
// 如果消息中有文件 id,判断文件的所有者是否是当前用户
256+
return;
257+
// todo 如果消息中有文件:1.判断文件的所有者是否是当前用户;2.判断用户是否接收过这些文件。
258+
/* @phpstan-ignore-next-line */
257259
$messageContent = $senderMessageDTO->getContent();
258260
if ($messageContent instanceof ChatFileInterface) {
259261
$fileIds = $messageContent->getFileIds();

backend/magic-service/app/Application/Flow/ExecuteManager/BuiltIn/ToolSet/AIImage/Tools/AIImageBuiltInTool.php

Lines changed: 4 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,17 @@
77

88
namespace App\Application\Flow\ExecuteManager\BuiltIn\ToolSet\AIImage\Tools;
99

10-
use App\Application\Chat\Service\MagicChatAIImageAppService;
1110
use App\Application\Flow\ExecuteManager\BuiltIn\BuiltInToolSet;
12-
use App\Application\Flow\ExecuteManager\BuiltIn\ToolSet\AbstractBuiltInTool;
1311
use App\Application\Flow\ExecuteManager\ExecutionData\ExecutionData;
14-
use App\Domain\Chat\DTO\AIImage\Request\MagicChatAIImageReqDTO;
15-
use App\Domain\Chat\DTO\Message\ChatMessage\TextMessage;
16-
use App\Domain\Chat\Entity\ValueObject\AIImage\Radio;
17-
use App\Domain\Contact\Entity\MagicUserEntity;
18-
use App\Domain\Contact\Service\MagicUserDomainService;
1912
use App\Domain\Flow\Entity\ValueObject\NodeInput;
20-
use App\ErrorCode\GenericErrorCode;
2113
use App\Infrastructure\Core\Collector\BuiltInToolSet\Annotation\BuiltInToolDefine;
22-
use App\Infrastructure\Core\Exception\ExceptionBuilder;
2314
use App\Infrastructure\ExternalAPI\ImageGenerateAPI\ImageGenerateModelType;
24-
use App\Infrastructure\Util\Context\RequestContext;
25-
use App\Interfaces\Authorization\Web\MagicUserAuthorization;
2615
use Closure;
2716
use Dtyq\FlowExprEngine\ComponentFactory;
2817
use Dtyq\FlowExprEngine\Structure\StructureType;
2918

30-
use function di;
31-
3219
#[BuiltInToolDefine]
33-
class AIImageBuiltInTool extends AbstractBuiltInTool
20+
class AIImageBuiltInTool extends AbstractAIImageBuiltInTool
3421
{
3522
public function getToolSetCode(): string
3623
{
@@ -49,45 +36,11 @@ public function getDescription(): string
4936

5037
public function getCallback(): ?Closure
5138
{
39+
// 可接受参数指定任意 model,默认是火山。
5240
return function (ExecutionData $executionData) {
53-
if ($executionData->getExecutionType()->isDebug()) {
54-
// debug 模式
55-
return ['ai_image: current not support debug model'];
56-
}
57-
$args = $executionData->getTriggerData()->getParams();
58-
$searchKeyword = $args['user_prompt'] ?? '';
41+
$args = $executionData->getTriggerData()?->getParams();
5942
$model = $args['model'] ?? ImageGenerateModelType::Volcengine->value;
60-
$radio = $args['radio'] ?? Radio::OneToOne->value;
61-
$userInfoEntity = $executionData->getTriggerData()->getUserInfo()['user_entity'] ?? null;
62-
if (empty($userInfoEntity) || ! $userInfoEntity instanceof MagicUserEntity) {
63-
ExceptionBuilder::throw(GenericErrorCode::SystemError, 'sender_user_not_found');
64-
}
65-
$userId = $userInfoEntity->getUserId();
66-
$userInfoEntity = $this->getMagicUserDomainService()->getUserById($userId);
67-
$conversationId = $executionData->getOriginConversationId();
68-
$topicId = $executionData->getTopicId();
69-
$requestContext = new RequestContext();
70-
$userAuthorization = new MagicUserAuthorization();
71-
$userAuthorization->setId($userInfoEntity->getUserId());
72-
$userAuthorization->setOrganizationCode($userInfoEntity->getOrganizationCode());
73-
$userAuthorization->setUserType($userInfoEntity->getUserType());
74-
$requestContext->setOrganizationCode($executionData->getDataIsolation()->getCurrentOrganizationCode());
75-
$requestContext->setUserAuthorization($userAuthorization);
76-
$textMessage = new TextMessage([]);
77-
$textMessage->setContent($searchKeyword);
78-
$reqDto = (new MagicChatAIImageReqDTO())
79-
->setTopicId($topicId ?? '')
80-
->setConversationId($conversationId)
81-
->setUserMessage($textMessage)
82-
->setAttachments($executionData->getTriggerData()->getAttachments())
83-
->setReferMessageId($executionData->getTriggerData()->getSeqEntity()->getSeqId());
84-
// 设置实际请求的尺寸和比例
85-
$enumModel = ImageGenerateModelType::fromModel($model, false);
86-
$reqDto->getParams()->setRatioForModel($radio, $enumModel);
87-
$radio = $reqDto->getParams()->getRatio();
88-
$reqDto->getParams()->setSizeFromRadioAndModel($radio, $enumModel)->setModel($model);
89-
$this->getMagicChatAIImageAppService()->handleUserMessage($requestContext, $reqDto);
90-
return [];
43+
$this->executeCallback($executionData, $model);
9144
};
9245
}
9346

@@ -254,14 +207,4 @@ public function getInput(): ?NodeInput
254207
)));
255208
return $input;
256209
}
257-
258-
private function getMagicChatAIImageAppService(): MagicChatAIImageAppService
259-
{
260-
return di(MagicChatAIImageAppService::class);
261-
}
262-
263-
private function getMagicUserDomainService(): MagicUserDomainService
264-
{
265-
return di(MagicUserDomainService::class);
266-
}
267210
}

backend/magic-service/app/Application/Flow/ExecuteManager/BuiltIn/ToolSet/AIImage/Tools/AbstractAIImageBuiltInTool.php

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use App\Domain\Chat\DTO\AIImage\Request\MagicChatAIImageReqDTO;
1414
use App\Domain\Chat\DTO\Message\ChatMessage\TextMessage;
1515
use App\Domain\Chat\Entity\ValueObject\AIImage\Radio;
16-
use App\Domain\Contact\Entity\MagicUserEntity;
16+
use App\Domain\Chat\Service\MagicConversationDomainService;
1717
use App\Domain\Contact\Service\MagicUserDomainService;
1818
use App\Domain\Flow\Entity\ValueObject\NodeInput;
1919
use App\ErrorCode\GenericErrorCode;
@@ -186,33 +186,26 @@ protected function executeCallback(ExecutionData $executionData, string $modelVe
186186
// debug 模式
187187
return ['ai_image : current not support debug model'];
188188
}
189-
$args = $executionData->getTriggerData()->getParams();
189+
190+
$args = $executionData->getTriggerData()?->getParams();
190191
$searchKeyword = $args['user_prompt'] ?? '';
191192
$radio = $args['radio'] ?? Radio::OneToOne->value;
192193
$model = $modelVersion;
193-
$userInfoEntity = $executionData->getTriggerData()->getUserInfo()['user_entity'] ?? null;
194-
if (empty($userInfoEntity) || ! $userInfoEntity instanceof MagicUserEntity) {
195-
ExceptionBuilder::throw(GenericErrorCode::SystemError, 'sender_user_not_found');
196-
}
197-
$userId = $userInfoEntity->getUserId();
198-
$userInfoEntity = $this->getMagicUserDomainService()->getUserById($userId);
199-
$conversationId = $executionData->getOriginConversationId();
200-
$topicId = $executionData->getTopicId();
194+
$agentConversationId = $executionData->getOriginConversationId();
195+
$assistantAuthorization = $this->getAssistantAuthorization($agentConversationId);
196+
201197
$requestContext = new RequestContext();
202-
$userAuthorization = new MagicUserAuthorization();
203-
$userAuthorization->setId($userInfoEntity->getUserId());
204-
$userAuthorization->setOrganizationCode($userInfoEntity->getOrganizationCode());
205-
$userAuthorization->setUserType($userInfoEntity->getUserType());
206-
$requestContext->setUserAuthorization($userAuthorization);
207-
$requestContext->setOrganizationCode($userInfoEntity->getOrganizationCode());
198+
$requestContext->setUserAuthorization($assistantAuthorization);
199+
$requestContext->setOrganizationCode($assistantAuthorization->getOrganizationCode());
200+
208201
$textMessage = new TextMessage([]);
209202
$textMessage->setContent($searchKeyword);
210203
$reqDto = (new MagicChatAIImageReqDTO())
211-
->setTopicId($topicId ?? '')
212-
->setConversationId($conversationId)
204+
->setTopicId($executionData->getTopicId() ?? '')
205+
->setConversationId($agentConversationId)
213206
->setUserMessage($textMessage)
214-
->setAttachments($executionData->getTriggerData()->getAttachments())
215-
->setReferMessageId($executionData->getTriggerData()->getSeqEntity()->getSeqId());
207+
->setAttachments($executionData->getTriggerData()?->getAttachments())
208+
->setReferMessageId($executionData->getTriggerData()?->getSeqEntity()?->getSeqId());
216209
// 设置实际请求的尺寸和比例
217210
$enumModel = ImageGenerateModelType::fromModel($model, false);
218211
$reqDto->getParams()->setRatioForModel($radio, $enumModel);
@@ -222,13 +215,38 @@ protected function executeCallback(ExecutionData $executionData, string $modelVe
222215
return [];
223216
}
224217

225-
private function getMagicChatAIImageAppService(): MagicChatAIImageAppService
218+
protected function getAssistantAuthorization(string $agentConversationId): MagicUserAuthorization
219+
{
220+
// 获取助理的用户信息。生成的图片上传者是助理自己。
221+
$agentConversationEntity = $this->getMagicConversationDomainService()->getConversationByIdWithoutCheck($agentConversationId);
222+
if (! $agentConversationEntity) {
223+
ExceptionBuilder::throw(GenericErrorCode::SystemError, 'assistant_not_found');
224+
}
225+
// 助理信息
226+
$assistantUserId = $agentConversationEntity->getUserId();
227+
$assistantInfoEntity = $this->getMagicUserDomainService()->getUserById($assistantUserId);
228+
if ($assistantInfoEntity === null) {
229+
ExceptionBuilder::throw(GenericErrorCode::SystemError, 'assistant_not_found');
230+
}
231+
$assistantAuthorization = new MagicUserAuthorization();
232+
$assistantAuthorization->setId($assistantInfoEntity->getUserId());
233+
$assistantAuthorization->setOrganizationCode($assistantInfoEntity->getOrganizationCode());
234+
$assistantAuthorization->setUserType($assistantInfoEntity->getUserType());
235+
return $assistantAuthorization;
236+
}
237+
238+
protected function getMagicChatAIImageAppService(): MagicChatAIImageAppService
226239
{
227240
return di(MagicChatAIImageAppService::class);
228241
}
229242

230-
private function getMagicUserDomainService(): MagicUserDomainService
243+
protected function getMagicUserDomainService(): MagicUserDomainService
231244
{
232245
return di(MagicUserDomainService::class);
233246
}
247+
248+
protected function getMagicConversationDomainService(): MagicConversationDomainService
249+
{
250+
return di(MagicConversationDomainService::class);
251+
}
234252
}

backend/magic-service/app/Application/Flow/ExecuteManager/BuiltIn/ToolSet/AIImage/Tools/ImageConvertHighBuiltInTool.php

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,20 @@
99

1010
use App\Application\Chat\Service\MagicChatImageConvertHighAppService;
1111
use App\Application\Flow\ExecuteManager\BuiltIn\BuiltInToolSet;
12-
use App\Application\Flow\ExecuteManager\BuiltIn\ToolSet\AbstractBuiltInTool;
1312
use App\Application\Flow\ExecuteManager\ExecutionData\ExecutionData;
1413
use App\Domain\Chat\DTO\ImageConvertHigh\Request\MagicChatImageConvertHighReqDTO;
1514
use App\Domain\Chat\DTO\Message\ChatMessage\TextMessage;
16-
use App\Domain\Contact\Entity\MagicUserEntity;
17-
use App\Domain\Contact\Service\MagicUserDomainService;
1815
use App\Domain\Flow\Entity\ValueObject\NodeInput;
19-
use App\ErrorCode\GenericErrorCode;
2016
use App\Infrastructure\Core\Collector\BuiltInToolSet\Annotation\BuiltInToolDefine;
21-
use App\Infrastructure\Core\Exception\ExceptionBuilder;
2217
use App\Infrastructure\Util\Context\RequestContext;
23-
use App\Interfaces\Authorization\Web\MagicUserAuthorization;
2418
use Closure;
2519
use Dtyq\FlowExprEngine\ComponentFactory;
2620
use Dtyq\FlowExprEngine\Structure\StructureType;
2721

2822
use function di;
2923

3024
#[BuiltInToolDefine]
31-
class ImageConvertHighBuiltInTool extends AbstractBuiltInTool
25+
class ImageConvertHighBuiltInTool extends AbstractAIImageBuiltInTool
3226
{
3327
public function getToolSetCode(): string
3428
{
@@ -52,31 +46,24 @@ public function getCallback(): ?Closure
5246
// debug 模式
5347
return ['image_convert_high: current not support debug model'];
5448
}
55-
$args = $executionData->getTriggerData()->getParams();
49+
$args = $executionData->getTriggerData()?->getParams();
5650
$searchKeyword = $args['user_prompt'] ?? '';
57-
$userInfoEntity = $executionData->getTriggerData()->getUserInfo()['user_entity'] ?? null;
58-
if (empty($userInfoEntity) || ! $userInfoEntity instanceof MagicUserEntity) {
59-
ExceptionBuilder::throw(GenericErrorCode::SystemError, 'sender_user_not_found');
60-
}
61-
$userId = $userInfoEntity->getUserId();
62-
$userInfoEntity = $this->getMagicUserDomainService()->getUserById($userId);
63-
$conversationId = $executionData->getOriginConversationId();
64-
$topicId = $executionData->getTopicId();
51+
$agentConversationId = $executionData->getOriginConversationId();
52+
$assistantAuthorization = $this->getAssistantAuthorization($agentConversationId);
53+
6554
$requestContext = new RequestContext();
66-
$userAuthorization = new MagicUserAuthorization();
67-
$userAuthorization->setId($userInfoEntity->getUserId());
68-
$userAuthorization->setOrganizationCode($userInfoEntity->getOrganizationCode());
69-
$userAuthorization->setUserType($userInfoEntity->getUserType());
70-
$requestContext->setUserAuthorization($userAuthorization);
55+
$requestContext->setUserAuthorization($assistantAuthorization);
56+
$requestContext->setOrganizationCode($assistantAuthorization->getOrganizationCode());
57+
7158
$textMessage = new TextMessage([]);
7259
$textMessage->setContent($searchKeyword);
7360
$reqDto = (new MagicChatImageConvertHighReqDTO())
74-
->setTopicId($topicId ?? '')
75-
->setConversationId($conversationId)
61+
->setTopicId($executionData->getTopicId() ?? '')
62+
->setConversationId($agentConversationId)
7663
->setUserMessage($textMessage)
77-
->setOriginImageUrl($executionData->getTriggerData()->getAttachments()[0]->getUrl())
78-
->setOriginImageId($executionData->getTriggerData()->getAttachments()[0]->getChatFileId())
79-
->setReferMessageId($executionData->getTriggerData()->getSeqEntity()->getSeqId());
64+
->setOriginImageUrl($executionData->getTriggerData()?->getAttachments()[0]->getUrl())
65+
->setOriginImageId($executionData->getTriggerData()?->getAttachments()[0]->getChatFileId())
66+
->setReferMessageId($executionData->getTriggerData()?->getSeqEntity()?->getSeqId());
8067
$this->getMagicChatImageConvertHighAppService()->handleUserMessage($requestContext, $reqDto);
8168
return [];
8269
};
@@ -199,13 +186,8 @@ public function getInput(): ?NodeInput
199186
return $input;
200187
}
201188

202-
private function getMagicChatImageConvertHighAppService(): MagicChatImageConvertHighAppService
189+
protected function getMagicChatImageConvertHighAppService(): MagicChatImageConvertHighAppService
203190
{
204191
return di(MagicChatImageConvertHighAppService::class);
205192
}
206-
207-
private function getMagicUserDomainService(): MagicUserDomainService
208-
{
209-
return di(MagicUserDomainService::class);
210-
}
211193
}

backend/magic-service/app/Domain/Chat/Service/MagicChatFileDomainService.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,12 @@ public function checkAndFillAttachments(array $attachments, DataIsolation $dataI
154154
$fileIds = array_column($attachments, 'file_id');
155155
$fileEntities = $this->getFileEntitiesByFileIds($fileIds);
156156
$fileEntities = array_column($fileEntities, null, 'file_id');
157-
foreach ($fileEntities as $fileEntity) {
158-
if ($fileEntity->getUserId() !== $dataIsolation->getCurrentUserId()) {
159-
ExceptionBuilder::throw(ChatErrorCode::FILE_NOT_FOUND);
160-
}
161-
}
157+
// todo 如果消息中有文件:1.判断文件的所有者是否是当前用户;2.判断用户是否接收过这些文件。
158+
// foreach ($fileEntities as $fileEntity) {
159+
// if ($fileEntity->getUserId() !== $dataIsolation->getCurrentUserId()) {
160+
// ExceptionBuilder::throw(ChatErrorCode::FILE_NOT_FOUND);
161+
// }
162+
// }
162163

163164
foreach ($attachments as $attachment) {
164165
$fileId = $attachment->getFileId();

backend/magic-service/config/autoload/service_provider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
* Copyright (c) The Magic , Distributed under the software license
66
*/
77
return [
8-
'model_aes_key' => env('SERVICE_PROVIDER_CONFIG_AES_KEY', 'Q6#iyPSq4EQU'),
8+
'model_aes_key' => env('SERVICE_PROVIDER_CONFIG_AES_KEY', ''),
99
'office_organization' => env('OFFICE_ORGANIZATION'),
1010
];

bin/backend_split_single.sh

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,25 @@ function split()
6060

6161
function remote()
6262
{
63-
git remote add $1 $2 || true
63+
# 检查远程仓库是否已存在
64+
if git remote | grep -q "^$1$"; then
65+
CURRENT_URL=$(git remote get-url $1)
66+
if [ "$CURRENT_URL" != "$2" ]; then
67+
echo "⚠️ Warning: Remote '$1' exists but points to a different URL"
68+
echo "Current URL: $CURRENT_URL"
69+
echo "Expected URL: $2"
70+
read -p "Do you want to update the remote URL? (y/n): " update_remote
71+
if [[ $update_remote == "y" || $update_remote == "Y" ]]; then
72+
echo "Updating remote URL..."
73+
git remote set-url $1 $2
74+
else
75+
echo "❌ Operation cancelled: Remote URL mismatch"
76+
exit 1
77+
fi
78+
fi
79+
else
80+
git remote add $1 $2
81+
fi
6482
}
6583

6684
# 更健壮地处理git pull操作
@@ -82,4 +100,4 @@ split "backend/$COMPOSE_NAME" $COMPOSE_NAME
82100

83101
TIME=$(echo "$(date +%s) - $NOW" | bc)
84102

85-
printf "Execution time: %f seconds" $TIME
103+
printf "Execution time: %f seconds" $TIME

0 commit comments

Comments
 (0)