feat(ai-nutritionist): 图片与文字合并为一次 KieAI 多模态请求

- 后端: buildGeminiRequestBody 支持 content[] 中 Map 形式的多模态项
- 前端: sendMessage 将多图+文字合并为一条 content 数组,一次 sendToAI(multimodal)
- 仅发图时补默认文案「请描述或分析这张图片」,统一走 KieAI

Made-with: Cursor
This commit is contained in:
2026-03-03 00:36:28 +08:00
parent 51d2016988
commit 1ddb051977
2 changed files with 186 additions and 97 deletions

View File

@@ -409,9 +409,9 @@ public class ToolKieAIServiceImpl implements ToolKieAIService {
List<?> list = (List<?>) content;
List<Map<String, Object>> parts = new ArrayList<>();
for (Object item : list) {
Map<String, Object> part = new HashMap<>();
if (item instanceof KieAIGeminiChatRequest.ContentItem) {
KieAIGeminiChatRequest.ContentItem ci = (KieAIGeminiChatRequest.ContentItem) item;
Map<String, Object> part = new HashMap<>();
part.put("type", ci.getType());
if ("text".equals(ci.getType())) {
part.put("text", ci.getText());
@@ -421,6 +421,27 @@ public class ToolKieAIServiceImpl implements ToolKieAIService {
part.put("image_url", iu);
}
parts.add(part);
} else if (item instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>) item;
String t = (String) map.get("type");
if ("text".equals(t)) {
part.put("type", "text");
part.put("text", map.get("text"));
parts.add(part);
} else if ("image_url".equals(t)) {
Object iu = map.get("image_url");
if (iu instanceof Map) {
String url = (String) ((Map<?, ?>) iu).get("url");
if (url != null) {
part.put("type", "image_url");
Map<String, Object> iuOut = new HashMap<>();
iuOut.put("url", url);
part.put("image_url", iuOut);
parts.add(part);
}
}
}
}
}
m.put("content", parts);