Aracı Eklentisi Pazaryeri Oluşturma
Merkezî araç mağazası: aracı eklentilerini yayımlama, puanlama ve dağıtma.
Aracı Eklentisi Pazaryeri Oluşturma, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 4. 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.
Etmen Eklentisi Pazarı Nedir?
Eklenti pazarı, geliştiricilerin paylaşılabilir araçlar yayımladığı, diğer geliştiricilerin bunları arayarak keşfettiği ve etmen sistemlerinin bunları otomatik olarak yüklediği merkezi bir kayıt sistemidir. Etmen araçları için npm gibi düşünün: bir kez yayımlayın, her yerde kullanın.
Pazar Yeri Mimarisi
Pazarda dört temel hizmet bulunur: Kayıt Sistemi (eklenti üst verilerini bir veritabanında depolar), Depolama (eklenti arşivlerini nesne depolamada tutar), Arama (tam metin dizini) ve Güvenlik (paketleri imzalar ve doğrular). Bunların tümü bir REST API üzerinden sunulur.
# Marketplace REST API endpoints:
API_ROUTES = {
'POST /plugins': 'Publish a new plugin version',
'GET /plugins': 'List all plugins (paginated)',
'GET /plugins/search?q=weather': 'Search by keyword',
'GET /plugins/{name}': 'Get plugin metadata',
'GET /plugins/{name}/{version}': 'Get specific version metadata',
'GET /plugins/{name}/{version}/download': 'Download plugin archive',
'POST /plugins/{name}/{version}/reviews': 'Submit a rating/review',
'GET /plugins/{name}/reviews': 'Get all reviews',
'DELETE /plugins/{name}/{version}': 'Yank (hide) a version',
}
for route, description in API_ROUTES.items():
print(f'{route}: {description}')Eklenti Yayımlama
Yayımlama uç noktası eklenti arşivini doğrular, bildirimi denetler, yayımlayıcının kimliğini (API anahtarı aracılığıyla) doğrular, bilinen kötü amaçlı kalıpları tarar, paketi imzalar ve depolar. Yayımlama atomiktir: ya yüklemenin tamamı başarıyla gerçekleşir ya da hiçbir şey depolanmaz.
import hashlib
import hmac
import os
def publish_plugin(
archive_path: str,
api_key: str,
registry_url: str = 'https://registry.agenttools.io'
) -> dict:
import requests
# Compute checksum for integrity
with open(archive_path, 'rb') as f:
data = f.read()
sha256 = hashlib.sha256(data).hexdigest()
# Sign the archive with the developer's API key
signature = hmac.new(
api_key.encode(), data, hashlib.sha256
).hexdigest()
response = requests.post(
f'{registry_url}/plugins',
files={'archive': (os.path.basename(archive_path), data, 'application/zip')},
headers={
'X-API-Key': api_key,
'X-Signature': signature,
'X-Checksum-SHA256': sha256
},
timeout=60
)
response.raise_for_status()
return response.json()Yayımlama Sırasında Sunucu Tarafı Doğrulaması
Kayıt sunucusu her gönderimi doğrular: bildirim ayrıştırılabilir ve eksiksiz olmalı, sürüm daha önce mevcut olmamalı, arşiv boyut sınırını aşmamalı ve temel güvenlik taramasından geçmelidir. Sunucu, ancak tüm denetimler tamamlandıktan sonra yüklemeyi kabul eder.
import zipfile
import io
import json
MAX_ARCHIVE_SIZE_MB = 50
def validate_plugin_archive(archive_bytes: bytes) -> dict:
errors = []
# Size check
size_mb = len(archive_bytes) / 1024 / 1024
if size_mb > MAX_ARCHIVE_SIZE_MB:
errors.append(f'Archive too large: {size_mb:.1f}MB (max {MAX_ARCHIVE_SIZE_MB}MB)')
return {'valid': False, 'errors': errors}
# Must be a valid zip
try:
zf = zipfile.ZipFile(io.BytesIO(archive_bytes))
except zipfile.BadZipFile:
errors.append('Not a valid zip archive')
return {'valid': False, 'errors': errors}
file_list = zf.namelist()
# Must contain plugin.json
if 'plugin.json' not in file_list:
errors.append('Missing plugin.json in archive root')
# Basic security scan: no .pyc files, no hidden dirs
suspicious = [f for f in file_list if f.startswith('.') or '__pycache__' in f]
if suspicious:
errors.append(f'Suspicious files: {suspicious[:3]}')
return {'valid': len(errors) == 0, 'errors': errors, 'files': len(file_list)}
if __name__ == '__main__':
buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w') as zf:
zf.writestr('plugin.json', '{"name": "demo-plugin"}')
archive_bytes = buf.getvalue()
print('Validation result:', validate_plugin_archive(archive_bytes))
Paket İmzalama ve Doğrulama
Yayımlanan her paketi yayımlayıcının anahtarıyla imzalayın. Paket aktarım sırasında veya depolama alanında değiştirilmediğinden emin olmak için istemciler yüklemeden önce imzayı doğrulasın.
import hashlib
import hmac
def sign_package(archive_bytes: bytes, secret_key: str) -> str:
return hmac.new(
secret_key.encode(), archive_bytes, hashlib.sha256
).hexdigest()
def verify_package(
archive_bytes: bytes,
signature: str,
secret_key: str
) -> bool:
expected = sign_package(archive_bytes, secret_key)
return hmac.compare_digest(expected, signature)
# Example:
package_data = b'fake plugin archive bytes'
developer_key = 'developer_secret_key_abc123'
sig = sign_package(package_data, developer_key)
print(f'Signature: {sig[:20]}...')
# Verify (registry or installer):
valid = verify_package(package_data, sig, developer_key)
print(f'Signature valid: {valid}')
# Tampered data:
tampered = b'tampered bytes'
print(f'Tampered valid: {verify_package(tampered, sig, developer_key)}')Aramayla Eklenti Keşfi
Arama API'si serbest metin sorgularını ve etiket filtrelerini kabul eder. Ağırlıklı bir puan kullanarak sıralanmış sonuçlar döndürür: tam ad eşleşmesi en üstte, ardından etiket eşleşmeleri ve son olarak açıklamadaki anahtar kelime eşleşmeleri gelir.
import requests
def search_marketplace(
query: str,
tags: list = None,
page: int = 0,
per_page: int = 20,
registry_url: str = 'https://registry.agenttools.io'
) -> dict:
params = {
'q': query,
'page': page,
'per_page': per_page
}
if tags:
params['tags'] = ','.join(tags)
response = requests.get(
f'{registry_url}/plugins/search',
params=params,
timeout=10
)
response.raise_for_status()
return response.json()
# Usage:
results = search_marketplace('weather forecast', tags=['iot', 'weather'])
# {
# 'total': 12,
# 'results': [
# {'name': 'weather-tools', 'version': '2.1.0', 'score': 0.98, ...},
# ...
# ]
# }
print(f'Total results: {results.get("total", 0)}')Eklenti Yükleme
Yükleme süreci şu adımlardan oluşur: arşivi indirme, imzayı doğrulama, eklentiler dizinine çıkarma, bildirimi doğrulama, bağımlılıkları denetleme ve yerel araç kayıt sistemine kaydetme. Tüm adımlar başarıyla tamamlanmalı; aksi hâlde yükleme geri alınmalıdır.
import requests
import zipfile
import io
import shutil
import os
def install_plugin(
plugin_name: str,
version: str = 'latest',
plugins_dir: str = 'plugins',
registry_url: str = 'https://registry.agenttools.io'
) -> bool:
# Step 1: Get metadata including expected signature
meta = requests.get(
f'{registry_url}/plugins/{plugin_name}/{version}',
timeout=10
).json()
# Step 2: Download archive
archive_resp = requests.get(
meta['download_url'], timeout=60
)
archive_bytes = archive_resp.content
# Step 3: Verify signature
if not verify_package(archive_bytes, meta['signature'], meta['public_key']):
print('Signature verification FAILED — aborting install')
return False
# Step 4: Extract
install_path = os.path.join(plugins_dir, plugin_name)
if os.path.exists(install_path):
shutil.rmtree(install_path) # remove old version
with zipfile.ZipFile(io.BytesIO(archive_bytes)) as zf:
zf.extractall(install_path)
print(f'Installed {plugin_name} v{version} to {install_path}')
return TruePuanlama ve Yorum Sistemi
Bir puanlama sistemi, geliştiricilerin yüksek kaliteli eklentileri seçmesine yardımcı olur. İsteğe bağlı metin yorumlarıyla birlikte 1–5 yıldızlı puanlamalar uygulayın. Toplu puan verileri (mean, sayı) kayıt sisteminde depolanır ve arama sonuçlarında döndürülür.
import requests
def submit_review(
plugin_name: str,
stars: int,
review_text: str = '',
api_key: str = '',
registry_url: str = 'https://registry.agenttools.io'
) -> dict:
if not 1 <= stars <= 5:
raise ValueError('Stars must be 1-5')
payload = {
'stars': stars,
'review': review_text[:500] # truncate to max length
}
response = requests.post(
f'{registry_url}/plugins/{plugin_name}/reviews',
json=payload,
headers={'X-API-Key': api_key},
timeout=10
)
response.raise_for_status()
return response.json()
def get_reviews(plugin_name: str, registry_url: str = 'https://registry.agenttools.io') -> dict:
response = requests.get(
f'{registry_url}/plugins/{plugin_name}/reviews',
timeout=10
)
return response.json()
# Example response structure:
# {'average_stars': 4.3, 'total_reviews': 47,
# 'reviews': [{'stars': 5, 'review': 'Works great!', 'date': '...'}]}
print('Review system ready')Bir Sürümü Yayından Çekme (Kullanımdan Kaldırma)
Yayımlanmış bir sürümde kritik bir hata veya güvenlik açığı varsa onu yayından çekin: yeni yüklemelerin onu kullanamaması için kayıt sisteminde gizli olarak işaretleyin; ancak mevcut yüklemeler çalışmaya devam etsin. Bu, mevcut etmenleri bozacak silme işleminden daha güvenlidir.
import requests
def yank_version(
plugin_name: str,
version: str,
reason: str,
api_key: str,
registry_url: str = 'https://registry.agenttools.io'
) -> dict:
response = requests.delete(
f'{registry_url}/plugins/{plugin_name}/{version}',
json={'reason': reason},
headers={'X-API-Key': api_key},
timeout=10
)
response.raise_for_status()
return response.json()
# Yanked versions:
# - Still downloadable by users who have them pinned
# - Not returned in 'latest' queries
# - Search results show a 'yanked' badge with reason
# - Install of yanked version requires explicit --allow-yanked flag
print('Yanking removes a version from new installs without breaking existing ones.')
print('Always provide a reason: "Security vulnerability in API key handling"')Pazar Yeri CLI Aracı
Bir komut satırı arayüzü, pazarı uçbirimden veya CI işlem hatlarından kullanmayı kolaylaştırır. marketplace install, marketplace search, marketplace publish ve marketplace list komutlarını uygulayın.
import argparse
import sys
def main():
parser = argparse.ArgumentParser(description='Agent Tool Marketplace CLI')
subparsers = parser.add_subparsers(dest='command')
# Search
search_parser = subparsers.add_parser('search', help='Search plugins')
search_parser.add_argument('query', help='Search query')
search_parser.add_argument('--tag', action='append', dest='tags')
# Install
install_parser = subparsers.add_parser('install', help='Install a plugin')
install_parser.add_argument('plugin', help='Plugin name')
install_parser.add_argument('--version', default='latest')
install_parser.add_argument('--plugins-dir', default='plugins')
# Publish
publish_parser = subparsers.add_parser('publish', help='Publish plugin')
publish_parser.add_argument('archive', help='Path to .zip archive')
publish_parser.add_argument('--api-key', required=True)
args = parser.parse_args()
if args.command == 'search':
results = search_marketplace(args.query, tags=args.tags or [])
for r in results.get('results', []):
print(f'{r["name"]} v{r["version"]} ({r.get("average_stars", "?")} stars)')
elif args.command == 'install':
install_plugin(args.plugin, args.version, args.plugins_dir)
elif args.command == 'publish':
result = publish_plugin(args.archive, args.api_key)
print('Published:', result)Pazar Yeri Yönetişimi
Herkese açık bir pazar yerinin yönetişim kurallarına ihtiyacı vardır: ad alanı kullanımı (ad işgalini önlemek için), içerik denetimi (kötü amaçlı koda izin vermemek için), güvenlik taraması (yükleme sırasında statik analiz) ve kaldırma süreci (yasal veya güvenlik olayları için). Bunlar teknik olduğu kadar kurumsal kaygılardır.
MARKETPLACE_POLICIES = {
'namespace_policy': (
'Plugin names must be unique across the registry. '
'Names are claimed on first publish. '
'Transfers require proof of original authorship.'
),
'security_scanning': (
'All uploads are scanned with bandit (Python security linter). '
'Critical vulnerabilities block publish. '
'High vulnerabilities generate a warning visible to installers.'
),
'rate_limits': {
'publish_per_hour': 10,
'search_per_minute': 60,
'install_per_minute': 30
},
'takedown_process': (
'Maintainers can yank versions at any time. '
'Legal/security takedowns processed within 48 hours. '
'Appeals via security@agenttools.io'
)
}
for policy, detail in MARKETPLACE_POLICIES.items():
if isinstance(detail, str):
print(f'{policy}: {detail[:80]}...')
else:
print(f'{policy}: {detail}')Bilgi Kontrolü
Bir eklenti sürümünü yayından çekmek ile silmek arasındaki fark nedir?
Özet: Etmen Eklentisi Pazarı Oluşturma
Bu dersi tamamladığınız için tebrikler! Temel noktalar:
- Yayımlama işlem hattı: arşivi doğrula → imzayı doğrula → tara → depola ve dizine ekle
- Paket imzalama: HMAC imzası bütünlüğü sağlar; istemciler yüklemeden önce doğrular
- Arama: etiket filtreleme ve ilgi sıralaması içeren tam metin araması
- Yükleme: indir → doğrula → çıkar → doğrula → kaydet (başarısızlıkta geri al)
- Puanlamalar: kayıt sisteminde toplu hâle getirilen 1–5 yıldız ve metin yorumları
- Yayından çekme: mevcut yüklemeleri bozmadan yeni yüklemelerde gizleme
Son ders: Otonom Sistemlere Giden Yol.
Sıkça Sorulan Sorular
“Aracı Eklentisi Pazaryeri Oluşturma” dersi ücretsiz mi?
Evet — “Aracı Eklentisi Pazaryeri Oluşturma” 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.
“Aracı Eklentisi Pazaryeri Oluşturma” dersinde ne öğreneceğim?
Merkezî araç mağazası: aracı eklentilerini yayımlama, puanlama ve dağıtma. 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 4. dersidir.
“Aracı Eklentisi Pazaryeri Oluşturma” 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