0Pricing
AI Agents · Ders

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 allowed

OpenAI İş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.1

Bilgi 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

  1. Paylaşılabilir Aracı Araçları Tasarlama
  2. Eklenti Keşfi ve Kaydı
  3. Araç Sürümleme ve Uyumluluk
  4. Aracı Eklentisi Pazaryeri Oluşturma
← AI Agents Sayfasına Dön