Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add workspace API support #72

Merged
merged 1 commit into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 150 additions & 0 deletions datasets.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package gptscript

import (
"context"
"encoding/json"
"fmt"
"os"
)

type DatasetElementMeta struct {
Name string `json:"name"`
Description string `json:"description"`
Expand Down Expand Up @@ -48,3 +55,146 @@ type getDatasetElementArgs struct {
DatasetID string `json:"datasetID"`
Element string `json:"element"`
}

func (g *GPTScript) ListDatasets(ctx context.Context, workspace string) ([]DatasetMeta, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

out, err := g.runBasicCommand(ctx, "datasets", datasetRequest{
Input: "{}",
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})
if err != nil {
return nil, err
}

var datasets []DatasetMeta
if err = json.Unmarshal([]byte(out), &datasets); err != nil {
return nil, err
}
return datasets, nil
}

func (g *GPTScript) CreateDataset(ctx context.Context, workspace, name, description string) (Dataset, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

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),
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})
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, workspace, datasetID, elementName, elementDescription, elementContent string) (DatasetElementMeta, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

args := addDatasetElementArgs{
DatasetID: datasetID,
ElementName: elementName,
ElementDescription: elementDescription,
ElementContent: 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),
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})
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) ListDatasetElements(ctx context.Context, workspace, datasetID string) ([]DatasetElementMeta, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

args := listDatasetElementArgs{
DatasetID: datasetID,
}
argsJSON, err := json.Marshal(args)
if err != nil {
return nil, fmt.Errorf("failed to marshal element args: %w", err)
}

out, err := g.runBasicCommand(ctx, "datasets/list-elements", datasetRequest{
Input: string(argsJSON),
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})
if err != nil {
return nil, err
}

var elements []DatasetElementMeta
if err = json.Unmarshal([]byte(out), &elements); err != nil {
return nil, err
}
return elements, nil
}

func (g *GPTScript) GetDatasetElement(ctx context.Context, workspace, datasetID, elementName string) (DatasetElement, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

args := getDatasetElementArgs{
DatasetID: datasetID,
Element: elementName,
}
argsJSON, err := json.Marshal(args)
if err != nil {
return DatasetElement{}, fmt.Errorf("failed to marshal element args: %w", err)
}

out, err := g.runBasicCommand(ctx, "datasets/get-element", datasetRequest{
Input: string(argsJSON),
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})
if err != nil {
return DatasetElement{}, err
}

var element DatasetElement
if err = json.Unmarshal([]byte(out), &element); err != nil {
return DatasetElement{}, err
}

return element, nil
}
52 changes: 52 additions & 0 deletions datasets_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package gptscript

import (
"context"
"os"
"testing"

"github.com/stretchr/testify/require"
)

func TestDatasets(t *testing.T) {
workspace, err := os.MkdirTemp("", "go-gptscript-test")
require.NoError(t, err)
defer func() {
_ = os.RemoveAll(workspace)
}()

// Create a dataset
dataset, err := g.CreateDataset(context.Background(), workspace, "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(), workspace, dataset.ID, "test-element", "This is a test element", "This is the content")
require.NoError(t, err)
require.Equal(t, "test-element", elementMeta.Name)
require.Equal(t, "This is a test element", elementMeta.Description)

// Get the element
element, err := g.GetDatasetElement(context.Background(), workspace, dataset.ID, "test-element")
require.NoError(t, err)
require.Equal(t, "test-element", element.Name)
require.Equal(t, "This is a test element", element.Description)
require.Equal(t, "This is the content", element.Contents)

// List elements in the dataset
elements, err := g.ListDatasetElements(context.Background(), workspace, dataset.ID)
require.NoError(t, err)
require.Equal(t, 1, len(elements))
require.Equal(t, "test-element", elements[0].Name)
require.Equal(t, "This is a test element", elements[0].Description)

// List datasets
datasets, err := g.ListDatasets(context.Background(), workspace)
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)
}
171 changes: 0 additions & 171 deletions gptscript.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"context"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"log/slog"
Expand Down Expand Up @@ -389,176 +388,6 @@ func (g *GPTScript) DeleteCredential(ctx context.Context, credCtx, name string)
return err
}

// Dataset methods

func (g *GPTScript) ListDatasets(ctx context.Context, workspace string) ([]DatasetMeta, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

out, err := g.runBasicCommand(ctx, "datasets", datasetRequest{
Input: "{}",
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})

if err != nil {
return nil, err
}

if strings.HasPrefix(out, "ERROR:") {
return nil, errors.New(out)
}

var datasets []DatasetMeta
if err = json.Unmarshal([]byte(out), &datasets); err != nil {
return nil, err
}
return datasets, nil
}

func (g *GPTScript) CreateDataset(ctx context.Context, workspace, name, description string) (Dataset, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

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),
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})

if err != nil {
return Dataset{}, err
}

if strings.HasPrefix(out, "ERROR:") {
return Dataset{}, errors.New(out)
}

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, workspace, datasetID, elementName, elementDescription, elementContent string) (DatasetElementMeta, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

args := addDatasetElementArgs{
DatasetID: datasetID,
ElementName: elementName,
ElementDescription: elementDescription,
ElementContent: 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),
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})

if err != nil {
return DatasetElementMeta{}, err
}

if strings.HasPrefix(out, "ERROR:") {
return DatasetElementMeta{}, errors.New(out)
}

var element DatasetElementMeta
if err = json.Unmarshal([]byte(out), &element); err != nil {
return DatasetElementMeta{}, err
}
return element, nil
}

func (g *GPTScript) ListDatasetElements(ctx context.Context, workspace, datasetID string) ([]DatasetElementMeta, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

args := listDatasetElementArgs{
DatasetID: datasetID,
}
argsJSON, err := json.Marshal(args)
if err != nil {
return nil, fmt.Errorf("failed to marshal element args: %w", err)
}

out, err := g.runBasicCommand(ctx, "datasets/list-elements", datasetRequest{
Input: string(argsJSON),
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})

if err != nil {
return nil, err
}

if strings.HasPrefix(out, "ERROR:") {
return nil, errors.New(out)
}

var elements []DatasetElementMeta
if err = json.Unmarshal([]byte(out), &elements); err != nil {
return nil, err
}
return elements, nil
}

func (g *GPTScript) GetDatasetElement(ctx context.Context, workspace, datasetID, elementName string) (DatasetElement, error) {
if workspace == "" {
workspace = os.Getenv("GPTSCRIPT_WORKSPACE_DIR")
}

args := getDatasetElementArgs{
DatasetID: datasetID,
Element: elementName,
}
argsJSON, err := json.Marshal(args)
if err != nil {
return DatasetElement{}, fmt.Errorf("failed to marshal element args: %w", err)
}

out, err := g.runBasicCommand(ctx, "datasets/get-element", datasetRequest{
Input: string(argsJSON),
Workspace: workspace,
DatasetToolRepo: g.globalOpts.DatasetToolRepo,
})

if err != nil {
return DatasetElement{}, err
}

if strings.HasPrefix(out, "ERROR:") {
return DatasetElement{}, errors.New(out)
}

var element DatasetElement
if err = json.Unmarshal([]byte(out), &element); err != nil {
return DatasetElement{}, err
}

return element, nil
}

func (g *GPTScript) runBasicCommand(ctx context.Context, requestPath string, body any) (string, error) {
run := &Run{
url: g.globalOpts.URL,
Expand Down
Loading