mirror of
https://github.com/mudler/LocalAI.git
synced 2026-09-12 22:33:54 -04:00
feat: bound backend admission and expose running traces Add process-wide backend execution admission without blocking UI or administrative HTTP work. Represent backend operations while they are in flight, surface running traces with immediate log links, and tie streaming admission leases to the gRPC receive lifecycle. Assisted-by: OpenAI Codex: GPT-5 Signed-off-by: Richard Palethorpe <io@richiejp.com>
50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package backend
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/mudler/LocalAI/core/config"
|
|
"github.com/mudler/LocalAI/pkg/model"
|
|
)
|
|
|
|
// FaceEmbed loads the face recognition backend and returns a 512-d
|
|
// face embedding for the base64-encoded image. Unlike ModelEmbedding
|
|
// it passes the image through PredictOptions.Images — the insightface
|
|
// backend picks the highest-confidence face and returns its
|
|
// L2-normalized embedding.
|
|
func FaceEmbed(
|
|
ctx context.Context,
|
|
imgBase64 string,
|
|
loader *model.ModelLoader,
|
|
appConfig *config.ApplicationConfig,
|
|
modelConfig config.ModelConfig,
|
|
) ([]float32, error) {
|
|
opts := ModelOptions(modelConfig, appConfig)
|
|
faceModel, err := loader.Load(opts...)
|
|
if err != nil {
|
|
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
|
|
return nil, err
|
|
}
|
|
if faceModel == nil {
|
|
return nil, fmt.Errorf("could not load face recognition model")
|
|
}
|
|
|
|
predictOpts := gRPCPredictOpts(modelConfig, loader.ModelPath)
|
|
predictOpts.Images = []string{imgBase64}
|
|
release, err := AcquireGlobalBackendSlot()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer release()
|
|
|
|
res, err := faceModel.Embeddings(ctx, predictOpts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(res.Embeddings) == 0 {
|
|
return nil, fmt.Errorf("face embedding returned empty vector (no face detected?)")
|
|
}
|
|
return res.Embeddings, nil
|
|
}
|