No description
  • Go 98.9%
  • Makefile 1.1%
Find a file
Gregor Schulte b6bfac12be Variablen-Wert als beliebiges JSON typisieren statt als string
Prefect 3.x speichert `value` einer Variable als beliebigen JSON-Typ (String,
Zahl, Bool, Objekt, Array, null). Die Modelle typisierten das Feld als `string`,
womit ein Objekt oder Array beim Schreiben als JSON-String kodiert wurde und
das Lesen mit "cannot unmarshal object into Go struct field .Alias.value of
type string" fehlschlug.

Value ist in Variable, VariableCreate und VariableUpdate jetzt json.RawMessage
(verlustfrei, keine float64-Rundung grosser Ganzzahlen wie bei `any`). Dazu
models.VariableValue zum Kodieren beliebiger Go-Werte und Variable.StringValue
zum Lesen echter JSON-Strings; StringValue prueft den JSON-Typ explizit, weil
json.Unmarshal ein JSON null fehlerfrei in einen string schreibt.

Ergaenzt Tests fuer den bislang untesteten Variables-Service: alle JSON-Typen
beim Lesen, Objekt- und String-Werte beim Schreiben sowie die Unterscheidung
zwischen nil-Value (kein `value` im PATCH-Body) und explizitem JSON null.

BREAKING CHANGE: Value ist json.RawMessage statt string/*string.
2026-08-26 09:25:33 +02:00
api Initial commit 2026-02-02 08:41:48 +01:00
examples Update import paths to reflect migration to schultesdev domain in all relevant files 2026-02-02 09:15:39 +01:00
pkg Variablen-Wert als beliebiges JSON typisieren statt als string 2026-08-26 09:25:33 +02:00
.gitignore Entferne Integrations-Tests und zugehörige Dateien; füge CLAUDE.md zur .gitignore hinzu 2026-02-17 11:16:36 +01:00
CHANGELOG.md Variablen-Wert als beliebiges JSON typisieren statt als string 2026-08-26 09:25:33 +02:00
CONTRIBUTING.md Update repository links to reflect migration to schultesdev domain in CHANGELOG, CONTRIBUTING, and README files. 2026-02-02 08:48:23 +01:00
doc.go Update import paths to reflect migration to schultesdev domain in all relevant files 2026-02-02 09:15:39 +01:00
go.mod Update module path to reflect migration to schultesdev domain in go.mod 2026-02-02 09:05:48 +01:00
go.sum Initial commit 2026-02-02 08:41:48 +01:00
LICENSE Initial commit 2026-02-02 08:41:48 +01:00
Makefile Initial commit 2026-02-02 08:41:48 +01:00
openapi.json Entferne das models-Paket und füge neue Services für Artefakte, Automationen, Ereignisse, Suchfilter, Concurrency Limits, Task Worker, sowie FlowRun- und TaskRun-Status hinzu. 2026-03-26 22:29:01 +01:00
PROJECT_SUMMARY.md Initial commit 2026-02-02 08:41:48 +01:00
README.md Update repository links to reflect migration to schultesdev domain in CHANGELOG, CONTRIBUTING, and README files. 2026-02-02 08:48:23 +01:00

Prefect Go API Client

Go Reference Go Report Card

Ein vollständiger Go-Client für die Prefect v3 Server REST API mit Unterstützung für alle Endpoints, automatischen Retries und Pagination.

Features

  • 🚀 Vollständige API-Abdeckung aller Prefect Server v3 Endpoints
  • 🔄 Automatische Retry-Logik mit exponential backoff
  • 📄 Pagination-Support mit Iterator-Pattern
  • 🔐 Authentifizierung für Prefect Cloud
  • Type-safe API mit generierten Go-Structs
  • 🧪 Vollständig getestet
  • 📝 Umfangreiche Dokumentation und Beispiele

Installation

go get git.schultes.dev/schultesdev/prefect-go

Quick Start

package main

import (
    "context"
    "fmt"
    "log"

    "git.schultes.dev/schultesdev/prefect-go/pkg/client"
    "git.schultes.dev/schultesdev/prefect-go/pkg/models"
)

func main() {
    // Client erstellen
    c := client.NewClient(
        client.WithBaseURL("http://localhost:4200/api"),
    )

    ctx := context.Background()

    // Flow erstellen
    flow, err := c.Flows.Create(ctx, &models.FlowCreate{
        Name: "my-flow",
        Tags: []string{"example", "go-client"},
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Flow erstellt: %s (ID: %s)\n", flow.Name, flow.ID)

    // Flow-Run starten
    run, err := c.FlowRuns.Create(ctx, &models.FlowRunCreate{
        FlowID: flow.ID,
        Name:   "my-first-run",
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Flow-Run gestartet: %s (ID: %s)\n", run.Name, run.ID)
}

Authentifizierung

Lokaler Prefect Server

client := client.NewClient(
    client.WithBaseURL("http://localhost:4200/api"),
)

Prefect Cloud

client := client.NewClient(
    client.WithBaseURL("https://api.prefect.cloud/api/accounts/{account_id}/workspaces/{workspace_id}"),
    client.WithAPIKey("your-api-key"),
)

Verwendungsbeispiele

Flows verwalten

// Flow erstellen
flow, err := client.Flows.Create(ctx, &models.FlowCreate{
    Name: "my-flow",
    Tags: []string{"production"},
})

// Flow abrufen
flow, err := client.Flows.Get(ctx, flowID)

// Flows auflisten mit Pagination
iter := client.Flows.ListAll(ctx, &models.FlowFilter{
    Tags: []string{"production"},
})
for iter.Next(ctx) {
    flow := iter.Value()
    fmt.Printf("Flow: %s\n", flow.Name)
}
if err := iter.Err(); err != nil {
    log.Fatal(err)
}

// Flow löschen
err := client.Flows.Delete(ctx, flowID)

Flow-Runs verwalten

// Flow-Run erstellen und starten
run, err := client.FlowRuns.Create(ctx, &models.FlowRunCreate{
    FlowID:     flowID,
    Name:       "scheduled-run",
    Parameters: map[string]interface{}{
        "param1": "value1",
        "param2": 42,
    },
})

// Auf Completion warten
finalRun, err := client.FlowRuns.Wait(ctx, run.ID, 5*time.Second)
fmt.Printf("Flow-Run Status: %s\n", finalRun.StateType)

Deployments erstellen

deployment, err := client.Deployments.Create(ctx, &models.DeploymentCreate{
    Name:         "my-deployment",
    FlowID:       flowID,
    WorkPoolName: "default-pool",
    Schedules: []models.DeploymentScheduleCreate{
        {
            Schedule: models.IntervalSchedule{
                Interval: 3600, // Jede Stunde
            },
            Active: true,
        },
    },
})

Konfiguration

Client-Optionen

client := client.NewClient(
    client.WithBaseURL("http://localhost:4200/api"),
    client.WithAPIKey("your-api-key"),
    client.WithTimeout(30 * time.Second),
    client.WithRetry(retry.Config{
        MaxAttempts:   5,
        InitialDelay:  time.Second,
        MaxDelay:      30 * time.Second,
        BackoffFactor: 2.0,
    }),
)

Retry-Konfiguration

Der Client retried automatisch bei transienten Fehlern (5xx, 429):

import "git.schultes.dev/schultesdev/prefect-go/pkg/retry"

retryConfig := retry.Config{
    MaxAttempts:     5,
    InitialDelay:    time.Second,
    MaxDelay:        30 * time.Second,
    BackoffFactor:   2.0,
    RetryableErrors: []int{429, 500, 502, 503, 504},
}

Verfügbare Services

Der Client bietet folgende Services:

  • Flows: Flow-Management
  • FlowRuns: Flow-Run-Operationen
  • Deployments: Deployment-Verwaltung
  • TaskRuns: Task-Run-Management
  • WorkPools: Work-Pool-Operationen
  • WorkQueues: Work-Queue-Verwaltung
  • Artifacts: Artifact-Handling
  • Blocks: Block-Dokumente und -Typen
  • Events: Event-Management
  • Automations: Automation-Konfiguration
  • Variables: Variable-Verwaltung
  • ConcurrencyLimits: Concurrency-Limit-Management
  • Logs: Log-Abfragen
  • Admin: Administrative Endpoints

Entwicklung

Code generieren

make generate

Tests ausführen

make test

Integration-Tests

Integration-Tests erfordern einen laufenden Prefect-Server:

# Prefect Server starten
prefect server start

# Tests ausführen
go test -tags=integration ./...

Beispiele

Weitere Beispiele finden Sie im examples/ Verzeichnis:

Dokumentation

Vollständige API-Dokumentation: https://pkg.go.dev/git.schultes.dev/schultesdev/prefect-go

Lizenz

MIT License - siehe LICENSE für Details.

Beiträge

Beiträge sind willkommen! Bitte öffnen Sie ein Issue oder erstellen Sie einen Pull Request.