Repository review, self-contained sdist, and 0.1.4 - #3
Merged
Conversation
AGENTS.md records the contract this repository actually enforces: the two deliberate entry points, the frozen provider identity and env-var names, why fallback_models holds only routing aliases, why the catalog probe swallows every exception, the protected-branch release procedure, and the fact that GitHub Releases -- not PyPI -- is the distribution channel. README gains verified CI, release, license, and Python badges, an environment variable table, the repository layout, the HERMES_SOURCE and wheel-build commands, a versioning section naming every file that must stay in sync, and links to the existing contributing, security, and conduct documents. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The sdist already shipped tests/, but not the files those tests read from the distribution root, so `python -m unittest discover -s tests` failed inside an unpacked archive on the directory-plugin entry point, plugin.yaml, CHANGELOG.md, CITATION.cff, and the CI workflow. MANIFEST.in adds them; the suite now passes from an unpacked sdist. The wheel is unaffected and still contains only the package module plus LICENSE, NOTICE, and metadata. .pytest_cache/ and .ruff_cache/ were only ignored because both tools write a self-ignoring .gitignore into their own cache; state that explicitly instead. .gitattributes pins text normalization to LF in the repository, since the install documentation invites contributors from both bash and PowerShell. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CITATION.cff still advertised version 0.1.0 with a release date that matched no published release; it now tracks the real version and is covered by test_release_version_is_consistent so it cannot drift again. fetch_model_metadata read self.models_url and self.default_headers directly. Both exist on the pinned Hermes ProviderProfile, but a host predating either field would raise AttributeError inside the blanket try, which the probe reports as "no models" -- a silent downgrade to the routing aliases with no diagnosable cause. Read both with getattr instead. fetch_models and fetch_model_metadata now accept api_key=None, matching the upstream ProviderProfile signature. Behavior is unchanged: the Authorization header was already gated on a truthy key, and Hermes calls fetch_models with keyword arguments. The use_live_model_metadata comment claimed newer Hermes versions consume the flag. No revision of NousResearch/hermes-agent references it, so the comment now describes it accurately as a forward-compatible declaration that is inert until a host adds support. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Repository review, cleanup, documentation, and the 0.1.4 patch release.
What changed
Fixes
CITATION.cffadvertisedversion: 0.1.0withdate-released: 2026-07-26, adate matching no published release, while the project was at 0.1.3. It now
tracks the real version and is covered by
test_release_version_is_consistentso it cannot drift again.
repository-code,abstract, andkeywordswereadded.
fetch_model_metadatareadself.models_urlandself.default_headersdirectly. Both exist on the pinned Hermes
ProviderProfile, but a host thatpredates either field raises
AttributeErrorinside the blankettry, whichthe probe reports as "no models" — a silent downgrade to the routing aliases
with no diagnosable cause. Both are now read with
getattr.fetch_models/fetch_model_metadataacceptapi_key=None, matching theupstream
ProviderProfilesignature. Behavior is unchanged: theAuthorizationheader was already gated on a truthy key, and Hermes calls_p.fetch_models(api_key=..., base_url=...)with keyword arguments.tests/but not the files those tests read from thedistribution root, so the suite could not run from an unpacked archive.
MANIFEST.inadds the directory-plugin entry point,plugin.yaml,CHANGELOG.md,CITATION.cff,AGENTS.md, the governance documents, and theCI workflow. The wheel is unaffected.
Documentation
AGENTS.md: the two deliberate entry points, the frozen provider identityand environment variable names, why
fallback_modelsholds only routingaliases, why the catalog probe swallows every exception, the version files
that must move together, the protected-branch release procedure, and the fact
that GitHub Releases — not PyPI — is the distribution channel.
variable table; repository layout; the
HERMES_SOURCEand wheel-buildcommands; a versioning section; links to the existing contributing, security,
and conduct documents.
use_live_model_metadatacomment claimed newer Hermes versions consume theflag. No revision of
NousResearch/hermes-agentreferences it, so the commentnow describes it accurately as a forward-compatible declaration that stays
inert until a host adds support.
Housekeeping
.gitignore:.pytest_cache/and.ruff_cache/were only ignored becauseboth tools write a self-ignoring
.gitignoreinto their own cache..gitattributes:* text=auto, since the install docs invite contributorsfrom both bash and PowerShell.
Validation
All commands were run; results are real.
python -m unittest discover -s tests -v— 7 tests, OK (Python 3.12,offline; integration skipped)
HERMES_SOURCEpointing atNousResearch/hermes-agent@46e87b14installed in a virtualenv —7 tests, OK, integration test passing, not skipped
uv build—hermes_chutes_provider-0.1.4-py3-none-any.whl(7 830 B) andhermes_chutes_provider-0.1.4.tar.gz(17 034 B)hermes_chutes_provider/__init__.pyplusLICENSE,NOTICE,METADATA,WHEEL,entry_points.txt,top_level.txt,RECORD. No tests, caches,.env, or credentials.chutes = hermes_chutes_provider:registerresolves,register()succeeds,get_provider_profilereturns the profile forchutes,chutes-ai, andchutesai, and the catalog probe returnsNoneagainst an unreachablehost instead of raising
NOTICE, and the issue-template config returns200
Risks
Low. No functional change to provider identity, aliases, environment variables,
model lists, or the transport. The
getattrchange can only turn a formerAttributeErrorinto a working probe, and theapi_keydefault widens theaccepted input.
Known issues, unchanged by this PR
.github/dependabot.ymlwas removed in 6d287d0 and Dependabot automatedsecurity fixes are disabled on the repository, so
.github/workflows/dependabot-auto-merge.ymlcannot fire today. It is left inplace because it becomes correct again the moment Dependabot is re-enabled;
that is a maintainer decision, not a cleanup.
publisher is configured, so no publishing step was attempted.
Follow-up after merge
mainrequires an approving review, so the tag and GitHub Release forv0.1.4must be created from the merge commit once this lands.
🤖 Generated with Claude Code