import{s as Qe,a as Ie,n as Ae,o as Xe}from"../chunks/scheduler.00b97157.js";import{S as Oe,i as Ye,e as s,s as o,c as r,h as Re,a,d as l,b as i,f as Ne,g as f,j as p,k as Ce,l as Fe,m as n,n as c,t as g,o as b,p as M}from"../chunks/index.a7c1a7a1.js";import{C as Ke,H as $e,E as De}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.4b5f77d2.js";import{C as et}from"../chunks/CodeBlock.7a3aa7b0.js";import{D as tt}from"../chunks/DocNotebookDropdown.be7b60e3.js";function lt(xe){let u,I,N,A,d,X,h,O,_,Y,m,ve='<p>如果你是第一次构建 agent，请先阅读 <a href="../conceptual_guides/intro_agents">agent 介绍</a> 和 <a href="../guided_tour">smolagents 导览</a>。</p>',R,y,F,C,Te='<a href="https://huggingface.co/papers/2402.01030" rel="nofollow">多项</a> <a href="https://huggingface.co/papers/2411.01747" rel="nofollow">研究</a> <a href="https://huggingface.co/papers/2401.00812" rel="nofollow">表明</a>，让大语言模型用代码编写其动作（工具调用）比当前标准的工具调用格式要好得多，目前行业标准是 “将动作写成包含工具名称和参数的 JSON” 的各种变体。',K,$,we="为什么代码更好？因为我们专门为计算机执行的动作而设计编程语言。如果 JSON 片段是更好的方式，那么这个工具包就应该是用 JSON 片段编写的，魔鬼就会嘲笑我们。",D,x,Le="代码就是表达计算机动作的更好方式。它具有更好的：",ee,v,Ue="<li><strong>组合性</strong>：你能像定义 Python 函数那样，在 JSON 动作中嵌套其他 JSON 动作，或者定义一组 JSON 动作以便以后重用吗？</li> <li><strong>对象管理</strong>：你如何在 JSON 中存储像 <code>generate_image</code> 这样的动作的输出？</li> <li><strong>通用性</strong>：代码是为了简单地表达任何可以让计算机做的事情而构建的。</li> <li><strong>在 LLM 训练语料库中的表示</strong>：天赐良机，为什么不利用已经包含在 LLM 训练语料库中的大量高质量动作呢？</li>",te,T,Pe='下图展示了这一点，取自 <a href="https://huggingface.co/papers/2402.01030" rel="nofollow">可执行代码动作引出更好的 LLM 智能体</a>。',le,G,ke,ne,w,Je="这就是为什么我们强调提出代码智能体，在本例中是 Python 智能体，这意味着我们要在构建安全的 Python 解释器上投入更多精力。",oe,L,ie,U,He=`默认情况下，<code>CodeAgent</code> 会在你的环境中运行 LLM 生成的代码。
这个执行不是由普通的 Python 解释器完成的：我们从零开始重新构建了一个更安全的 <code>LocalPythonExecutor</code>。
这个解释器通过以下方式设计以确保安全：`,se,P,je="<li>将导入限制为用户显式传递的列表</li> <li>限制操作次数以防止无限循环和资源膨胀</li> <li>不会执行任何未预定义的操作</li>",ae,k,Be="我们已经在许多用例中使用了这个解释器，从未观察到对环境造成任何损害。",pe,J,Ee=`然而，这个解决方案并不是万无一失的：可以想象，如果 LLM 被微调用于恶意操作，仍然可能损害你的环境。例如，如果你允许像 <code>Pillow</code> 这样无害的包处理图像，LLM 可能会生成数千张图像保存以膨胀你的硬盘。
如果你自己选择了 LLM 引擎，这当然不太可能，但它可能会发生。`,ue,H,Se="所以如果你想格外谨慎，可以使用下面描述的远程代码执行选项。",me,j,re,B,Ve="为了最大程度的安全性，你可以使用我们与 E2B 的集成在沙盒环境中运行代码。这是一个远程执行服务，可以在隔离的容器中运行你的代码，使代码无法影响你的本地环境。",fe,E,Ze='为此，你需要设置你的 E2B 账户并在环境变量中设置 <code>E2B_API_KEY</code>。请前往 <a href="https://e2b.dev/docs/quickstart" rel="nofollow">E2B 快速入门文档</a> 了解更多信息。',ce,S,qe="然后你可以通过 <code>pip install e2b-code-interpreter python-dotenv</code> 安装它。",ge,V,ze="现在你已经准备好了！",be,Z,We=`要将代码执行器设置为 E2B，只需在初始化 <code>CodeAgent</code> 时传递标志 <code>executor_type=&quot;e2b&quot;</code>。
请注意，你应该将所有工具的依赖项添加到 <code>additional_authorized_imports</code> 中，以便执行器安装它们。`,Me,q,de,z,Ge="目前 E2B 代码执行暂不兼容多 agent——因为把 agent 调用放在应该在远程执行的代码块里，是非常混乱的。但我们正在努力做到这件事！",he,W,_e,Q,ye;return d=new Ke({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),h=new tt({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;",options:[{label:"Mixed",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/smolagents_doc/zh/secure_code_execution.ipynb"},{label:"PyTorch",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/smolagents_doc/zh/pytorch/secure_code_execution.ipynb"},{label:"TensorFlow",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/smolagents_doc/zh/tensorflow/secure_code_execution.ipynb"},{label:"Mixed",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/smolagents_doc/zh/secure_code_execution.ipynb"},{label:"PyTorch",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/smolagents_doc/zh/pytorch/secure_code_execution.ipynb"},{label:"TensorFlow",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/smolagents_doc/zh/tensorflow/secure_code_execution.ipynb"}]}}),_=new $e({props:{title:"安全代码执行",local:"安全代码执行",headingTag:"h1"}}),y=new $e({props:{title:"代码智能体",local:"代码智能体",headingTag:"h3"}}),L=new $e({props:{title:"本地 Python 解释器",local:"本地-python-解释器",headingTag:"h3"}}),j=new $e({props:{title:"E2B 代码执行器",local:"e2b-代码执行器",headingTag:"h3"}}),q=new et({props:{code:"ZnJvbSUyMHNtb2xhZ2VudHMlMjBpbXBvcnQlMjBDb2RlQWdlbnQlMkMlMjBWaXNpdFdlYnBhZ2VUb29sJTJDJTIwSW5mZXJlbmNlQ2xpZW50TW9kZWwlMEFhZ2VudCUyMCUzRCUyMENvZGVBZ2VudCglMEElMjAlMjAlMjAlMjB0b29scyUyMCUzRCUyMCU1QlZpc2l0V2VicGFnZVRvb2woKSU1RCUyQyUwQSUyMCUyMCUyMCUyMG1vZGVsJTNESW5mZXJlbmNlQ2xpZW50TW9kZWwoKSUyQyUwQSUyMCUyMCUyMCUyMGFkZGl0aW9uYWxfYXV0aG9yaXplZF9pbXBvcnRzJTNEJTVCJTIycmVxdWVzdHMlMjIlMkMlMjAlMjJtYXJrZG93bmlmeSUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGV4ZWN1dG9yX3R5cGUlM0QlMjJlMmIlMjIlMEEpJTBBJTBBYWdlbnQucnVuKCUyMldoYXQlMjB3YXMlMjBBYnJhaGFtJTIwTGluY29sbidzJTIwcHJlZmVycmVkJTIwcGV0JTNGJTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> smolagents <span class="hljs-keyword">import</span> CodeAgent, VisitWebpageTool, InferenceClientModel
agent = CodeAgent(
    tools = [VisitWebpageTool()],
    model=InferenceClientModel(),
    additional_authorized_imports=[<span class="hljs-string">&quot;requests&quot;</span>, <span class="hljs-string">&quot;markdownify&quot;</span>],
    executor_type=<span class="hljs-string">&quot;e2b&quot;</span>
)

agent.run(<span class="hljs-string">&quot;What was Abraham Lincoln&#x27;s preferred pet?&quot;</span>)`,wrap:!1}}),W=new De({props:{source:"https://github.com/huggingface/smolagents/blob/main/docs/source/zh/tutorials/secure_code_execution.md"}}),{c(){u=s("meta"),I=o(),N=s("p"),A=o(),r(d.$$.fragment),X=o(),r(h.$$.fragment),O=o(),r(_.$$.fragment),Y=o(),m=s("blockquote"),m.innerHTML=ve,R=o(),r(y.$$.fragment),F=o(),C=s("p"),C.innerHTML=Te,K=o(),$=s("p"),$.textContent=we,D=o(),x=s("p"),x.textContent=Le,ee=o(),v=s("ul"),v.innerHTML=Ue,te=o(),T=s("p"),T.innerHTML=Pe,le=o(),G=s("img"),ne=o(),w=s("p"),w.textContent=Je,oe=o(),r(L.$$.fragment),ie=o(),U=s("p"),U.innerHTML=He,se=o(),P=s("ul"),P.innerHTML=je,ae=o(),k=s("p"),k.textContent=Be,pe=o(),J=s("p"),J.innerHTML=Ee,ue=o(),H=s("p"),H.textContent=Se,me=o(),r(j.$$.fragment),re=o(),B=s("p"),B.textContent=Ve,fe=o(),E=s("p"),E.innerHTML=Ze,ce=o(),S=s("p"),S.innerHTML=qe,ge=o(),V=s("p"),V.textContent=ze,be=o(),Z=s("p"),Z.innerHTML=We,Me=o(),r(q.$$.fragment),de=o(),z=s("p"),z.textContent=Ge,he=o(),r(W.$$.fragment),_e=o(),Q=s("p"),this.h()},l(e){const t=Re("svelte-u9bgzb",document.head);u=a(t,"META",{name:!0,content:!0}),t.forEach(l),I=i(e),N=a(e,"P",{}),Ne(N).forEach(l),A=i(e),f(d.$$.fragment,e),X=i(e),f(h.$$.fragment,e),O=i(e),f(_.$$.fragment,e),Y=i(e),m=a(e,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),p(m)!=="svelte-13go4bm"&&(m.innerHTML=ve),R=i(e),f(y.$$.fragment,e),F=i(e),C=a(e,"P",{"data-svelte-h":!0}),p(C)!=="svelte-50jhgj"&&(C.innerHTML=Te),K=i(e),$=a(e,"P",{"data-svelte-h":!0}),p($)!=="svelte-wsqcpy"&&($.textContent=we),D=i(e),x=a(e,"P",{"data-svelte-h":!0}),p(x)!=="svelte-1jskndn"&&(x.textContent=Le),ee=i(e),v=a(e,"UL",{"data-svelte-h":!0}),p(v)!=="svelte-1rh1aog"&&(v.innerHTML=Ue),te=i(e),T=a(e,"P",{"data-svelte-h":!0}),p(T)!=="svelte-7kkwmk"&&(T.innerHTML=Pe),le=i(e),G=a(e,"IMG",{src:!0}),ne=i(e),w=a(e,"P",{"data-svelte-h":!0}),p(w)!=="svelte-n69i"&&(w.textContent=Je),oe=i(e),f(L.$$.fragment,e),ie=i(e),U=a(e,"P",{"data-svelte-h":!0}),p(U)!=="svelte-st9pa7"&&(U.innerHTML=He),se=i(e),P=a(e,"UL",{"data-svelte-h":!0}),p(P)!=="svelte-r5ls43"&&(P.innerHTML=je),ae=i(e),k=a(e,"P",{"data-svelte-h":!0}),p(k)!=="svelte-14u3l5f"&&(k.textContent=Be),pe=i(e),J=a(e,"P",{"data-svelte-h":!0}),p(J)!=="svelte-hm1f2r"&&(J.innerHTML=Ee),ue=i(e),H=a(e,"P",{"data-svelte-h":!0}),p(H)!=="svelte-1iwo0wb"&&(H.textContent=Se),me=i(e),f(j.$$.fragment,e),re=i(e),B=a(e,"P",{"data-svelte-h":!0}),p(B)!=="svelte-1mwu7as"&&(B.textContent=Ve),fe=i(e),E=a(e,"P",{"data-svelte-h":!0}),p(E)!=="svelte-1ont1lb"&&(E.innerHTML=Ze),ce=i(e),S=a(e,"P",{"data-svelte-h":!0}),p(S)!=="svelte-z794n4"&&(S.innerHTML=qe),ge=i(e),V=a(e,"P",{"data-svelte-h":!0}),p(V)!=="svelte-lnqw0e"&&(V.textContent=ze),be=i(e),Z=a(e,"P",{"data-svelte-h":!0}),p(Z)!=="svelte-vqe432"&&(Z.innerHTML=We),Me=i(e),f(q.$$.fragment,e),de=i(e),z=a(e,"P",{"data-svelte-h":!0}),p(z)!=="svelte-11hsivv"&&(z.textContent=Ge),he=i(e),f(W.$$.fragment,e),_e=i(e),Q=a(e,"P",{}),Ne(Q).forEach(l),this.h()},h(){Ce(u,"name","hf:doc:metadata"),Ce(u,"content",nt),Ce(m,"class","tip"),Ie(G.src,ke="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/code_vs_json_actions.png")||Ce(G,"src",ke)},m(e,t){Fe(document.head,u),n(e,I,t),n(e,N,t),n(e,A,t),c(d,e,t),n(e,X,t),c(h,e,t),n(e,O,t),c(_,e,t),n(e,Y,t),n(e,m,t),n(e,R,t),c(y,e,t),n(e,F,t),n(e,C,t),n(e,K,t),n(e,$,t),n(e,D,t),n(e,x,t),n(e,ee,t),n(e,v,t),n(e,te,t),n(e,T,t),n(e,le,t),n(e,G,t),n(e,ne,t),n(e,w,t),n(e,oe,t),c(L,e,t),n(e,ie,t),n(e,U,t),n(e,se,t),n(e,P,t),n(e,ae,t),n(e,k,t),n(e,pe,t),n(e,J,t),n(e,ue,t),n(e,H,t),n(e,me,t),c(j,e,t),n(e,re,t),n(e,B,t),n(e,fe,t),n(e,E,t),n(e,ce,t),n(e,S,t),n(e,ge,t),n(e,V,t),n(e,be,t),n(e,Z,t),n(e,Me,t),c(q,e,t),n(e,de,t),n(e,z,t),n(e,he,t),c(W,e,t),n(e,_e,t),n(e,Q,t),ye=!0},p:Ae,i(e){ye||(g(d.$$.fragment,e),g(h.$$.fragment,e),g(_.$$.fragment,e),g(y.$$.fragment,e),g(L.$$.fragment,e),g(j.$$.fragment,e),g(q.$$.fragment,e),g(W.$$.fragment,e),ye=!0)},o(e){b(d.$$.fragment,e),b(h.$$.fragment,e),b(_.$$.fragment,e),b(y.$$.fragment,e),b(L.$$.fragment,e),b(j.$$.fragment,e),b(q.$$.fragment,e),b(W.$$.fragment,e),ye=!1},d(e){e&&(l(I),l(N),l(A),l(X),l(O),l(Y),l(m),l(R),l(F),l(C),l(K),l($),l(D),l(x),l(ee),l(v),l(te),l(T),l(le),l(G),l(ne),l(w),l(oe),l(ie),l(U),l(se),l(P),l(ae),l(k),l(pe),l(J),l(ue),l(H),l(me),l(re),l(B),l(fe),l(E),l(ce),l(S),l(ge),l(V),l(be),l(Z),l(Me),l(de),l(z),l(he),l(_e),l(Q)),l(u),M(d,e),M(h,e),M(_,e),M(y,e),M(L,e),M(j,e),M(q,e),M(W,e)}}}const nt='{"title":"安全代码执行","local":"安全代码执行","sections":[{"title":"代码智能体","local":"代码智能体","sections":[],"depth":3},{"title":"本地 Python 解释器","local":"本地-python-解释器","sections":[],"depth":3},{"title":"E2B 代码执行器","local":"e2b-代码执行器","sections":[],"depth":3}],"depth":1}';function ot(xe){return Xe(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class mt extends Oe{constructor(u){super(),Ye(this,u,ot,lt,Qe,{})}}export{mt as component};
