Copy hyperguild/ingestion/internal/llm into internal/adapters/llm and own it. Tapir owes that repo nothing at the dependency level — no module dep added. Router gives the local-Primary -> BYO-Fallback path needed for ai_routing.feature. Copied tests rewritten from testify to stdlib testing to keep go.mod dependency-free (repo has zero deps; acceptance tests are stdlib too). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 lines
712 B
Go
30 lines
712 B
Go
package llm
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// Router calls Primary first; on any error falls back to Fallback.
|
|
// Fallback may be nil, in which case primary errors are returned directly.
|
|
type Router struct {
|
|
Primary *Client
|
|
Fallback *Client
|
|
}
|
|
|
|
// Complete routes through Primary then Fallback.
|
|
func (r *Router) Complete(ctx context.Context, system, user string) (string, error) {
|
|
out, err := r.Primary.Complete(ctx, system, user)
|
|
if err == nil {
|
|
return out, nil
|
|
}
|
|
if r.Fallback == nil {
|
|
return "", fmt.Errorf("primary llm: %w", err)
|
|
}
|
|
out, err2 := r.Fallback.Complete(ctx, system, user)
|
|
if err2 != nil {
|
|
return "", fmt.Errorf("primary llm: %w; fallback llm: %v", err, err2)
|
|
}
|
|
return out, nil
|
|
}
|