feat: add a tool

This commit is contained in:
ikechan8370 2023-06-25 16:09:58 +08:00
parent da27e6a1b3
commit 116e4bef3c

View file

@ -0,0 +1,65 @@
import { AbstractTool } from './AbstractTool.js'
import fetch, { File, FormData } from 'node-fetch'
import { Config } from '../config.js'
export class ProcessPictureTool extends AbstractTool {
name = 'processPicture'
parameters = {
properties: {
type: {
type: 'string',
enum: ['Image2Hed', 'Image2Scribble'],
description: 'how to process it. Image2Hed: useful when you want to detect the soft hed boundary of the image; Image2Scribble: useful when you want to generate a scribble of the image'
},
qq: {
type: 'string',
description: 'if the picture is avatar of a user, input his qq number'
},
url: {
type: 'string',
description: 'url of the picture'
}
},
required: []
}
description = 'useful when you want to know what is inside a photo, such as user\'s avatar or other pictures'
func = async function (opts) {
let { imgUrl, qq, type } = 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 endpoint = 'image2hed'
switch (type) {
case 'Image2Scribble': {
endpoint = 'image2Scribble'
break
}
case 'Image2Hed': {
endpoint = 'image2hed'
break
}
}
let captionRes = await fetch(`${Config.extraUrl}/${endpoint}`, {
method: 'POST',
body: formData
})
if (captionRes.status === 200) {
let result = await captionRes.text()
return `the processed image url is ${result}`
} else {
return 'error happened'
}
}
}