Zum Hauptinhalt springen
Connic
Build

Tools

Integrierte Funktionen und eigene Python-Funktionen lassen sich Agenten als Tools zur Verfügung stellen.

Zuletzt aktualisiert

Tool-Typ auswählen

Nutze ein integriertes Tool, wenn Connic die benötigte Funktion bereits bereitstellt. Schreibe ein eigenes Tool, wenn der Agent Anwendungslogik oder eine projektspezifische Integration benötigt.

Integrierte ToolsVerwendungszweckReferenz
retrieval_query, retrieval_store, retrieval_delete, retrieval_list_namespacesRetrieval des Projekts durchsuchen und verwaltenÖffnen
db_find, db_insert, db_update, db_upsert, db_delete, db_count, db_list_collectionsPersistente Projektdaten lesen und schreibenÖffnen
trigger_agent, trigger_agent_atArbeit sofort delegieren oder für später planenÖffnen
web_search, web_read_pageAktuelle Webergebnisse suchen und vollständige Seiten lesenÖffnen
Integrierte Tools

Füge den Namen eines integrierten Tools der Liste tools im Agent YAML hinzu. Integrierte Tools lassen sich auch in ein eigenes Python-Tool importieren, um Verhalten zu kombinieren.

  • YAML-Konfiguration: Liste ein integriertes Tool auf, ohne eine Python-Funktion zu definieren.
  • Projekt-Zugriffskontrollen: Aufrufe verwenden das aktuelle Projekt und Environment.
  • Environment-spezifisch: Daten aus Entwicklungs- und Produktivumgebung bleiben getrennt.
agents/assistant.yaml
version: "1.0"

name: assistant
model: connic/gpt-5.6-terra
description: "An assistant with retrieval and orchestration capabilities"
system_prompt: |
  Search the retrieval before answering.
  Delegate specialized work when another agent is a better fit.

tools:
  - retrieval_query
  - trigger_agent

Custom Tools

Eigene Tools sind Python-Funktionen, die im Projekt erkannt werden.

Tools sind einfache Python-Funktionen, die Agenten während einer Unterhaltung aufrufen können. Connic erstellt ihre Tool-Schemas aus Funktionssignaturen und Docstrings. Decorators sind nicht erforderlich. Mit ihnen können Agenten Berechnungen ausführen, Datenbanken abfragen, E-Mails senden, auf externe APIs zugreifen sowie Dateien lesen oder schreiben.

Tool Discovery

Connic erkennt öffentliche Funktionen in tools/ und dessen Unterordnern. Type Hints der Parameter bestimmen die Schematypen; ein Parameter ohne Typ verwendet string. Beschreibungen von Funktionen und Parametern stammen aus dem Docstring.

Einfaches Tool erstellen

tools/calculator.py
def add(a: float, b: float) -> float:
    """Add two numbers together.

    Args:
        a: The first number
        b: The second number

    Returns:
        The sum of a and b
    """
    return a + b

def multiply(a: float, b: float) -> float:
    """Multiply two numbers.

    Args:
        a: The first number
        b: The second number

    Returns:
        The product of a and b
    """
    return a * b

Der Funktions-Docstring wird zur Tool-Beschreibung. Einträge in seinem Abschnitt Args werden zu Parameterbeschreibungen.

Erforderliche und optionale Parameter

tools/flights.py
from typing import Optional

def search_flights(
    destination: str,
    departure_date: str,
    flexible_days: int = 0,
    cabin_class: Optional[str] = None
) -> dict:
    """Search for available flights.

    Args:
        destination: The destination city (required)
        departure_date: The desired departure date (required)
        flexible_days: Number of flexible days for search. Defaults to 0.
        cabin_class: Preferred cabin class. Defaults to None.

    Returns:
        Dictionary with flight search results
    """
    results = {"destination": destination, "date": departure_date}

    if flexible_days > 0:
        results["flexible"] = True
        results["flex_days"] = flexible_days

    if cabin_class:
        results["cabin"] = cabin_class

    return results

Erforderlich: Parameter ohne Default-Wert.Optional: Parameter mit Standardwert oder Optional[Type] = None. Reine Positionsparameter, *args und **kwargs werden nicht unterstützt.

Async Tools

tools/search.py
import httpx

async def web_search(query: str, num_results: int = 5) -> list[dict]:
    """Search the web for information.

    Args:
        query: The search query
        num_results: Number of results to return (default: 5)

    Returns:
        List of search results with title, url, and snippet
    """
    print(f"Searching for: {query} (limit={num_results})")
    async with httpx.AsyncClient() as client:
        response = await client.get(
            "https://api.search.example/search",
            params={"q": query, "limit": num_results}
        )
        results = response.json()["results"]
        print(f"Found {len(results)} results")
        return results

Async-Tool-Funktionen können Netzwerkanfragen, Datenbankabfragen und andere I/O-Operationen asynchron ausführen. Mehrere Async Tool-Aufrufe können parallel laufen, wenn das KI-Modell sie gemeinsam anfordert.

Dateien zurückgeben

Gib ToolFile zurück, wenn das KI-Modell im nächsten Turn ein Dokument, Bild, eine Audiodatei oder ein anderes binäres Ergebnis benötigt. Setze genau eine Quelle: Inline-Bytes in data oder eine uri. Gib immer den korrekten MIME-Typ an. Dateien lassen sich außerdem neben JSON- und Textwerten in einer Liste oder einem Tupel zurückgeben.

tools/invoices.py
from connic import ToolFile


def export_invoice(invoice_id: str) -> ToolFile:
    """Generate an invoice PDF for the agent to inspect."""
    pdf = build_invoice_pdf(invoice_id)
    return ToolFile(
        mime_type="application/pdf",
        name=f"invoice-{invoice_id}.pdf",
        data=pdf,
    )

Rohe bytes werden abgelehnt, da sie keinen MIME-Typ angeben. Die Erreichbarkeit einer URI und unterstützte Medienformate hängen vom ausgewählten KI-Modell-Provider ab.

Beispiel für ein PostgreSQL Tool

tools/postgres.py
import os
import asyncpg
from typing import Any, Dict

async def fetch_user_account(user_id: str) -> Dict[str, Any]:
    """Fetch user account details from PostgreSQL by user ID.

    Args:
        user_id: The user's unique ID

    Returns:
        A dict with account details or a not-found marker
    """
    dsn = os.environ["POSTGRES_DSN"]
    conn = await asyncpg.connect(dsn)
    try:
        row = await conn.fetchrow(
            """
            SELECT id, email, status, plan, created_at
            FROM accounts
            WHERE id = $1
            """,
            user_id,
        )
        if not row:
            return {"found": False, "user_id": user_id}
        return {"found": True, "account": dict(row)}
    finally:
        await conn.close()
agents/account-lookup.yaml
version: "1.0"

name: account-lookup
model: connic/gpt-5.6-terra
description: "Lookup account details during support workflows"
system_prompt: |
  Use the postgres.fetch_user_account tool to retrieve account info.
  If the account is missing, ask for the correct user ID.

tools:
  - postgres.fetch_user_account

Füge asyncpg der requirements.txt hinzu. Tools werden automatisch erkannt; Decorators sind nicht erforderlich. Registriere sie, indem postgres.fetch_user_account im Agent YAML referenziert wird.

Tools in Agenten verwenden

agents/assistant.yaml
version: "1.0"

name: assistant
model: connic/gpt-5.6-terra
description: "Assistant with calculator and search capabilities"
system_prompt: |
  You are a helpful assistant with access to tools.
  Use the calculator for math and web_search for current info.

tools:
  - calculator.add
  - calculator.multiply
  - search.web_search

  # Or replace the entries above with wildcards
  # - calculator.*               # all public functions in tools/calculator.py
  # - search.web_*               # functions starting with web_ in tools/search.py

Referenziere Tools über den exakten Modulpfad unter tools/. So entspricht calculator.add beispielsweise tools/calculator.py, während billing.calculator.add auf tools/billing/calculator.py verweist. Mit Wildcards lassen sich mehrere Funktionen gleichzeitig einbinden: calculator.* enthält alle öffentlichen Funktionen des Moduls; search.web_* nur die Funktionen, die dem Muster entsprechen. Das Deployment schlägt fehl, wenn eine Wildcard kein Tool findet.

Bei Agenten mit vielen Tools lassen sich selten verwendete Tools unter discoverable_tools statt unter tools auflisten. Sie werden zunächst nicht in den LLM-Kontext geladen und der Agent findet sie bei Bedarf über eine natürlichsprachliche Anfrage. Die Syntax ist identisch: Strings, Wildcards und Bedingungen. Weitere Details stehen unter Auffindbare Tools.

Auf Run-Kontext zugreifen

Füge der Tool-Funktion einen Parameter context hinzu, um auf das gemeinsame Kontext-Dictionary des Runs zuzugreifen. Connic stellt den Wert bereit und verbirgt ihn vor dem LLM, damit das KI-Modell diesen Parameter weder sieht noch ausfüllt.

tools/orders.py
from typing import Any, Dict

async def get_recent_orders(context: Dict[str, Any], limit: int = 5) -> list:
    """Fetch recent orders for the current user.

    Args:
        limit: Number of orders to return (default: 5)

    Returns:
        List of recent orders
    """
    # Read values set by middleware
    user_id = context.get("user_id")
    print(f"Fetching orders for user {user_id} (limit={limit})")

    # ... fetch orders from your database ...
    orders = [{"id": "ord-1", "user_id": user_id, "total": 49.99}]

    # Write values back to context
    context["orders_fetched"] = len(orders)
    print(f"Returning {len(orders)} orders")

    return orders

Das Kontext-Dictionary wird während des gesamten Runs von Middleware, Prompts und Tools gemeinsam verwendet. Alle Details zur Verwendung stehen in der Kontext-Dokumentation.

Sauberer Abbruch mit StopProcessing

Löse StopProcessing in einem Tool aus, um eine finale Nachricht zurückzugeben und den Run erfolgreich zu beenden. Das Verhalten entspricht dem in der Middleware. Normale Exceptions lassen den Run weiterhin fehlschlagen. Um einen einzelnen Tool-Aufruf zu überspringen, ohne den Run zu beenden, verwende AbortTool in einem Tool Hook.

tools/gated.py
from typing import Any, Dict

from connic import StopProcessing

def gated_action(resource_id: str, context: Dict[str, Any]) -> str:
    """Example tool that ends the run early with a fixed response."""
    if not context.get("allow_write"):
        raise StopProcessing("Write access denied for this run")
    return f"Updated {resource_id}"

StopProcessing gilt für Projekt Tools. Tools von externen MCP Servern können es nicht auslösen.

Logging aus Tools

Jeder Aufruf von print aus einem Tool wird mit dem Log-Level info erfasst, Ausgaben nach sys.stderr mit error. Aufrufe von logging aus der Python-Standardbibliothek über einen Logger mit dem Namen tools.* behalten ihr angegebenes Log-Level. Alle drei erscheinen im Projekt auf dem Tab Logs und in der Run-Detailansicht, markiert mit dem Tool-Namen. Löst das Tool eine unbehandelte Exception aus, wird der vollständige Traceback automatisch mit dem Log-Level error protokolliert, bevor der Run fehlschlägt. Dafür muss der Funktionscode nicht in try/except eingeschlossen werden.

Environment-Variablen verwenden

tools/api_client.py
import os
import httpx

async def call_api(endpoint: str) -> dict:
    """Call an external API using stored credentials.

    Args:
        endpoint: The API endpoint to call

    Returns:
        API response as dictionary
    """
    # Access environment variables configured in Connic dashboard
    api_key = os.environ.get("EXTERNAL_API_KEY")
    base_url = os.environ.get("API_BASE_URL", "https://api.example.com")

    if not api_key:
        return {"error": "EXTERNAL_API_KEY not configured"}

    async with httpx.AsyncClient() as client:
        response = await client.get(
            f"{base_url}/{endpoint}",
            headers={"Authorization": f"Bearer {api_key}"}
        )
        return response.json()

Konfiguriere Variablen unter Settings → Variables. Sie stehen über os.environ.get() zur Verfügung. Weitere Details stehen in der Variablen-Dokumentation.

Tool-Berechtigungen

Eigene Tools verwenden die Umgebungsvariablen und den Netzwerkzugriff des Deployments.