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>
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
package backend
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/mudler/LocalAI/core/config"
|
|
"github.com/mudler/LocalAI/core/trace"
|
|
"github.com/mudler/LocalAI/pkg/grpc/proto"
|
|
"github.com/mudler/LocalAI/pkg/model"
|
|
)
|
|
|
|
// Depth runs depth estimation (Depth Anything 3) on the supplied image and
|
|
// returns the full DepthResponse: per-pixel metric depth + confidence + sky,
|
|
// camera pose (extrinsics/intrinsics), an optional 3D point cloud and any
|
|
// requested exports (glb/colmap). The include_* flags and exports mirror the
|
|
// DepthRequest proto so callers can ask for less work.
|
|
func Depth(
|
|
ctx context.Context,
|
|
in *proto.DepthRequest,
|
|
loader *model.ModelLoader,
|
|
appConfig *config.ApplicationConfig,
|
|
modelConfig config.ModelConfig,
|
|
) (*proto.DepthResponse, error) {
|
|
opts := ModelOptions(modelConfig, appConfig)
|
|
depthModel, err := loader.Load(opts...)
|
|
if err != nil {
|
|
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
|
|
return nil, err
|
|
}
|
|
|
|
if depthModel == nil {
|
|
return nil, fmt.Errorf("could not load depth model")
|
|
}
|
|
release, err := AcquireGlobalBackendSlot()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer release()
|
|
|
|
var startTime time.Time
|
|
var traceID string
|
|
if appConfig.EnableTracing {
|
|
trace.InitBackendTracingIfEnabled(appConfig.TracingMaxItems, appConfig.TracingMaxBodyBytes)
|
|
startTime = time.Now()
|
|
traceID = trace.BeginBackendTrace(trace.BackendTrace{Timestamp: startTime, Type: trace.BackendTraceDepth, ModelName: modelConfig.Name, Backend: modelConfig.Backend, Summary: trace.TruncateString(in.GetSrc(), 200)})
|
|
}
|
|
defer trace.CancelBackendTrace(traceID)
|
|
|
|
// Stamped here for the same reason as in rerank.go: the caller builds the
|
|
// request without a ModelConfig, this function has the one that loaded.
|
|
in.ModelIdentity = modelConfig.Model
|
|
|
|
res, err := depthModel.Depth(ctx, in)
|
|
|
|
if appConfig.EnableTracing {
|
|
errStr := ""
|
|
if err != nil {
|
|
errStr = err.Error()
|
|
}
|
|
|
|
trace.RecordBackendTrace(trace.BackendTrace{
|
|
ID: traceID,
|
|
Timestamp: startTime,
|
|
Duration: time.Since(startTime),
|
|
Type: trace.BackendTraceDepth,
|
|
ModelName: modelConfig.Name,
|
|
Backend: modelConfig.Backend,
|
|
Summary: trace.TruncateString(in.GetSrc(), 200),
|
|
Error: errStr,
|
|
Data: map[string]any{
|
|
"exports": in.GetExports(),
|
|
},
|
|
})
|
|
}
|
|
|
|
return res, err
|
|
}
|