invoke_tool.go 2.4 KB

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