fix(server): transcript key & bump models (#15485)

#### PR Dependency Tree


* **PR #15485** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Upgraded built-in AI actions and chat model selection to Gemini 3.7
Flash.
* Transcript attachments now retain storage keys and support secure
presigned URLs during processing.
* Completed transcript results preserve attachment metadata for reliable
access.

* **Bug Fixes**
* Improved transcript handling across uploads, retries, and native
processing.
  * Added safeguards for invalid or missing attachment URLs.

* **Maintenance**
* Added a migration to backfill storage keys for existing transcript
records without altering their URLs.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-08-16 00:49:27 +08:00
committed by GitHub
parent 7b3a8afc87
commit ff1e3d9c94
14 changed files with 286 additions and 67 deletions
@@ -3,8 +3,8 @@
"name": "Transcript audio",
"action": "Transcript audio",
"managedRoute": {
"targets": ["gemini-3.5-flash-lite"],
"premiumTargets": ["gemini-3.6-flash"]
"targets": ["gemini-3.7-flash"],
"premiumTargets": ["gemini-3.7-flash"]
},
"config": {
"requireContent": false,
@@ -17,8 +17,8 @@
"name": "Transcript audio structured",
"action": "Transcript audio structured",
"managedRoute": {
"targets": ["gemini-3.5-flash-lite"],
"premiumTargets": ["gemini-3.6-flash"]
"targets": ["gemini-3.7-flash"],
"premiumTargets": ["gemini-3.7-flash"]
},
"config": {
"requireContent": false,
@@ -39,7 +39,7 @@
{
"name": "Generate a caption",
"action": "Generate a caption",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"config": {
"requireContent": false,
"requireAttachment": true
@@ -129,7 +129,7 @@
{
"name": "Explain this image",
"action": "Explain this image",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"config": {
"requireContent": false,
"requireAttachment": true
@@ -148,7 +148,7 @@
{
"name": "Explain this code",
"action": "Explain this code",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -163,7 +163,7 @@
{
"name": "Translate to",
"action": "Translate",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"params": {
"language": {
"default": "English",
@@ -256,7 +256,7 @@
{
"name": "Write a twitter about this",
"action": "Write a twitter about this",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -271,7 +271,7 @@
{
"name": "Write a poem about this",
"action": "Write a poem about this",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -301,7 +301,7 @@
{
"name": "Write outline",
"action": "Write outline",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -316,7 +316,7 @@
{
"name": "Change tone to",
"action": "Change tone",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"params": {
"tone": {
"default": "professional",
@@ -337,7 +337,7 @@
{
"name": "Brainstorm ideas about this",
"action": "Brainstorm ideas about this",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -386,7 +386,7 @@
{
"name": "Improve writing for it",
"action": "Improve writing for it",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -416,7 +416,7 @@
{
"name": "Fix spelling for it",
"action": "Fix spelling for it",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -476,7 +476,7 @@
{
"name": "Create headings",
"action": "Create headings",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -521,7 +521,7 @@
{
"name": "Make it longer",
"action": "Make it longer",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -536,7 +536,7 @@
{
"name": "Make it shorter",
"action": "Make it shorter",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -551,7 +551,7 @@
{
"name": "Continue writing",
"action": "Continue writing",
"managedRoute": { "targets": ["gemini-3.5-flash-lite"] },
"managedRoute": { "targets": ["gemini-3.7-flash"] },
"messages": [
{
"role": "system",
@@ -711,8 +711,8 @@
},
{
"id": "gemini",
"modelId": "gemini-3.6-flash",
"displayName": "Gemini 3.6 Flash",
"modelId": "gemini-3.7-flash",
"displayName": "Gemini 3.7 Flash",
"minimumTier": "premium"
},
{
@@ -81,12 +81,12 @@ mod tests {
let response = llm_resolve_model_registry_variant(ModelRegistryResolveRequest {
backend_kind: Some("gemini_api".to_string()),
model_id: "gemini-3.6-flash".to_string(),
model_id: "gemini-3.7-flash".to_string(),
})
.unwrap();
assert_eq!(response.matched_by.as_deref(), Some("raw_model_id"));
assert_eq!(response.variant.unwrap().raw_model_id, "gemini-3.6-flash");
assert_eq!(response.variant.unwrap().raw_model_id, "gemini-3.7-flash");
}
#[test]
@@ -301,7 +301,7 @@ mod tests {
attachment_kinds: None,
attachment_source_kinds: None,
has_remote_attachments: None,
model_id: Some("gemini-3.6-flash".to_string()),
model_id: Some("gemini-3.7-flash".to_string()),
output_type: Some("image".to_string()),
},
})
@@ -210,7 +210,7 @@ mod tests {
fn should_materialize_structured_request_with_response_contract() {
let response = llm_build_canonical_structured_request(
serde_json::from_value::<CanonicalStructuredRequestContract>(json!({
"model": "gemini-3.6-flash",
"model": "gemini-3.7-flash",
"messages": [
{ "role": "user", "content": "hello" }
],
@@ -226,7 +226,7 @@ mod tests {
assert_eq!(
response,
json!({
"model": "gemini-3.6-flash",
"model": "gemini-3.7-flash",
"messages": [
{
"role": "user",
@@ -597,13 +597,13 @@ mod tests {
);
let transcript = built_in_prompt("Transcript audio structured").expect("transcript prompt");
assert_eq!(transcript.managed_targets, ["gemini-3.5-flash-lite"]);
assert_eq!(transcript.managed_targets, ["gemini-3.7-flash"]);
assert_eq!(
transcript
.managed_premium_targets
.as_deref()
.map(|targets| targets.iter().map(String::as_str).collect::<Vec<_>>()),
Some(vec!["gemini-3.6-flash"])
Some(vec!["gemini-3.7-flash"])
);
}
}
@@ -262,7 +262,7 @@ mod tests {
CopilotManagedTier::Premium
)
.unwrap(),
["gemini-3.6-flash"]
["gemini-3.7-flash"]
);
assert_eq!(
managed_targets(&slot("index.embedding").unwrap(), None, CopilotManagedTier::Standard).unwrap(),
@@ -326,7 +326,7 @@ mod tests {
id: "vertex".to_string(),
provider: "geminiVertex".to_string(),
enabled: true,
models: vec!["gemini-3.6-flash".to_string()],
models: vec!["gemini-3.7-flash".to_string()],
config: json!({ "project": "affine-us", "location": location }),
}
}