Open
Conversation
…ach PI
Adds a new podcast service that runs daily, searches PubMed for recent
publications relevant to each PI's profile, selects the most impactful
paper via Sonnet, generates a structured PI-specific summary via Opus,
produces audio via ElevenLabs TTS, delivers via Slack DM, and serves
episodes over a per-PI RSS podcast feed.
New modules:
- src/podcast/: scheduler (main.py), per-agent pipeline, PubMed query
builder, ElevenLabs TTS client, RSS feed builder, state persistence
- src/routers/podcast.py: /podcast/{agent_id}/feed.xml and audio endpoints
- src/models/podcast.py: PodcastEpisode DB model
- alembic/versions/0005_add_podcast_episodes.py: DB migration
- prompts/podcast-select.md + podcast-summarize.md: LLM prompt files
- specs/labbot-podcast.md: full feature specification
- templates/admin/podcast.html: admin dashboard tab
Wired into: FastAPI app, admin router, docker-compose (podcast service,
opt-in via --profile podcast), pyproject.toml (adds mutagen), config.py
(ElevenLabs + podcast env vars), and admin nav.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… log - Expose postgres port 5432 to host for local alembic/migrations and dev tooling - Gitignore data/ directory (runtime state: grantbot state, podcast audio/state) - Add .labbot-tests/podcast-run-2026-03-31.log capturing first successful podcast pipeline run (14 agents, text summaries generated via Claude, ElevenLabs skipped — no API key) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…test) Replaces elevenlabs.py with mistral_tts.py, which decodes the base64 JSON response, strips markdown from text before synthesis, and reads voice/model from new MISTRAL_* env vars. Adds a focused single-agent test script and .labbot-tests/ outputs from a successful run. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rking for local TTS. Adds podcast_data named volume shared between app and podcast services so audio files are accessible for serving; adds extra_hosts and LOCAL_TTS_HOST override in dev compose so the podcast container can reach a vLLM-Omni server running on the host. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…U R128, -16 LUFS). Adds normalize_audio() to tts_utils.py called by both Mistral and local TTS backends after saving audio; adds ffmpeg to Dockerfile so normalization works inside containers. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Preprints are fetched concurrently with PubMed results and merged into the candidate pool; preprint IDs use a prefixed format (biorxiv:/medrxiv:/arxiv:) so deduplication and delivery tracking work without changes to state.py. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds tech stack, project structure, key commands, podcast pipeline overview, pilot lab roster, and architectural decisions so future sessions have complete context without re-exploring the codebase. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add ## Podcast Preferences section to all 14 private profiles so PIs
can tune article selection and summary tone via standing instructions
- Wire _load_podcast_preferences() into pipeline selection and summarize
steps; inject preferences into both prompts via {preferences} placeholder
- Add podcast_voices.json (gitignored data/) with per-agent voice overrides;
falls back to MISTRAL_TTS_DEFAULT_VOICE / LOCAL_TTS_VOICE env vars
- Add PODCAST_NORMALIZE_AUDIO config flag (default false); ffmpeg loudnorm
now only runs when explicitly enabled, fixing cross-device link error
- Remove unused elevenlabs.py dead code
- Update test_podcast_su.py to load and pass private profile preferences
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- src/main.py: restore invite/settings routers and full delegate-aware
AgentBadgeMiddleware from main; add podcast router alongside them
- src/models/__init__.py: restore AgentDelegate, DelegateInvitation,
EmailNotification, EmailEngagementTracker, ProfileRevision from main;
keep PodcastEpisode alongside them
- pipeline.py: _load_podcast_preferences() now reads the ## Podcast
Preferences section from the latest private ProfileRevision in the DB
(async, self-contained) instead of flat files on disk
- docker-compose.yml: use ${POSTGRES_USER:-copi} env-var style matching
main; remove hardcoded DATABASE_URL overrides; add data volume to app
and podcast service (under podcast profile)
- .gitignore: add profiles/public/*.md and profiles/private/*.md to
match main (profiles versioned via DB ProfileRevision, not git)
- CLAUDE.md: add testing Docker command and full simulation run docs
from main
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bring in delegate system, email notifications, profile versioning, and simulation improvements from main. All conflicts resolved: - main.py/models/__init__.py: kept both branches' additions (delegates + podcast router/model side by side) - profiles/private/*.md: accepted main's deletion (profiles are now DB-managed via ProfileRevision; podcast preferences read from there) - CLAUDE.md: use main's version as base, append Podcast Pipeline section - docker-compose.prod.yml: kept this branch's named volumes for grantbot and podcast services Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ile) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…enerate) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add the podcast functionality.
Relevant endpoints:
[server]/podcast/ [profile (e.g. su)] /feed.xml
[server]/podcast/ [profile (e.g. su)] /audio/[yyy-mm-dd].mp3
[server]/podcast/ [profile (e.g. su)] /generate (to initiate summary and TTS if scheduler has not made it yet)