python.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package service
  2. import (
  3. "time"
  4. "github.com/langgenius/dify-sandbox/internal/core/runner/python"
  5. runner_types "github.com/langgenius/dify-sandbox/internal/core/runner/types"
  6. "github.com/langgenius/dify-sandbox/internal/static"
  7. "github.com/langgenius/dify-sandbox/internal/types"
  8. )
  9. type RunCodeResponse struct {
  10. Stderr string `json:"error"`
  11. Stdout string `json:"stdout"`
  12. }
  13. func RunPython3Code(code string, preload string, options *runner_types.RunnerOptions) *types.DifySandboxResponse {
  14. if err := checkOptions(options); err != nil {
  15. return types.ErrorResponse(-400, err.Error())
  16. }
  17. if !static.GetDifySandboxGlobalConfigurations().EnablePreload {
  18. preload = ""
  19. }
  20. timeout := time.Duration(
  21. static.GetDifySandboxGlobalConfigurations().WorkerTimeout * int(time.Second),
  22. )
  23. runner := python.PythonRunner{}
  24. stdout, stderr, done, err := runner.Run(
  25. code, timeout, nil, preload, options,
  26. )
  27. if err != nil {
  28. return types.ErrorResponse(-500, err.Error())
  29. }
  30. stdout_str := ""
  31. stderr_str := ""
  32. defer close(done)
  33. defer close(stdout)
  34. defer close(stderr)
  35. for {
  36. select {
  37. case <-done:
  38. return types.SuccessResponse(&RunCodeResponse{
  39. Stdout: stdout_str,
  40. Stderr: stderr_str,
  41. })
  42. case out := <-stdout:
  43. stdout_str += string(out)
  44. case err := <-stderr:
  45. stderr_str += string(err)
  46. }
  47. }
  48. }
  49. type ListDependenciesResponse struct {
  50. Dependencies []runner_types.Dependency `json:"dependencies"`
  51. }
  52. func ListPython3Dependencies() *types.DifySandboxResponse {
  53. return types.SuccessResponse(&ListDependenciesResponse{
  54. Dependencies: python.ListDependencies(),
  55. })
  56. }
  57. type RefreshDependenciesResponse struct {
  58. Dependencies []runner_types.Dependency `json:"dependencies"`
  59. }
  60. func RefreshPython3Dependencies() *types.DifySandboxResponse {
  61. return types.SuccessResponse(&RefreshDependenciesResponse{
  62. Dependencies: python.RefreshDependencies(),
  63. })
  64. }
  65. type UpdateDependenciesResponse struct{}
  66. func UpdateDependencies() *types.DifySandboxResponse {
  67. err := python.PreparePythonDependenciesEnv()
  68. if err != nil {
  69. return types.ErrorResponse(-500, err.Error())
  70. }
  71. return types.SuccessResponse(&UpdateDependenciesResponse{})
  72. }