diff --git a/services/actions.go b/services/actions.go index 85c8252..de73044 100644 --- a/services/actions.go +++ b/services/actions.go @@ -24,6 +24,7 @@ const ( ActionGithubRepositoryCreateOrUpdate = "github-repository-create-or-update-content" ActionGithubIssueReader = "github-issue-reader" ActionGithubIssueCommenter = "github-issue-commenter" + ActionGithubREADME = "github-readme" ActionScraper = "scraper" ActionWikipedia = "wikipedia" ActionBrowse = "browse" @@ -45,6 +46,7 @@ var AvailableActions = []string{ ActionGithubRepositoryCreateOrUpdate, ActionGithubIssueReader, ActionGithubIssueCommenter, + ActionGithubREADME, ActionScraper, ActionBrowse, ActionWikipedia, @@ -94,6 +96,8 @@ func Actions(a *state.AgentConfig) func(ctx context.Context, pool *state.AgentPo allActions = append(allActions, actions.NewGithubRepositoryGetContent(ctx, config)) case ActionGithubRepositoryCreateOrUpdate: allActions = append(allActions, actions.NewGithubRepositoryCreateOrUpdateContent(ctx, config)) + case ActionGithubREADME: + allActions = append(allActions, actions.NewGithubRepositoryREADME(ctx, config)) case ActionScraper: allActions = append(allActions, actions.NewScraper(config)) case ActionWikipedia: diff --git a/services/actions/githubrepositoryreadme.go b/services/actions/githubrepositoryreadme.go new file mode 100644 index 0000000..1ce745c --- /dev/null +++ b/services/actions/githubrepositoryreadme.go @@ -0,0 +1,75 @@ +package actions + +import ( + "context" + "fmt" + + "github.com/google/go-github/v69/github" + "github.com/mudler/LocalAgent/core/action" + "github.com/sashabaranov/go-openai/jsonschema" +) + +type GithubRepositoryREADME struct { + token, customActionName string + context context.Context + client *github.Client +} + +func NewGithubRepositoryREADME(ctx context.Context, config map[string]string) *GithubRepositoryREADME { + client := github.NewClient(nil).WithAuthToken(config["token"]) + + return &GithubRepositoryREADME{ + client: client, + token: config["token"], + customActionName: config["customActionName"], + context: ctx, + } +} + +func (g *GithubRepositoryREADME) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) { + result := struct { + Repository string `json:"repository"` + Owner string `json:"owner"` + }{} + err := params.Unmarshal(&result) + if err != nil { + fmt.Printf("error: %v", err) + + return action.ActionResult{}, err + } + fileContent, _, err := g.client.Repositories.GetReadme(g.context, result.Owner, result.Repository, &github.RepositoryContentGetOptions{}) + if err != nil { + resultString := fmt.Sprintf("Error getting content : %v", err) + return action.ActionResult{Result: resultString}, err + } + + var content string + if fileContent.Content != nil { + content = *fileContent.Content + } + + return action.ActionResult{Result: content}, err +} + +func (g *GithubRepositoryREADME) Definition() action.ActionDefinition { + actionName := "github_readme" + actionDescription := "Get the README file of a GitHub repository to have a basic understanding of the project." + if g.customActionName != "" { + actionName = g.customActionName + } + return action.ActionDefinition{ + Name: action.ActionDefinitionName(actionName), + Description: actionDescription, + Properties: map[string]jsonschema.Definition{ + "repository": { + Type: jsonschema.String, + Description: "The repository to search in", + }, + "owner": { + Type: jsonschema.String, + Description: "The owner of the repository", + }, + }, + Required: []string{"repository", "owner"}, + } +}