当前位置:   article > 正文

ChatGptAPI中文文档

ChatGptAPI中文文档

准备调用ChatGPT接口,过了一遍官方接口文档,由于没有学过AI相关知识,有些参数和术语还是不太了解,有些单词使用很生僻的意思,翻译的很生硬,先大致翻译一遍,后面再看下手册理解下,回过头来补充下这个API文档,帮助理解。感觉prompt(提示)、Embeddings(嵌入)、Fine-tunes(微调)有点牛逼。

介绍

要安装官方 Python 绑定,请运行以下命令:

pip install openai
  • 1

要安装官方 Node.js 库,请在 Node.js 项目目录中运行以下命令:

npm install openai
  • 1

认证

OpenAI API 使用 API 密钥进行身份验证。访问您的API 密钥页面以检索您将在请求中使用的 API 密钥。

**请记住,您的 API 密钥是秘密的!**不要与他人共享或在任何客户端代码(浏览器、应用程序)中公开它。生产请求必须通过您自己的后端服务器进行路由,您的 API 密钥可以从环境变量或密钥管理服务中安全加载。

所有 API 请求都应在 HTTP 标头中包含您的 API 密钥,Authorization如下所示:

Authorization: Bearer OPENAI_API_KEY
  • 1

请求组织

对于属于多个组织的用户,您可以传递一个标头来指定哪个组织用于 API 请求。来自这些 API 请求的使用将计入指定组织的订阅配额。

curl命令示例:

curl https://api.openai.com/v1/models \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "OpenAI-Organization: org-oiD85Cuq7BToDgSamwH7synm"
  • 1
  • 2
  • 3

Python 包的示例openai

import os
import openai
openai.organization = "org-oiD85Cuq7BToDgSamwH7synm"
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.Model.list()
  • 1
  • 2
  • 3
  • 4
  • 5

Node.js 包的示例openai

import { Configuration, OpenAIApi } from "openai";
const configuration = new Configuration({
    organization: "org-oiD85Cuq7BToDgSamwH7synm",
    apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.listEngines();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

组织 ID 可以在您的组织设置页面上找到。

发出请求

您可以将下面的命令粘贴到您的终端中以运行您的第一个 API 请求。确保替换$OPENAI_API_KEY为您的秘密 API 密钥。

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
     "model": "gpt-3.5-turbo",
     "messages": [{"role": "user", "content": "Say this is a test!"}],
     "temperature": 0.7
   }'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

此请求查询模型以完成以提示“ Say this is a testgpt-3.5-turbo ”开头的文本。您应该会收到类似于以下内容的响应:

{
   "id":"chatcmpl-abc123",
   "object":"chat.completion",
   "created":1677858242,
   "model":"gpt-3.5-turbo-0301",
   "usage":{
      "prompt_tokens":13,
      "completion_tokens":7,
      "total_tokens":20
   },
   "choices":[
      {
         "message":{
            "role":"assistant",
            "content":"\n\nThis is a test!"
         },
         "finish_reason":"stop",
         "index":0
      }
   ]
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

现在你已经生成了你的第一个聊天完成。我们可以看到finish_reasonisstop这意味着 API 返回了模型生成的完整完成。在上面的请求中,我们只生成了一条消息,但是您可以设置参数n来生成多条消息选择。在这个例子中,gpt-3.5-turbo更多的是用于传统的文本完成任务。该模型还针对聊天应用程序进行了优化。

模型

列出并描述 API 中可用的各种模型。您可以参考模型文档以了解可用的模型以及它们之间的区别。

列出型号

GET https://api.openai.com/v1/models

列出当前可用的模型,并提供有关每个模型的基本信息,例如所有者和可用性。

# 请求示例
curl https://api.openai.com/v1/models \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2
  • 3
//响应
{
  "data": [
    {
      "id": "model-id-0",
      "object": "model",
      "owned_by": "organization-owner",
      "permission": [...]
    },
    {
      "id": "model-id-1",
      "object": "model",
      "owned_by": "organization-owner",
      "permission": [...]
    },
    {
      "id": "model-id-2",
      "object": "model",
      "owned_by": "openai",
      "permission": [...]
    },
  ],
  "object": "list"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

检索模型

检索模型实例,提供有关模型的基本信息,例如所有者和权限。

GET https://api.openai.com/v1/models/{model}

路径参数

参数名类型是否必输描述
modelstring用于此请求的模型的 ID

完成(Completions)

给定一个提示,该模型将返回一个或多个预测的完成,并且还可以返回每个位置的替代标记的概率。

创建完成(Create completion)

为提供的提示和参数创建完成

POST https://api.openai.com/v1/completions

请求体

参数名类型是否必输默认值描述
modelstring要使用的模型的 ID。您可以使用List models API 来查看所有可用模型,或查看我们的模型概述以了解它们的描述。
promptstringarray<|endoftext|>生成完成的提示,编码为字符串、字符串数组、标记数组或标记数组数组。请注意,<|endoftext|>是模型在训练期间看到的文档分隔符,因此如果未指定提示,模型将生成新文档的开头。
suffixstringnull插入文本完成后出现的后缀。
max_tokensinteger16完成时生成的最大标记数。您的提示加上的标记计数max_tokens不能超过模型的上下文长度。大多数模型的上下文长度为 2048 个标记(最新模型除外,它支持 4096)。标记翻译请看文章末尾
temperaturenumber1使用什么采样温度,介于 0 和 2 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使输出更加集中和确定。
我们通常建议改变这个或top_p但不是两者。
top_pnumber1一种替代温度采样的方法,称为核采样,其中模型考虑具有 top_p 概率质量的标记的结果。所以 0.1 意味着只考虑构成前 10% 概率质量的标记。
我们通常建议改变这个或temperature但不是两者。
ninteger1为每个提示生成多少完成。
**注意:**因为这个参数会产生很多完成,它会很快消耗你的令牌配额。请谨慎使用并确保您对max_tokens和进行了合理的设置stop
streambooleanfalse是否回流部分进度。如果设置,标记将在可用时作为仅数据服务器发送事件发送,流由data: [DONE]消息终止。
logprobsintegernulllogprobs 上包括对数概率最有可能的标记,以及所选标记。例如,如果 logprobs 为 5,则 API 将返回 5 个最有可能的标记的列表。 API 将始终返回采样令牌的 logprob,因此响应中最多可能有 logprobs+1 个元素。
logprobs 的最大值为 5。如果您需要更多,请通过我们的帮助中心联系我们并描述您的用例。
echobooleanfalse除了完成之外,还回显提示
stopstringarraynullAPI 将停止生成更多标记的最多 4 个序列。
presence_penaltynumber0-2.0 和 2.0 之间的数字。正值会根据到目前为止是否出现在文本中来惩罚新标记,从而增加模型谈论新主题的可能性。
frequency_penaltynumber0-2.0 和 2.0 之间的数字。正值会根据新标记在文本中的现有频率对其进行惩罚,从而降低模型逐字重复同一行的可能性。
best_ofinteger1在服务器端生成 best_of 完成,并返回“最佳”。 每个标记具有最高对数概率的那个。无法流式传输结果。
当使用nbest_of 控制候选完成的数量,n 指定返回多少 - best_of 必须大于 n
**注意:**因为这个参数会产生很多完成,它会很快消耗你的令牌配额。请谨慎使用并确保您对max_tokens和进行了合理的设置stop
logit_biasmapnull修改指定标记出现在完成中的可能性。接受一个 json 对象,该对象将标记(由 GPT 分词器中的标记ID 指定)映射到从 -100 到 100 的相关偏差值。您可以使用此标记生成器工具(适用于 GPT-2 和 GPT-3)将文本转换为标记 ID。从数学上讲,偏差会在采样之前添加到模型生成的对数中。确切的效果因模型而异,但 -1 和 1 之间的值应该会减少或增加选择的可能性;像 -100 或 100 这样的值应该导致相关标记的禁止或独占选择。例如,您可以传递 {“50256”: -100} 以防止生成 <|endoftext|>
userstring代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。 了解更多

示例请求

curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "text-davinci-003",
    "prompt": "Say this is a test",
    "max_tokens": 7,
    "temperature": 0
  }'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参数

{
  "model": "text-davinci-003",
  "prompt": "Say this is a test",
  "max_tokens": 7,
  "temperature": 0,
  "top_p": 1,
  "n": 1,
  "stream": false,
  "logprobs": null,
  "stop": "\n"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

响应

{
  "id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
  "object": "text_completion",
  "created": 1589478378,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\nThis is indeed a test",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length"
    }
  ],
  "usage": {
    "prompt_tokens": 5,
    "completion_tokens": 7,
    "total_tokens": 12
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

聊天

给定聊天对话,模型将返回聊天完成响应。

创建聊天完成

为聊天消息创建完成

POST https://api.openai.com/v1/chat/completions

请求体

参数名类型是否必输默认值描述
modelstring要使用的模型的 ID。有关哪些模型适用于聊天 API 的详细信息,请参阅模型端点兼容性表
messagesarray聊天格式生成聊天完成的消息。
temperaturenumber1使用什么采样温度,介于 0 和 2 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使输出更加集中和确定。
我们通常建议改变这个或top_p但不是两者。
top_pnumber1一种替代温度采样的方法,称为核采样,其中模型考虑具有 top_p 概率质量的标记的结果。所以 0.1 意味着只考虑构成前 10% 概率质量的标记。
我们通常建议改变这个或temperature但不是两者。
ninteger1为每个输入消息生成多少个聊天完成选项。
streambooleanfalse如果设置,将发送部分消息增量,就像在 ChatGPT 中一样。令牌将在可用时作为纯数据服务器发送事件发送,流由data:[DONE] 消息终止。有关示例代码,请参阅 OpenAI Cookbook
stopstringarraynullAPI 将停止生成更多标记的最多 4 个序列。
max_tokensintegerinf聊天完成时生成的最大标记数。
输入标记和生成标记的总长度受模型上下文长度的限制。
presence_penaltynumber0-2.0 和 2.0 之间的数字。正值会根据到目前为止是否出现在文本中来惩罚新标记,从而增加模型谈论新主题的可能性。
frequency_penaltynumber0-2.0 和 2.0 之间的数字。正值会根据新标记在文本中的现有频率对其进行惩罚,从而降低模型逐字重复同一行的可能性。
logit_biasmapnull修改指定标记出现在完成中的可能性。接受一个 json 对象,该对象将标记(由 GPT 分词器中的标记ID 指定)映射到从 -100 到 100 的相关偏差值。您可以使用此标记生成器工具(适用于 GPT-2 和 GPT-3)将文本转换为标记 ID。从数学上讲,偏差会在采样之前添加到模型生成的对数中。确切的效果因模型而异,但 -1 和 1 之间的值应该会减少或增加选择的可能性;像 -100 或 100 这样的值应该导致相关标记的禁止或独占选择。
userstring代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。 了解更多

示例请求

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参数

{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "Hello!"}]
}
  • 1
  • 2
  • 3
  • 4

响应

{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "\n\nHello there, how may I assist you today?",
    },
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

编辑

给定提示和指令,模型将返回提示的编辑版本。

创建编辑

为提供的输入、指令和参数创建新的编辑。

POST https://api.openai.com/v1/edits

请求体

参数名类型是否必输默认值描述
modelstring要使用的模型的 ID。您可以将text-davinci-edit-001code-davinci-edit-001模型与此端点一起使用。
inputstring空字符串用作编辑起点的输入文本。
instructionstring告诉模型如何编辑提示的指令。
ninteger1为输入和指令生成多少编辑。
temperaturenumber1使用什么采样温度,介于 0 和 2 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使输出更加集中和确定。
我们通常建议改变这个或top_p但不是两者。
top_pnumber1一种替代温度采样的方法,称为核采样,其中模型考虑具有 top_p 概率质量的标记的结果。所以 0.1 意味着只考虑构成前 10% 概率质量的标记。
我们通常建议改变这个或temperature但不是两者。

示例请求

curl https://api.openai.com/v1/edits \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "text-davinci-edit-001",
    "input": "What day of the wek is it?",
    "instruction": "Fix the spelling mistakes"
  }'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

参数

{
  "model": "text-davinci-edit-001",
  "input": "What day of the wek is it?",
  "instruction": "Fix the spelling mistakes",
}
  • 1
  • 2
  • 3
  • 4
  • 5

响应

{
  "object": "edit",
  "created": 1589478378,
  "choices": [
    {
      "text": "What day of the week is it?",
      "index": 0,
    }
  ],
  "usage": {
    "prompt_tokens": 25,
    "completion_tokens": 32,
    "total_tokens": 57
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

图片

给定提示和/或输入图像,模型将生成新图像。

相关指南:图像生成

创建图像

根据提示创建图像。

POST https://api.openai.com/v1/images/generations

请求体

参数名类型是否必输默认值描述
promptstring所需图像的文本描述。最大长度为 1000 个字符。
ninteger1要生成的图像数。必须介于 1 和 10 之间。
sizestring1024x1024生成图像的大小。必须是256x256 512x512 1024x1024之一
response_formatstringurl生成的图像返回的格式。必须是 urlb64_json
usernumber1代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。 了解更多

示例请求

curl https://api.openai.com/v1/images/generations \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "prompt": "A cute baby sea otter",
    "n": 2,
    "size": "1024x1024"
  }'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

参数

{
  "prompt": "A cute baby sea otter",
  "n": 2,
  "size": "1024x1024"
}
  • 1
  • 2
  • 3
  • 4
  • 5

响应

{
  "created": 1589478378,
  "data": [
    {
      "url": "https://..."
    },
    {
      "url": "https://..."
    }
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建图像编辑

在给定原始图像和提示的情况下创建编辑或扩展图像。

POST https://api.openai.com/v1/images/edits

请求体

参数名类型是否必输默认值描述
imagestring要编辑的图像。必须是有效的 PNG 文件,小于 4MB,并且是方形的。如果未提供遮罩,图像必须具有透明度,将用作遮罩。
maskstring一个附加图像,其完全透明区域(例如,alpha 为零)指示应编辑image的位置。 必须是有效的 PNG 文件,小于 4MB,并且具有与image相同的尺寸。
promptstring所需图像的文本描述。最大长度为 1000 个字符。
ninteger1要生成的图像数。必须介于 1 和 10 之间。
sizestring1生成图像的大小。必须是256x256 512x512 1024x1024 之一
response_formatstringurl生成的图像返回的格式。必须是 或url b64_json之一
userstring代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。 了解更多

示例请求

curl https://api.openai.com/v1/images/edits \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F image="@otter.png" \
  -F mask="@mask.png" \
  -F prompt="A cute baby sea otter wearing a beret" \
  -F n=2 \
  -F size="1024x1024"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

响应

{
  "created": 1589478378,
  "data": [
    {
      "url": "https://..."
    },
    {
      "url": "https://..."
    }
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建图像变体

创建给定图像的变体。

POST https://api.openai.com/v1/images/variations

请求体

参数名类型是否必输默认值描述
imagestring用作变体基础的图像。必须是有效的 PNG 文件,小于 4MB,并且是方形的。
ninteger1要生成的图像数。必须介于 1 和 10 之间。
sizestring1024x1024生成图像的大小。必须是256x256 512x512 1024x1024 之一
response_formatstringurl生成的图像返回的格式。必须是 或url b64_json之一
userstring代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。 了解更多

请求示例

curl https://api.openai.com/v1/images/variations \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F image="@otter.png" \
  -F n=2 \
  -F size="1024x1024"
  • 1
  • 2
  • 3
  • 4
  • 5

响应

{
  "created": 1589478378,
  "data": [
    {
      "url": "https://..."
    },
    {
      "url": "https://..."
    }
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

嵌入

获取给定输入的矢量表示,机器学习模型和算法可以轻松使用该表示。

相关指南:嵌入

创建嵌入

创建表示输入文本的嵌入向量。

POST https://api.openai.com/v1/embeddings

请求体

参数名类型是否必输默认值描述
imagestring要使用的模型的 ID。您可以使用List models API 来查看所有可用模型,或查看我们的模型概述以了解它们的描述。
ninteger1输入文本以获取嵌入,编码为字符串或标记数组。要在单个请求中获取多个输入的嵌入,请传递一个字符串数组或令牌数组数组。每个输入的长度不得超过 8192 个标记。
sizestring1024x1024代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。了解更多

请求示例

curl https://api.openai.com/v1/embeddings \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "The food was delicious and the waiter...",
    "model": "text-embedding-ada-002"
  }'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参数

{
  "model": "text-embedding-ada-002",
  "input": "The food was delicious and the waiter..."
}
  • 1
  • 2
  • 3
  • 4

响应

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "embedding": [
        0.0023064255,
        -0.009327292,
        .... (1536 floats total for ada-002)
        -0.0028842222,
      ],
      "index": 0
    }
  ],
  "model": "text-embedding-ada-002",
  "usage": {
    "prompt_tokens": 8,
    "total_tokens": 8
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

音频

了解如何将音频转换为文本。

相关指南:语音转文本

创建转录

将音频转录为输入语言。

POST https://api.openai.com/v1/audio/transcriptions

请求体

参数名类型是否必输默认值描述
filestring要转录的音频文件,采用以下格式之一:mp3、mp4、mpeg、mpga、m4a、wav 或 webm。
modelstring要使用的模型的 ID。仅whisper-1当前可用。
promptstring1024x1024可选文本,用于指导模型的风格或继续之前的音频片段。提示应与音频语言相匹配。
response_formatstringjson转录输出的格式,采用以下选项之一:json、text、srt、verbose_json 或 vtt。
temperaturenumber0采样温度,介于 0 和 1 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使输出更加集中和确定。如果设置为 0,模型将使用对数概率自动升高温度,直到达到特定阈值。
languagestring输入音频的语言。以ISO-639-1格式提供输入语言将提高准确性和延迟。

请求示例

curl https://api.openai.com/v1/audio/transcriptions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F file="@/path/to/file/audio.mp3" \
  -F model="whisper-1"
  • 1
  • 2
  • 3
  • 4
  • 5

参数

{
  "file": "audio.mp3",
  "model": "whisper-1"
}
  • 1
  • 2
  • 3
  • 4

响应

{
  "text": "Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger. This is a place where you can get to do that."
}
  • 1
  • 2
  • 3

创建翻译

将音频翻译成英文。

POST https://api.openai.com/v1/audio/translations

请求体

参数名类型是否必输默认值描述
filestring要翻译的音频文件,采用以下格式之一:mp3、mp4、mpeg、mpga、m4a、wav 或 webm。
modelstring要使用的模型的 ID。仅whisper-1当前可用。
promptstring1024x1024可选文本,用于指导模型的风格或继续之前的音频片段。提示应为英文
response_formatstringjson转录输出的格式,采用以下选项之一:json、text、srt、verbose_json 或 vtt。
temperaturenumber0采样温度,介于 0 和 1 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使输出更加集中和确定。如果设置为 0,模型将使用对数概率自动升高温度,直到达到特定阈值。

请求示例

curl https://api.openai.com/v1/audio/translations \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F file="@/path/to/file/german.m4a" \
  -F model="whisper-1"
  • 1
  • 2
  • 3
  • 4
  • 5

参数

{
  "file": "german.m4a",
  "model": "whisper-1"
}
  • 1
  • 2
  • 3
  • 4

响应

{
  "text": "Hello, my name is Wolfgang and I come from Germany. Where are you heading today?"
}
  • 1
  • 2
  • 3

文件

文件用于上传可与微调等功能一起使用的文档。

列出文件

返回属于用户组织的文件列表。

GET https://api.openai.com/v1/files

请求示例

curl https://api.openai.com/v1/files \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2

响应

{
  "data": [
    {
      "id": "file-ccdDZrC3iZVNiQVeEA6Z66wf",
      "object": "file",
      "bytes": 175,
      "created_at": 1613677385,
      "filename": "train.jsonl",
      "purpose": "search"
    },
    {
      "id": "file-XjGxS3KTG0uNmNOK362iJua3",
      "object": "file",
      "bytes": 140,
      "created_at": 1613779121,
      "filename": "puppy.jsonl",
      "purpose": "search"
    }
  ],
  "object": "list"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

上传文件

上传包含要跨各种端点/功能使用的文档的文件。目前,一个组织上传的所有文件的大小最大可达 1 GB。如果您需要增加存储限制,请联系我们。

POST https://api.openai.com/v1/files

请求体

参数名类型是否必输默认值描述
filestring要上传的JSON 行文件的名称。
如果purpose设置为“fine-tune”,则每一行都是一个 JSON 记录,其中包含代表您的训练示例的“prompt”和“completion”字段。
purposestring上传文件的预期目的。
使用“fine-tune”进行微调。这使我们能够验证上传文件的格式。

请求示例

curl https://api.openai.com/v1/files \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F purpose="fine-tune" \
  -F file="@mydata.jsonl"
  • 1
  • 2
  • 3
  • 4

响应

{
  "id": "file-XjGxS3KTG0uNmNOK362iJua3",
  "object": "file",
  "bytes": 140,
  "created_at": 1613779121,
  "filename": "mydata.jsonl",
  "purpose": "fine-tune"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

删除文件

删除文件。

DELETE https://api.openai.com/v1/files/{file_id}

路径参数

参数名类型是否必输描述
file_idstring用于此请求的文件的 ID

请求示例

curl https://api.openai.com/v1/files/file-XjGxS3KTG0uNmNOK362iJua3 \
  -X DELETE \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2
  • 3

响应

{
  "id": "file-XjGxS3KTG0uNmNOK362iJua3",
  "object": "file",
  "deleted": true
}
  • 1
  • 2
  • 3
  • 4
  • 5

检索文件

返回有关特定文件的信息。

GET https://api.openai.com/v1/files/{file_id}

路径参数

参数名类型是否必输描述
file_idstring用于此请求的文件的 ID

请求示例

curl https://api.openai.com/v1/files/file-XjGxS3KTG0uNmNOK362iJua3 \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2

响应

{
  "id": "file-XjGxS3KTG0uNmNOK362iJua3",
  "object": "file",
  "bytes": 140,
  "created_at": 1613779657,
  "filename": "mydata.jsonl",
  "purpose": "fine-tune"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

检索文件内容

返回指定文件的内容

GET https://api.openai.com/v1/files/{file_id}/content

路径参数

参数名类型是否必输描述
file_idstring用于此请求的文件的 ID

请求示例

curl https://api.openai.com/v1/files/file-XjGxS3KTG0uNmNOK362iJua3/content \
  -H "Authorization: Bearer $OPENAI_API_KEY" > file.jsonl
  • 1
  • 2

微调

管理微调作业以根据您的特定训练数据定制模型。

相关指南:微调模型

创建微调

创建一个从给定数据集微调指定模型的作业。

响应包括排队作业的详细信息,包括作业状态和完成后微调模型的名称。

了解有关微调的更多信息

POST https://api.openai.com/v1/fine-tunes

请求体

参数名类型是否必输默认值描述
training_filestring包含训练数据的上传文件的 ID。
有关如何上传文件,请参阅上传文件
您的数据集必须格式化为 JSONL 文件,其中每个训练示例都是一个带有键“prompt”和“completion”的 JSON 对象。此外,您上传文件时purpose 参数必须为fine-tune
有关详细信息,请参阅微调指南
validation_filestring包含验证数据的上传文件的 ID。
如果您提供此文件,该数据将用于在微调期间定期生成验证指标。这些指标可以在微调结果文件中查看。您的训练和验证数据应该是互斥的。
您的数据集必须格式化为 JSONL 文件,其中每个训练示例都是一个带有键“prompt”和“completion”的 JSON 对象。此外,您上传文件时purpose 参数必须为fine-tune
有关详细信息,请参阅微调指南
modelstringcurie要微调的基本模型的名称。您可以选择“ada”、“babbage”、“curie”、“davinci”或 2022-04-21 之后创建的微调模型之一。要了解有关这些模型的更多信息,请参阅 模型文档。
n_epochsinteger4训练模型的时期数。一个时期指的是训练数据集的一个完整周期。
batch_sizeintegernull用于训练的批量大小。批量大小是用于训练单个前向和后向传递的训练示例数。
默认情况下,批量大小将动态配置为训练集中示例数量的 0.2%,上限为 256 - 通常,我们发现较大的批量大小往往更适合较大的数据集。
learning_rate_multipliernumbernull用于训练的学习率乘数。微调学习率是用于预训练的原始学习率乘以该值。
默认情况下,学习率乘数是 0.05、0.1 或 0.2,具体取决于batch_size(较大的学习率往往在较大的批量大小下表现更好)。我们建议使用 0.02 到 0.2 范围内的值进行试验,以查看产生最佳结果的值。
prompt_loss_weightnumber0.01用于提示标记损失的权重。这控制了模型尝试学习生成提示的程度(与权重始终为 1.0 的完成相比),并且可以在完成(completions) 较短时为训练增加稳定效果。
如果提示非常长(相对于完成),则减少此权重以避免过度优先学习提示可能是有意义的。
compute_classification_metricsbooleanfalse如果设置,我们将在每个时期结束时使用验证集计算特定于分类的指标,例如准确性和 F-1 分数。可以在结果文件中查看这些指标。
为了计算分类指标,您必须提供一个 validation_file. 此外,您必须指定classification_n_classes多类分类或 classification_positive_class二元分类。
classification_n_classesintegernull分类任务中的类数。
多类分类需要此参数。
classification_positive_classstringnull二元分类中的正类。
在进行二元分类时,需要此参数来生成精度、召回率和 F1 指标。
classification_betasarraynull如果提供,我们将计算指定 beta 值的 F-beta 分数。F-beta 分数是 F-1 分数的推广。这仅用于二元分类。
当 beta 为 1(即 F-1 分数)时,精确率和召回率被赋予相同的权重。Beta 分数越大,召回率越高,精确率越低。Beta 分数越小,精确度越重要,召回率越低。
suffixstringnull最多 40 个字符的字符串,将添加到您的微调模型名称中。
例如,suffix为“custom-model-name”的,生成名字类似这样ada:ft-your-org:custom-model-name-2022-02-15-04-21-04

请求示例

curl https://api.openai.com/v1/fine-tunes \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "training_file": "file-XGinujblHPwGLSztz8cPS8XY"
  }'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

响应

{
  "id": "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
  "object": "fine-tune",
  "model": "curie",
  "created_at": 1614807352,
  "events": [
    {
      "object": "fine-tune-event",
      "created_at": 1614807352,
      "level": "info",
      "message": "Job enqueued. Waiting for jobs ahead to complete. Queue number: 0."
    }
  ],
  "fine_tuned_model": null,
  "hyperparams": {
    "batch_size": 4,
    "learning_rate_multiplier": 0.1,
    "n_epochs": 4,
    "prompt_loss_weight": 0.1,
  },
  "organization_id": "org-...",
  "result_files": [],
  "status": "pending",
  "validation_files": [],
  "training_files": [
    {
      "id": "file-XGinujblHPwGLSztz8cPS8XY",
      "object": "file",
      "bytes": 1547276,
      "created_at": 1610062281,
      "filename": "my-data-train.jsonl",
      "purpose": "fine-tune-train"
    }
  ],
  "updated_at": 1614807352,
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

微调列表

列出您的组织的微调作业

GET https://api.openai.com/v1/fine-tunes

请求示例

curl https://api.openai.com/v1/fine-tunes \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2

响应

{
  "object": "list",
  "data": [
    {
      "id": "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
      "object": "fine-tune",
      "model": "curie",
      "created_at": 1614807352,
      "fine_tuned_model": null,
      "hyperparams": { ... },
      "organization_id": "org-...",
      "result_files": [],
      "status": "pending",
      "validation_files": [],
      "training_files": [ { ... } ],
      "updated_at": 1614807352,
    },
    { ... },
    { ... }
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

微调检索

获取有关微调作业的信息。

了解有关微调的更多信息

GET https://api.openai.com/v1/fine-tunes/{fine_tune_id}

路径参数

参数名类型是否必输描述
fine_tune_idstring微调作业的ID

请求示例

curl https://api.openai.com/v1/fine-tunes/ft-AF1WoRqd3aJAHsqc9NY7iL8F \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2

响应

{
  "id": "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
  "object": "fine-tune",
  "model": "curie",
  "created_at": 1614807352,
  "events": [
    {
      "object": "fine-tune-event",
      "created_at": 1614807352,
      "level": "info",
      "message": "Job enqueued. Waiting for jobs ahead to complete. Queue number: 0."
    },
    {
      "object": "fine-tune-event",
      "created_at": 1614807356,
      "level": "info",
      "message": "Job started."
    },
    {
      "object": "fine-tune-event",
      "created_at": 1614807861,
      "level": "info",
      "message": "Uploaded snapshot: curie:ft-acmeco-2021-03-03-21-44-20."
    },
    {
      "object": "fine-tune-event",
      "created_at": 1614807864,
      "level": "info",
      "message": "Uploaded result files: file-QQm6ZpqdNwAaVC3aSz5sWwLT."
    },
    {
      "object": "fine-tune-event",
      "created_at": 1614807864,
      "level": "info",
      "message": "Job succeeded."
    }
  ],
  "fine_tuned_model": "curie:ft-acmeco-2021-03-03-21-44-20",
  "hyperparams": {
    "batch_size": 4,
    "learning_rate_multiplier": 0.1,
    "n_epochs": 4,
    "prompt_loss_weight": 0.1,
  },
  "organization_id": "org-...",
  "result_files": [
    {
      "id": "file-QQm6ZpqdNwAaVC3aSz5sWwLT",
      "object": "file",
      "bytes": 81509,
      "created_at": 1614807863,
      "filename": "compiled_results.csv",
      "purpose": "fine-tune-results"
    }
  ],
  "status": "succeeded",
  "validation_files": [],
  "training_files": [
    {
      "id": "file-XGinujblHPwGLSztz8cPS8XY",
      "object": "file",
      "bytes": 1547276,
      "created_at": 1610062281,
      "filename": "my-data-train.jsonl",
      "purpose": "fine-tune-train"
    }
  ],
  "updated_at": 1614807865,
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

取消微调

立即取消微调作业

POST https://api.openai.com/v1/fine-tunes/{fine_tune_id}/cancel

路径参数

参数名类型是否必输描述
fine_tune_idstring要取消的微调作业的 ID

请求示例

curl https://api.openai.com/v1/fine-tunes/ft-AF1WoRqd3aJAHsqc9NY7iL8F/cancel \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2

响应

{
  "id": "ft-xhrpBbvVUzYGo8oUO1FY4nI7",
  "object": "fine-tune",
  "model": "curie",
  "created_at": 1614807770,
  "events": [ { ... } ],
  "fine_tuned_model": null,
  "hyperparams": { ... },
  "organization_id": "org-...",
  "result_files": [],
  "status": "cancelled",
  "validation_files": [],
  "training_files": [
    {
      "id": "file-XGinujblHPwGLSztz8cPS8XY",
      "object": "file",
      "bytes": 1547276,
      "created_at": 1610062281,
      "filename": "my-data-train.jsonl",
      "purpose": "fine-tune-train"
    }
  ],
  "updated_at": 1614807789,
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

列出微调事件

获取微调作业细粒度的状态更新

GET https://api.openai.com/v1/fine-tunes/{fine_tune_id}/events

路径参数

参数名类型是否必输描述
fine_tune_idstring要为其获取事件的微调作业的 ID。

查询参数

参数名类型是否必输默认值描述
streambooleanfalse是否为微调作业流式传输事件。 如果设置为 true,事件将在可用时作为纯数据服务器发送事件发送。当作业完成(成功、取消或失败)时,流将会伴随着data: [DONE]消息终止。
如果设置为 false,则只返回到目前为止生成的事件。

请求示例

curl https://api.openai.com/v1/fine-tunes/ft-AF1WoRqd3aJAHsqc9NY7iL8F/events \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2

响应

{
  "object": "list",
  "data": [
    {
      "object": "fine-tune-event",
      "created_at": 1614807352,
      "level": "info",
      "message": "Job enqueued. Waiting for jobs ahead to complete. Queue number: 0."
    },
    {
      "object": "fine-tune-event",
      "created_at": 1614807356,
      "level": "info",
      "message": "Job started."
    },
    {
      "object": "fine-tune-event",
      "created_at": 1614807861,
      "level": "info",
      "message": "Uploaded snapshot: curie:ft-acmeco-2021-03-03-21-44-20."
    },
    {
      "object": "fine-tune-event",
      "created_at": 1614807864,
      "level": "info",
      "message": "Uploaded result files: file-QQm6ZpqdNwAaVC3aSz5sWwLT."
    },
    {
      "object": "fine-tune-event",
      "created_at": 1614807864,
      "level": "info",
      "message": "Job succeeded."
    }
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

删除微调模型

删除微调模型。您必须在您的组织中拥有所有者角色。

DELETE https://api.openai.com/v1/models/{model}

路径参数

参数名类型是否必输描述
modelstring要删除的模型

请求示例

curl https://api.openai.com/v1/models/curie:ft-acmeco-2021-03-03-21-44-20 \
  -X DELETE \
  -H "Authorization: Bearer $OPENAI_API_KEY"
  • 1
  • 2
  • 3

响应

{
  "id": "curie:ft-acmeco-2021-03-03-21-44-20",
  "object": "model",
  "deleted": true
}
  • 1
  • 2
  • 3
  • 4
  • 5

适度

给定输入文本,如果模型将其分类为违反 OpenAI 的内容策略,则输出。

相关指南:适度

创建适度

分类文本是否违反 OpenAI 的内容政策

POST https://api.openai.com/v1/moderations

请求体

请求体

参数名类型是否必输默认值描述
inputsstringarray要分类的输入文本
modelstringtext-moderation-latest有两种内容审核模型可用:text-moderation-stabletext-moderation-latest
默认情况下text-moderation-latest会随着时间的推移自动升级。这可确保您始终使用我们最准确的模型。如果您使用text-moderation-stable,我们将在更新模型之前提供提前通知。text-moderation-stable的准确性略低于text-moderation-latest

示例请求

curl https://api.openai.com/v1/moderations \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "input": "I want to kill them."
  }'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

请求

{
  "input": "I want to kill them."
}
  • 1
  • 2
  • 3

响应

{
  "id": "modr-5MWoLO",
  "model": "text-moderation-001",
  "results": [
    {
      "categories": {
        "hate": false,
        "hate/threatening": true,
        "self-harm": false,
        "sexual": false,
        "sexual/minors": false,
        "violence": true,
        "violence/graphic": false
      },
      "category_scores": {
        "hate": 0.22714105248451233,
        "hate/threatening": 0.4132447838783264,
        "self-harm": 0.005232391878962517,
        "sexual": 0.01407341007143259,
        "sexual/minors": 0.0038522258400917053,
        "violence": 0.9223177433013916,
        "violence/graphic": 0.036865197122097015
      },
      "flagged": true
    }
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

categories中各个字段的含义如下

类别描述
hate基于种族、性别、民族、宗教、国籍、性取向、残疾状况或种姓表达、煽动或促进仇恨的内容。
hate/threatening仇恨内容还包括对目标群体的暴力或严重伤害。
self-harm提倡、鼓励或描述自残行为(例如自杀、割伤和饮食失调)的内容。
sexual意在引起性兴奋的内容,例如对性活动的描述,或宣传性服务(不包括性教育和健康)的内容。
sexual/minors包含 18 岁以下个人的色情内容。
violence宣扬或美化暴力或颂扬他人的痛苦或屈辱的内容。
violence/graphic以极端的画面细节描绘死亡、暴力或严重身体伤害的暴力内容。

参数详情

标记

GPT 系列模型使用标记处理文本,标记是文本中常见的字符序列。这些模型了解这些标记之间的统计关系,并且擅长生成标记序列中的下一个标记。

下面是官网提供的分词工具,我输入了一串英文,这里面就有10个标记。

在这里插入图片描述

一个有用的经验法则是,对于普通英文文本,一个标记通常对应于 ~4 个字符的文本。这相当于大约 ¾ 个单词(因此 100 个标记 ~= 75 个单词)。

频率和存在惩罚

Completions API中发现的频率和存在惩罚可用于降低对令牌重复序列进行采样的可能性。他们通过添加贡献直接修改 logits(非标准化对数概率)来工作。

mu[j] -> mu[j] - c[j] * alpha_frequency - float(c[j] > 0) * alpha_presence
  • 1

在该情况下:

  • mu[j]是第 j 个标记的对数
  • c[j]是在当前位置之前对该令牌进行采样的频率
  • 如果c[j] > 0float(c[j] > 0)为1,否则为 0
  • alpha_frequency是频率惩罚系数
  • alpha_presence是存在惩罚系数

正如我们所见,存在惩罚是一种一次性的加性贡献,适用于所有至少被采样过一次的标记,而频率惩罚是与特定标记被采样的频率成正比的贡献。

如果目标只是稍微减少重复样本,则惩罚系数的合理值约为 0.1 到 1。如果目标是强烈抑制重复,那么可以将系数增加到 2,但这会显着降低样本质量。负值可用于增加重复的可能性。

最终用户ID

在您的请求中发送最终用户 ID 可以成为帮助 OpenAI 监控和检测滥用的有用工具。如果我们在您的应用程序中检测到任何违反政策的情况,这允许 OpenAI 为您的团队提供更多可操作的反馈。

ID 应该是唯一标识每个用户的字符串。我们建议散列他们的用户名或电子邮件地址,以避免向我们发送任何识别信息。如果您向未登录的用户提供产品预览,您可以改为发送会话 ID。

您可以通过参数在 API 请求中包含最终用户 ID,user如下所示:

response = openai.Completion.create(
  model="text-davinci-003",
  prompt="This is a test",
  max_tokens=5,
  user="user123456"
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

各种语言OpenAi库

手册原文链接 https://platform.openai.com/docs/libraries

Python库

我们提供了一个 Python 库,您可以按如下方式安装它:

pip install openai
  • 1

安装后,您可以使用绑定和您的密钥运行以下命令:

import os
import openai

# Load your API key from an environment variable or secret management service
openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Completion.create(model="text-davinci-003", prompt="Say this is a test", temperature=0, max_tokens=7)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

绑定还将安装一个命令行实用程序,您可以按如下方式使用:

$ openai api completions.create -m text-davinci-003 -p "Say this is a test" -t 0 -M 7 --stream
  • 1

Node.js 库

我们还有一个 Node.js 库,您可以通过在 Node.js 项目目录中运行以下命令来安装它:

$ npm install openai
  • 1

安装后,您可以使用该库和您的密钥运行以下命令:

const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.createCompletion({
  model: "text-davinci-003",
  prompt: "Say this is a test",
  temperature: 0,
  max_tokens: 7,
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

其他语言社区库

下面的库由更广泛的开发人员社区构建和维护。

请注意,OpenAI 不会验证这些项目的正确性或安全性。

C# / .NET

Crystal

Go

Java

Kotlin

Node.js

PHP

Python

R

Ruby

Scala

Swift

Unity

Unreal Engine

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/513716
推荐阅读
相关标签
  

闽ICP备14008679号