#!/usr/bin/env python3 """ 处理上传的知识条目并添加到 pre_upload_list.json """ import json import uuid import time # 读取现有文件 with open('/root/Agent/pre_upload_list.json', 'r', encoding='utf-8') as f: data = json.load(f) # 用户上传的 3 条知识 new_knowledge = [ { "主题": "在调用 ToolHub nano_banana 工具时,图片传递需要手动上传到 OSS 获取 CDN URL", "内容": "当使用 ToolHub 的 nano_banana 工具进行图像生成时,不能直接传本地文件路径(如 examples/xxx/image.png),因为 ToolHub 服务运行在远程服务器上,无法访问调用方的本地文件系统。\n\n正确做法:\n1. 先调用 image_uploader 工具将本地图片上传到 OSS\n2. 获取返回的 cdn_url(如 https://res.cybertogether.net/toolhub_images/xxx.png)\n3. 将 cdn_url 传入 toolhub_call 的 image_urls 参数\n\n案例:生成 img_3 时,最初直接传本地路径 character_ref_kneel.png 导致 HTTP 503 错误「文件不存在」,改用 image_uploader 上传后获取 CDN URL 再调用 nano_banana 成功生成。\n\n注意:虽然部分 ToolHub 工具文档声称支持自动上传本地路径,但 nano_banana 实际不支持此功能,需手动处理。", "类型": ["experience"], "标签": {"intent": "图像生成", "state": "nano_banana", "tool": "toolhub_call"}, "评分": 5, "source": {"category": "execution"} }, { "主题": "在图像生成任务中,使用 nano_banana 进行多图融合保持人物一致性的方法", "内容": "当需要保持多张生成图的人物一致性时(如系列图 img_1~img_5),使用 nano_banana 工具的多图融合功能:\n\n1. 在 image_urls 数组中传入多张参考图:\n - 底图(当前姿态的 character_ref_*.png)\n - 前序生成结果(如 img_1_restored_v1.png 用于链式一致性)\n2. 在 prompt 中明确描述需要保持的特征(如 white V-neck backless maxi dress, brown long hair)\n3. 使用 aspect_ratio 参数控制输出比例(如 3:4)\n\n案例:img_3 生成时传入 character_ref_kneel.png(跪坐姿态底图)和 img_1_restored_v1.png(前序结果),成功保持了白裙款式、发型、体态的一致性,评估得分 8.5/10。\n\n优势:nano_banana 基于 Gemini 多模态模型,对多图特征融合理解能力强,比传统 IP-Adapter 更灵活。", "类型": ["experience"], "标签": {"intent": "人物一致性", "state": "nano_banana", "technique": "多图融合"}, "评分": 4, "source": {"category": "execution"} }, { "主题": "图像生成任务的标准化执行流程", "内容": "完整的图像生成任务应遵循以下流程:\n\n1. **素材验证**:使用 read_file 检查所有参考素材文件存在且可读\n2. **源信息读取**:读取制作表 JSON 和通用创作文件,提取细节描述融入 prompt\n3. **ToolHub 检查**:调用 toolhub_health 确认服务可用,toolhub_search 查找合适工具\n4. **图片上传**:使用 image_uploader 将本地图片转为 CDN URL\n5. **执行生成**:调用 toolhub_call 执行生成,记录完整参数\n6. **结果验证**:使用 evaluate_image 进行自动化评估(单图 6 维度/多图 5 维度一致性)\n7. **日志记录**:追加 generation_log.md,包含素材验证、生成参数、验证结果、评估详情\n\n案例:img_3 任务按此流程执行,从素材验证到日志记录全程可追溯,评估 8.5/10 通过。\n\n关键点:每次生成都必须记录完整参数便于迭代优化;评估结果低于 7 分需调整配置重新生成。", "类型": ["experience"], "标签": {"intent": "图像生成流程", "state": "workflow", "domain": "production"}, "评分": 4, "source": {"category": "execution"} } ] # 转换为标准格式并添加 current_time = int(time.time()) timestamp = time.strftime("%Y%m%d-%H%M%S", time.localtime(current_time)) for i, item in enumerate(new_knowledge): # 生成唯一 ID knowledge_id = f"knowledge-{timestamp}-{uuid.uuid4().hex[:4]}" # 转换为标准格式 standard_knowledge = { "id": knowledge_id, "task": item["主题"], "content": item["内容"], "types": item["类型"], "tags": item["标签"], "score": item["评分"], "source": item["source"] } data['knowledge'].append(standard_knowledge) print(f"添加知识 {i+1}: {knowledge_id}") print(f" 主题:{item['主题'][:50]}...") # 写回文件 with open('/root/Agent/pre_upload_list.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2) print(f"\n成功添加 {len(new_knowledge)} 条知识条目") print(f"当前 knowledge 总数:{len(data['knowledge'])}")