feat(podcasts): adopt podcast-creator 0.13.1 (#1446)
Some checks are pending
Development Build / extract-version (push) Waiting to run
Development Build / changes (push) Waiting to run
Development Build / build-regular (push) Blocked by required conditions
Development Build / build-single (push) Blocked by required conditions
Development Build / summary (push) Blocked by required conditions
Tests / Backend Tests (push) Waiting to run
Tests / Backend Lint (push) Waiting to run
Tests / Backend Typecheck (push) Waiting to run
Tests / Frontend Tests (push) Waiting to run
Tests / Frontend Lint (push) Waiting to run
Tests / Frontend Build (push) Waiting to run

* feat(podcasts): adopt podcast-creator 0.13.1

podcast-creator 0.13 requests schema-validated JSON for outlines and
transcripts, raises the default output budget to 8192 tokens for both, and
adds a ~400 ms pause between turns; 0.13.1 falls back to plain JSON when an
endpoint rejects json_schema (lfnovo/podcast-creator#51).

- Floor raised to podcast-creator>=0.13.1.
- The episode profile's Max output tokens help no longer claims 3000/5000
  defaults (all 14 locales); docs cover the 8192 default, when to lower it,
  the turn pause and the JSON fallback.
- Tests render our shadowed prompts/podcast templates with the variables
  0.13 passes, and check they are ours (not the bundled ones).

Closes #1435

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBYpxzSS62Y3TZkgB9NUZy

* fix(i18n): translate the full max tokens guidance in every locale

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBYpxzSS62Y3TZkgB9NUZy

* fix(i18n): use Gesprächsrunde for 'turn' in the German max tokens help

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBYpxzSS62Y3TZkgB9NUZy

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Luis Novo 2026-10-03 23:19:53 -03:00 • committed by GitHub
parent 02870a7142
commit 2c620647ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 93 additions and 20 deletions

View file

@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Screen-by-screen reskin in the "Quiet Green" language** (the second redesign PR): the app shell gets the recomposed tri-hue pebble wordmark (fern/gold/teal — no red left), a fern spine on the active nav item and destination-hued nav icons; the notebook workspace gets display-type titles, panel headers with identity ticks (sources sage / notes gold / chat teal), one-line source-card metadata with the overflow menu at top-right, and de-washed chat bubbles (the AI speaks in teal accents, never washed backgrounds); the notebooks home separates compact recently-viewed rows from active-notebook cards; the sources table gets the library treatment (content-type pebbles, quiet embedded pills, hover that raises the surface); dialogs and the source viewer are flattened (no card-in-card boxes, uniform breathing room, no ⋮/close collision); and Models/Settings/Podcasts/Transformations/Ask-Search get the badge diet, quiet audio-player containers, mono for data and teal AI accents. Still purely visual — no behavior, columns, navigation or i18n changes
### Changed
- **Podcasts on podcast-creator 0.13.** Outlines and transcripts are requested as schema-validated JSON, with an automatic fallback to plain JSON for endpoints that don't support JSON schema (0.13.1). The default output budget is now 8192 tokens for the outline and the transcript (was 3000 / 5000); set an episode profile's Max output tokens lower for models with a smaller limit. Episodes now have a ~400 ms pause between speaker turns, and audio combining no longer cuts the end of a turn (#1435)
- Community contribution intake now separates exploration from execution: feature requests, product/design/architecture ideas and contribution proposals start in GitHub Discussions, while Issues are reserved for reproducible bugs and maintainer-approved work items. The Issue chooser routes contributors accordingly, a structured Ideas Discussion form starts from user goals and outcomes, and the contributor/maintainer docs plus PR template now describe the Discussion → Issue → PR graduation path (#1204).
- Release image gate gained a `probe` scenario (`make release-test` runs it as part of `all`): container-level checks that a Python test suite can't cover because they depend on the shipped image's process supervision — `OPEN_NOTEBOOK_WORKER_MAX_TASKS` reaching the in-image worker (the supervisord `sh -c` expansion), and the worker surviving startup with `HTTP_PROXY` set while a user's `NO_PROXY` value is preserved (the internal SurrealDB websocket not being tunneled). Both were manual probes during the v1.14.0 release; they now run automatically. Release-process docs gained the post-tag re-cut sequence and a note on never leaving the version bump uncommitted (v1.14.0 retro)
- Python code is now formatted with `ruff format` across the repository, and CI fails when it isn't (`ruff format --check .` in the Backend Lint job). Formatting-only change (59 files); run `uv run ruff format .` before pushing

View file

@ -184,6 +184,7 @@ When podcast generation fails (e.g., wrong model configured, API key expired, pr
| Invalid API key | Check Settings -> Credentials for the TTS and language model providers |
| Model not found | Verify the model exists in the model registry and has valid credentials configured |
| Rate limit exceeded | Wait a few minutes and retry |
| Output limit / `max_tokens` too large | Set the episode profile's Max output tokens below the model's limit (the default is 8192) |
| Provider unavailable | Check provider status page; retry later |
---

View file

@ -133,6 +133,10 @@ How to set:
4. System uses your profile for outline generation
```
**Max output tokens:** leave it blank to use the default of 8192 tokens for the outline and for each transcript generation step. Set it lower if your outline or transcript model has a smaller output limit (some older or local models stop at 4096); the provider rejects requests above its limit.
**Pacing:** generated episodes have a short pause (about 400 ms) between speaker turns, so the dialogue sounds less rushed.
### Step 5: Create or Select Speakers
Speakers are the "voice" of your podcast.
@ -481,9 +485,13 @@ Rule: 3-5 sources per podcast
2. Try again (might be temporary issue)
3. Use local TTS (doesn't need internet)
4. Reduce source count (less to process)
5. Contact support if persistent
5. "max_tokens" or output-limit error: set the episode profile's
Max output tokens below your model's limit (e.g. 4096)
6. Contact support if persistent
```
Outlines and transcripts are requested as schema-validated JSON. Models or endpoints that don't support JSON schema output (some OpenAI-compatible servers) automatically fall back to plain JSON mode; the worker log notes the fallback.
---
## Advanced: Multiple Podcasts from Same Research

View file

@ -678,7 +678,7 @@ export const bnIN = {
segments: "সেগমেন্ট",
maxTokens: "সর্বাধিক আউটপুট টোকেন",
maxTokensPlaceholder: "ডিফল্টের জন্য ফাঁকা রাখুন",
maxTokensHelp: "ঐচ্ছিক। প্রতিটি জেনারেশন ধাপ — আউটলাইন এবং সম্পূর্ণ ট্রান্সক্রিপ্ট — কত টোকেন তৈরি করতে পারে তার সীমা নির্ধারণ করে; এটি প্রতি-সংলাপ বা প্রতি-কথোপকথন সীমা নয়। বিল্ট-ইন ডিফল্ট ব্যবহার করতে ফাঁকা রাখুন (আউটলাইনের জন্য 3000, ট্রান্সক্রিপ্টের জন্য 5000)। দীর্ঘ পর্বের জন্য এটি বাড়ান; খুব কম মান ট্রান্সক্রিপ্টকে অসম্পূর্ণ রেখে দিতে পারে।",
maxTokensHelp: "ঐচ্ছিক। প্রতিটি জেনারেশন ধাপ — আউটলাইন ও পূর্ণ ট্রান্সক্রিপ্ট — কতগুলো টোকেন তৈরি করতে পারবে তার সীমা; এটি প্রতি সংলাপ বা পুরো কথোপকথনের সীমা নয়। ডিফল্ট (দুটির জন্যই 8192) ব্যবহার করতে ফাঁকা রাখুন। যে মডেলের আউটপুট সীমা 8192-এর কম, তার জন্য মান কমান; খুব কম মান ট্রান্সক্রিপ্ট কেটে দিতে পারে।",
defaultBriefingTitle: "ডিফল্ট ব্রিফিং",
created: "{{time}} এ তৈরি",
details: "বিবরণ",

View file

@ -678,7 +678,7 @@ export const caES = {
segments: "Segments",
maxTokens: "Tokens màxims de sortida",
maxTokensPlaceholder: "Deixa-ho en blanc per als valors per defecte",
maxTokensHelp: "Opcional. Limita quants tokens pot generar cada pas de generació — l'esquema i la transcripció completa —, no és un límit per torn ni per conversa. Deixa-ho en blanc per fer servir els valors per defecte integrats (3000 per a l'esquema, 5000 per a la transcripció). Augmenta'l per a episodis més llargs; un valor massa baix pot deixar la transcripció incompleta.",
maxTokensHelp: "Opcional. Limita quants tokens pot produir cada pas de generació — l'esquema i la transcripció completa —, no és un límit per torn ni per conversa. Deixa-ho en blanc per utilitzar el valor predeterminat (8192 per a tots dos). Redueix-lo per a models amb un límit de sortida inferior a 8192; un valor massa baix pot tallar la transcripció.",
defaultBriefingTitle: "Presentació per defecte",
created: "Creat el {{time}}",
details: "Detalls",

View file

@ -681,7 +681,7 @@ export const deDE = {
segments: "Segmente",
maxTokens: "Maximale Ausgabe-Tokens",
maxTokensPlaceholder: "Für Standardwerte leer lassen",
maxTokensHelp: "Optional. Begrenzt, wie viele Tokens jeder Generierungsschritt erzeugen kann — die Gliederung und das vollständige Transkript —, kein Limit pro Gesprächsrunde oder Unterhaltung. Leer lassen, um die eingebauten Standardwerte zu verwenden (3000 für die Gliederung, 5000 für das Transkript). Für längere Episoden erhöhen; ein zu niedriger Wert kann das Transkript abschneiden.",
maxTokensHelp: "Optional. Begrenzt, wie viele Tokens jeder Generierungsschritt erzeugen darf — die Gliederung und das vollständige Transkript —, kein Limit pro Gesprächsrunde oder Unterhaltung. Leer lassen, um den Standardwert zu verwenden (8192 für beide). Für Modelle mit einem Ausgabelimit unter 8192 niedriger einstellen; ein zu niedriger Wert kann das Transkript abschneiden.",
defaultBriefingTitle: "Standard-Briefing",
created: "Erstellt am {{time}}",
details: "Details",

View file

@ -676,7 +676,7 @@ export const enUS = {
segments: "Segments",
maxTokens: "Max output tokens",
maxTokensPlaceholder: "Leave blank for defaults",
maxTokensHelp: "Optional. Caps how many tokens each generation step can produce — the outline and the full transcript — not a per-turn or conversation limit. Leave blank to use the built-in defaults (3000 for the outline, 5000 for the transcript). Raise it for longer episodes; a value that is too low can cut the transcript short.",
maxTokensHelp: "Optional. Caps how many tokens each generation step can produce — the outline and the full transcript — not a per-turn or conversation limit. Leave blank to use the built-in default (8192 for both). Lower it for models whose output limit is below 8192; a value that is too low can cut the transcript short.",
defaultBriefingTitle: "Default briefing",
created: "Created at {{time}}",
details: "Details",

View file

@ -678,7 +678,7 @@ export const esES = {
segments: "Segmentos",
maxTokens: "Tokens máximos de salida",
maxTokensPlaceholder: "Déjalo en blanco para usar los valores predeterminados",
maxTokensHelp: "Opcional. Limita cuántos tokens puede generar cada paso de generación — el esquema y la transcripción completa —, no es un límite por turno ni por conversación. Déjalo en blanco para usar los valores predeterminados integrados (3000 para el esquema, 5000 para la transcripción). Auméntalo para episodios más largos; un valor demasiado bajo puede cortar la transcripción.",
maxTokensHelp: "Opcional. Limita cuántos tokens puede producir cada paso de generación — el esquema y la transcripción completa —, no es un límite por turno ni por conversación. Déjalo en blanco para usar el valor predeterminado (8192 para ambos). Redúcelo para modelos cuyo límite de salida sea inferior a 8192; un valor demasiado bajo puede cortar la transcripción.",
defaultBriefingTitle: "Briefing predeterminado",
created: "Creado el {{time}}",
details: "Detalles",

View file

@ -678,7 +678,7 @@ export const frFR = {
segments: "Segments",
maxTokens: "Jetons de sortie maximum",
maxTokensPlaceholder: "Laisser vide pour les valeurs par défaut",
maxTokensHelp: "Facultatif. Limite le nombre de jetons que chaque étape de génération peut produire — le plan et la transcription complète —, ce n'est pas une limite par tour de parole ni par conversation. Laisser vide pour utiliser les valeurs par défaut intégrées (3000 pour le plan, 5000 pour la transcription). Augmentez-la pour des épisodes plus longs ; une valeur trop basse peut tronquer la transcription.",
maxTokensHelp: "Facultatif. Limite le nombre de tokens que chaque étape de génération peut produire — le plan et la transcription complète —, et non par réplique ou par conversation. Laissez vide pour utiliser la valeur par défaut (8192 pour les deux). Diminuez-la pour les modèles dont la limite de sortie est inférieure à 8192 ; une valeur trop basse peut tronquer la transcription.",
defaultBriefingTitle: "Briefing par défaut",
created: "Créé à {{time}}",
details: "Détails",

View file

@ -678,7 +678,7 @@ export const itIT = {
segments: "Segmenti",
maxTokens: "Token massimi di output",
maxTokensPlaceholder: "Lascia vuoto per i valori predefiniti",
maxTokensHelp: "Facoltativo. Limita quanti token può produrre ogni fase di generazione — la scaletta e la trascrizione completa —, non è un limite per singolo turno o per conversazione. Lascia vuoto per usare i valori predefiniti integrati (3000 per la scaletta, 5000 per la trascrizione). Aumentalo per episodi più lunghi; un valore troppo basso può troncare la trascrizione.",
maxTokensHelp: "Facoltativo. Limita quanti token può produrre ogni fase di generazione — la scaletta e la trascrizione completa —, non è un limite per battuta o per conversazione. Lascia vuoto per usare il valore predefinito (8192 per entrambi). Riducilo per i modelli con un limite di output inferiore a 8192; un valore troppo basso può troncare la trascrizione.",
defaultBriefingTitle: "Briefing predefinito",
created: "Creato il {{time}}",
details: "Dettagli",

View file

@ -678,7 +678,7 @@ export const jaJP = {
segments: "セグメント",
maxTokens: "最大出力トークン数",
maxTokensPlaceholder: "デフォルト値を使う場合は空欄のまま",
maxTokensHelp: "任意。各生成ステップ(アウトラインと台本全文)が生成できるトークン数の上限を設定します。発言ごとや会話全体の制限ではありません。空欄にすると組み込みのデフォルト値(アウトラインは3000、台本は5000)が使われます。長いエピソードには値を上げてください。低すぎると台本が途中で切れることがあります。",
maxTokensHelp: "任意。各生成ステップ(アウトラインと完全なトランスクリプト)が生成できるトークン数の上限です。発言ごとや会話全体の上限ではありません。空欄にすると既定値(どちらも8192)を使用します。出力上限が8192未満のモデルでは値を下げてください。値が低すぎるとトランスクリプトが途中で切れることがあります。",
defaultBriefingTitle: "デフォルトブリーフィング",
created: "{{time}}に作成",
details: "詳細",

View file

@ -678,7 +678,7 @@ export const plPL = {
segments: "Segmenty",
maxTokens: "Maksymalna liczba tokenów wyjściowych",
maxTokensPlaceholder: "Pozostaw puste, aby użyć wartości domyślnych",
maxTokensHelp: "Opcjonalne. Ogranicza liczbę tokenów, które może wygenerować każdy krok generowania — konspekt i pełny transkrypt —, a nie jest to limit na pojedynczą wypowiedź ani na całą rozmowę. Pozostaw puste, aby użyć wbudowanych wartości domyślnych (3000 dla konspektu, 5000 dla transkryptu). Zwiększ dla dłuższych odcinków; zbyt niska wartość może uciąć transkrypt.",
maxTokensHelp: "Opcjonalne. Określa, ile tokenów może wygenerować każdy etap — konspekt i pełna transkrypcja — a nie pojedyncza wypowiedź czy rozmowa. Pozostaw puste, aby użyć wartości domyślnej (8192 dla obu). Zmniejsz ją dla modeli, których limit wyjścia jest niższy niż 8192; zbyt niska wartość może uciąć transkrypcję.",
defaultBriefingTitle: "Domyślny briefing",
created: "Utworzono {{time}}",
details: "Szczegóły",

View file

@ -678,7 +678,7 @@ export const ptBR = {
segments: "Segmentos",
maxTokens: "Máximo de tokens de saída",
maxTokensPlaceholder: "Deixe em branco para usar os padrões",
maxTokensHelp: "Opcional. Limita quantos tokens cada etapa de geração pode produzir — o roteiro e a transcrição completa —, não é um limite por fala nem por conversa. Deixe em branco para usar os padrões integrados (3000 para o roteiro, 5000 para a transcrição). Aumente para episódios mais longos; um valor baixo demais pode cortar a transcrição.",
maxTokensHelp: "Opcional. Limita quantos tokens cada etapa de geração pode produzir — o roteiro e a transcrição completa —, não é um limite por fala nem por conversa. Deixe em branco para usar o padrão integrado (8192 para ambos). Reduza o valor para modelos cujo limite de saída seja menor que 8192; um valor baixo demais pode cortar a transcrição.",
defaultBriefingTitle: "Briefing padrão",
created: "Criado em {{time}}",
details: "Detalhes",

View file

@ -678,7 +678,7 @@ export const ruRU = {
segments: "Сегменты",
maxTokens: "Максимум выходных токенов",
maxTokensPlaceholder: "Оставьте пустым для значений по умолчанию",
maxTokensHelp: "Необязательно. Ограничивает, сколько токенов может создать каждый шаг генерации — план и полный сценарий, — это не ограничение на отдельную реплику или на весь разговор. Оставьте пустым, чтобы использовать встроенные значения по умолчанию (3000 для плана, 5000 для сценария). Увеличьте для более длинных выпусков; слишком низкое значение может оборвать сценарий.",
maxTokensHelp: "Необязательно. Ограничивает число токенов, которое может создать каждый этап генерации — план и полная расшифровка, — а не одна реплика или весь разговор. Оставьте пустым, чтобы использовать значение по умолчанию (8192 для обоих). Уменьшите его для моделей с лимитом вывода ниже 8192; слишком малое значение может обрезать расшифровку.",
defaultBriefingTitle: "Брифинг по умолчанию",
created: "Создано {{time}}",
details: "Детали",

View file

@ -678,7 +678,7 @@ export const trTR = {
segments: "Segmentler",
maxTokens: "Maksimum çıktı token sayısı",
maxTokensPlaceholder: "Varsayılanlar için boş bırakın",
maxTokensHelp: "İsteğe bağlı. Her üretim adımının — taslak ve tam transkript — üretebileceği token sayısını sınırlar; her konuşma sırası veya sohbet başına bir sınır değildir. Yerleşik varsayılanları kullanmak için boş bırakın (taslak için 3000, transkript için 5000). Daha uzun bölümler için artırın; çok düşük bir değer transkripti yarıda kesebilir.",
maxTokensHelp: "İsteğe bağlı. Her üretim adımının — taslak ve tam transkript — üretebileceği token sayısını sınırlar; konuşma sırası veya sohbet başına bir sınır değildir. Varsayılanı kullanmak için boş bırakın (ikisi için de 8192). Çıktı sınırı 8192'nin altında olan modeller için düşürün; çok düşük bir değer transkripti kesebilir.",
defaultBriefingTitle: "Varsayılan brifing",
created: "{{time}} tarihinde oluşturuldu",
details: "Ayrıntılar",

View file

@ -678,7 +678,7 @@ export const zhCN = {
segments: "分段数量",
maxTokens: "最大输出令牌数",
maxTokensPlaceholder: "留空以使用默认值",
maxTokensHelp: "可选。限制每个生成步骤(大纲和完整文稿)可生成的令牌数,而不是每轮对话或整段对话的限制。留空则使用内置默认值(大纲为3000,文稿为5000)。制作较长的节目时可调高;数值过低可能会导致文稿被截断。",
maxTokensHelp: "可选。限制每个生成步骤(大纲和完整文稿)可生成的 token 数,而非每轮或整段对话的上限。留空则使用默认值(两者均为 8192)。对于输出上限低于 8192 的模型,请调低该值;数值过低可能会导致文稿被截断。",
defaultBriefingTitle: "默认简报",
created: "创建于 {{time}}",
details: "详情",

View file

@ -678,7 +678,7 @@ export const zhTW = {
segments: "分段數量",
maxTokens: "最大輸出權杖數",
maxTokensPlaceholder: "留空以使用預設值",
maxTokensHelp: "選填。限制每個生成步驟(大綱與完整逐字稿)可生成的權杖數,而非每輪對話或整段對話的限制。留空則使用內建預設值(大綱為3000,逐字稿為5000)。製作較長的節目時可調高;數值過低可能會使逐字稿被截斷。",
maxTokensHelp: "選填。限制每個生成步驟(大綱與完整逐字稿)可產生的 token 數,而非每輪或整段對話的上限。留空即使用預設值(兩者皆為 8192)。若模型的輸出上限低於 8192,請調低此值;數值過低可能導致逐字稿被截斷。",
defaultBriefingTitle: "預設簡報",
created: "建立於 {{time}}",
details: "詳情",

View file

@ -41,7 +41,7 @@ dependencies = [
"ai-prompter>=0.4,<1",
"esperanto>=2.28.0,<3",
"surrealdb>=1.0.4",
"podcast-creator>=0.13.0,<1",
"podcast-creator>=0.13.1,<1",
"surreal-commands>=1.3.1,<2",
"numpy>=2.4.1",
"pycountry>=26.2.16",

View file

@ -0,0 +1,63 @@
"""Our prompts/podcast templates shadow podcast-creator's bundled ones; they
must keep rendering with the variables podcast-creator 0.13 passes (#1435)."""
from types import SimpleNamespace
import pytest
SPEAKERS = [
SimpleNamespace(name="Ana", backstory="host", personality="curious"),
SimpleNamespace(name="Bruno", backstory="expert", personality="calm"),
]
@pytest.fixture(autouse=True)
def _repo_root(monkeypatch):
# podcast-creator resolves templates from ./prompts first.
from pathlib import Path
monkeypatch.chdir(Path(__file__).resolve().parent.parent)
def test_outline_template_renders():
from podcast_creator.core import get_outline_prompter
text = get_outline_prompter().render(
{
"briefing": "Explain RAG",
"num_segments": 3,
"context": "RAG combines retrieval and generation.",
"speakers": SPEAKERS,
"language": None,
}
)
assert "Explain RAG" in text
assert "segments" in text
# Ours, not the bundled template: only ours has the <think> output guidance.
assert "<think>" in text
@pytest.mark.parametrize("speakers", [SPEAKERS, SPEAKERS[:1]])
def test_transcript_template_renders(speakers):
from podcast_creator.core import get_transcript_prompter
segment = SimpleNamespace(name="Intro", description="What RAG is", size="short")
text = get_transcript_prompter().render(
{
"briefing": "Explain RAG",
"outline": SimpleNamespace(segments=[segment]),
"context": "RAG combines retrieval and generation.",
"segment": segment,
"is_final": True,
"turns": 3,
"speakers": speakers,
"speaker_names": [s.name for s in speakers],
"transcript": [],
"language": None,
}
)
assert "Intro" in text
for s in speakers:
assert s.name in text
# Ours, not the bundled template: only ours handles solo episodes.
assert ("SOLO podcast" in text) == (len(speakers) == 1)

8
uv.lock generated
View file

@ -2093,7 +2093,7 @@ requires-dist = [
{ name = "langgraph-checkpoint-sqlite", specifier = ">=3.1.1,<4" },
{ name = "loguru", specifier = ">=0.7.2" },
{ name = "numpy", specifier = ">=2.4.1" },
{ name = "podcast-creator", specifier = ">=0.13.0,<1" },
{ name = "podcast-creator", specifier = ">=0.13.1,<1" },
{ name = "pycountry", specifier = ">=26.2.16" },
{ name = "pydantic", specifier = ">=2.9.2" },
{ name = "python-dotenv", specifier = ">=1.2.2" },
@ -2403,7 +2403,7 @@ wheels = [
[[package]]
name = "podcast-creator"
version = "0.13.0"
version = "0.13.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "ai-prompter" },
@ -2421,9 +2421,9 @@ dependencies = [
{ name = "tenacity" },
{ name = "tiktoken" },
]
sdist = { url = "https://files.pythonhosted.org/packages/3c/23/e3e5ba947a672cd39dab0b0a726dfd8ce76638bf71d1ffbfc356cb3b9733/podcast_creator-0.13.0.tar.gz", hash = "sha256:d9bab87506d9b42605c6b18f0ab3035ccd1fde744d1736e3cdb3cf5d283296bb", size = 497734, upload-time = "2026-10-04T01:02:24.06Z" }
sdist = { url = "https://files.pythonhosted.org/packages/28/48/de36682853448f19cae28f7f08d9373cb8e52f25e45091a98ea66f08a682/podcast_creator-0.13.1.tar.gz", hash = "sha256:466efa8a3e29e38d74e906183a89a263adcd85ce3bb03b04c695cde30993b43c", size = 501038, upload-time = "2026-10-04T02:03:31.959Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/21/92/7cfa0b0c7992ea91ee1398d2ebe84a566159219f773402bef600055915c6/podcast_creator-0.13.0-py3-none-any.whl", hash = "sha256:e67d30fa8f4049fa3b4653b009cab6f69a3d5ed5ec551decae0901ab1be5b665", size = 82119, upload-time = "2026-10-04T01:02:22.522Z" },
{ url = "https://files.pythonhosted.org/packages/77/54/300b27534a32a6479ffa5d414df30ed825fbc86d83b935f25a24b1fb79ad/podcast_creator-0.13.1-py3-none-any.whl", hash = "sha256:481e76da6088c3316815a0ccba64029004fc2d4445daf8217a700c5d40239d1b", size = 83488, upload-time = "2026-10-04T02:03:30.873Z" },
]
[[package]]