feat(hf): wire HF agents into compose, fix ModelFilter compat, add test suite - #2113
Conversation
…lter compat, add tests The CRUSH_GLM52_LANES handoff doc claimed C1/C2 service code didn't exist and C5 submodule needed syncing. Verification on main showed all three were stale: - C1/C2 service code ALREADY EXISTS (hf-agent, hf-research-agent) — just never wired into docker-compose.yml. Handoff used underscore naming (hf_agent); actual paths use hyphens (hf-agent). - C5 huggingface-skills submodule ALREADY past target SHA (0190417b4 > 221f5f78). Real gaps fixed: 1. Compose wiring: hf-agent (8201) + hf-research-agent (8202) added under ["agents", "research"] profiles with tier-agent-hardened anchors, NATS depends_on, healthchecks, HF_TOKEN secrets wiring. 2. ModelFilter compat: huggingface_hub >= 1.0 removed ModelFilter. hf-agent now has _build_list_models_kwargs() shim supporting both old and new APIs. hf-mcp-server had unused ModelFilter import removed. 3. publish_dataset.py: ClickHouse path now degrades gracefully on connection refused (matches existing Supabase pattern). 4. hf-mcp-server: README compose/test paths fixed, CLAUDE.md added. 5. 19 unit tests covering all 3 HF services (discovery payload contract, scoring rubric, catalog shape, path traversal safety, search filters). Tests: 19/19 pass. Compose renders clean for --profile research. 💘 Generated with Crush Assisted-by: Crush:glm-5.2
|
Warning Review limit reached
Next review available in: 16 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (7)
📝 WalkthroughWalkthroughAdds two HuggingFace agent services with NATS integration, version-compatible model discovery, resilient ClickHouse dataset publishing, MCP documentation updates, Compose classification, and comprehensive service tests. ChangesHuggingFace service integration
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant hf-agent
participant HuggingFace Hub
participant NATS
participant hf-research-agent
hf-agent->>HuggingFace Hub: Poll filtered models
HuggingFace Hub-->>hf-agent: Return model metadata
hf-agent->>NATS: Publish hf.model.discovered.v1
NATS->>hf-research-agent: Deliver discovered model
hf-research-agent->>NATS: Publish hf.model.evaluated.v1
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Docker Hardening ValidationHardening Validation ReportValidated: Mon Jul 13 20:14:51 UTC 2026Services CheckedPMOVES.AI Docker Hardening Validation[INFO] Checking: pmoves/docker-compose.hardened.yml [INFO] Validating: hi-rag-gateway-v2 [INFO] Validating: extract-worker [INFO] Validating: langextract [INFO] Validating: presign [INFO] Validating: render-webhook [INFO] Validating: retrieval-eval [INFO] Validating: pdf-ingest [INFO] Validating: jellyfin-bridge [INFO] Validating: invidious-companion-proxy [INFO] Validating: ffmpeg-whisper [INFO] Validating: media-video [INFO] Validating: media-audio [INFO] Validating: hi-rag-gateway-v2-gpu [INFO] Validating: hi-rag-gateway-gpu [INFO] Validating: deepresearch [INFO] Validating: supaserch [INFO] Validating: publisher-discord [INFO] Validating: mesh-agent [INFO] Validating: nats-echo-req [INFO] Validating: nats-echo-res [INFO] Validating: comfy-watcher [INFO] Validating: grayjay-plugin-host [INFO] Validating: agent-zero [INFO] Validating: archon [INFO] Validating: channel-monitor [INFO] Validating: pmoves-yt [INFO] Validating: notebook-sync [INFO] Validating: supabase_service_role_key [INFO] Validating: supabase_jwt_secret ====================================== |
…l entry CLAIM/RELEASE block for PR #2113 (feat/hf-services-wiring-and-tests). Documents the stale-handoff discovery and the 5 real gaps closed. 💘 Generated with Crush Assisted-by: Crush:glm-5.2
Docker Hardening ValidationHardening Validation ReportValidated: Mon Jul 13 20:15:32 UTC 2026Services CheckedPMOVES.AI Docker Hardening Validation[INFO] Checking: pmoves/docker-compose.hardened.yml [INFO] Validating: hi-rag-gateway-v2 [INFO] Validating: extract-worker [INFO] Validating: langextract [INFO] Validating: presign [INFO] Validating: render-webhook [INFO] Validating: retrieval-eval [INFO] Validating: pdf-ingest [INFO] Validating: jellyfin-bridge [INFO] Validating: invidious-companion-proxy [INFO] Validating: ffmpeg-whisper [INFO] Validating: media-video [INFO] Validating: media-audio [INFO] Validating: hi-rag-gateway-v2-gpu [INFO] Validating: hi-rag-gateway-gpu [INFO] Validating: deepresearch [INFO] Validating: supaserch [INFO] Validating: publisher-discord [INFO] Validating: mesh-agent [INFO] Validating: nats-echo-req [INFO] Validating: nats-echo-res [INFO] Validating: comfy-watcher [INFO] Validating: grayjay-plugin-host [INFO] Validating: agent-zero [INFO] Validating: archon [INFO] Validating: channel-monitor [INFO] Validating: pmoves-yt [INFO] Validating: notebook-sync [INFO] Validating: supabase_service_role_key [INFO] Validating: supabase_jwt_secret ====================================== |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7ae3d10f47
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Addresses Codex P1 review comment: adding hf-agent/hf-research-agent only to docker-compose.yml left the generated overlays stale (compose-split-check drift gate was failing). Root cause: split_compose.py SERVICE_GROUPS had no entry for hf-agent or hf-research-agent, so the splitter's fallback dumped them into docker-compose.core.yml. Fix: 1. Added hf-agent + hf-research-agent to the "agents" group in SERVICE_GROUPS 2. Ran `make compose-split` to regenerate all overlays 3. Verified drift gate: hf-agent + hf-research-agent now in agents.yml (12 refs) 4. workers.yml normalised (pre-existing comment/deploy artifact cleaned by regen) 💘 Generated with Crush Assisted-by: Crush:glm-5.2
Docker Hardening ValidationHardening Validation ReportValidated: Mon Jul 13 21:47:39 UTC 2026Services CheckedPMOVES.AI Docker Hardening Validation[INFO] Checking: pmoves/docker-compose.hardened.yml [INFO] Validating: hi-rag-gateway-v2 [INFO] Validating: extract-worker [INFO] Validating: langextract [INFO] Validating: presign [INFO] Validating: render-webhook [INFO] Validating: retrieval-eval [INFO] Validating: pdf-ingest [INFO] Validating: jellyfin-bridge [INFO] Validating: invidious-companion-proxy [INFO] Validating: ffmpeg-whisper [INFO] Validating: media-video [INFO] Validating: media-audio [INFO] Validating: hi-rag-gateway-v2-gpu [INFO] Validating: hi-rag-gateway-gpu [INFO] Validating: deepresearch [INFO] Validating: supaserch [INFO] Validating: publisher-discord [INFO] Validating: mesh-agent [INFO] Validating: nats-echo-req [INFO] Validating: nats-echo-res [INFO] Validating: comfy-watcher [INFO] Validating: grayjay-plugin-host [INFO] Validating: agent-zero [INFO] Validating: archon [INFO] Validating: channel-monitor [INFO] Validating: pmoves-yt [INFO] Validating: notebook-sync [INFO] Validating: supabase_service_role_key [INFO] Validating: supabase_jwt_secret ====================================== |
Codex P1 Resolved ✅Regenerate split compose overlays — fixed in commit Root cause: Fix:
The |
There was a problem hiding this comment.
Actionable comments posted: 8
🧹 Nitpick comments (2)
pmoves/services/hf-agent/main.py (1)
23-35: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winComment misattributes the
ModelFilterremoval version; redundant_HAS_MODEL_FILTERassignment.
ModelFilter/DatasetFilterwere actually removed in huggingface_hub 0.24.0, not ">= 1.0" as the comment states — official release notes confirm they are "completely removed" as of 0.24.0. Since this diff pins huggingface-hub 0.24.0,_HAS_MODEL_FILTERwill always resolve toFalsein the currently pinned environment, making the "legacy"ModelFilterbranch in_build_list_models_kwargs/_discover_modelsdead code that's never exercised by tests. Separately,_HAS_MODEL_FILTER = Falseis set redundantly in both branches of the firsttry/except— it only needs to be initialized once.♻️ Proposed cleanup
-try: # huggingface_hub >= 1.0 removed ModelFilter; list_models takes kwargs directly - from huggingface_hub import HfApi - _HAS_MODEL_FILTER = False -except ImportError: # pragma: no cover - HfApi = None # type: ignore[misc,assignment] - _HAS_MODEL_FILTER = False - -try: - from huggingface_hub import ModelFilter # type: ignore[import-not-found] - _HAS_MODEL_FILTER = True -except ImportError: - ModelFilter = None # type: ignore[assignment,misc] +_HAS_MODEL_FILTER = False + +try: + from huggingface_hub import HfApi +except ImportError: # pragma: no cover + HfApi = None # type: ignore[misc,assignment] + +try: # ModelFilter/DatasetFilter were removed in huggingface_hub 0.24.0 (not 1.0) + from huggingface_hub import ModelFilter # type: ignore[import-not-found] + _HAS_MODEL_FILTER = True +except ImportError: + ModelFilter = None # type: ignore[assignment,misc]Given huggingface-hub's own v1.0 migration guide also removes
tags/task/library/languageparams fromlist_models, it's worth double-checking the modern kwargs path (pipeline_tag,filter,author) against whichever huggingface-hub version actually ships in production, since neither "0.24.0" nor "1.0" match the comment as written.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pmoves/services/hf-agent/main.py` around lines 23 - 35, Correct the Hugging Face compatibility comment to identify ModelFilter/DatasetFilter removal at version 0.24.0, and initialize _HAS_MODEL_FILTER only once rather than assigning False in both branches of the initial HfApi import. Verify the modern kwargs used by _build_list_models_kwargs and _discover_models against the production huggingface_hub version, preserving only the supported compatibility path.pmoves/scripts/split_compose.py (1)
234-257: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy liftConsider stripping/relocating leading comments when copying services into overlays.
Because
overlay_services[svc_name] = svc(246) copies only the service value, not the parent map's comment tokens, ruamel's round-trip comment attachment can misattach a preceding block comment from the source document to whichever surviving key ends up adjacent in the new overlay — exactly what happened with the "HF Agent" comment leaking intodocker-compose.workers.ymlahead ofgithub-branch-naming. Since services are inserted/reordered between groups over time, this will keep recurring. Worth a follow-up to detect/strip orphaned leading comments during generation.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pmoves/scripts/split_compose.py` around lines 234 - 257, Update the service-copy logic in the SERVICE_GROUPS generation loop to prevent leading comments attached to the source services map from being carried into overlays when assigning overlay_services[svc_name]. Detect and remove or relocate orphaned comment tokens before inserting each copied service, while preserving comments that belong to the service itself and the existing security_opt handling.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@pmoves/docker-compose.agents.yml`:
- Around line 933-976: Add a deploy.resources.limits block to the hf-agent
service, matching the established cpus and memory limits used by comparable
services such as hf-research-agent. Keep the existing service configuration
unchanged and ensure the resource ceiling follows this compose file’s fleet-wide
convention.
- Around line 977-1011: The hf-research-agent comments document an HF_MIN_SCORE
setting that is not passed to the worker. Add an HF_MIN_SCORE environment entry
using the documented default of 50 and update the worker’s threshold handling in
main.py to consume it instead of hardcoding the value, preserving the existing
pass/fail behavior by default.
In `@pmoves/docker-compose.yml`:
- Around line 2986-2989: Remove the stray HF Agent comment block from the
generated workers overlay by correcting the split_compose.py/ruamel comment
attachment around the hf-agent and github-branch-naming document-order keys.
Keep the comment attached only to the hf-agent service in docker-compose.yml and
ensure github-branch-naming receives no HuggingFace-specific comments in
docker-compose.workers.yml.
- Around line 2990-3022: Add a deploy.resources.limits block to the hf-agent
service, matching the established cpus and memory limits used by sibling agent
services such as hf-research-agent and the corresponding agents.yml overlay.
Keep the existing service configuration unchanged.
- Around line 3023-3057: Wire the HF_MIN_SCORE configuration through the
hf-research-agent service: add its environment variable in the compose service
and update the scoring logic in the main.py evaluation flow to read that value
instead of hardcoding 50. Preserve the documented default threshold of 50 when
HF_MIN_SCORE is unset.
In `@pmoves/docs/AGENTS/AGNOTE4482PHI.t1.md`:
- Around line 1236-1240: The SPARK-KIMI CLAIM entry lacks the required expiry
metadata. Update the CLAIM record identified by agent_signature
ACK::SPARK-KIMI::LANE-C-CLAIM-2026-07-13 to include an explicit TTL, while
preserving its existing branch, scope, and handoff details.
In `@pmoves/scripts/publish_dataset.py`:
- Around line 105-116: Update the exception handling around the ClickHouse
request in the publish query function to catch httpx.TransportError, while
continuing to catch HTTPStatusError as appropriate. Preserve the existing
warning log and return [] graceful-degradation behavior for connection,
connect-timeout, read-timeout, and other transport failures.
In `@pmoves/tests/services/test_hf_services.py`:
- Around line 55-61: Replace pytest.importorskip("nats") in the module-loading
block with a direct import/module availability check that is handled by the
existing except Exception path. Preserve hf_agent_mod = None and
_hf_agent_skip_reason for unavailable dependencies, and remove the stale pragma
comment describing huggingface_hub-only failures.
---
Nitpick comments:
In `@pmoves/scripts/split_compose.py`:
- Around line 234-257: Update the service-copy logic in the SERVICE_GROUPS
generation loop to prevent leading comments attached to the source services map
from being carried into overlays when assigning overlay_services[svc_name].
Detect and remove or relocate orphaned comment tokens before inserting each
copied service, while preserving comments that belong to the service itself and
the existing security_opt handling.
In `@pmoves/services/hf-agent/main.py`:
- Around line 23-35: Correct the Hugging Face compatibility comment to identify
ModelFilter/DatasetFilter removal at version 0.24.0, and initialize
_HAS_MODEL_FILTER only once rather than assigning False in both branches of the
initial HfApi import. Verify the modern kwargs used by _build_list_models_kwargs
and _discover_models against the production huggingface_hub version, preserving
only the supported compatibility path.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 7223a8ad-22e0-480d-a6e2-4deab99e6be0
📒 Files selected for processing (12)
pmoves/docker-compose.agents.ymlpmoves/docker-compose.workers.ymlpmoves/docker-compose.ymlpmoves/docs/AGENTS/AGNOTE4482PHI.t1.mdpmoves/docs/handoffs/CRUSH_GLM52_LANES_2026-07-12.mdpmoves/scripts/publish_dataset.pypmoves/scripts/split_compose.pypmoves/services/hf-agent/main.pypmoves/services/hf-mcp-server/CLAUDE.mdpmoves/services/hf-mcp-server/README.mdpmoves/services/hf-mcp-server/main.pypmoves/tests/services/test_hf_services.py
💤 Files with no reviewable changes (1)
- pmoves/services/hf-mcp-server/main.py
1. [Major] hf-agent missing deploy.resources.limits — added cpus/memory cap
matching sibling services.
2. [Minor] HF_MIN_SCORE hardcoded — wired through env var (compose + main.py):
`HF_MIN_SCORE` (default 50) now controls the pass/fail threshold instead of
a magic number.
3. [Minor] Stray "HF Agent" comment leaked into workers.yml — moved multi-line
comments from inter-service position (2-space indent, where ruamel.yaml
attaches them to the PRECEDING service) to inside-stanza position (4-space
indent) so they travel with the correct service through split_compose.py.
Also fixed pre-existing "A2UI NATS bridge" misnomer on notebooklm-agent and
removed its duplicate deploy block.
4. [Major] publish_dataset.py: widened exception catch from httpx.ConnectError
to httpx.TransportError (parent of ConnectTimeout, ReadTimeout, etc.) so
slow/dropped connections degrade gracefully.
5. [Minor] CLAIM TTL missing — added ttl field to AGNOTE4482PHI.t1.md CLAIM.
6. [Major] test_hf_services.py: replaced pytest.importorskip("nats") (raises
BaseException, uncatchable by except Exception) with direct `import nats`
so missing dep skips only TestHFAgent, not the whole module.
Tests: 19/19 still pass. Compose drift check clean after regeneration.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
Docker Hardening ValidationHardening Validation ReportValidated: Mon Jul 13 22:08:33 UTC 2026Services CheckedPMOVES.AI Docker Hardening Validation[INFO] Checking: pmoves/docker-compose.hardened.yml [INFO] Validating: hi-rag-gateway-v2 [INFO] Validating: extract-worker [INFO] Validating: langextract [INFO] Validating: presign [INFO] Validating: render-webhook [INFO] Validating: retrieval-eval [INFO] Validating: pdf-ingest [INFO] Validating: jellyfin-bridge [INFO] Validating: invidious-companion-proxy [INFO] Validating: ffmpeg-whisper [INFO] Validating: media-video [INFO] Validating: media-audio [INFO] Validating: hi-rag-gateway-v2-gpu [INFO] Validating: hi-rag-gateway-gpu [INFO] Validating: deepresearch [INFO] Validating: supaserch [INFO] Validating: publisher-discord [INFO] Validating: mesh-agent [INFO] Validating: nats-echo-req [INFO] Validating: nats-echo-res [INFO] Validating: comfy-watcher [INFO] Validating: grayjay-plugin-host [INFO] Validating: agent-zero [INFO] Validating: archon [INFO] Validating: channel-monitor [INFO] Validating: pmoves-yt [INFO] Validating: notebook-sync [INFO] Validating: supabase_service_role_key [INFO] Validating: supabase_jwt_secret ====================================== |
All Review Comments Addressed ✅Commit
Tests: 19/19 pass. Compose drift: clean. All 8 review threads resolved. |
Docker Hardening ValidationHardening Validation ReportValidated: Mon Jul 13 22:30:51 UTC 2026Services CheckedPMOVES.AI Docker Hardening Validation[INFO] Checking: pmoves/docker-compose.hardened.yml [INFO] Validating: hi-rag-gateway-v2 [INFO] Validating: extract-worker [INFO] Validating: langextract [INFO] Validating: presign [INFO] Validating: render-webhook [INFO] Validating: retrieval-eval [INFO] Validating: pdf-ingest [INFO] Validating: jellyfin-bridge [INFO] Validating: invidious-companion-proxy [INFO] Validating: ffmpeg-whisper [INFO] Validating: media-video [INFO] Validating: media-audio [INFO] Validating: hi-rag-gateway-v2-gpu [INFO] Validating: hi-rag-gateway-gpu [INFO] Validating: deepresearch [INFO] Validating: supaserch [INFO] Validating: publisher-discord [INFO] Validating: mesh-agent [INFO] Validating: nats-echo-req [INFO] Validating: nats-echo-res [INFO] Validating: comfy-watcher [INFO] Validating: grayjay-plugin-host [INFO] Validating: agent-zero [INFO] Validating: archon [INFO] Validating: channel-monitor [INFO] Validating: pmoves-yt [INFO] Validating: notebook-sync [INFO] Validating: supabase_service_role_key [INFO] Validating: supabase_jwt_secret ====================================== |
…ndpoints Completes HF handoff Lane C item C4 (hf-mcp-server test suite). Covers gaps from PR #2113's existing test_hf_services.py which tested internal functions only — no actual HTTP route testing. This new suite uses FastAPI TestClient to exercise every endpoint: - TestHealthMetrics: healthz, health alias, metrics format, download counter - TestModelSearch: search all, search by tier, empty result - TestModelInfo: from catalog, 404 not found - TestModelList: empty cache, cached model with snapshots - TestTensorZeroConfig: TOML generation - TestSSETools: MCP tools/list via SSE (verifies all 4 tool names) - TestConvertGGUF: 404 for uncached model 14/14 passing. Combined with PR #2113's 19 tests = 33 total HF service tests. Generated with Crush Assisted-by: GLM-5.2 via Crush <crush@charm.land>
…ndpoints Completes HF handoff Lane C item C4 (hf-mcp-server test suite). Covers gaps from PR #2113's existing test_hf_services.py which tested internal functions only — no actual HTTP route testing. This new suite uses FastAPI TestClient to exercise every endpoint: - TestHealthMetrics: healthz, health alias, metrics format, download counter - TestModelSearch: search all, search by tier, empty result - TestModelInfo: from catalog, 404 not found - TestModelList: empty cache, cached model with snapshots - TestTensorZeroConfig: TOML generation - TestSSETools: MCP tools/list via SSE (verifies all 4 tool names) - TestConvertGGUF: 404 for uncached model 14/14 passing. Combined with PR #2113's 19 tests = 33 total HF service tests. Generated with Crush Assisted-by: GLM-5.2 via Crush <crush@charm.land>
Summary
PR #2105's handoff doc (
CRUSH_GLM52_LANES_2026-07-12.md) claimed Lanes C1, C2, and C5 needed work. Verification on currentmainshowed the handoff was partially stale — most of the work was already done. This PR closes the real gaps that remained.What the handoff got wrong (corrected in handoff doc)
pmoves/services/hf-agent/main.py. Naming drift: handoff usedhf_agent(underscore), actual ishf-agent(hyphen).pmoves/services/hf-research-agent/main.py.0190417b4, past target.What was actually broken (fixed in this PR)
docker-compose.yml. Both now wired under["agents", "research"]profiles withtier-agent-hardenedanchors, NATSdepends_on, healthchecks, HF_TOKEN secrets wiring.ModelFilterwas removed in huggingface_hub 1.x.hf-agent/main.pyandhf-mcp-server/main.pyboth imported it. Fixed: hf-agent now has_build_list_models_kwargs()version-compat shim; hf-mcp-server's unused import removed.publish_dataset.pyClickHouse crash — Supabase path degraded gracefully on connection refused but ClickHouse path raisedhttpx.ConnectError. Now both return empty + warning.docker-compose/hf-mcp-server.ymlonly, missing the main compose path); CLAUDE.md was missing entirely. Both fixed.Test suite (C4 — was missing, now delivered)
19 unit tests in
pmoves/tests/services/test_hf_services.py:_seendedup, error swallowingAll 19 pass. Per-class skip guards ensure tests skip cleanly when optional deps (fastapi, huggingface_hub) aren't installed in the host env — they run inside the service containers.
Test plan
pytest pmoves/tests/services/test_hf_services.py -v→ 19/19 passdocker compose -f docker-compose.yml --profile research config→ renders hf-agent + hf-research-agent cleanlypython3 scripts/publish_dataset.py --all --dry-run→ graceful skip (no crash on missing ClickHouse)--profile research up(operator)💘 Generated with Crush
Summary by CodeRabbit
New Features
Bug Fixes
Documentation & Tests