event.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package plugin_entities
  2. import (
  3. "encoding/json"
  4. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  5. "github.com/langgenius/dify-plugin-daemon/internal/utils/parser"
  6. )
  7. type PluginUniversalEvent struct {
  8. SessionId string `json:"session_id"`
  9. Event PluginEventType `json:"event"`
  10. Data json.RawMessage `json:"data"`
  11. }
  12. // ParsePluginUniversalEvent parses bytes into struct contains basic info of a message
  13. // it's the outermost layer of the protocol
  14. // error_handler will be called when data is not standard or itself it's an error message
  15. func ParsePluginUniversalEvent(
  16. data []byte,
  17. statusText string,
  18. sessionHandler func(sessionId string, data []byte),
  19. heartbeatHandler func(),
  20. errorHandler func(err string),
  21. infoHandler func(message string),
  22. ) {
  23. // handle event
  24. event, err := parser.UnmarshalJsonBytes[PluginUniversalEvent](data)
  25. if err != nil {
  26. if len(data) > 1024 {
  27. errorHandler(err.Error() + " status: " + statusText + " original response: " + string(data[:1024]) + "...")
  28. } else {
  29. errorHandler(err.Error() + " status: " + statusText + " original response: " + string(data))
  30. }
  31. return
  32. }
  33. sessionId := event.SessionId
  34. switch event.Event {
  35. case PLUGIN_EVENT_LOG:
  36. if event.Event == PLUGIN_EVENT_LOG {
  37. logEvent, err := parser.UnmarshalJsonBytes[PluginLogEvent](
  38. event.Data,
  39. )
  40. if err != nil {
  41. log.Error("unmarshal json failed: %s", err.Error())
  42. return
  43. }
  44. infoHandler(logEvent.Message)
  45. }
  46. case PLUGIN_EVENT_SESSION:
  47. sessionHandler(sessionId, event.Data)
  48. case PLUGIN_EVENT_ERROR:
  49. errorHandler(string(event.Data))
  50. case PLUGIN_EVENT_HEARTBEAT:
  51. heartbeatHandler()
  52. }
  53. }
  54. type PluginEventType string
  55. const (
  56. PLUGIN_EVENT_LOG PluginEventType = "log"
  57. PLUGIN_EVENT_SESSION PluginEventType = "session"
  58. PLUGIN_EVENT_ERROR PluginEventType = "error"
  59. PLUGIN_EVENT_HEARTBEAT PluginEventType = "heartbeat"
  60. )
  61. type PluginLogEvent struct {
  62. Level string `json:"level"`
  63. Message string `json:"message"`
  64. Timestamp float64 `json:"timestamp"`
  65. }
  66. type SessionMessage struct {
  67. Type SESSION_MESSAGE_TYPE `json:"type" validate:"required"`
  68. Data json.RawMessage `json:"data" validate:"required"`
  69. }
  70. type SESSION_MESSAGE_TYPE string
  71. const (
  72. SESSION_MESSAGE_TYPE_STREAM SESSION_MESSAGE_TYPE = "stream"
  73. SESSION_MESSAGE_TYPE_END SESSION_MESSAGE_TYPE = "end"
  74. SESSION_MESSAGE_TYPE_ERROR SESSION_MESSAGE_TYPE = "error"
  75. SESSION_MESSAGE_TYPE_INVOKE SESSION_MESSAGE_TYPE = "invoke"
  76. )
  77. type ErrorResponse struct {
  78. Message string `json:"message"`
  79. ErrorType string `json:"error_type"`
  80. Args map[string]any `json:"args" validate:"omitempty,max=10"` // max 10 args
  81. }
  82. func (e *ErrorResponse) Error() string {
  83. return parser.MarshalJson(map[string]any{
  84. "message": e.Message,
  85. "error_type": e.ErrorType,
  86. "args": e.Args,
  87. })
  88. }