Skip to content

Commit 6126d27

Browse files
Set working directory of tool calls to the directory of the file
1 parent 701b9c8 commit 6126d27

File tree

23 files changed

+518
-91
lines changed

23 files changed

+518
-91
lines changed

pkg/cli/gptscript.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type GPTScript struct {
3737
OpenAIOptions
3838
DisplayOptions
3939
Debug bool `usage:"Enable debug logging"`
40-
Quiet *bool `usage:"No output logging" short:"q"`
40+
Quiet *bool `usage:"No output logging (set --quiet=false to force on even when there is no TTY)" short:"q"`
4141
Output string `usage:"Save output to a file, or - for stdout" short:"o"`
4242
Input string `usage:"Read input from a file (\"-\" for stdin)" short:"f"`
4343
SubTool string `usage:"Use tool of this name, not the first tool in file"`

pkg/engine/cmd.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ func (e *Engine) runCommand(ctx context.Context, tool types.Tool, input string)
5959
cmd.Stdin = strings.NewReader(input)
6060
cmd.Stderr = io.MultiWriter(all, os.Stderr)
6161
cmd.Stdout = io.MultiWriter(all, output)
62+
if tool.WorkingDir != "" {
63+
cmd.Dir = tool.WorkingDir
64+
}
6265

6366
if err := cmd.Run(); err != nil {
6467
_, _ = os.Stderr.Write(output.Bytes())

pkg/engine/engine.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,7 @@ func (e *Engine) complete(ctx context.Context, state *State) (*Return, error) {
230230
ToolName: content.ToolCall.Function.Name,
231231
Input: content.ToolCall.Function.Arguments,
232232
}
233-
}
234-
if content.Text != "" {
233+
} else {
235234
cp := content.Text
236235
ret.Result = &cp
237236
}

pkg/engine/http.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io"
88
"net/http"
99
"net/url"
10+
"os"
1011
"strings"
1112

1213
"github.com/gptscript-ai/gptscript/pkg/types"
@@ -15,7 +16,19 @@ import (
1516
const DaemonURLSuffix = ".daemon.gpt.local"
1617

1718
func (e *Engine) runHTTP(ctx context.Context, prg *types.Program, tool types.Tool, input string) (cmdRet *Return, cmdErr error) {
19+
envMap := map[string]string{}
20+
for _, env := range e.Env {
21+
v, ok := strings.CutPrefix(env, "GPTSCRIPT_VAR_")
22+
if ok {
23+
k, v, _ := strings.Cut(v, "=")
24+
envMap[k] = v
25+
}
26+
}
27+
1828
toolURL := strings.Split(tool.Instructions, "\n")[0][2:]
29+
toolURL = os.Expand(toolURL, func(s string) string {
30+
return envMap[s]
31+
})
1932

2033
parsed, err := url.Parse(toolURL)
2134
if err != nil {
@@ -51,6 +64,10 @@ func (e *Engine) runHTTP(ctx context.Context, prg *types.Program, tool types.Too
5164

5265
req.Header.Set("X-GPTScript-Tool-Name", tool.Parameters.Name)
5366

67+
for k, v := range envMap {
68+
req.Header.Set("X-GPTScript-Var-"+k, v)
69+
}
70+
5471
if err := json.Unmarshal([]byte(input), &map[string]any{}); err == nil {
5572
req.Header.Set("Content-Type", "application/json")
5673
} else {

pkg/loader/loader.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ func readTool(ctx context.Context, prg *types.Program, base *source, targetToolN
200200
)
201201

202202
for i, tool := range tools {
203+
tool.WorkingDir = base.Path
203204
tool.Source.File = base.File
204205

205206
// Probably a better way to come up with an ID
@@ -234,7 +235,13 @@ var (
234235
invalidChars = regexp.MustCompile("[^a-zA-Z0-9_-]+")
235236
)
236237

237-
func toolNormalizer(tool string) string {
238+
func ToolNormalizer(tool string) string {
239+
parts := strings.Split(tool, "/")
240+
tool = parts[len(parts)-1]
241+
if strings.HasSuffix(tool, ".gpt") {
242+
tool = strings.TrimSuffix(tool, filepath.Ext(tool))
243+
}
244+
238245
if validToolName.MatchString(tool) {
239246
return tool
240247
}
@@ -251,22 +258,17 @@ func toolNormalizer(tool string) string {
251258
}
252259

253260
func pickToolName(toolName string, existing map[string]struct{}) string {
254-
newName, suffix, ok := strings.Cut(toolName, "/")
255-
if ok {
256-
newName = suffix
257-
}
258-
newName = strings.TrimSuffix(newName, filepath.Ext(newName))
259-
if newName == "" {
260-
newName = "external"
261+
if toolName == "" {
262+
toolName = "external"
261263
}
262264

263265
for {
264-
testName := toolNormalizer(newName)
266+
testName := ToolNormalizer(toolName)
265267
if _, ok := existing[testName]; !ok {
266268
existing[testName] = struct{}{}
267269
return testName
268270
}
269-
newName += "0"
271+
toolName += "0"
270272
}
271273
}
272274

pkg/mvl/log.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ func Package() Logger {
4848
_, p, _, _ := runtime.Caller(1)
4949
_, suffix, _ := strings.Cut(p, "gptscript/")
5050
i := strings.LastIndex(suffix, "/")
51-
return New(suffix[:i])
51+
if i > 0 {
52+
return New(suffix[:i])
53+
}
54+
return New(p)
5255
}
5356

5457
func New(name string) Logger {

pkg/runner/log.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package runner
2+
3+
import "github.com/gptscript-ai/gptscript/pkg/mvl"
4+
5+
var log = mvl.Package()

pkg/runner/runner.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package runner
22

33
import (
44
"context"
5+
"os"
56
"sync"
67
"time"
78

@@ -20,30 +21,41 @@ type Monitor interface {
2021
}
2122

2223
type Options struct {
24+
WorkingDir string
2325
MonitorFactory MonitorFactory `usage:"-"`
2426
}
2527

2628
func complete(opts ...Options) (result Options) {
2729
for _, opt := range opts {
30+
result.WorkingDir = types.FirstSet(opt.WorkingDir, result.WorkingDir)
2831
result.MonitorFactory = types.FirstSet(opt.MonitorFactory, result.MonitorFactory)
2932
}
3033
if result.MonitorFactory == nil {
3134
result.MonitorFactory = noopFactory{}
3235
}
36+
if result.WorkingDir == "" {
37+
var err error
38+
result.WorkingDir, err = os.Getwd()
39+
if err != nil {
40+
log.Fatalf("failed to determine current working directory: %v", err)
41+
}
42+
}
3343
return
3444
}
3545

3646
type Runner struct {
37-
c engine.Model
38-
factory MonitorFactory
47+
c engine.Model
48+
factory MonitorFactory
49+
workingDir string
3950
}
4051

4152
func New(client engine.Model, opts ...Options) (*Runner, error) {
4253
opt := complete(opts...)
4354

4455
return &Runner{
45-
c: client,
46-
factory: opt.MonitorFactory,
56+
c: client,
57+
factory: opt.MonitorFactory,
58+
workingDir: opt.WorkingDir,
4759
}, nil
4860
}
4961

@@ -94,6 +106,10 @@ func (r *Runner) call(callCtx engine.Context, monitor Monitor, env []string, inp
94106
Env: env,
95107
}
96108

109+
if r.workingDir != "" {
110+
e.Env = append(e.Env, "GPTSCRIPT_VAR_WORKDIR="+r.workingDir)
111+
}
112+
97113
monitor.Event(Event{
98114
Time: time.Now(),
99115
CallContext: &callCtx,

pkg/test/examples_test.go

Lines changed: 0 additions & 70 deletions
This file was deleted.

pkg/test/testdata/TestEcho.golden

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)