Add an integration test in FirebaseAITestApp verifying streaming
responses using GeminiLanguageModel and FoundationModels on supported
platforms. Update the TestApp project to link FirebaseAILogic.
Enhance scripts/repo to support array options for --filter and
--exclude so multiple test targets can be passed to xcodebuild.
Update sdk.ai.yml to introduce a dedicated integration job running
on xcode-27 with GEMINI_LANGUAGE_MODEL: 1, exclude
GeminiLanguageModelTests from standard integration runs, and provide
human-readable display names for testapp-integration matrix jobs.
Implemented `GeminiLanguageModel`, providing an adapter for Google's
Gemini models conforming to Apple's `FoundationModels.LanguageModel`
protocol. This PR includes text to text generation capabilities; other
modalities and Gemini features will be handled in follow-up PRs.
**Note:** The `GeminiLanguageModel` implementation is guarded by the
environment variable `GEMINI_LANGUAGE_MODEL`. By default none of the
`GeminiLanguageModel` implementation is included.
Key additions:
- `GeminiLanguageModel`: Implements `LanguageModel` protocol with
reasoning capabilities, configuring execution via `ModelResource`
and `EndpointConfiguration`.
- `GeminiLanguageModelExecutor`: Converts prompt instructions and
history into Gemini streaming requests, yielding responses as
`LanguageModelSession.ResponseStream`.
- `GeminiTranscriptTranslator`: Translates Apple `Transcript` entries
and segments into Gemini `Content` structures while preserving thought
signatures and validating supported transcript features.
- `GeminiLanguageModel.Error` and `GeminiErrorMapper`: Translates Gemini
API, HTTP, and network errors into standard `LanguageModelError` cases
(`rateLimited`, `timeout`, `guardrailViolation`, `refusal`, and
`unsupportedLanguageOrLocale`) or `GeminiLanguageModel.Error` cases
(`serviceUnavailable`, `networkFailure`, `modelNotFound`, `apiError`).
The `APIError` payload is designed for seamless forward compatibility
with both GenerateContent and the upcoming Interactions API.
- Testing infrastructure: Adds `ConditionTrait.requireFoundationModels`
to conditionally run Foundation Models tests only on supported
platforms (macOS 27+, iOS 27+, watchOS 27+, visionOS 27+), along with
shared test constants, mock fixtures, and comprehensive unit and
integration test suites.
Introduces `AsyncSequence` support for `Query.snapshots` and `DocumentReference.snapshots`,
enabling developers to handle Firestore real-time updates using Swift's structured
concurrency.
- Provides a modern, async-await compatible alternative to `addSnapshotListener`.
- Supports both `Query` and `DocumentReference` snapshot streams.
- Automatically handles listener registration and cleanup on task cancellation.
- Configured with an unbounded buffering policy to ensure no snapshot events are lost.
This work follows similar patterns introduced for Firebase Auth and Remote Config,
bringing consistency to the developer experience across the Firebase Apple SDKs.
Related Projects:
- Firebase Auth AsyncSequence (#15362)
- Remote Config AsyncSequence (#15352)
Public API:
- `DocumentReference.snapshots(includeMetadataChanges:) -> DocumentSnapshotsSequence`
- `Query.snapshots(includeMetadataChanges:) -> QuerySnapshotsSequence`
Tested on iOS, macOS, tvOS, and watchOS.
Signed-off-by: Peter Friese <peter@peterfriese.dev>
Co-authored-by: Nick Cooke <36927374+ncooke3@users.noreply.github.com>