LangChain olmadan, sıfırdan bir tool-calling agent. ~400 satır Python'da: agent loop + decorator-tabanlı tool registry + multi-provider fallback (Gemini → local GGUF).
Herkes AgentExecutor çağırıyor ama altında ne döndüğünü bilmiyor. Bu repo o kara kutuyu açıyor. Bir agent'ın gerçekte ne olduğunu görmek istiyorsan — soyutlama yok, sihir yok doğru yerdesin.
┌─────────────────────────────────────────────────────────┐
│ AGENT LOOP │
│ │
│ kullanıcı ──► provider.generate() ──► cevap mı? │
│ ▲ │ │
│ │ ▼ │
│ araç sonucu araç çağrısı mı? │
│ ▲ │ │
│ └──── registry.execute() ◄────────┘
└─────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────────┐
│ TOOL REGISTRY │ │ FALLBACK ROUTER │
│ @tool decorator│ │ Gemini ──► Gemini │
│ Pydantic schema│ │ ──► Local (GGUF) │
└─────────────────┘ └──────────────────────┘
Eğitim amaçlı. LangChain harika bir kütüphane ama bir agent'ın mekaniğini öğrenmek için kötü bir başlangıç çok fazla soyutlama gerçekte olan biteni gizliyor. Burada gördüğün her satır senin kontrolünde. Öğrendikten sonra istersen LangChain'e geç; ama önce temeli gör.
| Katman | Dosya | Ne yapar |
|---|---|---|
| Agent loop | agent.py |
observe → think → act → observe döngüsü. Sonsuz döngü koruması. ~80 satır. |
| Tool registry | tools.py |
@tool decorator fonksiyon imzasından otomatik Pydantic + JSON Schema üretir. |
| Provider katmanı | providers.py |
Provider protocol'ü; Gemini (native function calling) + local GGUF (offline). |
| Fallback router | providers.py |
Provider'ları sırayla dener; biri patlarsa bir sonrakine düşer. |
git clone https://github.com/esephaneli/mini-agent.git
cd mini-agent
uv sync # temel (Gemini)
uv sync --extra local # + offline GGUF fallback istiyorsan
export GEMINI_API_KEY="..." # https://aistudio.google.com/apikeyfrom mini_agent import Agent, GeminiProvider, build_default_registry
agent = Agent(GeminiProvider(), build_default_registry())
result = agent.run("100 dolar kaç TL eder?")
print(result.answer)Kendi aracını eklemek sadece bir fonksiyon yaz:
from mini_agent import tool, build_default_registry, Agent, GeminiProvider
@tool
def kdv_dahil(tutar: float, oran: float = 20.0) -> str:
"""Bir tutara KDV ekler."""
return f"{tutar * (1 + oran/100):.2f} TL"
reg = build_default_registry()
reg.register(kdv_dahil)
Agent(GeminiProvider(), reg).run("1500 TL'ye %20 KDV ekle")Schema'yı elle yazmana gerek yok — @tool decorator type hint'lerden üretiyor.
from mini_agent import FallbackRouter, GeminiProvider, LocalProvider, Agent, build_default_registry
router = FallbackRouter([
GeminiProvider("gemini-2.5-flash"), # birincil
GeminiProvider("gemini-2.5-flash-lite"), # rate-limit yerse
LocalProvider("model.gguf"), # tamamen offline son çare
])
agent = Agent(router, build_default_registry())Birincil model rate-limit yer ya da ölürse, router otomatik bir sonrakine geçer. Local katman internetsiz çalışır — gerçek dayanıklılık (resilience) burada.
uv run python examples/01_basic.py # tek tur, hazır araçlar
uv run python examples/02_multi_tool.py # kendi aracını ekle
uv run python examples/03_fallback.py # provider düşürme demosuuv run pytest # API key GEREKMEZ — sahte provider ile loop'u test ederhesapla (güvenli, eval yok), bugun, doviz_kuru (TCMB canlı kuru).
Production'a taşımadan önce bilmen gerekenler:
- Gemini function-calling formatı OpenAI'dan farklı.
function_call/function_responsepart'ları ayrı; OpenAI'nintool_callsdizisi gibi değil.providers.pyiçindeki çeviri katmanına bak. - Validation şart. Model bazen eksik veya yanlış tipte argüman gönderir. Registry bunu yakalayıp modele "hata" olarak geri besliyor (crash etmiyor) ki model kendini düzeltsin.
- Sonsuz döngü riski gerçek.
max_iterationsolmadan model araç çağırıp durabilir. Guard her zaman açık. - Küçük local modeller tool-calling'i kötü yapar. 3B-7B quantized modeller native function-calling'i güvenilir yapamaz;
LocalProviderbu yüzden JSON-prompt yöntemi kullanıyor — kırılgan ama offline garantisi veriyor. 6GB VRAM için Qwen2.5-3B-Instruct Q4_K_M gibi küçük bir model seç. evalkullanma.hesaplaaracı AST ile sınırlı operatör değerlendirmesi yapıyor;evalbir RCE açığıdır.
MIT.