aboutsummaryrefslogtreecommitdiff
path: root/llm/codeinterpreter/python/python.go
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2024-08-01 19:25:46 -0400
committerXe Iaso <me@xeiaso.net>2024-08-01 19:25:46 -0400
commitbdcd9eb26211bb5b10b1c41a2ffc609933d46033 (patch)
tree3a69390ea9c377518e8e4ab44893918c4bebd969 /llm/codeinterpreter/python/python.go
parent7041695d49386f6e2cf660179c55f7f8a93b5ed3 (diff)
downloadx-bdcd9eb26211bb5b10b1c41a2ffc609933d46033.tar.xz
x-bdcd9eb26211bb5b10b1c41a2ffc609933d46033.zip
cmd/mimi: try having mimi run Python
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'llm/codeinterpreter/python/python.go')
-rw-r--r--llm/codeinterpreter/python/python.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/llm/codeinterpreter/python/python.go b/llm/codeinterpreter/python/python.go
new file mode 100644
index 0000000..06457b1
--- /dev/null
+++ b/llm/codeinterpreter/python/python.go
@@ -0,0 +1,77 @@
+package python
+
+import (
+ "bytes"
+ "context"
+ _ "embed"
+ "fmt"
+ "os"
+
+ "github.com/tetratelabs/wazero"
+ "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
+)
+
+var (
+ //go:embed python.wasm
+ Binary []byte
+
+ r wazero.Runtime
+ code wazero.CompiledModule
+)
+
+func init() {
+ ctx := context.Background()
+ r = wazero.NewRuntime(ctx)
+
+ wasi_snapshot_preview1.MustInstantiate(ctx, r)
+
+ var err error
+ code, err = r.CompileModule(ctx, Binary)
+ if err != nil {
+ panic(err)
+ }
+}
+
+type Result struct {
+ Stdout string
+ Stderr string
+}
+
+func Run(ctx context.Context, tmpDir, userCode string) (*Result, error) {
+ fout := &bytes.Buffer{}
+ ferr := &bytes.Buffer{}
+ fin := &bytes.Buffer{}
+
+ os.WriteFile(tmpDir+"/main.py", []byte(userCode), 0644)
+
+ fsConfig := wazero.NewFSConfig().
+ WithFSMount(os.DirFS(tmpDir), "/")
+
+ config := wazero.NewModuleConfig().
+ // stdio
+ WithStdout(fout).
+ WithStderr(ferr).
+ WithStdin(fin).
+ // argv
+ WithArgs("python", "/main.py").
+ WithName("python").
+ // fs / system
+ WithFSConfig(fsConfig).
+ WithSysNanosleep().
+ WithSysNanotime().
+ WithSysWalltime()
+
+ mod, err := r.InstantiateModule(ctx, code, config)
+ if err != nil {
+ fmt.Println(fout.String())
+ fmt.Println(ferr.String())
+ return nil, err
+ }
+
+ defer mod.Close(ctx)
+
+ return &Result{
+ Stdout: fout.String(),
+ Stderr: ferr.String(),
+ }, nil
+}