{"slug": "show-hn-cli-coding-agent-that-runs-on-llamafile-and-or-gguf", "title": "Show HN: CLI Coding Agent that runs on llamafile and/or GGUF", "summary": "Kdeps, a CLI coding agent that runs on llamafile and/or GGUF, enables building and deploying AI agents in YAML with workflow (DAG pipelines) and agent (autonomous LLM loop) modes. The open-source tool supports resource types including chat, httpClient, python, exec, sql, email, scraper, browser, embedding, searchLocal, searchWeb, agent, and component, and allows multi-agent orchestration via agencies. Kdeps is highly experimental and not for production, with APIs, schemas, and CLI flags subject to change.", "body_md": "Build and deploy AI agents in YAML. Two modes: **workflow** (DAG pipelines), **agent** (autonomous LLM loop).\n\nHighly experimental.APIs, schemas, and CLI flags change without notice. Not for production.[Report issues].\n\n** AI Appliances - Build & Deploy Autonomous AI Agents and Agencies in YAML**\nFree. PDF, EPUB, and web.\n\nHands-on guide covering deterministic pipelines, multi-agent orchestration, error handling, and vendor-agnostic deployment - the production challenges most AI frameworks leave to you.\n\n```\ncurl -LsSf https://raw.githubusercontent.com/kdeps/kdeps/main/install.sh | sh\n```\n\nOr with Homebrew (macOS and Linux):\n\n```\nbrew install kdeps/tap/kdeps\n```\n\nDAG-deterministic request/response pipelines. Each resource declares its dependencies via `requires:`\n\nand runs in order. Supports API server, web server, file input, and bot input.\n\n```\nPOST /summarize  {\"url\": \"...\"}\n        |\n        v\n+---------------------+\n|  fetch              |  httpClient -- fetches the URL\n+---------------------+\n        |\n        v\n+---------------------+\n|  respond            |  chat -- summarizes the fetched body\n+---------------------+\n        |\n        v\n   apiResponse        <- output('respond') becomes the HTTP response body\n# workflow.yaml\napiVersion: kdeps.io/v1\nkind: Workflow\nmetadata:\n  name: summarizer\n  version: \"1.0.0\"\n  targetActionId: respond\nsettings:\n  apiServer:\n    portNum: 16395\n    routes:\n      - path: /summarize\n        methods: [POST]\n  agentSettings:\n    installOllama: true\n# resources/fetch.yaml\nactionId: fetch\nhttpClient:\n  method: GET\n  url: \"{{ get('url') }}\"\n  timeout: 10s\n\n---\nactionId: respond\nrequires: [fetch]\nchat:\n  model: llama3.2:1b\n  prompt: \"Summarize this page: {{ output('fetch').body }}\"\napiResponse:\n  response: \"{{ output('respond') }}\"\nkdeps run workflow.yaml          # local, instant startup\nkdeps run workflow.yaml --dev    # hot reload\n```\n\n**Resource types:** `chat`\n\n, `httpClient`\n\n, `python`\n\n, `exec`\n\n, `sql`\n\n, `email`\n\n, `scraper`\n\n, `browser`\n\n, `embedding`\n\n, `searchLocal`\n\n, `searchWeb`\n\n, `agent`\n\n, `component`\n\n**Expressions:** `get('key')`\n\nreads request input, `output('actionId')`\n\nreads a prior step's result, `set('key', val)`\n\nstores state. All expressions are safe inside `{{ }}`\n\n— Jinja2 control flow (`{% if %}`\n\n, `{% for %}`\n\n) is also supported.\n\nAutonomous LLM loop. Every resource in the workflow is auto-registered as a callable tool -- the LLM decides which tools to call, in what order, to complete the task.\n\n```\nstdin prompt\n      |\n      v\n+---------------------+\n|  LLM                |  plans steps, picks tools\n+---------------------+\n      |\n      +-- call tool: httpClient  -->  fetch URL\n      |\n      +-- call tool: python      -->  process data\n      |\n      +-- call tool: sql         -->  query database\n      |\n      v\n+---------------------+\n|  LLM (again)        |  synthesizes results into final answer\n+---------------------+\n      |\n      v\n   stdout response\nkdeps serve workflow.yaml\nkdeps serve workflow.yaml --model llama3.2 --system \"You are a DevOps assistant.\"\n```\n\nThe agent reads from stdin and runs until you exit. All resource types (http, python, exec, sql, ...) are available as tools without any extra wiring.\n\n```\nKDEPS_AGENT_MODEL=claude-3-5-sonnet   # override model via env\nKDEPS_AGENT_BACKEND=anthropic\n```\n\nAn agency is a collection of agents that work together. Each agent is its own `workflow.yaml`\n\nwith its own resources, model, and logic. You wire them together using the `agent:`\n\nresource type, which runs another agent's full workflow and returns its output — like calling a function, but the function is an entire AI pipeline.\n\n```\nPOST /run-marketing-pipeline\n        │\n        ▼\n┌─────────────────────┐\n│   content-writer    │  ← its own workflow.yaml, writes the blog post\n└────────┬────────────┘\n         │ output passed as params\n         ▼\n┌─────────────────────┐\n│   cms-publisher     │  ← its own workflow.yaml, publishes to CMS\n└─────────────────────┘\n         │\n         ▼\n      response\n```\n\nThe orchestrating workflow calls each agent in order using `agent:`\n\n:\n\n```\n# resources/pipeline.yaml\n\nactionId: draft\nagent:\n  name: content-writer        # runs agents/content-writer/workflow.yaml\n  params:\n    topic: \"{{ get('topic') }}\"  # passed as get('topic') inside that agent\n\n---\nactionId: publish\nrequires: [draft]\nagent:\n  name: cms-publisher         # runs agents/cms-publisher/workflow.yaml\n  params:\n    content: \"{{ output('draft') }}\"  # previous agent's output forwarded\napiResponse:\n  response: \"{{ output('publish') }}\"\n```\n\nRun an agency:\n\n```\nkdeps run agency.yaml\nkdeps bundle build          # Docker image\nkdeps bundle export iso     # bootable edge ISO\nkdeps bundle prepackage     # self-contained binary per arch\nkdeps export k8s            # Kubernetes manifests\nkdeps registry search <query>\nkdeps registry install <package>\nkdeps registry submit --tag v1.0.0   # generate formula for kdeps.io PR\n```\n\nA [coding-agent skill](https://github.com/kdeps/skill) teaches Claude Code, Cursor,\nGrok, and other agents how to scaffold kdeps workflows, components, and agencies —\nincluding `kdeps.pkg.yaml`\n\nfor [kdeps.io](https://kdeps.io) distribution.\n\n```\ngit clone https://github.com/kdeps/skill ~/.claude/skills/kdeps\n```\n\nDocs: [kdeps.com/getting-started/agent-skills](https://kdeps.com/getting-started/agent-skills)\n\n```\nkdeps edit    # opens ~/.kdeps/config.yaml\nkdeps doctor  # check config, Ollama, Python, installed agents\n# ~/.kdeps/config.yaml\nllm:\n  backend: ollama           # ollama, openai, anthropic, groq, ...\n  openai_api_key: sk-...    # only needed for the relevant backend\n\ndefaults:\n  timezone: UTC\n  python_version: \"3.12\"\n\nresource_defaults:          # applied to every resource of that type\n  chat:\n    timeout: 60s            # hard stop per LLM call\n    context_length: 4096\n  http:\n    timeout: 30s\n```\n\nPer-agent config overrides: add an `agents:`\n\nblock keyed by the workflow name to override globals for that agent only:\n\n```\nagents:\n  my-agent:          # matches metadata.name in workflow.yaml\n    llm:\n      backend: openai\n      openai_api_key: sk-...\n```\n\nConfig is validated on load. Warnings go to stderr for unknown keys, missing API keys, invalid durations, and agent profiles that don't match any installed workflow.\n\nWhen `apiServer`\n\nis configured, authentication is required. Set the token via `KDEPS_API_AUTH_TOKEN`\n\nor `api_auth_token`\n\nin `~/.kdeps/config.yaml`\n\n(never in `workflow.yaml`\n\n). Clients send `Authorization: Bearer <token>`\n\nor `X-Api-Key: <token>`\n\n. `/health`\n\nis exempt. `/_kdeps/*`\n\nmanagement routes use `KDEPS_MANAGEMENT_TOKEN`\n\n.\n\n```\nexport KDEPS_API_AUTH_TOKEN=your-secret-token\nkdeps run workflow.yaml\nsettings:\n  apiServer:\n    rateLimit:\n      requestsPerMinute: 60          # sustained per-IP rate; excess gets 429\n      burst: 10                      # burst allowance above the sustained rate\n    maxBodyBytes: 1048576            # 1 MB request body cap; 413 if exceeded\n    trustedProxies:                  # honor X-Forwarded-For only from these peers\n      - \"10.0.0.0/8\"\n    cors:\n      allowOrigins:\n        - https://myapp.com\n  webServer:                         # optional; same rateLimit/maxBodyBytes/maxConcurrent fields\n    rateLimit:\n      requestsPerMinute: 120\n  certFile: /path/to/cert.pem        # TLS -- omit for plain HTTP\n  keyFile: /path/to/key.pem\n```\n\nStructured JSON via `log/slog`\n\n. Set `KDEPS_LOG_FORMAT=json`\n\nfor production output. Default level: WARN. Flags: `--verbose`\n\n(INFO), `--debug`\n\n(DEBUG).\n\n[Documentation](https://kdeps.com) | [Registry](https://kdeps.io) | Apache 2.0", "url": "https://wpnews.pro/news/show-hn-cli-coding-agent-that-runs-on-llamafile-and-or-gguf", "canonical_source": "https://github.com/kdeps/kdeps", "published_at": "2026-07-24 00:34:30+00:00", "updated_at": "2026-07-24 00:52:17.489250+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "artificial-intelligence", "large-language-models"], "entities": ["kdeps", "llamafile", "GGUF", "Ollama", "llama3.2", "Homebrew", "Anthropic", "Claude 3.5 Sonnet"], "alternates": {"html": "https://wpnews.pro/news/show-hn-cli-coding-agent-that-runs-on-llamafile-and-or-gguf", "markdown": "https://wpnews.pro/news/show-hn-cli-coding-agent-that-runs-on-llamafile-and-or-gguf.md", "text": "https://wpnews.pro/news/show-hn-cli-coding-agent-that-runs-on-llamafile-and-or-gguf.txt", "jsonld": "https://wpnews.pro/news/show-hn-cli-coding-agent-that-runs-on-llamafile-and-or-gguf.jsonld"}}