GPTSwift

GitHub

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 目标使您可以访问 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 的文档

GPT

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

最后,您可以通过 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 提示

有时,查看生成的请求可能会很有用,因此上面介绍的所有三个类都带有从请求生成可用 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 和所有贡献者

特此授予任何人免费获取本软件及相关文档文件(“软件”)副本的许可,以处理本软件,不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向为其提供软件的人员提供软件,但须符合以下条件

上述版权声明和本许可声明应包含在所有副本或软件的实质部分中。

本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。 在任何情况下,作者或版权持有者均不对任何索赔、损害或其他责任负责,无论是在合同、侵权行为或其他方面,因本软件或本软件的使用或其他处理而产生、产生或与之相关的责任。