build: drop the hermes-agent[hindsight] extra

The catalog plugin declares hindsight-client in its own plugin.yaml and the
plugin installer resolves it (into HERMES_LAZY_INSTALL_TARGET on the sealed
Docker image), so the pyproject extra, its exclude-newer entry and every
consumer that pre-installed it — the Dockerfile, the nix full package /
module examples / check override, and the CI `uv sync` matrices — stop naming
it. uv.lock regenerated with `uv lock` (only the hindsight-client package and
the extra leave the lock; the exclude-newer block is re-sorted by uv).
This commit is contained in:
teknium1
2026-09-22 22:15:24 -07:00
committed by Teknium
parent 4cbf862abe
commit 73c598e319
10 changed files with 109 additions and 136 deletions

View File

@@ -92,7 +92,7 @@ jobs:
# because it could not build here).
uses: ./.github/actions/retry
with:
command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra hindsight --extra parallel-web
command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra parallel-web
- name: Minimize uv cache
run: uv cache prune --ci

View File

@@ -73,14 +73,14 @@ jobs:
# The trailing extras beyond all/dev are the lazy-install features
# (tools/lazy_deps.py) that tests exercise for real: provider.anthropic,
# stt/tts.mistral, image.fal, terminal.modal, terminal.daytona,
# memory.hindsight, search.parallel. The hermetic test env forbids
# search.parallel. The hermetic test env forbids
# mid-run pip installs (HERMES_DISABLE_LAZY_INSTALLS=1 in
# tests/conftest.py), so the SDKs those tests need must be in the
# venv up front — resolved from uv.lock like everything else, which
# also honors the exact supply-chain pins these extras carry.
uses: ./.github/actions/retry
with:
command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra hindsight --extra parallel-web
command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra parallel-web
- name: Minimize uv cache
# Optimized for CI: prunes pre-built wheels that are cheap to
@@ -204,7 +204,7 @@ jobs:
# in the venv up front.
uses: ./.github/actions/retry
with:
command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra hindsight --extra parallel-web
command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra parallel-web
- name: Minimize uv cache
# Optimized for CI: prunes pre-built wheels that are cheap to

View File

@@ -247,12 +247,10 @@ RUN cd plugins/platforms/photon/sidecar && \
# Health export is enabled. Collector and observability-backend dependencies
# remain external and are not part of the Hermes production image.
#
# The hindsight memory provider's client (hindsight-client) is baked in
# for the same reason: it lazy-installs into /opt/hermes/.venv at first
# use, which lives inside the (immutable) image layer rather than the
# mounted /opt/data volume, so it is lost on every container recreate /
# image update and recall/retain then fails with
# `ModuleNotFoundError: No module named 'hindsight_client'` (#38128).
# Catalog memory plugins (e.g. hindsight, since it left the tree) are not
# baked in: their pip dependencies install at plugin-install time through
# tools/lazy_deps.py into HERMES_LAZY_INSTALL_TARGET (the durable /opt/data
# volume, see below), so they survive container recreates (#38128).
#
# The Matrix gateway's deps ([matrix] extra) are baked in because
# python-olm (transitive via mautrix[encryption]) builds from source on
@@ -269,7 +267,7 @@ RUN cd plugins/platforms/photon/sidecar && \
# The editable link is created after the source copy below.
COPY pyproject.toml uv.lock ./
RUN touch ./README.md
RUN uv sync --frozen --no-install-project --extra all --extra messaging --extra otlp --extra anthropic --extra bedrock --extra azure-identity --extra hindsight --extra matrix --extra google-chat
RUN uv sync --frozen --no-install-project --extra all --extra messaging --extra otlp --extra anthropic --extra bedrock --extra azure-identity --extra matrix --extra google-chat
# ---------- Frontend build (cached independently from Python source) ----------
# Copy only the frontend source trees first so that Python-only changes don't

View File

@@ -380,7 +380,7 @@ json.dump(sorted(leaf_paths(DEFAULT_CONFIG)), sys.stdout, indent=2)
# IS the default package, so a launcher that pinned the plain
# default would look correct while it shipped a second
# runtime to anyone who customises theirs.
extraDependencyGroups = [ "hindsight" ];
extraDependencyGroups = [ "honcho" ];
backend = {
mode = "serve";
port = 9231;

View File

@@ -3,7 +3,7 @@
# callPackage auto-wires nixpkgs args; flake inputs are passed explicitly.
# Users override via:
# pkgs.hermes-agent.override { extraPythonPackages = [...]; }
# pkgs.hermes-agent.override { extraDependencyGroups = [ "hindsight" ]; }
# pkgs.hermes-agent.override { extraDependencyGroups = [ "honcho" ]; }
{
lib,
stdenv,

View File

@@ -471,10 +471,10 @@ let
dependencies — no PYTHONPATH patching or collision risk.
Use this for optional extras already declared in hermes-agent's
pyproject.toml (e.g. "hindsight", "honcho", "voice").
pyproject.toml (e.g. "honcho", "voice").
Use extraPythonPackages for external packages not in pyproject.toml.
'';
example = [ "hindsight" ];
example = [ "honcho" ];
};
# ── Service behaviour ──────────────────────────────────────────────

View File

@@ -33,7 +33,6 @@
"fal"
"feishu"
"firecrawl"
"hindsight"
"honcho"
"messaging"
"modal"

View File

@@ -74,8 +74,8 @@ dependencies = [
# ``packaging`` is imported directly on three production paths but was never
# declared, so it only reached users transitively (pip/uv pull it for other
# tools). The slim official Docker image ships without it, where the
# try/except-ImportError fallbacks silently degrade: Hindsight's
# ``_meets_minimum_version`` disables update_mode='append' (#40503),
# try/except-ImportError fallbacks silently degrade: memory plugins'
# version compares disable features (#40503),
# tools/lazy_deps.py treats every version constraint as satisfied, and
# hermes_cli/main.py drops to naive requirement parsing. Pure-Python
# py3-none-any wheel, no compiled extensions — safe to ship everywhere.
@@ -217,7 +217,6 @@ edge-tts = ["edge-tts==7.2.7"]
modal = ["modal==1.3.4"]
daytona = ["daytona==0.155.0"]
vercel = ["vercel==0.7.2"]
hindsight = ["hindsight-client==0.6.1"]
dev = ["debugpy==1.8.20", "pytest==9.1.1", "pytest-asyncio==1.3.0", "mcp==2.0.0", "httpx2==2.7.0", "starlette==1.3.1", "ty==0.0.21", "ruff==0.15.10", "setuptools==83.0.0"] # starlette: CVE-2026-48710; setuptools: 83 (torch >=2.13 requires setuptools 83)
messaging = ["python-telegram-bot[webhooks]==22.8", "discord.py[voice]==2.7.1", "aiohttp==3.14.3", "brotlicffi==1.2.0.2", "slack-bolt==1.30.0", "slack-sdk==3.44.1", "qrcode==7.4.2"] # aiohttp 3.14.3: prior CVEs + GHSA-cq5v-8q36-5273/GHSA-mfx4-hv73-q22v/GHSA-mq44-7p77-q5h7
cron = [] # croniter is now a core dependency; this extra kept for back-compat
@@ -260,9 +259,9 @@ honcho = ["honcho-ai==2.2.0"]
# Cloud memory providers — opt-in, lazy-installed via tools/lazy_deps.py
# (memory.supermemory / memory.mem0) at first use. Where BOTH pin exactly the
# versions MUST match (enforced by tests/test_project_metadata.py); LAZY_DEPS
# entries that mirror a plugin.yaml range (mem0ai, hindsight-client) keep the
# entries that mirror a plugin.yaml range (mem0ai) keep the
# extra as the floor install and never downgrade a newer compatible release.
# Deliberately excluded from [all] like honcho/hindsight so a quarantined
# Deliberately excluded from [all] like honcho so a quarantined
# upstream release can't break fresh installs.
supermemory = ["supermemory==3.50.0"]
mem0 = ["mem0ai==2.0.10"]
@@ -533,7 +532,6 @@ google-auth-httplib2 = false
google-auth-oauthlib = false
google-cloud-pubsub = false
h2 = false
hindsight-client = false
honcho-ai = false
httplib2 = false
httpx = false

View File

@@ -71,7 +71,7 @@ def test_lazy_installable_extras_excluded_from_all():
"voice", # faster-whisper / sounddevice / numpy
"modal", "daytona", "vercel",
"messaging", "slack", "matrix", "dingtalk", "feishu", "google-chat",
"honcho", "hindsight",
"honcho",
"supermemory", "mem0",
"mistral", # mistralai — Voxtral STT/TTS, lazy-installed (stt.mistral / tts.mistral)
}

204
uv.lock generated
View File

@@ -12,105 +12,104 @@ exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for
exclude-newer-span = "P14D"
[options.exclude-newer-package]
elevenlabs = false
setuptools = false
modal = false
pyyaml = false
maturin = false
numpy = false
pvporcupine = false
google-auth = false
aiohttp = false
starlette = false
mistralai = false
firecrawl-py = false
parallel-web = false
markdown = false
opentelemetry-sdk = false
prompt-toolkit = false
fastapi = false
anthropic = false
pathspec = false
openwakeword = false
defusedxml = false
ruff = false
exa-py = false
mcp = false
python-olm = false
wheel = false
websockets = false
pytest = false
pillow = false
setuptools-rust = false
tenacity = false
pyjwt = false
slack-bolt = false
fal-client = false
asyncpg = false
boto3 = false
ruamel-yaml = false
sherpa-onnx = false
huggingface-hub = false
pytest-asyncio = false
google-cloud-pubsub = false
slack-sdk = false
discord-py = false
honcho-ai = false
faster-whisper = false
certifi = false
debugpy = false
packaging = false
rich = false
supermemory = false
unpaddedbase64 = false
h2 = false
youtube-transcript-api = false
edge-tts = false
microsoft-teams-apps = false
aiohttp-socks = false
agent-client-protocol = false
ai-edge-litert = false
onnxruntime = false
croniter = false
opentelemetry-exporter-otlp-proto-http = false
azure-identity = false
lark-oapi = false
sentencepiece = false
firecrawl-anydoc = false
google-api-python-client = false
brotlicffi = false
mem0ai = false
qrcode = false
vercel = false
aiohttp = false
aiohttp-socks = false
aiosqlite = false
tzdata = false
python-dotenv = false
alibabacloud-dingtalk = false
anthropic = false
asyncpg = false
azure-identity = false
boto3 = false
brotlicffi = false
certifi = false
concurrent-log-handler = false
croniter = false
cryptography = false
daytona = false
uvicorn = false
nemo-relay = false
requests = false
debugpy = false
defusedxml = false
dingtalk-stream = false
discord-py = false
edge-tts = false
elevenlabs = false
exa-py = false
fal-client = false
fastapi = false
faster-whisper = false
fire = false
firecrawl-anydoc = false
firecrawl-py = false
google-api-python-client = false
google-auth = false
google-auth-httplib2 = false
google-auth-oauthlib = false
google-cloud-pubsub = false
h2 = false
honcho-ai = false
httplib2 = false
httpx = false
pyasn1 = false
snowballstemmer = false
concurrent-log-handler = false
cryptography = false
pydantic = false
agent-client-protocol = false
fire = false
httpx2 = false
google-auth-oauthlib = false
python-multipart = false
ty = false
openai = false
mautrix = false
google-auth-httplib2 = false
python-telegram-bot = false
psutil = false
huggingface-hub = false
jinja2 = false
hindsight-client = false
lark-oapi = false
markdown = false
maturin = false
mautrix = false
mcp = false
mem0ai = false
microsoft-teams-apps = false
mistralai = false
modal = false
nemo-relay = false
numpy = false
onnxruntime = false
openai = false
opentelemetry-exporter-otlp-proto-http = false
opentelemetry-sdk = false
openwakeword = false
packaging = false
parallel-web = false
pathspec = false
pillow = false
prompt-toolkit = false
psutil = false
pvporcupine = false
pyasn1 = false
pydantic = false
pyjwt = false
pytest = false
pytest-asyncio = false
python-dotenv = false
python-multipart = false
python-olm = false
python-telegram-bot = false
pyyaml = false
qrcode = false
requests = false
rich = false
ruamel-yaml = false
ruff = false
sentencepiece = false
setuptools = false
setuptools-rust = false
sherpa-onnx = false
slack-bolt = false
slack-sdk = false
snowballstemmer = false
sounddevice = false
alibabacloud-dingtalk = false
dingtalk-stream = false
starlette = false
supermemory = false
tenacity = false
ty = false
tzdata = false
unpaddedbase64 = false
uvicorn = false
vercel = false
websockets = false
wheel = false
youtube-transcript-api = false
[manifest]
overrides = [
@@ -1860,9 +1859,6 @@ google-chat = [
{ name = "httplib2" },
{ name = "pyasn1" },
]
hindsight = [
{ name = "hindsight-client" },
]
homeassistant = [
{ name = "aiohttp" },
]
@@ -2054,7 +2050,6 @@ requires-dist = [
{ name = "hermes-agent", extras = ["web"], marker = "extra == 'all'" },
{ name = "hermes-agent", extras = ["web"], marker = "extra == 'termux-all'" },
{ name = "hermes-agent", extras = ["youtube"], marker = "extra == 'all'" },
{ name = "hindsight-client", marker = "extra == 'hindsight'", specifier = "==0.6.1" },
{ name = "honcho-ai", marker = "extra == 'honcho'", specifier = "==2.2.0" },
{ name = "httplib2", marker = "extra == 'google'", specifier = "==0.32.0" },
{ name = "httplib2", marker = "extra == 'google-chat'", specifier = "==0.32.0" },
@@ -2139,7 +2134,7 @@ requires-dist = [
{ name = "websockets", specifier = "==15.0.1" },
{ name = "youtube-transcript-api", marker = "extra == 'youtube'", specifier = "==1.2.4" },
]
provides-extras = ["uvloop", "anthropic", "exa", "firecrawl", "parallel-web", "fal", "edge-tts", "modal", "daytona", "vercel", "hindsight", "dev", "messaging", "cron", "slack", "matrix", "wecom", "tts-premium", "voice", "wake", "honcho", "supermemory", "mem0", "vision", "pty", "mcp", "nemo-relay", "homeassistant", "sms", "teams", "computer-use", "acp", "mistral", "otlp", "bedrock", "vertex", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "google-chat", "youtube", "web", "all"]
provides-extras = ["uvloop", "anthropic", "exa", "firecrawl", "parallel-web", "fal", "edge-tts", "modal", "daytona", "vercel", "dev", "messaging", "cron", "slack", "matrix", "wecom", "tts-premium", "voice", "wake", "honcho", "supermemory", "mem0", "vision", "pty", "mcp", "nemo-relay", "homeassistant", "sms", "teams", "computer-use", "acp", "mistral", "otlp", "bedrock", "vertex", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "google-chat", "youtube", "web", "all"]
[[package]]
name = "hf-xet"
@@ -2157,23 +2152,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/39/c6/988383e9dc17294d536fcbcd6fd16eed882e411ad16c954984a53e47b09c/hf_xet-1.5.2-cp38-abi3-win_arm64.whl", hash = "sha256:1da28519496eb7c8094c11e4d25509b4a468457a0302d58136099db2fd9a671d", size = 3816957, upload-time = "2026-07-16T17:29:54.991Z" },
]
[[package]]
name = "hindsight-client"
version = "0.6.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "aiohttp" },
{ name = "aiohttp-retry" },
{ name = "pydantic" },
{ name = "python-dateutil" },
{ name = "typing-extensions" },
{ name = "urllib3" },
]
sdist = { url = "https://files.pythonhosted.org/packages/33/26/8b8efa4be21fc3ba12ade3b1353d87f9837ec0d3ec2607e8adbf85bc9c63/hindsight_client-0.6.1.tar.gz", hash = "sha256:314d0bb9e13622e15586ba1586a799726d405b27bc20d78872474b5d6d96cd51", size = 99833, upload-time = "2026-05-08T13:01:23.537Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/24/4f/a1d0bc33ef933ecc52e76dc1514163594d25836a5d303c256a61bb61445d/hindsight_client-0.6.1-py3-none-any.whl", hash = "sha256:9fdda176ab50f7cec8d7339c6608c148f0cd9ad7e65d9d76192f2db730bc330a", size = 249379, upload-time = "2026-05-08T13:01:22.035Z" },
]
[[package]]
name = "honcho-ai"
version = "2.2.0"