AI全栈之coze的logo生成

前言

前几日体验了国产的AI-Agents产品coze

它是一种能够自主执行任务、与环境进行交互并根据所获取的信息做出决策和采取行动的软件程序

并且可以自己去创建属于自己的AIBot,还是很有意思的,大家可以去体验体验

在体验过程中,我发现在创建bot的时候,需要我们输入bot名称,以及相关描述,并且可以根据内容生成头像

这也就是本文的由来~

动画.gif

实现

效果

动画.gif

前端

—html讲解

接下来我来讲解这个效果是如何实现的

首先我们通过bootstrap生成一个简单的表格

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>AI生成头像</title><linkhref="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.0/css/bootstrap.min.css"rel="stylesheet"/><style>#logo{display: flex;}#logo img {display: block;width: 200px;height: 200px;}</style></head><body><!-- 网页布局 --><div class="container"><div class="row"><div class="col-md-6 col-md-offset-3"><form name="logoForm"><div class="form-group"><label for="titleInput">Bot名称:</label><inputtype="text"class="form-control"id="titleInput"name="title"placeholder="Bot名称"requried/></div><div class="form-group"><label for="descInput">Bot介绍:</label><textareaclass="form-control"name="desc"id="descInput"placeholder="请输入Bot介绍"></textarea></div><div class="form-group"><button type="submit" class="btn btn-primary">生成图标</button></div></form></div></div><div class="row" id="logo"></div></div><script></script></body>
</html>

效果如下:

image.png

这里引入了 Bootstrap 的 CSS 样式表,主体部分有一个容器,里面包含了一行,这一行又分为两部分,一部分是包含 Bot 名称和介绍输入框以及生成图标按钮的表单,另一部分是预留用于展示生成图标的区域

—js讲解

<script>const oForm = document.forms["logoForm"];const oLogo = document.getElementById("logo");oForm.addEventListener("submit", function (e) {e.preventDefault();const title = this["title"].value.trim();const desc = this["desc"].value.trim();// console.log(title, desc);if (title) {const data = {title,desc,};// post 提交表单fetch("http://localhost:3000/logo", {method: "POST",headers: {"Content-Type": "application/json",},// 请求体 字符串或者文件二进制body: JSON.stringify(data),}).then((res) => res.json()).then((data) => {// console.log(data);if (data.code == 200) {const { msg } = data;const oImg = document.createElement("img");oImg.classList.add("col-md-6", "col-md-offset-3");oImg.src = msg;// 图片加载完成,将图片添加到页面oImg.onload = function () {oLogo.appendChild(oImg);};} else {console.log("错误");}});}});</script>

首先获取了页面中的表单(logoForm)和用于展示生成头像的区域(logo)。

然后为表单添加了submit事件的监听。当表单提交时,先阻止默认的提交行为,之后获取表单中输入的 Bot 名称和介绍,并进行了去空格处理。如果 Bot 名称不为空,就将这些数据封装为一个对象。

通过fetch函数以POST方法向http://localhost:3000/logo发送请求,请求体为包含 Bot 名称和介绍的 JSON 数据。

在接收到响应后,将响应解析为 JSON 格式。如果响应中的code值为 200,表示成功,就创建一个新的图片元素,设置其类名和源地址,并在图片加载完成后将其添加到logo区域;如果code值不为 200,则在控制台输出错误信息

后端(重点讲解)

首先肯定是需要创建一个后端服务咯

那么这里我们采用koa框架去搭建一个后端服务,Koa 是一个基于 Node.js 的 Web 应用框架,是目前最好的,最火的,最简单的一个框架了

首先 npm i koa 安装好依赖以后

import Koa from "koa";

现在我们就可以启动一个后端服务了

import Koa from "koa";const app = new Koa();// 启动http服务 3000端口
app.listen(3000, () => {console.log("server is running at http://localhost:3000");
});

image.png

接下来我们需要添加路由功能

使用 npm i koa-router 安装好依赖

import Router from "koa-router"; // 引入路由

然后就可以使用路由功能了

import Koa from "koa";
import Router from "koa-router"; // 引入路由const app = new Koa();
const router = new Router();// 创建 /logo 路由
router.post("/logo", async (ctx) => {console.log('logo');ctx.body = {code: 200,msg: 'logo',};})// 启动http服务 3000端口
app.listen(3000, () => {console.log("server is running at http://localhost:3000");
});

现在就创建好了一个简单的/logo路由了

但是现在通过前端去访问这个路由,会出现一个问题

image.png

这是一个跨域问题,来自于前端js的同源策略,同源指的是协议、域名和端口都相同。如果两个 URL 的协议、域名和端口不完全相同,就被认为是不同源。

这里我们就需要解决这个问题,通过添加npm i @koa/cors

将cors添加到项目即可解决

import cors from "@koa/cors";
app.use(cors());

但是我们需要拿到访问的参数才行啊

于是我们引入npm i @koa/bodyparser

import { bodyParser } from "@koa/bodyparser";
app.use(bodyParser());

现在我们可以通过ctx.request.body拿到前端给我们返回的数据了

接下来我们就需要添加openai的依赖了 npm i openai并引入

import OpenAI from "openai";

同时使用dotenv管理我们的openai的key,安装npm i dotenv,并在同级目录创建一个名为.env的目录
放入key

image.png

通过

import dotenv from "dotenv";// 管理key值dotenv.config({path: ".env",
});
// key
process.env.OPENAI_KEY

可以拿到我们的key值

接下来就需要创建我们与ai的窗口了

const client = new OpenAI({apiKey: process.env.OPENAI_KEY,baseURL: "https://api.gptsapi.net/v1",
});

通过client就可以向其发送指令,我们使用client.images.generate,向其发送一个图片的请求

router.post("/logo", async (ctx) => {// console.log(ctx.request.body);const { title, desc } = ctx.request.body;const prompt = `我要开发标题为${title}的一款bot,功能细节是${desc}?`;let response;let url;try {response = await client.images.generate({model: "dall-e-3",prompt: prompt,n: 1,size: "1024x1024",});console.log(response.data);url = response.data[0].url;console.log(url, "111111111111111111111");ctx.body = {code: 200,msg: url,};} catch (e) {console.log("服务不可用");ctx.body = {code: 500,msg: "出错了",};}
});
  1. const { title, desc } = ctx.request.body;:从请求的主体中解构获取 titledesc 两个属性的值。这意味着客户端在发送 POST 请求时,请求体中应该包含这两个键值对。

  2. const prompt = 我要开发标题为的一款,功能细节是{desc}?;:通过模板字符串将获取到的 titledesc 嵌入到一个新的字符串 prompt 中,用于后续的图像生成操作。

  3. let response; let url;:声明了两个变量 responseurl ,用于存储后续操作的结果。

  4. try {...} 块:

    • response = await client.images.generate({...});:使用 await 关键字异步等待图像生成的结果。传递的参数包括模型名称、提示信息、生成数量和尺寸等。
    • console.log(response.data);:打印生成的响应数据。
    • url = response.data[0].url;:从响应数据中获取第一个图像的 URL 并赋值给 url 变量。
    • ctx.body = {...};:成功生成图像后,设置响应的主体。状态码为 200 表示成功,msg 字段中包含生成的图像 URL
  5. catch (e) {...} 块:如果在图像生成过程中发生异常(可能是服务不可用、网络问题或其他错误),会捕获这个异常

    • console.log("服务不可用");:在控制台打印错误提示。
    • ctx.body = {...};:向客户端返回状态码为 500 的错误响应,msg 字段说明出错了

接下来我们就可以实现通过coze的功能啦

动画.gif

总结

随着时代的发展,AI 与人类将更加紧密地融合,共同工作和生活,成为人类的重要伙伴

本文讲解了如何使用前后端实现一个简易的通过ai去生成一个头像的功能,相信看到这里的你一定会有所收获的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适合爬虫开发用的性价比高的代理推荐

在爬虫开发过程中&#xff0c;使用代理可以有效地隐藏爬虫的真实来源&#xff0c;并绕过一些可能对爬虫设置的限制。然而&#xff0c;市面上的代理服务众多&#xff0c;选择一款性价比高且适合爬虫开发的代理服务显得尤为重要。以下是一些适合爬虫开发用的性价比比较高的代理推…

Linux操作系统进程同步的几种方式及基本原理

1&#xff0c;进程同步的几种方式 1.1信号量 用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行&#xff1a;初始化&#xff0c;P操作和V操作&#xff0c;这三种操作都是原子操作。 P操作(递减操作)可以用于阻塞一个进程&#xff0c;V操作(增加操作)可以用于…

【华为OD机试】递增字符串(C++/Java/Python)

题目 题目描述 [定义字符串]完全由 ‘A’ 和 ‘B’组成,当然也可以全是’A’或全是’B’。如果字符串从前往后都是以字典序排列的,那么我们称之为严格递增字符串。 给出一个字符串s,允许修改字符串中的任意字符,即可以将任何的’A’修改成’B’,也可以将任何的’B’修改成…

Go 实现继承的方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Java高级重点知识点-12-Collection、iterator迭代器、泛型

文章目录 Collection集合Iterator迭代器泛型&#xff08;难点&#xff09; Collection集合 集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合框架 单列集合java.util.Collection双列集合java.util.Map 集合类继承体系图&#xff1a; List集合的特点&am…

Interview preparation--Elasticsearch并发控制

Elasticsearch 并发控制 Elasticsearch是分布式的。创建&#xff0c;更新&#xff0c;删除文档时&#xff0c;必须将文档的新版本复制到集群中的其他节点。ES也是异步并行的&#xff0c;所有这些复制请求是并行发送的&#xff0c;并且可能不安顺序执行到每一个节点。ES需要一种…

新品发布 | TC1018Pro和TC1034Pro正式发布,功能升级,多设备时间同步

新品发布/New products release 同星智能最新推出TC1018Pro和TC1034Pro两款产品&#xff0c;新版本在保留原来基本功能的基础上做了升级&#xff0c;主要新增IO功能、错误帧ID检测、多设备间时间同步等功能。 接下来&#xff0c;让我们看看这两款产品带来了哪些具体功能升级&a…

玄奘取经线路矢量图分享

我们在《透过丝绸之路&#xff0c;看古人都走过哪些地方》一文中&#xff0c;为你分享过丝绸之路的矢量图数据。 现在&#xff0c;我们再为你分享一下玄奘取经线路的矢量图&#xff0c;你可以在文末查看这些数据的领取方式。 玄奘取经线路 《西游记》的故事相信大家都不陌生…

ABC234G Divide a Sequence 题解

题目来源 ABC234G 洛谷 Description 给定长度为 n n n 的序列 { a n } \{a_n\} {an​}。定义一种将 { a n } \{a_n\} {an​} 划分为若干段的方案的价值为每段的最大值减去最小值的差的乘积。求所有划分方案的价值的总和并对 998244353 998244353 998244353 取模。 1 ≤…

项目实训-vue(十一)

项目实训-vue&#xff08;十一&#xff09; 文章目录 项目实训-vue&#xff08;十一&#xff09;1.概述2.页顶导航栏3.导航信息4.总结 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.页顶导航栏 <divstyle"display: flex;justify-content: space-between;alig…

如何挑选洗地机?盘点口碑最好的四大洗地机

在购买洗地机这种智能家电时&#xff0c;大家都应该格外谨慎。毕竟&#xff0c;洗地机价格不菲&#xff0c;精打细算&#xff0c;确保物尽其用才是最重要的。谁都不想花了高价买回来却让它闲置在墙角落灰尘。买之前我们还是需要对自己的需求做一个清晰的判断&#xff0c;实用性…

【GameFramework扩展应用】6-2、替换GameFramework.dll源码

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q764424567/article/details/1…

9 个实用 Shell 脚本

Dos 攻击防范&#xff08;自动屏蔽攻击 IP&#xff09; #!/bin/bash DATE$(date %d/%b/%Y:%H:%M) LOG_FILE/usr/local/nginx/logs/demo2.access.log ABNORMAL_IP$(tail -n5000 $LOG_FILE |grep $DATE |awk {a[$1]}END{for(i in a)if(a[i]>10)print i}) for IP in $ABNORMA…

【unity笔记】六、UI实现下拉列表切换视角

具体步骤如下 1. 创建UI下拉列表&#xff1a; 在Unity场景中右键点击并选择UI -> 下拉列表 来创建一个新的下拉列表。 2. 添加摄像机选项&#xff1a; 在Dropdown的Options属性中添加新的选项&#xff0c;通过点击按钮来添加选项&#xff0c;并为每个选项设置一个显示名…

广告联盟撸包小游戏app开发 现有源码案例

广告联盟小游戏APP的开发涉及多个关键步骤和要素&#xff0c;以下是一个大致的开发流程&#xff1a; 市场调研与定位&#xff1a; 深入了解目标用户群体的需求、喜好以及游戏习惯&#xff0c;这有助于确定游戏的核心功能和特色123456。 分析市场上的类似产品和广告联盟平台&a…

sourceTree 和Tortoise git软件的对比,以及使用sourceTree管理公司托管的 gitlab 项目或github项目

文章目录 Tortoisegit 和sourcetree的比较如何添加 gitlab 的社区版账号总结参考资料 Tortoisegit 和sourcetree的比较 我在 window都是用 Git 小乌龟&#xff08;Tortoise git&#xff09;来可视化管理 Git 项目。这时是不区分 Git 平台的&#xff0c;也就是不管你用的是 Git…

用Rust开发一个类似SQL Server的数据库系统的步骤和关键技术

在开发一个类似SQL Server的数据库系统时&#xff0c;选择Rust作为编程语言有许多好处&#xff0c;包括安全性、性能和并发性。本文将探讨用Rust开发这样一个系统所需的关键步骤和技术。 1. 项目规划和设计 在开始编码之前&#xff0c;需要进行详细的规划和设计&#xff1a; …

山东省专用R1快开门式压力容器操作题库(附答案)

1、【判断题】压力容器运行中的压力和温度升、降&#xff0c;都应做到缓慢进行。(  )(√) 2、【判断题】(  )压力容器升温过程中需进行热紧的系统&#xff0c;应在升温同时对容器、管道、阀门、附件等进行均匀热紧。(√) 3、【判断题】压力容器遇有紧急情况威协安全时&am…

生产看板管理系统内容有哪些?

相信很多做生产管理的朋友都会遇到如下问题&#xff0c;我就在想&#xff0c;是否能一个创建“透明的”的工作场所&#xff1f;让员工和管理者能够实时查询生产进度&#xff0c;及时发现生产中的问题。 生产进度难追踪 生产过程不透明 生产决策缺乏数据支持 ——能&#xf…

ROS CDK魔法书:点亮博客上云新技能(TypeScript篇)

引言 在数字世界的浩瀚海洋中&#xff0c;信息与数据如同戏剧中的主角&#xff0c;舞动着无形的旋律&#xff0c;构建起信息时代的交响乐。而在这其中&#xff0c;作为一位技术领域的探索者&#xff0c;你的使命便是挥舞着编码的魔杖&#xff0c;创造和守护着这些宝贵的数字灵…