Anthropic, sektördeki listeleri ve kıyaslamaları şimdiden zorlayan son teknoloji bir kodlama modeli olan Claude Sonnet 4.5’i yayımladı. Bu sürümü özellikle heyecan verici kılan şey, araçlar ve çerçeveler genelinde kusursuz entegrasyonu. VS Code uzantısından ve bağlam düzenleme özelliklerinden hafıza aracına, kod yürütmeye ve dosya oluşturmaya (e-tablolar, slaytlar, belgeler) kadar. Hatta Chrome için Claude ve Imagine with Claude ile yeni deneyimlere de genişliyor.
Ancak bu sürümün asıl yıldızı, Claude Code üzerine inşa edilmiş yepyeni Claude Agent SDK. Bu SDK, geliştiricilerin Claude’un yeteneklerini tamamen yeni yollarla oluşturmasına, özelleştirmesine ve genişletmesine olanak tanıyan güçlü bir aracısal çerçeve sunuyor.
Bu eğitimde, Claude 4.5’te nelerin yeni olduğunu inceleyecek, Claude Agent SDK ile uygulamalı çalışacak, yerel kurulum yapacak ve potansiyelini uygulamalı görmek için üç basit proje geliştireceğiz.
Claude 4.5’te neler yeni?
Claude Sonnet 4.5 büyük yetenek yükseltmeleri getiriyor. Dünyanın en iyi kodlama modeli, karmaşık aracılar oluşturmak için en güçlü seçenek ve bilgisayar kullanımı görevlerinde en iyisi; akıl yürütme ve matematikte de ciddi kazanımlar sunuyor. Bu model, SWE-bench Verified kıyaslamasında son teknolojiyi temsil ediyor ve karmaşık, çok adımlı görevlerde 30 saati aşan odaklanmayı koruduğu gözlemlendi.
OSWorld liderlik tablosunda, yalnızca dört ay önceki %42,2’den %61,4’e performans artışı sağladı. Finans, hukuk, tıp ve STEM alanlarındaki uzmanlar, alan bilgisi ve akıl yürütmede belirgin bir iyileşme bildirdi.

Kaynak: Introducing Claude Sonnet 4.5 \ Anthropic
Ayrıca bu, Anthropic’in bugüne kadarki en uyumlu sınır modeli; yağcılık, aldatma, güç arayışı davranışı ve hezeyanı teşvik etmede azalma gösteriyor. İstem enjeksiyonuna karşı savunmaları da güçlendirildi. ASL-3 korumaları altında yayımlanan modelde, yükseltilmiş sınıflandırıcılar yüksek riskli içeriği filtrelemeyi hedeflerken önceki sürümlere kıyasla yanlış pozitifleri önemli ölçüde azaltmayı amaçlıyor. Ayrıca daha küçük yeni bir mod da gördük; bununla ilgili yazımızı Claude Haiku 4.5 rehberimizde okuyabilirsiniz.
Claude Agent SDK’yı Anlamak
Önceden Claude Code SDK olarak bilinen Claude Agent SDK, Claude Code’u çalıştıran aynı çerçeveyi kullanarak güçlü, genel amaçlı aracılar oluşturmanıza yardımcı olmak için tasarlanmış bir araç seti sunar.
Temel ilke basittir: Claude’a bir bilgisayara erişim verin. Terminal ve dosya sistemi erişimiyle, aracılar tıpkı bir geliştirici gibi kod arayabilir, yazabilir, çalıştırabilir ve yineleyebilir. Bu yetenekler, kodlamanın çok ötesine geçerek derin araştırma, video oluşturma, not alma, veri analizi ve daha fazlasını kapsar.
Claude Agent SDK, dört temel adımdan oluşan yapılandırılmış bir aracı döngüsü tanımlar: bağlam toplama, eyleme geçme, çalışmayı doğrulama ve tekrarlama.
Uygulamada, bağlam için aracısal aramayla başlayın ve hıza ihtiyaç duyduğunuzda semantik aramayı katmanlayın. Eylemler yüksek sinyalli araçlar, bash betikleri ve Model Context Protocol aracılığıyla harici hizmetlerle entegrasyon etrafında odaklanmalıdır.
Doğrulama; kurallara dayalı kontrolleri, görsel geri bildirimi ve isteğe bağlı LLM desteğini birleştirir. Sürekli yineleme; performansı iyileştirmek, araçları genişletmek ve özellikler geliştikçe arama yeteneklerini artırmak için önerilir.
Öne çıkan özellikler:
- SDK’lar: Web/Node.js arka uçları ve veri bilimi için TypeScript ve Python; ekiplerin yığınlar genelinde desenleri yeniden kullanmasını sağlayan ortak kavramlar.
- Modlar: Etkileşimli, düşük gecikmeli UX için akış ve toplu ya da deterministik çalıştırmalar için tek atış—hız ve kontrol dengesini görev başına seçin.
- Bağlam yönetimi: Taşmayı önlemek ve uzun oturumlarda ajanları rotada tutmak için otomatik sıkıştırma ve uzun çalıştırma bağlam kontrolü.
- Araçlar: Yerleşik dosya işlemleri, kod yürütme ve web araması; ayrıca MCP aracılığıyla harici araçlar ve veriler için genişletilebilirlik.
- İzinler: Üretimde bir ajanın neler yapabileceğini sınırlamak için ince taneli yetenek kontrolleri (ör. araç başına izin/verme ve ilke modları).
- Üretime hazır: Hata yönetimi, oturum yönetimi ve izleme yerleşik gelir; böylece ilk günden güvenilir ve gözlemlenebilir ajanlar dağıtabilirsiniz.
- Claude entegrasyonu: Gecikmeyi ve maliyeti azaltırken verimi artırmak için otomatik istem önbellekleme ve performans iyileştirmeleri.
- Kimlik doğrulama: Dağıtım ortamınıza uyması için Claude API anahtarı kullanın ya da Amazon Bedrock ve Google Vertex AI gibi sağlayıcılar üzerinden yönlendirin.
- Sistem istemleri: Ajan davranışını görevler ve oturumlar genelinde tutarlı biçimde şekillendirmek için rol, uzmanlık ve korkulukları tanımlayın.
- Entegrasyonlar (MCP): Anthropic destekli, resmi TypeScript SDK’larına ve büyüyen bir ekosisteme sahip açık Model Context Protocol aracılığıyla özel araçlara, veritabanlarına ve API’lere bağlanın.
Python ile Claude Agent SDK’ya Başlarken
Herhangi bir proje oluşturmadan önce, bazı önkoşulları kurmanız, Claude Code CLI’ı ve Claude Agent SDK’yı yüklemeniz gerekir.
Önkoşullar
- Python 3.10 veya daha üst bir sürüme sahip olduğunuzdan emin olun.
- Claude Code CLI’ı verimli kullanmak için ayrıca Node.js 18 veya üzeri ve NPM paketini kurmanız gerekir.
Claude Code CLI’ı Yükleyin
Windows için:
PowerShell’i açın ve Claude Code’u indirmek ve kurmak için aşağıdaki komutu çalıştırın:
irm https://claude.ai/install.ps1 | iex
Kurulumdan sonra, C:\Users\<user>\.local\bin dizinini sistem PATH’inize ekleyin. PowerShell’i yeniden başlatın; Claude’un çalıştığını görmelisiniz.
Diğer platformlar için:
Node.js ve NPM yüklüyse, Claude Code’u kurmak için terminalde aşağıdaki komutu çalıştırmayı deneyin:
npm i -g @anthropic-ai/claude-code
Talimatları izleyerek ortam değişkenlerinizi ayarlayın; böylece terminalde yalnızca “claude” yazarak Claude Code’a erişebilirsiniz.
Claude Code’u Ayarlama
Claude Code’u yükledikten sonra, terminalde “claude” yazarak açın ve oturum açın. Claude Pro veya Max planınız varsa, kullanımın planınızdan düşmesi için “Abonelik hesabınızla oturum açın” seçeneğini tercih edin.
Kullandıkça ödeyi tercih ediyorsanız, bunun yerine bir API anahtarıyla kimlik doğrulayın; faturalandırma Anthropic Console üzerinden işler.
Son olarak, ilk günden itibaren iş akışınıza uyması için tema ve arayüz/CLI tercihlerinizi ayarlayın.
Ben Claude Code’u API anahtarıyla ayarladım. Kurulumu burada görebilirsiniz:

Claude Agent SDK’yı Yükleyin
Python yüklü olduğundan emin olun ve ardından terminali açın. Claude Agent SDK’yı yüklemek için şunu çalıştırın:
pip install claude-agent-sdk
Not: Bir CLINotFoundError ile karşılaşırsanız, yukarıdaki CLI’ı kurduğunuzdan ve Claude’un PATH’inize eklendiğinden emin olun.
Claude Agent SDK ve Claude Sonnet 4.5 ile Projeler Oluşturma
Şimdi Claude Agent SDK’yı bir çerçeve olarak, araçlar ve bilgisayar kullanımı için Claude Code’u ve yapay zekâ modelimiz olarak Claude Sonnet 4.5’i kullanarak üç basit proje inşa edeceğiz.
- Tek seferlik Blog Taslağı: Araçlar olmadan Claude Agent SDK’nın temel kullanımını gösteren basit bir tek atış sorgu.
- InspireBot CLI: Bu proje, web arama yeteneklerini motivasyon sözleri için özel bir yedek araçla birleştirir.
- NoteSmith Çok Araçlı Uygulama: Birden fazla araç, güvenlik kancaları ve kullanım takibi içeren kapsamlı bir not uygulaması.
Tüm kaynak kodu GitHub deposunda mevcuttur: kingabzpro/claude-agent-projects
1. Tek seferlik blog taslağı
Bu projede, SDK’nın query() işlevini Claude Sonnet 4.5 ile kullanarak bir blog taslağı oluşturuyoruz. Bu, araçlar olmadan temel Claude Agent SDK kullanımını sergileyen doğrudan bir tek atış sorgudur.
Kod şunlardan oluşur:
- Async akış:
asynciokullanır ve SDK’nınquery()async yineleyicisi ile bloklamayan, token token çıktı sağlar. - İstem ve seçenekler: Bir blog taslağı
PROMPTtanımlar ve modeli/kişiliğiClaudeAgentOptionsile yapılandırır. - Türlenmiş mesaj akışı: Mesajlar üzerinde yineler; yalnızca
AssistantMessage → TextBlockiçeriğini çıkarır. - Gerçek zamanlı çıktı: Metni geldiği gibi (
end="") temiz bir akışlı konsol görünümü için yazdırır. - Sonuç işleme:
ResultMessage’ı yok sayar, akışın doğal şekilde bitmesine izin verir. - Giriş noktası: Bir betik çalıştırıldığında her şeyi
asyncio.run(main())ile çalıştırır. - Özelleştirilebilir ve minimal: Model/istem kolayca değiştirilebilir; tanıtımlar veya hatlar için ideal, hafif bir betik.
oneshot_outline.py:
import asyncio
from claude_agent_sdk import (
query,
ClaudeAgentOptions,
AssistantMessage,
TextBlock,
ResultMessage,
)
PROMPT = """Create a crisp markdown outline (H2/H3 bullets) for a 500-word blog post:
Title: Why Sovereign AI Compute Matters in 2026
Audience: CTOs and Heads of AI
Tone: pragmatic, non-hype
Include: 3 buyer pains, 3 evaluation criteria, 1 closing CTA
"""
async def main():
options = ClaudeAgentOptions(
model="sonnet",
system_prompt="You are a precise technical copy strategist."
)
async for msg in query(prompt=PROMPT, options=options):
if isinstance(msg, AssistantMessage):
for block in msg.content:
if isinstance(block, TextBlock):
print(block.text, end="") # only the outline
elif isinstance(msg, ResultMessage):
pass # let the iterator end naturally
if __name__ == "__main__":
asyncio.run(main())
Betik çalıştırılacak ve ardından çıktı bir markdown dosyası olarak kaydedilecektir.
python oneshot_outline.py > outline.md
Markdown dosyasını açarak düzgün bir teknik metin ürettiğini görebilirsiniz.

Kullanımınızı kontrol etmek için https://console.anthropic.com/usage panonuza dönebilirsiniz. Görüldüğü gibi model Claude Sonnet 4.5’i kullanıyor.

2. InspireBot CLI
Bu projede, Claude Sonnet 4.5 kullanarak alıntıları akış halinde sunan terminal dostu bir motivasyon üretici oluşturuyoruz. Önce bir WebSearch dener, ardından rastgele sözler döndüren özel inspire_me aracına geri döner.
Kod şunlardan oluşur:
- Özel yedek araç: Önceden ayarlanmış motivasyon sözleriyle
inspire_metanımlar,create_sdk_mcp_serverile kaydeder. - CLI yardımcıları: Terminalde daktilo animasyonu ve biçimlendirilmiş çıktı ekleyen
is_tty,typewrite,bold,faintişlevleri. - İstem ve seçenekler:
ClaudeAgentOptionsile yapılandırılır; araçlara (WebSearch+inspire_me) ve “InspireBot” sistem kişiliğine izin verir. - Akışlı araç çağrıları: Araç kullanımı (
ToolUseBlock), sonuçlar (ToolResultBlock) ve nihai çıktı (TextBlock) gösterilir. - Yedek mantık: Kullanılabilir bir çıktı görünmezse, rastgele yerel bir söze döner.
- Etkileşimli UX: Akışlı araç girdilerini/sonuçlarını gösterir, ardından son ilham verici satırı daktilo efektiyle animasyonlu olarak sunar.
inspire_web.py:
import sys
import json
import asyncio
import random
import time
from typing import Any
from claude_agent_sdk import (
query,
ClaudeAgentOptions,
tool,
create_sdk_mcp_server,
AssistantMessage,
TextBlock,
ToolUseBlock,
ToolResultBlock,
ResultMessage,
)
# -------------------------
# Custom fallback tool
# -------------------------
QUOTES = [
"Dream big, start small -- but start.",
"Stay curious, stay humble, keep building.",
"Every expert was once a beginner.",
"Small wins stack into big victories.",
"Consistency beats intensity when intensity is inconsistent.",
]
@tool("inspire_me", "Return a random motivational quote", {})
async def inspire_me(_: dict) -> dict:
return {"content": [{"type": "text", "text": random.choice(QUOTES)}]}
UTILS = create_sdk_mcp_server("inspire_util", "1.0.0", [inspire_me])
# -------------------------
# Tiny terminal helpers
# -------------------------
def is_tty() -> bool:
try:
return sys.stdout.isatty()
except Exception:
return False
def typewrite(text: str, delay: float = 0.02) -> None:
"""Print with a typewriter effect if TTY; otherwise plain print."""
if not is_tty():
print(text)
return
for ch in text:
print(ch, end="", flush=True)
time.sleep(delay)
print()
def faint(s: str) -> str:
"""Dim text if terminal supports ANSI."""
return s if not is_tty() else f"\033[2m{s}\033[0m"
def bold(s: str) -> str:
return s if not is_tty() else f"\033[1m{s}\033[0m"
# -------------------------
# Main
# -------------------------
async def main():
topic = "engineering focus" if len(sys.argv) < 2 else " ".join(sys.argv[1:])
options = ClaudeAgentOptions(
model="sonnet", # switch to "sonnet-4.5" if your CLI lists it
system_prompt=(
"You are InspireBot.\n"
"- First, try WebSearch to find a short, uplifting quote relevant to the user's topic.\n"
"- If WebSearch is unhelpful or no clear quote is found, call the custom 'inspire_me' tool.\n"
"- Output ONE short line only. No preface, no commentary, <= 120 characters."
),
allowed_tools=[
"WebSearch",
"mcp__inspire_util__inspire_me",
],
mcp_servers={"inspire_util": UTILS},
)
prompt = (
"Find a short, uplifting quote for today's inspiration. "
f"Topic: {topic}. Prefer something crisp and modern.\n"
"If search yields multiple options, pick the best single line."
)
final_line_parts: list[str] = []
if is_tty():
print(bold("🌐 InspireBot (WebSearch + fallback tool)"))
print(faint("Tip: pass a custom topic: python inspire_web_animated.py \"women in leadership\""))
print()
async for message in query(prompt=prompt, options=options):
# Stream assistant messages for tool usage + final text
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, ToolUseBlock):
tool_name = block.name
tool_input = block.input or {}
print(f"{bold('🛠️ Tool used:')} {tool_name}")
print(f"{faint(' input:')} {json.dumps(tool_input, ensure_ascii=False)}")
elif isinstance(block, ToolResultBlock):
# Show summarized tool result text if present
shown = False
if isinstance(block.content, list):
for part in block.content:
if isinstance(part, dict) and part.get("type") == "text":
text = (part.get("text") or "").strip()
if text:
preview = text if len(text) <= 200 else (text[:197] + "...")
print(f"{faint(' result:')} {preview}")
shown = True
break
if not shown:
print(f"{faint(' result:')} (no textual content)")
elif isinstance(block, TextBlock):
# This should be the final "inspiration" line content
final_line_parts.append(block.text)
elif isinstance(message, ResultMessage):
# allow the iterator to finish naturally (no break)
pass
final_line = " ".join(part.strip() for part in final_line_parts).strip()
if not final_line:
final_line = random.choice(QUOTES) # ultimate fallback, just in case
# Animate the final line (typewriter), or plain if not a TTY
typewrite(final_line, delay=0.02)
if __name__ == "__main__":
asyncio.run(main())
Varsayılan konuyla betiği şu komutla çalıştıracağız:
python inspire_web.py
Görüldüğü gibi, kullanılan araçları, bu araçlara verilen girdileri gösteriyor ve ardından bir motivasyon sözü üretiyor.

Python betiğine özel bir konu verelim:
python inspire_web.py "Sadness and Love"
Bu, "love" ve "sadness" anahtar sözcüklerini içeren bir motivasyon sözü döndürüyor.

3. NoteSmith çok araçlı uygulaması
Bu projede, notları yerel olarak kaydeden ve arayan, web sayfalarını özetleyen ve sonuçları Claude Sonnet 4.5 ile akış halinde sunan çok araçlı bir araştırma asistanı oluşturuyoruz. Daha zengin bir CLI deneyimi için özel MCP araçlarını, yerleşik araçları ve bir güvenlik kancasını birleştirir.
Kod şunlardan oluşur:
- Yerel depolama: Zaman damgalarıyla diske not kaydeder; basit grep mantığıyla büyük/küçük harf duyarsız aramayı destekler.
- Özel MCP araçları:
save_note(metin kaydet) vefind_note(not ara),create_sdk_mcp_serverile kaydedilir. - Güvenlik kancası:
block_dangerous_bash, araç yürütülmeden önce zararlı kabuk komutlarını (ör.rm -rf /) reddeder. - Sistem istemi ve komutlar:
/summarize,/note,/find,/help,/exitkomutlarını tanımlar; istem, araç kullanımını yönlendirir (WebFetch,save_note,find_note). - Akışlı etkileşim: Gerçek zamanlı metin ve araç sonuçları yazdırmak için
ClaudeSDKClientileAssistantMessage,ToolUseBlock,ToolResultBlock’u işler. - Kullanım takibi: Ana çıktıyı temiz tutarken model adı, token kullanımı ve maliyeti stderr’e yazdırır.
- Sohbet arayüzü: Komutları (
/note,/find,/summarize) yazdığınız ve anında yanıt aldığınız, hafif bir REPL gibi çalışır; bir asistanla sohbet ediyormuş gibi hissettirir.
note_smith.py:
import sys
import json
import asyncio
from datetime import datetime
from pathlib import Path
from typing import Any
from claude_agent_sdk import (
ClaudeSDKClient,
ClaudeAgentOptions,
AssistantMessage,
TextBlock,
ToolUseBlock,
ToolResultBlock,
ResultMessage,
tool,
create_sdk_mcp_server,
HookMatcher,
HookContext,
)
# ----------------------------
# Storage (simple local notes)
# ----------------------------
NOTES_DIR = Path(__file__).parent / "notes"
NOTES_DIR.mkdir(exist_ok=True)
def _ts() -> str:
return datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
def save_note_to_disk(text: str) -> str:
path = NOTES_DIR / f"note_{_ts()}.txt"
path.write_text(text.strip() + "\n", encoding="utf-8")
return str(path)
def grep_notes(pattern: str) -> list[str]:
pat = pattern.lower()
out: list[str] = []
for p in NOTES_DIR.glob("*.txt"):
for i, line in enumerate(p.read_text(encoding="utf-8").splitlines(), start=1):
if pat in line.lower():
out.append(f"{p.name}:{i}: {line}")
return out
# ----------------------------
# Custom MCP tools
# ----------------------------
@tool("save_note", "Save a short note to local disk", {"text": str})
async def save_note(args: dict[str, Any]) -> dict[str, Any]:
path = save_note_to_disk(args["text"])
return {"content": [{"type": "text", "text": f"Saved note → {path}"}]}
@tool("find_note", "Find notes containing a pattern (case-insensitive)", {"pattern": str})
async def find_note(args: dict[str, Any]) -> dict[str, Any]:
hits = grep_notes(args["pattern"])
body = "\n".join(hits) if hits else "No matches."
return {"content": [{"type": "text", "text": body}]}
UTILS_SERVER = create_sdk_mcp_server(
name="notes_util",
version="1.0.0",
tools=[save_note, find_note],
)
# ----------------------------
# Optional safety hook (Bash)
# ----------------------------
async def block_dangerous_bash(
input_data: dict[str, Any],
tool_use_id: str | None,
context: HookContext
):
if input_data.get("tool_name") == "Bash":
cmd = str(input_data.get("tool_input", {}).get("command", "")).strip().lower()
if "rm -rf /" in cmd or "format c:" in cmd:
return {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Dangerous command blocked"
}
}
return {}
# ----------------------------
# Prompts & UI
# ----------------------------
SYSTEM_PROMPT = """You are NoteSmith, a concise research assistant.
- Prefer bullet answers with crisp takeaways.
- When the user asks to /summarize <url>, use WebFetch to retrieve and then summarize 5 key points + a 1-line TL;DR.
- When the user types /note <text>, call the custom save_note tool.
- When the user types /find <pattern>, call the custom find_note tool.
- Keep answers short unless asked to expand.
"""
HELP = """Commands:
/summarize <url> Summarize a webpage (WebFetch)
/note <text> Save a note locally
/find <pattern> Search saved notes
/help Show this help
/exit Quit
"""
# Use the broadest model label for compatibility; switch to "sonnet-4.5" if your CLI lists it.
MODEL = "sonnet"
# ----------------------------
# Main app
# ----------------------------
async def main():
options = ClaudeAgentOptions(
model=MODEL,
system_prompt=SYSTEM_PROMPT,
permission_mode="acceptEdits",
allowed_tools=[
# Built-ins (Claude may use these if relevant)
"WebFetch", "Read", "Write", "Grep", "Glob",
# Our MCP tools (SDK prefixes mcp__<alias>__<toolname>)
"mcp__utils__save_note",
"mcp__utils__find_note",
],
mcp_servers={"utils": UTILS_SERVER},
hooks={"PreToolUse": [HookMatcher(hooks=[block_dangerous_bash])]},
setting_sources=None, # no filesystem settings; everything is programmatic
)
print("💡 NoteSmith (Claude Sonnet)\n")
print(HELP)
async with ClaudeSDKClient(options=options) as client:
while True:
user = input("\nYou: ").strip()
if not user:
continue
if user.lower() in {"/exit", "exit", "quit"}:
print("Bye!")
break
if user.lower() in {"/help", "help"}:
print(HELP)
continue
# Lightweight command parsing (the system prompt also guides tool usage)
if user.startswith("/summarize "):
url = user.split(" ", 1)[1].strip()
prompt = f"Summarize this URL using WebFetch and return 5 bullets + TL;DR:\n{url}"
elif user.startswith("/note "):
text = user.split(" ", 1)[1]
prompt = f'Please call tool save_note with text="{text}"'
elif user.startswith("/find "):
patt = user.split(" ", 1)[1]
prompt = f'Please call tool find_note with pattern="{patt}"'
else:
prompt = user
await client.query(prompt)
# -------- Response streaming with footer to STDERR --------
model_used = None
usage = None
cost = None
async for message in client.receive_response():
if isinstance(message, AssistantMessage):
if model_used is None:
model_used = message.model # e.g., "sonnet" or "sonnet-4.5"
for block in message.content:
if isinstance(block, TextBlock):
print(block.text, end="", flush=True) # stdout
elif isinstance(block, ToolUseBlock):
print(f"\n🛠️ Using tool: {block.name} with input: {json.dumps(block.input)}")
elif isinstance(block, ToolResultBlock):
if isinstance(block.content, list):
for part in block.content:
if isinstance(part, dict) and part.get("type") == "text":
print(f"\n🔎 Tool says: {part.get('text')}")
elif isinstance(message, ResultMessage):
usage = message.usage or {}
cost = message.total_cost_usd
# Do not break early; let stream end naturally
# Footer (model + tokens + cost) → STDERR so normal output stays clean
def _token_summary(u: dict) -> str:
total = u.get("total_tokens")
if total is None:
it, ot = u.get("input_tokens"), u.get("output_tokens")
if it is not None or ot is not None:
total = (it or 0) + (ot or 0)
if total is None:
return "tokens=?"
if "input_tokens" in u or "output_tokens" in u:
return f"tokens={total} (in={u.get('input_tokens','?')}, out={u.get('output_tokens','?')})"
return f"tokens={total}"
footer = (
f"\n\n-- Turn done. model={(model_used or options.model)} "
f"{_token_summary(usage or {})} cost={cost if cost is not None else '?'} --"
)
print(footer, file=sys.stderr)
# Entry
if __name__ == "__main__":
asyncio.run(main())
Uygulamayı çalıştırmak için terminale şu komutu yazın:
python note_smith.py
Bu, yararlı komutlarla CLI sohbet arayüzünü başlatacaktır.

Önce web sayfasını özetleyelim. Portföy web sitemin URL’sini sağladım:
/summarize abid.work
Önce, aracı hangi araçların kullanılacağını belirleyecek, web sayfasından içeriği çekecek, beş ana noktayı çıkaracak ve bunları sohbet arayüzünde gösterecektir. Sonunda, model adı, token kullanımı ve maliyeti içeren bir kullanım raporu gösterecektir.
I'll fetch and summarize the content from that URL for you.
🛠️ Using tool: WebFetch with input: {"url": "https://abid.work", "prompt": "Extract the main content and key information from this page, including what the person does, their background, projects, and any notable achievements or areas of focus."}
**5 Key Points:**
• **Prolific Tech Educator** - Authored 500+ articles making data science & ML accessible through tutorials, cheat sheets, and practical guides
• **Certified Data Scientist** - Professional focus on building innovative machine learning solutions across NLP, computer vision, and MLOps
• **Multi-Domain Expertise** - Covers Python, SQL, AI, and end-to-end ML workflows with hands-on project demonstrations
• **Content-First Philosophy** - Maintains extensive portfolio including blogs, tutorials, book reviews, and career resources
• **Open Contributor** - Active on GitHub (kingabzpro) sharing code and projects with the community
**TL;DR:** Abid Ali Awan is a certified data scientist who's authored 500+ educational articles and tutorials, specializing in ML, NLP, and making complex tech concepts accessible to learners.
-- Turn done. model=claude-sonnet-4-5-20250929 tokens=326 (in=6, out=320) cost=0.062402849999999996 --
Şimdi bir not kaydedelim:
/note what is love
“what is love” metniyle not kaydetmesini istedik.
🛠️ Using tool: mcp__utils__save_note with input: {"text": "what is love"}
✓ Note saved: "what is love"
-- Turn done. model=claude-sonnet-4-5-20250929 tokens=81 (in=6, out=75) cost=0.07421549999999999 --
Son olarak, nottan bir anahtar kelime vererek notu bulacağız:
/find love
Görüldüğü gibi, dosyayı buldu ve içindeki metni görüntüledi.
🛠️ Using tool: mcp__utils__find_note with input: {"pattern": "love"}
**Found 1 note matching "love":**
• `note_2025-09-30_17-18-02.txt` - "what is love"
-- Turn done. model=claude-sonnet-4-5-20250929 tokens=105 (in=6, out=99) cost=0.08423339999999999 --
Sonuç
Claude Agent SDK’yı kurmak oldukça kolay; özellikle de yerelde Claude Code yüklüyse. Gereken tek şey SDK paketini yüklemek.
Python SDK, Claude ile etkileşim kurmanın iki temel yolunu sağlar:
query()– araçları desteklemese de hafif kullanım senaryoları için en uygun, basit bir metin üretim API’si.ClaudeSDKClient– oturumları sürdürmenize, araçlar kullanmanıza, manuel kontrol sağlamanıza ve daha fazlasına olanak tanıyan, tam özellikli bir aracısal API.
Bu eğitimde, en yeni Anthropic modelini, Claude Sonnet 4.5’i keşfettik ve yeni Claude Agent SDK’yı tanıttık. Kurulum sürecini adım adım yürüttük ve yeteneklerini göstermek için üç örnek proje oluşturduk.
Aracısal iş akışlarıyla denemeler yapmaya ilgi duyuyorsanız, bu SDK’yı mutlaka denemenizi öneririm.
Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.

