feat: update commandline (#132)

drew/english
N3ko 6 months ago committed by GitHub
parent 09c7e3515e
commit bc28accbb7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -23,8 +23,10 @@ import (
"os" "os"
"os/exec" "os/exec"
"runtime" "runtime"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/deep/params" "github.com/cloudwego/eino-examples/adk/multiagent/deep/params"
"github.com/cloudwego/eino-ext/components/tool/commandline"
) )
type LocalOperator struct{} type LocalOperator struct{}
@ -49,18 +51,18 @@ func (l *LocalOperator) Exists(ctx context.Context, path string) (bool, error) {
return true, nil return true, nil
} }
func (l *LocalOperator) RunCommand(ctx context.Context, command string) (string, error) { func (l *LocalOperator) RunCommand(ctx context.Context, command []string) (*commandline.CommandOutput, error) {
wd, ok := params.GetTypedContextParams[string](ctx, params.WorkDirSessionKey) wd, ok := params.GetTypedContextParams[string](ctx, params.WorkDirSessionKey)
if !ok { if !ok {
return "", fmt.Errorf("work dir not found") return nil, fmt.Errorf("work dir not found")
} }
var shellCmd []string var shellCmd []string
switch runtime.GOOS { switch runtime.GOOS {
case "windows": case "windows":
shellCmd = []string{"cmd.exe", "/C", command} shellCmd = append([]string{"cmd.exe", "/C"}, command...)
default: default:
shellCmd = []string{"/bin/sh", "-c", command} shellCmd = []string{"/bin/sh", "-c", strings.Join(command, " ")}
} }
cmd := exec.CommandContext(ctx, shellCmd[0], shellCmd[1:]...) cmd := exec.CommandContext(ctx, shellCmd[0], shellCmd[1:]...)
@ -72,7 +74,11 @@ func (l *LocalOperator) RunCommand(ctx context.Context, command string) (string,
cmd.Stderr = errBuf cmd.Stderr = errBuf
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
return fmt.Sprintf("internal error:\ncommand: %v\n\nexec error: %v", cmd.String(), errBuf.String()), nil err = fmt.Errorf("internal error:\ncommand: %v\n\nerr: %v\n\nexec error: %v", cmd.String(), err, errBuf.String())
return nil, err
} }
return outBuf.String(), nil return &commandline.CommandOutput{
Stdout: outBuf.String(),
Stderr: errBuf.String(),
}, nil
} }

@ -19,7 +19,9 @@ package tools
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/deep/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline" "github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
@ -72,5 +74,12 @@ func (b *bashTool) InvokableRun(ctx context.Context, argumentsInJSON string, opt
return "command cannot be empty", nil return "command cannot be empty", nil
} }
o := tool.GetImplSpecificOptions(&options{b.op}, opts...) o := tool.GetImplSpecificOptions(&options{b.op}, opts...)
return o.op.RunCommand(ctx, input.Command) cmd, err := o.op.RunCommand(ctx, []string{input.Command})
if err != nil {
if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", err
}
return utils.FormatCommandOutput(cmd), nil
} }

@ -24,6 +24,7 @@ import (
"regexp" "regexp"
"strings" "strings"
"github.com/cloudwego/eino-examples/adk/multiagent/deep/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline" "github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
@ -84,14 +85,14 @@ func (p *pythonRunnerTool) InvokableRun(ctx context.Context, argumentsInJSON str
if pyExecutablePath == "" { if pyExecutablePath == "" {
pyExecutablePath = "python" pyExecutablePath = "python"
} }
result, err := p.op.RunCommand(ctx, fmt.Sprintf("%s %s", pyExecutablePath, filePath)) result, err := p.op.RunCommand(ctx, []string{pyExecutablePath, filePath})
if err != nil { if err != nil {
return "", fmt.Errorf("execute error: %w", err) if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
} }
if strings.HasPrefix(result, "internal error") { return "", fmt.Errorf("execute error: %w", err)
result = fmt.Sprintf("%s\n\n code after parse:\n%v", result, code)
} }
return result, nil return utils.FormatCommandOutput(result), nil
} }
func tryExtractCodeSnippet(res string) string { func tryExtractCodeSnippet(res string) string {

@ -20,7 +20,9 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/deep/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline" "github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
@ -85,10 +87,12 @@ func (r *readFile) InvokableRun(ctx context.Context, argumentsInJSON string, opt
o := tool.GetImplSpecificOptions(&options{op: r.op}) o := tool.GetImplSpecificOptions(&options{op: r.op})
cmd := fmt.Sprintf("python3 -c \"import sys; lines = (line for idx, line in enumerate(open(sys.argv[1], encoding='utf-8')) if %d <= idx < %d); print(''.join(lines))\" %s", cmd := fmt.Sprintf("python3 -c \"import sys; lines = (line for idx, line in enumerate(open(sys.argv[1], encoding='utf-8')) if %d <= idx < %d); print(''.join(lines))\" %s",
input.StartRow, input.StartRow+input.NRows, input.Path) input.StartRow, input.StartRow+input.NRows, input.Path)
content, err := o.op.RunCommand(ctx, cmd) content, err := o.op.RunCommand(ctx, []string{cmd})
if err != nil { if err != nil {
if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", err return "", err
} }
return utils.FormatCommandOutput(content), nil
return content, nil
} }

@ -19,8 +19,9 @@ package tools
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "strings"
"github.com/cloudwego/eino-examples/adk/multiagent/deep/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline" "github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
@ -67,5 +68,12 @@ func (t *tree) InvokableRun(ctx context.Context, argumentsInJSON string, opts ..
return "path can not be empty", nil return "path can not be empty", nil
} }
o := tool.GetImplSpecificOptions(&options{t.op}, opts...) o := tool.GetImplSpecificOptions(&options{t.op}, opts...)
return o.op.RunCommand(ctx, fmt.Sprintf("find %s", input.Path)) output, err := o.op.RunCommand(ctx, []string{"find", input.Path})
if err != nil {
if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", err
}
return utils.FormatCommandOutput(output), nil
} }

@ -23,6 +23,7 @@ import (
"time" "time"
"github.com/bytedance/sonic" "github.com/bytedance/sonic"
"github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/adk" "github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/adk/prebuilt/planexecute" "github.com/cloudwego/eino/adk/prebuilt/planexecute"
"github.com/kaptinlin/jsonrepair" "github.com/kaptinlin/jsonrepair"
@ -114,3 +115,7 @@ func FormatExecutedSteps(in []planexecute.ExecutedStep) string {
} }
return sb.String() return sb.String()
} }
func FormatCommandOutput(output *commandline.CommandOutput) string {
return fmt.Sprintf("---\nstdout:%v\n---\nstderr:%v\n---", output.Stdout, output.Stderr)
}

@ -23,8 +23,10 @@ import (
"os" "os"
"os/exec" "os/exec"
"runtime" "runtime"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/integration-excel-agent/params" "github.com/cloudwego/eino-examples/adk/multiagent/integration-excel-agent/params"
"github.com/cloudwego/eino-ext/components/tool/commandline"
) )
type LocalOperator struct{} type LocalOperator struct{}
@ -49,18 +51,18 @@ func (l *LocalOperator) Exists(ctx context.Context, path string) (bool, error) {
return true, nil return true, nil
} }
func (l *LocalOperator) RunCommand(ctx context.Context, command string) (string, error) { func (l *LocalOperator) RunCommand(ctx context.Context, command []string) (*commandline.CommandOutput, error) {
wd, ok := params.GetTypedContextParams[string](ctx, params.WorkDirSessionKey) wd, ok := params.GetTypedContextParams[string](ctx, params.WorkDirSessionKey)
if !ok { if !ok {
return "", fmt.Errorf("work dir not found") return nil, fmt.Errorf("work dir not found")
} }
var shellCmd []string var shellCmd []string
switch runtime.GOOS { switch runtime.GOOS {
case "windows": case "windows":
shellCmd = []string{"cmd.exe", "/C", command} shellCmd = append([]string{"cmd.exe", "/C"}, command...)
default: default:
shellCmd = []string{"/bin/sh", "-c", command} shellCmd = []string{"/bin/sh", "-c", strings.Join(command, " ")}
} }
cmd := exec.CommandContext(ctx, shellCmd[0], shellCmd[1:]...) cmd := exec.CommandContext(ctx, shellCmd[0], shellCmd[1:]...)
@ -72,7 +74,11 @@ func (l *LocalOperator) RunCommand(ctx context.Context, command string) (string,
cmd.Stderr = errBuf cmd.Stderr = errBuf
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
return fmt.Sprintf("internal error:\ncommand: %v\n\nexec error: %v", cmd.String(), errBuf.String()), nil err = fmt.Errorf("internal error:\ncommand: %v\n\nerr: %v\n\nexec error: %v", cmd.String(), err, errBuf.String())
return nil, err
} }
return outBuf.String(), nil return &commandline.CommandOutput{
Stdout: outBuf.String(),
Stderr: errBuf.String(),
}, nil
} }

@ -19,7 +19,9 @@ package tools
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/integration-excel-agent/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline" "github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
@ -72,5 +74,12 @@ func (b *bashTool) InvokableRun(ctx context.Context, argumentsInJSON string, opt
return "command cannot be empty", nil return "command cannot be empty", nil
} }
o := tool.GetImplSpecificOptions(&options{b.op}, opts...) o := tool.GetImplSpecificOptions(&options{b.op}, opts...)
return o.op.RunCommand(ctx, input.Command) cmd, err := o.op.RunCommand(ctx, []string{input.Command})
if err != nil {
if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", err
}
return utils.FormatCommandOutput(cmd), nil
} }

@ -24,6 +24,7 @@ import (
"regexp" "regexp"
"strings" "strings"
"github.com/cloudwego/eino-examples/adk/multiagent/integration-excel-agent/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline" "github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
@ -84,14 +85,14 @@ func (p *pythonRunnerTool) InvokableRun(ctx context.Context, argumentsInJSON str
if pyExecutablePath == "" { if pyExecutablePath == "" {
pyExecutablePath = "python" pyExecutablePath = "python"
} }
result, err := p.op.RunCommand(ctx, fmt.Sprintf("%s %s", pyExecutablePath, filePath)) result, err := p.op.RunCommand(ctx, []string{pyExecutablePath, filePath})
if err != nil { if err != nil {
return "", fmt.Errorf("execute error: %w", err) if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
} }
if strings.HasPrefix(result, "internal error") { return "", fmt.Errorf("execute error: %w", err)
result = fmt.Sprintf("%s\n\n code after parse:\n%v", result, code)
} }
return result, nil return utils.FormatCommandOutput(result), nil
} }
func tryExtractCodeSnippet(res string) string { func tryExtractCodeSnippet(res string) string {

@ -20,7 +20,9 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/integration-excel-agent/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline" "github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
@ -85,10 +87,12 @@ func (r *readFile) InvokableRun(ctx context.Context, argumentsInJSON string, opt
o := tool.GetImplSpecificOptions(&options{op: r.op}) o := tool.GetImplSpecificOptions(&options{op: r.op})
cmd := fmt.Sprintf("python3 -c \"import sys; lines = (line for idx, line in enumerate(open(sys.argv[1], encoding='utf-8')) if %d <= idx < %d); print(''.join(lines))\" %s", cmd := fmt.Sprintf("python3 -c \"import sys; lines = (line for idx, line in enumerate(open(sys.argv[1], encoding='utf-8')) if %d <= idx < %d); print(''.join(lines))\" %s",
input.StartRow, input.StartRow+input.NRows, input.Path) input.StartRow, input.StartRow+input.NRows, input.Path)
content, err := o.op.RunCommand(ctx, cmd) content, err := o.op.RunCommand(ctx, []string{cmd})
if err != nil { if err != nil {
if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", err return "", err
} }
return utils.FormatCommandOutput(content), nil
return content, nil
} }

@ -19,8 +19,9 @@ package tools
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "strings"
"github.com/cloudwego/eino-examples/adk/multiagent/integration-excel-agent/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline" "github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
@ -67,5 +68,12 @@ func (t *tree) InvokableRun(ctx context.Context, argumentsInJSON string, opts ..
return "path can not be empty", nil return "path can not be empty", nil
} }
o := tool.GetImplSpecificOptions(&options{t.op}, opts...) o := tool.GetImplSpecificOptions(&options{t.op}, opts...)
return o.op.RunCommand(ctx, fmt.Sprintf("find %s", input.Path)) output, err := o.op.RunCommand(ctx, []string{"find", input.Path})
if err != nil {
if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", err
}
return utils.FormatCommandOutput(output), nil
} }

@ -23,6 +23,7 @@ import (
"time" "time"
"github.com/bytedance/sonic" "github.com/bytedance/sonic"
"github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/adk" "github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/adk/prebuilt/planexecute" "github.com/cloudwego/eino/adk/prebuilt/planexecute"
"github.com/kaptinlin/jsonrepair" "github.com/kaptinlin/jsonrepair"
@ -114,3 +115,7 @@ func FormatExecutedSteps(in []planexecute.ExecutedStep) string {
} }
return sb.String() return sb.String()
} }
func FormatCommandOutput(output *commandline.CommandOutput) string {
return fmt.Sprintf("---\nstdout:%v\n---\nstderr:%v\n---", output.Stdout, output.Stderr)
}

@ -15,7 +15,7 @@ require (
github.com/cloudwego/eino-ext/components/model/ollama v0.1.2 github.com/cloudwego/eino-ext/components/model/ollama v0.1.2
github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250826125654-37d4a5029810 github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250826125654-37d4a5029810
github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250319082935-6219ec437e56 github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250319082935-6219ec437e56
github.com/cloudwego/eino-ext/components/tool/commandline v0.0.0-20251020080234-ca9942893983 github.com/cloudwego/eino-ext/components/tool/commandline v0.0.0-20251111090228-91a10bbc864f
github.com/cloudwego/eino-ext/components/tool/duckduckgo/v2 v2.0.0-20250826125654-37d4a5029810 github.com/cloudwego/eino-ext/components/tool/duckduckgo/v2 v2.0.0-20250826125654-37d4a5029810
github.com/cloudwego/eino-ext/devops v0.1.7 github.com/cloudwego/eino-ext/devops v0.1.7
github.com/coze-dev/cozeloop-go v0.1.11 github.com/coze-dev/cozeloop-go v0.1.11

@ -131,8 +131,8 @@ github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250826125654-37d4
github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250826125654-37d4a5029810/go.mod h1:QQhCuQxuBAVWvu/YAZBhs/RsR76mUigw59Tl0kh04C8= github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250826125654-37d4a5029810/go.mod h1:QQhCuQxuBAVWvu/YAZBhs/RsR76mUigw59Tl0kh04C8=
github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250319082935-6219ec437e56 h1:yL7nTthGoz35dh7RK9lazxDedGmSmlss8HrtXmd0O3Q= github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250319082935-6219ec437e56 h1:yL7nTthGoz35dh7RK9lazxDedGmSmlss8HrtXmd0O3Q=
github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250319082935-6219ec437e56/go.mod h1:OPQYefu4EWAUcP0HhtzJK+UjLtQc8T9YzmxcAwFf29o= github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250319082935-6219ec437e56/go.mod h1:OPQYefu4EWAUcP0HhtzJK+UjLtQc8T9YzmxcAwFf29o=
github.com/cloudwego/eino-ext/components/tool/commandline v0.0.0-20251020080234-ca9942893983 h1:hBlj/kcsBY9hx4N7h2PinCTBLU8ssw8sO/svUUxE28Q= github.com/cloudwego/eino-ext/components/tool/commandline v0.0.0-20251111090228-91a10bbc864f h1:JkELXl5NquNnDgi81T3uiPfgpfcXzH81e3B/NDO4cwM=
github.com/cloudwego/eino-ext/components/tool/commandline v0.0.0-20251020080234-ca9942893983/go.mod h1:Ro6u8M4lPc6r6oRWaKnGz/sJnY60GpYKsxpUK/yr01k= github.com/cloudwego/eino-ext/components/tool/commandline v0.0.0-20251111090228-91a10bbc864f/go.mod h1:WfhOxJY7J2ZqY9muahNOMtypoe4ovcAG1E97y4bQPfU=
github.com/cloudwego/eino-ext/components/tool/duckduckgo/v2 v2.0.0-20250826125654-37d4a5029810 h1:VtmhPdOY6wFR34Hdm4HNzWF9bwGz11x1TqBr8VpJDoc= github.com/cloudwego/eino-ext/components/tool/duckduckgo/v2 v2.0.0-20250826125654-37d4a5029810 h1:VtmhPdOY6wFR34Hdm4HNzWF9bwGz11x1TqBr8VpJDoc=
github.com/cloudwego/eino-ext/components/tool/duckduckgo/v2 v2.0.0-20250826125654-37d4a5029810/go.mod h1:QB9TkAu6OVDvQm5hEoK+VFVIbfDHO+ZQyUR2cPSo6jk= github.com/cloudwego/eino-ext/components/tool/duckduckgo/v2 v2.0.0-20250826125654-37d4a5029810/go.mod h1:QB9TkAu6OVDvQm5hEoK+VFVIbfDHO+ZQyUR2cPSo6jk=
github.com/cloudwego/eino-ext/devops v0.1.7 h1:w8q4SGDtrZk+8WUrLyVidX7GNsyWFsYPPz5HoJKgRcA= github.com/cloudwego/eino-ext/devops v0.1.7 h1:w8q4SGDtrZk+8WUrLyVidX7GNsyWFsYPPz5HoJKgRcA=

Loading…
Cancel
Save