01|如何在前端调用文本大模型API

你好,我是月影。

这一节课,我们先来了解如何通过调用API的方式来使用最基础的文本大模型。

由于几乎所有开放给用户使用的大模型服务都提供HTTP协议的API,所以对于前端工程师来说,使用大模型最简单的入门方式其实就是直接调用由服务平台提供的API。

由于各种不同类型的大模型和不同服务平台的API略有差异,我们也无法穷尽,所以这节课我们主要了解Deepseek和Coze这两个通用文本大模型服务的前端使用方法,以及不同的调用方式。

因为是课程的第一部分,所以内容不会太过于深入细节,但是在这一讲中,我们将通过实战操作,来熟悉大模型的API调用方法、数据协议和格式,为后续深入学习打下基础。

使用DeepSeek Platform

要说最近国内哪个大模型得到最多人关注,那毫无疑问应该是DeepSeek,它不仅以极低的成本实现了和行业巨头相媲美的推理能力和性能,而且最近发布的深度推理 R1 模型在性能和效果上都表现极其优越,它的团队还将模型训练中的技术创新全部公开,促进了技术社区之间的深入交流与协同创新。

实际上在Deepseek v3和R1推出的近一年之前,我的业务中就在部分使用它,因为它极低廉的价格和不错的推理能力,也因为它提供了非常好用的官方API平台,所以它对我们这些AI应用创业者非常友好。

好,让我们言归正传,来看看作为前端工程师,应当如何使用Deepseek官方API。

DeepSeek官方API平台是 https://platform.deepseek.com/ ,我们可以用手机号注册或者微信登录。登录后,就能进入API后台:

图片

在这里,我们需要注意两个信息,一个是主页面上的余额信息,它决定了还有多少token剩余量。根据文档,Deepseek目前的价格如下:

图片

如果你是第一次接触大模型API调用,需要了解一下token的概念。token是模型用来表示自然语言文本的基本单位,通常一个中文词语或一个英文单词、数字或符号计为一个token。在每次API调用成功后,我们可以通过返回结果的usage得到token的消耗量。

除了余额,第二个需要关注的信息是API Keys,它是我们的应用调用API的许可凭证。我们可以点击左侧菜单来创建、查看和管理它。

图片

接下来我们就从最简单的做起,从浏览器端调用Deepseek API。因为它支持HTTPS协议的接口,API调用URL是[https://api.deepseek.com/chat/completions](https://api.deepseek.com/chat/completions)

让我们用 Trae 创建一个项目,写一个简单的页面。

图片

Trae 的 AI Builder 自动创建的项目结构如下:

图片

项目创建完毕后,别忘了分别修改项目目录下的 index.html 文件以及 script.js 文件:

index.html

<body>
    <h1>Hello Deepseek!</h1>
    <div id="reply">thinking...</div>
    <script type="module" src="script.js"></script>
</body>

script.js

const endpoint = 'https://api.deepseek.com/chat/completions';
const headers = {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${import.meta.env.VITE_DEEPSEEK_API_KEY}`
};

const payload = {
    model: 'deepseek-chat',
    messages: [
        {role: "system", content: "You are a helpful assistant."},
        {role: "user", content: "你好 Deepseek"}
    ],
    stream: false,
};


const response = await fetch(endpoint, {
    method: 'POST',
    headers: headers,
    body: JSON.stringify(payload)
});

const data = await response.json();
document.getElementById('reply').textContent = data.choices[0].message.content;

同时在项目目录下创建 .env.local 文件,内容如下,其中sk-xxxxxxxx为你在Deepseek Platform中创建的API Key。

VITE_DEEPSEEK_API_KEY=sk-xxxxxxxxx

运行代码,等待几秒,你大概会得到如下输出:

图片

如果你没有看到如上图的结果,请检查项目目录下是否有 vite.config.ts 文件。如果没有,你在 Trae 中用 Command+U(macOS) 或 Ctrl+U(windows)唤起 Builder 对话框,在对话框中输入“帮我初始化vite配置”,然后再重启vue服务运行代码,应该就可以正常运行了。

在这里,主要看一下 script.js 这个文件。

首先我们声明endpoint变量为 https://api.deepseek.com/chat/completions 。前面说过,这是Deepseek的API调用URL。接着,我们通过声明headers变量来设置HTTP Headers。

这里需要注意的是,根据API鉴权规范,我们需要将Deepseek Platform申请的API Key放在Authorization请求头字段中传给服务器以完成权限验证。由于请求是通过HTTPS加密传输的,所以不用担心在这个过程中我们的API Key被第三方窃取。

接着,我们设置要发送给API服务的body内容,它是一份JSON格式的文本数据:

{
    "model": "deepseek-chat",
    "messages": [
        {role: "system", content: "You are a helpful assistant."},
        {role: "user", content: "你好 Deepseek"}
    ],
    "stream": false,
}

数据中,model字段指定了要调用的模型类型,Deepseek Platform支持两个模型。其中deepseek-chat是基础模型,目前版本是v3,deepseek-reasoner是深度思考模型,目前版本号是r1。与基础模型相比,深度思考模型的推理能力更强,相应的响应速度要慢一些,价格也要贵不少。这里我们先使用基础模型。

messages字段是要发送给大模型的具体消息,一条消息本身也是JSON格式的,role字段是一个枚举字段,可选的值分别是system、user和assistant,依次表示该条消息是系统消息(也就是我们一般俗称的提示词)、用户消息和AI应答消息。其中user和assistant消息是必须成对的,以表示聊天上下文,且最后一条消息必须是user消息,而system消息的条数和位置一般没有限制。消息体的content则是具体的消息文本内容。

stream字段为false,表示它是以标准的HTTP方式传输而非流式(streaming)传输(关于流式传输的内容,我们下节课再详细展开)。

最终,我们将内容发送给大模型服务,并获得返回值,这一过程是一个异步请求过程。

const response = await fetch(endpoint, {
    method: 'POST',
    headers: headers,
    body: JSON.stringify(payload)
});

const data = await response.json();

当数据从大模型API服务返回后,如果你打开控制台,你可以看到完整的API响应数据,大致如下:

{
    "id": "91e192ff-5adf-4955-92bb-5ac8fe9d3c22",
    "object": "chat.completion",
    "created": 1739870580,
    "model": "deepseek-chat",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "你好!有什么我可以帮助你的吗?"
            },
            "logprobs": null,
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 12,
        "completion_tokens": 8,
        "total_tokens": 20,
        "prompt_tokens_details": {
            "cached_tokens": 0
        },
        "prompt_cache_hit_tokens": 0,
        "prompt_cache_miss_tokens": 12
    },
    "system_fingerprint": "fp_3a5770e1b4"
}

其中我们关注的数据主要是choices字段返回的内容,choices.message.content就是AI返回的文本响应内容,我们将它在网页上显示出来。

document.getElementById('reply').textContent 
  = data.choices[0].message.content;

此外,如果需要的话,我们还可以通过usage字段得到消耗的token数量,从而计算出我们这一次调用的费用消耗,在这里就不展开细说了。

这样我们就完成了一次最简单的Deepseek大模型API调用。是不是很简单呢?

使用Coze

接下来,我们介绍另一个平台——Coze。

Coze(扣子)是由字节跳动推出的一款AI机器人和智能体创建平台,旨在帮助用户快速构建、调试和优化AI聊天机器人应用程序。

严格来说,Coze不同于Deepseek Platform,因为它不仅提供API,更重要的是集成了创建智能体和AI应用机器人的能力。

API是底层,智能体和AI机器人可以理解为上层应用,在后续的课程里,我们会详细了解它们的区别。但是在这一节课中,我们先不用管这些区别,重点来看一下如何使用Coze的API来生成文本。

首先我们在 https://www.coze.cn/ 完成注册,进入Coze控制台,选择“工作空间>个人空间>项目开发”,然后点击创建,选择创建智能体。

图片

智能体名称中,我们输入“通用智能体 for API”,点击确认按钮完成创建。

图片

Coze智能体的系统提示词支持模板变量,我们在人设与回复逻辑中只输入一个变量{{prompt}},模型选择豆包.1.5 Pro 32k。

图片

接着我们点发布按钮,选择发布平台只勾选发布为API。

图片

继续点发布按钮完成发布。

发布完成后,你可以从浏览器地址栏中获取到bot_id,此时浏览器地址栏类似于 https://www.coze.cn/space/7472697029454872613/bot/7473317995184865307,这里的7473317995184865307这串数字就是bot_id,接下来我们在API调用中会用到它。

接着我们选择左侧菜单中的“扣子 API”,展开后选择授权,切换到“个人访问令牌”,点击添加新令牌,创建个人访问令牌,之后我们就可以通过个人访问令牌来进行API调用的鉴权了。

图片

接下来我们还是在 Trae 中创建一个新的Web项目Coze API。

项目创建后,添加.env.local文件如下:

VITE_API_KEY=pat_kTWhBZtBNYhE2xdGshu2Ukeq7z71V**********
VITE_BOT_ID=7473317995184865307

然后修改index.html和script.js。

index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Coze API</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <link rel="stylesheet" type="text/css" href="style.css">
  </head>
  <body>
    <h1>Hello Coze!</h1>
    <div id="reply">thinking...</div>
    <script type="module" src="script.js"></script>
  </body>
</html>

script.js

const endpoint = 'https://api.coze.cn/open_api/v2/chat';

const payload = {
    bot_id: import.meta.env.VITE_BOT_ID,
    user: 'yvo',
    query: '你好',
    chat_history: [],
    stream: false,
    custom_variables: {
        prompt: "你是一个AI助手"
    }
};

const response = await fetch(endpoint, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${import.meta.env.VITE_API_KEY}`,
    },
    body: JSON.stringify(payload),
});

const data = await response.json();
document.getElementById('reply').textContent = data.messages[0].content;

从上面的代码,我们看到,Coze API和Deepseek Platform的API调用逻辑基本类似,只是参数和返回结果有所不同。

Coze的API调用需要传bot_id和user参数,其中bot_id就是我们创建的通用智能体的ID,前面我们说过它可以从浏览器地址栏的URL中获得,user可以是一个任意字符串,只是用来标识。

此外,Coze API的query和chat_history是分开的,当前输入内容以query字段传入,格式是一个字符串,而历史消息以chat_history字段传入,格式和前面Deepseek的messages差不多,具体可以看Coze的官方文档。如果不需要历史消息,只需要传入一个空的数组。

由于Coze没有system消息,它的提示词是在人设与回复逻辑中设置,我们在前面创建时,已经定义了一个叫prompt的模板变量,所以在这里我们可以通过custom_variables参数将prompt变量的具体值传入。

这样,我们就完成了Coze智能体的API调用,点击运行代码,等待几秒钟,就可以在网页上看到推理结果。

图片

要点总结

今天,我们以Deepseek Platform和Coze为例,详细介绍了如何在浏览器端调用文本大模型API。

实际上,除了Deepseek和Coze外,包括月之暗面、智谱清言在内的大部分文本大模型API都是兼容OpenAI的API参数格式的,因此基本上都可以用同样的方式对它们进行调用,只需要变更API key和endpoint即可。有兴趣的同学,可以在课后尝试修改例子,调用其他平台的大模型。这样也可以体验一下不同模型的输出效率和推理能力的差别。

课后练习

我们前面了解了Deepseek API的基本用法,它还有一些配置参数,会影响大模型内容的生成,比较常用的参数比如temperature,它的设定会影响内容输出的随机性,你可以在Deepseek Platform中详细浏览一下文档,并通过修改上面的例子动手实践,学习这些参数的作用和效果,这对你将来在项目中具体应用会很有帮助。

常用的文本大模型,除了Deepseek和Coze外,还有很多其他的选择,它们各有特点和长处,比如月之暗面的大模型Moonshot,在多模态(支持视觉模型)和处理长文本方面表现比较不错。月之暗面也提供了Moonshot AI的开放平台 https://platform.moonshot.cn/,你可以在这个平台上完成注册,并根据文档练习如何调用Moonshot API,体验它和Deepseek有哪些不同,将你的体验结果分享到评论中。

精选留言

  • 菜包子

    2025-04-11 21:27:06

    源代码的仓库写一写嘛
    作者回复

    课程代码仓库:https://github.com/akira-cn/frontend-dev-large-model-era

    2025-04-11 22:04:13

  • 寻寒

    2025-04-09 12:00:07

    文章中 “同时在项目目录下创建 .evn.local 文件,内容如下,其中 sk-xxxxxxxx 为你在 Deepseek Platform 中创建的 API Key”。`.evn.local` 应该为 `.env.local`
    作者回复

    是的,拼写错误,感谢反馈🙏

    2025-04-11 08:43:39

  • 轩爷

    2025-04-09 18:21:19

    我的操作步骤:
    1、让cursor帮我创建一个基于“vite+vue+ts+css”的基础项目,cursor直接拿vite的模板生成一个项目;
    2、由于本地运行,vite.config.ts添加代理配置,并支持跨域(此处结构也是让cursor帮我生成的),本机访问DeepSeek会遇到跨域问题;
    3、实际代码里面添加两个按钮,一个调用DeepSeek,一个调用Coze,fetch的endpoint写成vite.config.ts里配置的即可;
    4、扣子升级了API令牌的权限设置,我简单粗暴地全选了所有权限,设置了能够访问个人空间,否则会报没有权限的问题。
    作者回复

    太棒了👍

    2025-04-11 08:42:29

  • 术子米德

    2025-04-11 06:49:08

    官方文档,有用法,有示例,本课的价值点在哪里?
    作者回复

    这才刚开始呢,基础的东西总要讲一讲,建议再学下去你再下结论…

    2025-04-11 12:41:50

  • DARLY

    2025-05-09 11:20:06

    按照提示使用trae创建的项目没有vite工程化配置,后面又使用AI添加的相关配置。这段可以改下,对不善于思考的同学可能有点懵。
    作者回复

    有道理,我加一段话:

    2025-05-18 17:16:18

  • GKNick

    2025-04-14 14:10:03

    调用deepseek时,需要注意自己账户余额,否则会报错,这是对应官网错误码地址:https://api-docs.deepseek.com/zh-cn/quick_start/error_codes
  • leaf

    2025-06-09 17:26:22

    确认 API Token 权限是否勾选了“Bot聊天权限”,否则控制台会报错401权限问题
  • aaronxyz

    2025-06-09 14:02:27

    这里有2个必填
    ```ts
    const chatResponse = await fetchApi.post({
    url: constants.Coze.URL_Chat,
    authorization: `${constants.Coze.Authorization}`,
    payload: {
    bot_id: constants.Coze.BotId,
    user_id: '12312312313',
    query: '你好',
    auto_save_history: true,
    stream: false,
    custom_variables: {
    custom_prompt: '1+1',
    },
    additional_messages: [
    {
    role: 'user',
    content: '你好', // 必填
    content_type: 'text',
    },
    ],
    },
    });
    ```

    ```ts
    const chatResponse = await fetchApi.post({
    url,
    authorization: `${constants.Coze.Authorization}`,
    payload: {
    bot_id: constants.Coze.BotId,
    user: '12312312313',
    query: '你好', // 必填
    auto_save_history: true,
    stream: false,
    custom_variables: {
    custom_prompt: '1+1',
    },
    },
    });
    ```
  • 茶贝

    2025-05-07 16:40:18

    我的步骤:
    1、使用字节的trea AI工具初始化基础项目HTML+CSS+JS+vite
    2、进入kimi官网申请api_key
    3、让trea帮助生成对话框
    4、npm run dev 启动项目验证是否可以响应成功
    作者回复

    2025-05-18 17:17:25

  • 撒哈拉

    2025-04-29 15:47:31

    我根据你的提示词 trae builder 没有用vite创建项目,从GitHub中拷贝了一份
    作者回复

    嗯嗯,我修改一下文章,你可以让 builder 帮你初始化 vite 配置

    2025-05-18 17:24:14

  • Yully

    2025-04-24 15:44:18

    开始学习~这个例子有点基础。期待进阶使用~