OpenAI的对话和图像API简单体验

OpenAI的对话和图像API简单体验

  • 前言
    • OpenAI API 对话和图像接口
      • Python
      • JavaScript
    • Azure OpenAI API 对话和图像接口
      • Python
      • JavaScript
    • 总结

前言

JS 和 Python 是比较受欢迎的两个调用 OpenAI 对话 API 的两个库, 这里 简单记录这两个库对 OpenAI 的对话(Chat)和图像(Image)的使用.

使用上这里会包括原生的 OpenAI APIAzure OpenAI API 两个使用例子.

JavaScrip 在网络设置和后端平台开发上不如 Python 方便,但是我们的 AIGC_Playground 的项目是一个前后端的项目,未来能够在网页上有一个好的体验,并且尽量分离前后端,所以这个项目的请求优先用JavaScrip

  • 下面的例子 node 版本: v16.20.2, Python 的版本是 3.10.12

OpenAI API 对话和图像接口

Python

首先 pip3 install openai

直接看代码吧 代码比较简单

import httpx
import asyncio
from openai import OpenAIproxy_url = "http://xxxx:xxxx"
api_key = "xxxx"def use_proxy():http_client = Noneif(not proxy_url):http_client = httpx.Client()return http_clienthttp_client = httpx.Client(proxies={'http://': proxy_url, 'https://': proxy_url})return http_client'''
# ===== 非流式的对话测试 =====
'''
async def no_stream_chat():http_client = use_proxy()client = OpenAI(api_key=api_key,http_client=http_client)# 请求results = client.chat.completions.create(model= "gpt-4o-mini", messages=[{"role": "user", "content": [{"type": "text", "text": "Hello?"}]}])print(results.choices[0].message.content)'''
# ===== 流式的对话测试 =====
'''
async def stream_chat():http_client = use_proxy()client = OpenAI(api_key=api_key,http_client=http_client)# 请求results = client.chat.completions.create(model= "gpt-4o-mini", messages=[{"role": "user", "content": [{"type": "text", "text": "Hello?"}]}], stream=True)for chunk in results:choice = chunk.choicesif choice == []:continuecontent = choice[0].delta.contentprint(content)'''
# ===== 生成图像的函数 =====
'''
async def gen_dell3_pic():http_client = use_proxy()client = OpenAI(api_key=api_key,http_client=http_client)# 请求results = client.images.generate(model="dall-e-3", prompt="A cute cat")print(results.data[0].url)if __name__ == "__main__":asyncio.run(no_stream_chat())asyncio.run(stream_chat())asyncio.run(gen_dell3_pic())

JavaScript

首先安装包 npm install openai https-proxy-agent --save

再配置 package.json 支持 ES6 如下:

{"type": "module","dependencies": {"https-proxy-agent": "^7.0.6","openai": "^4.78.1"}
}

同样也直接看代码算了

import { OpenAI } from "openai";const proxyUrl = "http://xxxx:xxx";
const apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";/** 配置网络设置 */
async function useProxy(client) {if (!proxyUrl) return;// 动态导入 https-proxy-agent 模块const { HttpsProxyAgent } = await import("https-proxy-agent");// 使用 HttpsProxyAgentconst agent = new HttpsProxyAgent(proxyUrl);const originalFetchWithTimeout = client.fetchWithTimeout;client.fetchWithTimeout = async (url, init, ms, controller) => {const { signal, ...options } = init || {};if (signal) signal.addEventListener("abort", () => controller.abort());const timeout = setTimeout(() => controller.abort(), ms);const fetchOptions = {signal: controller.signal,...options,agent: agent,};if (fetchOptions.method) {// Custom methods like 'patch' need to be uppercasedfetchOptions.method = fetchOptions.method.toUpperCase();}try {return await originalFetchWithTimeout.call(client,url,fetchOptions,ms,controller);} finally {clearTimeout(timeout);}};
}/** ===== 非流式的对话测试 ===== */
async function noStreamChat() {const client = new OpenAI({ apiKey, timeout: 5000 });await useProxy(client);// 请求const results = await client.chat.completions.create({model: "gpt-4o-mini",messages: [{ role: "user", content: [{ type: "text", text: "Hello?" }] }],});for (const choice of results.choices) {console.log(choice.message);}
}/** ===== 流式的对话测试 ===== */
async function streamChat() {const client = new OpenAI({ apiKey, timeout: 5000 });await useProxy(client);// 请求const results = await client.chat.completions.create({model: "gpt-4o-mini",messages: [{ role: "user", content: [{ type: "text", text: "Hello?" }] }],stream: true,});for await (const chunk of results) {console.log(chunk.choices[0]?.delta?.content || "");}
}/** ===== 图片请求 ===== */
async function genDell3Pic() {const client = new OpenAI({ apiKey, timeout: 60000 });await useProxy(client);// 请求const results = await client.images.generate({model: "dall-e-3",prompt: "cute cat",});console.log(results.data[0].url);
}/** ===== 测试主函数 ===== */
async function main() {await noStreamChat();await streamChat();await genDell3Pic();
}main().catch((err) => {console.error("The sample encountered an error:", err);
});

Azure OpenAI API 对话和图像接口

Python

装依赖 pip3 install openai 看代码

import httpx
import asyncio
from openai import AzureOpenAIproxy_url = ""
azure_endpoint = "xxxxxxxxxxxxxxxx"
api_key = "xxxxxxxxxxxxxxxx"
chat_deployment = "xxxxxx"
image_deployment = "xxxxxxx"def use_proxy():http_client = Noneif(not proxy_url):http_client = httpx.Client()return http_clienthttp_client = httpx.Client(proxies={'http://': proxy_url, 'https://': proxy_url})return http_client'''
# ===== 非流式的对话测试 =====
'''
async def no_stream_chat():deployment = chat_deploymentapi_version = "2024-05-01-preview"http_client = use_proxy()client = AzureOpenAI(azure_endpoint=azure_endpoint, api_key=api_key, api_version=api_version, http_client=http_client)# 请求results = client.chat.completions.create(model=deployment, messages=[{"role": "user", "content": [{"type": "text", "text": "Hello?"}]}])print(results.choices[0].message.content)'''
# ===== 流式的对话测试 =====
'''
async def stream_chat():deployment = chat_deploymentapi_version = "2024-05-01-preview"http_client = use_proxy()client = AzureOpenAI(azure_endpoint=azure_endpoint, api_key=api_key, api_version=api_version, http_client=http_client)# 请求results = client.chat.completions.create(model=deployment, messages=[{"role": "user", "content": [{"type": "text", "text": "Hello?"}]}], stream=True)for chunk in results:choice = chunk.choicesif choice == []:continuecontent = choice[0].delta.contentprint(content)'''
# ===== 生成图像的函数 =====
'''
async def gen_dell3_pic():deployment = image_deploymentapi_version = "2024-05-01-preview"http_client = use_proxy()client = AzureOpenAI(azure_endpoint=azure_endpoint, api_key=api_key, api_version=api_version, http_client=http_client)# 请求results = client.images.generate(model=deployment, prompt="cute cat")print(results.data[0].url)if __name__ == "__main__":asyncio.run(no_stream_chat())asyncio.run(stream_chat())asyncio.run(gen_dell3_pic())

JavaScript

安装包 npm install openai https-proxy-agent --save, 再配置 package.json 如下:

{"type": "module","dependencies": {"https-proxy-agent": "^7.0.6","openai": "^4.78.1"}
}

直接看代码吧:

import { AzureOpenAI } from "openai";const proxyUrl = "";
const endpoint = "xxxxxxxxx";
const apiKey = "xxxxxxxxx";
const chatDeployment = "xxx";
const dellDelpoyment = "xxxxxx";/** 配置网络设置 */
async function useProxy(client) {if (!proxyUrl) return;// 动态导入 https-proxy-agent 模块const { HttpsProxyAgent } = await import("https-proxy-agent");// 使用 HttpsProxyAgentconst agent = new HttpsProxyAgent(proxyUrl);const originalFetchWithTimeout = client.fetchWithTimeout;client.fetchWithTimeout = async (url, init, ms, controller) => {const { signal, ...options } = init || {};if (signal) signal.addEventListener("abort", () => controller.abort());const timeout = setTimeout(() => controller.abort(), ms);const fetchOptions = {signal: controller.signal,...options,agent: agent,};if (fetchOptions.method) {// Custom methods like 'patch' need to be uppercasedfetchOptions.method = fetchOptions.method.toUpperCase();}try {return await originalFetchWithTimeout.call(client,url,fetchOptions,ms,controller);} finally {clearTimeout(timeout);}};
}/** ===== 非流式的对话测试 ===== */
async function noStreamChat() {const deployment = chatDeployment;const apiVersion = "2024-05-01-preview";const client = new AzureOpenAI({ endpoint, apiKey, apiVersion, deployment });useProxy(client);// 请求const results = await client.chat.completions.create({messages: [{ role: "user", content: [{ type: "text", text: "Hello?" }] }],});for (const choice of results.choices) {console.log(choice.message);}
}/** ===== 流式的对话测试 ===== */
async function streamChat() {const apiVersion = "2024-05-01-preview";const deployment = chatDeployment;const client = new AzureOpenAI({ endpoint, apiKey, apiVersion, deployment });useProxy(client);// 请求const results = await client.chat.completions.create({messages: [{ role: "user", content: [{ type: "text", text: "Hello?" }] }],stream: true,});for await (const chunk of results) {console.log(chunk.choices[0]?.delta?.content || "");}
}/** ===== 图片请求 ===== */
async function genDell3Pic() {// The prompt to generate images fromconst deployment = dellDelpoyment;const apiVersion = "2024-04-01-preview";const client = new AzureOpenAI({ endpoint, apiKey, apiVersion, deployment });useProxy(client);// 请求const results = await client.images.generate({ prompt: "cute cat" });console.log("image.url :", results.data[0].url);
}/** ===== 测试主函数 ===== */
async function main() {await noStreamChat();await streamChat();await genDell3Pic();
}main().catch((err) => {console.error("The sample encountered an error:", err);
});

总结

  1. 对于 JavaScript 的代码在配置网络时候需要对原来的 fetch 的参数进行复写, 虽然 openainpm 的包时候提供了传入自定义的 fetch 的值, 但是我测试发现这个传入对返回的 response 要做一些处理, 暂时这样操作.

  2. Python 的库直接用 httpx 直接定义网络设置, 还是比较方便的.

  3. 后续再介绍其他的接口.

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

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

相关文章

RK3568 Android 13 内置搜狗输入法小计

问:为什么写? 答:网上搜出来的都试过了,不行!下面直接上代码和注意事项! 首先到这个目录(/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall&#xff09…

windows10下安装Microsoft SQL Server 2016

一、下载安装包 网站:MSDN, 我告诉你 - 做一个安静的工具站 选择需要的版本,点击详细信息,复制ed2k链接,打开eMule或迅雷,新建下载,粘贴链接,开始下载。 下载好的文件是一个.iso镜像文件。 二、…

探索图像编辑的无限可能——Adobe Photoshop全解析

文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里,视觉内容无处不在,而创建和编辑这些内容的能力已经成为许多行业的核心技能…

IDEA Maven构建时报错:无效的目标发行版17

报错分析 报错原因:Maven 构建时,Java 版本配置不匹配 我安装的JDK版本是1.8,但由于种种原因,Maven构建时指定了 Java 17 作为目标发行版,从而导致错误 解决方案 首先,java -version,查看环…

React前端框架:构建现代Web应用的强大工具

在现代Web开发中,前端框架的使用已成为构建高效、可维护的应用程序的标准实践。React作为一种流行的前端框架,凭借其简洁、高效、灵活的特点,已成为许多开发者的首选。本文将介绍React框架的基本概念、核心特点以及如何使用它构建Web应用。 …

西电-神经网络基础与应用-复习笔记

此为24年秋研究生课程复习笔记 导论 神经网络的研究方法分为 连接主义,生理学派,模拟神经计算。高度的并行、分布性,很强的鲁棒和容错性。便于实现人脑的感知功能(音频图像的识别和处理)。符号主义,心理学派,基于符号…

学习flv.js

前言 flv.js一款使用纯 JavaScript 编写的 HTML5 Flash 视频 (FLV) 播放器,无需 Flash!!!flv.js 的工作原理是将 FLV 文件流转换为 ISO BMFF(碎片 MP4)片段,然后通过Media Source Extensions&l…

Gitlab-Runner配置

原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务,如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信,接收作业并提交到执行队列,Gitlab-Runner从队列中获取作业,并允许在不同环境下进行作…

LLM 智能视频字幕助手,支持生成、断句、优化、翻译、视频合成全流程

卡卡字幕助手(VideoCaptioner)是一款功能强大的视频字幕配制软件。操作简单且无需高配置,利用大语言模型进行字幕智能断句、校正、优化、翻译,一键为视频配上效果惊艳的字幕。 🎯 可使用强大的语音识别引擎&#xff0c…

HTML实战课堂之启动动画弹窗

一:代码片段讲解 小提示:下面是一个包含启动页和弹窗的完整示例。这个示例包括一个简单的启动页和一个弹窗,当用户点击启动页上的按钮时,会显示弹窗。 1. **HTML结构**: - #startPage:启动页,包…

GitLab本地服务器配置ssh和克隆项目

1. 本地安装好git git链接:https://git-scm.com/downloads/win 无脑点击下一步安装即可,打开Git Bash命令终端如下: 2. 配置本地用户名和邮箱 git config --global user.name "你的名字" git config --global user.email "你的邮箱&quo…

Unity热更新 之 Addressables(2) 本地/远端打包 流程测试

基础篇:Unity热更新 之 Addressables(1) 资源基础加载-CSDN博客 基础方法来源于唐老狮,我也是初学热更这一块,所有不保证步骤完全正确,如有不足还请斧正 目录 0.前提 1.本地打包 1.1.资源放入包 1.2.简化路径名称给出标签(如有需要的话) …

HDFS架构原理

一、HDFS架构整体概述 HDFS是Hadoop Distribute File System 的简称,意为:Hadoop分布式文件系统。HDFS是Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。HDFS解决的问题就是大数据如何存储,它是横跨在多台计算机上的文件…

图像处理|腐蚀操作

在计算机视觉与图像处理中,腐蚀操作(Erosion)是形态学操作的一种。形态学操作广泛应用于二值图像中,主要用于分析和提取图像中的结构信息。腐蚀操作是这类操作中最常见的一种,用来对图像进行“收缩”处理,消…

element plus 使用 el-tree 组件设置默认选中和获取所有选中节点id

1. 设置默认选中&#xff1a; 使用 default-checked-keys 属性&#xff0c;设置默认要选中的节点&#xff0c;以数组形式&#xff0c;如下&#xff1a; <el-treeref"treeRef":data"data"show-checkboxnode-key"id":props"defaultProps…

孤独症小孩读正常学校,这些需要了解

在当今社会&#xff0c;随着对孤独症&#xff08;自闭症&#xff09;认知的不断提升&#xff0c;越来越多的家庭开始寻求让孤独症孩子融入主流教育体系的机会。星贝育园康复中心&#xff0c;作为全国规模较大的广泛性发育障碍全托寄宿制儿童康复训练机构&#xff0c;不仅以其专…

头部(Header)

在Ionic框架中&#xff0c;头部&#xff08;Header&#xff09;和底部&#xff08;Footer&#xff09;是重要的UI组件&#xff0c;它们分别固定在屏幕的顶部和底部。 头部&#xff08;Header&#xff09; 头部组件通常用于显示应用程序的标题、副标题和导航按钮。它是应用程序…

Qiskit快速编程探索(进阶篇)

五、量子电路模拟:探索量子世界的虚拟实验室 5.1 Aer模拟器:强大的模拟引擎 在量子计算的探索旅程中,Aer模拟器作为Qiskit的核心组件之一,宛如一座功能强大的虚拟实验室,为开发者提供了在经典计算机上模拟量子电路运行的卓越能力。它打破了硬件条件的限制,使得研究者无…

rust学习——环境搭建

rust安装&#xff1a;https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html 1、vscode装插件&#xff1a; toml语法支持 依赖管理 rust语法支持 2、创建demo 3、查看目录 4、执行文件的几种方式&#xff1a; rust安装&#xff1a;https://www.rust-lang.org/z…

继承(7)

大家好&#xff0c;今天我们继续来学习一下继承的知识&#xff0c;这方面需要大家勤动脑才能理解&#xff0c;那么我们来看。 1.9 protected关键字 在类和对象章节中&#xff0c;为了实现封装特性,java中引入访向限定符,主要限定:类或者类中成员能否在类外和其他包中被访问. …