Skip to content

Commit ce8264f

Browse files
committed
Merge remote-tracking branch 'origin/main' into nc/recaptcha-1
2 parents 94a1f8d + ac8ea77 commit ce8264f

99 files changed

Lines changed: 521 additions & 1847 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/infra.health_metrics.yml

Lines changed: 0 additions & 366 deletions
This file was deleted.

Firebase.podspec

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'Firebase'
3-
s.version = '12.14.0'
3+
s.version = '12.15.0'
44
s.summary = 'Firebase'
55

66
s.description = <<-DESC
@@ -36,14 +36,14 @@ Simplify your app development, grow your user base, and monetize more effectivel
3636
ss.ios.deployment_target = '15.0'
3737
ss.osx.deployment_target = '10.15'
3838
ss.tvos.deployment_target = '15.0'
39-
ss.ios.dependency 'FirebaseAnalytics', '~> 12.14.0'
40-
ss.osx.dependency 'FirebaseAnalytics', '~> 12.14.0'
41-
ss.tvos.dependency 'FirebaseAnalytics', '~> 12.14.0'
39+
ss.ios.dependency 'FirebaseAnalytics', '~> 12.15.0'
40+
ss.osx.dependency 'FirebaseAnalytics', '~> 12.15.0'
41+
ss.tvos.dependency 'FirebaseAnalytics', '~> 12.15.0'
4242
ss.dependency 'Firebase/CoreOnly'
4343
end
4444

4545
s.subspec 'CoreOnly' do |ss|
46-
ss.dependency 'FirebaseCore', '~> 12.14.0'
46+
ss.dependency 'FirebaseCore', '~> 12.15.0'
4747
ss.source_files = 'CoreOnly/Sources/Firebase.h'
4848
ss.preserve_paths = 'CoreOnly/Sources/module.modulemap'
4949
if ENV['FIREBASE_POD_REPO_FOR_DEV_POD'] then
@@ -70,7 +70,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
7070

7171
s.subspec 'ABTesting' do |ss|
7272
ss.dependency 'Firebase/CoreOnly'
73-
ss.dependency 'FirebaseABTesting', '~> 12.14.0'
73+
ss.dependency 'FirebaseABTesting', '~> 12.15.0'
7474
# Standard platforms PLUS watchOS.
7575
ss.ios.deployment_target = '15.0'
7676
ss.osx.deployment_target = '10.15'
@@ -80,13 +80,13 @@ Simplify your app development, grow your user base, and monetize more effectivel
8080

8181
s.subspec 'AppDistribution' do |ss|
8282
ss.dependency 'Firebase/CoreOnly'
83-
ss.ios.dependency 'FirebaseAppDistribution', '~> 12.14.0-beta'
83+
ss.ios.dependency 'FirebaseAppDistribution', '~> 12.15.0-beta'
8484
ss.ios.deployment_target = '15.0'
8585
end
8686

8787
s.subspec 'AppCheck' do |ss|
8888
ss.dependency 'Firebase/CoreOnly'
89-
ss.dependency 'FirebaseAppCheck', '~> 12.14.0'
89+
ss.dependency 'FirebaseAppCheck', '~> 12.15.0'
9090
ss.ios.deployment_target = '15.0'
9191
ss.osx.deployment_target = '10.15'
9292
ss.tvos.deployment_target = '15.0'
@@ -95,7 +95,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
9595

9696
s.subspec 'Auth' do |ss|
9797
ss.dependency 'Firebase/CoreOnly'
98-
ss.dependency 'FirebaseAuth', '~> 12.14.0'
98+
ss.dependency 'FirebaseAuth', '~> 12.15.0'
9999
# Standard platforms PLUS watchOS.
100100
ss.ios.deployment_target = '15.0'
101101
ss.osx.deployment_target = '10.15'
@@ -105,7 +105,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
105105

106106
s.subspec 'Crashlytics' do |ss|
107107
ss.dependency 'Firebase/CoreOnly'
108-
ss.dependency 'FirebaseCrashlytics', '~> 12.14.0'
108+
ss.dependency 'FirebaseCrashlytics', '~> 12.15.0'
109109
# Standard platforms PLUS watchOS.
110110
ss.ios.deployment_target = '15.0'
111111
ss.osx.deployment_target = '10.15'
@@ -115,7 +115,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
115115

116116
s.subspec 'Database' do |ss|
117117
ss.dependency 'Firebase/CoreOnly'
118-
ss.dependency 'FirebaseDatabase', '~> 12.14.0'
118+
ss.dependency 'FirebaseDatabase', '~> 12.15.0'
119119
# Standard platforms PLUS watchOS 7.
120120
ss.ios.deployment_target = '15.0'
121121
ss.osx.deployment_target = '10.15'
@@ -125,15 +125,15 @@ Simplify your app development, grow your user base, and monetize more effectivel
125125

126126
s.subspec 'Firestore' do |ss|
127127
ss.dependency 'Firebase/CoreOnly'
128-
ss.dependency 'FirebaseFirestore', '~> 12.14.0'
128+
ss.dependency 'FirebaseFirestore', '~> 12.15.0'
129129
ss.ios.deployment_target = '15.0'
130130
ss.osx.deployment_target = '10.15'
131131
ss.tvos.deployment_target = '15.0'
132132
end
133133

134134
s.subspec 'Functions' do |ss|
135135
ss.dependency 'Firebase/CoreOnly'
136-
ss.dependency 'FirebaseFunctions', '~> 12.14.0'
136+
ss.dependency 'FirebaseFunctions', '~> 12.15.0'
137137
# Standard platforms PLUS watchOS.
138138
ss.ios.deployment_target = '15.0'
139139
ss.osx.deployment_target = '10.15'
@@ -143,20 +143,20 @@ Simplify your app development, grow your user base, and monetize more effectivel
143143

144144
s.subspec 'InAppMessaging' do |ss|
145145
ss.dependency 'Firebase/CoreOnly'
146-
ss.ios.dependency 'FirebaseInAppMessaging', '~> 12.14.0-beta'
147-
ss.tvos.dependency 'FirebaseInAppMessaging', '~> 12.14.0-beta'
146+
ss.ios.dependency 'FirebaseInAppMessaging', '~> 12.15.0-beta'
147+
ss.tvos.dependency 'FirebaseInAppMessaging', '~> 12.15.0-beta'
148148
ss.ios.deployment_target = '15.0'
149149
ss.tvos.deployment_target = '15.0'
150150
end
151151

152152
s.subspec 'Installations' do |ss|
153153
ss.dependency 'Firebase/CoreOnly'
154-
ss.dependency 'FirebaseInstallations', '~> 12.14.0'
154+
ss.dependency 'FirebaseInstallations', '~> 12.15.0'
155155
end
156156

157157
s.subspec 'Messaging' do |ss|
158158
ss.dependency 'Firebase/CoreOnly'
159-
ss.dependency 'FirebaseMessaging', '~> 12.14.0'
159+
ss.dependency 'FirebaseMessaging', '~> 12.15.0'
160160
# Standard platforms PLUS watchOS.
161161
ss.ios.deployment_target = '15.0'
162162
ss.osx.deployment_target = '10.15'
@@ -166,7 +166,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
166166

167167
s.subspec 'MLModelDownloader' do |ss|
168168
ss.dependency 'Firebase/CoreOnly'
169-
ss.dependency 'FirebaseMLModelDownloader', '~> 12.14.0-beta'
169+
ss.dependency 'FirebaseMLModelDownloader', '~> 12.15.0-beta'
170170
# Standard platforms PLUS watchOS.
171171
ss.ios.deployment_target = '15.0'
172172
ss.osx.deployment_target = '10.15'
@@ -176,15 +176,15 @@ Simplify your app development, grow your user base, and monetize more effectivel
176176

177177
s.subspec 'Performance' do |ss|
178178
ss.dependency 'Firebase/CoreOnly'
179-
ss.ios.dependency 'FirebasePerformance', '~> 12.14.0'
180-
ss.tvos.dependency 'FirebasePerformance', '~> 12.14.0'
179+
ss.ios.dependency 'FirebasePerformance', '~> 12.15.0'
180+
ss.tvos.dependency 'FirebasePerformance', '~> 12.15.0'
181181
ss.ios.deployment_target = '15.0'
182182
ss.tvos.deployment_target = '15.0'
183183
end
184184

185185
s.subspec 'RemoteConfig' do |ss|
186186
ss.dependency 'Firebase/CoreOnly'
187-
ss.dependency 'FirebaseRemoteConfig', '~> 12.14.0'
187+
ss.dependency 'FirebaseRemoteConfig', '~> 12.15.0'
188188
# Standard platforms PLUS watchOS.
189189
ss.ios.deployment_target = '15.0'
190190
ss.osx.deployment_target = '10.15'
@@ -194,7 +194,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
194194

195195
s.subspec 'Storage' do |ss|
196196
ss.dependency 'Firebase/CoreOnly'
197-
ss.dependency 'FirebaseStorage', '~> 12.14.0'
197+
ss.dependency 'FirebaseStorage', '~> 12.15.0'
198198
# Standard platforms PLUS watchOS.
199199
ss.ios.deployment_target = '15.0'
200200
ss.osx.deployment_target = '10.15'

FirebaseABTesting.podspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'FirebaseABTesting'
3-
s.version = '12.14.0'
3+
s.version = '12.15.0'
44
s.summary = 'Firebase ABTesting'
55

66
s.description = <<-DESC
@@ -51,7 +51,7 @@ Firebase Cloud Messaging and Firebase Remote Config in your app.
5151
s.pod_target_xcconfig = {
5252
'HEADER_SEARCH_PATHS' => '"${PODS_TARGET_SRCROOT}"'
5353
}
54-
s.dependency 'FirebaseCore', '~> 12.14.0'
54+
s.dependency 'FirebaseCore', '~> 12.15.0'
5555

5656
s.test_spec 'unit' do |unit_tests|
5757
unit_tests.scheme = { :code_coverage => true }

FirebaseABTesting/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Unreleased
1+
# 12.14.0
22
- [fixed] Fixed a race condition that could lead to a crash in ABTesting when
33
updating experiments. (#16145)
44

FirebaseAI.podspec

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'FirebaseAI'
3-
s.version = '12.14.0'
3+
s.version = '12.15.0'
44
s.summary = 'Firebase AI SDK'
55

66
s.description = <<-DESC
@@ -43,8 +43,8 @@ Build AI-powered apps and features with the Gemini API using the Firebase AI SDK
4343
s.tvos.framework = 'UIKit'
4444
s.watchos.framework = 'WatchKit'
4545

46-
s.dependency 'FirebaseAILogic', '12.14.0'
47-
s.dependency 'FirebaseCore', '~> 12.14.0'
46+
s.dependency 'FirebaseAILogic', '12.15.0'
47+
s.dependency 'FirebaseCore', '~> 12.15.0'
4848

4949
s.test_spec 'unit' do |unit_tests|
5050
unit_tests_dir = 'FirebaseAI/Wrapper/Tests/'

FirebaseAI/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# 12.14.0
2+
- [fixed] Fixed an issue in `GenerativeModelSession` where `String` generation
3+
used the wrong overload for `respond(to:)` and `streamResponse(to:)`,
4+
resulting in occasional prompt refusals. (#16165)
5+
16
# 12.13.0
27
- [feature] **Public Preview**: Added support for hybrid inference, enabling
38
fallback between on-device (Foundation Models) and cloud (Gemini) models. (#16111)

FirebaseAI/Sources/Extensions/Internal/LanguageModelSession+ModelSession.swift

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -49,33 +49,36 @@
4949
-> _ModelSessionResponse {
5050
let prompt = try prompt.toFoundationModelsPrompt()
5151

52-
let response: FoundationModels.LanguageModelSession
53-
.Response<FoundationModels.GeneratedContent>
52+
let rawContent: FoundationModels.GeneratedContent
53+
let transcriptEntries: ArraySlice<FoundationModels.Transcript.Entry>
5454
if let schema {
55-
response = try await respond(
55+
let response = try await respond(
5656
to: prompt,
5757
schema: schema.generationSchema,
5858
includeSchemaInPrompt: includeSchemaInPrompt,
5959
options: options.generationOptions
6060
)
61+
rawContent = response.rawContent
62+
transcriptEntries = response.transcriptEntries
6163
} else {
62-
response = try await respond(
64+
let response = try await respond(
6365
to: prompt,
64-
schema: String.generationSchema,
6566
options: options.generationOptions
6667
)
68+
rawContent = response.rawContent
69+
transcriptEntries = response.transcriptEntries
6770
}
6871

6972
#if DEBUG
7073
if AILog.additionalLoggingEnabled() {
7174
AILog.debug(
7275
code: .foundationModelsResponseTranscript,
73-
"Foundation Models Transcript: \(response.transcriptEntries)"
76+
"Foundation Models Transcript: \(transcriptEntries)"
7477
)
7578
}
7679
#endif // DEBUG
7780

78-
return makeResponse(from: response.rawContent, schema: schema)
81+
return makeResponse(from: rawContent, schema: schema)
7982
}
8083

8184
/// Sends a prompt to the model and streams the model's response.
@@ -99,42 +102,43 @@
99102
return
100103
}
101104

102-
let stream: FoundationModels.LanguageModelSession
103-
.ResponseStream<FoundationModels.GeneratedContent>
104-
if let schema {
105-
stream = streamResponse(
106-
to: foundationModelsPrompt,
107-
schema: schema.generationSchema,
108-
includeSchemaInPrompt: includeSchemaInPrompt,
109-
options: options.generationOptions
110-
)
111-
} else {
112-
stream = streamResponse(
113-
to: foundationModelsPrompt,
114-
schema: String.generationSchema,
115-
options: options.generationOptions
116-
)
117-
}
118-
119105
let task = Task {
120106
do {
121-
for try await snapshot in stream {
122-
let response = makeResponse(from: snapshot.rawContent, schema: schema)
107+
func processStream<T>(_ stream: LanguageModelSession.ResponseStream<T>) async throws {
108+
for try await snapshot in stream {
109+
let response = makeResponse(from: snapshot.rawContent, schema: schema)
123110

124-
continuation.yield(response)
111+
continuation.yield(response)
112+
}
113+
114+
#if DEBUG
115+
if AILog.additionalLoggingEnabled() {
116+
// Streaming has completed but we call `collect()` to get a
117+
// `LanguageModelSession.Response`, which contains `transcriptEntries`.
118+
let response = try await stream.collect()
119+
AILog.debug(
120+
code: .foundationModelsStreamResponseTranscript,
121+
"Foundation Models Transcript: \(response.transcriptEntries)"
122+
)
123+
}
124+
#endif // DEBUG
125125
}
126126

127-
#if DEBUG
128-
if AILog.additionalLoggingEnabled() {
129-
// Streaming has completed but we call `collect()` to get a
130-
// `LanguageModelSession.Response`, which contains `transcriptEntries`.
131-
let response = try await stream.collect()
132-
AILog.debug(
133-
code: .foundationModelsStreamResponseTranscript,
134-
"Foundation Models Transcript: \(response.transcriptEntries)"
135-
)
136-
}
137-
#endif // DEBUG
127+
if let schema {
128+
let stream = streamResponse(
129+
to: foundationModelsPrompt,
130+
schema: schema.generationSchema,
131+
includeSchemaInPrompt: includeSchemaInPrompt,
132+
options: options.generationOptions
133+
)
134+
try await processStream(stream)
135+
} else {
136+
let stream = streamResponse(
137+
to: foundationModelsPrompt,
138+
options: options.generationOptions
139+
)
140+
try await processStream(stream)
141+
}
138142

139143
continuation.finish()
140144
} catch {

FirebaseAI/Sources/GenerateContentResponse.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -540,12 +540,16 @@ extension GenerateContentResponse: Decodable {
540540
public init(from decoder: Decoder) throws {
541541
let container = try decoder.container(keyedBy: CodingKeys.self)
542542

543-
guard container.contains(CodingKeys.candidates) || container
544-
.contains(CodingKeys.promptFeedback) else {
543+
guard container.contains(CodingKeys.candidates)
544+
|| container.contains(CodingKeys.promptFeedback)
545+
|| container.contains(CodingKeys.usageMetadata) else {
546+
let keys = container.allKeys.map { $0.stringValue }.sorted().joined(separator: ", ")
545547
let context = DecodingError.Context(
546-
codingPath: [],
547-
debugDescription: "Failed to decode GenerateContentResponse;" +
548-
" missing keys 'candidates' and 'promptFeedback'."
548+
codingPath: decoder.codingPath,
549+
debugDescription: """
550+
Failed to decode GenerateContentResponse; missing keys 'candidates', 'promptFeedback' or \
551+
'usageMetadata'. Found keys: \(keys.isEmpty ? "none" : keys)
552+
"""
549553
)
550554
throw DecodingError.dataCorrupted(context)
551555
}

FirebaseAI/Sources/TemplateGenerativeModel.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ public final class TemplateGenerativeModel: Sendable {
3535
/// - templateID: The ID of the prompt template to use.
3636
/// - inputs: A dictionary of variables to substitute into the template.
3737
/// - options: The ``RequestOptions`` for the request, currently used to override default
38-
/// request timeout.
39-
/// - toolConfig: The ``TemplateToolConfig`` for the request, e.g. for Maps Grounding.
38+
/// request timeout.
39+
/// - toolConfig: The ``TemplateToolConfig`` for the request (for example, if it uses the
40+
/// Grounding with Google Maps tool).
4041
/// - Returns: The content generated by the model.
4142
/// - Throws: A ``GenerateContentError`` if the request failed.
4243
public func generateContent(templateID: String,
@@ -61,7 +62,8 @@ public final class TemplateGenerativeModel: Sendable {
6162
/// - template: The prompt template to use.
6263
/// - inputs: A dictionary of variables to substitute into the template.
6364
/// - options: The ``RequestOptions`` for the request.
64-
/// - toolConfig: The ``TemplateToolConfig`` for the request, e.g. for Maps Grounding.
65+
/// - toolConfig: The ``TemplateToolConfig`` for the request (for example, if it uses the
66+
/// Grounding with Google Maps tool).
6567
/// - Returns: The content generated by the model.
6668
/// - Throws: A ``GenerateContentError`` if the request failed.
6769
func generateContentWithHistory(history: [ModelContent], template: String,
@@ -92,8 +94,9 @@ public final class TemplateGenerativeModel: Sendable {
9294
/// - templateID: The ID of the prompt template to use.
9395
/// - inputs: A dictionary of variables to substitute into the template.
9496
/// - options: The ``RequestOptions`` for the request, currently used to override default
95-
/// request timeout.
96-
/// - toolConfig: The ``TemplateToolConfig`` for the request, e.g. for Maps Grounding.
97+
/// request timeout.
98+
/// - toolConfig: The ``TemplateToolConfig`` for the request (for example, if it uses the
99+
/// Grounding with Google Maps tool).
97100
/// - Returns: An `AsyncThrowingStream` that yields `GenerateContentResponse` objects.
98101
/// - Throws: A ``GenerateContentError`` if the request failed.
99102
@available(macOS 12.0, watchOS 8.0, *)
@@ -123,7 +126,8 @@ public final class TemplateGenerativeModel: Sendable {
123126
/// - template: The prompt template to use.
124127
/// - inputs: A dictionary of variables to substitute into the template.
125128
/// - options: The ``RequestOptions`` for the request.
126-
/// - toolConfig: The ``TemplateToolConfig`` for the request, e.g. for Maps Grounding.
129+
/// - toolConfig: The ``TemplateToolConfig`` for the request (for example, if it uses the
130+
/// Grounding with Google Maps tool).
127131
/// - Returns: An `AsyncThrowingStream` that yields `GenerateContentResponse` objects.
128132
/// - Throws: A ``GenerateContentError`` if the request failed.
129133
@available(macOS 12.0, watchOS 8.0, *)

0 commit comments

Comments
 (0)