helpers.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package taskcommon
  2. import (
  3. "encoding/base64"
  4. "fmt"
  5. "github.com/QuantumNous/new-api/common"
  6. "github.com/QuantumNous/new-api/setting/system_setting"
  7. )
  8. // UnmarshalMetadata converts a map[string]any metadata to a typed struct via JSON round-trip.
  9. // This replaces the repeated pattern: json.Marshal(metadata) → json.Unmarshal(bytes, &target).
  10. func UnmarshalMetadata(metadata map[string]any, target any) error {
  11. if metadata == nil {
  12. return nil
  13. }
  14. metaBytes, err := common.Marshal(metadata)
  15. if err != nil {
  16. return fmt.Errorf("marshal metadata failed: %w", err)
  17. }
  18. if err := common.Unmarshal(metaBytes, target); err != nil {
  19. return fmt.Errorf("unmarshal metadata failed: %w", err)
  20. }
  21. return nil
  22. }
  23. // DefaultString returns val if non-empty, otherwise fallback.
  24. func DefaultString(val, fallback string) string {
  25. if val == "" {
  26. return fallback
  27. }
  28. return val
  29. }
  30. // DefaultInt returns val if non-zero, otherwise fallback.
  31. func DefaultInt(val, fallback int) int {
  32. if val == 0 {
  33. return fallback
  34. }
  35. return val
  36. }
  37. // EncodeLocalTaskID encodes an upstream operation name to a URL-safe base64 string.
  38. // Used by Gemini/Vertex to store upstream names as task IDs.
  39. func EncodeLocalTaskID(name string) string {
  40. return base64.RawURLEncoding.EncodeToString([]byte(name))
  41. }
  42. // DecodeLocalTaskID decodes a base64-encoded upstream operation name.
  43. func DecodeLocalTaskID(id string) (string, error) {
  44. b, err := base64.RawURLEncoding.DecodeString(id)
  45. if err != nil {
  46. return "", err
  47. }
  48. return string(b), nil
  49. }
  50. // BuildProxyURL constructs the video proxy URL using the public task ID.
  51. // e.g., "https://your-server.com/v1/videos/task_xxxx/content"
  52. func BuildProxyURL(taskID string) string {
  53. return fmt.Sprintf("%s/v1/videos/%s/content", system_setting.ServerAddress, taskID)
  54. }
  55. // Status-to-progress mapping constants for polling updates.
  56. const (
  57. ProgressSubmitted = "10%"
  58. ProgressQueued = "20%"
  59. ProgressInProgress = "30%"
  60. ProgressComplete = "100%"
  61. )