A2A Protocol

A2A JS SDK Komplettanleitung: Schnellstart-Guide

MILO
Share
A2A JS SDK Komplettanleitung: Schnellstart-Guide

Inhaltsverzeichnis

  1. Was ist das A2A JS SDK?
  2. A2A JS Installation und Einrichtung
  3. A2A JS Grundkonzepte
  4. Erstellen Ihres ersten A2A JS Agenten
  5. A2A JS Server-Entwicklung
  6. A2A JS Client-Verwendung
  7. A2A JS Erweiterte Funktionen
  8. A2A JS Best Practices
  9. A2A JS Fehlerbehebung

Was ist das A2A JS SDK?

Das A2A JS SDK ist eine leistungsstarke Bibliothek, die speziell für JavaScript/TypeScript-Entwickler entwickelt wurde, um intelligente Agentenanwendungen zu erstellen, die dem Agent2Agent (A2A) Protokoll entsprechen. Mit diesem A2A JS Framework können Entwickler leicht intelligente Agentensysteme erstellen, die miteinander kommunizieren und zusammenarbeiten können.

Hauptvorteile von A2A JS

  • 🚀 Benutzerfreundlichkeit: A2A JS bietet eine intuitive API für schnellen Einstieg
  • 🔄 Echtzeit-Kommunikation: Unterstützung für Streaming-Verarbeitung und Server-Sent Events (SSE)
  • 🛡️ Typsicherheit: TypeScript-basiert, bietet vollständige Typunterstützung
  • 🌐 Plattformübergreifend: A2A JS kann in Node.js- und Browser-Umgebungen ausgeführt werden
  • 📡 Standardprotokoll: Vollständige Implementierung der A2A-Protokollspezifikation

A2A JS Installation und Einrichtung

A2A JS SDK Installation

Installieren Sie das A2A JS SDK mit npm:

npm install @a2a-js/sdk

Oder verwenden Sie yarn:

yarn add @a2a-js/sdk

Überprüfung der A2A JS Installation

Erstellen Sie eine einfache Testdatei, um die korrekte Installation von A2A JS zu überprüfen:

import { A2AClient, AgentCard } from "@a2a-js/sdk";

console.log("A2A JS SDK erfolgreich installiert!");

A2A JS Grundkonzepte

Bevor Sie mit A2A JS beginnen, ist es wichtig, die folgenden Grundkonzepte zu verstehen:

1. Agent-Karte

Jeder A2A JS Agent benötigt eine Agent-Karte, die seine Fähigkeiten und Schnittstelle beschreibt:

import { AgentCard } from "@a2a-js/sdk";

const agentCard: AgentCard = {
  name: 'Mein A2A JS Agent',
  description: 'Intelligenter Agent, erstellt mit dem A2A JS SDK',
  url: 'http://localhost:3000/',
  provider: {
    organization: 'A2A JS Entwickler',
    url: 'https://example.com'
  },
  version: '1.0.0',
  capabilities: {
    streaming: true,
    pushNotifications: false,
    stateTransitionHistory: true,
  },
  skills: [{
    id: 'general_chat',
    name: 'Allgemeiner Chat',
    description: 'Allgemeine Konversation mit A2A JS',
    tags: ['chat', 'a2a-js'],
    examples: ['Hallo', 'Hilfe bei der Beantwortung von Fragen']
  }]
};

2. Agent-Ausführer

Die Hauptausführungslogik von A2A JS wird über den AgentExecutor implementiert:

import { AgentExecutor, RequestContext, IExecutionEventBus } from "@a2a-js/sdk";

class MyA2AJSExecutor implements AgentExecutor {
  async execute(
    requestContext: RequestContext,
    eventBus: IExecutionEventBus
  ): Promise<void> {
    // A2A JS Agent-Logik
    console.log("A2A JS Agent verarbeitet Anfrage...");
  }

  async cancelTask(taskId: string, eventBus: IExecutionEventBus): Promise<void> {
    console.log(`A2A JS Aufgabe wird abgebrochen: ${taskId}`);
  }
}

Erstellen Ihres ersten A2A JS Agenten

Lassen Sie uns ein vollständiges Agenten-Beispiel mit dem A2A JS SDK erstellen:

Schritt 1: A2A JS Agent-Karte definieren

import { AgentCard } from "@a2a-js/sdk";

const myAgentCard: AgentCard = {
  name: 'Hello World A2A JS Agent',
  description: 'Mein erster A2A JS Agent zum Erlernen des SDKs',
  url: 'http://localhost:3000/',
  provider: {
    organization: 'A2A JS Tutorial',
    url: 'https://example.com'
  },
  version: '1.0.0',
  capabilities: {
    streaming: true,
    pushNotifications: false,
    stateTransitionHistory: true,
  },
  defaultInputModes: ['text/plain'],
  defaultOutputModes: ['text/plain'],
  skills: [{
    id: 'hello_world',
    name: 'Hello World',
    description: 'A2A JS Beispiel-Fähigkeit: Antworten auf Begrüßungen',
    tags: ['hello', 'greeting', 'a2a-js'],
    examples: [
      'Hallo',
      'Willkommen',
      'Erzähl mir von A2A JS'
    ],
    inputModes: ['text/plain'],
    outputModes: ['text/plain']
  }],
  supportsAuthenticatedExtendedCard: false,
};

Schritt 2: A2A JS Ausführer-Implementierung

import {
  AgentExecutor,
  RequestContext,
  IExecutionEventBus,
  Task,
  TaskState,
  TaskStatusUpdateEvent
} from "@a2a-js/sdk";
import { v4 as uuidv4 } from "uuid";

class HelloWorldA2AJSExecutor implements AgentExecutor {
  private cancelledTasks = new Set<string>();

  async cancelTask(taskId: string, eventBus: IExecutionEventBus): Promise<void> {
    this.cancelledTasks.add(taskId);
    console.log(`A2A JS Ausführer bricht Aufgabe ab: ${taskId}`);
  }

  async execute(
    requestContext: RequestContext,
    eventBus: IExecutionEventBus
  ): Promise<void> {
    const userMessage = requestContext.userMessage;
    const existingTask = requestContext.task;
    
    const taskId = existingTask?.id || uuidv4();
    const contextId = userMessage.contextId || existingTask?.contextId || uuidv4();

    console.log(`A2A JS Agent verarbeitet Nachricht: ${userMessage.parts[0]?.text}`);

    // Neue Aufgabe erstellen
    if (!existingTask) {
      const initialTask: Task = {
        kind: 'task',
        id: taskId,
        contextId: contextId,
        status: {
          state: TaskState.Submitted,
          timestamp: new Date().toISOString(),
        },
        history: [userMessage],
        metadata: userMessage.metadata,
        artifacts: [],
      };
      eventBus.publish(initialTask);
    }

    // Statusaktualisierung veröffentlichen
    const workingUpdate: TaskStatusUpdateEvent = {
      kind: 'status-update',
      taskId: taskId,
      contextId: contextId,
      status: {
        state: TaskState.Working,
        message: {
          kind: 'message',
          role: 'agent',
          messageId: uuidv4(),
          parts: [{ kind: 'text', text: 'A2A JS Agent denkt nach...' }],
          taskId: taskId,
          contextId: contextId,
        },
        timestamp: new Date().toISOString(),
      },
      final: false,
    };
    eventBus.publish(workingUpdate);

    // Verarbeitungszeit simulieren
    await new Promise(resolve => setTimeout(resolve, 1000));

    // Abbruchstatus prüfen
    if (this.cancelledTasks.has(taskId)) {
      const cancelledUpdate: TaskStatusUpdateEvent = {
        kind: 'status-update',
        taskId: taskId,
        contextId: contextId,
        status: {
          state: TaskState.Canceled,
          timestamp: new Date().toISOString(),
        },
        final: true,
      };
      eventBus.publish(cancelledUpdate);
      return;
    }

    // Antwort generieren
    const userText = userMessage.parts[0]?.text || '';
    let responseText = '';
    
    if (userText.toLowerCase().includes('hello') || userText.toLowerCase().includes('hi')) {
      responseText = `Hallo! Willkommen im A2A JS SDK! Ich bin ein intelligenter Agent, erstellt mit A2A JS.`;
    } else if (userText.toLowerCase().includes('a2a js')) {
      responseText = `Das A2A JS SDK ist eine leistungsstarke JavaScript-Bibliothek zum Erstellen intelligenter Agentenanwendungen!`;
    } else {
      responseText = `Ich bin ein A2A JS Agent und habe Ihre Nachricht erhalten: "${userText}". Danke für die Verwendung des A2A JS SDKs!`;
    }

    // Endergebnis veröffentlichen
    const finalUpdate: TaskStatusUpdateEvent = {
      kind: 'status-update',
      taskId: taskId,
      contextId: contextId,
      status: {
        state: TaskState.Completed,
        message: {
          kind: 'message',
          role: 'agent',
          messageId: uuidv4(),
          parts: [{ kind: 'text', text: responseText }],
          taskId: taskId,
          contextId: contextId,
        },
        timestamp: new Date().toISOString(),
      },
      final: true,
    };
    eventBus.publish(finalUpdate);
  }
}

Schritt 3: A2A JS Server starten

import express from 'express';
import {
  A2AExpressApp,
  DefaultRequestHandler,
  InMemoryTaskStore
} from "@a2a-js/sdk";

const taskStore = new InMemoryTaskStore();
const agentExecutor = new HelloWorldA2AJSExecutor();

const requestHandler = new DefaultRequestHandler(
  myAgentCard,
  taskStore,
  agentExecutor
);

const appBuilder = new A2AExpressApp(requestHandler);
const expressApp = appBuilder.setupRoutes(express(), '');

const PORT = process.env.PORT || 3000;
expressApp.listen(PORT, () => {
  console.log(`A2A JS Agent-Server gestartet auf http://localhost:${PORT}`);
  console.log(`A2A JS Agent-Karte: http://localhost:${PORT}/.well-known/agent.json`);
  console.log('Drücken Sie Ctrl+C, um den A2A JS Server zu beenden');
});

A2A JS Server-Entwicklung

Aufgaben-Speicher

A2A JS bietet einen In-Memory-Aufgaben-Speicher und ermöglicht auch die Implementierung benutzerdefinierter Speicher:

import { TaskStore, Task } from "@a2a-js/sdk";

class CustomA2AJSTaskStore implements TaskStore {
  private tasks = new Map<string, Task>();

  async getTask(taskId: string): Promise<Task | undefined> {
    console.log(`A2A JS Aufgabe wird abgerufen: ${taskId}`);
    return this.tasks.get(taskId);
  }

  async setTask(task: Task): Promise<void> {
    console.log(`A2A JS Aufgabe wird gespeichert: ${task.id}`);
    this.tasks.set(task.id, task);
  }

  async deleteTask(taskId: string): Promise<void> {
    console.log(`A2A JS Aufgabe wird gelöscht: ${taskId}`);
    this.tasks.delete(taskId);
  }
}

Middleware-Unterstützung

A2A JS basiert auf Express.js und unterstützt alle Standard-Middleware:

import cors from 'cors';
import express from 'express';

const app = express();

// A2A JS Server-Middleware-Konfiguration
app.use(cors());
app.use(express.json());

// Benutzerdefinierte A2A JS Logging-Middleware
app.use((req, res, next) => {
  console.log(`A2A JS Anfrage: ${req.method} ${req.path}`);
  next();
});

A2A JS Client-Verwendung

Grundlegende Client-Operationen

import { A2AClient, MessageSendParams } from "@a2a-js/sdk";
import { v4 as uuidv4 } from "uuid";

const client = new A2AClient("http://localhost:3000");

async function testA2AJSClient() {
  console.log("Teste A2A JS Client...");
  
  const messageParams: MessageSendParams = {
    message: {
      messageId: uuidv4(),
      role: "user",
      parts: [{ kind: "text", text: "Hallo, A2A JS!" }],
      kind: "message"
    },
    configuration: {
      blocking: true,
      acceptedOutputModes: ['text/plain']
    }
  };

  try {
    const response = await client.sendMessage(messageParams);
    
    if (response.error) {
      console.error("A2A JS Client-Fehler:", response.error);
      return;
    }

    console.log("A2A JS Antwort:", response.result);
  } catch (error) {
    console.error("A2A JS Kommunikationsfehler:", error);
  }
}

testA2AJSClient();

A2A JS Streaming

A2A JS unterstützt Echtzeit-Streaming-Kommunikation:

import { A2AClient, TaskStatusUpdateEvent } from "@a2a-js/sdk";

async function streamA2AJSResponse() {
  const client = new A2AClient("http://localhost:3000");
  
  console.log("Starte A2A JS Streaming...");
  
  const streamParams = {
    message: {
      messageId: uuidv4(),
      role: "user",
      parts: [{ kind: "text", text: "Streaming-Konversation mit A2A JS" }],
      kind: "message"
    }
  };

  try {
    const stream = client.sendMessageStream(streamParams);
    
    for await (const event of stream) {
      if (event.kind === 'task') {
        console.log(`A2A JS Aufgabe erstellt: ${event.id}`);
      } else if (event.kind === 'status-update') {
        const statusEvent = event as TaskStatusUpdateEvent;
        console.log(`A2A JS Statusaktualisierung: ${statusEvent.status.state}`);
        
        if (statusEvent.status.message?.parts[0]?.text) {
          console.log(`A2A JS Nachricht: ${statusEvent.status.message.parts[0].text}`);
        }
        
        if (statusEvent.final) {
          console.log("A2A JS Streaming abgeschlossen");
          break;
        }
      }
    }
  } catch (error) {
    console.error("A2A JS Streaming-Fehler:", error);
  }
}

A2A JS Erweiterte Funktionen

Artefakt-Verarbeitung

A2A JS unterstützt die Generierung und Verwaltung von Artefakten:

import { TaskArtifactUpdateEvent } from "@a2a-js/sdk";

// Artefakt vom AgentExecutor veröffentlichen
const artifactUpdate: TaskArtifactUpdateEvent = {
  kind: 'artifact-update',
  taskId: taskId,
  contextId: contextId,
  artifact: {
    artifactId: "a2a-js-example",
    name: "A2A JS Beispiel-Datei",
    parts: [{ 
      text: `# Von A2A JS generierter Inhalt\n\nDies ist eine Beispiel-Datei, die mit dem A2A JS SDK generiert wurde.`
    }],
  },
  append: false,
  lastChunk: true,
};
eventBus.publish(artifactUpdate);

Sicherheitskonfiguration

Konfiguration der Sicherheitsoptionen für den A2A JS Agenten:

const secureAgentCard: AgentCard = {
  name: 'Sicherer A2A JS Agent',
  description: 'A2A JS Agent mit Sicherheit',
  // ... weitere Konfigurationen
  securitySchemes: {
    apiKey: {
      type: 'apiKey',
      name: 'X-API-Key',
      in: 'header'
    }
  },
  security: [{
    apiKey: []
  }]
};

A2A JS Best Practices

1. Fehlerbehandlung

Implementierung einer umfassenden Fehlerbehandlung in A2A JS Anwendungen:

class RobustA2AJSExecutor implements AgentExecutor {
  async execute(requestContext: RequestContext, eventBus: IExecutionEventBus) {
    try {
      // A2A JS Ausführungslogik
      await this.processRequest(requestContext, eventBus);
    } catch (error) {
      console.error("A2A JS Ausführungsfehler:", error);
      
      // Fehlerstatus veröffentlichen
      const errorUpdate: TaskStatusUpdateEvent = {
        kind: 'status-update',
        taskId: requestContext.task?.id || uuidv4(),
        contextId: requestContext.userMessage.contextId || uuidv4(),
        status: {
          state: TaskState.Failed,
          message: {
            kind: 'message',
            role: 'agent',
            messageId: uuidv4(),
            parts: [{ kind: 'text', text: 'Bei der A2A JS Verarbeitung ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.' }],
          },
          timestamp: new Date().toISOString(),
        },
        final: true,
      };
      eventBus.publish(errorUpdate);
    }
  }
}

2. Leistungsoptimierung

Optimierung der Leistung von A2A JS Anwendungen:

// A2A JS Client-Optimierung mit Verbindungspooling
const client = new A2AClient("http://localhost:3000", {
  keepAlive: true,
  timeout: 30000
});

// Caching von A2A JS Agent-Antworten
class CachedA2AJSExecutor implements AgentExecutor {
  private cache = new Map<string, string>();
  
  async execute(requestContext: RequestContext, eventBus: IExecutionEventBus) {
    const userText = requestContext.userMessage.parts[0]?.text || '';
    const cacheKey = `a2a-js-${userText}`;
    
    // A2A JS Cache prüfen
    if (this.cache.has(cacheKey)) {
      console.log("Verwende gecachte A2A JS Antwort");
      // Gecachte Antwort zurückgeben
    }
    
    // Neue Anfrage verarbeiten und Ergebnis cachen
  }
}

3. Protokollierung

Hinzufügen einer detaillierten Protokollierung in A2A JS Anwendungen:

import { createLogger, format, transports } from 'winston';

const a2aJSLogger = createLogger({
  level: 'info',
  format: format.combine(
    format.timestamp(),
    format.printf(({ timestamp, level, message }) => {
      return `[A2A JS] ${timestamp} ${level}: ${message}`;
    })
  ),
  transports: [
    new transports.Console(),
    new transports.File({ filename: 'a2a-js.log' })
  ]
});

// Verwendung im A2A JS Code
a2aJSLogger.info('A2A JS Agent erfolgreich gestartet');
a2aJSLogger.error('A2A JS Verarbeitungsfehler', { error: errorDetails });

A2A JS Fehlerbehebung

Behebung häufiger Probleme

1. A2A JS Verbindungsprobleme

// A2A JS Server-Verbindung prüfen
async function checkA2AJSConnection() {
  try {
    const client = new A2AClient("http://localhost:3000");
    const response = await fetch("http://localhost:3000/.well-known/agent.json");
    
    if (response.ok) {
      console.log("A2A JS Server-Verbindung normal");
    } else {
      console.error("Anormale A2A JS Server-Antwort:", response.status);
    }
  } catch (error) {
    console.error("A2A JS Verbindungsfehler:", error);
  }
}

Versuchen Sie auch diese Methoden:

2. A2A JS Typfehler

Stellen Sie sicher, dass Sie die A2A JS Typen korrekt importieren:

// A2A JS Typen korrekt importieren
import {
  AgentCard,
  AgentExecutor,
  A2AClient,
  Task,
  TaskState,
  Message,
  MessageSendParams
} from "@a2a-js/sdk";

3. A2A JS Leistungs-Debugging

// A2A JS Leistungsüberwachung
class PerformanceA2AJSExecutor implements AgentExecutor {
  async execute(requestContext: RequestContext, eventBus: IExecutionEventBus) {
    const startTime = Date.now();
    console.log(`A2A JS Verarbeitung gestartet: ${startTime}`);
    
    try {
      // A2A JS Logik
      await this.processRequest(requestContext, eventBus);
    } finally {
      const endTime = Date.now();
      console.log(`A2A JS Verarbeitung abgeschlossen, verstrichene Zeit: ${endTime - startTime}ms`);
    }
  }
}

Zusammenfassung

Das A2A JS SDK ist ein leistungsstarkes Werkzeug zum Erstellen intelligenter Agentenanwendungen. In diesem Tutorial haben wir gelernt:

  • Die Grundkonzepte und Architektur von A2A JS
  • Wie man A2A JS Agenten erstellt und konfiguriert
  • A2A JS Server- und Client-Entwicklung
  • Erweiterte Funktionen und Best Practices von A2A JS
  • Wie man häufige Probleme in A2A JS Anwendungen löst

Sie können jetzt Ihre eigene A2A JS Anwendung erstellen! Das A2A JS SDK bietet umfangreiche Funktionen, um Ihnen beim Erstellen leistungsstarker und erweiterbarer intelligenter Agentensysteme zu helfen.

Für weitere A2A JS Ressourcen und Beispiele besuchen Sie:

Starten Sie Ihre A2A JS Entwicklungsreise! 🚀