invoke_dify.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package plugin_daemon
  2. import (
  3. "fmt"
  4. "github.com/langgenius/dify-plugin-daemon/internal/core/dify_invocation"
  5. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_daemon/backwards_invocation"
  6. "github.com/langgenius/dify-plugin-daemon/internal/core/session_manager"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/entities"
  8. "github.com/langgenius/dify-plugin-daemon/internal/utils/parser"
  9. )
  10. func invokeDify(
  11. runtime entities.PluginRuntimeInterface,
  12. invoke_from PluginAccessType,
  13. session *session_manager.Session, data []byte,
  14. ) error {
  15. // unmarshal invoke data
  16. request, err := parser.UnmarshalJsonBytes[map[string]any](data)
  17. if err != nil {
  18. return fmt.Errorf("unmarshal invoke request failed: %s", err.Error())
  19. }
  20. // prepare invocation arguments
  21. request_handle, err := prepareDifyInvocationArguments(session, request)
  22. if err != nil {
  23. return err
  24. }
  25. defer request_handle.End()
  26. if invoke_from == PLUGIN_ACCESS_TYPE_MODEL {
  27. request_handle.WriteError(fmt.Errorf("you can not invoke dify from %s", invoke_from))
  28. return nil
  29. }
  30. // dispatch invocation task
  31. dispatchDifyInvocationTask(request_handle)
  32. return nil
  33. }
  34. func prepareDifyInvocationArguments(session *session_manager.Session, request map[string]any) (*backwards_invocation.BackwardsInvocation, error) {
  35. typ, ok := request["type"].(string)
  36. if !ok {
  37. return nil, fmt.Errorf("invoke request missing type: %s", request)
  38. }
  39. // get request id
  40. backwards_request_id, ok := request["backwards_request_id"].(string)
  41. if !ok {
  42. return nil, fmt.Errorf("invoke request missing request_id: %s", request)
  43. }
  44. // get request
  45. detailed_request, ok := request["request"].(map[string]any)
  46. if !ok {
  47. return nil, fmt.Errorf("invoke request missing request: %s", request)
  48. }
  49. return backwards_invocation.NewBackwardsInvocation(
  50. backwards_invocation.BackwardsInvocationType(typ),
  51. backwards_request_id, session, detailed_request,
  52. ), nil
  53. }
  54. func dispatchDifyInvocationTask(handle *backwards_invocation.BackwardsInvocation) {
  55. switch handle.Type() {
  56. case dify_invocation.INVOKE_TYPE_TOOL:
  57. _, err := parser.MapToStruct[dify_invocation.InvokeToolRequest](handle.RequestData())
  58. if err != nil {
  59. handle.WriteError(fmt.Errorf("unmarshal invoke tool request failed: %s", err.Error()))
  60. return
  61. }
  62. default:
  63. handle.WriteError(fmt.Errorf("unsupported invoke type: %s", handle.Type()))
  64. }
  65. }
  66. func setTaskContext(session *session_manager.Session, r *dify_invocation.BaseInvokeDifyRequest) {
  67. r.TenantId = session.TenantID()
  68. r.UserId = session.UserID()
  69. }