import{s as ze,f as Ge,n as Qe,o as Ie}from"../chunks/scheduler.f6319a2a.js";import{S as Ae,i as Xe,g as i,s as o,r as E,A as Oe,h as a,f as l,c as s,j as We,u as V,x as p,k as _e,y as Ye,a as n,v as Z,d as q,t as S,w as N}from"../chunks/index.85aa684c.js";import{C as Re}from"../chunks/CodeBlock.3400fc53.js";import{D as Fe}from"../chunks/DocNotebookDropdown.3fc3604b.js";import{H as Ce,E as Ke}from"../chunks/getInferenceSnippets.0233181f.js";function De(ye){let u,Q,z,I,r,A,c,X,m,ve='<p>如果你是第一次构建 agent，请先阅读 <a href="../conceptual_guides/intro_agents">agent 介绍</a> 和 <a href="../guided_tour">smolagents 导览</a>。</p>',O,f,Y,g,$e='<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” 的各种变体。',R,b,xe="为什么代码更好？因为我们专门为计算机执行的动作而设计编程语言。如果 JSON 片段是更好的方式，那么这个工具包就应该是用 JSON 片段编写的，魔鬼就会嘲笑我们。",F,h,we="代码就是表达计算机动作的更好方式。它具有更好的：",K,M,Te="<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>",D,d,Le='下图展示了这一点，取自 <a href="https://huggingface.co/papers/2402.01030" rel="nofollow">可执行代码动作引出更好的 LLM 智能体</a>。',ee,W,Ue,te,_,Pe="这就是为什么我们强调提出代码智能体，在本例中是 Python 智能体，这意味着我们要在构建安全的 Python 解释器上投入更多精力。",le,C,ne,y,ke=`默认情况下，<code>CodeAgent</code> 会在你的环境中运行 LLM 生成的代码。
这个执行不是由普通的 Python 解释器完成的：我们从零开始重新构建了一个更安全的 <code>LocalPythonExecutor</code>。
这个解释器通过以下方式设计以确保安全：`,oe,v,Je="<li>将导入限制为用户显式传递的列表</li> <li>限制操作次数以防止无限循环和资源膨胀</li> <li>不会执行任何未预定义的操作</li>",se,$,He="我们已经在许多用例中使用了这个解释器，从未观察到对环境造成任何损害。",ie,x,je=`然而，这个解决方案并不是万无一失的：可以想象，如果 LLM 被微调用于恶意操作，仍然可能损害你的环境。例如，如果你允许像 <code>Pillow</code> 这样无害的包处理图像，LLM 可能会生成数千张图像保存以膨胀你的硬盘。
如果你自己选择了 LLM 引擎，这当然不太可能，但它可能会发生。`,ae,w,Be="所以如果你想格外谨慎，可以使用下面描述的远程代码执行选项。",pe,T,ue,L,Ee="为了最大程度的安全性，你可以使用我们与 E2B 的集成在沙盒环境中运行代码。这是一个远程执行服务，可以在隔离的容器中运行你的代码，使代码无法影响你的本地环境。",me,U,Ve='为此，你需要设置你的 E2B 账户并在环境变量中设置 <code>E2B_API_KEY</code>。请前往 <a href="https://e2b.dev/docs/quickstart" rel="nofollow">E2B 快速入门文档</a> 了解更多信息。',re,P,Ze="然后你可以通过 <code>pip install e2b-code-interpreter python-dotenv</code> 安装它。",ce,k,qe="现在你已经准备好了！",fe,J,Se=`要将代码执行器设置为 E2B，只需在初始化 <code>CodeAgent</code> 时传递标志 <code>executor_type=&quot;e2b&quot;</code>。
请注意，你应该将所有工具的依赖项添加到 <code>additional_authorized_imports</code> 中，以便执行器安装它们。`,ge,H,be,j,Ne="目前 E2B 代码执行暂不兼容多 agent——因为把 agent 调用放在应该在远程执行的代码块里，是非常混乱的。但我们正在努力做到这件事！",he,B,Me,G,de;return r=new Ce({props:{title:"安全代码执行",local:"安全代码执行",headingTag:"h1"}}),c=new Fe({props:{classNames:"absolute z-10 right-0 top-0",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"}]}}),f=new Ce({props:{title:"代码智能体",local:"代码智能体",headingTag:"h3"}}),C=new Ce({props:{title:"本地 Python 解释器",local:"本地-python-解释器",headingTag:"h3"}}),T=new Ce({props:{title:"E2B 代码执行器",local:"e2b-代码执行器",headingTag:"h3"}}),H=new Re({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}}),B=new Ke({props:{source:"https://github.com/huggingface/smolagents/blob/main/docs/source/zh/tutorials/secure_code_execution.md"}}),{c(){u=i("meta"),Q=o(),z=i("p"),I=o(),E(r.$$.fragment),A=o(),E(c.$$.fragment),X=o(),m=i("blockquote"),m.innerHTML=ve,O=o(),E(f.$$.fragment),Y=o(),g=i("p"),g.innerHTML=$e,R=o(),b=i("p"),b.textContent=xe,F=o(),h=i("p"),h.textContent=we,K=o(),M=i("ul"),M.innerHTML=Te,D=o(),d=i("p"),d.innerHTML=Le,ee=o(),W=i("img"),te=o(),_=i("p"),_.textContent=Pe,le=o(),E(C.$$.fragment),ne=o(),y=i("p"),y.innerHTML=ke,oe=o(),v=i("ul"),v.innerHTML=Je,se=o(),$=i("p"),$.textContent=He,ie=o(),x=i("p"),x.innerHTML=je,ae=o(),w=i("p"),w.textContent=Be,pe=o(),E(T.$$.fragment),ue=o(),L=i("p"),L.textContent=Ee,me=o(),U=i("p"),U.innerHTML=Ve,re=o(),P=i("p"),P.innerHTML=Ze,ce=o(),k=i("p"),k.textContent=qe,fe=o(),J=i("p"),J.innerHTML=Se,ge=o(),E(H.$$.fragment),be=o(),j=i("p"),j.textContent=Ne,he=o(),E(B.$$.fragment),Me=o(),G=i("p"),this.h()},l(e){const t=Oe("svelte-u9bgzb",document.head);u=a(t,"META",{name:!0,content:!0}),t.forEach(l),Q=s(e),z=a(e,"P",{}),We(z).forEach(l),I=s(e),V(r.$$.fragment,e),A=s(e),V(c.$$.fragment,e),X=s(e),m=a(e,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),p(m)!=="svelte-13go4bm"&&(m.innerHTML=ve),O=s(e),V(f.$$.fragment,e),Y=s(e),g=a(e,"P",{"data-svelte-h":!0}),p(g)!=="svelte-50jhgj"&&(g.innerHTML=$e),R=s(e),b=a(e,"P",{"data-svelte-h":!0}),p(b)!=="svelte-wsqcpy"&&(b.textContent=xe),F=s(e),h=a(e,"P",{"data-svelte-h":!0}),p(h)!=="svelte-1jskndn"&&(h.textContent=we),K=s(e),M=a(e,"UL",{"data-svelte-h":!0}),p(M)!=="svelte-1rh1aog"&&(M.innerHTML=Te),D=s(e),d=a(e,"P",{"data-svelte-h":!0}),p(d)!=="svelte-7kkwmk"&&(d.innerHTML=Le),ee=s(e),W=a(e,"IMG",{src:!0}),te=s(e),_=a(e,"P",{"data-svelte-h":!0}),p(_)!=="svelte-n69i"&&(_.textContent=Pe),le=s(e),V(C.$$.fragment,e),ne=s(e),y=a(e,"P",{"data-svelte-h":!0}),p(y)!=="svelte-st9pa7"&&(y.innerHTML=ke),oe=s(e),v=a(e,"UL",{"data-svelte-h":!0}),p(v)!=="svelte-r5ls43"&&(v.innerHTML=Je),se=s(e),$=a(e,"P",{"data-svelte-h":!0}),p($)!=="svelte-14u3l5f"&&($.textContent=He),ie=s(e),x=a(e,"P",{"data-svelte-h":!0}),p(x)!=="svelte-hm1f2r"&&(x.innerHTML=je),ae=s(e),w=a(e,"P",{"data-svelte-h":!0}),p(w)!=="svelte-1iwo0wb"&&(w.textContent=Be),pe=s(e),V(T.$$.fragment,e),ue=s(e),L=a(e,"P",{"data-svelte-h":!0}),p(L)!=="svelte-1mwu7as"&&(L.textContent=Ee),me=s(e),U=a(e,"P",{"data-svelte-h":!0}),p(U)!=="svelte-1ont1lb"&&(U.innerHTML=Ve),re=s(e),P=a(e,"P",{"data-svelte-h":!0}),p(P)!=="svelte-z794n4"&&(P.innerHTML=Ze),ce=s(e),k=a(e,"P",{"data-svelte-h":!0}),p(k)!=="svelte-lnqw0e"&&(k.textContent=qe),fe=s(e),J=a(e,"P",{"data-svelte-h":!0}),p(J)!=="svelte-vqe432"&&(J.innerHTML=Se),ge=s(e),V(H.$$.fragment,e),be=s(e),j=a(e,"P",{"data-svelte-h":!0}),p(j)!=="svelte-11hsivv"&&(j.textContent=Ne),he=s(e),V(B.$$.fragment,e),Me=s(e),G=a(e,"P",{}),We(G).forEach(l),this.h()},h(){_e(u,"name","hf:doc:metadata"),_e(u,"content",et),_e(m,"class","tip"),Ge(W.src,Ue="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/code_vs_json_actions.png")||_e(W,"src",Ue)},m(e,t){Ye(document.head,u),n(e,Q,t),n(e,z,t),n(e,I,t),Z(r,e,t),n(e,A,t),Z(c,e,t),n(e,X,t),n(e,m,t),n(e,O,t),Z(f,e,t),n(e,Y,t),n(e,g,t),n(e,R,t),n(e,b,t),n(e,F,t),n(e,h,t),n(e,K,t),n(e,M,t),n(e,D,t),n(e,d,t),n(e,ee,t),n(e,W,t),n(e,te,t),n(e,_,t),n(e,le,t),Z(C,e,t),n(e,ne,t),n(e,y,t),n(e,oe,t),n(e,v,t),n(e,se,t),n(e,$,t),n(e,ie,t),n(e,x,t),n(e,ae,t),n(e,w,t),n(e,pe,t),Z(T,e,t),n(e,ue,t),n(e,L,t),n(e,me,t),n(e,U,t),n(e,re,t),n(e,P,t),n(e,ce,t),n(e,k,t),n(e,fe,t),n(e,J,t),n(e,ge,t),Z(H,e,t),n(e,be,t),n(e,j,t),n(e,he,t),Z(B,e,t),n(e,Me,t),n(e,G,t),de=!0},p:Qe,i(e){de||(q(r.$$.fragment,e),q(c.$$.fragment,e),q(f.$$.fragment,e),q(C.$$.fragment,e),q(T.$$.fragment,e),q(H.$$.fragment,e),q(B.$$.fragment,e),de=!0)},o(e){S(r.$$.fragment,e),S(c.$$.fragment,e),S(f.$$.fragment,e),S(C.$$.fragment,e),S(T.$$.fragment,e),S(H.$$.fragment,e),S(B.$$.fragment,e),de=!1},d(e){e&&(l(Q),l(z),l(I),l(A),l(X),l(m),l(O),l(Y),l(g),l(R),l(b),l(F),l(h),l(K),l(M),l(D),l(d),l(ee),l(W),l(te),l(_),l(le),l(ne),l(y),l(oe),l(v),l(se),l($),l(ie),l(x),l(ae),l(w),l(pe),l(ue),l(L),l(me),l(U),l(re),l(P),l(ce),l(k),l(fe),l(J),l(ge),l(be),l(j),l(he),l(Me),l(G)),l(u),N(r,e),N(c,e),N(f,e),N(C,e),N(T,e),N(H,e),N(B,e)}}}const et='{"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 tt(ye){return Ie(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class at extends Ae{constructor(u){super(),Xe(this,u,tt,De,ze,{})}}export{at as component};
