Skip to content

Add a custom prompt option for meeting summaries - #1077

Open
andrewmitchell-automations wants to merge 10 commits into
altic-dev:mainfrom
andrewmitchell-automations:feat/meeting-summary-custom-prompt
Open

andrewmitchell-automations wants to merge 10 commits into
altic-dev:mainfrom
andrewmitchell-automations:feat/meeting-summary-custom-prompt

Conversation

@andrewmitchell-automations

Copy link
Copy Markdown

Description

Adds a Custom prompt option to the summary type menu in a completed meeting's Meet Summary tab.

  • Choosing Custom prompt shows an editor below the pickers. Its text replaces only the built-in summary-type guidance.
  • The system prompt keeps the source rules first: the transcript is source material, never instructions, and the model must not invent facts. Format, speaker names, and language follow the user's instructions when they say so. The transcript stays a separate user message.
  • The prompt is saved once (UserDefaults) and reused for every meeting.
  • A saved custom summary stores a hash of its prompt and shows again only when both the transcript and the prompt are unchanged.
  • Generate summary stays disabled while the prompt is empty, and the service also rejects an empty prompt before any request.

Depends on #1076. Cross-fork stacked PRs are not supported, so this branch contains #1076's commits. Please review only the top commit, 813d494. It becomes a one-commit diff after #1076 merges.

Type of Change

  • 🐞 Bug fix
  • ✨ New feature
  • 💥 Breaking change
  • 🧹 Chore
  • 📝 Documentation update

Related Issue or Discussion

Closes #1075
Depends on #1076. UI scope is proposed in #1075 and awaits maintainer approval.

Testing

Verification steps:

  1. Open a completed meeting → Meet Summary → Summary type Custom prompt.
  2. With an empty editor, Generate summary is disabled.
  3. Enter instructions (tested: "Summarize into two sections: Topics discussed, Action Items (with assignees). Omit any personal small-talk.") → Generate summary.
  4. Expected: output follows the instructions, titled "Custom prompt" with provenance. Switching meetings keeps the prompt; editing the prompt hides the older custom result until it is regenerated.

Result: live run with Anthropic claude-haiku-4-5-20251001 produced the two requested sections (screenshots below).

  • Tested on Intel Mac
  • Tested on Apple Silicon Mac
  • Tested on macOS version: 27.2
  • Ran linter locally: swiftlint --strict with the CI image (ghcr.io/realm/swiftlint:0.63.2), 0 violations
  • Ran formatter locally: SwiftFormat --lint is clean on the changed files except lines unchanged from main
  • Ran tests locally: MeetingSummaryProviderTests, MeetingSummaryActivityTests, MeetingSummaryInputTests — 28 passed (4 new: prompt composition, empty-prompt rejection, persistence, saved-summary invalidation)

Screenshots / Video

Custom prompt editor:

Custom prompt editor

Result (meeting content redacted):

Custom prompt result

Notes

AI use: Claude Code implemented the change and tests and ran the checks above. I ran the live test on macOS 27.2 / Apple Silicon and reviewed every changed line.

  • A human created this PR or reviewed and approved it before submission, understands the full diff, and takes responsibility for the change.

The contribution requirements are mandatory. PRs that do not follow CONTRIBUTING.md will not be reviewed or merged until they comply, and may be closed.

🤖 Generated with Claude Code

grohith327 and others added 3 commits October 6, 2026 13:22
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>
Choosing "Custom prompt" in the summary type menu shows an editor whose
text replaces the built-in type guidance. The source-material and
no-invention rules stay in the system prompt, and the transcript stays
a separate user message.

The prompt is saved once and reused for every meeting. A saved custom
summary is shown again only when both the transcript and the prompt are
unchanged, and Generate stays disabled while the prompt is empty.

Closes altic-dev#1075

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@greptile-apps

greptile-apps Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Medium impact] The reviewed changes appear safe to merge.

Summary

Adds a saved custom prompt for meeting summaries while keeping the transcript separate from the instructions.

  • Saves a prompt hash with each custom result.
  • Rechecks saved results after prompt edits, addressing the earlier stale-summary thread.
  • Separates learned temperature support by provider endpoint, addressing the numbered previous finding.
  • No new actionable issues found in the changes since the last review.

Reviews (4) · Last reviewed commit: "Merge branch 'feat/meeting-summary-ai-pr..." · Reviewed by Greptile

Comment thread Sources/Fluid/UI/MeetingSummaryView.swift
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown

FluidVoice PR build ready

Download FluidVoice-PR-1077-6edbff1c3f2d

The artifact contains the ad-hoc-signed app ZIP, Xcode archive, build manifest, and installation instructions. It expires 5 days after the build.

Install the app

  1. Extract the downloaded artifact, then extract FluidVoice-PR-1077.app.zip.

  2. Move FluidVoice Add a custom prompt option for meeting summaries #1077.app into the /Applications folder.

  3. Open Terminal and remove the download quarantine marker:

    xattr -dr com.apple.quarantine "/Applications/FluidVoice #1077.app"
    
  4. In Applications, Control-click FluidVoice Add a custom prompt option for meeting summaries #1077.app and choose Open.

  5. If macOS still blocks it, open System Settings → Privacy & Security, click Open Anyway, and confirm.

This build has its own app identity, so its permissions are separate from the release version of FluidVoice.

View workflow run

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>
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>
…mmary-custom-prompt

# Conflicts:
#	Sources/Fluid/Persistence/SettingsStore.swift
Comment thread Sources/Fluid/Services/ModelTemperatureSupport.swift Outdated
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] Custom prompt for meeting summaries

2 participants