
书生大模型
用书生大模型 API 驱动 Browser-Use 完成网页自动化任务
这篇教程讲清如何用书生大模型 API 搭建文本与多模态对话,再把模型接入 Browser-Use Web-UI,让智能体自动打开浏览器、查询信息并录制操作过程。内容包括 Token 获取、环境搭建、三轮对话上下文构造、图片理解调用,以及 Web-UI 的启动与选项配置。
书生大模型 API 提供了一套兼容 OpenAI 接口规范的调用方式,开发者可以用熟悉的 SDK 或原生 HTTP 请求,直接调用 InternLM 系列文本模型与 InternVL 系列多模态模型。把这类模型接到 Browser-Use 上,就能让模型自己打开浏览器、点击页面、读取结果,完成「去某个网站查一下今天的天气」这类自然语言任务。这篇教程面向刚接触大模型 API、想动手做一次网页自动化的读者,从申请 Token 开始,一路做到在 Browser-Use Web-UI 里跑通任务并录制过程。站内也有对应的工具条目,可以先看一眼:书生大模型。
需要说明的是,模型版本、接口地址、配额与计费方式都可能调整,文中出现的具体取值仅用于说明调用结构,实际使用时请以官网当前信息为准。
准备工作
账号与 API Token
第一步是拿到可用的 API Token。访问书生 AI 官网完成注册,申请 API 权限,进入 API 页面后点击获取个人密钥,再创建一个 API Token。创建时会给 Token 起一个名字,确认之后页面会显示一串字符。
这里有一个容易踩的坑:Token 只显示一次,点击确认后就不可见,必须当场复制并妥善保存。如果没保存下来,只能重新创建一个。另外,不要把 Token 直接硬编码在源码里,也不要把带 Token 的文件提交到公开仓库。
Python 与依赖
文本与多模态调用部分只需要 Python 环境和两个库:
pip install requests openai
pip install dotenv
openai 用来走兼容 OpenAI 的 SDK 调用方式,requests 用来演示原生 HTTP 调用,dotenv 负责从 .env 文件加载环境变量。
Browser-Use 侧的环境
如果要跑后面的网页自动化部分,还需要准备 Git、uv 和浏览器内核。Git 用于克隆项目,uv 用于创建隔离的虚拟环境并安装依赖,Playwright 负责提供 Chromium 浏览器。
Windows 上安装 Git 时下载对应版本的安装程序,按向导默认设置完成安装,然后在终端执行下面的命令确认安装成功:
git --version
uv 可以直接用 pip 安装,要求 Python 版本在 3.8 及以上:
pip install uv
uv --version
如果终端提示找不到 uv 命令,需要把 uv 的可执行文件所在目录手动加入环境变量 PATH。
操作步骤
第一步:把 Token 放进环境变量
先建一个工作目录,并在其中创建 .env 文件:
mkdir -p /root/Internlm && cd /root/Internlm
touch .env
在 .env 里按下面的形式写入 Token,变量名可以自定义,后文代码要与之一致:
InternLM="your_api_token"
第二步:用 OpenAI SDK 发起文本对话
核心是把 base_url 指向书生大模型的接口地址,把 api_key 换成自己的 Token,模型名填文本模型。下面的例子构造了一段带历史消息的对话:
from openai import OpenAI
from dotenv import load_dotenv
import os
InternLM_api_key = os.getenv("InternLM", load_dotenv())
client = OpenAI(
api_key=InternLM_api_key,
base_url="https://chat.intern-ai.org.cn/api/v1/"
)
chat_rsp = client.chat.completions.create(
model="internlm3-latest",
messages=[
{"role": "user", "content": "你知道刘慈欣吗?"},
{"role": "assistant", "content": "我是一个人工智能助手,我知道刘慈欣。他是一位著名的中国科幻小说家和工程师,曾经获得过多项奖项,包括雨果奖、星云奖等。"},
{"role": "user", "content": "他什么作品得过雨果奖?"}
],
stream=False
)
for choice in chat_rsp.choices:
print(choice.message.content)
messages 里的 role 支持 user、assistant、system、tool 四种取值。把上一轮的问答按顺序放进列表,模型就能在上下文中理解「他」指的是谁。
如果改用流式输出,把 stream 设为 True,返回对象就变成可迭代的块,需要逐块取增量内容:
for chunk in chat_rsp:
print(chunk.choices[0].delta.content)
第三步:用原生 requests 调用
不想引入 SDK 时,直接发 HTTP 请求也可以。请求头里带 Content-Type 和 Authorization,请求体是 JSON,字段与 SDK 的参数一一对应:
import requests
import json
from dotenv import load_dotenv
import os
InternLM_api_key = os.getenv("InternLM", load_dotenv())
url = 'https://chat.intern-ai.org.cn/api/v1/chat/completions'
header = {
'Content-Type': 'application/json',
"Authorization": "Bearer " + InternLM_api_key,
}
data = {
"model": "internlm3-latest",
"messages": [{"role": "user", "content": "你好~"}],
"n": 1,
"temperature": 0.8,
"top_p": 0.9
}
res = requests.post(url, headers=header, data=json.dumps(data))
print(res.status_code)
print(res.json())
print(res.json()["choices"][0]['message']["content"])
其中 n 控制生成几条候选回复,temperature 控制随机性,top_p 控制采样范围。回复正文在 choices[0].message.content 里。
第四步:发送图片做多模态理解
多模态调用要换成视觉模型,并且把用户消息的 content 从字符串改成数组,数组里每一项是一个内容块,type 支持 text 和 image_url:
from openai import OpenAI
from dotenv import load_dotenv
import os
InternLM_api_key = os.getenv("InternLM", load_dotenv())
client = OpenAI(
api_key=InternLM_api_key,
base_url="https://chat.intern-ai.org.cn/api/v1/"
)
chat_rsp = client.chat.completions.create(
model="internvl2.5-latest",
messages=[
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好,我是 internvl"},
{
"role": "user",
"content": [
{"type": "text", "text": "Describe these two images please"},
{"type": "image_url", "image_url": {"url": "https://example.com/image1.jpg"}},
{"type": "image_url", "image_url": {"url": "https://example.com/image2.jpg"}}
]
}
],
n=1,
stream=False
)
for choice in chat_rsp.choices:
print(choice.message.content)
image_url 里的 url 既可以是互联网上公开可访问的图片地址,也可以是图片的 base64 编码。单轮对话支持一次上传多张图片。实际测试中,模型有时只识别到其中一张,回复里会明确说明「我只能看到一张图片」,这属于模型对多图输入的识别表现,遇到时可以把图片拆成多轮分别提问。
第五步:构造三轮对话并拿到最终回复
把多轮文本与图片混在一起,就是完整的上下文构造。下面这段代码先进行两轮纯文本问答,第三轮再带上两张图片,同时用 temperature 和 max_tokens 控制输出:
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv()
InternLM_api_key = os.getenv("InternLM")
client = OpenAI(
api_key=InternLM_api_key,
base_url="https://chat.intern-ai.org.cn/api/v1/"
)
messages = [
{"role": "user", "content": "你好,请介绍一下你自己"},
{"role": "assistant", "content": "你好!我是 InternVL,一个多模态AI助手。我可以理解和分析文本与图像,帮助您处理各种任务,包括图像描述、视觉问答、文档理解等。有什么我可以帮助您的吗?"},
{"role": "user", "content": "你能处理哪些类型的图像任务?"},
{"role": "assistant", "content": "我可以处理多种图像任务:\n1. 图像描述:详细描述图片内容\n2. 视觉问答:回答关于图片的问题\n3. 图像对比:分析多张图片的异同\n4. OCR识别:提取图片中的文字\n5. 图表分析:理解图表、图形数据\n6. 场景理解:识别图片中的物体、人物和场景"},
{
"role": "user",
"content": [
{"type": "text", "text": "请分析这两张图片,告诉我它们分别展示了什么产品,以及它们的主要特点"},
{"type": "image_url", "image_url": {"url": "https://example.com/product1.jpg"}},
{"type": "image_url", "image_url": {"url": "https://example.com/product2.jpg"}}
]
}
]
try:
chat_rsp = client.chat.completions.create(
model="internvl2.5-latest",
messages=messages,
n=1,
stream=False,
temperature=0.8,
max_tokens=500
)
print("=== API 最终回复 ===")
for choice in chat_rsp.choices:
print(choice.message.content)
except Exception as e:
print(f"API调用出错: {str(e)}")
把整个 messages 列表再遍历打印一遍,就能看到完整的对话历史,方便核对上下文是否正确。注意第三轮的用户消息是数组,打印时要取第一个元素的 text 字段,并统计图片数量。
第六步:创建 Browser-Use 项目环境
新建一个项目文件夹并用编辑器打开,在终端里创建虚拟环境。这里指定 Python 3.11:
uv venv Internlm --python 3.11
Windows PowerShell 下激活虚拟环境:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\Internlm\Scripts\Activate.ps1
第七步:克隆项目并安装依赖
把 Browser-Use 的 Web-UI 项目克隆到本地,进入 web-ui 目录后安装依赖。下载慢时可以临时指定镜像源:
git clone https://github.com/browser-use/web-ui.git
cd web-ui
uv pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
接着安装 Playwright 的 Chromium 浏览器内核:
playwright install --with-deps chromium
web-ui 目录下有一个 .env.example,它是项目的启动配置模板,复制一份并重命名为 .env:
cp .env.example .env
第八步:启动 Web-UI
在项目目录下运行:
python webui.py --ip 127.0.0.1 --port 7788
如果启动时报出 TypeError: argument of type 'bool' is not iterable 这类 ASGI 应用异常,通常是 gradio 版本过旧,升级到最新版即可:
uv pip install --upgrade gradio -i https://pypi.tuna.tsinghua.edu.cn/simple
第九步:配置模型与 API Key
打开 Web-UI 页面后,在 LLM Settings 区域选择 Intern 模型。这里有一个关键区别:
- 选择
internvl-latest时,模型具备视觉能力,可以处理页面截图。 - 选择文本模型
internlm时,必须把 Agent Settings 里的 Use Vision 选项去掉,因为文本模型不支持图像识别。
API KEY 一栏填入前面拿到的 Token。也可以不在这里填,而是直接写进项目的 .env 文件,由程序启动时读取。
第十步:运行任务并录制过程
在 Run Agent 输入框里用自然语言描述任务,点击 Run Agent 开始执行。例如:
去百度查一下今天上海的天气,给我结果
模型会自行规划步骤、打开浏览器、在搜索框输入关键词、读取页面内容,最后把结果整理出来。执行过程中,Web-UI 会展示每一步的思考与操作。
Browser-Use Web-UI 自带录制功能,可以把整个操作浏览器的过程录下来。录制完成后,视频可以直接用于作业提交或过程复盘。第二个可以尝试的任务是让模型访问书生 AI 官网、等待页面加载、获取 Token 并命名,最后把结果返回——这类任务涉及登录态与页面等待,更适合用来观察模型在复杂页面上的表现。
一个完整示例
下面把前面的步骤串成一个最小可跑通的流程:先用 API 做一次带图片的三轮对话,再让 Browser-Use 执行一个查询任务。
准备阶段
- 在书生 AI 官网注册并创建 API Token,当场复制保存。
- 执行
pip install requests openai dotenv。 - 创建项目目录,写入
.env,内容为InternLM="你的Token"。
调用阶段
把第五步的三轮对话代码保存为 chat_demo.py,在项目目录下运行:
python chat_demo.py
终端会打印出模型对两张图片的分析结果。如果只想验证文本链路,把第三轮消息换成纯字符串即可,模型名也相应换成文本模型。
自动化阶段
- 执行
uv venv Internlm --python 3.11创建环境并激活。 - 克隆 web-ui 项目,进入目录,执行
uv pip install -r requirements.txt。 - 执行
playwright install --with-deps chromium。 - 复制
.env.example为.env。 - 执行
python webui.py --ip 127.0.0.1 --port 7788。 - 浏览器打开本地页面,LLM Settings 选
internvl-latest,填入 API KEY。 - 在 Run Agent 输入「去百度查一下今天上海的天气,给我结果」,点击运行。
- 开启录制,保存操作过程。
整个流程跑通后,就同时验证了两件事:API 侧的文本与多模态调用是通的,Browser-Use 侧的模型接入与浏览器控制也是通的。
注意事项
- Token 只显示一次。创建后页面不再展示,务必当场复制;泄露后应重新创建并废弃旧的。
- 不要把 Token 写进代码。用
.env加环境变量加载,避免随源码一起外泄。 - 模型能力要匹配任务。文本模型不支持图像识别,在 Web-UI 里选了文本模型就必须关闭 Use Vision,否则页面截图无法被理解。
- 多图输入可能只识别到一张。模型回复中会说明只看到一张图片,需要多图对比时建议拆成多轮提问。
- gradio 版本过旧会导致启动失败。遇到
bool is not iterable一类报错,先升级 gradio 再重试。 - uv 命令找不到。安装完成后需要把可执行文件目录加入 PATH,否则终端无法识别。
- 依赖下载慢。安装 Python 包时可以临时用
-i指定镜像源加速,这只影响下载速度,不改变包内容。 - 版本、配额与计费以官网为准。模型名称、接口地址、可用额度都可能变化,正式使用前请核对官网当前信息。