Merge pull request #122125 from NousResearch/fix/drop-stale-hindsight-extra

fix(pm): hermes update no longer fails on the stale hindsight extra (#122071, salvage #122092)
This commit is contained in:
ethernet
2026-09-24 22:16:49 -04:00
committed by GitHub
12 changed files with 14 additions and 46 deletions

View File

@@ -84,7 +84,7 @@ jobs:
# the verified Git pin once, before per-file parallelism; otherwise
# each isolated PowerShell stage races to download/extract the archive.
packages: ${{ matrix.marker == 'windows' && 'git,ripgrep' || 'ripgrep' }}
extras: '["all", "telegram", "anthropic", "mistral", "fal", "modal", "daytona", "hindsight", "parallel-web"]'
extras: '["all", "telegram", "anthropic", "mistral", "fal", "modal", "daytona", "parallel-web"]'
test-environment: 'true'
prune-python-cache: true
@@ -194,7 +194,7 @@ jobs:
uses: ./.github/actions/setup-pm
with:
packages: git,ripgrep
extras: '["all", "telegram", "anthropic", "mistral", "fal", "modal", "daytona", "hindsight", "parallel-web"]'
extras: '["all", "telegram", "anthropic", "mistral", "fal", "modal", "daytona", "parallel-web"]'
test-environment: 'true'
prune-python-cache: true

View File

@@ -44,7 +44,7 @@ jobs:
- name: Set up locked Python and test dependencies
uses: ./.github/actions/setup-pm
with:
extras: '["all", "anthropic", "bedrock", "mistral", "fal", "modal", "daytona", "hindsight", "parallel-web"]'
extras: '["all", "anthropic", "bedrock", "mistral", "fal", "modal", "daytona", "parallel-web"]'
test-environment: 'true'
prune-python-cache: true
@@ -143,7 +143,7 @@ jobs:
uses: ./.github/actions/setup-pm
with:
toolchain: all
extras: '["all", "anthropic", "bedrock", "mistral", "fal", "modal", "daytona", "hindsight", "parallel-web"]'
extras: '["all", "anthropic", "bedrock", "mistral", "fal", "modal", "daytona", "parallel-web"]'
test-environment: 'true'
prune-python-cache: true

View File

@@ -259,13 +259,6 @@ FROM runtime_base AS python_deps
# 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).
#
# The Matrix gateway's deps ([matrix] extra) are baked in because
# python-olm (transitive via mautrix[encryption]) builds from source on
# Python/image combinations without usable wheels. The Docker image is
@@ -283,7 +276,7 @@ RUN touch ./README.md
RUN python3 -m pm.build_env --source /opt/hermes --python /usr/local/bin/python3 \
--out /opt/hermes/.venv --no-install-project --sealed \
--extra all --extra messaging --extra otlp --extra anthropic --extra bedrock \
--extra azure-identity --extra hindsight --extra matrix --extra google-chat
--extra azure-identity --extra matrix --extra google-chat
# Icons render on the runtime environment: Pillow and resvg-py are core
# dependencies. A stage of its own so the frontend stage keeps building its

View File

@@ -421,7 +421,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

@@ -474,10 +474,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

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

View File

@@ -41,7 +41,6 @@ ANCHORS: dict[str, str | tuple[str, ...]] = {
"wake-porcupine": "pvporcupine",
"fal": "fal_client",
"honcho": "honcho",
"hindsight": "hindsight_client",
"supermemory": "supermemory",
"mem0": "mem0",
"messaging": "telegram",

View File

@@ -254,7 +254,6 @@ piper = [
modal = ["modal==1.3.4"]
daytona = ["daytona==0.155.0"]
vercel = ["vercel==0.7.2"]
hindsight = ["hindsight-client==0.6.1"]
google-meet = ["playwright==1.62.0", "websockets==15.0.1"]
messaging = [
"python-telegram-bot[webhooks]==22.8",
@@ -362,7 +361,7 @@ google-chat = [
doc-extract = ["firecrawl-anydoc==0.2.4"]
trace-upload = ["huggingface-hub==1.24.0"]
# Cloud memory providers are opt-in PM extras. They stay outside [all],
# like honcho/hindsight, so a quarantined release cannot break fresh installs.
# like honcho, so a quarantined release cannot break fresh installs.
supermemory = ["supermemory==3.50.0"]
# mem0ai pulls qdrant-client → grpcio, which has no win_arm64 wheel — same
# win32-arm64 gate as google-chat. mem0 is lazy-installed, so on arm64 the
@@ -723,7 +722,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

@@ -126,7 +126,6 @@ def test_available_missing_module():
@pytest.mark.parametrize(("extra", "module"), [
("hindsight", "hindsight_client"),
("teams", "microsoft_teams.apps"),
])
def test_available_counts_sys_modules_fakes(monkeypatch, extra, module):
@@ -230,6 +229,7 @@ def test_legacy_selection_carries_extras_the_main_era_venv_lazily_installed(monk
(site / "google").mkdir()
(site / "google" / "auth").mkdir()
(site / "exa_py.cpython-311-x86_64-linux-gnu.so").write_bytes(b"")
(site / "hindsight_client").mkdir()
selection = extras.legacy_selection(tmp_path)
@@ -237,6 +237,7 @@ def test_legacy_selection_carries_extras_the_main_era_venv_lazily_installed(monk
assert {"fal", "telegram", "vertex", "exa"} <= set(selection)
assert "messaging" not in selection
assert "piper" not in selection
assert "hindsight" not in selection # Catalog plugin owns this dependency, not a core extra.
assert extras.legacy_selection(tmp_path / "no-venv") == ["all"]

View File

@@ -119,7 +119,7 @@ def test_lazy_installable_extras_excluded_from_all():
"telegram", "discord",
"wake", "wake-openwakeword", "wake-sherpa", "wake-porcupine",
"google-chat",
"honcho", "hindsight",
"honcho",
"supermemory", "mem0",
"mistral", # mistralai — Voxtral STT/TTS, lazy-installed (stt.mistral / tts.mistral)
}

24
uv.lock generated
View File

@@ -112,7 +112,6 @@ google-auth-httplib2 = false
psutil = false
python-telegram-bot = false
jinja2 = false
hindsight-client = false
sounddevice = false
alibabacloud-dingtalk = false
dingtalk-stream = false
@@ -2442,9 +2441,6 @@ google-meet = [
{ name = "playwright" },
{ name = "websockets" },
]
hindsight = [
{ name = "hindsight-client" },
]
homeassistant = [
{ name = "aiohttp" },
]
@@ -2686,7 +2682,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 = "httptools", marker = "python_full_version >= '3.14'", specifier = ">=0.6.3,<0.9" },
@@ -2788,7 +2783,7 @@ requires-dist = [
{ name = "winrt-windows-services-store", marker = "python_full_version >= '3.14' and sys_platform == 'win32'", specifier = ">=3.2.1,<4" },
{ name = "youtube-transcript-api", marker = "extra == 'youtube'", specifier = "==1.2.4" },
]
provides-extras = ["uvloop", "anthropic", "exa", "firecrawl", "parallel-web", "ddgs", "fal", "edge-tts", "neutts", "kittentts", "piper", "modal", "daytona", "vercel", "hindsight", "google-meet", "messaging", "cron", "slack", "matrix", "wecom", "tts-premium", "voice", "wake", "honcho", "telegram", "discord", "stt-whisper", "audio-io", "silk", "wake-openwakeword", "wake-sherpa", "wake-porcupine", "google-chat", "doc-extract", "trace-upload", "supermemory", "mem0", "vision", "pty", "mcp", "nemo-relay", "homeassistant", "sms", "teams", "computer-use", "acp", "mistral", "otlp", "langfuse", "bedrock", "vertex", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "youtube", "web", "all"]
provides-extras = ["uvloop", "anthropic", "exa", "firecrawl", "parallel-web", "ddgs", "fal", "edge-tts", "neutts", "kittentts", "piper", "modal", "daytona", "vercel", "google-meet", "messaging", "cron", "slack", "matrix", "wecom", "tts-premium", "voice", "wake", "honcho", "telegram", "discord", "stt-whisper", "audio-io", "silk", "wake-openwakeword", "wake-sherpa", "wake-porcupine", "google-chat", "doc-extract", "trace-upload", "supermemory", "mem0", "vision", "pty", "mcp", "nemo-relay", "homeassistant", "sms", "teams", "computer-use", "acp", "mistral", "otlp", "langfuse", "bedrock", "vertex", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "youtube", "web", "all"]
[package.metadata.requires-dev]
dev = [
@@ -2831,23 +2826,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/73/63/ca511b6f802f28cf3489b280fe77475bcca8de85e81a6299d7916b5b5555/hf_xet-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:3dc3e35441ba395006af5aaacc40ef2e603c51ef46c3530b9156185f00935ea3", size = 3859359, upload-time = "2026-08-03T22:33:11.725Z" },
]
[[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"