0Pricing
AI Agents · Lektion

Einen Agent-Plugin-Marktplatz erstellen

Zentraler Tool-Store: Agent-Plugins veröffentlichen, bewerten und verteilen.

Einen Agent-Plugin-Marktplatz erstellen ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Agent-Plugin-Marktplatz?

Ein Plugin-Marktplatz ist eine zentrale Registry, in der Entwickler gemeinsam nutzbare Tools veröffentlichen, andere Entwickler sie über die Suche entdecken und Agent-Systeme sie automatisch installieren. Stellen Sie sich npm für Agent-Tools vor: einmal veröffentlichen, überall verwenden.

Marktplatzarchitektur

Der Marktplatz umfasst vier zentrale Dienste: Registry (speichert Plugin-Metadaten in einer Datenbank), Storage (speichert Plugin-Archive in einem Objektspeicher), Search (Volltextindex) und Security (signiert und verifiziert Pakete). Alle Dienste werden über eine REST-API bereitgestellt.

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

Ein Plugin veröffentlichen

Der Endpunkt zum Veröffentlichen validiert das Plugin-Archiv, prüft das Manifest, verifiziert die Identität des Herausgebers (über einen API-Schlüssel), sucht nach bekannten schädlichen Mustern, signiert das Paket und speichert es. Die Veröffentlichung erfolgt atomar – entweder ist der vollständige Upload erfolgreich oder es wird nichts gespeichert.

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

Serverseitige Validierung bei der Veröffentlichung

Der Registry-Server validiert jede Einreichung: Das Manifest muss analysierbar und vollständig sein, die Version darf noch nicht vorhanden sein, das Archiv darf die Größenbeschränkung nicht überschreiten und ein grundlegender Sicherheitsscan muss erfolgreich sein. Erst nach Abschluss aller Prüfungen akzeptiert der Server den Upload.

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

Paketsignierung und -verifizierung

Signieren Sie jedes veröffentlichte Paket mit dem Schlüssel des Herausgebers. Clients verifizieren die Signatur vor der Installation, um sicherzustellen, dass das Paket während der Übertragung oder Speicherung nicht manipuliert wurde.

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

Plugins über die Suche entdecken

Die Search-API akzeptiert Freitextabfragen und Tag-Filter. Sie gibt nach Rang geordnete Ergebnisse anhand einer gewichteten Bewertung zurück: Eine exakte Namensübereinstimmung erhält die höchste Platzierung, gefolgt von Übereinstimmungen bei Tags und anschließend von Übereinstimmungen mit Schlüsselwörtern in der Beschreibung.

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

Ein Plugin installieren

Der Installationsprozess umfasst folgende Schritte: Archiv herunterladen, Signatur verifizieren, in das Plugin-Verzeichnis entpacken, Manifest validieren, Abhängigkeiten prüfen und in der lokalen Tool-Registry registrieren. Alle Schritte müssen erfolgreich sein, andernfalls wird die Installation zurückgerollt.

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 True

Bewertungs- und Rezensionensystem

Ein Bewertungssystem hilft Entwicklern bei der Auswahl hochwertiger Plugins. Implementieren Sie Bewertungen mit 1 bis 5 Sternen und optionalen Textrezensionen. Aggregierte Bewertungsdaten (Mittelwert, Anzahl) werden in der Registry gespeichert und in den Suchergebnissen zurückgegeben.

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

Eine Version zurückziehen (Deprecation)

Wenn eine veröffentlichte Version einen kritischen Fehler oder eine Sicherheitslücke enthält, ziehen Sie sie zurück: Markieren Sie sie in der Registry als verborgen, damit neue Installationen sie nicht verwenden können, während bestehende Installationen weiterhin funktionieren. Das ist sicherer als eine Löschung, durch die bestehende Agents beeinträchtigt würden.

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

CLI-Tool für den Marktplatz

Eine Befehlszeilenschnittstelle macht den Marktplatz einfach über das Terminal oder CI-Pipelines nutzbar. Implementieren Sie die Befehle marketplace install, marketplace search, marketplace publish und marketplace list.

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)

Governance des Marktplatzes

Ein öffentlicher Marktplatz benötigt Governance-Regeln: Namensräume (um das Besetzen von Namen zu verhindern), Inhaltsmoderation (kein schädlicher Code), Sicherheitsscans (statische Analyse beim Upload) und ein Verfahren zum Entfernen von Inhalten (bei rechtlichen oder sicherheitsrelevanten Vorfällen). Dabei handelt es sich ebenso sehr um organisatorische wie um technische Fragen.

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

Wissenscheck

Was ist der Unterschied zwischen dem Zurückziehen und dem Löschen einer Plugin-Version?

Zusammenfassung: Einen Agent-Plugin-Marktplatz aufbauen

Herzlichen Glückwunsch zum Abschluss dieser Lektion! Die wichtigsten Punkte:

  • Veröffentlichungspipeline: Archiv validieren → Signatur verifizieren → scannen → speichern und indexieren
  • Paketsignierung: Eine HMAC-Signatur gewährleistet die Integrität; Clients verifizieren sie vor der Installation
  • Suche: Volltextsuche mit Tag-Filterung und Relevanzbewertung
  • Installation: herunterladen → verifizieren → entpacken → validieren → registrieren (Rollback bei Fehlern)
  • Bewertungen: 1 bis 5 Sterne und Textrezensionen, aggregiert in der Registry
  • Zurückziehen: Für neue Installationen ausblenden, ohne bestehende Installationen zu beeinträchtigen

Abschlusskurs: Der Weg zu autonomen Systemen.

Häufig gestellte Fragen

Ist die Lektion „Einen Agent-Plugin-Marktplatz erstellen“ kostenlos?

Ja — der vollständige Text von „Einen Agent-Plugin-Marktplatz erstellen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Einen Agent-Plugin-Marktplatz erstellen“?

Zentraler Tool-Store: Agent-Plugins veröffentlichen, bewerten und verteilen. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Agents zu starten?

Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Einen Agent-Plugin-Marktplatz erstellen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?

Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Teilbare Agent-Tools entwerfen
  2. Plugins entdecken und registrieren
  3. Tool-Versionierung und Kompatibilität
  4. Einen Agent-Plugin-Marktplatz erstellen
← Zurück zu AI Agents