No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

59 líneas
1.6 KiB

  1. package location
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "net/http"
  6. "github.com/AFASystems/presence/internal/pkg/apiclient"
  7. "github.com/AFASystems/presence/internal/pkg/config"
  8. "github.com/AFASystems/presence/internal/pkg/model"
  9. )
  10. // Inferencer returns inferred positions (e.g. from an AI/ML service).
  11. type Inferencer interface {
  12. Infer(ctx context.Context, cfg *config.Config) (model.PositionResponse, error)
  13. }
  14. // DefaultInferencer uses apiclient to get token and call the inference API.
  15. type DefaultInferencer struct {
  16. Client *http.Client
  17. Token string
  18. }
  19. // NewDefaultInferencer creates an inferencer with optional TLS skip verify (e.g. from config.TLSInsecureSkipVerify).
  20. func NewDefaultInferencer(skipTLSVerify bool) *DefaultInferencer {
  21. tr := &http.Transport{}
  22. tr.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
  23. return &DefaultInferencer{
  24. Client: &http.Client{Transport: tr},
  25. Token: "",
  26. }
  27. }
  28. // Infer gets a token and calls the inference API.
  29. func (d *DefaultInferencer) Infer(ctx context.Context, cfg *config.Config) (model.PositionResponse, error) {
  30. if d.Token == "" {
  31. token, err := apiclient.GetToken(ctx, cfg, d.Client)
  32. if err != nil {
  33. return model.PositionResponse{}, err
  34. }
  35. d.Token = token
  36. }
  37. response, err := apiclient.InferPosition(d.Token, d.Client, cfg)
  38. if err != nil {
  39. token, err := apiclient.GetToken(ctx, cfg, d.Client)
  40. if err != nil {
  41. return model.PositionResponse{}, err
  42. }
  43. d.Token = token
  44. response, err = apiclient.InferPosition(d.Token, d.Client, cfg)
  45. if err != nil {
  46. return model.PositionResponse{}, err
  47. }
  48. }
  49. return response, nil
  50. }