OpenAI API를위한 지역 사회에서 신속한 SDK.
보고 버그 · 요청 기능
Openaikit은 Swift 개발자에게 OpenAi REST 엔드 포인트와 상호 작용할 수있는 원활하고 효율적이며 신속한 방법을 제공하도록 설계된 커뮤니티 중심의 Swift SDK입니다. 우리의 목표는 Swift 개발자의 장벽을 낮추어 OpenAI의 힘을 편안한 서비스의 복잡성에 깊이 파고 들지 않고 앱에 앱에 통합 할 수 있도록하는 것입니다.
최신 응용 프로그램에서 AI 기반 기능에 대한 수요가 증가함에 따라 개발자가 통합 프로세스를 단순화하는 도구에 액세스하는 것이 중요합니다. OpenAI는 놀라운 기능을 제공하지만 언어의 관용 관행과 Swift 개발자 커뮤니티의 기대와 일치하는 전용 Swift SDK가 분명히 필요했습니다.
OpenAI 기능에 대한 원시 액세스를 제공 할뿐만 아니라 명확하고 직관적 인 API로 개발자 경험을 향상시키는 도구를 구상했습니다. 우리의 궁극적 인 목표는 Swift 커뮤니티에 AI 기능을 응용 프로그램에 쉽게 통합 할 수있는 올바른 도구를 제공함으로써 혁신을 육성하는 것입니다.
플랫폼 | 최소 신속한 버전 | 설치 | 상태 |
---|---|---|---|
iOS 13.0+ / MacOS 10.15+ / TVOS 13.0+ / WATKOS 6.0+ / VORVEOS 1.0+ | 5.7 | 스위프트 패키지 관리자 | 완전히 테스트되었습니다 |
Swift 패키지 관리자를 사용하면 개발자가 패키지를 Xcode 프로젝트 및 패키지에 쉽게 통합 할 수 있습니다. 또한 swift
컴파일러에 완전히 통합되어 있습니다.
https://github.com/OpenDive/OpenAIKit.git
을 추가하십시오 신속한 패키지를 설정 한 후에는 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 키를 환경 변수에 저장하고 코드에 액세스하십시오. 이렇게하면 응용 프로그램에 하드 코딩되지 않으며 안전하게 관리 할 수 있습니다.
- 비밀 관리 : 안전한 비밀 관리 도구 또는 서비스를 사용하여 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가 제공하는 세 가지 엔드 포인트가 있습니다. - 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는 끝점을 총 세 가지 별도의 기능으로 두 가지 함수로 나눕니다. 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
사용하면 개발자가 엔드 포인트에서 채팅 완료 데이터를 스트리밍 할 수 있습니다. 다음은 상관 관계 출력과 함께 엔드 포인트 사용 방법에 대한 예입니다.
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를 구현하면 프로세스를 간소화하고 응용 프로그램에 더 액세스 할 수있게하며 음성 데이터를 효율적으로 활용할 수 있습니다.
Whisper 모델을 사용하는 두 가지 주요 엔드 포인트가 있습니다 .- 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
입력 모델의 ID가 주어지면 단일 모델을 가져옵니다. 다음은 해당 출력과 함께 예제 사용입니다. 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의 이니셜 라이저로 마이그레이션하는 방법에 대한 예입니다.
// 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.