TypeSafe AI Provider
TypeSafe AI provides evaluation models for use with the experimental
ai.ExperimentalEvaluate API — judging free-form output against a set of
questions (choice, score, or boolean) rather than generating text. It's
the only capability this provider implements: LanguageModel,
EmbeddingModel, ImageModel, SpeechModel, and TranscriptionModel all
return errors.
Setup
Installation
import (
"github.com/digitallysavvy/go-ai/pkg/ai"
goprovider "github.com/digitallysavvy/go-ai/pkg/provider"
"github.com/digitallysavvy/go-ai/pkg/providers/typesafeai"
)
Configuration
provider := typesafeai.New(typesafeai.Config{
APIKey: os.Getenv("TYPESAFE_AI_API_KEY"),
})
typesafeai.Config also accepts BaseURL (default
https://api.typesafe.ai/v1), Headers, and HTTPClient. If APIKey is
left empty, it is read from TYPESAFE_AI_API_KEY lazily on each request
(so setting the environment variable after New() still works).
Get API Key
export TYPESAFE_AI_API_KEY=...
Evaluation
evalModel, err := provider.EvaluationModel("jev-latest")
if err != nil {
log.Fatal(err)
}
result, err := ai.ExperimentalEvaluate(ctx, ai.EvaluateOptions{
Model: evalModel,
State: "The capital of France is Paris.",
Questions: map[string]goprovider.EvaluationQuestion{
"factual": {
Type: "boolean",
Instructions: "Is this statement factually correct?",
},
"helpfulness": {
Type: "score",
Instructions: "How helpful is this response?",
Criteria: []interface{}{"poor", "fair", "good", "excellent"},
},
},
})
if err != nil {
log.Fatal(err)
}
for id, answer := range result.Answers {
fmt.Printf("%s: %v\n", id, answer)
}
ai.ExperimentalEvaluate also accepts any provider.EvaluationModel
instance (or a model ID string, resolved via Provider, falling back to
the AI Gateway when Provider is nil) — you are not limited to
TypeSafe AI as the judge model.
Workflow Serialization
TypeSafe AI evaluation models can cross a workflow boundary with
provider.SerializeEvaluationModel / DeserializeEvaluationModel. See
Provider Serialization
for the mechanism.