25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

82 satır
1.9 KiB

  1. package chinamobile_seedance
  2. import (
  3. "fmt"
  4. "strings"
  5. "sync"
  6. "time"
  7. maas "maas_seedance_sdk_1.0.0_go"
  8. )
  9. const (
  10. defaultBaseURL = "https://zhenze-huhehaote.cmecloud.cn/api/v3"
  11. defaultModel = "doubao-seedance-2.0"
  12. defaultSubmitTimeout = 180 * time.Second
  13. defaultQueryTimeout = 60 * time.Second
  14. sdkAcquireTimeout = 2 * time.Second
  15. )
  16. var sdkSemaphore = make(chan struct{}, 4)
  17. type seedanceSDK interface {
  18. CreateVideoGenerationTask(data map[string]interface{}) (string, error)
  19. QueryVideoGenerationTask(taskID string) (map[string]interface{}, error)
  20. }
  21. type seedanceSDKFactory func(baseURL, apiKey, model string) (seedanceSDK, error)
  22. func newRealSDK(baseURL, apiKey, model string) (seedanceSDK, error) {
  23. baseURL = strings.TrimRight(strings.TrimSpace(baseURL), "/")
  24. if baseURL == "" {
  25. baseURL = defaultBaseURL
  26. }
  27. model = strings.TrimSpace(model)
  28. if model == "" {
  29. model = defaultModel
  30. }
  31. return runSDKCall[seedanceSDK](defaultQueryTimeout, func() (seedanceSDK, error) {
  32. return maas.NewMaasSeedanceClient(baseURL, apiKey, model, false)
  33. })
  34. }
  35. func runSDKCall[T any](timeout time.Duration, fn func() (T, error)) (T, error) {
  36. var zero T
  37. select {
  38. case sdkSemaphore <- struct{}{}:
  39. case <-time.After(sdkAcquireTimeout):
  40. return zero, fmt.Errorf("upstream_busy: sdk concurrency limit reached")
  41. }
  42. type result struct {
  43. value T
  44. err error
  45. }
  46. var releaseOnce sync.Once
  47. release := func() {
  48. releaseOnce.Do(func() {
  49. <-sdkSemaphore
  50. })
  51. }
  52. done := make(chan result, 1)
  53. go func() {
  54. res := result{}
  55. defer func() {
  56. if r := recover(); r != nil {
  57. res.err = fmt.Errorf("upstream_sdk_panic: %v", r)
  58. }
  59. release()
  60. done <- res
  61. }()
  62. res.value, res.err = fn()
  63. }()
  64. select {
  65. case res := <-done:
  66. return res.value, res.err
  67. case <-time.After(timeout):
  68. release()
  69. return zero, fmt.Errorf("upstream_timeout: sdk call exceeded %s", timeout)
  70. }
  71. }