diff --git a/api/video_flow.ts b/api/video_flow.ts index 15cc525..ae1791c 100644 --- a/api/video_flow.ts +++ b/api/video_flow.ts @@ -1037,4 +1037,28 @@ export const saveRegeneratedCharacter = async (request: { return post("/character/save_regenerated_character", request); }; +/** + * 分析图片并生成描述 + * @description 接收图片URL,调用AI服务分析图片并生成详细描述 + * @param request - 图片分析请求参数 + * @returns Promise> + */ +export const analyzeImageDescription = async (request: { + /** 图片的URL地址,必须是有效的HTTP/HTTPS链接 */ + image_url: string; +}): Promise> => { + return post>("/character/analyze_image_description", request); +}; + diff --git a/app/service/Interaction/RoleService.ts b/app/service/Interaction/RoleService.ts index 293fee1..17ba847 100644 --- a/app/service/Interaction/RoleService.ts +++ b/app/service/Interaction/RoleService.ts @@ -2,6 +2,7 @@ import { useState, useCallback, useMemo } from 'react'; import { RoleEntity, AITextEntity } from '../domain/Entities'; import { RoleEditUseCase } from '../usecase/RoleEditUseCase'; import { getUploadToken, uploadToQiniu } from '@/api/common'; +import { analyzeImageDescription } from '@/api/video_flow'; /** * 角色服务Hook返回值接口 @@ -33,8 +34,8 @@ interface UseRoleService { fetchUserRoleLibrary: () => Promise; /** 替换角色 */ replaceRoleWithLibrary: (replaceRoleId: string) => Promise; - /** 上传图片到七牛云 */ - uploadImageToQiniu: (file: File) => Promise; + /** 上传图片并更新角色信息 */ + uploadImageAndUpdateRole: (file: File) => Promise; /** 保存重新生成的角色到角色库 */ saveRoleToLibrary: () => Promise; } @@ -314,21 +315,67 @@ export const useRoleServiceHook = (): UseRoleService => { }, [selectedRole, roleEditUseCase, userRoleLibrary, selectRole]); /** - * 上传图片到七牛云 - * @description 上传图片文件到七牛云存储 + * 上传图片并更新角色信息 + * @description 上传图片文件到七牛云存储,然后调用AI接口分析图片生成描述和高亮标签,最后更新当前选中角色的图片、描述和标签 * @param file 要上传的文件 - * @returns {Promise} 上传成功后的图片URL + * @returns {Promise} 上传和分析完成后的Promise */ - const uploadImageToQiniu = useCallback(async (file: File) => { + const uploadImageAndUpdateRole = useCallback(async (file: File) => { + if (!selectedRole) { + throw new Error('请先选择要更新的角色'); + } + try { + // 1. 上传图片到七牛云 const { token } = await getUploadToken(); - const url = await uploadToQiniu(file, token); - const roleEntity = await roleEditUseCase?.getRoleByImage(url); + const imageUrl = await uploadToQiniu(file, token); + + // 2. 调用图片分析接口获取描述 + const result = await analyzeImageDescription({ + image_url: imageUrl + }); + + if (!result.successful) { + throw new Error(`图片分析失败: ${result.message}`); + } + + const { description, highlights } = result.data; + + // 3. 更新当前选中角色的图片、描述和标签 + const updatedRole = { + ...selectedRole, + imageUrl: imageUrl, + generateText: description, + tags: highlights.map((highlight: string, index: number) => ({ + id: `tag_${Date.now()}_${index}`, + /** 名称 */ + name: highlight, + /** 内容 */ + content: highlight, + loadingProgress: 100, + disableEdit: false + })) + }; + + // 更新选中的角色 + selectRole(updatedRole); + + // 更新角色列表中的对应角色 + setRoleList(prev => + prev.map(role => + role.id === selectedRole.id + ? updatedRole + : role + ) + ); + + console.log('角色图片和描述更新成功:', updatedRole); + } catch (error) { - console.error('上传图片到七牛云失败:', error); + console.error('上传图片并分析失败:', error); throw error; } - }, [roleEditUseCase]); + }, [selectedRole, roleEditUseCase, selectRole]); /** * 保存重新生成的角色到角色库 @@ -388,7 +435,7 @@ export const useRoleServiceHook = (): UseRoleService => { regenerateRole, fetchUserRoleLibrary, replaceRoleWithLibrary, - uploadImageToQiniu, + uploadImageAndUpdateRole, saveRoleToLibrary }; }; diff --git a/components/ui/character-tab-content.tsx b/components/ui/character-tab-content.tsx index e4055f3..2922bc2 100644 --- a/components/ui/character-tab-content.tsx +++ b/components/ui/character-tab-content.tsx @@ -178,7 +178,7 @@ export function CharacterTabContent({ setIgnoreReplace(false); setIsRegenerate(false); - selectRole(roleData[index].id); + selectRole(roleData[index]); }; // 从角色库中选择角色