diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000..24a3bb8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,73 @@ +name: Bug report +description: Report reproducible behavior in the Hermes Chutes provider +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thanks for helping improve this independent, unofficial integration. + Remove API keys, credentials, private prompts, and account data before submitting. + - type: textarea + id: summary + attributes: + label: Problem summary + description: What happened, and what did you expect instead? + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: Reproduction steps + description: Provide the smallest sequence that reproduces the problem. + placeholder: | + 1. Configure... + 2. Run... + 3. Observe... + validations: + required: true + - type: dropdown + id: installation + attributes: + label: Installation route + options: + - Manual directory install from a release tag + - Development checkout from main + - Entry-point or native install under development + - Other + validations: + required: true + - type: input + id: plugin-version + attributes: + label: Plugin version or commit + placeholder: v0.1.5 or a commit SHA + validations: + required: true + - type: input + id: hermes-version + attributes: + label: Hermes Agent version or commit + validations: + required: true + - type: input + id: environment + attributes: + label: Environment + description: Include Python version and operating system. + placeholder: Python 3.12 on Windows 11 + validations: + required: true + - type: textarea + id: logs + attributes: + label: Sanitized logs + description: Include only relevant output after removing sensitive data. + render: shell + - type: checkboxes + id: safety + attributes: + label: Sensitive-data check + options: + - label: I removed API keys, credentials, private prompts, and account data. + required: true diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 7efe741..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Bug report -about: Report a problem with the Chutes provider plugin -title: "[BUG] " -labels: bug -assignees: '' ---- - -## Description -A clear description of the bug. - -## Steps to Reproduce -1. -2. -3. - -## Expected Behavior -What should happen. - -## Actual Behavior -What actually happens. - -## Environment -- Hermes Agent version: -- Python version: -- OS: -- Plugin version: - -## Logs / Traceback -Remove API keys, credentials, private prompts, and account data before pasting. - -``` -Paste relevant output here. -``` diff --git a/.github/ISSUE_TEMPLATE/compatibility.yml b/.github/ISSUE_TEMPLATE/compatibility.yml new file mode 100644 index 0000000..10d2609 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/compatibility.yml @@ -0,0 +1,53 @@ +name: Compatibility report +description: Report a compatibility problem with a Hermes or Chutes change +title: "[Compatibility]: " +labels: ["compatibility"] +body: + - type: markdown + attributes: + value: | + Use this form when the provider stops matching a released Hermes version or a documented Chutes API behavior. + Remove API keys, credentials, private prompts, and account data before submitting. + - type: dropdown + id: affected-system + attributes: + label: Affected system + options: + - Hermes Agent + - Chutes API or model catalog + - Both or unclear + validations: + required: true + - type: input + id: plugin-version + attributes: + label: Plugin version or commit + placeholder: v0.1.5 or a commit SHA + validations: + required: true + - type: input + id: upstream-version + attributes: + label: Hermes or Chutes version reference + description: Provide a release, commit, dated API behavior, or authoritative link. + validations: + required: true + - type: textarea + id: observed-behavior + attributes: + label: Observed compatibility problem + description: Explain the regression and provide minimal reproduction steps. + validations: + required: true + - type: textarea + id: evidence + attributes: + label: Sanitized evidence + description: Add relevant logs or links after removing sensitive data. + - type: checkboxes + id: safety + attributes: + label: Sensitive-data check + options: + - label: I removed API keys, credentials, private prompts, and account data. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 19b0c86..3b327ae 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,11 @@ blank_issues_enabled: false contact_links: - - name: Chutes Documentation + - name: Report a security vulnerability + url: https://github.com/TheStreamCode/hermes-chutes-provider/security/advisories/new + about: Send sensitive findings privately. Never include credentials in a public issue. + - name: Chutes documentation url: https://docs.chutes.ai - about: Official Chutes platform documentation \ No newline at end of file + about: Consult official platform documentation; it does not support this unofficial integration. + - name: Hermes Agent support + url: https://github.com/NousResearch/hermes-agent/issues + about: Report issues that also occur without this provider to the Hermes Agent project. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..8d3b8c5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,36 @@ +name: Feature request +description: Suggest a focused improvement to the provider profile +title: "[Feature]: " +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + This repository is limited to the standalone Chutes provider profile for Hermes Agent. + Requests that require a custom transport or a Hermes core patch belong upstream. + - type: textarea + id: problem + attributes: + label: Problem or use case + description: What limitation are you trying to address? + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Proposed improvement + description: Describe the smallest provider-level change that would help. + validations: + required: true + - type: textarea + id: compatibility + attributes: + label: Compatibility considerations + description: Note any Hermes or Chutes version constraints and link authoritative sources. + - type: checkboxes + id: scope + attributes: + label: Scope check + options: + - label: This request can be implemented without patching Hermes Agent. + required: true diff --git a/.github/assets/github-social-preview.jpg b/.github/assets/github-social-preview.jpg new file mode 100644 index 0000000..0b542f7 Binary files /dev/null and b/.github/assets/github-social-preview.jpg differ diff --git a/CHANGELOG.md b/CHANGELOG.md index 52b5c4f..cfa8d95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project are documented in this file. -## [Unreleased] +## [0.1.5] - 2026-08-08 ### Security @@ -19,11 +19,16 @@ All notable changes to this project are documented in this file. revision to currently verified releases. - Install the released tag by default and document `main` as a development checkout. +- Present the current support and distribution status before installation + details and document the provider's relationship to Hermes' generic + transport. ### Added - Regression coverage for older Hermes provider profiles, bounded catalog reads, optional request metadata, and workflow pinning. +- Structured bug, compatibility, and feature-request forms with explicit + credential-redaction guidance and a private security-reporting route. ## [0.1.4] - 2026-08-02 diff --git a/CITATION.cff b/CITATION.cff index 68e8226..6be6d1d 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,8 +1,8 @@ cff-version: 1.2.0 message: "If you use this software, please cite it as below." title: "Hermes Chutes Provider" -version: 0.1.4 -date-released: "2026-08-02" +version: 0.1.5 +date-released: "2026-08-08" url: "https://github.com/TheStreamCode/hermes-chutes-provider" repository-code: "https://github.com/TheStreamCode/hermes-chutes-provider" license: MIT diff --git a/README.md b/README.md index 232d278..550beae 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,20 @@ not need an upstream Hermes source change. This is an independent, unofficial integration. It is not affiliated with, endorsed by, sponsored by, or approved by Chutes Global Corp or Nous Research. +## Project status + +| Area | Current status | +| --- | --- | +| Stable release | [`v0.1.5`](https://github.com/TheStreamCode/hermes-chutes-provider/releases/tag/v0.1.5) | +| Supported installation | Manual directory install from the released tag | +| Native Hermes install | Pending upstream standalone-plugin support in [Hermes PR #64277](https://github.com/NousResearch/hermes-agent/pull/64277) | +| Python | 3.11 or newer | +| Distribution | GitHub Releases only; not published to PyPI | + +The profile keeps the stable `chutes` provider identity, discovers current +tool-capable models from the live Chutes catalog, and falls back to Chutes' +routing aliases when that catalog cannot be reached. + ## Requirements - A Hermes Agent installation with model-provider plugin discovery. @@ -30,7 +44,7 @@ Clone the latest released snapshot into the active Hermes profile: ```bash export HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}" mkdir -p "$HERMES_HOME/plugins/model-providers" -git clone --branch v0.1.4 --depth 1 \ +git clone --branch v0.1.5 --depth 1 \ https://github.com/TheStreamCode/hermes-chutes-provider.git \ "$HERMES_HOME/plugins/model-providers/chutes" ``` @@ -41,7 +55,7 @@ On PowerShell: $hermesHome = if ($env:HERMES_HOME) { $env:HERMES_HOME } else { Join-Path $HOME ".hermes" } $target = Join-Path $hermesHome "plugins\model-providers\chutes" New-Item -ItemType Directory -Force (Split-Path -Parent $target) -git clone --branch v0.1.4 --depth 1 https://github.com/TheStreamCode/hermes-chutes-provider.git $target +git clone --branch v0.1.5 --depth 1 https://github.com/TheStreamCode/hermes-chutes-provider.git $target ``` #### Development checkout @@ -126,6 +140,13 @@ This plugin declares metadata for Hermes' existing generic OpenAI-compatible transport and provider-discovery systems. It does not modify Hermes Agent, add a custom transport, or include Chutes API keys. +```mermaid +flowchart LR + P["Chutes provider profile"] -->|configures| R["Hermes provider registry"] + R --> T["Generic OpenAI-compatible transport"] + T --> C["Chutes API"] +``` + For Chutes skills, setup recipes, model guidance, and platform documentation, see [Veightor/chutes-agent-toolkit](https://github.com/Veightor/chutes-agent-toolkit). diff --git a/SECURITY.md b/SECURITY.md index 9cfd7f0..22b4651 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,9 +2,12 @@ ## Reporting a Vulnerability -Report sensitive vulnerabilities privately to `info@mikesoft.it` with the -subject `Hermes Chutes Provider Security Report`. Do not disclose API keys, -credentials, private prompts, or account data in a public issue. +Use GitHub's +[private vulnerability reporting](https://github.com/TheStreamCode/hermes-chutes-provider/security/advisories/new) +for sensitive findings. If that route is unavailable, email +`info@mikesoft.it` with the subject `Hermes Chutes Provider Security Report`. +Do not disclose API keys, credentials, private prompts, or account data in a +public issue. For non-sensitive security hardening, open an issue with the affected component, observed behavior, impact, and a minimal reproduction where practical. diff --git a/hermes_chutes_provider/__init__.py b/hermes_chutes_provider/__init__.py index 9e6f6c8..d5a9663 100644 --- a/hermes_chutes_provider/__init__.py +++ b/hermes_chutes_provider/__init__.py @@ -8,7 +8,7 @@ from providers.base import ProviderProfile -__version__ = "0.1.4" +__version__ = "0.1.5" logger = logging.getLogger(__name__) _MAX_CATALOG_RESPONSE_BYTES = 8 * 1024 * 1024 diff --git a/plugin.yaml b/plugin.yaml index 560980f..a082ff2 100644 --- a/plugin.yaml +++ b/plugin.yaml @@ -1,6 +1,6 @@ name: chutes-provider kind: model-provider -version: 0.1.4 +version: 0.1.5 description: Chutes model provider for Hermes Agent author: Michael Gasperini (Mikesoft) requires_env: diff --git a/pyproject.toml b/pyproject.toml index 501c837..5d75592 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "hermes-chutes-provider" -version = "0.1.4" +version = "0.1.5" description = "Chutes model-provider plugin for Hermes Agent" readme = "README.md" requires-python = ">=3.11" diff --git a/tests/test_plugin_profile.py b/tests/test_plugin_profile.py index 2fb53b1..76b6a58 100644 --- a/tests/test_plugin_profile.py +++ b/tests/test_plugin_profile.py @@ -23,8 +23,9 @@ MANIFEST_PATH = REPOSITORY_ROOT / "plugin.yaml" CHANGELOG_PATH = REPOSITORY_ROOT / "CHANGELOG.md" CITATION_PATH = REPOSITORY_ROOT / "CITATION.cff" -RELEASE_VERSION = "0.1.4" -RELEASE_DATE = "2026-08-02" +ISSUE_TEMPLATE_DIRECTORY = REPOSITORY_ROOT / ".github" / "ISSUE_TEMPLATE" +RELEASE_VERSION = "0.1.5" +RELEASE_DATE = "2026-08-08" class ProviderProfile: @@ -305,6 +306,33 @@ def test_readme_documents_current_and_future_install_paths(self) -> None: self.assertIn("https://github.com/Veightor/chutes-agent-toolkit", readme) self.assertNotIn("https://github.com/chutesai/chutes-agent-toolkit", readme) self.assertIn("Development checkout", readme) + self.assertIn("## Project status", readme) + self.assertIn("GitHub Releases only; not published to PyPI", readme) + self.assertIn("Generic OpenAI-compatible transport", readme) + + def test_issue_forms_route_security_reports_and_guard_credentials(self) -> None: + config = (ISSUE_TEMPLATE_DIRECTORY / "config.yml").read_text( + encoding="utf-8" + ) + bug_form = (ISSUE_TEMPLATE_DIRECTORY / "bug.yml").read_text( + encoding="utf-8" + ) + compatibility_form = ( + ISSUE_TEMPLATE_DIRECTORY / "compatibility.yml" + ).read_text(encoding="utf-8") + feature_form = (ISSUE_TEMPLATE_DIRECTORY / "feature_request.yml").read_text( + encoding="utf-8" + ) + + self.assertIn("blank_issues_enabled: false", config) + self.assertIn("security/advisories/new", config) + self.assertIn('labels: ["bug"]', bug_form) + self.assertIn('labels: ["compatibility"]', compatibility_form) + self.assertIn('labels: ["enhancement"]', feature_form) + for form in (bug_form, compatibility_form): + with self.subTest(form=form[:40]): + self.assertIn("Remove API keys", form) + self.assertIn("required: true", form) def test_ci_runs_the_offline_contract_suite(self) -> None: if not CI_WORKFLOW_PATH.is_file():