feat(adapter): return Result with Metrics from TextModel

InferenceAdapter.Generate and Chat now return Result{Text, Metrics}
where Metrics is populated from the underlying TextModel.Metrics().

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Snider 2026-02-22 17:36:53 +00:00
parent 5578671f90
commit d90bd7b779

View file

@ -30,31 +30,31 @@ func NewInferenceAdapter(model inference.TextModel, name string) *InferenceAdapt
}
// Generate collects all tokens from the model's iterator into a single string.
func (a *InferenceAdapter) Generate(ctx context.Context, prompt string, opts GenOpts) (string, error) {
func (a *InferenceAdapter) Generate(ctx context.Context, prompt string, opts GenOpts) (Result, error) {
inferOpts := convertOpts(opts)
var b strings.Builder
for tok := range a.model.Generate(ctx, prompt, inferOpts...) {
b.WriteString(tok.Text)
}
if err := a.model.Err(); err != nil {
return b.String(), err
return Result{Text: b.String()}, err
}
return b.String(), nil
return Result{Text: b.String(), Metrics: metricsPtr(a.model)}, nil
}
// Chat sends a multi-turn conversation to the underlying TextModel and collects
// all tokens. Since ml.Message is now a type alias for inference.Message, no
// conversion is needed.
func (a *InferenceAdapter) Chat(ctx context.Context, messages []Message, opts GenOpts) (string, error) {
func (a *InferenceAdapter) Chat(ctx context.Context, messages []Message, opts GenOpts) (Result, error) {
inferOpts := convertOpts(opts)
var b strings.Builder
for tok := range a.model.Chat(ctx, messages, inferOpts...) {
b.WriteString(tok.Text)
}
if err := a.model.Err(); err != nil {
return b.String(), err
return Result{Text: b.String()}, err
}
return b.String(), nil
return Result{Text: b.String(), Metrics: metricsPtr(a.model)}, nil
}
// GenerateStream forwards each generated token's text to the callback.
@ -118,3 +118,9 @@ func convertOpts(opts GenOpts) []inference.GenerateOption {
// GenOpts.Model is ignored — the model is already loaded.
return out
}
// metricsPtr returns a copy of the model's latest metrics, or nil if unavailable.
func metricsPtr(m inference.TextModel) *inference.GenerateMetrics {
met := m.Metrics()
return &met
}