Standardize action results

This commit is contained in:
mudler
2025-03-01 17:27:07 +01:00
parent 8492c95cb6
commit 5b4f618ca3
22 changed files with 108 additions and 67 deletions

View File

@@ -18,7 +18,7 @@ func NewBrowse(config map[string]string) *BrowseAction {
type BrowseAction struct{}
func (a *BrowseAction) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (a *BrowseAction) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
URL string `json:"url"`
}{}
@@ -26,31 +26,31 @@ func (a *BrowseAction) Run(ctx context.Context, params action.ActionParams) (str
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
// download page with http.Client
client := &http.Client{}
req, err := http.NewRequest("GET", result.URL, nil)
if err != nil {
return "", err
return action.ActionResult{}, err
}
resp, err := client.Do(req)
if err != nil {
return "", err
return action.ActionResult{}, err
}
defer resp.Body.Close()
pagebyte, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
return action.ActionResult{}, err
}
rendered, err := html2text.FromString(string(pagebyte), html2text.Options{PrettyTables: true})
if err != nil {
return "", err
return action.ActionResult{}, err
}
return fmt.Sprintf("The webpage '%s' content is:\n%s", result.URL, rendered), nil
return action.ActionResult{Result: fmt.Sprintf("The webpage '%s' content is:\n%s", result.URL, rendered)}, nil
}
func (a *BrowseAction) Definition() action.ActionDefinition {

View File

@@ -24,18 +24,18 @@ type GenImageAction struct {
imageModel string
}
func (a *GenImageAction) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (a *GenImageAction) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
Prompt string `json:"prompt"`
Size string `json:"size"`
}{}
err := params.Unmarshal(&result)
if err != nil {
return "", err
return action.ActionResult{}, err
}
if result.Prompt == "" {
return "", fmt.Errorf("prompt is required")
return action.ActionResult{}, fmt.Errorf("prompt is required")
}
req := openai.ImageRequest{
@@ -56,14 +56,17 @@ func (a *GenImageAction) Run(ctx context.Context, params action.ActionParams) (s
resp, err := a.client.CreateImage(ctx, req)
if err != nil {
return "Failed to generate image " + err.Error(), err
return action.ActionResult{Result: "Failed to generate image " + err.Error()}, err
}
if len(resp.Data) == 0 {
return "Failed to generate image", nil
return action.ActionResult{Result: "Failed to generate image"}, nil
}
return fmt.Sprintf("The image was generated and available at: %s", resp.Data[0].URL), nil
return action.ActionResult{
Result: fmt.Sprintf("The image was generated and available at: %s", resp.Data[0].URL), Metadata: map[string]interface{}{
"url": resp.Data[0].URL,
}}, nil
}
func (a *GenImageAction) Definition() action.ActionDefinition {

View File

@@ -24,7 +24,7 @@ func NewGithubIssueCloser(ctx context.Context, config map[string]string) *Github
}
}
func (g *GithubIssuesCloser) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (g *GithubIssuesCloser) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
Repository string `json:"repository"`
Owner string `json:"owner"`
@@ -34,7 +34,7 @@ func (g *GithubIssuesCloser) Run(ctx context.Context, params action.ActionParams
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
// _, _, err = g.client.Issues.CreateComment(
@@ -57,14 +57,14 @@ func (g *GithubIssuesCloser) Run(ctx context.Context, params action.ActionParams
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
resultString := fmt.Sprintf("Closed issue %d in repository %s/%s", result.IssueNumber, result.Owner, result.Repository)
if err != nil {
resultString = fmt.Sprintf("Error closing issue %d in repository %s/%s: %v", result.IssueNumber, result.Owner, result.Repository, err)
}
return resultString, err
return action.ActionResult{Result: resultString}, err
}
func (g *GithubIssuesCloser) Definition() action.ActionDefinition {

View File

@@ -36,7 +36,7 @@ func NewGithubIssueLabeler(ctx context.Context, config map[string]string) *Githu
}
}
func (g *GithubIssuesLabeler) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (g *GithubIssuesLabeler) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
Repository string `json:"repository"`
Owner string `json:"owner"`
@@ -45,9 +45,7 @@ func (g *GithubIssuesLabeler) Run(ctx context.Context, params action.ActionParam
}{}
err := params.Unmarshal(&result)
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
labels, _, err := g.client.Issues.AddLabelsToIssue(g.context, result.Owner, result.Repository, result.IssueNumber, []string{result.Label})
@@ -61,7 +59,7 @@ func (g *GithubIssuesLabeler) Run(ctx context.Context, params action.ActionParam
if err != nil {
resultString = fmt.Sprintf("Error adding label '%s' to issue %d in repository %s/%s: %v", result.Label, result.IssueNumber, result.Owner, result.Repository, err)
}
return resultString, err
return action.ActionResult{Result: resultString}, err
}
func (g *GithubIssuesLabeler) Definition() action.ActionDefinition {

View File

@@ -25,7 +25,7 @@ func NewGithubIssueOpener(ctx context.Context, config map[string]string) *Github
}
}
func (g *GithubIssuesOpener) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (g *GithubIssuesOpener) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
Title string `json:"title"`
Body string `json:"text"`
@@ -36,7 +36,7 @@ func (g *GithubIssuesOpener) Run(ctx context.Context, params action.ActionParams
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
issue := &github.IssueRequest{
@@ -52,7 +52,7 @@ func (g *GithubIssuesOpener) Run(ctx context.Context, params action.ActionParams
resultString = fmt.Sprintf("Created issue %d in repository %s/%s", createdIssue.GetNumber(), result.Owner, result.Repository)
}
return resultString, err
return action.ActionResult{Result: resultString}, err
}
func (g *GithubIssuesOpener) Definition() action.ActionDefinition {

View File

@@ -26,7 +26,7 @@ func NewGithubIssueSearch(ctx context.Context, config map[string]string) *Github
}
}
func (g *GithubIssueSearch) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (g *GithubIssueSearch) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
Query string `json:"query"`
Repository string `json:"repository"`
@@ -36,7 +36,7 @@ func (g *GithubIssueSearch) Run(ctx context.Context, params action.ActionParams)
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
query := fmt.Sprintf("%s in:%s user:%s", result.Query, result.Repository, result.Owner)
@@ -48,7 +48,7 @@ func (g *GithubIssueSearch) Run(ctx context.Context, params action.ActionParams)
})
if err != nil {
resultString = fmt.Sprintf("Error listing issues: %v", err)
return resultString, err
return action.ActionResult{Result: resultString}, err
}
for _, i := range issues.Issues {
xlog.Info("Issue found", "title", i.GetTitle())
@@ -57,7 +57,7 @@ func (g *GithubIssueSearch) Run(ctx context.Context, params action.ActionParams)
// resultString += fmt.Sprintf("Body: %s\n", i.GetBody())
}
return resultString, err
return action.ActionResult{Result: resultString}, err
}
func (g *GithubIssueSearch) Definition() action.ActionDefinition {

View File

@@ -16,7 +16,7 @@ func NewScraper(config map[string]string) *ScraperAction {
type ScraperAction struct{}
func (a *ScraperAction) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (a *ScraperAction) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
URL string `json:"url"`
}{}
@@ -24,15 +24,21 @@ func (a *ScraperAction) Run(ctx context.Context, params action.ActionParams) (st
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
scraper, err := scraper.New()
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
return scraper.Call(ctx, result.URL)
res, err := scraper.Call(ctx, result.URL)
if err != nil {
fmt.Printf("error: %v", err)
return action.ActionResult{}, err
}
return action.ActionResult{Result: res}, nil
}
func (a *ScraperAction) Definition() action.ActionDefinition {

View File

@@ -28,7 +28,7 @@ func NewSearch(config map[string]string) *SearchAction {
type SearchAction struct{ results int }
func (a *SearchAction) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (a *SearchAction) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
Query string `json:"query"`
}{}
@@ -36,15 +36,21 @@ func (a *SearchAction) Run(ctx context.Context, params action.ActionParams) (str
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
ddg, err := duckduckgo.New(a.results, "LocalAgent")
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
return ddg.Call(ctx, result.Query)
res, err := ddg.Call(ctx, result.Query)
if err != nil {
fmt.Printf("error: %v", err)
return action.ActionResult{}, err
}
return action.ActionResult{Result: res}, nil
}
func (a *SearchAction) Definition() action.ActionDefinition {

View File

@@ -27,7 +27,7 @@ type SendMailAction struct {
smtpPort string
}
func (a *SendMailAction) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (a *SendMailAction) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
Message string `json:"message"`
To string `json:"to"`
@@ -37,7 +37,7 @@ func (a *SendMailAction) Run(ctx context.Context, params action.ActionParams) (s
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
// Authentication.
@@ -50,9 +50,9 @@ func (a *SendMailAction) Run(ctx context.Context, params action.ActionParams) (s
result.To,
}, []byte(result.Message))
if err != nil {
return "", err
return action.ActionResult{}, err
}
return fmt.Sprintf("Email sent to %s", result.To), nil
return action.ActionResult{Result: fmt.Sprintf("Email sent to %s", result.To)}, nil
}
func (a *SendMailAction) Definition() action.ActionDefinition {

View File

@@ -15,7 +15,7 @@ func NewWikipedia(config map[string]string) *WikipediaAction {
type WikipediaAction struct{}
func (a *WikipediaAction) Run(ctx context.Context, params action.ActionParams) (string, error) {
func (a *WikipediaAction) Run(ctx context.Context, params action.ActionParams) (action.ActionResult, error) {
result := struct {
Query string `json:"query"`
}{}
@@ -23,10 +23,16 @@ func (a *WikipediaAction) Run(ctx context.Context, params action.ActionParams) (
if err != nil {
fmt.Printf("error: %v", err)
return "", err
return action.ActionResult{}, err
}
wiki := wikipedia.New("LocalAgent")
return wiki.Call(ctx, result.Query)
res, err := wiki.Call(ctx, result.Query)
if err != nil {
fmt.Printf("error: %v", err)
return action.ActionResult{}, err
}
return action.ActionResult{Result: res}, nil
}
func (a *WikipediaAction) Definition() action.ActionDefinition {