Paylaşılabilir Aracı Araçları Tasarlama
Yeniden kullanım için araç şeması standartları, belge gereksinimleri ve paketleme.
Paylaşılabilir Aracı Araçları Tasarlama, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Bir Aracı Paylaşılabilir Kılan Nedir
Paylaşılabilir bir ajan aracı, diğer geliştiricilerin kaynak kodunu okumadan ajan sistemlerine ekleyebileceği araçtır. Açık ve makine tarafından okunabilir bir şemaya, insanların okuyabileceği bir README dosyasına, iyi tanımlanmış hata kodlarına ve öngörülebilir bir davranışa sahiptir. Onu bir betik olarak değil, bir kitaplık olarak düşünün.
Araç Şeması Standartları
Paylaşılabilir her araç, girdilerini, çıktılarını ve üst verilerini açıklayan bir şemaya sahip olmalıdır. Şema, araç yazarı ile aracı kullanan ajan arasındaki sözleşmedir. Tüm başlıca ajan çerçeveleriyle en yüksek uyumluluğu sağlamak için şemanızı JSON Schema temelinde oluşturun.
TOOL_SCHEMA_TEMPLATE = {
'name': 'get_weather',
'description': 'Returns current weather conditions for a city. '
'Use when the user asks about weather or temperature.',
'version': '1.2.0',
'parameters': {
'type': 'object',
'properties': {
'city': {
'type': 'string',
'description': 'City name (e.g., London, Tokyo)',
'minLength': 1,
'maxLength': 100
},
'units': {
'type': 'string',
'enum': ['celsius', 'fahrenheit'],
'default': 'celsius',
'description': 'Temperature unit'
}
},
'required': ['city']
},
'returns': {
'type': 'object',
'properties': {
'temperature': {'type': 'number'},
'condition': {'type': 'string'},
'humidity_pct': {'type': 'number'}
}
},
'rate_limit': {'calls_per_minute': 60}
}
if __name__ == '__main__':
print(f"Tool: {TOOL_SCHEMA_TEMPLATE['name']} (v{TOOL_SCHEMA_TEMPLATE['version']})")
print('Description:', TOOL_SCHEMA_TEMPLATE['description'])
print('Required params:', TOOL_SCHEMA_TEMPLATE['parameters']['required'])
Hata Kodları
Standart bir hata yanıtı biçimi tanımlayın. Her araç aynı hata yapısını döndürmelidir: code, message ve isteğe bağlı details. Böylece ajan, aracın iç işleyişini bilmeden hataları program aracılığıyla işleyebilir.
from enum import Enum
class ToolErrorCode(Enum):
INVALID_PARAMS = 'INVALID_PARAMS'
NOT_FOUND = 'NOT_FOUND'
RATE_LIMITED = 'RATE_LIMITED'
UPSTREAM_ERROR = 'UPSTREAM_ERROR'
TIMEOUT = 'TIMEOUT'
UNAUTHORISED = 'UNAUTHORISED'
INTERNAL_ERROR = 'INTERNAL_ERROR'
class ToolError(Exception):
def __init__(self, code: ToolErrorCode, message: str, details: dict = None):
self.code = code
self.message = message
self.details = details or {}
def to_dict(self) -> dict:
return {
'error': True,
'code': self.code.value,
'message': self.message,
'details': self.details
}
try:
raise ToolError(
ToolErrorCode.NOT_FOUND,
'City not found in database',
{'city': 'Atlantis', 'suggestion': 'Did you mean Athens?'}
)
except ToolError as e:
print(e.to_dict())Girdi Doğrulama
Yürütmeden önce girdileri şemaya göre doğrulayın. Otomatik doğrulama için jsonschema kullanın. Geçersiz girdilerin aracın mantığının derinliklerinde anlaşılması zor hatalara yol açmasına izin vermek yerine, açıklayıcı bir hatayla hemen başarısız olun.
import jsonschema # pip install jsonschema
def validate_tool_input(params: dict, schema: dict) -> dict:
"""
Validate params against schema.
Returns validated (and default-filled) params.
Raises ToolError on validation failure.
"""
try:
# Fill in defaults
filled = dict(params)
for prop, definition in schema['properties'].items():
if prop not in filled and 'default' in definition:
filled[prop] = definition['default']
# Validate against schema
jsonschema.validate(instance=filled, schema=schema)
return filled
except jsonschema.ValidationError as e:
raise ToolError(
ToolErrorCode.INVALID_PARAMS,
f'Validation failed: {e.message}',
{'path': list(e.path), 'schema_path': list(e.schema_path)}
)
# Example usage:
try:
params = validate_tool_input({'city': 'London'}, TOOL_SCHEMA_TEMPLATE['parameters'])
print('Valid params:', params)
except ToolError as e:
print('Error:', e.to_dict())Şemada Kullanım Örnekleri
Araç şemanıza somut örnekler ekleyin. Örneklerin iki amacı vardır: insanların aracı hızlıca anlamasına yardımcı olmak ve araç çağrılarının doğruluğunu artırmak için ajanın bağlamına birkaç örnekli gösterimler olarak eklenebilmek.
TOOL_WITH_EXAMPLES = {
'name': 'search_knowledge_base',
'description': 'Search the company knowledge base for documentation.',
'parameters': {
'type': 'object',
'properties': {
'query': {'type': 'string'},
'top_k': {'type': 'integer', 'default': 5, 'minimum': 1, 'maximum': 20}
},
'required': ['query']
},
'examples': [
{
'description': 'Search for onboarding docs',
'input': {'query': 'how to onboard new users', 'top_k': 3},
'output': {'results': [{'title': 'User Onboarding Guide', 'score': 0.95}]}
},
{
'description': 'Search with default top_k',
'input': {'query': 'API authentication'},
'output': {'results': [{'title': 'API Auth Docs', 'score': 0.88}]}
}
]
}
if __name__ == '__main__':
print('Tool:', TOOL_WITH_EXAMPLES['name'])
for ex in TOOL_WITH_EXAMPLES['examples']:
print(f" - {ex['description']}: input={ex['input']} -> output={ex['output']}")
Araçlarda Hız Sınırlama
Harici API'leri çağıran araçlar hız sınırlarına uymalıdır. Belirteç kovası veya kayan pencere kullanarak araç başına bir hız sınırlayıcı uygulayın. Sınır aşıldığında yeniden deneme için kalan saniyeleri belirten standart bir RATE_LIMITED hatası döndürün.
import time
from collections import deque
class SlidingWindowRateLimiter:
def __init__(self, max_calls: int, window_seconds: int):
self.max_calls = max_calls
self.window = window_seconds
self._calls = deque() # timestamps of recent calls
def check(self) -> tuple:
"""
Returns (allowed: bool, retry_after_seconds: float)
"""
now = time.time()
# Remove calls outside the window
while self._calls and self._calls[0] < now - self.window:
self._calls.popleft()
if len(self._calls) >= self.max_calls:
oldest = self._calls[0]
retry_after = (oldest + self.window) - now
return False, round(retry_after, 1)
self._calls.append(now)
return True, 0.0
weather_limiter = SlidingWindowRateLimiter(max_calls=10, window_seconds=60)
allowed, retry = weather_limiter.check()
if not allowed:
raise ToolError(ToolErrorCode.RATE_LIMITED,
f'Rate limit exceeded. Retry in {retry}s',
{'retry_after': retry})Python Paketi Olarak Paketleme
Aracınızı, diğer geliştiricilerin tek bir pip install komutuyla ajanlarına ekleyebilmesi için kurulabilir bir Python paketi olarak yapılandırın. Paket, genel API olarak get_tool_definition() işlevini ve execute(params) işlevini sunar.
# Directory structure:
# agent_tool_weather/
# __init__.py
# tool.py
# schema.py
# pyproject.toml
# README.md
# agent_tool_weather/tool.py
from .schema import SCHEMA
from .errors import ToolError, ToolErrorCode
def get_tool_definition() -> dict:
return SCHEMA
def execute(params: dict) -> dict:
validated = validate_tool_input(params, SCHEMA['parameters'])
city = validated['city']
units = validated['units']
return _fetch_weather(city, units)
def _fetch_weather(city: str, units: str) -> dict:
import requests
url = f'https://api.weather.example.com/current?city={city}&units={units}'
response = requests.get(url, headers={'X-API-Key': 'YOUR_KEY'}, timeout=5)
if response.status_code == 404:
raise ToolError(ToolErrorCode.NOT_FOUND, f'City not found: {city}')
response.raise_for_status()
return response.json()Araç README Dosyasını Yazma
Açık bir README, benimsenme için gereklidir. Şunları ekleyin: aracın ne yaptığı, kurulum komutu, gerekli API anahtarları veya kimlik bilgileri, türleri ve varsayılan değerleriyle birlikte tüm parametreler, tüm hata kodları ve en az bir eksiksiz kullanım örneği.
README_TEMPLATE = '''
# agent-tool-weather
Get real-time weather conditions for any city.
## Installation
pip install agent-tool-weather
## Setup
import os
os.environ["WEATHER_API_KEY"] = "your-key-here"
## Usage
from agent_tool_weather import get_tool_definition, execute
# In your agent
tool_def = get_tool_definition()
# Execute
result = execute({"city": "Tokyo", "units": "celsius"})
print(result)
# {"temperature": 22.5, "condition": "Partly cloudy", "humidity_pct": 65}
## Parameters
| Name | Type | Required | Default | Description |
|-------|--------|----------|----------|-----------------|
| city | string | Yes | - | City name |
| units | string | No | celsius | celsius or fahrenheit |
## Error Codes
- INVALID_PARAMS: Parameter validation failed
- NOT_FOUND: City not found
- RATE_LIMITED: 60 calls/minute limit exceeded
- UPSTREAM_ERROR: Weather API unavailable
'''
print(README_TEMPLATE[:300])Paylaşılabilir Bir Aracı Test Etme
Paylaşılabilir bir araçta şu durumları kapsayan otomatik testler bulunmalıdır: başarılı akış, her hata kodu, sınır durumları (boş dizeler, en yüksek değerler) ve hız sınırlama davranışı. Testler belgelendirme görevi görür; aracın tam olarak nasıl davrandığını gösterir.
import pytest
def test_valid_city_returns_weather(mock_weather_api):
result = execute({'city': 'London'})
assert 'temperature' in result
assert 'condition' in result
assert isinstance(result['temperature'], (int, float))
def test_missing_required_param_raises_error():
with pytest.raises(ToolError) as exc_info:
execute({}) # city is required
assert exc_info.value.code == ToolErrorCode.INVALID_PARAMS
def test_unknown_city_raises_not_found(mock_weather_api_404):
with pytest.raises(ToolError) as exc_info:
execute({'city': 'Atlantis'})
assert exc_info.value.code == ToolErrorCode.NOT_FOUND
def test_default_units_is_celsius():
params = validate_tool_input({'city': 'Paris'}, TOOL_SCHEMA_TEMPLATE['parameters'])
assert params['units'] == 'celsius'
def test_rate_limit_enforced():
limiter = SlidingWindowRateLimiter(max_calls=2, window_seconds=60)
limiter.check() # call 1
limiter.check() # call 2
allowed, _ = limiter.check() # call 3 — should fail
assert not allowedOpenAI İşlev Çağırmayla Uyumlu Biçim
OpenAI ve Claude'un yerel araç kullanımı API'leriyle uyumluluk için araç şemanızın bu API'lerin beklediği tam biçimde olduğundan emin olun. get_openai_schema() yöntemi, dahili şemanızı OpenAI uyumlu biçime dönüştürür.
def get_openai_schema(tool_schema: dict) -> dict:
"""Convert internal tool schema to OpenAI function-calling format."""
return {
'type': 'function',
'function': {
'name': tool_schema['name'],
'description': tool_schema['description'],
'parameters': tool_schema['parameters']
}
}
def get_anthropic_schema(tool_schema: dict) -> dict:
"""Convert to Anthropic tool format."""
return {
'name': tool_schema['name'],
'description': tool_schema['description'],
'input_schema': tool_schema['parameters']
}
# Usage in an agent:
openai_tools = [get_openai_schema(t) for t in [TOOL_SCHEMA_TEMPLATE]]
anthropic_tools = [get_anthropic_schema(t) for t in [TOOL_SCHEMA_TEMPLATE]]
print('OpenAI format:', openai_tools[0]['function']['name'])
print('Anthropic format:', anthropic_tools[0]['name'])Aracınızı Sürümleme
Anlamsal sürümleme kullanın: MAJOR.MINOR.PATCH. Şemayı bozan değişikliklerde MAJOR değerini, isteğe bağlı parametreler eklediğinizde MINOR değerini, hata düzeltmelerinde PATCH değerini artırın. Sürümü şemada saklayın ve get_tool_definition() üzerinden sunun.
VERSION = '1.2.0'
def bump_version(current: str, change_type: str) -> str:
parts = list(map(int, current.split('.')))
if change_type == 'major':
return f'{parts[0]+1}.0.0'
if change_type == 'minor':
return f'{parts[0]}.{parts[1]+1}.0'
if change_type == 'patch':
return f'{parts[0]}.{parts[1]}.{parts[2]+1}'
raise ValueError(f'Unknown change_type: {change_type}')
# Breaking change (removed required param) -> major
print(bump_version('1.2.0', 'major')) # 2.0.0
# Added optional param -> minor
print(bump_version('1.2.0', 'minor')) # 1.3.0
# Bug fix -> patch
print(bump_version('1.2.0', 'patch')) # 1.2.1Bilgi Kontrolü
Paylaşılabilir bir araç şemasının hangi bölümü, ajan çerçevesinin aracın yürütme işlevini çağırmadan önce girdileri otomatik olarak doğrulamasını sağlar?
Özet: Paylaşılabilir Ajan Araçları Tasarlama
Bu dersten çıkarılacak temel sonuçlar:
- Şema: name, description, version, parameters (JSON Schema), returns, rate_limit
- Hata kodları: code, message ve details alanlarına sahip standart ToolError
- Girdi doğrulama: jsonschema, yürütmeden önce girdileri parameters şemasına göre doğrular
- Örnekler: Şemaya birkaç örnekli bağlam olarak eklenir
- Hız sınırlama: RATE_LIMITED hatası ve retry_after ile kayan pencere
- Paketleme: README, testler ve sürümleme içeren pip ile kurulabilir paket
Sonraki konu: eklenti keşfi ve dinamik araç yükleme.
Sıkça Sorulan Sorular
“Paylaşılabilir Aracı Araçları Tasarlama” dersi ücretsiz mi?
Evet — “Paylaşılabilir Aracı Araçları Tasarlama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Paylaşılabilir Aracı Araçları Tasarlama” dersinde ne öğreneceğim?
Yeniden kullanım için araç şeması standartları, belge gereksinimleri ve paketleme. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Paylaşılabilir Aracı Araçları Tasarlama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Paylaşılabilir Aracı Araçları Tasarlama
- Eklenti Keşfi ve Kaydı
- Araç Sürümleme ve Uyumluluk
- Aracı Eklentisi Pazaryeri Oluşturma