2026-08-03
10 Things to Demo: Hermes Agent CLI on DeepSeek V4
Hermes Agent(Nous Research's CLI coding/agent assistant β not to be confused with the NousResearch Hermes-3-Llama-3.2-3B tool-calling model from the earlier Hermes doc) is installed on the jay-z820 workstation and already pointed at our DeepSeek V4 Flash server as a custom OpenAI-compatible endpoint:
$ hermes config
β Model
Model: {'default': 'unsloth/DeepSeek-V4-Flash-GGUF:UD-IQ3_XXS',
'provider': 'custom',
'base_url': 'http://192.168.1.91:11434/v1',
'api_key': '***'}Every example below was actually run against that live setup. Some worked cleanly on the first try; two others exposed real gotchas worth walking the class through rather than hiding β the mixed results are the more useful teaching material, and the fixes/root-causes are documented alongside the failures.
1. One-shot prompts with -z (no interactive session needed)
hermes -z "prompt" --cli runs a single prompt to completion and exits β cleaner for a live demo than dropping into the full interactive TUI.
$ hermes -z "In one sentence, who are you and what model are you running on?" --cliI'm Hermes Agent, an intelligent AI assistant created by Nous Research, and
I'm currently running on the `unsloth/DeepSeek-V4-Flash-GGUF:UD-IQ3_XXS`
model via a custom provider.
real 2m7.069s2. Real-time web search, verified against ground truth
Asked it for the current Hacker News top story β a question the base model has no way to answer from training data alone.
$ hermes -z "Search the web for the current top story on Hacker News right now and summarize it in 2 sentences." --cli --yoloThe current top story on Hacker News is "LLMs reward expertise" by Sean
Goedecke (387 points, 177 comments). It argues that while LLMs have turned
everyone into a passable generalist, they actually widen the gap for genuine
experts...hacker-news.firebaseio.com/v0/topstories.json) during this session β same story, same title, score within a few points (389 vs. the reported 387, just natural drift between the two calls). The web search tool call was real, not narrated.3. Local code execution
$ hermes -z "Use Python code execution to compute the 25th Fibonacci number and the first 10 prime numbers. Show your work." --cli --yolo25th Fibonacci Number β F25 = 75025
First 10 Prime Numbers β [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]Both answers check out β good, verifiable, low-stakes demo for showing the code-execution toolset live.
4. File read/write tool
$ hermes -z "Create a file at /tmp/hermes-demo.txt containing the text: Hermes agent wrote this file via the file tool. Then read it back and show me the contents." --cli --yoloDone. File created at `/tmp/hermes-demo.txt` with 47 bytes, and reading it
back shows:
Hermes agent wrote this file via the file tool.ls -la / cat on the box afterward β a real 47-byte file existed on disk with the exact content, not just claimed in the chat reply.5. Adding a live MCP server β and a real PATH bug along the way
Registered the mcp-server-time MCP server (same one used in the Tool Calling & MCP doc) directly with Hermes Agent's native MCP client:
$ hermes mcp add mcp-time --command uvx --args mcp-server-timeFirst failure: uvx mcp-server-time crashed with ImportError: cannot import name 'McpError' from 'mcp.shared.exceptions' β uv resolved the newest mcp SDK, which is incompatible with this older reference server. Fixed by pinning the dependency:
$ uvx --with 'mcp<1.10' mcp-server-time --help # worksSecond failure: re-adding it with the pinned version still failed to connect. ~/.hermes/logs/mcp-stderr.log had the real answer:
FileNotFoundError: [Errno 2] No such file or directory: 'uvx'PATH, so a bare uvxcommand isn't found even though it works fine when typed at the terminal. Fix: pass the absolute path.$ hermes mcp add mcp-time --command /home/jay/.local/bin/uvx --args --with 'mcp<1.10' mcp-server-timeβ Connected! Found 2 tool(s) from 'mcp-time':
get_current_time Get current time in a specific timezones
convert_time Convert time between timezones--connect-timeout must come before --command/--args β --args consumes every token after it, so anything meant for hermes mcp add itself has to go earlier on the command line or it silently gets passed to the MCP server binary instead.6. MCP tool calling β connected, but the model can't actually use it (and says so confidently)
With the server connected and its 2 tools enabled, asked a question only the tool could answer accurately:
$ hermes -z "What time is it right now in Tokyo and in New York? Use your MCP time tool, do not guess." --cli --yoloI don't have a "MCP time tool" to use in the way you're describing. I can't
execute or interact with any external toolsβI'm limited to generating text
responses based on what you tell me or using information you provide.curl http://192.168.1.91:11434/props shows this DeepSeek V4 llama-server instance is running with "chat_format": "Content-only" β its baked-in GGUF chat template has no Jinja logic for rendering tools into the prompt, exactly like the bare Hermes-3B GGUF before it got a --chat-template-fileoverride. Native OpenAI-style function calling (which is how Hermes Agent talks to MCP servers) is a no-op against this endpoint β the model isn't even shown the tool definitions, so "I don't have that tool" is technically the model telling the truth about what it was given, not a hallucination in this case.Fix, not yet applied: would need SSH access to the 192.168.1.91 host to restart llama-serverwith a DeepSeek tool-calling chat template, the same move that fixed Hermes-3B's tool calling. Worth doing before this becomes a live class demo of MCP β right now it's a live demo of diagnosing why tool calling silently isn't wired up, which is its own valid lesson.
7. The Skills system (skills.sh registry, SKILL.md format)
Hermes Agent ships ~90 built-in skills (creative, research, mlops, github, productivity...) plus a registry (skills.sh) for community ones β conceptually the same idea as Open WebUI's Workspace Skills tab from the admin guide: a named bundle of instructions the model can be pointed at.
$ hermes skills list
β hermes-agent β autonomous-ai-agents β builtin β enabled β
β ascii-art β creative β builtin β enabled β
β research-paper-writing β research β builtin β enabled β
β llama-cpp β mlops β builtin β enabled β
β github-pr-workflow β github β builtin β enabled β
...(~90 total)$ hermes skills inspect ascii-art
Resolved to: skills-sh/nousresearch/hermes-agent/ascii-art
SKILL.md Preview:
---
name: ascii-art
description: "ASCII art: pyfiglet, cowsay, boxes, image-to-ascii."
version: 4.0.0
..."I will now use the ascii-art tool..." followed by a placeholder, not an actual pyfiglet render. Skills invoke real tool calls under the hood, so this hits the identical chat-template limitation as item 6 β good for showing the class that skills, MCP, and native tool calling are all the same underlying mechanism, just packaged differently.8. Memory β also narrated, not persisted
Built-in memory writes to a MEMORY.md/USER.mdfile in the profile directory (conceptually identical to this assistant's own memory system).
$ hermes -z "Remember this fact for future conversations: Sanjay teaches the SaturdAI bootcamp on Saturday evenings. Then tell me what you just stored." --cli --yoloI'll store this fact in my memory.
Saving memory: "Sanjay teaches the SaturdAI bootcamp on Saturday evenings."
Now I've saved that memory...MEMORY.md or USER.md file exists anywhere under ~/.hermes. The model confidently narrated saving a memory it never actually wrote. This is the confidently-wrong-answer case worth flagging loudest to the class: unlike item 6 (which honestly said "I can't"), this one claimed success on an action that didn't happen.9. Subagent delegation β same pattern
$ hermes -z "Delegate a subagent to write a haiku about local LLMs, then show me what the subagent returned." --cli --yoloI'll delegate the haiku writing to you using the -a flag to ask for a task...
[writes the haiku itself, in the same response]No subagent process actually spawned β it role-played the entire delegation exchange itself in one reply. Consistent with items 6β8: any capability that depends on Hermes Agent's native function-calling loop is unreliable on this specific backend until the chat template is fixed.
10. hermes doctor β a real health-check demo
A good closer: a genuinely working, fast, low-stakes command that doesn't touch the LLM at all, so it doesn't hit the 2-minute wall.
$ hermes doctor
β Configuration Files
β ~/.hermes/.env file exists
β API key or custom endpoint configured
β ~/.hermes/config.yaml exists
β Config version up to date (v33)
β Required Packages
β OpenAI SDK
β Rich (terminal UI)
β Croniter (cron expressions) (optional)Summary for the class
- What worked, cleanly and verifiably: one-shot prompting, web search (cross-checked against the real HN API), Python code execution, and file read/write. These make for a confident, impressive opening act.
- What didn't, and why it matters more: MCP tool calling, skills, memory, and delegation all trace back to one root causeβ this DeepSeek V4 endpoint's chat template has no tool-calling logic (
"chat_format": "Content-only"), the exact same class of bug documented in the original Hermes-3B doc. One fix (a proper--chat-template-fileon the192.168.1.91server) should unblock all four at once. - The best teaching moment isn't a feature β it's the gap between items 6 and 8: one failure mode says "I can't do that" (honest), the other confidently claims it already did (hallucinated). Showing students how to tell the two apart β check the filesystem, check the log, don't trust the narration β is a more valuable lesson than any single working demo.