e0e362d700
SDK Tests / changes (push) Successful in 2m29s
Real E2E Tests / changes (push) Successful in 2m29s
Deploy Docs Pages / build (push) Has been cancelled
Deploy Docs Pages / deploy (push) Has been cancelled
Real E2E Tests / JavaScript E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Python E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Java E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / C# E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Go E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Real E2E CI (push) Has been cancelled
SDK Tests / SDK CI (push) Has been cancelled
SDK Tests / CLI Tests (push) Has been cancelled
SDK Tests / Python SDK Quality (code-interpreter) (push) Has been cancelled
SDK Tests / Python SDK Quality (sandbox) (push) Has been cancelled
SDK Tests / Python SDK Tests (code-interpreter) (push) Has been cancelled
SDK Tests / JavaScript SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / JavaScript SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Python SDK Tests (sandbox) (push) Has been cancelled
SDK Tests / CLI Quality (push) Has been cancelled
SDK Tests / Kotlin SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Kotlin SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / C# SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / C# SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Go SDK Quality And Tests (push) Has been cancelled
122 lines
3.8 KiB
Go
122 lines
3.8 KiB
Go
// Copyright 2026 Alibaba Group Holding Ltd.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package opensandbox
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
// CodeInterpreterImage is the default container image for the code interpreter.
|
|
const CodeInterpreterImage = "opensandbox/code-interpreter:latest"
|
|
|
|
// CodeInterpreterEntrypoint is the default entrypoint for the code interpreter.
|
|
var CodeInterpreterEntrypoint = []string{"/opt/code-interpreter/code-interpreter.sh"}
|
|
|
|
// CodeInterpreterCreateOptions configures code interpreter creation.
|
|
type CodeInterpreterCreateOptions struct {
|
|
// Image overrides the default code-interpreter image.
|
|
Image string
|
|
|
|
// Entrypoint overrides the default code-interpreter entrypoint.
|
|
Entrypoint []string
|
|
|
|
// ResourceLimits for the sandbox. Defaults to DefaultResourceLimits.
|
|
ResourceLimits ResourceLimits
|
|
|
|
// TimeoutSeconds is the sandbox TTL. Defaults to 900 (15 min).
|
|
TimeoutSeconds *int
|
|
|
|
// Env variables injected into the sandbox.
|
|
Env map[string]string
|
|
|
|
// Metadata for filtering and tagging.
|
|
Metadata map[string]string
|
|
|
|
// SkipHealthCheck skips the WaitUntilReady call.
|
|
SkipHealthCheck bool
|
|
|
|
// ReadyTimeout overrides the default ready timeout.
|
|
ReadyTimeout time.Duration
|
|
|
|
// HealthCheckInterval overrides the default polling interval.
|
|
HealthCheckInterval time.Duration
|
|
}
|
|
|
|
// CodeInterpreter wraps a Sandbox with code execution capabilities.
|
|
// It provides multi-language code execution with persistent contexts.
|
|
type CodeInterpreter struct {
|
|
*Sandbox
|
|
}
|
|
|
|
// CreateCodeInterpreter creates a sandbox with the code-interpreter image
|
|
// and returns a CodeInterpreter wrapping it.
|
|
func CreateCodeInterpreter(ctx context.Context, config ConnectionConfig, opts CodeInterpreterCreateOptions) (*CodeInterpreter, error) {
|
|
image := opts.Image
|
|
if image == "" {
|
|
image = CodeInterpreterImage
|
|
}
|
|
entrypoint := opts.Entrypoint
|
|
if len(entrypoint) == 0 {
|
|
entrypoint = CodeInterpreterEntrypoint
|
|
}
|
|
timeout := opts.TimeoutSeconds
|
|
if timeout == nil {
|
|
t := DefaultCodeInterpreterTimeoutSeconds
|
|
timeout = &t
|
|
}
|
|
|
|
sb, err := CreateSandbox(ctx, config, SandboxCreateOptions{
|
|
Image: image,
|
|
Entrypoint: entrypoint,
|
|
ResourceLimits: opts.ResourceLimits,
|
|
TimeoutSeconds: timeout,
|
|
Env: opts.Env,
|
|
Metadata: opts.Metadata,
|
|
SkipHealthCheck: opts.SkipHealthCheck,
|
|
ReadyTimeout: opts.ReadyTimeout,
|
|
HealthCheckInterval: opts.HealthCheckInterval,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &CodeInterpreter{Sandbox: sb}, nil
|
|
}
|
|
|
|
// Execute runs code in the specified language and returns the structured result.
|
|
// If language is non-empty, it is sent as CodeContext.Language.
|
|
func (ci *CodeInterpreter) Execute(ctx context.Context, language, code string, handlers *ExecutionHandlers) (*Execution, error) {
|
|
req := RunCodeRequest{
|
|
Code: code,
|
|
}
|
|
if language != "" {
|
|
req.Context = &CodeContext{Language: language}
|
|
}
|
|
return ci.ExecuteCode(ctx, req, handlers)
|
|
}
|
|
|
|
// ExecuteInContext runs code in an existing context (for state persistence).
|
|
func (ci *CodeInterpreter) ExecuteInContext(ctx context.Context, contextID, language, code string, handlers *ExecutionHandlers) (*Execution, error) {
|
|
req := RunCodeRequest{
|
|
Context: &CodeContext{
|
|
ID: contextID,
|
|
Language: language,
|
|
},
|
|
Code: code,
|
|
}
|
|
return ci.ExecuteCode(ctx, req, handlers)
|
|
}
|