Isolate execution observations and preserve injected error categories
This commit is contained in:
@@ -2,9 +2,11 @@ package promptkit
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"gitea.maximumdirect.net/eric/promptkit/internal/domain"
|
||||
"gitea.maximumdirect.net/eric/promptkit/internal/llm"
|
||||
)
|
||||
|
||||
type publicLLMClientAdapter struct {
|
||||
@@ -13,11 +15,28 @@ type publicLLMClientAdapter struct {
|
||||
|
||||
func (a publicLLMClientAdapter) Generate(ctx context.Context, req domain.GenerateRequest) (*domain.GenerateResponse, error) {
|
||||
resp, err := a.client.Generate(ctx, fromDomainGenerateRequest(req))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
if err == nil && resp == nil {
|
||||
err = fmt.Errorf("%w: %w: llm client returned nil response", ErrLLMGenerate, ErrMalformedResponse)
|
||||
}
|
||||
if resp == nil {
|
||||
return nil, fmt.Errorf("%w: %w: llm client returned nil response", ErrLLMGenerate, ErrMalformedResponse)
|
||||
if err != nil {
|
||||
switch {
|
||||
case errors.Is(err, ErrTransport):
|
||||
return nil, classifiedClientError{cause: err, category: llm.ErrTransport}
|
||||
case errors.Is(err, ErrMalformedResponse):
|
||||
return nil, classifiedClientError{cause: err, category: llm.ErrMalformedResponse}
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return toDomainGenerateResponse(resp), nil
|
||||
}
|
||||
|
||||
// classifiedClientError makes an explicit public category available internally
|
||||
// without replacing the client's diagnostic or original error chain.
|
||||
type classifiedClientError struct {
|
||||
cause error
|
||||
category error
|
||||
}
|
||||
|
||||
func (e classifiedClientError) Error() string { return e.cause.Error() }
|
||||
func (e classifiedClientError) Unwrap() error { return e.cause }
|
||||
func (e classifiedClientError) Is(target error) bool { return target == e.category }
|
||||
|
||||
Reference in New Issue
Block a user