invoke_tool.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package service
  2. import (
  3. "errors"
  4. "github.com/gin-gonic/gin"
  5. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_daemon"
  6. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_daemon/access_types"
  7. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager"
  8. "github.com/langgenius/dify-plugin-daemon/internal/core/session_manager"
  9. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  10. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/requests"
  11. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/tool_entities"
  12. "github.com/langgenius/dify-plugin-daemon/internal/utils/stream"
  13. )
  14. func createSession[T any](
  15. r *plugin_entities.InvokePluginRequest[T],
  16. access_type access_types.PluginAccessType,
  17. access_action access_types.PluginAccessAction,
  18. cluster_id string,
  19. ) (*session_manager.Session, error) {
  20. manager := plugin_manager.Manager()
  21. if manager == nil {
  22. return nil, errors.New("failed to get plugin manager")
  23. }
  24. runtime := manager.Get(r.PluginUniqueIdentifier)
  25. if runtime == nil {
  26. return nil, errors.New("failed to get plugin runtime")
  27. }
  28. session := session_manager.NewSession(
  29. session_manager.NewSessionPayload{
  30. TenantID: r.TenantId,
  31. UserID: r.UserId,
  32. PluginUniqueIdentifier: r.PluginUniqueIdentifier,
  33. ClusterID: cluster_id,
  34. InvokeFrom: access_type,
  35. Action: access_action,
  36. Declaration: runtime.Configuration(),
  37. BackwardsInvocation: manager.BackwardsInvocation(),
  38. IgnoreCache: false,
  39. },
  40. )
  41. session.BindRuntime(runtime)
  42. return session, nil
  43. }
  44. func InvokeTool(
  45. r *plugin_entities.InvokePluginRequest[requests.RequestInvokeTool],
  46. ctx *gin.Context,
  47. max_timeout_seconds int,
  48. ) {
  49. // create session
  50. session, err := createSession(
  51. r,
  52. access_types.PLUGIN_ACCESS_TYPE_TOOL,
  53. access_types.PLUGIN_ACCESS_ACTION_INVOKE_TOOL,
  54. ctx.GetString("cluster_id"),
  55. )
  56. if err != nil {
  57. ctx.JSON(500, gin.H{"error": err.Error()})
  58. return
  59. }
  60. defer session.Close(session_manager.CloseSessionPayload{
  61. IgnoreCache: false,
  62. })
  63. baseSSEService(
  64. func() (*stream.Stream[tool_entities.ToolResponseChunk], error) {
  65. return plugin_daemon.InvokeTool(session, &r.Data)
  66. },
  67. ctx,
  68. max_timeout_seconds,
  69. )
  70. }
  71. func ValidateToolCredentials(
  72. r *plugin_entities.InvokePluginRequest[requests.RequestValidateToolCredentials],
  73. ctx *gin.Context,
  74. max_timeout_seconds int,
  75. ) {
  76. // create session
  77. session, err := createSession(
  78. r,
  79. access_types.PLUGIN_ACCESS_TYPE_TOOL,
  80. access_types.PLUGIN_ACCESS_ACTION_VALIDATE_TOOL_CREDENTIALS,
  81. ctx.GetString("cluster_id"),
  82. )
  83. if err != nil {
  84. ctx.JSON(500, gin.H{"error": err.Error()})
  85. return
  86. }
  87. defer session.Close(session_manager.CloseSessionPayload{
  88. IgnoreCache: false,
  89. })
  90. baseSSEService(
  91. func() (*stream.Stream[tool_entities.ValidateCredentialsResult], error) {
  92. return plugin_daemon.ValidateToolCredentials(session, &r.Data)
  93. },
  94. ctx,
  95. max_timeout_seconds,
  96. )
  97. }