feat: allow production provider bootstrap

This commit is contained in:
inman committed 2026-08-18 00:36:05 +08:00
1 parent 6480e503eb
commit 22fc7a56d8
21 files changed
+192 -18

No files matched your search

+4 -3
View File
@@ -92,9 +92,10 @@ func (scope Scope) Owns(job Job) bool {
type ErrorKind string
const (
ErrorInvalid ErrorKind = "invalid"
ErrorNotFound ErrorKind = "not_found"
ErrorConflict ErrorKind = "conflict"
ErrorInvalid ErrorKind = "invalid"
ErrorNotFound ErrorKind = "not_found"
ErrorConflict ErrorKind = "conflict"
ErrorUnavailable ErrorKind = "unavailable"
)
type Error struct {
+4
View File
@@ -121,6 +121,7 @@ type ProviderJobBuilder struct {
ImageEngine, VideoEngine string
ImageEngines map[string]ProviderTarget
VideoEngines map[string]ProviderTarget
UnavailableProviders map[string]string
NewID func() string
}
@@ -141,6 +142,9 @@ func (b ProviderJobBuilder) Build(_ context.Context, owner, client, capability,
if err != nil {
return CreateCommand{}, err
}
if message := strings.TrimSpace(b.UnavailableProviders[target.Provider]); message != "" {
return CreateCommand{}, &Error{Kind: ErrorUnavailable, Status: 503, Message: message}
}
if target.Provider == "" || target.Model == "" || b.NewID == nil {
return CreateCommand{}, errors.New("provider job builder is not configured")
}
+17
View File
@@ -40,6 +40,23 @@ func TestProviderJobBuilderPreparesImageRequestAndEngineOverride(t *testing.T) {
}
}
func TestProviderJobBuilderRejectsUnconfiguredProviderBeforeCreation(t *testing.T) {
b := testProviderBuilder()
b.UnavailableProviders = map[string]string{
"evolink": "EvoLink 服务商未配置,请先配置 EVOLINK_API_KEY。",
}
_, err := b.Build(context.Background(), "owner", "client", "image.generate", "idem", map[string]any{
"engine": "evolink", "prompt": "hello",
})
if err == nil || err.Error() != "EvoLink 服务商未配置,请先配置 EVOLINK_API_KEY。" {
t.Fatalf("error = %v", err)
}
var unavailable *Error
if !errors.As(err, &unavailable) || unavailable.Kind != ErrorUnavailable || unavailable.Status != 503 {
t.Fatalf("error = %#v, want unavailable 503", err)
}
}
func TestProviderJobBuilderUsesPublicInputURLsForImageMaterialCoverage(t *testing.T) {
b := testProviderBuilder()
cmd, err := b.Build(context.Background(), "owner", "client", "image.generate", "", map[string]any{