feat: add Chutes.ai as a first-class inference provider#56
Closed
taoleeh wants to merge 1 commit into
Closed
Conversation
- Add CHUTES_BASE_URL, CHUTES_API_KEY_ENV constants to hermes_constants.py - Add 'chutes' explicit branch and auto-detect in resolve_provider() (auth.py) - Fall back to CHUTES_API_KEY when base_url points at chutes.ai (run_agent.py) - Add Chutes.ai option to setup wizard provider menu (setup.py) - Add CHUTES_MODELS list to models.py - Add CHUTES_API_KEY to .env.example - Update README providers table and env vars reference Chutes.ai is OpenAI-compatible at https://llm.chutes.ai/v1. Uses HuggingFace-style model slugs (e.g. NousResearch/Hermes-3-Llama-3.1-70B-Instruct).
Contributor
|
Since this is in your future PR, closing |
sudo-yf
pushed a commit
to sudo-yf/hermes-agent
that referenced
this pull request
Apr 5, 2026
…n-bridge feat: CLI session bridge - read CLI sessions from agent SQLite store
sudo-yf
pushed a commit
to sudo-yf/hermes-agent
that referenced
this pull request
Apr 5, 2026
…search#58) The backend CLI session bridge (PR NousResearch#56) was complete but the frontend never connected to it: 1. css class never applied -- el.className never included 'cli-session' so the gold border and 'cli' badge CSS was dead code. Fixed: append ' cli-session' when s.is_cli_session is true. 2. import never triggered -- click handler always called loadSession() directly, never POST /api/session/import_cli. Fixed: for CLI sessions, call import_cli first (idempotent -- safe to call on every click), then fall through to loadSession() which now finds the imported copy. 3. profile filter silently hid CLI sessions -- filter required s.profile === S.activeProfile, but CLI sessions may have profile=null if the SQLite DB has no profile column. Fixed: CLI sessions always pass the filter (s.is_cli_session || s.profile === S.activeProfile). Co-authored-by: Nathan Esquenazi <nesquena@gmail.com>
PowerCreek
referenced
this pull request
in TechDevGroup/hermes-agent
May 22, 2026
…nt (#56) Extends mcp_serve.py with 9 MCP tools wrapping devagentic's /v1/canvas/* REST surface: canvas_list, canvas_open, canvas_add_node, canvas_move_node, canvas_update_node, canvas_delete_node, canvas_link_nodes, canvas_delete_edge, canvas_search. Each tool delegates to the plugins/devagentic-canvas/client.py module (shared with the slash command surface from #55), wraps the response as a JSON string, and returns {error: ...} on any failure — no MCP tool ever raises. The client picks up DEVAGENTIC_BASE_URL / DEVAGENTIC_API_KEY / DEVAGENTIC_USER_ID from the MCP server's env (set in the host's mcpServers config). With devagentic in DEVAGENTIC_TRUST_HEADER=1 mode, any non-empty API key + a resolved user_id is enough for Claude Desktop / Cursor / Codex to drive the canvas. docs/mcp-canvas.md documents the Claude Desktop wiring + each tool's args + failure modes. Co-authored-by: devagentic-dev <dev@devagentic.local> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PowerCreek
referenced
this pull request
in TechDevGroup/hermes-agent
May 22, 2026
Mirrors the canvas-tools pattern (#56) for the just-shipped devagentic-docs plugin (#12 / PRs #19+#20+#23). MCP-aware clients (Claude Code, Cursor, Codex) can now writeDoc / searchDocs / forkContext / decorateContext / renderContext against any devagentic instance hermes is configured for. New tools (7): - doc_search(query, limit, tag) → search_docs - doc_write(content, tags, source) → write_doc - doc_show(doc_id) → get_doc - fork_open(parent_id, goal, tags) → fork_context (auto-pins parent + threads goal) - fork_decorate(ctx_id, key, value, weight) → decorate_context - fork_get(ctx_id) → get_context - fork_render(ctx_id) → render_context (envelope: {ctx_id, rendered}) Loader pattern: _resolve_docs_client() mirrors _resolve_canvas_client at line 880 — file-path import of plugins/devagentic-docs/client.py since the hyphenated dir isn't a Python package. Failure semantics: every tool returns {"error": "<msg>"} JSON. The plugin's last_error_text() pattern (introduced in #15) threads through via a _reason() helper, so federated agents see the same actionable hints CLI users get — e.g. on the canonical devbox deployment (where /graphql isn't exposed, see #21), they'd see "not found at <url>/graphql ..." instead of an opaque None. Out of scope per #24: fork_close + fork_pin depend on the session-local $HERMES_HOME/docs-fork-active marker, which doesn't translate to MCP's stateless tool model. fork_open auto-tags with source:hermes-mcp so MCP-authored forks are distinguishable from CLI-authored ones (source:hermes-cli). Tests: 22 new (tests/test_mcp_docs.py) covering registration, plugin-missing fallback, arg routing, last_error surfacing for the #21 case, and the real-import smoke. All passing alongside canvas MCP suite (14 existing) and the broader devagentic- adjacent test set (159 total). Closes #24.
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.
Add Chutes.ai as a first-class inference provider
Summary
Adds Chutes.ai as a named inference provider alongside Nous Portal and OpenRouter. Chutes.ai is an OpenAI-compatible serverless GPU inference platform with a large catalog of open-source models including Hermes variants, and supports pay-per-use access to models like DeepSeek, Llama, Qwen, and Mistral.
Since Chutes exposes a standard OpenAI-compatible API at
https://llm.chutes.ai/v1, the integration is purely configuration/routing — no new dependencies required.Changes
hermes_constants.pyPROVIDER_CHUTES = "chutes"constantCHUTES_BASE_URL = "https://llm.chutes.ai/v1"constantCHUTES_API_KEY_ENV = "CHUTES_API_KEY"constant"chutes"to the accepted values forHERMES_INFERENCE_PROVIDERmodel_tools.pychutesbranch in the provider dispatch logic alongsideopenrouterandnousCHUTES_API_KEYis set)CHUTES_BASE_URLhermes_cli/setup.py(or equivalent setup wizard file)"Chutes.ai"as a selectable provider option in the interactive setup menuCHUTES_API_KEYand write it to~/.hermes/.envNousResearch/Hermes-3-Llama-3.1-70B-Instruct)hermes_cli/model.py(or equivalenthermes modelcommand file)chutesto the provider selection menuGET https://llm.chutes.ai/v1/modelsusing the API key~/.hermes/config.yamlhermes_cli/status.py/hermes_cli/doctor.pyprovider: chutesin configCHUTES_API_KEYand surface a diagnostic error if missing.env.exampleCHUTES_API_KEY=entry with commentREADME.mdCHUTES_API_KEYto the Environment Variables Reference tableTesting
Notes
NousResearch/Hermes-3-Llama-3.1-70B-Instruct), notprovider/modellike OpenRouterAuthorization: Bearer <key>— no custom header logic neededOPENROUTER_API_KEYis still recommended alongside Chutes for vision/MoA tools that use OpenRouter independently