GPTSwift 是一个轻量且方便的 OpenAI API 封装。它完全使用 Swift 编写。
使用 GPTSwift 很简单
import ChatGPT
let chatGPT = ChatGPT(apiKey: "YOUR_API_KEY", defaultModel: .gpt3)
let answer = try await chatGPT.ask("What is the answer to life, the universe and everything in it?")
// Stream the answer token by token
var streamedAnswer = ""
for try await nextWord in try await chatGPT.streamedAnswer.ask("Tell me a story about birds") {
streamedAnswer += nextWord
}
可以在这里找到示例项目:GPTPlayground
GPTSwift 支持 iOS 15+、macOS 12+、watchOS 8+ 和 tvOS 15+。
该软件包通过 Swift Package Manager 安装。只需将以下行添加到您的 Package.swift
依赖项中
.package(url: "https://github.com/SwiftedMind/GPTSwift", from: "3.0.0")
或者,如果您想将软件包添加到 Xcode 项目,请转到 File
> Add Packages...
并在顶部的搜索字段中输入 URL "https://github.com/SwiftedMind/GPTSwift"。 GPTSwift 应该会出现在列表中。选择它,然后单击右下角的“Add Package”。
GPTSwift 只是 API 的一个轻量级封装,它抽象掉了调用端点以及处理请求和响应的所有不必要的细节。
ChatGPT
目标使您可以访问 ChatGPT API(包括 GPT4 模型)。
使用 ChatGPT
的最简单方法是简单地通过 ask(_:)
和 ask(messages:)
方法传入提示字符串或聊天消息数组。 这些方法负责将参数转换为请求,并解析响应。 你得到的只是一个简单的字符串形式的答案,这通常就是所需要的。
import ChatGPT
func askChatGPT() async throws {
let chatGPT = ChatGPT(apiKey: "YOUR_API_KEY", defaultModel: .gpt3)
// Basic query
let firstResponse = try await chatGPT.ask("What is the answer to life, the universe and everything in it?")
print(firstResponse)
// Send multiple messages
let secondResponse = try await chatGPT.ask(
messages: [
ChatMessage(role: .system, content: "You are a dog."),
ChatMessage(role: .user, content: "Do you actually like playing fetch?")
],
model: .gpt3.stableVersion() // Override default model, if needed
)
print(secondResponse)
}
但是,如果您需要完全控制,您还可以将 ChatRequest
传递给 ask(request:)
方法。 这样,您可以调整所有参数并访问完整的响应对象,同时一切仍然是完全类型安全的。
import ChatGPT
func askChatGPT() async throws {
let chatGPT = ChatGPT(apiKey: "YOUR_API_KEY", defaultModel: .gpt3)
let fullRequest = ChatRequest.gpt3 { request in
request.messages = [
.init(role: .system, content: "You are the pilot of an alien UFO. Be creative."),
.init(role: .user, content: "Where do you come from?")
]
request.temperature = 0.8
request.numberOfAnswers = 2
}
let response = try await chatGPT.ask(request: fullRequest)
print(response.choices.map(\.message))
}
最后,上述所有方法都有一个变体,可以让您逐个令牌地流式传输 GPT 的答案,就像它们生成时一样。 该流通过 AsyncThrowingStream
提供。 您所要做的就是在调用 ask()
之前添加 streamedAnswer
。 例如
import ChatGPT
// In your view model
@Published var gptAnswer = ""
func askChatGPT() async throws {
let chatGPT = ChatGPT(apiKey: "YOUR_API_KEY")
gptAnswer = ""
for try await nextWord in try await chatGPT.streamedAnswer.ask("Tell me a funny story about birds") {
gptAnswer += nextWord
}
}
有关 ChatGPT API 的更多信息,您可以查看 OpenAI 的文档
与 ChatGPT
一样,GPT
是 completion API 的封装。 有一个基本的 complete(_:)
方法方便使用,以及一个 complete(request:)
方法,让你可以完全控制。
import GPT
func askGPT() async throws {
let gpt = GPT(apiKey: "YOUR_API_KEY", defaultModel: .davinci)
let response = try await gpt.complete("What is the answer to life, the universe and everything in it?")
print(response)
}
import GPT
func askGPT() async throws {
let gpt = GPT(apiKey: "YOUR_API_KEY", defaultModel: .davinci)
let fullRequest = CompletionRequest.davinci(prompt: "Why is the sky blue?") { request in
request.temperature = 0.8
request.numberOfAnswers = 2
}
let response = try await gpt.complete(request: fullRequest)
print(response.choices.map(\.text))
}
此外,就像 ChatGPT
一样,GPT
也支持流式传输答案
import GPT
// In your view model
@Published var gptAnswer = ""
func askGPT() async throws {
let gpt = GPT(apiKey: "YOUR_API_KEY")
gptAnswer = ""
for try await nextWord in try await gpt.streamedAnswer.complete("Tell me a funny story about birds") {
gptAnswer += nextWord
}
}
最后,您可以通过 OpenAI
类访问可用的模型。
import OpenAI
func openAI() async throws {
let openAI = OpenAI(apiKey: "YOUR_API_KEY")
let models = try await openAI.availableModels()
let model = try await openAI.model(withId: "gpt-3.5-turbo")
}
有时,查看生成的请求可能会很有用,因此上面介绍的所有三个类都带有从请求生成可用 cURL
提示的方法,您可以简单地将其粘贴到终端中。 例如
import ChatGPT
func askChatGPT() async throws {
let chatGPT = ChatGPT(apiKey: "YOUR_API_KEY", defaultModel: .gpt3)
let request = ChatRequest.gpt3 { request in
request.messages = [
.init(role: .system, content: "You are the pilot of an alien UFO. Be creative."),
.init(role: .user, content: "Where do you come from?")
]
request.numberOfAnswers = 2
}
try await print(chatGPT.curl(for: request))
}
这会生成以下内容
curl --request POST \
--url 'https://api.openai.com/v1/chat/completions' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--data '{"messages":[{"content":"You are the pilot of an alien UFO. Be creative.","role":"system"},{"content":"Where do you come from?","role":"user"}],"model":"gpt-3.5-turbo","n":2,"stream":false}' | json_pp
MIT 许可证
版权所有 (c) 2023 Dennis Müller 和所有贡献者
特此授予任何人免费获取本软件及相关文档文件(“软件”)副本的许可,以处理本软件,不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向为其提供软件的人员提供软件,但须符合以下条件
上述版权声明和本许可声明应包含在所有副本或软件的实质部分中。
本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。 在任何情况下,作者或版权持有者均不对任何索赔、损害或其他责任负责,无论是在合同、侵权行为或其他方面,因本软件或本软件的使用或其他处理而产生、产生或与之相关的责任。