mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-17 13:57:10 +00:00
fix: add a image caption tool
This commit is contained in:
parent
6d5a9ed97d
commit
34bba041e5
3 changed files with 80 additions and 1 deletions
29
apps/chat.js
29
apps/chat.js
|
|
@ -60,6 +60,7 @@ import { SerpTool } from '../utils/tools/SerpTool.js'
|
|||
import { SerpIkechan8370Tool } from '../utils/tools/SerpIkechan8370Tool.js'
|
||||
import {SendPictureTool} from "../utils/tools/SendPictureTool.js";
|
||||
import {SerpImageTool} from "../utils/tools/SearchImageTool.js";
|
||||
import {ImageCaptionTool} from "../utils/tools/ImageCaptionTool.js";
|
||||
try {
|
||||
await import('emoji-strip')
|
||||
} catch (err) {
|
||||
|
|
@ -1957,7 +1958,7 @@ export class chatgpt extends plugin {
|
|||
new SendVideoTool(),
|
||||
new SearchMusicTool(),
|
||||
new SendMusicTool(),
|
||||
new SendAvatarTool(),
|
||||
// new SendAvatarTool(),
|
||||
// new SendDiceTool(),
|
||||
new EditCardTool(),
|
||||
new QueryStarRailTool(),
|
||||
|
|
@ -1967,8 +1968,33 @@ export class chatgpt extends plugin {
|
|||
new WeatherTool(),
|
||||
new SendPictureTool(),
|
||||
new SerpImageTool(),
|
||||
new ImageCaptionTool(),
|
||||
serpTool
|
||||
]
|
||||
let img = []
|
||||
if (e.source) {
|
||||
// 优先从回复找图
|
||||
let reply
|
||||
if (e.isGroup) {
|
||||
reply = (await e.group.getChatHistory(e.source.seq, 1)).pop()?.message
|
||||
} else {
|
||||
reply = (await e.friend.getChatHistory(e.source.time, 1)).pop()?.message
|
||||
}
|
||||
if (reply) {
|
||||
for (let val of reply) {
|
||||
if (val.type === 'image') {
|
||||
console.log(val)
|
||||
img.push(val.url)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e.img) {
|
||||
img.push(...e.img)
|
||||
}
|
||||
if (img.length > 0) {
|
||||
prompt += `\nthe url of the picture(s) above: ${img.join(', ')}`
|
||||
}
|
||||
// if (e.sender.role === 'admin' || e.sender.role === 'owner') {
|
||||
// tools.push(...[new JinyanTool(), new KickOutTool()])
|
||||
// }
|
||||
|
|
@ -2004,6 +2030,7 @@ export class chatgpt extends plugin {
|
|||
await e.reply('字数超限啦,将为您自动结束本次对话。')
|
||||
return null
|
||||
} else {
|
||||
logger.error(err)
|
||||
throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -128,6 +128,7 @@ const defaultConfig = {
|
|||
amapKey: '',
|
||||
azSerpKey: '',
|
||||
serpSource: 'ikechan8370',
|
||||
extraUrl: '',
|
||||
version: 'v2.7.0'
|
||||
}
|
||||
const _path = process.cwd()
|
||||
|
|
|
|||
51
utils/tools/ImageCaptionTool.js
Normal file
51
utils/tools/ImageCaptionTool.js
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import { AbstractTool } from './AbstractTool.js'
|
||||
import fetch, { File, FormData } from 'node-fetch'
|
||||
import { Config } from '../config.js'
|
||||
import fs from 'fs'
|
||||
import crypto from 'crypto'
|
||||
export class ImageCaptionTool extends AbstractTool {
|
||||
name = 'imageCaption'
|
||||
|
||||
parameters = {
|
||||
properties: {
|
||||
imgUrl: {
|
||||
type: 'string',
|
||||
description: 'the url of the image.'
|
||||
},
|
||||
qq: {
|
||||
type: 'string',
|
||||
description: 'if the picture is an avatar of a user, just give his qq number'
|
||||
}
|
||||
},
|
||||
required: []
|
||||
}
|
||||
|
||||
description = 'useful when you want to know what is inside a picture, such as user\'s avatar'
|
||||
|
||||
func = async function (opts) {
|
||||
let { imgUrl, qq } = opts
|
||||
if (qq) {
|
||||
imgUrl = `https://q1.qlogo.cn/g?b=qq&s=160&nk=${qq}`
|
||||
}
|
||||
if (!imgUrl) {
|
||||
return 'you must give at least one parameter of imgUrl and qq'
|
||||
}
|
||||
const imageResponse = await fetch(imgUrl)
|
||||
const blob = await imageResponse.blob()
|
||||
const arrayBuffer = await blob.arrayBuffer()
|
||||
const buffer = Buffer.from(arrayBuffer)
|
||||
// await fs.writeFileSync(`data/chatgpt/${crypto.randomUUID()}`, buffer)
|
||||
let formData = new FormData()
|
||||
formData.append('file', new File([buffer], 'file.png', { type: 'image/png' }))
|
||||
let captionRes = await fetch(`${Config.extraUrl}/image-captioning`, {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
})
|
||||
if (captionRes.status === 200) {
|
||||
let result = await captionRes.text()
|
||||
return `the content of this picture is: ${result}`
|
||||
} else {
|
||||
return 'error happened'
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue