openai_client_transport.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package service
  2. import (
  3. "strings"
  4. "github.com/gin-gonic/gin"
  5. )
  6. // OpenAIClientTransport 表示客户端入站协议类型。
  7. type OpenAIClientTransport string
  8. const (
  9. OpenAIClientTransportUnknown OpenAIClientTransport = ""
  10. OpenAIClientTransportHTTP OpenAIClientTransport = "http"
  11. OpenAIClientTransportWS OpenAIClientTransport = "ws"
  12. )
  13. const openAIClientTransportContextKey = "openai_client_transport"
  14. // SetOpenAIClientTransport 标记当前请求的客户端入站协议。
  15. func SetOpenAIClientTransport(c *gin.Context, transport OpenAIClientTransport) {
  16. if c == nil {
  17. return
  18. }
  19. normalized := normalizeOpenAIClientTransport(transport)
  20. if normalized == OpenAIClientTransportUnknown {
  21. return
  22. }
  23. c.Set(openAIClientTransportContextKey, string(normalized))
  24. }
  25. // GetOpenAIClientTransport 读取当前请求的客户端入站协议。
  26. func GetOpenAIClientTransport(c *gin.Context) OpenAIClientTransport {
  27. if c == nil {
  28. return OpenAIClientTransportUnknown
  29. }
  30. raw, ok := c.Get(openAIClientTransportContextKey)
  31. if !ok || raw == nil {
  32. return OpenAIClientTransportUnknown
  33. }
  34. switch v := raw.(type) {
  35. case OpenAIClientTransport:
  36. return normalizeOpenAIClientTransport(v)
  37. case string:
  38. return normalizeOpenAIClientTransport(OpenAIClientTransport(v))
  39. default:
  40. return OpenAIClientTransportUnknown
  41. }
  42. }
  43. func normalizeOpenAIClientTransport(transport OpenAIClientTransport) OpenAIClientTransport {
  44. switch strings.ToLower(strings.TrimSpace(string(transport))) {
  45. case string(OpenAIClientTransportHTTP), "http_sse", "sse":
  46. return OpenAIClientTransportHTTP
  47. case string(OpenAIClientTransportWS), "websocket":
  48. return OpenAIClientTransportWS
  49. default:
  50. return OpenAIClientTransportUnknown
  51. }
  52. }
  53. func resolveOpenAIWSDecisionByClientTransport(
  54. decision OpenAIWSProtocolDecision,
  55. clientTransport OpenAIClientTransport,
  56. ) OpenAIWSProtocolDecision {
  57. if clientTransport == OpenAIClientTransportHTTP {
  58. return openAIWSHTTPDecision("client_protocol_http")
  59. }
  60. return decision
  61. }