mirror of
https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
synced 2025-05-29 00:50:22 +09:00
feat: 增加dall-e插件
This commit is contained in:
parent
5069bd839d
commit
6a0791f0a2
2
.gitignore
vendored
2
.gitignore
vendored
@ -44,3 +44,5 @@ dev
|
|||||||
|
|
||||||
*.key
|
*.key
|
||||||
*.key.pub
|
*.key.pub
|
||||||
|
|
||||||
|
/public/uploads
|
65
app/api/langchain-tools/dalle_image_generator.ts
Normal file
65
app/api/langchain-tools/dalle_image_generator.ts
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import * as fs from "fs";
|
||||||
|
import * as path from "path";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
import { Tool } from "langchain/tools";
|
||||||
|
import OpenAI from "openai";
|
||||||
|
|
||||||
|
export class DallEAPIWrapper extends Tool {
|
||||||
|
name = "dalle_image_generator";
|
||||||
|
n = 1;
|
||||||
|
size: "256x256" | "512x512" | "1024x1024" | null = "1024x1024";
|
||||||
|
apiKey: string;
|
||||||
|
baseURL?: string;
|
||||||
|
|
||||||
|
constructor(apiKey?: string | undefined, baseURL?: string | undefined) {
|
||||||
|
super();
|
||||||
|
if (!apiKey) {
|
||||||
|
throw new Error("OpenAI API key not set.");
|
||||||
|
}
|
||||||
|
this.apiKey = apiKey;
|
||||||
|
this.baseURL = baseURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
async saveImageFromUrl(url: string) {
|
||||||
|
const response = await axios.get(url, { responseType: "arraybuffer" });
|
||||||
|
|
||||||
|
const uploadsDir = "public/uploads";
|
||||||
|
console.log("[fileUpload]", { uploadsDir });
|
||||||
|
if (!fs.existsSync(uploadsDir)) {
|
||||||
|
fs.mkdirSync(uploadsDir, { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
const filename = `${Date.now()}.png`;
|
||||||
|
const filePath = path.join(uploadsDir, filename);
|
||||||
|
|
||||||
|
fs.writeFileSync(filePath, Buffer.from(response.data, "binary"));
|
||||||
|
|
||||||
|
return `uploads/${filename}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
async _call(prompt: string) {
|
||||||
|
const openai = new OpenAI({
|
||||||
|
apiKey: this.apiKey,
|
||||||
|
baseURL: this.baseURL,
|
||||||
|
});
|
||||||
|
const response = await openai.images.generate({
|
||||||
|
prompt: prompt,
|
||||||
|
n: this.n,
|
||||||
|
size: this.size,
|
||||||
|
});
|
||||||
|
|
||||||
|
let image_url = response.data[0].url;
|
||||||
|
console.log(image_url);
|
||||||
|
if (!image_url) return "No image was generated";
|
||||||
|
let filePath = await this.saveImageFromUrl(image_url);
|
||||||
|
console.log(filePath);
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
description = `openai's dall-e image generator.
|
||||||
|
input must be a english prompt.
|
||||||
|
output will be the image link url.
|
||||||
|
use markdown to display images.`;
|
||||||
|
}
|
@ -18,6 +18,7 @@ import { DuckDuckGo } from "@/app/api/langchain-tools/duckduckgo_search";
|
|||||||
import { WebBrowser } from "langchain/tools/webbrowser";
|
import { WebBrowser } from "langchain/tools/webbrowser";
|
||||||
import { Calculator } from "langchain/tools/calculator";
|
import { Calculator } from "langchain/tools/calculator";
|
||||||
import { DynamicTool, Tool } from "langchain/tools";
|
import { DynamicTool, Tool } from "langchain/tools";
|
||||||
|
import { DallEAPIWrapper } from "@/app/api/langchain-tools/dalle_image_generator";
|
||||||
|
|
||||||
const serverConfig = getServerSideConfig();
|
const serverConfig = getServerSideConfig();
|
||||||
|
|
||||||
@ -214,9 +215,11 @@ async function handle(req: NextRequest) {
|
|||||||
];
|
];
|
||||||
const webBrowserTool = new WebBrowser({ model, embeddings });
|
const webBrowserTool = new WebBrowser({ model, embeddings });
|
||||||
const calculatorTool = new Calculator();
|
const calculatorTool = new Calculator();
|
||||||
|
const dallEAPITool = new DallEAPIWrapper(apiKey, baseUrl);
|
||||||
if (useTools.includes("web-search")) tools.push(searchTool);
|
if (useTools.includes("web-search")) tools.push(searchTool);
|
||||||
if (useTools.includes(webBrowserTool.name)) tools.push(webBrowserTool);
|
if (useTools.includes(webBrowserTool.name)) tools.push(webBrowserTool);
|
||||||
if (useTools.includes(calculatorTool.name)) tools.push(calculatorTool);
|
if (useTools.includes(calculatorTool.name)) tools.push(calculatorTool);
|
||||||
|
if (useTools.includes(dallEAPITool.name)) tools.push(dallEAPITool);
|
||||||
|
|
||||||
useTools.forEach((toolName) => {
|
useTools.forEach((toolName) => {
|
||||||
if (toolName) {
|
if (toolName) {
|
||||||
|
@ -38,4 +38,13 @@ export const CN_PLUGINS: BuiltinPlugin[] = [
|
|||||||
createdAt: 1694235989000,
|
createdAt: 1694235989000,
|
||||||
enable: false,
|
enable: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "DALL·E",
|
||||||
|
toolName: "dalle_image_generator",
|
||||||
|
lang: "cn",
|
||||||
|
description: "DALL·E 可以根据自然语言的描述创建逼真的图像和艺术。",
|
||||||
|
builtin: true,
|
||||||
|
createdAt: 1694703673000,
|
||||||
|
enable: false,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
@ -40,4 +40,14 @@ export const EN_PLUGINS: BuiltinPlugin[] = [
|
|||||||
createdAt: 1694235989000,
|
createdAt: 1694235989000,
|
||||||
enable: false,
|
enable: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "DALL·E",
|
||||||
|
toolName: "dalle_image_generator",
|
||||||
|
lang: "en",
|
||||||
|
description:
|
||||||
|
"DALL·E 2 is an AI system that can create realistic images and art from a description in natural language.",
|
||||||
|
builtin: true,
|
||||||
|
createdAt: 1694703673000,
|
||||||
|
enable: false,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
"cheerio": "^1.0.0-rc.12",
|
"cheerio": "^1.0.0-rc.12",
|
||||||
"duck-duck-scrape": "^2.2.4",
|
"duck-duck-scrape": "^2.2.4",
|
||||||
"emoji-picker-react": "^4.5.1",
|
"emoji-picker-react": "^4.5.1",
|
||||||
|
"encoding": "^0.1.13",
|
||||||
"fuse.js": "^6.6.2",
|
"fuse.js": "^6.6.2",
|
||||||
"html-entities": "^2.4.0",
|
"html-entities": "^2.4.0",
|
||||||
"html-to-image": "^1.11.11",
|
"html-to-image": "^1.11.11",
|
||||||
@ -34,6 +35,7 @@
|
|||||||
"nanoid": "^4.0.2",
|
"nanoid": "^4.0.2",
|
||||||
"next": "^13.4.9",
|
"next": "^13.4.9",
|
||||||
"node-fetch": "^3.3.1",
|
"node-fetch": "^3.3.1",
|
||||||
|
"openai": "^4.6.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-markdown": "^8.0.7",
|
"react-markdown": "^8.0.7",
|
||||||
|
23
yarn.lock
23
yarn.lock
@ -3005,6 +3005,13 @@ emoji-regex@^9.2.2:
|
|||||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
||||||
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
||||||
|
|
||||||
|
encoding@^0.1.13:
|
||||||
|
version "0.1.13"
|
||||||
|
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
|
||||||
|
integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
|
||||||
|
dependencies:
|
||||||
|
iconv-lite "^0.6.2"
|
||||||
|
|
||||||
enhanced-resolve@^5.12.0:
|
enhanced-resolve@^5.12.0:
|
||||||
version "5.12.0"
|
version "5.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
|
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
|
||||||
@ -3944,7 +3951,7 @@ husky@^8.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
|
resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
|
||||||
integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
|
integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
|
||||||
|
|
||||||
iconv-lite@0.6, iconv-lite@^0.6.3:
|
iconv-lite@0.6, iconv-lite@^0.6.2, iconv-lite@^0.6.3:
|
||||||
version "0.6.3"
|
version "0.6.3"
|
||||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
|
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
|
||||||
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
|
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
|
||||||
@ -5347,6 +5354,20 @@ openai@^3.3.0:
|
|||||||
axios "^0.26.0"
|
axios "^0.26.0"
|
||||||
form-data "^4.0.0"
|
form-data "^4.0.0"
|
||||||
|
|
||||||
|
openai@^4.6.0:
|
||||||
|
version "4.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/openai/-/openai-4.6.0.tgz#0335111cf71c608b68dbdca19f8ccbd9cfb0cd97"
|
||||||
|
integrity sha512-LuONkTgoe4D172raQCv+eEK5OdLGnY/M4JrUz/pxRGevZwqDqy3xhBbCeWX8QLCbFcnITYsu/VBJXZJ0rDAMpA==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "^18.11.18"
|
||||||
|
"@types/node-fetch" "^2.6.4"
|
||||||
|
abort-controller "^3.0.0"
|
||||||
|
agentkeepalive "^4.2.1"
|
||||||
|
digest-fetch "^1.3.0"
|
||||||
|
form-data-encoder "1.7.2"
|
||||||
|
formdata-node "^4.3.2"
|
||||||
|
node-fetch "^2.6.7"
|
||||||
|
|
||||||
openapi-types@^12.1.3:
|
openapi-types@^12.1.3:
|
||||||
version "12.1.3"
|
version "12.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3"
|
resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3"
|
||||||
|
Loading…
Reference in New Issue
Block a user