Commit graph

615 commits

Author SHA1 Message Date
Luis Novo
22f06af0bc fix: invalidate sourcesInfinite query key on source creation (#526)
useCreateSource and useFileUpload only invalidated QUERY_KEYS.sources()
which doesn't match the infinite scroll query key used by the notebook
page (QUERY_KEYS.sourcesInfinite()). Added sourcesInfinite invalidation
to both hooks so the source list auto-refreshes after adding sources.
2026-04-06 07:05:02 -03:00
Luis Novo
992c23d524 chore: initial setup for source list auto-refresh fix (#526) 2026-04-06 06:51:57 -03:00
Luis Novo
a42e2a347e
Merge pull request #666 from lfnovo/fix/podcast-uuid-directory
fix: use UUID for podcast episode directory names
2026-03-11 19:11:28 -03:00
Luis Novo
e9040ef97b fix: extract build_episode_output_dir helper and test production code
Tests were reimplementing UUID logic locally instead of testing the
actual production code path. Extract the path-building logic into a
testable helper function and import it directly in tests.
2026-03-11 17:05:42 -05:00
Luis Novo
0619fa4d3b fix: use UUID for podcast episode directory names
Podcast episode names with spaces or special characters caused
filesystem errors when used directly as directory names.
Use UUID-based directory names instead, keeping the original
episode name in the database for display purposes.

Closes #663
2026-03-11 17:00:00 -05:00
Luis Novo
d0479b956c
Merge pull request #665 from lfnovo/fix/bump-esperanto-2.19.7
fix: bump esperanto to 2.19.7
2026-03-11 17:53:01 -03:00
Luis Novo
b7bba2461c fix: bump esperanto to 2.19.7 to fix base_url/api_key config in multiple embedding providers
Fixes the same kwargs vs self.* issue found in Azure, OpenAI, Voyage,
Google, and Jina embedding providers.
2026-03-11 15:51:52 -05:00
Luis Novo
4f934937e1
Merge pull request #664 from lfnovo/fix/bump-esperanto-2.19.6
fix: bump esperanto to 2.19.6 to fix Ollama embedding base_url
2026-03-11 16:46:44 -03:00
Luis Novo
06f8be8409 fix: bump esperanto to 2.19.6 to fix Ollama embedding base_url
The OllamaEmbeddingModel was ignoring the base_url from credentials/config,
always falling back to env vars or localhost. This caused embedding failures
for users with custom Ollama endpoints.

Fixes #655
2026-03-11 14:46:16 -05:00
Luis Novo
9dedf2e3cf
Merge pull request #660 from lfnovo/chore/bump-1.8.1
chore: bump version to 1.8.1
2026-03-10 22:21:49 -03:00
Luis Novo
803d9710c5 chore: bump version to 1.8.1 2026-03-10 20:20:16 -05:00
Luis Novo
2e952f61a9
Merge pull request #643 from kunalk16/feat-i18n-bangla-support
feat(i18n): support for bengali(bn-IN) language
2026-03-10 22:15:44 -03:00
Luis Novo
d975af2f7d fix(i18n): add Bengali date-fns locale mapping 2026-03-10 20:04:45 -05:00
Luis Novo
fdb5aa22e9
Merge pull request #659 from lfnovo/dependabot/npm_and_yarn/frontend/tar-7.5.11
chore(deps-dev): bump tar from 7.5.10 to 7.5.11 in /frontend
2026-03-10 21:58:34 -03:00
Luis Novo
15495d4305
Merge pull request #622 from orihatav/fix/offline-tiktoken-264
fix: handle tiktoken network errors in offline environments (issue #264)
2026-03-10 21:57:38 -03:00
dependabot[bot]
251a249357
chore(deps-dev): bump tar from 7.5.10 to 7.5.11 in /frontend
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.10 to 7.5.11.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.10...v7.5.11)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.11
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-11 00:47:23 +00:00
orihatav
5a350a7622 fix: narrow exception to (ImportError, OSError) and include error in log
Broad 'except Exception' could silently swallow unexpected failures.
URLError and ConnectionError are both subclasses of OSError, so
'except (ImportError, OSError)' captures all real offline/not-installed
cases while letting genuine programming errors propagate.

Also include the exception detail in the warning message so failures
are diagnosable in logs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 19:45:14 -05:00
orihatav
d0bbe4a921 fix: handle tiktoken network errors in offline environments (issue #264)
In air-gapped / offline Docker deployments, tiktoken.get_encoding() tries
to download the encoding file from openaipublic.blob.core.windows.net.
When that request fails it raises a URLError / OSError — not an ImportError
— so the previous except clause silently missed it and the crash surfaced in
the UI.

Widened `except ImportError` to `except Exception` so all failures —
"not installed" and "network unreachable" — fall through to the word-count
fallback (words × 1.3). Added a loguru WARNING so operators can see when
the fallback is active.

TIKTOKEN_CACHE_DIR now reads from the environment with a blank-safe
fallback (`or` guard prevents os.makedirs("") on empty env var). This lets
Docker images redirect the cache to a path outside /app/data/ so user-data
volume mounts cannot shadow the pre-baked encoding.

Both images now pre-download the o200k_base encoding during the builder
stage (internet is available at build time) and copy it into the runtime
image at /app/tiktoken-cache. ENV TIKTOKEN_CACHE_DIR=/app/tiktoken-cache
is set in the runtime stage so no network call is ever needed at runtime.

Added test_token_count_network_error_fallback in tests/test_utils.py:
patches tiktoken.get_encoding with a URLError and asserts token_count()
returns a positive int instead of raising.

Fixes #264

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 19:45:14 -05:00
dependabot[bot]
38d9ed5986
chore(deps-dev): bump rollup from 4.55.1 to 4.59.0 in /frontend (#635)
Bumps [rollup](https://github.com/rollup/rollup) from 4.55.1 to 4.59.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.55.1...v4.59.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.59.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:36:46 -03:00
dependabot[bot]
ec1cc216a9
chore(deps): bump langgraph from 1.0.6 to 1.0.10rc1 (#658)
Bumps [langgraph](https://github.com/langchain-ai/langgraph) from 1.0.6 to 1.0.10rc1.
- [Release notes](https://github.com/langchain-ai/langgraph/releases)
- [Commits](https://github.com/langchain-ai/langgraph/compare/1.0.6...1.0.10rc1)

---
updated-dependencies:
- dependency-name: langgraph
  dependency-version: 1.0.10rc1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:36:33 -03:00
dependabot[bot]
b6a7203ced
chore(deps-dev): bump tar from 7.5.9 to 7.5.10 in /frontend (#650)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.9 to 7.5.10.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.9...v7.5.10)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.10
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:35:53 -03:00
dependabot[bot]
1ed371c205
chore(deps): bump authlib from 1.6.6 to 1.6.7 (#649)
Bumps [authlib](https://github.com/authlib/authlib) from 1.6.6 to 1.6.7.
- [Release notes](https://github.com/authlib/authlib/releases)
- [Changelog](https://github.com/authlib/authlib/blob/main/docs/changelog.rst)
- [Commits](https://github.com/authlib/authlib/compare/v1.6.6...v1.6.7)

---
updated-dependencies:
- dependency-name: authlib
  dependency-version: 1.6.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:35:30 -03:00
dependabot[bot]
0ee5b8c9d8
chore(deps): bump lxml-html-clean from 0.4.3 to 0.4.4 (#646)
Bumps [lxml-html-clean](https://github.com/fedora-python/lxml_html_clean) from 0.4.3 to 0.4.4.
- [Changelog](https://github.com/fedora-python/lxml_html_clean/blob/main/CHANGES.rst)
- [Commits](https://github.com/fedora-python/lxml_html_clean/compare/0.4.3...0.4.4)

---
updated-dependencies:
- dependency-name: lxml-html-clean
  dependency-version: 0.4.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:35:20 -03:00
dependabot[bot]
eca96ea1d7
chore(deps): bump minimatch in /frontend (#634)
Bumps  and [minimatch](https://github.com/isaacs/minimatch). These dependencies needed to be updated together.

Updates `minimatch` from 3.1.2 to 3.1.5
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5)

Updates `minimatch` from 9.0.5 to 9.0.9
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 3.1.5
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 9.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:35:03 -03:00
Kunal Karmakar
9b45d84ab1
Upgrade default Azure API Version for testing and fetching models (#638) 2026-03-10 21:34:36 -03:00
dobberr
4f259e2166
Fixed surrealdb being stuck (#656)
Removed healthcheck comment and adjusted environment variables.
2026-03-10 21:33:25 -03:00
Luis Novo
d6b76f63a8
fix(deps): bump esperanto to 2.19.5 (#657) 2026-03-10 18:35:09 -03:00
Luis Novo
7910f683f6
fix(podcasts): enable language support by bumping podcast-creator to 0.12.0 (#645)
The language field on EpisodeProfile was being saved to the database but
had no effect during generation because podcast-creator 0.11.x didn't
support the language parameter. Version 0.12.0 adds language support to
the generation pipeline (outline + transcript templates), and since
open-notebook already passes the full episode profile config to
podcast-creator, the language field is picked up automatically.

Closes #640
2026-03-03 11:50:16 -03:00
Kunal Karmakar
f63cea573e Add i18n support for bengali(bn-IN) 2026-03-02 16:33:11 +00:00
Luis Novo
eac837d555
feat(podcasts): model registry integration, credential passthrough & new features (#632)
* feat(podcasts): integrate model registry for profiles and credential passthrough

Replace loose provider/model string fields with record<model> references
in podcast profiles, enabling credential passthrough to podcast-creator.

Backend:
- EpisodeProfile: outline_llm, transcript_llm (record<model>) replace
  outline_provider/outline_model strings. New language field (BCP 47).
- SpeakerProfile: voice_model (record<model>) replaces tts_provider/
  tts_model strings. Per-speaker voice_model override support.
- Migration 14: schema changes making legacy fields optional, adding new
  record<model> fields.
- Data migration (migration.py): auto-converts legacy profiles to model
  registry references on startup. Idempotent.
- podcast_commands.py: resolves credentials for ALL profiles before
  calling podcast-creator.
- New /api/languages endpoint (pycountry + babel) with BCP 47 locale
  codes (pt-BR, en-US, etc.).

Frontend:
- Episode/speaker profile forms use ModelSelector instead of manual
  provider/model dropdowns.
- Language dropdown with BCP 47 codes in episode profile form.
- Per-speaker TTS voice model override in speaker profile form.
- "Templates" tab renamed to "Profiles".
- Setup required badge on unconfigured profiles.
- i18n updated across all 8 locales.

Closes #486, closes #552

* fix(i18n): remove unused legacy podcast provider/model keys

Remove 10 orphaned i18n keys across all 8 locales that were left behind
after replacing manual provider/model dropdowns with ModelSelector.

* fix: address review violations in podcast model registry

- P1: Remove profiles with failed model resolution from dicts to prevent
  podcast-creator validation errors on unrelated profiles
- P2: Use centralized QUERY_KEYS.languages instead of inline key
- P3: Fix ISO 639-1 → BCP 47 in model field description and CLAUDE.md
- P3: Update "templates" → "profiles" in locale string values (all 8)

* chore: bump version to 1.8.0
2026-02-27 11:06:47 -03:00
Luis Novo
ce64a5f20c
fix(docker): pin SurrealDB version and fix single-container docs (#629)
- Replace curl-based SurrealDB install in Dockerfile.single with a
  multi-stage build that copies the binary from surrealdb/surrealdb:v2,
  aligning it with the version used in docker-compose.yml and preventing
  breakage when newer SurrealDB versions introduce syntax changes.
- Fix SURREAL_PASSWORD documentation in single-container.md: the actual
  password set in supervisord.single.conf is `root`, not `password`.

Closes #498
2026-02-25 20:32:29 -03:00
Luis Novo
c18952ef9d
fix(chat): remove 50-source cap from notebook chat context (#628)
* fix(chat): remove 50-source cap from notebook chat context

ChatColumn was independently fetching sources via useSources() which
defaults to a limit of 50 from the API. This caused the chat context
to always be capped at 50 sources regardless of how many are in the
notebook.

ChatColumn now receives sources as a prop from the parent NotebookPage,
which already fetches all sources via useNotebookSources with infinite
scroll pagination.

* test(chat): update ChatColumn tests for new sources prop interface
2026-02-25 19:31:20 -03:00
Zonghao Ye
a25a10f7e8
fix(ui): correct text orientation for CJK characters in collapsible column (#619) 2026-02-24 00:17:51 -03:00
Luis Novo
cfdf1bd903
Merge pull request #603 from lfnovo/fix/missing-surreal-namespace-database-env-vars
docs: add missing SURREAL_NAMESPACE and SURREAL_DATABASE env vars
2026-02-18 22:17:39 -03:00
Luis Novo
c7a457ee78 docs: add missing SURREAL_NAMESPACE and SURREAL_DATABASE env vars
The inline docker-compose example in README and the environment
variable reference tables in installation docs were missing these
two required variables, causing connection failures for users who
copy-pasted the examples instead of downloading the actual file.

Closes #592
2026-02-18 22:16:15 -03:00
Luis Novo
08441a3c7b
Merge pull request #600 from lfnovo/dependabot/npm_and_yarn/frontend/tar-7.5.9
chore(deps-dev): bump tar from 7.5.7 to 7.5.9 in /frontend
2026-02-18 16:30:38 -03:00
Luis Novo
37496f7506
Merge pull request #601 from lfnovo/fix/embedding-batch-sizing
fix: embedding batch sizing and 413 error classification (1.7.4)
2026-02-18 12:06:36 -03:00
Luis Novo
5d84ab0768 fix: embedding batch sizing and 413 error classification (1.7.4)
- Add batching to generate_embeddings() (50 texts per batch with per-batch retry)
  to prevent 413 Payload Too Large errors on large documents
- Add 413 error classification rule for user-friendly error messages
- Fix misleading "Created 0 embedded chunks" log in process_source_command
  by removing premature get_embedded_chunks() call (embedding is fire-and-forget)

Closes #594
2026-02-18 11:39:47 -03:00
dependabot[bot]
90cd0cc9e0
chore(deps-dev): bump tar from 7.5.7 to 7.5.9 in /frontend
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.7 to 7.5.9.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.7...v7.5.9)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-18 12:57:04 +00:00
Luis Novo
924cd88494
docs: update documentation for error handling and podcast retry (#599)
* docs: update CLAUDE.md and user docs for error handling and podcast retry

Add missing documentation for features introduced in v1.7.2 (#590) and
v1.7.3 (#595): error classification system, global exception handlers,
ConfigurationError, podcast failure recovery, and retry endpoint.

* chore: update uv.lock
2026-02-18 09:56:04 -03:00
Luis Novo
c666966b8c
fix: podcast failure recovery and retry (1.7.3) (#595)
* fix: surface podcast errors and enable retry for failed episodes

Fixes #335, #300

Re-raise exceptions in podcast command so surreal-commands marks jobs as
failed instead of completed. Surface error_message in API responses and
add a retry endpoint that deletes the failed episode and re-submits the
generation job. Frontend shows error details on failed episodes with a
retry button. Translations added for all 8 locales.

* fix: bump podcast-creator to >= 0.10

Fixes #302

* chore: release 1.7.3 - podcast failure recovery and retry

Bump podcast-creator to >= 0.11.2, disable automatic retries for
podcast generation to prevent duplicate episodes, and bump version
to 1.7.3.

Fixes #211, #218, #185, #355, #300, #302

* fix: resolve TypeScript error in handleRetry return type
2026-02-17 21:24:57 -03:00
Luis Novo
96525b4457
Merge pull request #544 from danrush777/fix/gemini-envelope-parsing
fix: handle structured content format in LLM response parsing
2026-02-17 17:39:19 -03:00
Luis Novo
189a30c570 fix: bump podcast-creator to >= 0.9.4
Fixes #211
2026-02-17 17:32:34 -03:00
Luis Novo
07c05ca354 fix: resolve merge conflicts and apply extract_text_content to all graphs
Resolve conflicts in ask.py and chat.py by merging the try/except error
handling from main with the extract_text_content helper from the PR.

Also apply the same fix to source_chat.py and transformation.py which
had the same vulnerable isinstance/str() pattern for structured LLM
response content (e.g. Gemini's envelope format).
2026-02-17 16:20:14 -03:00
Luis Novo
a3b13f8332
Merge pull request #591 from lfnovo/chore/release-1.7.2
chore: update changelog for 1.7.2 release
2026-02-16 17:00:58 -03:00
Luis Novo
e21b7888c4 chore: update changelog for 1.7.2 release
Add missing entries for PRs #583, #588, #589
2026-02-16 17:00:24 -03:00
Luis Novo
7070568941
Merge pull request #590 from lfnovo/feat/error-clarity-handling
feat: improve error clarity for LLM provider failures
2026-02-16 16:30:51 -03:00
Luis Novo
cb5ec9d65c fix: restore graceful fallback in get_default_model and truncate error messages
- Catch ConfigurationError alongside ValueError in get_default_model()
  to preserve graceful fallback after ValueError→ConfigurationError migration
- Add _truncate() helper to error_classifier to cap pass-through and
  default error messages at 200 chars, avoiding verbose internal details
2026-02-16 16:25:31 -03:00
Luis Novo
20e18fdd0d feat: improve error clarity for LLM provider failures (#506)
Replace generic "An unexpected error occurred" messages with descriptive,
user-friendly error messages when LLM operations fail. Errors like invalid
API keys, wrong model names, and rate limits now surface clearly in the UI.

Adds error classification utility, global FastAPI exception handlers, and
frontend getApiErrorMessage() helper. Bumps version to 1.7.2.
2026-02-16 16:15:46 -03:00
Luis Novo
b1101305f6
Merge pull request #589 from lfnovo/fix/empty-source-content-validation
fix: fail fast when source content extraction returns empty
2026-02-16 15:30:50 -03:00