以一种简单优雅的方式与 Anthropic 和 Anthropic 兼容的聊天完成 API 进行交互。
LLMChatAnthropic
是一个简单而强大的 Swift 包,它优雅地封装了与 Anthropic 和 Anthropic 兼容的聊天完成 API 交互的复杂性。 它提供了一套完整的 Swift 风格的方法,用于发送聊天完成请求和流式传输响应。
您可以使用 Swift Package Manager 将 LLMChatAnthropic
添加为项目的依赖项,方法是将其添加到 Package.swift
的 dependencies 值中。
dependencies: [
.package(url: "https://github.com/kevinhermawan/swift-llm-chat-anthropic.git", .upToNextMajor(from: "1.0.0"))
],
targets: [
.target(
/// ...
dependencies: [.product(name: "LLMChatAnthropic", package: "swift-llm-chat-anthropic")])
]
或者,在 Xcode 中
File
-> Swift Packages
-> Add Package Dependency...
https://github.com/kevinhermawan/swift-llm-chat-anthropic.git
Add Package
。您可以在这里找到文档:https://kevinhermawan.github.io/swift-llm-chat-anthropic/documentation/llmchatanthropic
import LLMChatAnthropic
// Basic initialization
let chat = LLMChatAnthropic(apiKey: "<YOUR_ANTHROPIC_API_KEY>")
// Initialize with custom endpoint and headers
let chat = LLMChatAnthropic(
apiKey: "<YOUR_API_KEY>",
endpoint: URL(string: "https://custom-api.example.com/v1/messages")!,
headers: ["Custom-Header": "Value"]
)
let messages = [
ChatMessage(role: .system, content: "You are a helpful assistant."),
ChatMessage(role: .user, content: "What is the capital of Indonesia?")
]
let task = Task {
do {
let completion = try await chat.send(model: "claude-3-5-sonnet", messages: messages)
print(completion.content.first?.text ?? "No response")
} catch {
print(String(describing: error))
}
}
// To cancel completion
task.cancel()
let messages = [
ChatMessage(role: .system, content: "You are a helpful assistant."),
ChatMessage(role: .user, content: "What is the capital of Indonesia?")
]
let task = Task {
do {
for try await chunk in chat.stream(model: "claude-3-5-sonnet", messages: messages) {
if let text = chunk.delta?.text {
print(text, terminator: "")
}
}
} catch {
print(String(describing: error))
}
}
// To cancel completion
task.cancel()
let messages = [
ChatMessage(
role: .user,
content: [
.image("https://images.pexels.com/photos/45201/kitty-cat-kitten-pet-45201.jpeg"), // Also supports base64 strings
.text("What is in this image?")
]
)
]
Task {
do {
let completion = try await chat.send(model: "claude-3-5-sonnet", messages: messages)
print(completion.content.first?.text ?? "")
} catch {
print(String(describing: error))
}
}
要了解有关视觉的更多信息,请查看 Anthropic 文档。
let messages = [
ChatMessage(role: .user, content: "Recommend a book similar to '1984'")
]
let recommendBookTool = ChatOptions.Tool(
name: "recommend_book",
description: "Recommend a book based on a given book and genre",
parameters: .object(
properties: [
"reference_book": .string(description: "The name of a book the user likes"),
"genre": .enum(
description: "The preferred genre for the book recommendation",
values: [.string("fiction"), .string("non-fiction")]
)
],
required: ["reference_book", "genre"],
additionalProperties: .boolean(false)
)
)
let options = ChatOptions(tools: [recommendBookTool])
Task {
do {
let completion = try await chat.send(model: "claude-3-5-sonnet", messages: messages, options: options)
if let toolInput = completion.content.first(where: { $0.type == "tool_use" })?.toolInput {
print(toolInput)
}
} catch {
print(String(describing: error))
}
}
要了解有关工具使用的更多信息,请查看 Anthropic 文档。
let chat = LLMChatAnthropic(
apiKey: "<YOUR_ANTHROPIC_API_KEY>",
headers: ["anthropic-beta": "prompt-caching-2024-07-31"] // Required
)
let messages = [
ChatMessage(role: .system, content: "<YOUR_LONG_PROMPT>", cacheControl: .init(type: .ephemeral)),
ChatMessage(role: .user, content: "What is the capital of Indonesia?")
]
let task = Task {
do {
let completion = try await chat.send(model: "claude-3-5-sonnet", messages: messages)
print(completion.content.first?.text ?? "No response")
} catch {
print(String(describing: error))
}
}
要了解有关提示缓存的更多信息,请查看 Anthropic 文档。
let chat = LLMChatAnthropic(
apiKey: "<YOUR_ANTHROPIC_API_KEY>",
headers: ["anthropic-beta": "pdfs-2024-09-25"] // Required
)
let messages = [
ChatMessage(role: .user, content: [.text("Explain this document"), .document(document)])
]
let task = Task {
do {
let completion = try await chat.send(model: "claude-3-5-sonnet", messages: messages)
print(completion.content.first?.text ?? "No response")
} catch {
print(String(describing: error))
}
}
要了解有关 PDF 支持的更多信息,请查看 Anthropic 文档。
LLMChatAnthropic
通过 LLMChatAnthropicError
枚举提供结构化的错误处理。 此枚举包含三种情况,代表您可能遇到的不同类型的错误
let messages = [
ChatMessage(role: .system, content: "You are a helpful assistant."),
ChatMessage(role: .user, content: "What is the capital of Indonesia?")
]
do {
let completion = try await chat.send(model: "claude-3-5-sonnet", messages: messages)
print(completion.content.first?.text ?? "No response")
} catch let error as LLMChatAnthropicError {
switch error {
case .serverError(let statusCode, let message):
// Handle server-side errors (e.g., invalid API key, rate limits)
print("Server Error [\(statusCode)]: \(message)")
case .networkError(let error):
// Handle network-related errors (e.g., no internet connection)
print("Network Error: \(error.localizedDescription)")
case .decodingError(let error):
// Handle errors that occur when the response cannot be decoded
print("Decoding Error: \(error.localizedDescription)")
case .streamError:
// Handle errors that occur when streaming responses
print("Stream Error")
case .cancelled:
// Handle requests that are cancelled
print("Request was cancelled")
}
} catch {
// Handle any other errors
print("An unexpected error occurred: \(error)")
}
如果您觉得 LLMChatAnthropic
有用并希望支持其开发,请考虑捐款。 您的贡献有助于维护项目和开发新功能。
非常感谢您的支持!❤️
欢迎贡献! 如果您有任何建议或改进,请打开一个问题或提交一个拉取请求。
本仓库根据 Apache License 2.0 许可发布。