A community-driven Swift SDK for the Google Generative Language API (Gemini). Google does not provide an official Swift SDK -- this package fills that gap.
Auto-generated from Google's OpenAPI spec using Swift OpenAPI Generator, so every endpoint and type stays in sync with the upstream API.
- Full coverage of the Generative Language API v1beta (79 endpoints)
- Text generation and streaming responses (SSE)
- Multimodal inputs -- text, images, audio, video, files
- Function calling / tool use
- Embeddings (single and batch)
- File uploads with resumable protocol
- Cached content for cost optimization
- Semantic search via corpora, documents, and chunks
- Model fine-tuning
- Token counting
- Built with Swift concurrency (
async/await,Sendable)
- Swift 6.1+
- iOS 16.0+ / macOS 13.0+ / watchOS 9.0+ / tvOS 16.0+ / visionOS 1.0+
- Linux is also supported
Add the package to your Package.swift:
dependencies: [
.package(url: "https://github.com/atacan/GoogleGenerativeLanguage", from: "0.1.0"),
]Then add it to your target:
.target(
name: "YourTarget",
dependencies: [
.product(name: "GoogleGenerativeLanguage", package: "GoogleGenerativeLanguage"),
]
)import GoogleGenerativeLanguage
let client = try createClient(apiKey: "YOUR_API_KEY")let response = try await client.generateContent(
path: .init(model: "gemini-2.0-flash"),
body: .json(
.init(
contents: [
.init(
parts: [.TextPart(.init(text: "Explain quantum computing in one paragraph"))],
role: .user
)
],
model: "gemini-2.0-flash"
)
)
)
let text = try response.default.body.json.candidates?.first?
.content?.value1.parts?.first
// .TextPart contains the generated textlet response = try await client.streamGenerateContent(
path: .init(model: "gemini-2.0-flash"),
query: .init(_dollar_alt: .sse),
body: .json(
.init(
contents: [
.init(
parts: [.TextPart(.init(text: "Write a poem about Swift"))],
role: .user
)
],
model: "gemini-2.0-flash"
)
)
)
let stream = try response.default.body.textEventStream
.asDecodedServerSentEventsWithJSONData(of: Components.Schemas.GenerateContentResponse.self)
for try await event in stream {
if case .TextPart(let part) = event.data?.candidates?.first?.content?.value1.parts?.first {
print(part.text, terminator: "")
}
}let weatherFunction = Components.Schemas.FunctionDeclaration(
description: "Get the weather in a city",
name: "get_weather",
parameters: .init(
value1: .init(
properties: .init(
additionalProperties: [
"city": .init(
description: "The city to get weather for",
_type: .init(value1: .string)
)
]
),
required: ["city"],
_type: .init(value1: .object)
)
),
response: nil
)
let response = try await client.generateContent(
path: .init(model: "gemini-2.0-flash"),
body: .json(
.init(
contents: [
.init(
parts: [.TextPart(.init(text: "What's the weather in Tokyo?"))],
role: .user
)
],
model: "gemini-2.0-flash",
tools: [.init(functionDeclarations: [weatherFunction])]
)
)
)import Foundation
import OpenAPIRuntime
let fileData = try Data(contentsOf: URL(fileURLWithPath: "audio.mp3"))
let uri = try await uploadFileToGemini(
client: client,
fileData: HTTPBody(fileData),
mimeType: "audio/mpeg",
sizeBytes: fileData.count
)
// Use the uploaded file in a request
let response = try await client.generateContent(
path: .init(model: "gemini-2.0-flash"),
body: .json(
.init(
contents: [
.init(
parts: [
.FileDataPart(.init(fileData: .init(fileUri: uri))),
.TextPart(.init(text: "Describe this audio")),
],
role: .user
)
],
model: "gemini-2.0-flash"
)
)
)let response = try await client.generateContent(
path: .init(model: "gemini-2.0-flash"),
body: .json(
.init(
contents: [
.init(
parts: [.TextPart(.init(text: "What happened in the news today?"))],
role: .user
)
],
model: "gemini-2.0-flash",
tools: [.init(googleSearch: .init(value1: .init()))]
)
)
)The SDK is generated from Google's official Generative Language API OpenAPI specification. The generation pipeline:
- Fetches the latest OpenAPI spec from Google's Discovery Service
- Applies overlays and formatting
- Generates Swift client code using Swift OpenAPI Generator
This means the SDK is always a faithful representation of the API surface -- no hand-written wrappers that can drift out of date.
Get your API key from Google AI Studio.
MIT