From cbf8dcf5bac5f70c6ee81afe2f44a78b751d6836 Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Tue, 6 Feb 2024 14:06:20 -0700 Subject: [PATCH] Add /sys and /*.gpt --- examples/search.gpt | 2 +- pkg/builtin/builtin.go | 10 ++++++++++ pkg/server/server.go | 25 +++++++++++++++++++++---- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/examples/search.gpt b/examples/search.gpt index b084f946..60dd2998 100644 --- a/examples/search.gpt +++ b/examples/search.gpt @@ -7,7 +7,7 @@ vacation spot give the name and description. name: search description: Searches the internet for content args: query: The query to search for -tools: sys.http.text? +tools: sys.http.html2text? First download the content of "https://html.duckduckgo.com/html/?q=${query}". Look for the first 5 search results. Download each search result and look for content diff --git a/pkg/builtin/builtin.go b/pkg/builtin/builtin.go index aecb2d7f..cd356117 100644 --- a/pkg/builtin/builtin.go +++ b/pkg/builtin/builtin.go @@ -82,6 +82,16 @@ var Tools = map[string]types.Tool{ }, } +func SysProgram() *types.Program { + result := &types.Program{ + ToolSet: types.ToolSet{}, + } + for _, tool := range ListTools() { + result.ToolSet[tool.ID] = tool + } + return result +} + func ListTools() (result []types.Tool) { var keys []string for k := range Tools { diff --git a/pkg/server/server.go b/pkg/server/server.go index 5c129e48..6981e244 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -15,6 +15,7 @@ import ( "time" "github.com/acorn-io/broadcaster" + "github.com/acorn-io/gptscript/pkg/builtin" "github.com/acorn-io/gptscript/pkg/loader" "github.com/acorn-io/gptscript/pkg/runner" "github.com/acorn-io/gptscript/pkg/types" @@ -85,12 +86,30 @@ var ( type execKey struct{} func (s *Server) list(rw http.ResponseWriter, req *http.Request) { + rw.Header().Set("Content-Type", "application/json") + enc := json.NewEncoder(rw) + enc.SetIndent("", " ") + path := filepath.Join(".", req.URL.Path) + if req.URL.Path == "/sys" { + _ = enc.Encode(builtin.SysProgram()) + return + } else if strings.HasSuffix(path, ".gpt") { + prg, err := loader.Program(req.Context(), path, "") + if err != nil { + http.Error(rw, err.Error(), http.StatusInternalServerError) + return + } + _ = enc.Encode(prg) + return + } + files, err := os.ReadDir(path) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } + var result []string for _, file := range files { if file.IsDir() && !strings.HasPrefix(file.Name(), ".") { @@ -100,8 +119,6 @@ func (s *Server) list(rw http.ResponseWriter, req *http.Request) { } } - enc := json.NewEncoder(rw) - enc.SetIndent("", " ") _ = enc.Encode(result) } @@ -186,7 +203,7 @@ func (s *Server) ServeHTTP(rw http.ResponseWriter, req *http.Request) { case http.MethodPost: s.run(rw, req) case http.MethodGet: - if strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { + if req.URL.Path == "/" && strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { err := s.melody.HandleRequest(rw, req) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) @@ -244,7 +261,7 @@ func (s *Session) Stop(output string, err error) { e := Event{ Event: runner.Event{ Time: time.Now(), - Type: "runEnd", + Type: "runFinish", }, RunID: s.id, Input: s.input,