Skip to content

Commit 2e26a10

Browse files
bug: fix dataset leaking workspace directories
1 parent 1c2d1de commit 2e26a10

File tree

6 files changed

+47
-5
lines changed

6 files changed

+47
-5
lines changed

pkg/engine/http.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import (
55
"encoding/json"
66
"fmt"
77
"io"
8+
"maps"
89
"net/http"
910
"net/url"
1011
"os"
12+
"slices"
1113
"strings"
1214

1315
"github.com/gptscript-ai/gptscript/pkg/types"
@@ -75,9 +77,9 @@ func (e *Engine) runHTTP(ctx context.Context, prg *types.Program, tool types.Too
7577
return nil, err
7678
}
7779

78-
for _, env := range e.Env {
79-
if strings.HasPrefix(env, "GPTSCRIPT_WORKSPACE_") {
80-
req.Header.Add("X-GPTScript-Env", env)
80+
for _, k := range slices.Sorted(maps.Keys(envMap)) {
81+
if strings.HasPrefix(k, "GPTSCRIPT_WORKSPACE_") {
82+
req.Header.Add("X-GPTScript-Env", k+"="+envMap[k])
8183
}
8284
}
8385

pkg/loader/loader.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,18 @@ import (
2929

3030
const CacheTimeout = time.Hour
3131

32+
var Remap = map[string]string{}
33+
34+
func init() {
35+
remap := os.Getenv("GPTSCRIPT_TOOL_REMAP")
36+
for _, pair := range strings.Split(remap, ",") {
37+
k, v, ok := strings.Cut(pair, "=")
38+
if ok {
39+
Remap[k] = v
40+
}
41+
}
42+
}
43+
3244
type source struct {
3345
// Content The content of the source
3446
Content []byte
@@ -68,8 +80,19 @@ func openFile(path string) (io.ReadCloser, bool, error) {
6880
}
6981

7082
func loadLocal(base *source, name string) (*source, bool, error) {
83+
var remapped bool
84+
if !strings.HasPrefix(name, ".") {
85+
for k, v := range Remap {
86+
if strings.HasPrefix(name, k) {
87+
name = v + name[len(k):]
88+
remapped = true
89+
break
90+
}
91+
}
92+
}
93+
7194
filePath := name
72-
if !filepath.IsAbs(name) {
95+
if !remapped && !filepath.IsAbs(name) {
7396
// We want to keep all strings in / format, and only convert to platform specific when reading
7497
// This is why we use path instead of filepath.
7598
filePath = path.Join(base.Path, name)

pkg/openai/client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ func (c *Client) call(ctx context.Context, request openai.ChatCompletionRequest,
617617
}
618618
partialMessage = appendMessage(partialMessage, response)
619619
if partial != nil {
620-
if time.Since(start) > 500*time.Millisecond {
620+
if time.Since(start) > 100*time.Millisecond {
621621
last = last[:0]
622622
partial <- types.CompletionStatus{
623623
CompletionID: transactionID,

pkg/runner/input.go

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ func (r *Runner) handleInput(callCtx engine.Context, monitor Monitor, env []stri
1515
}
1616

1717
for _, inputToolRef := range inputToolRefs {
18+
if callCtx.Program.ToolSet[inputToolRef.ToolID].IsNoop() {
19+
continue
20+
}
1821
data := map[string]any{}
1922
_ = json.Unmarshal([]byte(input), &data)
2023
data["input"] = input

pkg/runner/output.go

+3
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ func (r *Runner) handleOutput(callCtx engine.Context, monitor Monitor, env []str
7676
}
7777

7878
for _, outputToolRef := range outputToolRefs {
79+
if callCtx.Program.ToolSet[outputToolRef.ToolID].IsNoop() {
80+
continue
81+
}
7982
inputData, err := argsForFilters(callCtx.Program, outputToolRef, startState, map[string]any{
8083
"output": output,
8184
"continuation": continuation,

pkg/sdkserver/datasets.go

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"fmt"
66
"net/http"
7+
"strings"
78

89
gcontext "github.com/gptscript-ai/gptscript/pkg/context"
910
"github.com/gptscript-ai/gptscript/pkg/gptscript"
@@ -39,6 +40,12 @@ func (r datasetRequest) opts(o gptscript.Options) gptscript.Options {
3940
Monitor: o.Monitor,
4041
Runner: o.Runner,
4142
}
43+
for _, e := range r.Env {
44+
v, ok := strings.CutPrefix(e, "GPTSCRIPT_WORKSPACE_ID=")
45+
if ok {
46+
opts.Workspace = v
47+
}
48+
}
4249
return opts
4350
}
4451

@@ -61,6 +68,7 @@ func (s *server) listDatasets(w http.ResponseWriter, r *http.Request) {
6168
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to initialize gptscript: %w", err))
6269
return
6370
}
71+
defer g.Close(false)
6472

6573
prg, err := loader.Program(r.Context(), s.getDatasetTool(req), "List Datasets", loader.Options{
6674
Cache: g.Cache,
@@ -118,6 +126,7 @@ func (s *server) addDatasetElements(w http.ResponseWriter, r *http.Request) {
118126
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to initialize gptscript: %w", err))
119127
return
120128
}
129+
defer g.Close(false)
121130

122131
var args addDatasetElementsArgs
123132
if err := json.Unmarshal([]byte(req.Input), &args); err != nil {
@@ -177,6 +186,7 @@ func (s *server) listDatasetElements(w http.ResponseWriter, r *http.Request) {
177186
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to initialize gptscript: %w", err))
178187
return
179188
}
189+
defer g.Close(false)
180190

181191
var args listDatasetElementsArgs
182192
if err := json.Unmarshal([]byte(req.Input), &args); err != nil {
@@ -239,6 +249,7 @@ func (s *server) getDatasetElement(w http.ResponseWriter, r *http.Request) {
239249
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to initialize gptscript: %w", err))
240250
return
241251
}
252+
defer g.Close(false)
242253

243254
var args getDatasetElementArgs
244255
if err := json.Unmarshal([]byte(req.Input), &args); err != nil {

0 commit comments

Comments
 (0)