Schnellstart für Cortex Code Agent-SDK

Dieses Thema führt Sie durch die Erstellung einesAI Agent, der ein Datenpipeline-Skript liest, Fehler findet und diese automatisch mithilfe des Cortex Code Agent-SDK behebt.

Vorgehensweise:

  1. Einrichten eines Projekts mit dem Cortex Code Agent-SDK

  2. Erstellen eines Datenpipeline-Skripts mit einigen Fehlern

  3. Ausführen eines Agenten, der die Fehler ohne manuelles Eingreifen findet und behebt

Voraussetzungen

  • Node.js 22+ (für TypeScript) oder Python 3.10+ (für Python).

  • Snowflake-Verbindung, über Snowflake-CLI-Verbindungseinstellungen konfiguriert – normalerweise in:file:~/.snowflake/connections.toml mit ~/.snowflake/config.toml; wird auch für bestehende Setups unterstützt (siehe Verbindungen konfigurieren):

    [my-connection]
    account = "myorg-myaccount"
    user = "myuser"
    authenticator = "externalbrowser"
    

Setup

1. Installieren der Cortex Code-CLI

Installieren der CLI:

curl -LsS https://ai.snowflake.com/static/cc-scripts/install.sh | sh

Verifizieren der Installation:

cortex --version

2. Einrichten des Projekts

Erstellen und Eingabe eines Projektverzeichnisses:

mkdir my-agent && cd my-agent

3. SDK installieren

npm init -y
npm install cortex-code-agent-sdk

Erstellen eines Datenpipeline-Skripts

Erstellen eines Datenpipeline-Skripts mit einigen absichtlichen Fehlern, die der Agent beheben soll:

import json

def load_results(rows):
    """Load query results into a list of campaign dicts."""
    return [
        {
            "campaign": row["campaign_name"],
            "impressions": row["impressions"],
            "clicks": row["clicks"],
            "conversions": row["conversions"],
        }
        for row in rows
    ]

def compute_conversion_rate(results):
    """Add conversion_rate (conversions / clicks) to each campaign."""
    for row in results:
        row["conversion_rate"] = row["conversions"] / row["clicks"]  # Bug: ZeroDivisionError when clicks is 0
    return results

def format_report(results):
    """Return a JSON summary with total conversions and the top campaign."""
    total = sum(r["conversions"] for r in results)
    top = max(results, key=lambda r: r["conversion_rate"])  # Bug: crashes on empty list
    return json.dumps({"total_conversions": total, "top_campaign": top["campaign"]})

Dieser Code hat zwei Fehler:

  1. computeConversionRate / compute_conversion_rate dividiert durch clicks, ohne auf null zu prüfen. Dadurch wird bei Kampagnen ohne Klicks NaN oder Infinity (TypeScript) zurückgegeben oder ein ZeroDivisionError (Python) ausgelöst.

  2. formatReport / format_report ruft max / reduce für die Ergebnisliste auf, ohne zu prüfen, ob diese leer ist. Dadurch wird ein ValueError (Python) oder TypeError (TypeScript) ausgelöst, wenn keine Zeilen vorhanden sind.

Erstellen eines Agenten, der Fehler findet und behebt

// agent.mjs
import { query } from "cortex-code-agent-sdk";

// Agentic loop: streams messages as the agent works
for await (const message of query({
  prompt: "Review report.ts for bugs in the data pipeline. Fix any issues you find.",
  options: {
    cwd: process.cwd(),
    connection: "my-connection",          // Snowflake CLI connection name
    allowedTools: ["Read", "Edit", "Bash"],  // Auto-approve these tools without prompting
  },
})) {
  // Print human-readable output
  if (message.type === "assistant") {
    for (const block of message.content) {
      if (block.type === "text") {
        process.stdout.write(block.text);  // Agent's reasoning
      } else if (block.type === "tool_use") {
        console.log(`Tool: ${block.name}`);  // Tool being called
      }
    }
  } else if (message.type === "result") {
    console.log(`\nDone: ${message.subtype}`);  // Final result
  }
}

Dieser Code besteht aus drei Hauptteilen:

  1. Abfrage: Der Haupteinstiegspunkt, der die Agentenschleife erzeugt. Sie gibt einen asynchronen Iterator zurück, den Sie in der Syntax der asynchronen Schleife Ihrer Sprache verwenden, um Nachrichten zu streamen, während der Agent funktioniert. Vollständige Informationen zur API sehen Sie in der Referenz TypeScript oder Python.

  2. Aufforderung: Was der Agent tun soll. Teilt dem Agenten mit, welche Aufgabe er erledigen soll.

  3. Optionen: Konfiguration für den Agenten. connection gibt an, mit welcher Snowflake-CLI-Verbindung authentifiziert werden soll. allowedTools legt fest, welche Tools ohne Aufforderung automatisch genehmigt werden, und disallowedTools kann Tools vollständig blockieren. Weitere Optionen sind model, mcp_servers und mehr.

Die Streaming-Schleife wird ausgeführt, während der Agent denkt, Tools aufruft, die Ergebnisse beobachtet und entscheidet, was als Nächstes zu tun ist. Jede Iteration ergibt eine Nachricht: die Argumentation des Agenten, einen Aufruf des Tools, ein Ergebnis des Tools oder das Endergebnis. Das SDK übernimmt die Orchestrierung.

Ausführen des Agenten

node agent.mjs

Überprüfen Sie nach der Ausführung Ihre Berichtsdatei. Sie sehen temporären Code, der leere Ergebnisse und Null-Kauf-Kampagnen verwaltet. Ihr unabhängiger Agent:

  1. Lesen Sie die Datei, um den Code zu verstehen.

  2. Analyse der Logik und identifizierten Grenzfälle, die zu einem Absturz führen könnten.

  3. Bearbeitung der Datei, um eine korrekte Fehlerbehandlung hinzuzufügen.

Multi-Turn-Konversationen

Für interaktive Sitzungen, bei denen Sie mehrere Eingabeaufforderungen mit gemeinsamem Kontext senden, verwenden Sie die Client-API:

import {
  createCortexCodeSession,
  type CortexCodeEvent,
} from "cortex-code-agent-sdk";

async function printResponse(stream: AsyncIterable<CortexCodeEvent>) {
  for await (const event of stream) {
    if (event.type === "assistant") {
      for (const block of event.content) {
        if (block.type === "text") process.stdout.write(block.text);
      }
    } else if (event.type === "result") {
      break;
    }
  }
}

const session = await createCortexCodeSession({
  cwd: process.cwd(),
  connection: "my-connection",
});

// First turn
await session.send("Summarize what report.ts does and what data it expects.");
await printResponse(session.stream());

// Second turn (same session, remembers context)
await session.send("Now add type annotations to each function.");
await printResponse(session.stream());

await session.close();

Ausprobieren anderer Eingabeaufforderungen

Jetzt, wo Ihr Agent eingerichtet ist, probieren Sie verschiedene Eingabeaufforderungen aus:

  • "Add comprehensive type hints to all functions in report.py"

  • "Write a SQL query that finds the top 10 campaigns by conversion rate"

  • "Add input validation to all functions in report.py"

  • "Create a README.md documenting the functions in report.py"

Die wichtigsten Konzepte

Berechtigungsmodi

Berechtigungsmodi steuern den Grad der menschlichen Überwachung bei Tool-Aufrufen:

Modus

Verhalten

Anwendungsfall

"bypassPermissions" (mit Sicherheitsflag)

Führt jedes Tool ohne Eingabeaufforderungen aus. Erfordert allowDangerouslySkipPermissions: true (TypeScript) oder allow_dangerously_skip_permissions=True (Python).

Sandboxbasierte CI, vollständig vertrauenswürdige Umgebungen

"default"

Verwendet Standardberechtigungsprüfungen. Konfigurieren Sie in SDK-Sitzungen allowedTools, disallowedTools oder``canUseTool``, um berechtigungsgeprüfte Tools zu steuern.

Gesteuerte Workflows mit expliziter Berechtigungsrichtlinie

"autoAcceptPlans"

Genehmigt Plananfragen und Bestätigungen zum Verlassen eines Plans automatisch. Die normalen Tool-Berechtigungen werden nicht umgangen.

Spezialisierte Workflows, die möchten, dass Genehmigungen für Pläne automatisch erteilt werden

"plan"

Startet im Planungsmodus; die Genehmigung von ExitPlanMode ermöglicht die Fortsetzung der Ausführung, und spätere Schritte setzen die normalen Berechtigungen wieder fort.

Code-Überprüfung, Analyse

Für eine präzisere Kontrolle über einzelne Tool-Aufrufe verwenden Sie``canUseTool``-Callback. Weitere Informationen erhalten Sie unter Verarbeitung von Genehmigungen und Benutzereingaben.

Nächste Schritte