CAMEL Runtimes 深度指南:LLMGuard、Docker、RemoteHttp 与 Daytona 四种代码执行沙箱的架构与实战 📅 发布时间:2026/9/14 16:12:57 👁 浏览次数: CAMEL Runtimes 深度指南LLMGuard、Docker、RemoteHttp 与 Daytona 四种代码执行沙箱的架构与实战【免费下载链接】camel CAMEL: The first and the best multi-agent framework. Finding the Scaling Law of Agents. https://www.camel-ai.org项目地址: https://gitcode.com/GitHub_Trending/ca/camel导读CAMEL 的runtime运行时模块为 Agent 的代码与工具执行提供了安全、灵活且相互隔离的执行环境覆盖从进程内安全审查LLMGuardRuntime、Docker 容器隔离DockerRuntime / UbuntuDockerRuntime到远程 HTTP 分发RemoteHttpRuntime与云端托管沙箱DaytonaRuntime的全谱系方案。本文以 docs/key_modules/runtimes.md 为骨架结合仓库源码与可运行示例讲解每种运行时的工作机理、核心 API、关键参数与适用场景读完你可以根据“安全性、隔离性、扩展性、成本”四个维度为自己的 Agent 工具链选择并落地正确的执行沙箱。什么是 Runtimes现代 Agent 系统的执行需求远超一个简单的解释器被调用的工具可能来自不可信来源可能访问文件系统、执行任意代码也可能需要跨机器分发计算。Runtimes正是为此设计的一层执行抽象——通过安全护栏guardrails、容器隔离isolation或远程/云端端点remote/cloud endpoints为复杂或不可信代码提供安全、可扩展的执行通道。在 CAMEL 中runtime 的核心职责是托管FunctionTool形式的工具函数把原本在本地进程内直接执行的函数包装为经过风险审查、或运行在容器/远端沙箱中的安全版本。从源码结构看整个模块由以下文件组成见 camel/runtimes/init.pybase.py抽象基类BaseRuntimellm_guard_runtime.py基于 LLM 的风险评估运行时docker_runtime.py、ubuntu_docker_runtime.py容器隔离运行时remote_http_runtime.py远程 HTTP 分发运行时daytona_runtime.pyDaytona 云沙箱运行时api.py容器/远程运行时内部使用的 FastAPI 工具服务configs.py容器内任务执行配置TaskConfigutils/风险审查相关的FunctionRiskToolkit、IgnoreRiskToolkit等工具包。此外__init__.py中留有 TODO 注释计划增加支持分布式计算、限流与负载均衡的 Celery Runtime可见该模块仍在持续演进。统一运行时接口BaseRuntime所有运行时都继承自BaseRuntimecamel/runtimes/base.py它定义了统一的生命周期与工具管理 APIadd(funcs, *args, **kwargs)注册一个或多个FunctionTool对象供运行时执行抽象方法各运行时按需扩展签名reset()将运行时重置到初始状态抽象方法例如 DockerRuntime 会stop().build()重建容器get_tools()返回运行时当前管理的全部工具列表cleanup()释放外部资源容器、进程、连接等是生命周期 API 的公共部分stop()调用cleanup()并返回自身支持链式调用上下文管理器支持with runtime:进入/退出时自动触发build()与cleanup()实现确定性回收。基类内部通过self.tools_map一个Dict[str, FunctionTool]保存已注册工具get_tools()直接返回list(self.tools_map.values())。值得注意的细节是各个运行时在add()中都会用闭包包装wrapper替换原始func.func从而把“本地直接调用”变成“经风险审查/发往远端执行”的调用这是整个 runtime 机制的核心实现手法。LLMGuardRuntime用大模型为函数调用把关LLMGuardRuntime是安全护栏层运行时在真正执行函数之前先让一个 LLM Agent 评估该函数调用函数名 描述 实际参数的风险等级再依据阈值决定放行或拦截camel/runtimes/llm_guard_runtime.py。风险评分机制1–3 分LLM 评估依据内置的GUARDPROMPT系统提示词通过function_risk工具给出评分与理由评分含义典型场景1无危害数学计算、内容搜索、数据检索等不触碰环境与敏感资源的操作或“能力危险但参数安全”的调用2轻微危害读取用户文件、获取非敏感数据等低风险资源访问3存在风险删除文件、修改文件系统、执行任意代码、访问敏感数据等但如果实际参数明确指示受限的安全用法评分应相应下调阈值控制与放行逻辑add(funcs, threshold2)注册函数时可指定风险阈值默认2。评估得分score threshold时拦截调用并返回包含失败原因的错误信息否则放行执行原始函数。评估流程对应源码wrapper中的逻辑每次调用前agent.init_messages()清空会话 → 将函数名、描述、args、kwargs 交给ChatAgent评估 → 解析external_tool_call_requests中的score与reason→ 与阈值比较后决定执行或拒绝。通过IgnoreRiskToolkit支持“忽略风险”白名单对已加入忽略列表的函数直接执行跳过 LLM 评估。初始化参数prompt评估用系统提示词默认GUARDPROMPTmodel评估所用 LLM缺省时通过ModelFactory创建平台默认模型ModelPlatformType.DEFAULTModelType.DEFAULTverbose是否打印评估过程输出。cleanup()为空实现不持有外部资源reset()会清空忽略列表并重置内部 Agent。可运行的完整示例见 examples/runtimes/code_execution_with_llm_guard_runtime.py对应测试见 test/runtimes/test_code_execution_with_llm_guard_runtime.py。DockerRuntime容器级隔离与工具端点服务DockerRuntime把注册的工具函数包装为对容器内 FastAPI 服务端点的 HTTP 调用实现隔离、可复现的执行环境camel/runtimes/docker_runtime.py。核心概念与参数image运行时使用的 Docker 镜像名若本地不存在构造时自动从 Docker Hub 拉取。port暴露给宿主的 API 端口默认8000传0或负数时会自动分配随机端口randint(10000, 20000)。remove停止后是否删除容器默认True。**kwargs透传给 Docker 客户端如environment、volumes、ports等容器配置。常用方法构建与运维mount(path, mount_path)把本地绝对路径目录以 bind mount 方式挂载进容器要求本地路径存在且为目录、两侧均为绝对路径。copy(source, dest)把本地文件/目录打包成 tar 后复制进容器put_archive。add_task(task)/exec_run(task)配置并执行容器内命令类似docker exectask为TaskConfig对象。build(time_out15)创建并启动容器默认命令sleep infinity保活、复制文件、执行预置任务最后在容器内以python3 api.py启动工具 API 服务。wait(timeout10)/ok轮询等待 API 服务就绪docs属性返回http://localhost:{port}/docs可直接在浏览器查看自动生成的 API 文档。add() 的执行链路add(funcs, entrypoint, redirect_stdoutFalse, argumentsNone)中entrypoint是容器内 API 服务导入工具的模块路径如camel.toolkits.MathToolkitarguments可为工具类提供初始化参数会被 JSON 序列化后拼入入口字符串。包装后的函数通过requests.post向http://localhost:{port}/{function_name}发送{args, kwargs, redirect_stdout}服务端执行后返回{output, stdout}客户端json.loads还原结果当redirect_stdoutTrue时还会把容器端捕获的标准输出打印到本地。容器内的工具服务由 camel/runtimes/api.py 提供它是一个 FastAPI 应用启动时读取sys.argv[1:]中的模块路径逐个importlib.import_module若导入的是BaseToolkit子类则实例化并取其全部工具为每个工具注册一个POST /{tool_name}端点同步工具经 4 线程的ThreadPoolExecutor调度避免阻塞事件循环例如 Playwright 同步 API/health端点会报告已加载的 toolkit 与端点列表且服务端设置了CAMEL_RUNTIMEtrue环境变量以标识运行环境。容器内任务配置 TaskConfigTaskConfigcamel/runtimes/configs.py是一个 Pydantic 模型直接对应 Dockerexec_run的底层参数用于add_task/exec_run字段类型默认值说明cmdstr / list必填要执行的命令stdout/stderrboolTrue是否挂接标准输出/错误stdinboolFalse是否挂接标准输入ttyboolFalse是否分配伪终端privilegedboolFalse是否以特权模式运行userstr执行命令的用户detachboolFalse是否分离执行streamboolFalse是否流式返回socketboolFalse返回连接 socketenvironmentdict / listNone环境变量支持{PASSWORD: xxx}或[PASSWORDxxx]workdirstrNone执行会话的工作目录demuxboolFalsestdout/stderr 是否分开返回示例脚本见 examples/runtimes/docker_runtime.py 与 examples/runtimes/docker_runtime_with_tasks.py测试见 test/runtimes/test_docker_runtime.py。UbuntuDockerRuntime面向 Ubuntu 环境的脚本执行增强UbuntuDockerRuntime继承自DockerRuntime针对 Ubuntu 容器做了专门的 Python 环境配置与脚本执行能力增强camel/runtimes/ubuntu_docker_runtime.py。环境预配置初始化时自动设置容器环境变量并校验 Python 安装PYTHON_PATH/PYTHON_EXECUTABLE指向容器内 Python 解释器默认/usr/bin/python3PATH/usr/local/bin:/usr/bin:/binPYTHONUNBUFFERED1禁用输出缓冲默认工作目录/app可通过working_dir覆盖。build()在父类构建基础上额外执行校验python3 --version、apt-get update、安装curl然后以显式 Python 路径与PYTHONPATH.../lib/python3.10/site-packages启动/home/api.py并通过容器内curl轮询/docs状态码确认 API 服务就绪。add()还会把函数命令中的python替换为配置的解释器路径。exec_python_file()运行动态生成的脚本文档特别强调对于 Agent 层面的动态代码执行应优先考虑exec_python_file()以获得最大隔离性。其签名与行为如下local_file_path本地 Python 文件路径必须存在否则抛FileNotFoundErrorcontainer_path文件在容器内的目标路径缺省复制到/tmp/{文件名}args传给脚本的命令行参数列表env附加环境变量默认注入PYTHONPATH与PYTHON_EXECUTABLEcallback逐行处理输出的回调缺省时直接打印stdout/stderr 分离。实现上先用 tar 归档 put_archive把脚本复制进容器再以exec_run(streamTrue, demuxTrue)流式执行并区分 stdout 与 stderr适合运行长任务或需要实时观察输出的场景。配套的完整 Dockerfile、容器管理脚本与示例见 examples/runtimes/ubuntu_docker_runtime/其中ubuntu_docker_example.py演示了把ai_society/role_playing.py传入容器执行并注入OPENAI_API_KEY环境变量的用法。RemoteHttpRuntime远程分布式的工具执行RemoteHttpRuntime让工具函数运行在远程 FastAPI 服务器上适合分布式、可扩展或跨服务器执行场景camel/runtimes/remote_http_runtime.py。与原文档一致的快速上手示例原文档提供的 Quick Start 代码可直接运行对应的完整版在 examples/runtimes/remote_http_runtime.pyfrom camel.runtimes import RemoteHttpRuntime from camel.toolkits import MathToolkit if __name__ __main__: runtime ( RemoteHttpRuntime(localhost) .add(MathToolkit().get_tools(), camel.toolkits.MathToolkit) .build() ) print(Waiting for runtime to be ready...) runtime.wait() print(Runtime is ready.) # There are more tools imported from MathToolkit. # For simplicity, we use only add tool here add runtime.get_tools()[0] print(fAdd 1 2: {add.func(1, 2)}) # Example output: # Add 1 2: 3运行输出完整示例中为Waiting for runtime to be ready... Runtime is ready. Add 1 2: 3 Subtract 5 - 3: 2 Multiply 2 * 3: 6 Documents: http://localhost:8000/docs工作机制与参数构造参数host远程服务器地址、port默认8000、python_exec启动 API 服务所用的 Python默认python3。build()用subprocess.Popen在本机启动 camel/runtimes/api.py 作为 API 服务并注册atexit钩子确保进程退出时自动回收若目标是远程服务器则需先在远端手动运行该 API 服务此时本机RemoteHttpRuntime直接连接远端host:port。add(funcs, entrypoint, redirect_stdoutFalse, argumentsNone)与 DockerRuntime 的语义一致包装函数通过requests.post访问http://{host}:{port}/{function_name}完成调用Pydantic 模型参数会被自动model_dump()序列化。wait(timeout10)轮询健康状态docs返回远端 API 文档地址reset()实现为stop().build()__del__与atexit双重保障资源释放。底层 API 服务api.py同样基于 FastAPI uvicorn 运行在0.0.0.0:8000reloadFalse避免与 Playwright 等异步 toolkit 冲突并通过线程池支持同步工具的并发执行。对应测试见 test/runtimes/test_remote_http_runtime.py。DaytonaRuntime云端托管的远程沙箱DaytonaRuntime使用 Daytona SDK 在云端托管沙箱中运行代码把上传源码、执行与输入/输出捕获交给云服务商管理换取资源与安全保证camel/runtimes/daytona_runtime.py。初始化参数api_keyDaytona API 密钥缺省读取环境变量DAYTONA_API_KEYapi_urlDaytona 服务器地址缺省读取DAYTONA_API_URL均未提供时回退到http://localhost:8000language沙箱语言可选python、typescript、javascript默认pythonimage沙箱使用的 Docker 镜像缺省按语言选择内置默认镜像python:3.11、node:20、node:20。执行链路build()通过CreateSandboxFromImageParams(image, language)创建沙箱成功后记录沙箱 ID。add(funcs, entrypoint, argumentsNone)用inspect.getsource提取每个函数的源码包装函数执行时先把函数源码upload_file上传到沙箱/home/daytona/{func_name}.py再拼接一段导入函数、反序列化 args/kwargs、调用并json.dumps结果的执行代码交给sandbox.process.code_run()运行最后解析 JSON 返回结果。info()返回沙箱状态与 CPU/内存资源信息reset()为stop().build()cleanup()调用daytona.delete(sandbox)释放沙箱。使用前提使用前需要Daytona 服务端已运行、已配置 API 密钥且环境中安装daytona_sdk代码在__init__中惰性导入。示例见 examples/runtimes/daytona_runtime.py测试见 test/runtimes/test_daytona_runtime.py。运行时选型对比与更多示例四种运行时的定位差异可以概括为运行时隔离级别执行位置主要优势典型场景LLMGuardRuntime进程内逻辑护栏本地零额外基础设施LLM 动态风险判断快速给现有工具加安全审查层DockerRuntime容器隔离本地 Docker隔离 可复现自动注册 HTTP 工具端点工具函数沙箱执行、多工具共享环境UbuntuDockerRuntime容器隔离本地 Docker完整脚本执行、环境变量注入、流式输出运行动态生成的 Python 脚本RemoteHttpRuntime进程外远程远程服务器分布式扩展、跨机执行、卸载重活远程/集群环境分发工具调用DaytonaRuntime云端沙箱云托管资源与安全由云保证多语言支持需要托管式沙箱的隔离执行更多可运行脚本集中在 examples/runtimes/ 目录包括code_execution_with_docker_runtime.py、code_execution_with_llm_guard_runtime.py、docker_runtime_with_tasks.py、shared_runtime_multi_toolkit.py以及ubuntu_docker_runtime/子目录含 Dockerfile、manage_camel_docker.sh与ubuntu_docker_example.py每个脚本都演示了对应运行时从初始化到释放的完整流程。此外 test/runtimes/test_shared_runtime.py 与 test/runtimes/test_base_runtime.py 覆盖了多工具共享运行时与基类生命周期行为。最后一点提醒工具沙箱 ≠ 动态代码执行需要明确的是runtime 体系主要沙箱化的是FunctionTool形式的工具函数——即把“预定义好的工具调用”包装到受控环境中执行。对于 Agent 层面动态生成代码的执行需求文档强调应始终考虑专用的沙箱方案例如使用UbuntuDockerRuntime的exec_python_file()来运行动态生成的脚本从而在最大程度上获得隔离性与安全性。在编排自己的 Agent 时建议根据任务对隔离性、执行位置、资源上限与基础设施成本的权衡选择或组合上述运行时本地可信工具用LLMGuardRuntime加护栏不可信或副作用强的工具进DockerRuntime需要脚本级执行的用UbuntuDockerRuntime跨机分发用RemoteHttpRuntime追求托管式安全沙箱则用DaytonaRuntime。【免费下载链接】camel CAMEL: The first and the best multi-agent framework. Finding the Scaling Law of Agents. https://www.camel-ai.org项目地址: https://gitcode.com/GitHub_Trending/ca/camel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考