Tinkuy 0.1.0 — Donde los ríos se encuentran Carlos Cortez released Tinkuy 0.1.0, a minimalist agent framework written in 467 lines that provides a provider-agnostic loop for LLM tool calls. The framework, published on npm as @carloscortezcloud/tinkuy-agent, includes optional budget guards and supports any router that meets its interface. title: "Tinkuy 0.1.0 — Donde los ríos se encuentran: un agent framework de 467 líneas" slug: tinkuy-0-1-0-donde-los-rios-se-encuentran version: 0.1.0 date: 2026-07-22 tag: v0.1.0 npm: https://www.npmjs.com/package/@carloscortezcloud/tinkuy-agent/v/0.1.0 github: https://github.com/breakingthecloud/tinkuy/releases/tag/v0.1.0 cover: /banners/tinkuy/tinkuy-0-1-0.png coverDevTo: /banners/tinkuy/tinkuy-0-1-0-devto.png coverOg: https://tinkuylabs.finoptix.dev/banners/tinkuy/tinkuy-0-1-0.png commit: e534b48 series: tinkuy-changelog order: 1 TL;DR:El primer commit que lo inicia todo. Un loop mínimo LLM → tool calls → execute → feedback en 467 líneas, provider-agnostic, con budget opcional. Publicado a npm como @carloscortezcloud/tinkuy-agent@0.1.0 . Tinkuy quechua: encuentro de ríos es donde tus tools, modelos y budgets convergen en un solo loop. En vez de un framework opinado de 10k líneas, Tinkuy propone ~200 líneas de lógica core y cero lock-in: cualquier Router que cumpla la interfaz funciona, cualquier Guard Sayay es opcional. src/core/agent.ts — el loop principal: agent.run prompt → AgentResult src/tools/index.ts — defineTool { name, description, parameters, execute } src/state/index.ts + src/types/index.ts — tipos y estado mínimo dist/ + types , única dep runtime yaml , peers opcionales @carloscortezcloud/sayay-guard y @carloscortezcloud/styrr-llm "." , "./agent" , "./tools" , "./state" Metadata: Tag v0.1.0 @ e534b48 · npm 0.1.0 @ 2026-07-22T23:32:13.858Z · Tarball 22 files, 36,209 unpacked js import { Agent, defineTool } from '@carloscortezcloud/tinkuy-agent'; import { StyrRouter } from '@carloscortezcloud/styrr-llm'; import { SayayGuard, MemoryStorage } from '@carloscortezcloud/sayay-guard'; const getWeather = defineTool { name: 'get weather', description: 'Get current weather for a city', parameters: { type: 'object', properties: { city: { type: 'string' } }, required: 'city' }, execute: async { city } = { temp: 22, condition: 'sunny', city } , } ; const agent = new Agent { router: new StyrRouter { apiKey: process.env.OPENROUTER API KEY , models: { id: 'meta-llama/llama-3.3-70b-instruct:free' } } , guard: new SayayGuard { storage: new MemoryStorage , budget: { dailyUsd: 5.0 } } , tools: getWeather , systemPrompt: 'You are a helpful assistant. Use tools when needed.', } ; const result = await agent.run 'What is the weather in Lima?' ; // → { text, toolsUsed, iterations, latencyMs, costUsd, toolResults } Ver examples/01-minimal-agent.mjs . Define el contrato minimalista que todo lo demás extiende: Agent { router, guard, tools, systemPrompt } + agent.run + AgentResult . Sin eso no hay ToolRegistry, ni memoria, ni streaming. 0.1.1 — ESM fix //./02-v0.1.1-esm-fix.md → type: module para Node 20+. Verifica: git show v0.1.0 --stat · npm view @carloscortezcloud/tinkuy-agent@0.1.0 --json