Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7bcfedb

Browse files
committedJun 4, 2024··
fix: allow retry of failed runs
1 parent 0c8c0f1 commit 7bcfedb

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed
 

Diff for: ‎src/gptscript.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface RunOpts {
1313
chatState?: string
1414
confirm?: boolean
1515
prompt?: boolean
16+
env?: string[]
1617
}
1718

1819
export enum RunEventType {
@@ -238,25 +239,25 @@ export class Run {
238239
}
239240

240241
nextChat(input: string = ""): Run {
241-
if (this.state === RunState.Finished || this.state === RunState.Error) {
242-
throw (new Error("Run already finished"))
242+
if (this.state !== RunState.Continue && this.state !== RunState.Creating && this.state !== RunState.Error) {
243+
throw (new Error(`Run must in creating, continue or error state, not ${this.state}`))
243244
}
244245

245246
let run = this
246247
if (run.state !== RunState.Creating) {
247248
run = new (this.constructor as any)(this.requestPath, this.filePath, this.content, this.opts, this.gptscriptURL)
248249
}
249250

250-
if (this.chatState) {
251-
run.chatState = this.chatState
252-
} else if (this.opts.chatState) {
253-
run.chatState = this.opts.chatState
251+
if (this.chatState && this.state === RunState.Continue) {
252+
// Only update the chat state if the previous run didn't error.
253+
// The chat state on opts will be the chat state for the last successful run.
254+
this.opts.chatState = this.chatState
254255
}
255256
run.opts.input = input
256257
if (run.content !== "") {
257-
run.request({content: this.content, chatState: run.chatState})
258+
run.request({content: this.content, ...this.opts})
258259
} else {
259-
run.request({file: this.filePath, chatState: run.chatState})
260+
run.request({file: this.filePath, ...this.opts})
260261
}
261262

262263
return run

Diff for: ‎tests/gptscript.test.ts

+30
Original file line numberDiff line numberDiff line change
@@ -470,4 +470,34 @@ describe("gptscript module", () => {
470470
expect(run.err).toContain("prompt occurred")
471471
expect(promptFound).toBeFalsy()
472472
})
473+
474+
test("retry failed run", async () => {
475+
let shebang = `#!/bin/bash\nexit \${EXIT_CODE}`
476+
if (process.platform == "win32") {
477+
shebang = "#!/usr/bin/env powershell.exe\n Exit \$env:EXIT_CODE"
478+
}
479+
const t = {
480+
instructions: "say hello",
481+
context: ["my-context"]
482+
} as gptscript.ToolDef
483+
const contextTool = {
484+
name: "my-context",
485+
instructions: `${shebang}\nexit \${EXIT_CODE}`
486+
} as gptscript.ToolDef
487+
488+
let run = await client.evaluate([t, contextTool], {disableCache: true, env: ["EXIT_CODE=1"]})
489+
try {
490+
await run.text()
491+
} catch {
492+
}
493+
494+
expect(run.err).not.toEqual("")
495+
496+
run.opts.env = ["EXIT_CODE=0"]
497+
run = run.nextChat()
498+
499+
await run.text()
500+
501+
expect(run.err).toEqual("")
502+
})
473503
})

0 commit comments

Comments
 (0)
Please sign in to comment.