Skip to content

Commit 423f398

Browse files
authored
Merge pull request #57 from thedadams/list-models-from-providers
feat: add ability to list models from providers
2 parents a398de6 + 4f05179 commit 423f398

File tree

2 files changed

+90
-13
lines changed

2 files changed

+90
-13
lines changed

gptscript.go

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ var (
2828
const relativeToBinaryPath = "<me>"
2929

3030
type GPTScript struct {
31-
url string
32-
globalEnv []string
31+
url string
32+
globalOpts GlobalOptions
3333
}
3434

3535
func NewGPTScript(opts ...GlobalOptions) (*GPTScript, error) {
@@ -40,7 +40,7 @@ func NewGPTScript(opts ...GlobalOptions) (*GPTScript, error) {
4040

4141
disableServer := os.Getenv("GPTSCRIPT_DISABLE_SERVER") == "true"
4242

43-
if serverURL == "" && disableServer {
43+
if serverURL == "" {
4444
serverURL = os.Getenv("GPTSCRIPT_URL")
4545
}
4646

@@ -96,11 +96,8 @@ func NewGPTScript(opts ...GlobalOptions) (*GPTScript, error) {
9696
serverURL = strings.TrimSpace(serverURL)
9797
}
9898
g := &GPTScript{
99-
url: "http://" + serverURL,
100-
}
101-
102-
if disableServer {
103-
g.globalEnv = opt.Env[:]
99+
url: "http://" + serverURL,
100+
globalOpts: opt,
104101
}
105102

106103
return g, nil
@@ -132,7 +129,7 @@ func (g *GPTScript) Close() {
132129
}
133130

134131
func (g *GPTScript) Evaluate(ctx context.Context, opts Options, tools ...ToolDef) (*Run, error) {
135-
opts.Env = append(g.globalEnv, opts.Env...)
132+
opts.GlobalOptions = completeGlobalOptions(g.globalOpts, opts.GlobalOptions)
136133
return (&Run{
137134
url: g.url,
138135
requestPath: "evaluate",
@@ -143,7 +140,7 @@ func (g *GPTScript) Evaluate(ctx context.Context, opts Options, tools ...ToolDef
143140
}
144141

145142
func (g *GPTScript) Run(ctx context.Context, toolPath string, opts Options) (*Run, error) {
146-
opts.Env = append(g.globalEnv, opts.Env...)
143+
opts.GlobalOptions = completeGlobalOptions(g.globalOpts, opts.GlobalOptions)
147144
return (&Run{
148145
url: g.url,
149146
requestPath: "run",
@@ -281,9 +278,28 @@ func (g *GPTScript) ListTools(ctx context.Context) (string, error) {
281278
return out, nil
282279
}
283280

281+
type ListModelsOptions struct {
282+
Providers []string
283+
CredentialOverrides []string
284+
}
285+
284286
// ListModels will list all the available models.
285-
func (g *GPTScript) ListModels(ctx context.Context) ([]string, error) {
286-
out, err := g.runBasicCommand(ctx, "list-models", nil)
287+
func (g *GPTScript) ListModels(ctx context.Context, opts ...ListModelsOptions) ([]string, error) {
288+
var o ListModelsOptions
289+
for _, opt := range opts {
290+
o.Providers = append(o.Providers, opt.Providers...)
291+
o.CredentialOverrides = append(o.CredentialOverrides, opt.CredentialOverrides...)
292+
}
293+
294+
if g.globalOpts.DefaultModelProvider != "" {
295+
o.Providers = append(o.Providers, g.globalOpts.DefaultModelProvider)
296+
}
297+
298+
out, err := g.runBasicCommand(ctx, "list-models", map[string]any{
299+
"providers": o.Providers,
300+
"env": g.globalOpts.Env,
301+
"credentialOverrides": o.CredentialOverrides,
302+
})
287303
if err != nil {
288304
return nil, err
289305
}

gptscript_test.go

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,22 @@ func TestMain(m *testing.M) {
1919
panic("OPENAI_API_KEY or GPTSCRIPT_URL environment variable must be set")
2020
}
2121

22-
var err error
22+
// Start an initial GPTScript instance.
23+
// This one doesn't have any options, but it's there to ensure that using another instance works as expected in all cases.
24+
gFirst, err := NewGPTScript(GlobalOptions{})
25+
if err != nil {
26+
panic(fmt.Sprintf("error creating gptscript: %s", err))
27+
}
28+
2329
g, err = NewGPTScript(GlobalOptions{OpenAIAPIKey: os.Getenv("OPENAI_API_KEY")})
2430
if err != nil {
31+
gFirst.Close()
2532
panic(fmt.Sprintf("error creating gptscript: %s", err))
2633
}
2734

2835
exitCode := m.Run()
2936
g.Close()
37+
gFirst.Close()
3038
os.Exit(exitCode)
3139
}
3240

@@ -80,6 +88,59 @@ func TestListModels(t *testing.T) {
8088
}
8189
}
8290

91+
func TestListModelsWithProvider(t *testing.T) {
92+
if os.Getenv("ANTHROPIC_API_KEY") == "" {
93+
t.Skip("ANTHROPIC_API_KEY not set")
94+
}
95+
models, err := g.ListModels(context.Background(), ListModelsOptions{
96+
Providers: []string{"github.com/gptscript-ai/claude3-anthropic-provider"},
97+
CredentialOverrides: []string{"github.com/gptscript-ai/claude3-anthropic-provider/credential:ANTHROPIC_API_KEY"},
98+
})
99+
if err != nil {
100+
t.Errorf("Error listing models: %v", err)
101+
}
102+
103+
if len(models) == 0 {
104+
t.Error("No models found")
105+
}
106+
107+
for _, model := range models {
108+
if !strings.HasPrefix(model, "claude-3-") || !strings.HasSuffix(model, "from github.com/gptscript-ai/claude3-anthropic-provider") {
109+
t.Errorf("Unexpected model name: %s", model)
110+
}
111+
}
112+
}
113+
114+
func TestListModelsWithDefaultProvider(t *testing.T) {
115+
if os.Getenv("ANTHROPIC_API_KEY") == "" {
116+
t.Skip("ANTHROPIC_API_KEY not set")
117+
}
118+
g, err := NewGPTScript(GlobalOptions{
119+
DefaultModelProvider: "github.com/gptscript-ai/claude3-anthropic-provider",
120+
})
121+
if err != nil {
122+
t.Fatalf("Error creating gptscript: %v", err)
123+
}
124+
defer g.Close()
125+
126+
models, err := g.ListModels(context.Background(), ListModelsOptions{
127+
CredentialOverrides: []string{"github.com/gptscript-ai/claude3-anthropic-provider/credential:ANTHROPIC_API_KEY"},
128+
})
129+
if err != nil {
130+
t.Errorf("Error listing models: %v", err)
131+
}
132+
133+
if len(models) == 0 {
134+
t.Error("No models found")
135+
}
136+
137+
for _, model := range models {
138+
if !strings.HasPrefix(model, "claude-3-") || !strings.HasSuffix(model, "from github.com/gptscript-ai/claude3-anthropic-provider") {
139+
t.Errorf("Unexpected model name: %s", model)
140+
}
141+
}
142+
}
143+
83144
func TestAbortRun(t *testing.T) {
84145
tool := ToolDef{Instructions: "What is the capital of the united states?"}
85146

0 commit comments

Comments
 (0)