event.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. session_handler func(sessionId string, data []byte),
  18. heartbeat_handler func(),
  19. error_handler func(err string),
  20. info_handler func(message string),
  21. ) {
  22. // handle event
  23. event, err := parser.UnmarshalJsonBytes[PluginUniversalEvent](data)
  24. if err != nil {
  25. if len(data) > 1024 {
  26. error_handler(err.Error() + " original response: " + string(data[:1024]) + "...")
  27. } else {
  28. error_handler(err.Error() + " original response: " + string(data))
  29. }
  30. return
  31. }
  32. sessionId := event.SessionId
  33. switch event.Event {
  34. case PLUGIN_EVENT_LOG:
  35. if event.Event == PLUGIN_EVENT_LOG {
  36. logEvent, err := parser.UnmarshalJsonBytes[PluginLogEvent](
  37. event.Data,
  38. )
  39. if err != nil {
  40. log.Error("unmarshal json failed: %s", err.Error())
  41. return
  42. }
  43. info_handler(logEvent.Message)
  44. }
  45. case PLUGIN_EVENT_SESSION:
  46. session_handler(sessionId, event.Data)
  47. case PLUGIN_EVENT_ERROR:
  48. error_handler(string(event.Data))
  49. case PLUGIN_EVENT_HEARTBEAT:
  50. heartbeat_handler()
  51. }
  52. }
  53. type PluginEventType string
  54. const (
  55. PLUGIN_EVENT_LOG PluginEventType = "log"
  56. PLUGIN_EVENT_SESSION PluginEventType = "session"
  57. PLUGIN_EVENT_ERROR PluginEventType = "error"
  58. PLUGIN_EVENT_HEARTBEAT PluginEventType = "heartbeat"
  59. )
  60. type PluginLogEvent struct {
  61. Level string `json:"level"`
  62. Message string `json:"message"`
  63. Timestamp float64 `json:"timestamp"`
  64. }
  65. type SessionMessage struct {
  66. Type SESSION_MESSAGE_TYPE `json:"type" validate:"required"`
  67. Data json.RawMessage `json:"data" validate:"required"`
  68. }
  69. type SESSION_MESSAGE_TYPE string
  70. const (
  71. SESSION_MESSAGE_TYPE_STREAM SESSION_MESSAGE_TYPE = "stream"
  72. SESSION_MESSAGE_TYPE_END SESSION_MESSAGE_TYPE = "end"
  73. SESSION_MESSAGE_TYPE_ERROR SESSION_MESSAGE_TYPE = "error"
  74. SESSION_MESSAGE_TYPE_INVOKE SESSION_MESSAGE_TYPE = "invoke"
  75. )
  76. type ErrorResponse struct {
  77. Message string `json:"message"`
  78. ErrorType string `json:"error_type"`
  79. Args map[string]any `json:"args" validate:"omitempty,max=10"` // max 10 args
  80. }
  81. func (e *ErrorResponse) Error() string {
  82. return parser.MarshalJson(map[string]any{
  83. "message": e.Message,
  84. "error_type": e.ErrorType,
  85. "args": e.Args,
  86. })
  87. }