AI Connect/How to create/Eine Flotte von AI-Agenten

Eine Flotte von AI-Agenten

Frag die KI über Vinkius

Führen Sie viele autonome KI-Agenten aus einer einzigen Anwendung heraus aus, indem Sie jeden Agenten als eigenen AI-Connect-SDK-Benutzer abbilden, sodass er nur die Konnektoren lädt, die seine Aufgabe benötigt, mit Credentials, Ausgaben und sofortigem Widerruf pro Agent. Keine andere Plattform gibt jedem Agenten eines Schwarms eine eigene isolierte Identität.

Die nächste Plattform, die Sie bauen werden, ist kein einzelner Agent, sondern ein Schwarm: ein Triage-Agent, der Tickets liest, ein Recherche-Agent, der Kontext abruft, ein Ops-Agent, der Runbooks ausführt, ein Compliance-Agent, der unsichere Aktionen blockiert. Moderne KI-Systeme sind bereits so weit. Was nie existiert hat, ist die Infrastruktur, um diesen Schwarm sicher zu betreiben: bis heute teilte jeder Agent entweder Ihre Master-Credentials, oder Sie bauten ein Berechtigungssystem von Hand.

Das AI Connect SDK gibt jedem Agenten das, was keine Plattform je einem Agenten gegeben hat: die eigene Identität als Benutzer, mit eigenen Connectors, eigenen Credentials, eigenen Ausgaben und eigenem Abschalter, gestützt auf Tausende KI-Verbindungen ab Tag eins. Jedem Agenten die Vereinigung aller Tools zu geben, ist ein Sicherheits- und Kostenrisiko: das Modell verhält sich unvorhersehbar, eine unkontrollierte Schleife kann das Budget aufzehren, und Sie können keine Aktion einem bestimmten Agenten zuordnen. Die übliche Antwort der Industrie ist eine Berechtigungsmatrix, die an ein geteiltes Konto genagelt ist. Das SDK löst das, wie es sonst niemand tut, weil es es so löst wie beim Menschen: jeder Agent ist ein Benutzer. Ein external_id pro Agent, und capabilities() gibt nur das zurück, worauf dieser Agent zugreifen darf. Ein autonomes Programm wird zu einem regierten Bürger Ihrer Plattform. Dieser Satz war für ein Integrationsprodukt nie zuvor wahr. Er ist der strukturelle Unterschied zwischen Agenten, die Ihren Zugang teilen, und Agenten, die ihren besitzen.

Governor agentone key, full viewtriagescoped toolsresearchscoped toolsopsscoped tools+ the swarmsame guaranteesvk_live_*vk_live_*vk_live_*disconnect()one callleast privilege
Each agent is a user: scoped connectors, its own metered token, and one-call revocation, so a misbehaving agent never touches the rest of the swarm.

Der Nutzen von „Agent = Benutzer“

AnliegenWie „Agent = Benutzer“ es löst
GeltungsbereichDer external_id jedes Agenten verbindet nur dessen eigene Konnektoren, der Triage-Agent kann kein pagerduty__page ausführen.
KostenJede Verbindung wird über ihr eigenes Token gemessen und kann über es widerrufen werden, sodass Ausgaben und Beendigung pro Agent erfolgen.
AuditSie wissen stets, von welchem Agenten die Aktion stammt, die Sie betrachten, anhand von external_id.
SchadensradiusEin fehlverhaltenender Agent ist durch ein einziges disconnect() sofort widerrufbar, ohne Auswirkungen auf die übrigen Agenten.
LebenszyklusErzeugen Sie einen neuen Worker, indem Sie eine neue id ausstellen; stellen Sie ihn außer Dienst, indem Sie ihn trennen. Keine Konfigurations-Deployments.

Dies sind AI-Agenten, und sie selbst treten als Benutzer des SDK auf. Es befindet sich kein Mensch in der Schleife, wenn ops-agent um 03:00 Uhr auf Ihr Incident-Tooling zugreift. Der intransparente external_id ist genau das, was es einem nicht-menschlichen Akteur ermöglicht, isolierte Credentials zu besitzen.

Agent loop · one turn
One user turn of the quickstart, exactly as the console serves it. Click a step or press Run.
vinkius.user('alice_123').capabilities({ include: ['github'] })
HTTPGET /apps/vk_app_xxx/users/alice_123/tools?connector=github
const capabilities = await vinkius
  .user('alice_123')
  .capabilities({ include: ['github'] });
CapabilitySet (6)
  github__list_issues        read-only
  github__create_issue       POST /repos/{owner}/{repo}/issues
  github__list_pull_requests read-only
  github__search_code        read-only
  ...
Step 1 of 6
The agent loop, step by step. Press Run and follow one user turn: capabilities load, convert to tools, the model calls github__create_issue, the SDK executes on that user connection and the result feeds back. Every step shows the real SDK call and its HTTP request.

1. Geben Sie jedem Agenten eine stabile Identität

Leiten Sie die id aus der Rolle des Agenten und, falls Sie Worker skalieren, aus seiner Instanz ab. Versehen Sie sie mit einem Präfix, damit eine Agenten-id niemals mit einem Menschen oder einer Abteilung kollidiert.

typescript
type AgentRole = 'triage' | 'research' | 'ops' | 'compliance';

const agentUserId = (role: AgentRole, instance = 'primary') =>
  `agent-${role}-${instance}`;
// "agent-triage-primary", "agent-ops-worker-07"

2. Legen Sie fest, was jeder Agent verbinden darf

Diese Registry ist Ihre Least-Privilege-Richtlinie. Halten Sie sie deklarativ, damit Sie auf die gesamte Flotte auf einmal schließen können.

typescript
// server/fleet.ts
export const AGENTS: Record<AgentRole, { model: string; connectors: string[] }> = {
  triage:     { model: '[MODEL_ID]', connectors: ['zendesk', 'linear'] },
  research:   { model: '[MODEL_ID]', connectors: ['drive', 'confluence', 'search'] },
  ops:        { model: '[MODEL_ID]', connectors: ['pagerduty', 'kubernetes', 'github'] },
  compliance: { model: '[MODEL_ID]', connectors: ['audit-log', 's3'] },
};

3. Stellen Sie einen Agenten bereit

Verbinden Sie beim Deployment die Konten des Agenten. ensure() markiert den Akteur als Agenten, damit Ihr Governance-Dashboard die Flotte von den Menschen herausfiltern kann.

typescript
import { vinkius } from './vinkius';
import { AGENTS, type AgentRole, agentUserId } from './fleet';

async function provisionAgent(role: AgentRole, instance = 'primary') {
  const user = vinkius.user(agentUserId(role, instance));
  await user.ensure({ kind: 'agent', role });

  for (const slug of AGENTS[role].connectors) {
    const connector = user.connector(slug);
    await connector.connect();
    // headless Agenten haben keinen Browser-Consent: stellen Sie api_key/token-
    // Credentials über Ihren Secret-Store via connector.credentials.set() bereit
  }
  return user.connectors(); // [{ slug, status }, …]
}

Agenten laufen headless, daher sollten Sie Konnektoren bevorzugen, die ein statisches Token oder einen statischen Schlüssel über credentials.set() akzeptieren. OAuth-Konnektoren erfordern mindestens einmal den Consent eines Menschen, tun Sie dies während des Onboardings, und der Agent nutzt die resultierende Verbindung anschließend wieder.

4. Führen Sie die Schleife eines Agenten aus

Jeder Agent lädt seine eigenen, in ihrem Umfang begrenzten Capabilities. Er kann die Tools eines anderen Agenten nicht sehen, weil diese unter einem anderen external_id liegen.

typescript
// server/run-agent.ts
import OpenAI from 'openai';
import { vinkius } from './vinkius';
import { toOpenAITools, runOpenAIToolCall } from '@vinkius/connect/openai';
import { AGENTS, type AgentRole, agentUserId } from './fleet';

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! });

export async function runAgent(role: AgentRole, task: string, instance = 'primary') {
  const user = vinkius.user(agentUserId(role, instance));
  const capabilities = await user.capabilities({ include: AGENTS[role].connectors });

  const messages: object[] = [
    { role: 'system', content: `Sie sind der ${role}-Agent. Erledigen Sie die Aufgabe ausschließlich mit Ihren Tools.` },
    { role: 'user', content: task },
  ];

  for (let step = 0; step < 12; step++) {
    const completion = await openai.chat.completions.create({
      model: AGENTS[role].model,
      messages: messages as never,
      tools: toOpenAITools(capabilities),
    });
    const msg = completion.choices[0].message;
    messages.push(msg as object);
    if (!msg.tool_calls?.length) return msg.content;

    for (const call of msg.tool_calls) {
      const result = await runOpenAIToolCall(capabilities, call);
      messages.push({
        role: 'tool',
        tool_call_id: call.id,
        content: JSON.stringify({ content: result.content, isError: result.isError }),
      });
    }
  }
  return 'Aufgabe gestoppt: Schrittbudget erreicht.';
}

5. Übergeben Sie zwischen Agenten und wahren Sie den Umfang

Ein Triage-Agent eskaliert an den Ops-Agenten, indem er ihn mit einer neuen Aufgabe aufruft. Der Ops-Agent läuft unter seiner eigenen id und verbindet seine eigenen Tools, die Übergabe erweitert niemals das, was einer der beiden Agenten tun kann.

typescript
async function orchestrate(ticket: string) {
  const triage = await runAgent('triage', `Klassifizieren und routen: ${ticket}`);

  if (triage?.includes('INFRA')) {
    // der Ops-Agent nutzt pagerduty/kubernetes/github — Tools, die die Triage nie sieht
    return runAgent('ops', `Entschärfen: ${ticket}`);
  }
  return runAgent('research', `Kontext zu ${ticket} sammeln`);
}

Da external_id intransparent ist, können Sie horizontal skalieren: führen Sie 20 Ops-Worker als agent-ops-worker-01agent-ops-worker-20 aus. Jeder hat seine eigene Verbindung und eigene Messung, sodass eine unkontrollierte Schleife in einem Worker nur diesen Worker betrifft.

6. Der Compliance- / Governor-Agent

Modellieren Sie auch einen Politik-Agenten. Er verbindet schreibgeschützte Tools, prüft die Aktionen eines anderen Agenten und kann einen Konnektor trennen, um einen Agenten zu widerrufen, Governance, ausgedrückt als gewöhnliche SDK-Aufrufe.

typescript
async function quarantine(role: AgentRole, instance: string, slug: string) {
  await vinkius.user(agentUserId(role, instance)).connector(slug).disconnect();
}

7. Python oder CrewAI? Überbrücken Sie mit neutralem JSON Schema

Das SDK ist derzeit ausschließlich für TypeScript verfügbar, doch die Capabilities sind portabel. Stellen Sie in einem Python-Stack den Tool-Satz über den neutralen Adapter als Daten bereit, oder rufen Sie die Runtime derselben Verbindung direkt auf.

typescript
import { toJSONSchemaTools } from '@vinkius/connect/json-schema';

const definitions = toJSONSchemaTools(await vinkius.user('agent-ops-primary').capabilities());
// übergeben Sie `definitions` an Ihr Python-Agent-Framework; es ruft über eine einzige Route zurück

Interne Mechanik: warum ein einzelner fehlverhaltenender Agent die Flotte nicht kompromittieren kann

Die Isolation, die Sie erben, ist nicht nur organisatorisch, sie wird von der Data Plane durchgesetzt, und das ist der eigentliche Vorteil hinter einer autonomen Flotte.

*Jede Verbindung besitzt ihr eigenes `vk_live_`-Token.* Das Auflisten und Ausführen von Tools geht direkt an die Runtime dieser Verbindung, wo jeder Aufruf über sein eigenes Token gemessen und widerrufbar ist*, niemals über die Application-API. Somit sind die Ausgaben jedes Agenten und die Beendigung jedes Agenten unabhängig von denen aller anderen Agenten, konstruktionsbedingt.

Widerruf schlägt fehlgesichert fehl. Das SDK stellt genau ein Token pro Verbindung bei connect() aus und stellt während der Ausführung niemals implizit ein neues aus. Das bedeutet, dass disconnect() den Zugriff sofort stoppt: Ein Agent mit einem widerrufenen Token kann nicht selbst ein Ersatztoken erhalten. Verwenden Sie es als Notfall-Abschaltung:

typescript
// der Governor-Agent hält einen anomalen Worker mit einem einzigen Aufruf an — sofort und endgültig
await vinkius.user('agent-ops-worker-07').connector('pagerduty').disconnect();

Begrenzen Sie jeden Schritt. Ein Agent kann einem langsamen Tool mehr Zeit einräumen als ein Mensch es täte, doch Sie deckeln jeden Aufruf mit timeoutMs (kombiniert mit einem AbortSignal). Eine unkontrollierte Ausführung erhält damit eine harte Frist statt eines unbegrenzten Budgets:

typescript
const result = await capabilities
  .findCapability('kubernetes__scale_deployment')!
  .execute(
    { deployment: 'ingress', replicas: 6 },
    { idempotencyKey: `ops:${task.id}:scale`, timeoutMs: 10_000 },
  );

Verfolgen Sie jeden Agenten separat. hooks feuern pro HTTP-Versuch mit einer redigierten requestId, sodass Sie jeden Aufruf, jedes Retry und jeden Fehler einem einzigen external_id zuordnen können, ohne ein eigenes Tracing-System aufzubauen. Credential-Felder und das Pfadsegment vk_live_* werden maskiert, bevor Ihr Hook sie empfängt.

Geben Sie Typen weiter, keinen Freitext. Wenn ein Agent einem anderen Daten weitergibt, ziehen Sie result.structuredContent (das strukturierte Objekt des Konnektors) der Serialisierung von content vor: präziser, token-effizienter und eindeutig.

Produktions-Checkliste

  • [ ] Versehen Sie jede Agenten-id mit einem Präfix (agent-…), damit Agenten niemals mit Menschen oder Abteilungen kollidieren.
  • [ ] Kapseln Sie Least Privilege in der AGENTS-Registry, ein Agent, eine enge Konnektor-Menge.
  • [ ] Geben Sie mutierenden Agenten einen idempotencyKey pro Aufgabe, damit eine wiederholte Schleife nicht doppelt ausführt.
  • [ ] Setzen Sie ein hartes Schrittbudget pro Agentenschleife; geben Sie isError an das Modell zurück, statt eine Exception zu werfen.
  • [ ] Markieren Sie Akteure mit user.ensure({ kind: 'agent', role }), damit die Governance die Flotte herausfiltern kann.
  • [ ] Bauen Sie disconnect() in den Pfad Ihres Governors ein, die Notfall-Abschaltung ist ein Aufruf pro Agent.

Sie betreiben nun eine Flotte, in der jeder Agent exakt die Tools besitzt, die seine Aufgabe benötigt, die Ausgaben jedes Agenten unabhängig sind und ein fehlverhaltenender Agent neutralisiert wird, ohne die anderen zu beeinflussen. Die meisten Teams regieren ihre Agenten mit Policy-Dokumenten und gekreuzten Fingern. Sie regieren Ihre mit einem Identitätssystem, und genau diese Lücke lässt Ihre Flotte über zehn Agenten hinauswachsen, während ihre nicht sicher über zwei hinauswachsen kann.

What you just got

Not a pitch: the properties this build inherits automatically.

Isolation by construction

Connections and capabilities resolve only inside one external_id. No cross-actor leakage is possible, and you wrote none of that enforcement.

Write-only credentials

Your server stores secrets and can read back which fields are configured, never the values. Not your code, the model, or a dashboard can exfiltrate them.

Metered, revocable spend

Every connection owns a vk_live_* token, so cost and revocation are per connection. One call to disconnect() is a complete, auditable stop.

Any model runtime

One CapabilitySet converts to OpenAI, Anthropic, Gemini, Vercel AI SDK, LangChain, LlamaIndex, Workers AI or neutral JSON Schema. Only the last line changes.

Production safety built in

idempotencyKey, timeoutMs and AbortSignal per call; automatic full-jitter retries on transient failures; typed VinkiusError branches. No bespoke harness.

Fleet control, no shared super-agent

Give each agent only its connectors, cap each loop with timeoutMs, revoke one misbehaving agent in one call. The others keep running.

Give it to your AI agent

An Agent Skill (SKILL.md) for this build. Preview the first lines below, then copy or download it into your repo under .claude/skills/: Claude Code, Cursor or any Agent-Skills-compatible agent follows it to implement this pattern correctly.

Download SKILL.md6 · Available in your language
What an agent fleet inherits, plus the SKILL.md, in your language, for your coding agent.

Nächste Schritte