The experiments client methods are currently in ALPHA. The API may change without notice. A one-time warning is emitted on first use.
An experiment is a set of task runs over a dataset, optionally scored by one or more evaluators. Each run is a row of user data: the SDK uses TaskFields to identify the example_id and output columns, and EvaluatorColumns to remap evaluator-result columns to the eval.<name>.<field> wire schema. The Get, Delete, and ListRuns methods accept either an experiment name or an ID — when a name is passed, Dataset (name or ID) is required, and Space (name or ID) is required when Dataset is also a name. Empty experiments are not allowed: Create requires at least one run, otherwise it returns experiments.ErrNoRuns.
List Experiments
List returns a paginated list of experiments. Dataset, when non-empty, accepts a dataset name or ID and restricts results to that dataset; Space is required when Dataset is a name.
Signature:
func (c *Client) List(ctx context.Context, req ListRequest) (*ExperimentList, error)
Usage Example:
package main
import (
"context"
"errors"
"fmt"
"log"
"github.com/Arize-ai/client-go-v2/arize"
"github.com/Arize-ai/client-go-v2/arize/experiments"
)
func main() {
client, err := arize.NewClient(arize.Config{APIKey: "your-api-key"})
if err != nil {
log.Fatal(err)
}
resp, err := client.Experiments.List(context.Background(), experiments.ListRequest{
Dataset: "your-dataset-name-or-id",
Space: "your-space-name-or-id",
Limit: 25,
})
if err != nil {
var unauthorized *arize.UnauthorizedError
if errors.As(err, &unauthorized) {
log.Fatalf("unauthorized: %v", unauthorized)
}
log.Fatal(err)
}
for _, exp := range resp.Experiments {
fmt.Printf("%s: %s\n", exp.Id, exp.Name)
}
}
Get an Experiment
Get returns a single experiment, resolving by name or ID. Dataset is required when Experiment is a name; Space is required when Dataset is also passed as a name.
Signature:
func (c *Client) Get(ctx context.Context, req GetRequest) (*Experiment, error)
Usage Example:
package main
import (
"context"
"errors"
"fmt"
"log"
"github.com/Arize-ai/client-go-v2/arize"
"github.com/Arize-ai/client-go-v2/arize/experiments"
)
func main() {
client, err := arize.NewClient(arize.Config{APIKey: "your-api-key"})
if err != nil {
log.Fatal(err)
}
exp, err := client.Experiments.Get(
context.Background(),
experiments.GetRequest{
Experiment: "your-experiment-name-or-id",
Dataset: "your-dataset-name-or-id",
Space: "your-space-name-or-id",
},
)
if err != nil {
var notFound *arize.NotFoundError
if errors.As(err, ¬Found) {
log.Fatalf("experiment not found: %v", notFound)
}
log.Fatal(err)
}
fmt.Printf("experiment %s: %s\n", exp.Id, exp.Name)
}
Create an Experiment
Create creates a new experiment, resolving the parent dataset by name or ID. Each entry of Runs is a row of user data; TaskFields names the columns holding the dataset example ID and the task output (both required), and EvaluatorColumns optionally renames evaluator result columns to the eval.<name>.<field> wire schema. At least one run is required; an empty Runs slice returns experiments.ErrNoRuns without contacting the server.
Signature:
func (c *Client) Create(ctx context.Context, req CreateRequest) (*Experiment, error)
Usage Example:
package main
import (
"context"
"errors"
"fmt"
"log"
"github.com/Arize-ai/client-go-v2/arize"
"github.com/Arize-ai/client-go-v2/arize/experiments"
)
func main() {
client, err := arize.NewClient(arize.Config{APIKey: "your-api-key"})
if err != nil {
log.Fatal(err)
}
exp, err := client.Experiments.Create(
context.Background(),
experiments.CreateRequest{
Dataset: "your-dataset-name-or-id",
Space: "your-space-name-or-id",
Name: "your-experiment-name",
Runs: []map[string]any{
{
"example_id": "example-1",
"output": "hello world",
"quality_score": 0.9,
"quality_label": "correct",
},
},
TaskFields: experiments.TaskFields{
ExampleID: "example_id",
Output: "output",
},
EvaluatorColumns: map[string]experiments.EvaluatorFields{
"quality": {
Score: "quality_score",
Label: "quality_label",
},
},
},
)
if err != nil {
if errors.Is(err, experiments.ErrNoRuns) {
log.Fatal("cannot create experiment without runs")
}
var conflict *arize.ConflictError
if errors.As(err, &conflict) {
log.Fatalf("experiment already exists: %v", conflict)
}
log.Fatal(err)
}
fmt.Printf("created experiment %s\n", exp.Id)
}
Delete an Experiment
Delete removes an experiment, resolving by name or ID. Dataset is required when Experiment is a name; Space is required when Dataset is also passed as a name. It returns only an error.
Signature:
func (c *Client) Delete(ctx context.Context, req DeleteRequest) error
Usage Example:
package main
import (
"context"
"errors"
"log"
"github.com/Arize-ai/client-go-v2/arize"
"github.com/Arize-ai/client-go-v2/arize/experiments"
)
func main() {
client, err := arize.NewClient(arize.Config{APIKey: "your-api-key"})
if err != nil {
log.Fatal(err)
}
err = client.Experiments.Delete(
context.Background(),
experiments.DeleteRequest{
Experiment: "your-experiment-name-or-id",
Dataset: "your-dataset-name-or-id",
Space: "your-space-name-or-id",
},
)
if err != nil {
var notFound *arize.NotFoundError
if errors.As(err, ¬Found) {
log.Printf("no experiment to remove: %v", notFound)
return
}
log.Fatal(err)
}
}
List Runs
ListRuns returns a paginated list of runs for an experiment, resolving the experiment by name or ID. Dataset is required when Experiment is a name; Space is required when Dataset is also passed as a name.
Signature:
func (c *Client) ListRuns(
ctx context.Context,
req ListRunsRequest,
) (*ExperimentRunsList, error)
Usage Example:
package main
import (
"context"
"errors"
"fmt"
"log"
"github.com/Arize-ai/client-go-v2/arize"
"github.com/Arize-ai/client-go-v2/arize/experiments"
)
func main() {
client, err := arize.NewClient(arize.Config{APIKey: "your-api-key"})
if err != nil {
log.Fatal(err)
}
resp, err := client.Experiments.ListRuns(
context.Background(),
experiments.ListRunsRequest{
Experiment: "your-experiment-name-or-id",
Dataset: "your-dataset-name-or-id",
Space: "your-space-name-or-id",
Limit: 50,
},
)
if err != nil {
var notFound *arize.NotFoundError
if errors.As(err, ¬Found) {
log.Fatalf("experiment not found: %v", notFound)
}
log.Fatal(err)
}
fmt.Printf("loaded %d runs\n", len(resp.ExperimentRuns))
}