open-notebook/pyproject.toml
Luis Novo 90dc008a90
chore(release): prepare v1.10.0 (#923)
* chore(release): prepare v1.10.0

* style: fix import ordering flagged by ruff

* fix(sources): return 404 for missing source and fix retry 500 from double-prefixed command id

- GET /sources/{id} mapped NotFoundError to a generic 500; now returns 404
- POST /sources/{id}/retry double-prefixed the command id (command:command:...),
  raising 'too many values to unpack' after queuing; align with the create path
- update retry test mock to realistic prefixed command id + guard against
  double-prefix; add 404 regression test

* fix(sources): mark failed extraction as failed so retry surfaces (#726)

content-core signals soft failures (unreachable/invalid URL) by returning
title=Error + 'Failed to extract content:' body instead of raising, and the
process_source command swallowed permanent ValueErrors into a success=False
result. Since surreal-commands marks a job completed when the function returns,
failed ingests showed status 'completed' and never offered the retry button.

- source graph: detect the content-core failure sentinel and raise
- process_source_command: re-raise ValueError (stop_on already prevents retry)
  so the job is marked failed and the source becomes retryable

* feat(notebook): per-type bulk context actions for sources and notes (#223)

- Sources context menu now offers 'insights only' (sources without insights
  are excluded rather than forced to full), 'full content', and 'exclude all'
- Add the same bulk Context menu to the Notes column (include all / exclude all)
- Bulk choices propagate to items loaded later via pagination
- New locale keys (includeAllInsights/includeAllFull) across all 14 locales
- Unit tests for the new bulk modes and note context helpers
2026-06-18 07:44:05 -03:00

103 lines
2.5 KiB
TOML

[project]
name = "open-notebook"
version = "1.10.0"
description = "An open source implementation of a research assistant, inspired by Google Notebook LM"
authors = [
{name = "Luis Novo", email = "lfnovo@gmail.com"}
]
readme = "README.md"
classifiers = [
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
]
requires-python = ">=3.11,<3.13"
dependencies = [
"fastapi>=0.104.0",
"uvicorn>=0.24.0",
"pydantic>=2.9.2",
"loguru>=0.7.2",
"langchain>=1.3.9",
"langgraph>=1.0.5",
"tiktoken>=0.12.0",
"langgraph-checkpoint-sqlite>=3.0.1",
"langchain-community>=0.4.1",
"langchain-openai>=1.1.14",
"langchain-anthropic>=1.4.6",
"langchain-ollama>=1.0.1",
"langchain-google-genai>=4.1.2",
"langchain-groq>=1.1.1",
"langchain_mistralai>=1.1.1",
"langchain_deepseek>=1.0.0",
"tomli>=2.0.2",
"python-dotenv>=1.2.2",
"httpx[socks]>=0.27.0",
"content-core>=1.14.1,<2",
"ai-prompter>=0.4,<1",
"esperanto>=2.20.0,<3",
"surrealdb>=1.0.4",
"podcast-creator>=0.12.0,<1",
"surreal-commands>=1.3.1,<2",
"numpy>=2.4.1",
"pycountry>=26.2.16",
"babel>=2.18.0",
]
[tool.setuptools]
package-dir = {"open_notebook" = "open_notebook"}
[tool.setuptools.package-data]
open_notebook = ["ai/assets/*"]
[project.optional-dependencies]
dev = [
"ipykernel>=6.29.5",
"ruff>=0.5.5",
"mypy>=1.11.1",
"types-requests>=2.32.0.20241016",
"ipywidgets>=8.1.5",
"pre-commit>=4.0.1",
"pytest>=9.0.3",
]
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[dependency-groups]
dev = [
"pre-commit>=4.1.0",
"pytest-asyncio>=1.2.0",
"ruff>=0.14.13",
"types-requests>=2.32.4.20250913",
]
[tool.isort]
profile = "black"
line_length = 88
[tool.ruff]
line-length = 88
[tool.ruff.lint]
select = ["E", "F", "I"]
ignore = [
"E501", # line too long
"E402", # module level import not at top of file (Streamlit requires this pattern)
"E722", # do not use bare except (legacy code pattern)
"F401", # imported but unused (may be used in type hints or re-exports)
"F541", # f-string without placeholders
"F841", # local variable assigned but never used
]
[tool.ruff.lint.per-file-ignores]
# Streamlit files need nest_asyncio.apply() before imports
"app_home.py" = ["E402"]
"pages/**/*.py" = ["E402"]
[tool.mypy]
# Exclude Streamlit UI pages from type checking
[[tool.mypy.overrides]]
module = "pages.*"
ignore_errors = true