n8n+GPT-4o一次解析多张图片

javascript 复制代码
{
  "name": "GPT-4o识图",
  "nodes": [
    {
      "parameters": {
        "options": {
          "allowFileUploads": true
        }
      },
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.4,
      "position": [
        16,
        -32
      ],
      "id": "96716511-0e3b-4b29-9154-8da836ec4907",
      "name": "When chat message received",
      "webhookId": "572da347-91ff-4fe5-8f83-add5f3f8c4ab",
      "alwaysOutputData": false,
      "executeOnce": false,
      "retryOnFail": false
    },
    {
      "parameters": {
        "resource": "image",
        "operation": "analyze",
        "modelId": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "GPT-4O-MINI"
        },
        "text": "={{ $json.chatInput }}",
        "inputType": "base64",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 2.1,
      "position": [
        464,
        -32
      ],
      "id": "f27c56da-4941-4ac6-9b07-8a06b62051c4",
      "name": "Analyze image",
      "credentials": {
        "openAiApi": {
          "id": "2NGP0rW0STRYkHov",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "let arr = []\n\nfor (const item of $input.all()) {\n  if (Array.isArray(item.json.files) && item.json.files.length > 0) {\n    for(let i = 0; i < item.json.files.length; i++) {\n      arr.push({\n        json: { ...item.json }, \n        binary:  { data: item.binary['data'+ i] } \n      })\n    }\n  }\n}\nreturn arr\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        240,
        -32
      ],
      "id": "bff438f2-9fc4-4798-bd66-d1e4ffe6a514",
      "name": "文件转换格式"
    },
    {
      "parameters": {
        "jsCode": "let arr = []\n\nfor (const item of $input.all()) {\n  item.json.myNewField = 1;\n  console.log('第二个', item)\n  arr.push({\n    text: item.json[0].content[0].text \n  })\n  \n}\nreturn [{\n  json: {\n    result: arr\n  }\n}]\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        656,
        -32
      ],
      "id": "a3940550-f170-44ef-a7c4-c3e41f0c1549",
      "name": "输出结果聚合"
    }
  ],
  "pinData": {},
  "connections": {
    "When chat message received": {
      "main": [
        [
          {
            "node": "文件转换格式",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze image": {
      "main": [
        [
          {
            "node": "输出结果聚合",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "文件转换格式": {
      "main": [
        [
          {
            "node": "Analyze image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "442998d4-038b-4f21-90f7-97c7754145d3",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "e6d562a11669b4d2f353eafef58b0a2d41d2839326a8b4201a24f4610bf43de1"
  },
  "id": "10ceEDPo4QyCYKcg",
  "tags": []
}

聊天窗口支持上传图片

文件转换格式节点

chat节点上传多个图片时,默认只有一个item,多张图片使用不同的key挂载到这个item上

使用这个节点,把一个item转换成多个item

多个图片解析生成多个结果

javascript 复制代码
let arr = []

for (const item of $input.all()) {
  if (Array.isArray(item.json.files) && item.json.files.length > 0) {
    for(let i = 0; i < item.json.files.length; i++) {
      arr.push({
        json: { ...item.json }, 
        binary:  { data: item.binary['data'+ i] } 
      })
    }
  }
}
return arr

Analyze image节点

输出结果聚合

把多个item合并到一个item,聊天窗口仅支持一个item

javascript 复制代码
let arr = []

for (const item of $input.all()) {
  item.json.myNewField = 1;
  console.log('第二个', item)
  arr.push({
    text: item.json[0].content[0].text 
  })
  
}
return [{
  json: {
    result: arr
  }
}]

参考链接

https://chat.xutongbao.top/n8n/

相关推荐
冻柠檬飞冰走茶1 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing031 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊1 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6752 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩3 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Penge6663 小时前
《Go 后端开发者学 TypeScript:typescript 类型断言》
javascript
Penge6663 小时前
《Go 后端开发者学 TypeScript:Symbol》
javascript
疯华整猫4 小时前
被杀掉之后:我把 Android 的「唤起 + 常驻」重做了一遍
前端·面试·架构
Hhy_11075 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19905 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala