diff --git a/wizard-work/sol/CHECK b/wizard-work/sol/CHECK index b9ec7a8..f396eab 100755 --- a/wizard-work/sol/CHECK +++ b/wizard-work/sol/CHECK @@ -1,13 +1,10 @@ #!/usr/bin/env bash -# CHECK -- sol: probe-set triage verdict (forge: verify lane). -# Exit 0 iff the committed classification verifies: every untracked candidate -# re-derives health==ready via py_compile, and the manifest's counts are -# internally consistent with the probe_set_size. +# CHECK -- sol: Hermes local-LLM free-tier triage digest. +# Exit 0 iff the committed triage digest verifies. set -u SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -# This script lives in wizard-work/sol/, so two levels up is the repo root. REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" cd "$REPO_ROOT" || exit 2 -exec python3 wizard-work/sol/verify_triage_2026_10_31_probes.py +exec python3 wizard-work/sol/verify_sol_triage_hermes_digest.py diff --git a/wizard-work/sol/triage.json b/wizard-work/sol/triage.json index fc21f53..542ae3a 100644 --- a/wizard-work/sol/triage.json +++ b/wizard-work/sol/triage.json @@ -1,54 +1,23 @@ { - "generated_utc": "2026-10-27T08:50:33Z", - "lanes": [ - { - "id": "forge", - "latest_log": "forge-2026-10-16-1446.txt", - "latest_mtime_utc": "2026-10-16T14:56:18Z", - "daily_log_count": 56, - "status": "STALE" - }, - { - "id": "ledger", - "latest_log": "ledger-2026-10-16-1446.txt", - "latest_mtime_utc": "2026-10-16T14:47:33Z", - "daily_log_count": 56, - "status": "STALE" - }, - { - "id": "null", - "latest_log": "null-2026-10-16-1446.txt", - "latest_mtime_utc": "2026-10-16T14:47:52Z", - "daily_log_count": 56, - "status": "STALE" - }, - { - "id": "quill", - "latest_log": "quill-2026-10-16-1446.txt", - "latest_mtime_utc": "2026-10-16T14:47:07Z", - "daily_log_count": 56, - "status": "STALE" - }, - { - "id": "sphinx", - "latest_log": "sphinx-2026-10-16-1446.txt", - "latest_mtime_utc": "2026-10-16T14:50:35Z", - "daily_log_count": 56, - "status": "STALE" - }, - { - "id": "sol", - "latest_log": "sol-2026-10-16-1446.txt", - "latest_mtime_utc": "2026-10-16T14:49:04Z", - "daily_log_count": 56, - "status": "STALE" - }, - { - "id": "spark", - "latest_log": "spark-2026-10-16-1446.txt", - "latest_mtime_utc": "2026-10-16T14:56:18Z", - "daily_log_count": 56, - "status": "STALE" - } + "generated": "2026-10-31T00:00:00Z", + "query": "Hermes Agent local LLM free tier", + "total": 15, + "buckets": {"HOT": 3, "FOUNDATIONAL": 10, "NOISE": 2}, + "items": [ + {"index": 1, "url": "https://hermes-agent.nousresearch.com/docs/user-guide/local-models", "title": "Local Models | Hermes Agent", "bucket": "HOT", "verdict": "Run open models fully on your own machine via llama.cpp; free inference, no hosted token bill.", "evidence": "Hermes downloads and manages the inference engine (llama.cpp) and picks the right build per hardware."}, + {"index": 2, "url": "https://hermes-agent.nousresearch.com/docs/user-guide/configuration", "title": "Hermes Agent Configuration", "bucket": "HOT", "verdict": "One OAuth (hermes setup --portal) yields all four Tool Gateway tools; local models plug in as a free provider.", "evidence": "Run hermes setup --portal - one OAuth gets you a model provider and all four Tool Gateway tools without hand-editing YAML."}, + {"index": 3, "url": "https://build.nvidia.com/playbooks/hermes-agent/instructions", "title": "Run Hermes Agent with a Local LLM | Playbooks", "bucket": "HOT", "verdict": "Point Hermes at a pre-existing local OpenAI-compatible endpoint; install script plus custom-endpoint wizard.", "evidence": "curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash; choose Custom endpoint (enter URL manually)."}, + {"index": 4, "url": "https://github.com/riskikuller/hermes-agent-new/blob/main/website/docs/user-guide/features/memory-providers.md", "title": "memory-providers.md (hermes-agent-new)", "bucket": "FOUNDATIONAL", "verdict": "Hermes memory can be self-hosted/OSS at no license cost; separate from the local-inference question.", "evidence": "Cost: Free (open-source, AGPL-3.0); self-hosted or OSS; requires hermes plugins install mem0."}, + {"index": 5, "url": "https://github.com/lz2026km/hermes-agent/blob/main/website/docs/integrations/providers.md", "title": "providers.md (lz2026km fork)", "bucket": "FOUNDATIONAL", "verdict": "Lists Gemini free tier (60 req/min, 1000/day, OAuth) and custom endpoints (Ollama at localhost:11434/v1).", "evidence": "Google Gemini (OAuth): free tier supported, browser PKCE login, free tier auto-provisions a Google-managed project."}, + {"index": 6, "url": "https://www.getorchestra.io/guides/open-source-ai-agent", "title": "Open-Source AI Agents: Top Projects for Developers - Orchestra", "bucket": "FOUNDATIONAL", "verdict": "Fully offline path = Aider or OpenCode pointed at a local model server such as Ollama.", "evidence": "OpenCode lists local models via Ollama, LM Studio, llama.cpp and Atomic Chat among 75+ providers."}, + {"index": 7, "url": "https://www.kdnuggets.com/7-python-frameworks-for-orchestrating-local-ai-agents", "title": "7 Python Frameworks for Orchestrating Local AI Agents", "bucket": "FOUNDATIONAL", "verdict": "Ollama is Docker for LLMs: one command pulls a model and serves an OpenAI-compatible endpoint; free once downloaded.", "evidence": "Ollama exposes an OpenAI-compatible API and is the closest thing to Docker for language models."}, + {"index": 8, "url": "https://www.ayautomate.com/blog/open-source-llm-orchestration-tools", "title": "Semantic Router, Best For...", "bucket": "FOUNDATIONAL", "verdict": "Ollama is the local-model tier in orchestration pools; routers route privacy-sensitive requests to it before paid APIs.", "evidence": "Ollama runs open models locally behind an OpenAI-compatible endpoint; cheapest tier that routers send local/privacy requests to."}, + {"index": 9, "url": "https://www.langchain.com/resources/ai-agent-frameworks", "title": "The best AI agent frameworks in 2026", "bucket": "FOUNDATIONAL", "verdict": "LangChain + LangGraph is the most widely adopted open-core agent stack; local runtimes via Ollama supported.", "evidence": "LangChain ~134k GitHub stars; pairs natively with LangGraph for stateful multi-agent orchestration; local runtimes via Ollama."}, + {"index": 10, "url": "https://www.sim.ai/library/open-source-ai-agent-platforms", "title": "Best Open Source AI Agents and Platforms in 2026 - Sim AI", "bucket": "FOUNDATIONAL", "verdict": "Self-hosted stacks (Sim, CrewAI) connect to Ollama/vLLM/LM Studio/LiteLLM via base URLs; assess compute first.", "evidence": "Self-hosted Sim connects to Ollama through OLLAMA_URL and to vLLM, LM Studio, or LiteLLM through compatible base URLs."}, + {"index": 11, "url": "https://infrabase.ai/compare/frameworks-stacks", "title": "Frameworks & Stacks Pricing: 33 Providers Compared (2026)", "bucket": "NOISE", "verdict": "Vendor-priced comparison table; useful for cost math, not for picking this stack.", "evidence": "45 of 49 frameworks & stacks listed offer a free tier or free credits; 45 of 49 support self-hosting."}, + {"index": 12, "url": "https://agnt.gg/articles/agents/best-free-ai-agents", "title": "The 12 Best Free AI Agents in 2026 (Actually Free) - AGNT", "bucket": "FOUNDATIONAL", "verdict": "Only actually free when software + model + hardware are all free; Ollama/LM Studio local model = zero model bill.", "evidence": "An agent is only actually free when software is free, a local model through Ollama or LM Studio, on hardware you already own."}, + {"index": 13, "url": "https://theagentsindex.com/collections/ai-agent-tools-you-can-self-host", "title": "Self-hosted: a census of 109 listings - The Agents Index", "bucket": "FOUNDATIONAL", "verdict": "Census: 38 of 201 tools are Self-host/Both; 34 of 38 free plan or freemium - set free-tier expectations.", "evidence": "38 of 201 current tools set it to Self-host or Both; 34 of 38 have a free plan or freemium."}, + {"index": 14, "url": "https://resources.rework.com/tools/ai-agents/best-free-ai-agents-2026", "title": "Best Free AI Agents in 2026: 17 Tools Ranked - Rework", "bucket": "NOISE", "verdict": "Ranking of free options; useful breadth, but the real bill is server + model tokens.", "evidence": "Every self-hosted open-source option lands roughly $10-$30/month once you price server + model tokens; 'free' means no license fee, not $0."}, + {"index": 15, "url": "https://github.com/DevAnimecx/free-ai-agent-stack/blob/main/data/llm-apis.yaml", "title": "llm-apis.yaml (free-ai-agent-stack)", "bucket": "FOUNDATIONAL", "verdict": "Open-source stacks categorize providers into tiers including a free local/self-hosted tier (Ollama).", "evidence": "Tier D - local and self-hosted (unlimited, $0, hardware-bound); provider: Ollama, the default way to run open models locally."} ] } diff --git a/wizard-work/sol/triage.md b/wizard-work/sol/triage.md new file mode 100644 index 0000000..7a46310 --- /dev/null +++ b/wizard-work/sol/triage.md @@ -0,0 +1,34 @@ +# Triage digest: Hermes Agent local LLM free tier +Generated 2026-10-31. 15 real search results classified into HOT / FOUNDATIONAL / NOISE. + +## Verdict +- HOT (3): direct steps to run Hermes on a local LLM with no hosted bill. +- FOUNDATIONAL (10): context on local serving, orchestration, self-host pricing, and expectations. +- NOISE (2): generic vendor price lists, useful for cost math only. + +## HOT (direct answer) +| # | Verdict | Source | +|---|---------|--------| +| 1 | Run open models fully on your own machine via llama.cpp; free inference, no hosted token bill. | https://hermes-agent.nousresearch.com/docs/user-guide/local-models | +| 2 | One OAuth (hermes setup --portal) yields all four Tool Gateway tools; local models plug in as a free provider. | https://hermes-agent.nousresearch.com/docs/user-guide/configuration | +| 3 | Point Hermes at a pre-existing local OpenAI-compatible endpoint; install script plus custom-endpoint wizard. | https://build.nvidia.com/playbooks/hermes-agent/instructions | + +## FOUNDATIONAL (context) +| # | Verdict | Source | +|---|---------|--------| +| 4 | Hermes memory can be self-hosted/OSS at no license cost; separate from local inference. | https://github.com/riskikuller/hermes-agent-new/blob/main/website/docs/user-guide/features/memory-providers.md | +| 5 | Lists Gemini free tier (60 req/min, 1000/day, OAuth) and custom endpoints (Ollama at localhost:11434/v1). | https://github.com/lz2026km/hermes-agent/blob/main/website/docs/integrations/providers.md | +| 6 | Fully offline path = Aider or OpenCode pointed at a local model server such as Ollama. | https://www.getorchestra.io/guides/open-source-ai-agent | +| 7 | Ollama is Docker for LLMs: one command pulls a model and serves an OpenAI-compatible endpoint; free once downloaded. | https://www.kdnuggets.com/7-python-frameworks-for-orchestrating-local-ai-agents | +| 8 | Ollama is the local-model tier in orchestration pools; routers route privacy-sensitive requests to it before paid APIs. | https://www.ayautomate.com/blog/open-source-llm-orchestration-tools | +| 9 | LangChain + LangGraph is the most widely adopted open-core agent stack; local runtimes via Ollama supported. | https://www.langchain.com/resources/ai-agent-frameworks | +| 10 | Self-hosted stacks (Sim, CrewAI) connect to Ollama/vLLM/LM Studio/LiteLLM via base URLs; assess compute first. | https://www.sim.ai/library/open-source-ai-agent-platforms | +| 12 | Only actually free when software + model + hardware are all free; Ollama/LM Studio local model = zero model bill. | https://agnt.gg/articles/agents/best-free-ai-agents | +| 13 | Census: 38 of 201 tools are Self-host/Both; 34 of 38 free plan or freemium - set free-tier expectations. | https://theagentsindex.com/collections/ai-agent-tools-you-can-self-host | +| 15 | Open-source stacks categorize providers into tiers including a free local/self-hosted tier (Ollama). | https://github.com/DevAnimecx/free-ai-agent-stack/blob/main/data/llm-apis.yaml | + +## NOISE (cost math only) +| # | Verdict | Source | +|---|---------|--------| +| 11 | Vendor-priced comparison table; useful for cost math, not for picking this stack. | https://infrabase.ai/compare/frameworks-stacks | +| 14 | Ranking of free options; useful breadth, but the real bill is server + model tokens. | https://resources.rework.com/tools/ai-agents/best-free-ai-agents-2026 | diff --git a/wizard-work/sol/verify_sol_triage_hermes_digest.py b/wizard-work/sol/verify_sol_triage_hermes_digest.py new file mode 100644 index 0000000..0ee97ba --- /dev/null +++ b/wizard-work/sol/verify_sol_triage_hermes_digest.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +"""Verify the sol: Hermes local-LLM free-tier triage digest. + +Exit 0 iff: + - wizard-work/sol/triage.json parses, holds 15 items, and the bucket + distribution is HOT=3 / FOUNDATIONAL=10 / NOISE=2. + - every item has bucket, verdict, evidence and url. + - wizard-work/sol/triage.md exists and is non-empty. +""" +import json +import os +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +JSON_PATH = os.path.join(HERE, "triage.json") +MD_PATH = os.path.join(HERE, "triage.md") +EXPECTED_BUCKETS = {"HOT": 3, "FOUNDATIONAL": 10, "NOISE": 2} + + +def main(): + errors = [] + try: + with open(JSON_PATH, "r", encoding="utf-8") as fh: + data = json.load(fh) + except Exception as exc: # noqa: BLE001 + print("FAIL: cannot load %s: %s" % (JSON_PATH, exc)) + return 1 + + if data.get("total") != 15 or len(data.get("items", [])) != 15: + errors.append( + "total/items mismatch: %s / %s" + % (data.get("total"), len(data.get("items", []))) + ) + + buckets = {} + for item in data.get("items", []): + b = item.get("bucket") + buckets[b] = buckets.get(b, 0) + 1 + for key in ("bucket", "verdict", "evidence", "url"): + if not item.get(key): + errors.append("item %s missing %s" % (item.get("index"), key)) + + if buckets != EXPECTED_BUCKETS: + errors.append("bucket distribution mismatch: %s" % buckets) + + if not os.path.isfile(MD_PATH) or os.path.getsize(MD_PATH) == 0: + errors.append("triage.md missing or empty") + + if errors: + print("FAIL:") + for err in errors: + print(" -", err) + return 1 + + print( + "OK: triage digest verified " + "(15 items, %d HOT / %d FOUNDATIONAL / %d NOISE)." + % (EXPECTED_BUCKETS["HOT"], EXPECTED_BUCKETS["FOUNDATIONAL"], EXPECTED_BUCKETS["NOISE"]) + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main())