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 i,s as o,c as r,h as Re,a,d as l,b as s,f as Ge,g as f,j as p,k as $e,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 ye,E as De}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.4292aef9.js";import{C as et}from"../chunks/CodeBlock.afb4ac0c.js";import{D as tt}from"../chunks/DocNotebookDropdown.eca57a73.js";function lt(ve){let u,I,G,A,h,X,d,O,_,Y,m,xe='<p>如果你是第一次构建 agent，请先阅读 <a href="../conceptual_guides/intro_agents">agent 介绍</a> 和 <a href="../guided_tour">smolagents 导览</a>。</p>',R,C,F,$,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,y,we="为什么代码更好？因为我们专门为计算机执行的动作而设计编程语言。如果 JSON 片段是更好的方式，那么这个工具包就应该是用 JSON 片段编写的，魔鬼就会嘲笑我们。",D,v,Le="代码就是表达计算机动作的更好方式。它具有更好的：",ee,x,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,W,ke,ne,w,Je="这就是为什么我们强调提出代码智能体，在本例中是 Python 智能体，这意味着我们要在构建安全的 Python 解释器上投入更多精力。",oe,L,se,U,He=`默认情况下，<code>CodeAgent</code> 会在你的环境中运行 LLM 生成的代码。
这个执行不是由普通的 Python 解释器完成的：我们从零开始重新构建了一个更安全的 <code>LocalPythonExecutor</code>。
这个解释器通过以下方式设计以确保安全：`,ie,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,Ne=`要将代码执行器设置为 E2B，只需在初始化 <code>CodeAgent</code> 时传递标志 <code>executor_type=&quot;e2b&quot;</code>。
请注意，你应该将所有工具的依赖项添加到 <code>additional_authorized_imports</code> 中，以便执行器安装它们。`,Me,q,he,z,We="目前 E2B 代码执行暂不兼容多 agent——因为把 agent 调用放在应该在远程执行的代码块里，是非常混乱的。但我们正在努力做到这件事！",de,N,_e,Q,Ce;return h=new Ke({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),d=new ye({props:{title:"安全代码执行",local:"安全代码执行",headingTag:"h1"}}),_=new tt({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"}]}}),C=new ye({props:{title:"代码智能体",local:"代码智能体",headingTag:"h3"}}),L=new ye({props:{title:"本地 Python 解释器",local:"本地-python-解释器",headingTag:"h3"}}),j=new ye({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}}),N=new De({props:{source:"https://github.com/huggingface/smolagents/blob/main/docs/source/zh/tutorials/secure_code_execution.md"}}),{c(){u=i("meta"),I=o(),G=i("p"),A=o(),r(h.$$.fragment),X=o(),r(d.$$.fragment),O=o(),r(_.$$.fragment),Y=o(),m=i("blockquote"),m.innerHTML=xe,R=o(),r(C.$$.fragment),F=o(),$=i("p"),$.innerHTML=Te,K=o(),y=i("p"),y.textContent=we,D=o(),v=i("p"),v.textContent=Le,ee=o(),x=i("ul"),x.innerHTML=Ue,te=o(),T=i("p"),T.innerHTML=Pe,le=o(),W=i("img"),ne=o(),w=i("p"),w.textContent=Je,oe=o(),r(L.$$.fragment),se=o(),U=i("p"),U.innerHTML=He,ie=o(),P=i("ul"),P.innerHTML=je,ae=o(),k=i("p"),k.textContent=Be,pe=o(),J=i("p"),J.innerHTML=Ee,ue=o(),H=i("p"),H.textContent=Se,me=o(),r(j.$$.fragment),re=o(),B=i("p"),B.textContent=Ve,fe=o(),E=i("p"),E.innerHTML=Ze,ce=o(),S=i("p"),S.innerHTML=qe,ge=o(),V=i("p"),V.textContent=ze,be=o(),Z=i("p"),Z.innerHTML=Ne,Me=o(),r(q.$$.fragment),he=o(),z=i("p"),z.textContent=We,de=o(),r(N.$$.fragment),_e=o(),Q=i("p"),this.h()},l(e){const t=Re("svelte-u9bgzb",document.head);u=a(t,"META",{name:!0,content:!0}),t.forEach(l),I=s(e),G=a(e,"P",{}),Ge(G).forEach(l),A=s(e),f(h.$$.fragment,e),X=s(e),f(d.$$.fragment,e),O=s(e),f(_.$$.fragment,e),Y=s(e),m=a(e,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),p(m)!=="svelte-13go4bm"&&(m.innerHTML=xe),R=s(e),f(C.$$.fragment,e),F=s(e),$=a(e,"P",{"data-svelte-h":!0}),p($)!=="svelte-50jhgj"&&($.innerHTML=Te),K=s(e),y=a(e,"P",{"data-svelte-h":!0}),p(y)!=="svelte-wsqcpy"&&(y.textContent=we),D=s(e),v=a(e,"P",{"data-svelte-h":!0}),p(v)!=="svelte-1jskndn"&&(v.textContent=Le),ee=s(e),x=a(e,"UL",{"data-svelte-h":!0}),p(x)!=="svelte-1rh1aog"&&(x.innerHTML=Ue),te=s(e),T=a(e,"P",{"data-svelte-h":!0}),p(T)!=="svelte-7kkwmk"&&(T.innerHTML=Pe),le=s(e),W=a(e,"IMG",{src:!0}),ne=s(e),w=a(e,"P",{"data-svelte-h":!0}),p(w)!=="svelte-n69i"&&(w.textContent=Je),oe=s(e),f(L.$$.fragment,e),se=s(e),U=a(e,"P",{"data-svelte-h":!0}),p(U)!=="svelte-st9pa7"&&(U.innerHTML=He),ie=s(e),P=a(e,"UL",{"data-svelte-h":!0}),p(P)!=="svelte-r5ls43"&&(P.innerHTML=je),ae=s(e),k=a(e,"P",{"data-svelte-h":!0}),p(k)!=="svelte-14u3l5f"&&(k.textContent=Be),pe=s(e),J=a(e,"P",{"data-svelte-h":!0}),p(J)!=="svelte-hm1f2r"&&(J.innerHTML=Ee),ue=s(e),H=a(e,"P",{"data-svelte-h":!0}),p(H)!=="svelte-1iwo0wb"&&(H.textContent=Se),me=s(e),f(j.$$.fragment,e),re=s(e),B=a(e,"P",{"data-svelte-h":!0}),p(B)!=="svelte-1mwu7as"&&(B.textContent=Ve),fe=s(e),E=a(e,"P",{"data-svelte-h":!0}),p(E)!=="svelte-1ont1lb"&&(E.innerHTML=Ze),ce=s(e),S=a(e,"P",{"data-svelte-h":!0}),p(S)!=="svelte-z794n4"&&(S.innerHTML=qe),ge=s(e),V=a(e,"P",{"data-svelte-h":!0}),p(V)!=="svelte-lnqw0e"&&(V.textContent=ze),be=s(e),Z=a(e,"P",{"data-svelte-h":!0}),p(Z)!=="svelte-vqe432"&&(Z.innerHTML=Ne),Me=s(e),f(q.$$.fragment,e),he=s(e),z=a(e,"P",{"data-svelte-h":!0}),p(z)!=="svelte-11hsivv"&&(z.textContent=We),de=s(e),f(N.$$.fragment,e),_e=s(e),Q=a(e,"P",{}),Ge(Q).forEach(l),this.h()},h(){$e(u,"name","hf:doc:metadata"),$e(u,"content",nt),$e(m,"class","tip"),Ie(W.src,ke="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/code_vs_json_actions.png")||$e(W,"src",ke)},m(e,t){Fe(document.head,u),n(e,I,t),n(e,G,t),n(e,A,t),c(h,e,t),n(e,X,t),c(d,e,t),n(e,O,t),c(_,e,t),n(e,Y,t),n(e,m,t),n(e,R,t),c(C,e,t),n(e,F,t),n(e,$,t),n(e,K,t),n(e,y,t),n(e,D,t),n(e,v,t),n(e,ee,t),n(e,x,t),n(e,te,t),n(e,T,t),n(e,le,t),n(e,W,t),n(e,ne,t),n(e,w,t),n(e,oe,t),c(L,e,t),n(e,se,t),n(e,U,t),n(e,ie,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,he,t),n(e,z,t),n(e,de,t),c(N,e,t),n(e,_e,t),n(e,Q,t),Ce=!0},p:Ae,i(e){Ce||(g(h.$$.fragment,e),g(d.$$.fragment,e),g(_.$$.fragment,e),g(C.$$.fragment,e),g(L.$$.fragment,e),g(j.$$.fragment,e),g(q.$$.fragment,e),g(N.$$.fragment,e),Ce=!0)},o(e){b(h.$$.fragment,e),b(d.$$.fragment,e),b(_.$$.fragment,e),b(C.$$.fragment,e),b(L.$$.fragment,e),b(j.$$.fragment,e),b(q.$$.fragment,e),b(N.$$.fragment,e),Ce=!1},d(e){e&&(l(I),l(G),l(A),l(X),l(O),l(Y),l(m),l(R),l(F),l($),l(K),l(y),l(D),l(v),l(ee),l(x),l(te),l(T),l(le),l(W),l(ne),l(w),l(oe),l(se),l(U),l(ie),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(he),l(z),l(de),l(_e),l(Q)),l(u),M(h,e),M(d,e),M(_,e),M(C,e),M(L,e),M(j,e),M(q,e),M(N,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(ve){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};
