Repository navigation
Use configured AI providers for meeting summaries - #1076
andrewmitchell-automations wants to merge 5 commits into
Conversation
Squashed from altic-dev#1028 by @grohith327 and rebased onto main after the beta.8 summary changes.
Summaries now run only through providers already verified in AI Providers, using Command Mode's catalog and the shared LLMClient. - Remove the Claude Code/Codex CLI runner, the separate Anthropic Messages client, the pre-release "Use AI Settings" migration, and the on-device option in the summary view. - Run cloud summaries outside the ASR lease and processing gate so dictation, Command Mode, and Rewrite keep working meanwhile. - Treat only length/max_tokens/content_filter as truncation so providers that report eos or end_turn still succeed. - Give reasoning models Command Mode's 32k output budget. - Default to the AI Settings provider on first use, reset pre-release selections, and show a setup prompt when nothing is verified. - Keep older on-device summaries hidden while that path is disabled. Co-Authored-By: grohith327 <grohith327@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
claude-haiku-5-5, claude-opus-5 and claude-opus-5-5 reject the temperature parameter with HTTP 400, but the name list in isTemperatureUnsupported did not match them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each new model that drops `temperature` (Opus 4.7, Sonnet 5, Haiku 5.5) broke requests until the name list in isTemperatureUnsupported was updated. Support is now learned per model ID and stored in UserDefaults: - The model fetch records it from the /models listing: OpenRouter's supported_parameters, and Anthropic's budget_tokens thinking capability (every model that dropped it also dropped temperature). - LLMClient records a model as unsupported when a request with temperature gets an HTTP 400 that names it, and retries once without temperature. The 400 arrives before any streamed output. - The name list stays as the fallback for models with no learned value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two providers can serve the same model ID with different parameter support (for example a generic local ID such as "llama3"). A rejection or listing from one provider no longer stops the other from receiving temperature. isTemperatureUnsupported now takes the provider base URL; every call site already had it. The saved key is renamed so values stored under the old model-only key are ignored. The name-list tests in TemperatureSupportTests now read an empty learned store, so values saved by the test host cannot change their results. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| } | ||
|
|
||
| private static func key(_ model: String, baseURL: String) -> String { | ||
| var endpoint = baseURL.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() |
There was a problem hiding this comment.
Different providers share temperature settings
ModelTemperatureSupport.key lowercases the whole baseURL, including its case-sensitive path. If custom providers use /TeamA/v1 and /teama/v1 with the same model, they share a cache entry even though requests go to different URLs. When one rejects temperature, the other silently loses its configured temperature too.
Normalize the scheme and host, but preserve the path’s case.
Prompt To Fix With AI
This is a comment left during a code review.
Path: Sources/Fluid/Services/ModelTemperatureSupport.swift
Line: 65
Comment:
**Different providers share temperature settings**
`ModelTemperatureSupport.key` lowercases the whole `baseURL`, including its case-sensitive path. If custom providers use `/TeamA/v1` and `/teama/v1` with the same model, they share a cache entry even though requests go to different URLs. When one rejects `temperature`, the other silently loses its configured temperature too.
Normalize the scheme and host, but preserve the path’s case.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.
Description
Meeting summaries are currently disabled on
main("coming soon") because on-device generation was inaccurate. This PR turns them back on for completed meetings, using only the cloud providers the user has already configured and verified in AI Providers. It continues #1028 by @grohith327 (their commits are squashed and rebased onto currentmainas the first commit, with authorship kept) and narrows its scope:commandModeModelCatalog()), resolves base URL, API key, reasoning, and temperature settings the same way, and sends the request through the existingLLMClient. Anthropic works through its OpenAI-compatible endpoint, as in the rest of the app.meeting:*) are reset, and older on-device summaries stay hidden while that path is disabled.length/max_tokens/content_filter(Chat Completions) or an incomplete status (Responses API) counts as truncated, so providers that report a normal stop aseosorend_turnstill work.The on-device download/delete code in
MeetingSummaryControlleris left unchanged so it can be enabled again later. It is not reachable from this view.Type of Change
Related Issue or Discussion
Related to #1022 (cloud-model half; local model choice is not included).
Supersedes #1028.
Testing
Verification steps:
Result: live run on a 52-minute Zoom meeting with Anthropic
claude-haiku-4-5-20251001produced a detailed summary with provenance (screenshots below).swiftlint --strictwith the CI image (ghcr.io/realm/swiftlint:0.63.2), 0 violations--lintis clean on the new/rewritten files; remaining findings are in lines unchanged frommainMeetingSummaryProviderTests,MeetingSummaryActivityTests,MeetingSummaryInputTests— 24 passed. Fullxcodebuild test(CI flags): the only failures were 9UpdateInstallationPipelineTests(invalidSignature(-67050)), which fail the same way on unmodifiedmainon this Mac, and oneAudioTopologyDiagnosticsTestscount assertion that passed 3/3 on rerun.Not tested: Intel; the "Set up a provider" state was checked in code and tests, not in a screenshot.
Screenshots / Video
Provider and model picker with a verified provider:
Summary types:
Generating (transcript destination shown):
Result with provenance (meeting content redacted):
Notes
AI use: Claude Code reviewed #1028, rebased it, removed the CLI and native Anthropic paths, wrote the new tests, and ran the checks above. I ran the live test on macOS 27.2 / Apple Silicon and reviewed every changed line.
🤖 Generated with Claude Code