简而言之:在后端控制台(lingcode.dev/backends → Settings → Secrets & integrations)中添加密钥,例如 ELEVENLABS_API_KEY。然后在应用中通过 client.functions.invoke('elevenlabs-tts', { text }) 调用——密钥永远不会离开服务器。对于其他服务,在 Allowed fetch hosts 中将其域名加入允许列表,再使用 client.functions.invoke('http-fetch', { url, headers }),以 {{MY_KEY}} 的形式引用密钥即可。
在 Web 应用中直接将第三方 API 密钥写进前端代码,是最危险的做法——密钥会出现在每位访客的浏览器里。正确的方式是将密钥保存在服务器上,由服务器代为调用服务。但仅仅为了藏一个密钥就专门搭建一台服务器,正是 LingCode Cloud 帮你省去的麻烦。你的托管后端本身就是那台服务器,可以帮你持有密钥并完成调用。
本教程以已连接托管后端为前提。让外部调用保持安全,需要两个关键组件:加密密钥存储(密钥保存在服务端,永远不会发送到浏览器)以及在后端运行、携带注入密钥发起出站请求的函数模板。
http-fetch 函数调用任意已允许的 API打开 lingcode.dev/backends(使用与 IDE 相同的账号登录),选择你的后端,进入 Settings → Secrets & integrations。添加一个 UPPER_SNAKE 格式命名的 Secret,并粘贴对应的值——以 ElevenLabs 为例,就是 ELEVENLABS_API_KEY。该值在静态存储时会被加密(AES-256-GCM),控制台此后只显示密钥的名称,不再显示值本身。应用代码和网络请求均无法访问这个 Secret,只有后端函数才能读取它。
系统内置了经过审核的 elevenlabs-tts 函数。在你的应用中(使用 AI 代理已为你接入的 LingCode SDK):
const { data } = await client.functions.invoke('elevenlabs-tts', {
text: 'Hello from LingCode Cloud',
// voice_id and model_id are optional
});
// data.audio_base64 is MP3 audio you can play:
new Audio('data:audio/mpeg;base64,' + data.audio_base64).play();
该函数在后端运行,从密钥库中读取 ELEVENLABS_API_KEY,调用 ElevenLabs 并返回音频数据。前端始终看不到密钥。如果你向 AI 代理提出需求("添加一个按钮,用 ElevenLabs 朗读这段文字"),代理知道这个模板的存在,会直接写出对应的调用代码。
http-fetch 调用任意其他 API对于没有专用模板的服务,使用通用的 http-fetch——但首先需要在 Settings → Allowed fetch hosts 中将其域名加入允许列表(例如 api.openai.com)。然后:
const { data } = await client.functions.invoke('http-fetch', {
url: 'https://api.openai.com/v1/responses',
method: 'POST',
headers: { Authorization: 'Bearer {{OPENAI_API_KEY}}', 'content-type': 'application/json' },
body: { model: 'gpt-4o-mini', input: 'Say hi' },
});
其中的 {{OPENAI_API_KEY}} 占位符会在服务端被替换为你存储的 Secret——它永远不会出现在应用发出的请求中。data 包含响应的状态码、响应头以及响应体(JSON 时自动解析)。
http-fetch 运行在 LingCode 的网络内部,如果允许"请求任意 URL",就会产生服务端请求伪造(SSRF)漏洞——恶意请求可能触达内部服务。允许列表就是防线:只有你明确添加的域名才可访问,且请求还会进一步阻止解析到任何私有或内部地址。允许列表为空等于禁止所有出站调用。像 elevenlabs-tts 这样的专用模板已预先绑定到固定的目标主机,无需配置允许列表。