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/exec"
"runtime"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/deep/params"
"github.com/cloudwego/eino-ext/components/tool/commandline"
)
type LocalOperator struct{}
@ -49,18 +51,18 @@ func (l *LocalOperator) Exists(ctx context.Context, path string) (bool, error) {
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)
if !ok {
return "", fmt.Errorf("work dir not found")
return nil, fmt.Errorf("work dir not found")
}
var shellCmd []string
switch runtime.GOOS {
case "windows":
shellCmd = []string{"cmd.exe", "/C", command}
shellCmd = append([]string{"cmd.exe", "/C"}, command...)
default:
shellCmd = []string{"/bin/sh", "-c", command}
shellCmd = []string{"/bin/sh", "-c", strings.Join(command, " ")}
}
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
err := cmd.Run()
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 (
"context"
"encoding/json"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/deep/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool"
"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
}
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"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/deep/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema"
@ -84,14 +85,14 @@ func (p *pythonRunnerTool) InvokableRun(ctx context.Context, argumentsInJSON str
if pyExecutablePath == "" {
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 strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", fmt.Errorf("execute error: %w", err)
}
if strings.HasPrefix(result, "internal error") {
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 {

@ -20,7 +20,9 @@ import (
"context"
"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/components/tool"
"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})
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)
content, err := o.op.RunCommand(ctx, cmd)
content, err := o.op.RunCommand(ctx, []string{cmd})
if err != nil {
if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", err
}
return content, nil
return utils.FormatCommandOutput(content), nil
}

@ -19,8 +19,9 @@ package tools
import (
"context"
"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/components/tool"
"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
}
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"
"github.com/bytedance/sonic"
"github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/adk/prebuilt/planexecute"
"github.com/kaptinlin/jsonrepair"
@ -114,3 +115,7 @@ func FormatExecutedSteps(in []planexecute.ExecutedStep) 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/exec"
"runtime"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/integration-excel-agent/params"
"github.com/cloudwego/eino-ext/components/tool/commandline"
)
type LocalOperator struct{}
@ -49,18 +51,18 @@ func (l *LocalOperator) Exists(ctx context.Context, path string) (bool, error) {
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)
if !ok {
return "", fmt.Errorf("work dir not found")
return nil, fmt.Errorf("work dir not found")
}
var shellCmd []string
switch runtime.GOOS {
case "windows":
shellCmd = []string{"cmd.exe", "/C", command}
shellCmd = append([]string{"cmd.exe", "/C"}, command...)
default:
shellCmd = []string{"/bin/sh", "-c", command}
shellCmd = []string{"/bin/sh", "-c", strings.Join(command, " ")}
}
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
err := cmd.Run()
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 (
"context"
"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/components/tool"
"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
}
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"
"strings"
"github.com/cloudwego/eino-examples/adk/multiagent/integration-excel-agent/utils"
"github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema"
@ -84,14 +85,14 @@ func (p *pythonRunnerTool) InvokableRun(ctx context.Context, argumentsInJSON str
if pyExecutablePath == "" {
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 strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", fmt.Errorf("execute error: %w", err)
}
if strings.HasPrefix(result, "internal error") {
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 {

@ -20,7 +20,9 @@ import (
"context"
"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/components/tool"
"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})
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)
content, err := o.op.RunCommand(ctx, cmd)
content, err := o.op.RunCommand(ctx, []string{cmd})
if err != nil {
if strings.HasPrefix(err.Error(), "internal error") {
return err.Error(), nil
}
return "", err
}
return content, nil
return utils.FormatCommandOutput(content), nil
}

@ -19,8 +19,9 @@ package tools
import (
"context"
"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/components/tool"
"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
}
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"
"github.com/bytedance/sonic"
"github.com/cloudwego/eino-ext/components/tool/commandline"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/adk/prebuilt/planexecute"
"github.com/kaptinlin/jsonrepair"
@ -114,3 +115,7 @@ func FormatExecutedSteps(in []planexecute.ExecutedStep) 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/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/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/devops v0.1.7
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/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/tool/commandline v0.0.0-20251020080234-ca9942893983 h1:hBlj/kcsBY9hx4N7h2PinCTBLU8ssw8sO/svUUxE28Q=
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 h1:JkELXl5NquNnDgi81T3uiPfgpfcXzH81e3B/NDO4cwM=
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/go.mod h1:QB9TkAu6OVDvQm5hEoK+VFVIbfDHO+ZQyUR2cPSo6jk=
github.com/cloudwego/eino-ext/devops v0.1.7 h1:w8q4SGDtrZk+8WUrLyVidX7GNsyWFsYPPz5HoJKgRcA=

Loading…
Cancel
Save