

一个社区维护了OpenAI API的Swift SDK。
报告错误·请求功能
OpenAikit是一个以社区为导向的Swift SDK,旨在为Swift开发人员提供与OpenAI Rest端点互动的无缝,高效和摇摆的方式。我们的目的是降低迅速开发人员的障碍,使他们能够将OpenAI的力量整合到其应用程序中,而不会深入研究RESTFUL服务的复杂性。
随着对现代应用程序中对AI驱动功能的需求不断增长,对于开发人员来说,可以使用简化集成过程的工具至关重要。尽管Openai提供了令人难以置信的功能套件,但显然需要一个专门的Swift SDK,该SDK与Swift Developer Community的语言习惯和期望保持一致。
我们设想了一种工具,该工具不仅可以为OpenAI功能提供原始访问权限,还可以通过清晰直观的API增强开发人员体验。我们的最终目标是通过为Swift社区提供正确的工具来促进创新,以毫不费力地将AI功能集成到其应用程序中。
| 平台 | 最低快速版本 | 安装 | 地位 |
|---|---|---|---|
| iOS 13.0+ / macOS 10.15+ / tvos 13.0+ / watchos 6.0+ / visionos 1.0+ | 5.7 | Swift软件包管理器 | 经过全面测试 |
Swift软件包管理器允许开发人员轻松地将软件包集成到其Xcode项目和软件包中;并已完全集成到swift编译器中。
https://github.com/OpenDive/OpenAIKit.git设置了Swift软件包后,将git链接添加在Package.swift的dependencies项值中。
dependencies: [
. package ( url : " https://github.com/OpenDive/OpenAIKit.git " , . upToNextMajor ( from : " 2.0.1 " ) )
] 要获取API键,请在此处访问您的帐户页面上的API Keys页面。

配x ?重要的是:不要将OpenAI API键直接存储在代码中! ?配x 在使用OpenAI的API时,由于安全原因,必须将API键直接嵌入应用程序代码库中。将密钥直接嵌入您的源代码中可以将其暴露于未经授权的用户和恶意演员中,从而导致潜在的滥用。
最佳实践:
- 环境变量:将API密钥存储在环境变量中,并在代码中访问它们。这样,它们就不会对您的应用程序进行硬编码,并且可以安全地管理。
- 秘密管理:使用安全的秘密管理工具或服务来存储和检索API密钥。 AWS Secrets Manager,Hashicorp Vault,Firebase,CloudKit或Azure键值等工具旨在存储,管理和检索敏感数据。这样,用户就无法对密钥进行设备访问。
- 。
.gitignore- 定期旋转键:定期旋转API键,以减轻泄漏的潜在影响。
请记住,安全至关重要。始终优先考虑诸如API键之类的敏感信息!
有关更多信息,请查看有关Swift Developers的API密钥管理的所有信息。
通过Openai带给您的Dall-E 2(即将推出,Dall-E 3),深入研究AI驱动图像生成的下一个演变。 DALL-E 2以其前身的遗产为基础,提供了增强的功能,可以从文本提示中实现复杂的视觉效果,从而在语言和图像之间创建无缝的桥梁。开发人员可以利用这种开创性的技术来丰富用户体验,制作动态内容,并激发创造力的新途径。通过整合dall-e 2的前沿力量,彻底改变了您的应用程序和项目。
OpenAI提供了三个端点,以与DALL -E 2交互: - createImage是允许从文本提示符中直接生成的主要端点。这是有关如何使用端点以及相关输出的一个示例:
do {
let imageParam = ImageParameters (
// A text description of the desired image(s).
prompt : " An armchair in the shape of an avocado " ,
// The size of the generated images.
resolution : . large ,
// The format in which the generated images are returned.
responseFormat : . base64Json
)
let result = try await openAi . createImage (
parameters : imageParam
)
let b64Image = result . data [ 0 ] . image
let image = try openAi . decodeBase64Image ( b64Image )
} catch {
// Insert your own error handling method here.
} 
do {
let imageEditParam = try ImageEditParameters (
// The image to edit.
image : image ,
// An additional image whose fully transparent areas indicate where image should be edited.
mask : mask ,
// A text description of the desired image(s).
prompt : " The Mona Lisa wearing a beret, in the style of Leonardo DaVinci " ,
// The size of the generated images.
resolution : . large ,
// The format in which the generated images are returned.
responseFormat : . base64Json
)
let imageResponse = try await openAI . generateImageEdits (
parameters : imageEditParam
)
let image = try openAI . decodeBase64Image ( imageResponse . data [ 0 ] . image )
} catch {
// Insert your own error handling method here.
} ![]() | ![]() | ![]() |
|---|---|---|
| 原来的 | 面具 | 编辑 |
- createImageVariation允许开发人员创建给定输入图像的变化。这是有关如何使用端点以及相关输出的一个示例:
do {
let imageVariationParam = try ImageVariationParameters (
// The image to use as the basis for the variation(s).
image : image ,
// The size of the generated images.
resolution : . large ,
// The format in which the generated images are returned.
responseFormat : . base64Json
)
let variationResponse = try await openAI . generateImageVariations (
parameters : imageVariationParam
)
self . image = try openAI . decodeBase64Image (
variationResponse . data [ 0 ] . image
)
} catch {
// Insert your own error handling method here.
} ![]() | ![]() |
|---|---|
| 原来的 | 变化 |
Chatgpt建立在OpenAI的GPT-4体系结构上,是一种尖端的对话AI模型。它为开发人员提供了一个可靠的工具,可以将高级自然语言处理功能集成到应用程序中。使用ChatGpt可以在各种用例中增强用户交互,提高效率并提供AI驱动的解决方案。将GPT-4的力量纳入您的项目中,以取得切实的结果。
但是,此功能有一个端点,但是,该SDK将端点分为两个函数,总共具有三个单独的功能: - generateChatCompletion允许开发人员使用OpenAI提供的模型来生成聊天完成; or the developer's owned fine tuned models.这是有关如何使用端点以及相关输出的一个示例:
do {
let chat : [ ChatMessage ] = [
ChatMessage ( role : . system , content : " You are a helpful assistant. " ) ,
ChatMessage ( role : . user , content : " Who won the world series in 2020? " ) ,
ChatMessage ( role : . assistant , content : " The Los Angeles Dodgers won the World Series in 2020. " ) ,
ChatMessage ( role : . user , content : " Where was it played? " )
]
let chatParameters = ChatParameters (
model : . gpt4 , // ID of the model to use.
messages : chat // A list of messages comprising the conversation so far.
)
let chatCompletion = try await openAI . generateChatCompletion (
parameters : chatParameters
)
if let message = chatCompletion . choices [ 0 ] . message {
let content = message . content
}
} catch {
// Insert your own error handling method here.
} ChatResponse(
id: "chatcmpl-88eG5VruffcNHPNVGBKGVAV5HGk4j",
object: OpenAIKit.OpenAIObject.chatCompletion,
created: 1697072069,
choices: [
OpenAIKit.ChatChoice(
message: Optional(
OpenAIKit.ChatMessage(
id: "250FDA2D-2F38-4E6F-B97E-DAD74FED1FB6",
role: OpenAIKit.ChatRole.assistant,
content: Optional(
"The 2020 World Series was played at Globe Life Field in Arlington, Texas."
),
functionCall: nil
)
),
delta: nil,
index: 0,
logprobs: nil,
finishReason: Optional("stop")
)
],
usage: Optional(
OpenAIKit.Usage(
promptTokens: 53,
completionTokens: 17,
totalTokens: 70
)
)
)
开发人员还能够使用功能调用来执行各种功能(即获取天气信息,上传文件等)。这是有关如何使用参数,相应响应以及具有本地函数的示例用法的示例。
do {
let functions : [ Function ] = [
Function (
name : " getCurrentWeather " ,
description : " Get the current weather in a given location " ,
parameters : Parameters (
type : " object " ,
properties : [
" location " : ParameterDetail (
type : " string " ,
description : " The city and state, e.g. San Francisco, CA "
) ,
" unit " : ParameterDetail (
type : " string " , enumValues : [ " fahrenheit " , " celsius " ]
)
] ,
required : [ " location " ]
)
)
]
let messages : [ ChatMessage ] = [
ChatMessage ( role : . user , content : " What's the weather like in Boston? " )
]
let chatParameters = ChatParameters (
model : . gpt4 , // ID of the model to use.
messages : messages , // A list of messages comprising the conversation so far.
functionCall : " auto " , // Controls how the model calls functions.
functions : functions // A list of functions the model may generate JSON inputs for.
)
let chatCompletion = try await openAI . generateChatCompletion (
parameters : chatParameters
)
} catch {
// Insert your own error handling method here.
} ChatResponse(
id: "chatcmpl-88eVjsHEPtDDiSEuCexsqO8iuhnfG",
object: OpenAIKit.OpenAIObject.chatCompletion,
created: 1697073039,
choices: [
OpenAIKit.ChatChoice(
message: Optional(
OpenAIKit.ChatMessage(
id: "DCE5EECB-9521-481D-9E75-C7FF9390E4CF",
role: OpenAIKit.ChatRole.assistant,
content: nil,
functionCall: Optional(
OpenAIKit.FunctionCall(
arguments: "{n"location": "Boston, MA"n}",
name: "getCurrentWeather"
)
)
)
),
delta: nil,
index: 0,
logprobs: nil,
finishReason: Optional("function_call")
)
],
usage: Optional(OpenAIKit.Usage(promptTokens: 81, completionTokens: 16, totalTokens: 97))
)
func getCurrentWeather ( location : String , unit : TemperatureUnit = . fahrenheit ) -> WeatherInfo {
return WeatherInfo ( location : location , temperature : " 72 " , unit : unit , forecast : [ " sunny " , " windy " ] )
}
if let message = chatCompletion . choices [ 0 ] . message , let functionCall = message . functionCall {
let jsonString = functionCall . arguments
if let data = jsonString . data ( using : . utf8 ) {
do {
if
let json = try JSONSerialization . jsonObject ( with : data , options : [ ] ) as? [ String : Any ] ,
let location = json [ " location " ] as? String
{
self . weatherInfo = self . getCurrentWeather ( location : location )
}
} catch {
// Insert your own error handling method here.
}
}
} - generateChatCompletionStreaming允许开发人员从端点流式聊天完成数据。这是有关如何使用端点以及相关输出的一个示例:
do {
let chat : [ ChatMessage ] = [
ChatMessage ( role : . system , content : " You are a helpful assistant. " ) ,
ChatMessage ( role : . user , content : " Who won the world series in 2020? " ) ,
ChatMessage ( role : . assistant , content : " The Los Angeles Dodgers won the World Series in 2020. " ) ,
ChatMessage ( role : . user , content : " Where was it played? " )
]
let chatParameters = ChatParameters ( model : . chatGPTTurbo , messages : chat )
let stream = try openAI . generateChatCompletionStreaming (
parameters : chatParameters
)
} catch {
// Insert your own error handling method here.
} ChatResponse(
id: "chatcmpl-88enklY0vmc4fNkM1mJQCkzW6hcST",
object: OpenAIKit.OpenAIObject.chatCompletionChunk,
created: 1697074156,
choices: [
OpenAIKit.ChatChoice(
message: nil,
delta: Optional(
OpenAIKit.ChatDelta(
role: Optional(OpenAIKit.ChatRole.assistant),
content: Optional("")
)
),
index: 0,
logprobs: nil,
finishReason: nil
)
],
usage: nil
)
ChatResponse(
id: "chatcmpl-88enklY0vmc4fNkM1mJQCkzW6hcST",
object: OpenAIKit.OpenAIObject.chatCompletionChunk,
created: 1697074156,
choices: [
OpenAIKit.ChatChoice(
message: nil,
delta: Optional(
OpenAIKit.ChatDelta(
role: nil,
content: Optional("The")
)
),
index: 0,
logprobs: nil,
finishReason: nil
)
],
usage: nil
)
// ...
ChatResponse(
id: "chatcmpl-88enklY0vmc4fNkM1mJQCkzW6hcST",
object: OpenAIKit.OpenAIObject.chatCompletionChunk,
created: 1697074156,
choices: [
OpenAIKit.ChatChoice(
message: nil,
delta: Optional(
OpenAIKit.ChatDelta(
role: nil,
content: Optional(".")
)
),
index: 0,
logprobs: nil,
finishReason: nil
)
],
usage: nil
)
ChatResponse(
id: "chatcmpl-88enklY0vmc4fNkM1mJQCkzW6hcST",
object: OpenAIKit.OpenAIObject.chatCompletionChunk,
created: 1697074156,
choices: [
OpenAIKit.ChatChoice(
message: nil,
delta: Optional(
OpenAIKit.ChatDelta(
role: nil,
content: nil
)
),
index: 0,
logprobs: nil,
finishReason: Optional("stop")
)
],
usage: nil
)
Whisper是Openai的语音到文本AI模型,旨在精确转录口语内容。通过将音频转换为文本,它为开发人员提供了一个简单的工具,用于诸如转录服务,语音命令,人声语言翻译或音频索引之类的任务。实施耳语可以帮助简化流程,使应用程序更容易访问并有效利用语音数据。
有两个主要端点使用窃窃私语模型: - createTranscription是允许开发人员将语音音频转录为文本的主要端点。这是有关如何使用端点的一个示例,以及相应的返回项目:
do {
let audioParameters = TranscriptionParameters ( file : audio )
let transcriptionCompletion = try await openAI . createTranscription ( parameters : audioParameters )
} catch {
// Insert your own error handling method here.
} Arousing from the most profound of slumbers, we break the gossamer web of some dream. Yet in a second afterward, so frail may that web have been, we remember not that we have dreamed. In the return to life
from the swoon there are two stages, first, that of the sense of mental or spiritual, secondly, that of the sense of physical existence. It seems probable that if, upon reaching the second stage, we could
recall the impressions of the first, we should find these impressions eloquent in memories of the gulf beyond. And that gulf is what? How at least shall we distinguish its shadows from those of the tomb?
- createTranslation是第二个端点,它允许开发人员将任何非英语音频转换为抄录的英文文本。这是有关如何使用端点的一个示例,以及相应的返回项目:
do {
let audioParameters = TranscriptionParameters ( file : audio )
let transcriptionCompletion = try await openAI . createTranslation ( parameters : audioParameters )
} catch {
// Insert your own error handling method here.
} In the night, when I was out of my mind, and I, pained, numb and tired, thought about the beauty and goodness of a long-forgotten lesson, and my head began to shake, I suddenly heard something tick that scared
me out of my sleep. Who could it be in that weather? A visitor is knocking, I thought, at my room in that weather. That's all it is, and nothing more.
嵌入使用OpenAI的GPT模型来生成文本密集的向量表示。这些嵌入式捕获语义信息,使开发人员能够在特定任务上执行相似性搜索,聚类或微调等任务。通过将GPT嵌入到应用程序中,开发人员可以增强文本分析和检索功能,从而导致更有效的数据处理和见解。
这是有关如何使用它的示例,以及端点的预期输出:
do {
let embeddingsParam = EmbeddingsParameters ( model : " text-similarity-ada-002 " , input : input )
self . embeddingsResponse = try await openAI . createEmbeddings ( parameters : embeddingsParam )
} catch {
// Insert your own error handling method here.
} OpenAIKit.EmbeddingsResponse(
object: OpenAIKit.OpenAIObject.list,
data: [
OpenAIKit.EmbeddingsData(
object: OpenAIKit.OpenAIObject.embedding,
embedding: [
0.0028667077,
0.018867997,
-0.030135695,
// ...
-0.004177677,
-0.015615467,
-0.008131327
],
index: 0
)
],
model: "text-similarity-ada:002",
usage: OpenAIKit.EmbeddingsUsage(
promptTokens: 8,
totalTokens: 8
)
)
模型端点允许开发人员以及自己的微调型号从OpenAI获取当前可用的模型。
此功能有两个可用的端点:
listModels将Avaialbe的整个模型列表提供给开发人员。这是一个示例用法,以及相应的输出: do {
let modelsResponse = try await openAi . listModels ( )
} catch {
// Insert your own error handling method here.
} ListModelResponse(
object: OpenAIKit.OpenAIObject.list,
data: [
OpenAIKit.Model(
id: "text-search-babbage-doc-001",
object: OpenAIKit.OpenAIObject.model,
created: 1651172509,
ownedBy: "openai-dev"
),
OpenAIKit.Model(
id: "curie-search-query",
object: OpenAIKit.OpenAIObject.model,
created: 1651172509,
ownedBy: "openai-dev"
),
OpenAIKit.Model(
id: "text-search-babbage-query-001",
object: OpenAIKit.OpenAIObject.model,
created: 1651172509,
ownedBy: "openai-dev"
),
OpenAIKit.Model(
id: "babbage",
object: OpenAIKit.OpenAIObject.model,
created: 1649358449,
ownedBy: "openai"
),
OpenAIKit.Model(
id: "gpt-3.5-turbo-instruct-0914",
object: OpenAIKit.OpenAIObject.model,
created: 1694122472,
ownedBy: "system"
)
// ...
]
)
retrieveModels摘要获取单个模型。这是一个示例用法,以及相应的输出: do {
let model = try await openAI . retrieveModel ( modelId : " text-davinci-001 " )
} catch {
// Insert your own error handling method here.
} OpenAIKit.Model(
id: "text-davinci-001",
object: OpenAIKit.OpenAIObject.model,
created: 1649364042,
ownedBy: "openai"
)
截至2023年7月6日,OpenAI宣布了完善API中旧型号的贬值,该模型定于2024年初退休。强烈建议过渡到聊天完成API,该API提供了更具结构化的及时及时插入界面和多转向对话功能。事实证明,聊天完成API可以处理以前的绝大多数用例和具有更高灵活性和特异性的新对话需求,从而显着增强了开发人员的体验。有关更多详细信息,请参阅官方公告。
截至2.x,聊天完成模型使用枚举为默认模型的主要用法标记每个可用模型。这是一个示例,说明如何从使用较旧的初始化器将ChatParameter迁移到2.x的初始化器:
// 1.x implementation
let chatParameters = ChatParameters ( model : " gpt4 " , messages : chat )
// ✅ 2.x implementation
let chatParameters = ChatParameters ( model : . gpt4 , messages : chat )如果您需要用于微调型号的自定义字符串,请使用customModel参数:
// ✅ 2.x implementation for custom model IDs
let chatParameters = ChatParameters ( customModel : " INSERT-MODEL-ID " , message : chat ) (TBD)
我们欢迎任何人在使用OpenAikit时遇到任何错误 /故障,通过发布问题为该项目做出贡献;还可以创建拉动问题,从而为Openaikit添加任何其他功能。
OpenAikit是根据MIT许可发布的,任何使用OpenAI的剩余端点的使用都将根据他们制定的使用政策。
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.