

Openai API用のコミュニティに維持されたSwift SDK。
報告バグ・リクエスト機能
Openaikitは、Swift開発者にOpenai Rest Endpointと対話するシームレスで効率的で迅速な方法を提供するように設計されたコミュニティ主導のSwift SDKです。私たちの目的は、Swift開発者の障壁を下げ、Restfulサービスの複雑さを深く掘り下げることなく、Openaiの力をアプリに統合できるようにすることです。
最新のアプリケーションでAIを搭載した機能に対する需要の増加に伴い、開発者が統合プロセスを簡素化するツールにアクセスすることが重要です。 Openaiは信じられないほどの能力を提供していますが、言語の慣用的な慣行とSwift開発者コミュニティの期待に合わせた専用のSwift SDKが明確に必要でした。
OpenAI機能への生のアクセスを提供するだけでなく、明確で直感的なAPIで開発者エクスペリエンスを強化するツールを想定しました。私たちの究極の目標は、AI機能をアプリケーションに簡単に統合するための適切なツールをSwiftコミュニティに提供することにより、イノベーションを促進することです。
| プラットフォーム | 最小スイフトバージョン | インストール | 状態 |
|---|---|---|---|
| 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パッケージをセットアップしたら、 Package.swiftファイルのdependencies値内にgitリンクを追加します。
dependencies: [
. package ( url : " https://github.com/OpenDive/OpenAIKit.git " , . upToNextMajor ( from : " 2.0.1 " ) )
] APIキーを取得するには、アカウントページのAPI Keysページに移動してください。

ショ和 ?重要:Openai APIキーをコードに直接保存しないでください! ?ショ和 OpenAIのAPIを使用する場合、セキュリティ上の理由でAPIキーをアプリケーションのコードベースに直接埋め込まないことが不可欠です。ソースコードに直接キーを埋め込むと、不正なユーザーや悪意のあるアクターにさらされ、潜在的な誤用につながる可能性があります。
ベストプラクティス:
- 環境変数: APIキーを環境変数に保存し、コードにアクセスします。このようにして、それらはあなたのアプリケーションにハードコーディングされておらず、安全に管理することができます。
- 秘密管理: Secure Secrets Management Toolまたはサービスを使用して、APIキーを保存および取得します。 AWS Secrets Manager、Hashicorp Vault、Firebase、CloudKit、またはAzure Key Vaultなどのツールは、機密データを保存、管理、取得するように設計されています。これにより、ユーザーはキーへのデバイス上のアクセスを持っていません。
- .Gitignore: APIキーを構成ファイルに保存する場合は、このファイルが
.gitignoreまたは同様のメカニズムに誤ってソース制御システムにコミットされないようにしていることを常に確認してください。- 定期的にキーを回転させる: APIキーを定期的に回転させて、漏れの潜在的な影響を軽減します。
セキュリティが最も重要であることを忘れないでください。 APIキーなどの機密情報の安全な取り扱いを常に優先順位を付けてください!
詳細については、Swift開発者向けのAPIキー管理に関するこの記事をご覧ください。
Dall-e 2(そしてすぐに来る、Dall-E 3)を使用して、AI駆動の画像生成の次の進化に飛び込み、Openaiによってもたらされました。前任者の遺産に基づいて、Dall-E 2は、テキストプロンプトから複雑なビジュアルを実現するための強化された機能を提供し、言語と画像の間にシームレスなブリッジを作成します。開発者は、この画期的なテクノロジーを活用して、ユーザーエクスペリエンスを豊かにし、動的なコンテンツを作成し、創造性の新しい道を刺激することができます。 Dall-E 2の最先端のパワーを統合することにより、アプリケーションとプロジェクトに革命をもたらします。
Dall -E 2と対話するためにOpenaiが提供する3 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.
} ![]() | ![]() |
|---|---|
| オリジナル | 変化 |
OpenaiのGPT-4アーキテクチャに基づいて構築されたChatGptは、最先端の会話型AIモデルです。開発者に、高度な自然言語処理機能をアプリケーションに統合するための堅牢なツールを提供します。 ChATGPTを使用すると、ユーザーのインタラクションを強化し、効率を向上させ、さまざまなユースケースでAI駆動型ソリューションを提供できます。具体的な結果を得るために、GPT-4の強さをプロジェクトに組み込みます。
この機能には単一のエンドポイントがありますが、このSDKはエンドポイントを2つの機能に分割し、合計3つの個別の機能を備えています。 generateChatCompletionにより、開発者はOpenAIの提供されたモデルを使用してチャット完了を生成できます。または、開発者が所有する細かい調整モデル。エンドポイントの使用方法と相関出力の例を次に示します。
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使用すると、DevelopRはエンドポイントからチャット完了データをストリーミングできます。エンドポイントの使用方法と相関出力の例を次に示します。
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モデルであり、音声コンテンツの正確な転写のために設計されています。オーディオをテキストに変換することにより、開発者に転写サービス、音声コマンド、ボーカル言語翻訳、オーディオインデックスなどのタスクの簡単なツールを提供します。ウィスパーの実装は、プロセスを合理化し、アプリケーションをよりアクセスしやすくし、音声データを効率的に活用するのに役立ちます。
Whisperモデルを使用する2つの主要なエンドポイントがあります。 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 、開発者が英語以外のオーディオを転写された英語のテキストに翻訳できる2番目のエンドポイントです。エンドポイントの使用方法と、対応する返されたアイテムの例を次に示します。
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から現在利用可能なモデルを取得できます。
この機能で使用できる2つのエンドポイントがあります。
listModels 、モデルのリスト全体を開発者に取得します。対応する出力とともに、使用の例を次に示します。 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は、2024年の初めに退職する予定の完了APIにおける古いモデルの廃止を発表しました。より構造化されたプロンプトインターフェイスとマルチターン会話機能を提供するチャット完了APIに移行することを強くお勧めします。チャット完了APIは、以前のユースケースと新しい会話ニーズの大部分を柔軟性と特異性を高め、開発者エクスペリエンスを大幅に向上させることが証明されています。詳細については、公式発表を参照してください。
2.xの時点で、チャット完了モデルを使用して、デフォルトモデルの主な使用法に対して利用可能な各モデルにラベルを付けます。 ChatParameterの古い初期剤の使用から2.xのInitializerに移行する方法の例を次に示します。
// 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のRESTエンドポイントの使用は、それらが設定した使用ポリシーの下にあります。
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.