From c8c2d47b9b17467c5fb4a97638703b5e1666045f Mon Sep 17 00:00:00 2001
From: Grant Linville <grant@acorn.io>
Date: Mon, 4 Nov 2024 15:35:38 -0500
Subject: [PATCH 1/8] chore: update for dataset rewrite

Signed-off-by: Grant Linville <grant@acorn.io>
---
 datasets.go      | 184 ++++++++++++-----------------------------------
 datasets_test.go |  69 ++++++++++--------
 opts.go          |   4 +-
 3 files changed, 88 insertions(+), 169 deletions(-)

diff --git a/datasets.go b/datasets.go
index 0b39edc..0a4a1c0 100644
--- a/datasets.go
+++ b/datasets.go
@@ -2,7 +2,6 @@ package gptscript
 
 import (
 	"context"
-	"encoding/base64"
 	"encoding/json"
 	"fmt"
 	"os"
@@ -15,170 +14,82 @@ type DatasetElementMeta struct {
 
 type DatasetElement struct {
 	DatasetElementMeta `json:",inline"`
-	Contents           []byte `json:"contents"`
-}
-
-type DatasetMeta struct {
-	ID          string `json:"id"`
-	Name        string `json:"name"`
-	Description string `json:"description"`
+	Contents           string `json:"contents"`
+	BinaryContents     []byte `json:"binaryContents"`
 }
 
 type Dataset struct {
-	DatasetMeta `json:",inline"`
-	BaseDir     string                        `json:"baseDir,omitempty"`
-	Elements    map[string]DatasetElementMeta `json:"elements"`
+	ID       string                        `json:"id"`
+	BaseDir  string                        `json:"baseDir,omitempty"`
+	Elements map[string]DatasetElementMeta `json:"elements"`
 }
 
 type datasetRequest struct {
-	Input           string   `json:"input"`
-	WorkspaceID     string   `json:"workspaceID"`
-	DatasetToolRepo string   `json:"datasetToolRepo"`
-	Env             []string `json:"env"`
-}
-
-type createDatasetArgs struct {
-	Name        string `json:"datasetName"`
-	Description string `json:"datasetDescription"`
-}
-
-type addDatasetElementArgs struct {
-	DatasetID          string `json:"datasetID"`
-	ElementName        string `json:"elementName"`
-	ElementDescription string `json:"elementDescription"`
-	ElementContent     string `json:"elementContent"`
+	Input       string   `json:"input"`
+	DatasetTool string   `json:"datasetTool"`
+	Env         []string `json:"env"`
 }
 
 type addDatasetElementsArgs struct {
-	DatasetID string           `json:"datasetID"`
-	Elements  []DatasetElement `json:"elements"`
+	WorkspaceID string           `json:"workspaceID"`
+	DatasetID   string           `json:"datasetID"`
+	Elements    []DatasetElement `json:"elements"`
 }
 
 type listDatasetElementArgs struct {
-	DatasetID string `json:"datasetID"`
+	WorkspaceID string `json:"workspaceID"`
+	DatasetID   string `json:"datasetID"`
 }
 
 type getDatasetElementArgs struct {
-	DatasetID string `json:"datasetID"`
-	Element   string `json:"element"`
+	WorkspaceID string `json:"workspaceID"`
+	DatasetID   string `json:"datasetID"`
+	Element     string `json:"name"`
 }
 
-func (g *GPTScript) ListDatasets(ctx context.Context, workspaceID string) ([]DatasetMeta, error) {
-	if workspaceID == "" {
-		workspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID")
-	}
-
+func (g *GPTScript) ListDatasets(ctx context.Context) ([]string, error) {
 	out, err := g.runBasicCommand(ctx, "datasets", datasetRequest{
-		Input:           "{}",
-		WorkspaceID:     workspaceID,
-		DatasetToolRepo: g.globalOpts.DatasetToolRepo,
-		Env:             g.globalOpts.Env,
+		Input:       fmt.Sprintf(`{"workspaceID": %q}`, os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
+		DatasetTool: g.globalOpts.DatasetTool,
+		Env:         g.globalOpts.Env,
 	})
 	if err != nil {
 		return nil, err
 	}
 
-	var datasets []DatasetMeta
+	var datasets []string
 	if err = json.Unmarshal([]byte(out), &datasets); err != nil {
 		return nil, err
 	}
 	return datasets, nil
 }
 
-func (g *GPTScript) CreateDataset(ctx context.Context, workspaceID, name, description string) (Dataset, error) {
-	if workspaceID == "" {
-		workspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID")
-	}
-
-	args := createDatasetArgs{
-		Name:        name,
-		Description: description,
-	}
-	argsJSON, err := json.Marshal(args)
-	if err != nil {
-		return Dataset{}, fmt.Errorf("failed to marshal dataset args: %w", err)
-	}
-
-	out, err := g.runBasicCommand(ctx, "datasets/create", datasetRequest{
-		Input:           string(argsJSON),
-		WorkspaceID:     workspaceID,
-		DatasetToolRepo: g.globalOpts.DatasetToolRepo,
-		Env:             g.globalOpts.Env,
-	})
-	if err != nil {
-		return Dataset{}, err
-	}
-
-	var dataset Dataset
-	if err = json.Unmarshal([]byte(out), &dataset); err != nil {
-		return Dataset{}, err
-	}
-	return dataset, nil
-}
-
-func (g *GPTScript) AddDatasetElement(ctx context.Context, workspaceID, datasetID, elementName, elementDescription string, elementContent []byte) (DatasetElementMeta, error) {
-	if workspaceID == "" {
-		workspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID")
-	}
-
-	args := addDatasetElementArgs{
-		DatasetID:          datasetID,
-		ElementName:        elementName,
-		ElementDescription: elementDescription,
-		ElementContent:     base64.StdEncoding.EncodeToString(elementContent),
-	}
-	argsJSON, err := json.Marshal(args)
-	if err != nil {
-		return DatasetElementMeta{}, fmt.Errorf("failed to marshal element args: %w", err)
-	}
-
-	out, err := g.runBasicCommand(ctx, "datasets/add-element", datasetRequest{
-		Input:           string(argsJSON),
-		WorkspaceID:     workspaceID,
-		DatasetToolRepo: g.globalOpts.DatasetToolRepo,
-		Env:             g.globalOpts.Env,
-	})
-	if err != nil {
-		return DatasetElementMeta{}, err
-	}
-
-	var element DatasetElementMeta
-	if err = json.Unmarshal([]byte(out), &element); err != nil {
-		return DatasetElementMeta{}, err
-	}
-	return element, nil
+func (g *GPTScript) CreateDatasetWithElements(ctx context.Context, elements []DatasetElement) (string, error) {
+	return g.AddDatasetElements(ctx, "", elements)
 }
 
-func (g *GPTScript) AddDatasetElements(ctx context.Context, workspaceID, datasetID string, elements []DatasetElement) error {
-	if workspaceID == "" {
-		workspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID")
-	}
-
+func (g *GPTScript) AddDatasetElements(ctx context.Context, datasetID string, elements []DatasetElement) (string, error) {
 	args := addDatasetElementsArgs{
-		DatasetID: datasetID,
-		Elements:  elements,
+		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
+		DatasetID:   datasetID,
+		Elements:    elements,
 	}
 	argsJSON, err := json.Marshal(args)
 	if err != nil {
-		return fmt.Errorf("failed to marshal element args: %w", err)
+		return "", fmt.Errorf("failed to marshal element args: %w", err)
 	}
 
-	_, err = g.runBasicCommand(ctx, "datasets/add-elements", datasetRequest{
-		Input:           string(argsJSON),
-		WorkspaceID:     workspaceID,
-		DatasetToolRepo: g.globalOpts.DatasetToolRepo,
-		Env:             g.globalOpts.Env,
+	return g.runBasicCommand(ctx, "datasets/add-elements", datasetRequest{
+		Input:       string(argsJSON),
+		DatasetTool: g.globalOpts.DatasetTool,
+		Env:         g.globalOpts.Env,
 	})
-	return err
 }
 
-func (g *GPTScript) ListDatasetElements(ctx context.Context, workspaceID, datasetID string) ([]DatasetElementMeta, error) {
-	if workspaceID == "" {
-		workspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID")
-	}
-
+func (g *GPTScript) ListDatasetElements(ctx context.Context, datasetID string) ([]DatasetElementMeta, error) {
 	args := listDatasetElementArgs{
-		DatasetID: datasetID,
+		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
+		DatasetID:   datasetID,
 	}
 	argsJSON, err := json.Marshal(args)
 	if err != nil {
@@ -186,10 +97,9 @@ func (g *GPTScript) ListDatasetElements(ctx context.Context, workspaceID, datase
 	}
 
 	out, err := g.runBasicCommand(ctx, "datasets/list-elements", datasetRequest{
-		Input:           string(argsJSON),
-		WorkspaceID:     workspaceID,
-		DatasetToolRepo: g.globalOpts.DatasetToolRepo,
-		Env:             g.globalOpts.Env,
+		Input:       string(argsJSON),
+		DatasetTool: g.globalOpts.DatasetTool,
+		Env:         g.globalOpts.Env,
 	})
 	if err != nil {
 		return nil, err
@@ -202,14 +112,11 @@ func (g *GPTScript) ListDatasetElements(ctx context.Context, workspaceID, datase
 	return elements, nil
 }
 
-func (g *GPTScript) GetDatasetElement(ctx context.Context, workspaceID, datasetID, elementName string) (DatasetElement, error) {
-	if workspaceID == "" {
-		workspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID")
-	}
-
+func (g *GPTScript) GetDatasetElement(ctx context.Context, datasetID, elementName string) (DatasetElement, error) {
 	args := getDatasetElementArgs{
-		DatasetID: datasetID,
-		Element:   elementName,
+		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
+		DatasetID:   datasetID,
+		Element:     elementName,
 	}
 	argsJSON, err := json.Marshal(args)
 	if err != nil {
@@ -217,10 +124,9 @@ func (g *GPTScript) GetDatasetElement(ctx context.Context, workspaceID, datasetI
 	}
 
 	out, err := g.runBasicCommand(ctx, "datasets/get-element", datasetRequest{
-		Input:           string(argsJSON),
-		WorkspaceID:     workspaceID,
-		DatasetToolRepo: g.globalOpts.DatasetToolRepo,
-		Env:             g.globalOpts.Env,
+		Input:       string(argsJSON),
+		DatasetTool: g.globalOpts.DatasetTool,
+		Env:         g.globalOpts.Env,
 	})
 	if err != nil {
 		return DatasetElement{}, err
diff --git a/datasets_test.go b/datasets_test.go
index 6fc7ed9..8ece66a 100644
--- a/datasets_test.go
+++ b/datasets_test.go
@@ -2,6 +2,7 @@ package gptscript
 
 import (
 	"context"
+	"os"
 	"testing"
 
 	"github.com/stretchr/testify/require"
@@ -11,66 +12,78 @@ func TestDatasets(t *testing.T) {
 	workspaceID, err := g.CreateWorkspace(context.Background(), "directory")
 	require.NoError(t, err)
 
+	require.NoError(t, os.Setenv("GPTSCRIPT_WORKSPACE_ID", workspaceID))
+
 	defer func() {
 		_ = g.DeleteWorkspace(context.Background(), workspaceID)
 	}()
 
-	// Create a dataset
-	dataset, err := g.CreateDataset(context.Background(), workspaceID, "test-dataset", "This is a test dataset")
-	require.NoError(t, err)
-	require.Equal(t, "test-dataset", dataset.Name)
-	require.Equal(t, "This is a test dataset", dataset.Description)
-	require.Equal(t, 0, len(dataset.Elements))
-
-	// Add an element
-	elementMeta, err := g.AddDatasetElement(context.Background(), workspaceID, dataset.ID, "test-element", "This is a test element", []byte("This is the content"))
+	datasetID, err := g.CreateDatasetWithElements(context.Background(), []DatasetElement{
+		{
+			DatasetElementMeta: DatasetElementMeta{
+				Name:        "test-element-1",
+				Description: "This is a test element 1",
+			},
+			Contents: "This is the content 1",
+		},
+	})
 	require.NoError(t, err)
-	require.Equal(t, "test-element", elementMeta.Name)
-	require.Equal(t, "This is a test element", elementMeta.Description)
 
-	// Add two more
-	err = g.AddDatasetElements(context.Background(), workspaceID, dataset.ID, []DatasetElement{
+	// Add two more elements
+	_, err = g.AddDatasetElements(context.Background(), datasetID, []DatasetElement{
 		{
 			DatasetElementMeta: DatasetElementMeta{
 				Name:        "test-element-2",
 				Description: "This is a test element 2",
 			},
-			Contents: []byte("This is the content 2"),
+			Contents: "This is the content 2",
 		},
 		{
 			DatasetElementMeta: DatasetElementMeta{
 				Name:        "test-element-3",
 				Description: "This is a test element 3",
 			},
-			Contents: []byte("This is the content 3"),
+			Contents: "This is the content 3",
+		},
+		{
+			DatasetElementMeta: DatasetElementMeta{
+				Name:        "binary-element",
+				Description: "this element has binary contents",
+			},
+			BinaryContents: []byte("binary contents"),
 		},
 	})
 	require.NoError(t, err)
 
 	// Get the first element
-	element, err := g.GetDatasetElement(context.Background(), workspaceID, dataset.ID, "test-element")
+	element, err := g.GetDatasetElement(context.Background(), datasetID, "test-element-1")
 	require.NoError(t, err)
-	require.Equal(t, "test-element", element.Name)
-	require.Equal(t, "This is a test element", element.Description)
-	require.Equal(t, []byte("This is the content"), element.Contents)
+	require.Equal(t, "test-element-1", element.Name)
+	require.Equal(t, "This is a test element 1", element.Description)
+	require.Equal(t, "This is the content 1", element.Contents)
 
 	// Get the third element
-	element, err = g.GetDatasetElement(context.Background(), workspaceID, dataset.ID, "test-element-3")
+	element, err = g.GetDatasetElement(context.Background(), datasetID, "test-element-3")
 	require.NoError(t, err)
 	require.Equal(t, "test-element-3", element.Name)
 	require.Equal(t, "This is a test element 3", element.Description)
-	require.Equal(t, []byte("This is the content 3"), element.Contents)
+	require.Equal(t, "This is the content 3", element.Contents)
+
+	// Get the binary element
+	element, err = g.GetDatasetElement(context.Background(), datasetID, "binary-element")
+	require.NoError(t, err)
+	require.Equal(t, "binary-element", element.Name)
+	require.Equal(t, "this element has binary contents", element.Description)
+	require.Equal(t, []byte("binary contents"), element.BinaryContents)
 
 	// List elements in the dataset
-	elements, err := g.ListDatasetElements(context.Background(), workspaceID, dataset.ID)
+	elements, err := g.ListDatasetElements(context.Background(), datasetID)
 	require.NoError(t, err)
-	require.Equal(t, 3, len(elements))
+	require.Equal(t, 4, len(elements))
 
 	// List datasets
-	datasets, err := g.ListDatasets(context.Background(), workspaceID)
+	datasetIDs, err := g.ListDatasets(context.Background())
 	require.NoError(t, err)
-	require.Equal(t, 1, len(datasets))
-	require.Equal(t, "test-dataset", datasets[0].Name)
-	require.Equal(t, "This is a test dataset", datasets[0].Description)
-	require.Equal(t, dataset.ID, datasets[0].ID)
+	require.Equal(t, 1, len(datasetIDs))
+	require.Equal(t, datasetID, datasetIDs[0])
 }
diff --git a/opts.go b/opts.go
index e08d217..07507e2 100644
--- a/opts.go
+++ b/opts.go
@@ -11,7 +11,7 @@ type GlobalOptions struct {
 	DefaultModelProvider string   `json:"DefaultModelProvider"`
 	CacheDir             string   `json:"CacheDir"`
 	Env                  []string `json:"env"`
-	DatasetToolRepo      string   `json:"DatasetToolRepo"`
+	DatasetTool          string   `json:"DatasetTool"`
 	WorkspaceTool        string   `json:"WorkspaceTool"`
 }
 
@@ -46,7 +46,7 @@ func completeGlobalOptions(opts ...GlobalOptions) GlobalOptions {
 		result.OpenAIBaseURL = firstSet(opt.OpenAIBaseURL, result.OpenAIBaseURL)
 		result.DefaultModel = firstSet(opt.DefaultModel, result.DefaultModel)
 		result.DefaultModelProvider = firstSet(opt.DefaultModelProvider, result.DefaultModelProvider)
-		result.DatasetToolRepo = firstSet(opt.DatasetToolRepo, result.DatasetToolRepo)
+		result.DatasetTool = firstSet(opt.DatasetTool, result.DatasetTool)
 		result.WorkspaceTool = firstSet(opt.WorkspaceTool, result.WorkspaceTool)
 		result.Env = append(result.Env, opt.Env...)
 	}

From 3872d0d519e9bc312e8110106851dfc5e24212d0 Mon Sep 17 00:00:00 2001
From: Grant Linville <grant@acorn.io>
Date: Mon, 4 Nov 2024 15:38:55 -0500
Subject: [PATCH 2/8] fix comment

Signed-off-by: Grant Linville <grant@acorn.io>
---
 datasets_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/datasets_test.go b/datasets_test.go
index 8ece66a..0d74647 100644
--- a/datasets_test.go
+++ b/datasets_test.go
@@ -29,7 +29,7 @@ func TestDatasets(t *testing.T) {
 	})
 	require.NoError(t, err)
 
-	// Add two more elements
+	// Add three more elements
 	_, err = g.AddDatasetElements(context.Background(), datasetID, []DatasetElement{
 		{
 			DatasetElementMeta: DatasetElementMeta{

From 3e61e9007abeb23ad01e056197b994e09f142216 Mon Sep 17 00:00:00 2001
From: Grant Linville <grant@acorn.io>
Date: Mon, 4 Nov 2024 16:42:10 -0500
Subject: [PATCH 3/8] remove unused type

Signed-off-by: Grant Linville <grant@acorn.io>
---
 datasets.go | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/datasets.go b/datasets.go
index 0a4a1c0..f33aa7a 100644
--- a/datasets.go
+++ b/datasets.go
@@ -18,12 +18,6 @@ type DatasetElement struct {
 	BinaryContents     []byte `json:"binaryContents"`
 }
 
-type Dataset struct {
-	ID       string                        `json:"id"`
-	BaseDir  string                        `json:"baseDir,omitempty"`
-	Elements map[string]DatasetElementMeta `json:"elements"`
-}
-
 type datasetRequest struct {
 	Input       string   `json:"input"`
 	DatasetTool string   `json:"datasetTool"`

From 5cd6aaec9bf07275d08decd96edbf22b37a19372 Mon Sep 17 00:00:00 2001
From: Grant Linville <grant@acorn.io>
Date: Tue, 5 Nov 2024 14:23:46 -0500
Subject: [PATCH 4/8] workspaceID is no longer part of tool input

Signed-off-by: Grant Linville <grant@acorn.io>
---
 datasets.go | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

diff --git a/datasets.go b/datasets.go
index f33aa7a..4270a4f 100644
--- a/datasets.go
+++ b/datasets.go
@@ -19,31 +19,30 @@ type DatasetElement struct {
 }
 
 type datasetRequest struct {
+	WorkspaceID string   `json:"workspaceID"`
 	Input       string   `json:"input"`
 	DatasetTool string   `json:"datasetTool"`
 	Env         []string `json:"env"`
 }
 
 type addDatasetElementsArgs struct {
-	WorkspaceID string           `json:"workspaceID"`
-	DatasetID   string           `json:"datasetID"`
-	Elements    []DatasetElement `json:"elements"`
+	DatasetID string           `json:"datasetID"`
+	Elements  []DatasetElement `json:"elements"`
 }
 
 type listDatasetElementArgs struct {
-	WorkspaceID string `json:"workspaceID"`
-	DatasetID   string `json:"datasetID"`
+	DatasetID string `json:"datasetID"`
 }
 
 type getDatasetElementArgs struct {
-	WorkspaceID string `json:"workspaceID"`
-	DatasetID   string `json:"datasetID"`
-	Element     string `json:"name"`
+	DatasetID string `json:"datasetID"`
+	Element   string `json:"name"`
 }
 
 func (g *GPTScript) ListDatasets(ctx context.Context) ([]string, error) {
 	out, err := g.runBasicCommand(ctx, "datasets", datasetRequest{
-		Input:       fmt.Sprintf(`{"workspaceID": %q}`, os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
+		Input:       "{}",
+		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
 		DatasetTool: g.globalOpts.DatasetTool,
 		Env:         g.globalOpts.Env,
 	})
@@ -64,9 +63,8 @@ func (g *GPTScript) CreateDatasetWithElements(ctx context.Context, elements []Da
 
 func (g *GPTScript) AddDatasetElements(ctx context.Context, datasetID string, elements []DatasetElement) (string, error) {
 	args := addDatasetElementsArgs{
-		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
-		DatasetID:   datasetID,
-		Elements:    elements,
+		DatasetID: datasetID,
+		Elements:  elements,
 	}
 	argsJSON, err := json.Marshal(args)
 	if err != nil {
@@ -75,6 +73,7 @@ func (g *GPTScript) AddDatasetElements(ctx context.Context, datasetID string, el
 
 	return g.runBasicCommand(ctx, "datasets/add-elements", datasetRequest{
 		Input:       string(argsJSON),
+		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
 		DatasetTool: g.globalOpts.DatasetTool,
 		Env:         g.globalOpts.Env,
 	})
@@ -82,8 +81,7 @@ func (g *GPTScript) AddDatasetElements(ctx context.Context, datasetID string, el
 
 func (g *GPTScript) ListDatasetElements(ctx context.Context, datasetID string) ([]DatasetElementMeta, error) {
 	args := listDatasetElementArgs{
-		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
-		DatasetID:   datasetID,
+		DatasetID: datasetID,
 	}
 	argsJSON, err := json.Marshal(args)
 	if err != nil {
@@ -92,6 +90,7 @@ func (g *GPTScript) ListDatasetElements(ctx context.Context, datasetID string) (
 
 	out, err := g.runBasicCommand(ctx, "datasets/list-elements", datasetRequest{
 		Input:       string(argsJSON),
+		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
 		DatasetTool: g.globalOpts.DatasetTool,
 		Env:         g.globalOpts.Env,
 	})
@@ -108,9 +107,8 @@ func (g *GPTScript) ListDatasetElements(ctx context.Context, datasetID string) (
 
 func (g *GPTScript) GetDatasetElement(ctx context.Context, datasetID, elementName string) (DatasetElement, error) {
 	args := getDatasetElementArgs{
-		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
-		DatasetID:   datasetID,
-		Element:     elementName,
+		DatasetID: datasetID,
+		Element:   elementName,
 	}
 	argsJSON, err := json.Marshal(args)
 	if err != nil {
@@ -119,6 +117,7 @@ func (g *GPTScript) GetDatasetElement(ctx context.Context, datasetID, elementNam
 
 	out, err := g.runBasicCommand(ctx, "datasets/get-element", datasetRequest{
 		Input:       string(argsJSON),
+		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
 		DatasetTool: g.globalOpts.DatasetTool,
 		Env:         g.globalOpts.Env,
 	})

From aa62b408db2e89d8899ae0c7bb60953c3bb7b4f9 Mon Sep 17 00:00:00 2001
From: Grant Linville <grant@acorn.io>
Date: Tue, 5 Nov 2024 14:43:08 -0500
Subject: [PATCH 5/8] include workspaceID in env

Signed-off-by: Grant Linville <grant@acorn.io>
---
 datasets.go | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/datasets.go b/datasets.go
index 4270a4f..2b5e95c 100644
--- a/datasets.go
+++ b/datasets.go
@@ -19,7 +19,6 @@ type DatasetElement struct {
 }
 
 type datasetRequest struct {
-	WorkspaceID string   `json:"workspaceID"`
 	Input       string   `json:"input"`
 	DatasetTool string   `json:"datasetTool"`
 	Env         []string `json:"env"`
@@ -42,9 +41,8 @@ type getDatasetElementArgs struct {
 func (g *GPTScript) ListDatasets(ctx context.Context) ([]string, error) {
 	out, err := g.runBasicCommand(ctx, "datasets", datasetRequest{
 		Input:       "{}",
-		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
 		DatasetTool: g.globalOpts.DatasetTool,
-		Env:         g.globalOpts.Env,
+		Env:         append(g.globalOpts.Env, "GPTSCRIPT_WORKSPACE_ID="+os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
 	})
 	if err != nil {
 		return nil, err
@@ -73,9 +71,8 @@ func (g *GPTScript) AddDatasetElements(ctx context.Context, datasetID string, el
 
 	return g.runBasicCommand(ctx, "datasets/add-elements", datasetRequest{
 		Input:       string(argsJSON),
-		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
 		DatasetTool: g.globalOpts.DatasetTool,
-		Env:         g.globalOpts.Env,
+		Env:         append(g.globalOpts.Env, "GPTSCRIPT_WORKSPACE_ID="+os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
 	})
 }
 
@@ -90,9 +87,8 @@ func (g *GPTScript) ListDatasetElements(ctx context.Context, datasetID string) (
 
 	out, err := g.runBasicCommand(ctx, "datasets/list-elements", datasetRequest{
 		Input:       string(argsJSON),
-		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
 		DatasetTool: g.globalOpts.DatasetTool,
-		Env:         g.globalOpts.Env,
+		Env:         append(g.globalOpts.Env, "GPTSCRIPT_WORKSPACE_ID="+os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
 	})
 	if err != nil {
 		return nil, err
@@ -117,9 +113,8 @@ func (g *GPTScript) GetDatasetElement(ctx context.Context, datasetID, elementNam
 
 	out, err := g.runBasicCommand(ctx, "datasets/get-element", datasetRequest{
 		Input:       string(argsJSON),
-		WorkspaceID: os.Getenv("GPTSCRIPT_WORKSPACE_ID"),
 		DatasetTool: g.globalOpts.DatasetTool,
-		Env:         g.globalOpts.Env,
+		Env:         append(g.globalOpts.Env, "GPTSCRIPT_WORKSPACE_ID="+os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
 	})
 	if err != nil {
 		return DatasetElement{}, err

From eda15f3e27da420e201cabbac2862ebee03ca5b1 Mon Sep 17 00:00:00 2001
From: Grant Linville <grant@acorn.io>
Date: Tue, 5 Nov 2024 15:13:17 -0500
Subject: [PATCH 6/8] re-add dataset name and description

Signed-off-by: Grant Linville <grant@acorn.io>
---
 datasets.go      | 36 +++++++++++++++++++++++++++++-------
 datasets_test.go | 11 ++++++++---
 2 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/datasets.go b/datasets.go
index 2b5e95c..453188a 100644
--- a/datasets.go
+++ b/datasets.go
@@ -18,6 +18,12 @@ type DatasetElement struct {
 	BinaryContents     []byte `json:"binaryContents"`
 }
 
+type DatasetMeta struct {
+	ID          string `json:"id"`
+	Name        string `json:"name"`
+	Description string `json:"description"`
+}
+
 type datasetRequest struct {
 	Input       string   `json:"input"`
 	DatasetTool string   `json:"datasetTool"`
@@ -25,8 +31,10 @@ type datasetRequest struct {
 }
 
 type addDatasetElementsArgs struct {
-	DatasetID string           `json:"datasetID"`
-	Elements  []DatasetElement `json:"elements"`
+	DatasetID   string           `json:"datasetID"`
+	Name        string           `json:"name"`
+	Description string           `json:"description"`
+	Elements    []DatasetElement `json:"elements"`
 }
 
 type listDatasetElementArgs struct {
@@ -38,7 +46,7 @@ type getDatasetElementArgs struct {
 	Element   string `json:"name"`
 }
 
-func (g *GPTScript) ListDatasets(ctx context.Context) ([]string, error) {
+func (g *GPTScript) ListDatasets(ctx context.Context) ([]DatasetMeta, error) {
 	out, err := g.runBasicCommand(ctx, "datasets", datasetRequest{
 		Input:       "{}",
 		DatasetTool: g.globalOpts.DatasetTool,
@@ -48,22 +56,36 @@ func (g *GPTScript) ListDatasets(ctx context.Context) ([]string, error) {
 		return nil, err
 	}
 
-	var datasets []string
+	var datasets []DatasetMeta
 	if err = json.Unmarshal([]byte(out), &datasets); err != nil {
 		return nil, err
 	}
 	return datasets, nil
 }
 
-func (g *GPTScript) CreateDatasetWithElements(ctx context.Context, elements []DatasetElement) (string, error) {
-	return g.AddDatasetElements(ctx, "", elements)
+type DatasetOptions struct {
+	Name, Description string
 }
 
-func (g *GPTScript) AddDatasetElements(ctx context.Context, datasetID string, elements []DatasetElement) (string, error) {
+func (g *GPTScript) CreateDatasetWithElements(ctx context.Context, elements []DatasetElement, options ...DatasetOptions) (string, error) {
+	return g.AddDatasetElements(ctx, "", elements, options...)
+}
+
+func (g *GPTScript) AddDatasetElements(ctx context.Context, datasetID string, elements []DatasetElement, options ...DatasetOptions) (string, error) {
 	args := addDatasetElementsArgs{
 		DatasetID: datasetID,
 		Elements:  elements,
 	}
+
+	for _, opt := range options {
+		if opt.Name != "" {
+			args.Name = opt.Name
+		}
+		if opt.Description != "" {
+			args.Description = opt.Description
+		}
+	}
+
 	argsJSON, err := json.Marshal(args)
 	if err != nil {
 		return "", fmt.Errorf("failed to marshal element args: %w", err)
diff --git a/datasets_test.go b/datasets_test.go
index 0d74647..8fb10c5 100644
--- a/datasets_test.go
+++ b/datasets_test.go
@@ -26,6 +26,9 @@ func TestDatasets(t *testing.T) {
 			},
 			Contents: "This is the content 1",
 		},
+	}, DatasetOptions{
+		Name:        "test-dataset",
+		Description: "this is a test dataset",
 	})
 	require.NoError(t, err)
 
@@ -82,8 +85,10 @@ func TestDatasets(t *testing.T) {
 	require.Equal(t, 4, len(elements))
 
 	// List datasets
-	datasetIDs, err := g.ListDatasets(context.Background())
+	datasets, err := g.ListDatasets(context.Background())
 	require.NoError(t, err)
-	require.Equal(t, 1, len(datasetIDs))
-	require.Equal(t, datasetID, datasetIDs[0])
+	require.Equal(t, 1, len(datasets))
+	require.Equal(t, datasetID, datasets[0].ID)
+	require.Equal(t, "test-dataset", datasets[0].Name)
+	require.Equal(t, "this is a test dataset", datasets[0].Description)
 }

From 11455255a1d8c05850412c97f3eaf22af7899047 Mon Sep 17 00:00:00 2001
From: Grant Linville <grant@acorn.io>
Date: Tue, 5 Nov 2024 15:54:41 -0500
Subject: [PATCH 7/8] use a second client in the test

Signed-off-by: Grant Linville <grant@acorn.io>
---
 datasets.go      |  9 ++++-----
 datasets_test.go | 20 ++++++++++++--------
 2 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/datasets.go b/datasets.go
index 453188a..fb408c4 100644
--- a/datasets.go
+++ b/datasets.go
@@ -4,7 +4,6 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"os"
 )
 
 type DatasetElementMeta struct {
@@ -50,7 +49,7 @@ func (g *GPTScript) ListDatasets(ctx context.Context) ([]DatasetMeta, error) {
 	out, err := g.runBasicCommand(ctx, "datasets", datasetRequest{
 		Input:       "{}",
 		DatasetTool: g.globalOpts.DatasetTool,
-		Env:         append(g.globalOpts.Env, "GPTSCRIPT_WORKSPACE_ID="+os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
+		Env:         g.globalOpts.Env,
 	})
 	if err != nil {
 		return nil, err
@@ -94,7 +93,7 @@ func (g *GPTScript) AddDatasetElements(ctx context.Context, datasetID string, el
 	return g.runBasicCommand(ctx, "datasets/add-elements", datasetRequest{
 		Input:       string(argsJSON),
 		DatasetTool: g.globalOpts.DatasetTool,
-		Env:         append(g.globalOpts.Env, "GPTSCRIPT_WORKSPACE_ID="+os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
+		Env:         g.globalOpts.Env,
 	})
 }
 
@@ -110,7 +109,7 @@ func (g *GPTScript) ListDatasetElements(ctx context.Context, datasetID string) (
 	out, err := g.runBasicCommand(ctx, "datasets/list-elements", datasetRequest{
 		Input:       string(argsJSON),
 		DatasetTool: g.globalOpts.DatasetTool,
-		Env:         append(g.globalOpts.Env, "GPTSCRIPT_WORKSPACE_ID="+os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
+		Env:         g.globalOpts.Env,
 	})
 	if err != nil {
 		return nil, err
@@ -136,7 +135,7 @@ func (g *GPTScript) GetDatasetElement(ctx context.Context, datasetID, elementNam
 	out, err := g.runBasicCommand(ctx, "datasets/get-element", datasetRequest{
 		Input:       string(argsJSON),
 		DatasetTool: g.globalOpts.DatasetTool,
-		Env:         append(g.globalOpts.Env, "GPTSCRIPT_WORKSPACE_ID="+os.Getenv("GPTSCRIPT_WORKSPACE_ID")),
+		Env:         g.globalOpts.Env,
 	})
 	if err != nil {
 		return DatasetElement{}, err
diff --git a/datasets_test.go b/datasets_test.go
index 8fb10c5..14c84a6 100644
--- a/datasets_test.go
+++ b/datasets_test.go
@@ -12,13 +12,17 @@ func TestDatasets(t *testing.T) {
 	workspaceID, err := g.CreateWorkspace(context.Background(), "directory")
 	require.NoError(t, err)
 
-	require.NoError(t, os.Setenv("GPTSCRIPT_WORKSPACE_ID", workspaceID))
+	client, err := NewGPTScript(GlobalOptions{
+		OpenAIAPIKey: os.Getenv("OPENAI_API_KEY"),
+		Env:          []string{"GPTSCRIPT_WORKSPACE_ID=" + workspaceID},
+	})
+	require.NoError(t, err)
 
 	defer func() {
 		_ = g.DeleteWorkspace(context.Background(), workspaceID)
 	}()
 
-	datasetID, err := g.CreateDatasetWithElements(context.Background(), []DatasetElement{
+	datasetID, err := client.CreateDatasetWithElements(context.Background(), []DatasetElement{
 		{
 			DatasetElementMeta: DatasetElementMeta{
 				Name:        "test-element-1",
@@ -33,7 +37,7 @@ func TestDatasets(t *testing.T) {
 	require.NoError(t, err)
 
 	// Add three more elements
-	_, err = g.AddDatasetElements(context.Background(), datasetID, []DatasetElement{
+	_, err = client.AddDatasetElements(context.Background(), datasetID, []DatasetElement{
 		{
 			DatasetElementMeta: DatasetElementMeta{
 				Name:        "test-element-2",
@@ -59,33 +63,33 @@ func TestDatasets(t *testing.T) {
 	require.NoError(t, err)
 
 	// Get the first element
-	element, err := g.GetDatasetElement(context.Background(), datasetID, "test-element-1")
+	element, err := client.GetDatasetElement(context.Background(), datasetID, "test-element-1")
 	require.NoError(t, err)
 	require.Equal(t, "test-element-1", element.Name)
 	require.Equal(t, "This is a test element 1", element.Description)
 	require.Equal(t, "This is the content 1", element.Contents)
 
 	// Get the third element
-	element, err = g.GetDatasetElement(context.Background(), datasetID, "test-element-3")
+	element, err = client.GetDatasetElement(context.Background(), datasetID, "test-element-3")
 	require.NoError(t, err)
 	require.Equal(t, "test-element-3", element.Name)
 	require.Equal(t, "This is a test element 3", element.Description)
 	require.Equal(t, "This is the content 3", element.Contents)
 
 	// Get the binary element
-	element, err = g.GetDatasetElement(context.Background(), datasetID, "binary-element")
+	element, err = client.GetDatasetElement(context.Background(), datasetID, "binary-element")
 	require.NoError(t, err)
 	require.Equal(t, "binary-element", element.Name)
 	require.Equal(t, "this element has binary contents", element.Description)
 	require.Equal(t, []byte("binary contents"), element.BinaryContents)
 
 	// List elements in the dataset
-	elements, err := g.ListDatasetElements(context.Background(), datasetID)
+	elements, err := client.ListDatasetElements(context.Background(), datasetID)
 	require.NoError(t, err)
 	require.Equal(t, 4, len(elements))
 
 	// List datasets
-	datasets, err := g.ListDatasets(context.Background())
+	datasets, err := client.ListDatasets(context.Background())
 	require.NoError(t, err)
 	require.Equal(t, 1, len(datasets))
 	require.Equal(t, datasetID, datasets[0].ID)

From 9dae54cb6bf8c63c99854cc56bd9536b12c6f8eb Mon Sep 17 00:00:00 2001
From: Grant Linville <grant@acorn.io>
Date: Wed, 6 Nov 2024 11:24:29 -0500
Subject: [PATCH 8/8] fix environment

Signed-off-by: Grant Linville <grant@acorn.io>
---
 datasets_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/datasets_test.go b/datasets_test.go
index 14c84a6..c1f1a92 100644
--- a/datasets_test.go
+++ b/datasets_test.go
@@ -14,7 +14,7 @@ func TestDatasets(t *testing.T) {
 
 	client, err := NewGPTScript(GlobalOptions{
 		OpenAIAPIKey: os.Getenv("OPENAI_API_KEY"),
-		Env:          []string{"GPTSCRIPT_WORKSPACE_ID=" + workspaceID},
+		Env:          append(os.Environ(), "GPTSCRIPT_WORKSPACE_ID="+workspaceID),
 	})
 	require.NoError(t, err)