Inspect PromptKit profiles during preflight
This commit is contained in:
@@ -61,27 +61,23 @@ func NewPromptKitClient(cfg PromptKitClientConfig) (*PromptKitClient, error) {
|
||||
if cfg.Assets == nil {
|
||||
return nil, fmt.Errorf("PromptKit client assets must not be nil")
|
||||
}
|
||||
if strings.TrimSpace(cfg.ProfileDir) != "" && strings.TrimSpace(cfg.ProfileFile) != "" {
|
||||
return nil, fmt.Errorf("PromptKit profile_dir and profile_file are mutually exclusive")
|
||||
profileSource, profileOptions, err := promptKitProfileSourceEngineOptions(PromptKitProfileSourceConfig{
|
||||
ProfileDir: cfg.ProfileDir,
|
||||
ProfileFile: cfg.ProfileFile,
|
||||
LocalBackend: cfg.LocalBackend,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
options, err := cfg.Assets.PromptKitOptions()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if profileFile := strings.TrimSpace(cfg.ProfileFile); profileFile != "" {
|
||||
options = append(options, promptkit.WithProfileFile(profileFile))
|
||||
}
|
||||
var localEndpoint string
|
||||
if cfg.LocalBackend != nil {
|
||||
localBackend := *cfg.LocalBackend
|
||||
localBackend.Endpoint = strings.TrimSpace(localBackend.Endpoint)
|
||||
localEndpoint = localBackend.Endpoint
|
||||
options = append(options, PromptKitLocalBackendOption(localBackend))
|
||||
}
|
||||
options = append(options, profileOptions...)
|
||||
options = append(options, cfg.EngineOptions...)
|
||||
|
||||
engine, err := promptkit.NewEngine(promptkit.Config{
|
||||
ProfileDir: strings.TrimSpace(cfg.ProfileDir),
|
||||
ProfileDir: profileSource.ProfileDir,
|
||||
Timeout: cfg.Timeout,
|
||||
HTTPClient: cfg.HTTPClient,
|
||||
}, options...)
|
||||
@@ -100,9 +96,9 @@ func NewPromptKitClient(cfg PromptKitClientConfig) (*PromptKitClient, error) {
|
||||
return &PromptKitClient{
|
||||
engine: engine,
|
||||
recorder: recorder,
|
||||
profileDir: strings.TrimSpace(cfg.ProfileDir),
|
||||
profileFile: strings.TrimSpace(cfg.ProfileFile),
|
||||
localEndpoint: localEndpoint,
|
||||
profileDir: profileSource.ProfileDir,
|
||||
profileFile: profileSource.ProfileFile,
|
||||
localEndpoint: profileSource.localEndpoint(),
|
||||
reasoningEffort: reasoningEffort,
|
||||
}, nil
|
||||
}
|
||||
|
||||
114
internal/framework/llm/promptkit_profiles.go
Normal file
114
internal/framework/llm/promptkit_profiles.go
Normal file
@@ -0,0 +1,114 @@
|
||||
package llm
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"gitea.maximumdirect.net/eric/promptkit"
|
||||
)
|
||||
|
||||
type PromptKitProfileSourceConfig struct {
|
||||
ProfileDir string
|
||||
ProfileFile string
|
||||
LocalBackend *PromptKitLocalBackendConfig
|
||||
}
|
||||
|
||||
func (c PromptKitProfileSourceConfig) localEndpoint() string {
|
||||
if c.LocalBackend == nil {
|
||||
return ""
|
||||
}
|
||||
return c.LocalBackend.Endpoint
|
||||
}
|
||||
|
||||
type PromptKitProfileInspector struct {
|
||||
engine *promptkit.Engine
|
||||
}
|
||||
|
||||
type PromptKitProfileInspection struct {
|
||||
ProfileID string
|
||||
BackendID string
|
||||
Model string
|
||||
CredentialEnvironment string
|
||||
CredentialRequired bool
|
||||
}
|
||||
|
||||
type PromptKitProfileInspectionError struct {
|
||||
ProfileID string
|
||||
err error
|
||||
}
|
||||
|
||||
func (e *PromptKitProfileInspectionError) Error() string {
|
||||
if errors.Is(e.err, promptkit.ErrProfileNotFound) {
|
||||
return fmt.Sprintf("PromptKit profile %q is not configured", e.ProfileID)
|
||||
}
|
||||
return fmt.Sprintf("inspect PromptKit profile %q: %v", e.ProfileID, e.err)
|
||||
}
|
||||
|
||||
func (e *PromptKitProfileInspectionError) Unwrap() error {
|
||||
return e.err
|
||||
}
|
||||
|
||||
func NewPromptKitProfileInspector(cfg PromptKitProfileSourceConfig) (*PromptKitProfileInspector, error) {
|
||||
source, options, err := promptKitProfileSourceEngineOptions(cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
engine, err := promptkit.NewEngine(promptkit.Config{
|
||||
PromptDir: ".",
|
||||
ProfileDir: source.ProfileDir,
|
||||
}, options...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("create PromptKit profile inspector: %w", err)
|
||||
}
|
||||
return &PromptKitProfileInspector{engine: engine}, nil
|
||||
}
|
||||
|
||||
func (i *PromptKitProfileInspector) InspectProfile(ctx context.Context, profileID string) (PromptKitProfileInspection, error) {
|
||||
if i == nil || i.engine == nil {
|
||||
return PromptKitProfileInspection{}, fmt.Errorf("PromptKit profile inspector must not be nil")
|
||||
}
|
||||
profileID = strings.TrimSpace(profileID)
|
||||
inspection, err := i.engine.InspectProfile(ctx, profileID)
|
||||
if err != nil {
|
||||
if ctxErr := ctx.Err(); ctxErr != nil {
|
||||
return PromptKitProfileInspection{}, ctxErr
|
||||
}
|
||||
return PromptKitProfileInspection{}, &PromptKitProfileInspectionError{
|
||||
ProfileID: profileID,
|
||||
err: err,
|
||||
}
|
||||
}
|
||||
return PromptKitProfileInspection{
|
||||
ProfileID: inspection.ProfileID,
|
||||
BackendID: strings.TrimSpace(inspection.EffectiveModelParams.BackendID),
|
||||
Model: strings.TrimSpace(inspection.EffectiveModelParams.Model),
|
||||
CredentialEnvironment: strings.TrimSpace(inspection.EffectiveModelParams.APIKeyEnv),
|
||||
CredentialRequired: inspection.APIKeyRequired,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func promptKitProfileSourceEngineOptions(cfg PromptKitProfileSourceConfig) (PromptKitProfileSourceConfig, []promptkit.Option, error) {
|
||||
source := PromptKitProfileSourceConfig{
|
||||
ProfileDir: strings.TrimSpace(cfg.ProfileDir),
|
||||
ProfileFile: strings.TrimSpace(cfg.ProfileFile),
|
||||
}
|
||||
if source.ProfileDir != "" && source.ProfileFile != "" {
|
||||
return PromptKitProfileSourceConfig{}, nil, fmt.Errorf("PromptKit profile_dir and profile_file are mutually exclusive")
|
||||
}
|
||||
if cfg.LocalBackend != nil {
|
||||
localBackend := *cfg.LocalBackend
|
||||
localBackend.Endpoint = strings.TrimSpace(localBackend.Endpoint)
|
||||
source.LocalBackend = &localBackend
|
||||
}
|
||||
|
||||
var options []promptkit.Option
|
||||
if source.ProfileFile != "" {
|
||||
options = append(options, promptkit.WithProfileFile(source.ProfileFile))
|
||||
}
|
||||
if source.LocalBackend != nil {
|
||||
options = append(options, PromptKitLocalBackendOption(*source.LocalBackend))
|
||||
}
|
||||
return source, options, nil
|
||||
}
|
||||
Reference in New Issue
Block a user