44 lines
1.7 KiB
Go
44 lines
1.7 KiB
Go
package promptkit_test
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
"testing"
|
|
|
|
"go.maximumdirect.net/configkit"
|
|
"go.maximumdirect.net/promptkit"
|
|
)
|
|
|
|
type independentArtifactReader struct{}
|
|
|
|
func (independentArtifactReader) Read(_ context.Context, ref promptkit.ArtifactRef) (*promptkit.Artifact, error) {
|
|
return &promptkit.Artifact{Body: []byte(ref.Body), Hash: ref.Body}, nil
|
|
}
|
|
|
|
func TestConcurrentPreparationWithTransferredArtifacts(t *testing.T) {
|
|
input := configkit.Input{Source: configkit.Mapping("ownership", map[string]any{
|
|
"profiles": []any{map[string]any{"id": "profile", "endpoint": "https://example.invalid/v1", "model": "model"}},
|
|
"prompts": []any{map[string]any{"id": "prompt", "default_profile": "profile", "inputs": []any{map[string]any{"name": "document", "required": true}}, "messages": []any{map[string]any{"role": "user", "content": `{{input "document"}}`}}, "output": map[string]any{"format": "text", "validation_mode": "none"}}},
|
|
})}
|
|
engine, err := promptkit.NewEngine(promptkit.Config{Sources: promptkit.ConfigurationSources{Main: &input}}, promptkit.WithArtifactReader(independentArtifactReader{}))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var group sync.WaitGroup
|
|
for i := range 24 {
|
|
group.Go(func() {
|
|
value := fmt.Sprintf("body-%d", i)
|
|
prepared, err := engine.Prepare(context.Background(), promptkit.RunRequest{PromptID: "prompt", Inputs: map[string]promptkit.ArtifactRef{"document": promptkit.Inline(value)}})
|
|
if err != nil {
|
|
t.Errorf("prepare: %v", err)
|
|
return
|
|
}
|
|
if len(prepared.Messages) != 1 || prepared.Messages[0].Content != value || prepared.InputHashes["document"] != value {
|
|
t.Errorf("prepared = %+v", prepared)
|
|
}
|
|
})
|
|
}
|
|
group.Wait()
|
|
}
|