0Pricing
AI Agents · Pelajaran

Merancang Alat Agen yang Dapat Dibagikan

Standar skema alat, persyaratan dokumentasi, dan pengemasan untuk digunakan kembali.

Merancang Alat Agen yang Dapat Dibagikan adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang Membuat Alat Dapat Dibagikan?

Alat agen yang dapat dibagikan adalah alat yang dapat langsung digunakan pengembang lain dalam sistem agen mereka tanpa harus membaca kode sumbernya. Alat ini memiliki skema yang jelas dan dapat dibaca mesin, README yang dapat dibaca manusia, kode kesalahan yang terdefinisi dengan baik, serta perilaku yang dapat diprediksi. Anggaplah alat ini sebagai pustaka, bukan skrip.

Standar Skema Alat

Setiap alat yang dapat dibagikan harus memiliki skema yang menjelaskan input, output, dan metadatanya. Skema tersebut merupakan kontrak antara pembuat alat dan agen yang menggunakannya. Dasarkan skema pada JSON Schema agar kompatibel secara maksimal dengan semua kerangka kerja agen utama.

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'])

Kode Kesalahan

Tentukan format respons kesalahan standar. Setiap alat harus mengembalikan struktur kesalahan yang sama: kode, pesan, dan detail opsional. Dengan demikian, agen dapat menangani kesalahan secara terprogram tanpa mengetahui detail internal alat.

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())

Validasi Input

Validasikan input terhadap skema sebelum eksekusi. Gunakan jsonschema untuk validasi otomatis. Gagalkan proses sejak awal dengan kesalahan deskriptif, alih-alih membiarkan input yang tidak valid menimbulkan kegagalan yang membingungkan jauh di dalam logika alat.

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())

Contoh Penggunaan dalam Skema

Tambahkan contoh konkret ke skema alat Anda. Contoh memiliki dua tujuan: membantu manusia memahami alat dengan cepat dan dapat disisipkan ke dalam konteks agen sebagai demonstrasi dengan beberapa contoh untuk meningkatkan akurasi pemanggilan alat.

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']}")

Pembatasan Laju pada Alat

Alat yang memanggil API eksternal harus mematuhi batas laju. Terapkan pembatas laju per alat menggunakan keranjang token atau jendela geser. Kembalikan kesalahan standar RATE_LIMITED dengan jumlah detik tunggu sebelum mencoba lagi ketika batas terlampaui.

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})

Pengemasan sebagai Paket Python

Susun alat Anda sebagai paket Python yang dapat dipasang agar pengembang lain dapat menambahkannya ke agen mereka dengan satu perintah pip install. Paket tersebut mengekspos fungsi get_tool_definition() dan fungsi execute(params) sebagai API publik.

# 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()

Menulis README Alat

README yang jelas sangat penting agar alat digunakan secara luas. Sertakan: fungsi alat, perintah instalasi, kunci API atau kredensial yang diperlukan, semua parameter beserta tipe dan nilai defaultnya, semua kode kesalahan, serta setidaknya satu contoh penggunaan lengkap.

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])

Menguji Alat yang Dapat Dibagikan

Alat yang dapat dibagikan harus memiliki pengujian otomatis yang mencakup: alur normal, setiap kode kesalahan, kasus tepi (string kosong, nilai maksimum), dan perilaku pembatasan laju. Pengujian adalah dokumentasi—pengujian menunjukkan dengan tepat cara kerja alat.

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

Format yang Kompatibel dengan Pemanggilan Fungsi OpenAI

Untuk kompatibilitas dengan API penggunaan alat bawaan OpenAI dan Claude, pastikan skema alat Anda menggunakan format persis seperti yang diharapkan oleh API tersebut. Metode get_openai_schema() mengonversi skema internal Anda ke format yang kompatibel dengan OpenAI.

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'])

Pemberian Versi pada Alat

Gunakan pembuatan versi semantik: MAJOR.MINOR.PATCH. Naikkan MAJOR jika terjadi perubahan skema yang merusak kompatibilitas, MINOR saat menambahkan parameter opsional, dan PATCH untuk perbaikan kesalahan. Simpan versi di dalam skema dan tampilkan melalui get_tool_definition().

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

Uji Pengetahuan

Bagian mana dari skema alat yang memungkinkan kerangka kerja agen memvalidasi input secara otomatis sebelum memanggil fungsi eksekusi alat?

Rangkuman: Merancang Alat Agen yang Dapat Dibagikan

Hal-hal penting dari pelajaran ini:

  • Skema: nama, deskripsi, versi, parameter (JSON Schema), nilai kembalian, rate_limit
  • Kode kesalahan: ToolError standar dengan kode, pesan, dan detail
  • Validasi input: jsonschema memvalidasi input terhadap skema parameter sebelum eksekusi
  • Contoh: disertakan dalam skema sebagai konteks dengan beberapa contoh
  • Pembatasan laju: jendela geser dengan kesalahan RATE_LIMITED dan retry_after
  • Pengemasan: paket yang dapat dipasang dengan pip, dilengkapi README, pengujian, dan pembuatan versi

Berikutnya: penemuan pengaya dan pemuatan alat dinamis.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Merancang Alat Agen yang Dapat Dibagikan” gratis?

Ya — teks lengkap “Merancang Alat Agen yang Dapat Dibagikan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Merancang Alat Agen yang Dapat Dibagikan”?

Standar skema alat, persyaratan dokumentasi, dan pengemasan untuk digunakan kembali. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Merancang Alat Agen yang Dapat Dibagikan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Merancang Alat Agen yang Dapat Dibagikan
  2. Penemuan dan Pendaftaran Plugin
  3. Pemberian Versi dan Kompatibilitas Alat
  4. Membangun Marketplace Plugin Agen
← Kembali ke AI Agents