App Inventor 2 LLMAI2Ext 自研拓展:接入DeepSeek、Kimi、通义千问...等国内大模型

« 返回首页

更新日志

  • v2.1
    • DeepSeek 支持图片识别(视觉):新增 ChatWithImage / ChatWithImageUrl 方法。需先把 ModelName 设为官方视觉模型 deepseek-v4-flash-vision-expdeepseek-v4-flash / deepseek-v4-pro 是纯文本模型,传图会被拒绝)。图片支持 JPEG/PNG/GIF/WebP;不支持视频。
  • v2.0
    • DeepSeek 升级 V4 模型,新增思考模式开关(ThinkingEnabled)和思考强度控制(ReasoningEffort)。
    • 模型名称更新:deepseek-v4-flash(快速模型)、deepseek-v4-pro(深度思考模型);旧名 deepseek-chat / deepseek-reasoner 将于 2026/07/24 弃用。
    • 豆包 ModelName 说明澄清:接入点ID(ep- 开头)或直接填模型名(如 doubao-seed-1.6)均可,组件原样传给方舟自动识别;并明确 ImageModelName / ImageSize / ImageWatermark 仅用于文生图/图生图,对话与识图一律用 ModelName
    • 豆包(Doubao) 组件新增 文生图 / 图生图(Seedream):GenerateImage / GenerateImageFromUrl 方法 + GotImage 事件,配套 ImageModelName / ImageSize / ImageWatermark 属性。
    • 新增 豆包(Doubao) 大模型组件(火山引擎 Ark 平台),支持对话、图片/视频多模态识别。
    • 思考模式重构:推理(思考)过程改由独立的 GotReasoning 事件输出——想看思考过程就连接该事件,不连接即等于隐藏;因此 移除了 HideReason 属性,减少学习负担。
    • 多模态完善:豆包 / Kimi / 通义千问 支持图片识别(ChatWithImage / ChatWithImageUrl)与视频理解(ChatWithVideoUrl),需使用对应的视觉/视频模型。
  • v1.1
    • 支持多轮对话,新增方法 StartNewChat 可以开启一个新对话。
    • 新增 HideReason 属性,可以隐藏 DeepSeek-R1等模型的 推理过程的输出,让模型回答输出更简洁。
  • v1.0
    • 首发,支持 DeepSeek / Kimi / 通义千问,默认流式输出。

中文网开发国内大模型拓展的初衷

App Inventor 2 原生的ChatGPT组件由于是国外的,使用起来不太便捷,且各种限制。

如今我们又身处AI浪潮之中,包括很多学校在内的国内用户都有AI结合传统的App来开发具有智能App的需求,因此,必须开发拓展以接入国内大模型,对,它专门接国内大模型的,国外的不接。

拓展接口参考了原生ChatGPT组件的简洁设计,在其基础上更加简化,还引入了它不支持的流式输出模式,且默认输出模式就是流式的,类似打字机的效果,当然也可以切换非流式,模型回答完成时一把输出。

v2.1 版本现已上线,DeepSeek 组件已升级支持 V4 模型、思考模式和图片识别,目前支持4个大模型的接入(DeepSeek、Kimi、通义千问、豆包)——其中 DeepSeek / Kimi / 通义千问 / 豆包 都支持图片识别,豆包还支持文生图/图生图。由于拓展是在最新源码平台上编译出来的,可能有些较老的平台不能很好的运行,有条件的话还是建议使用我们的平台,也会优先获得反馈支持。

当然,好的产品是需要不断迭代的,这款拓展也不例外,欢迎使用并期待您的反馈!

拓展下载

注:所有大模型拓展共一个.aix拓展文件,里面有多个拓展组件,导入.aix效果参考如下:

ext

回答效果参考如下:

llm

我们尽量将接口方法设计得简单易用,由于demo中包含了APIKey,因此不直接提供aia源码,这里以Kimi为例,附上代码块:

开始对话:

kimi

切换输出模式(默认流式输出,可切换非流式一把输出内容):

kimi

流式输出响应事件,每输出一部分内容都会回调一次,追加展示;最后一次回调时 finished 参数为

kimi

非流式输出,只回调一次,内容直接展示即可:

kimi


大模型输出的 Markdown 格式,可以结合 Markdown拓展 进行实时渲染,效果如下:

错误通知

与模型对话过程中,如果发生异常,比如APIKey认证失败等错误,将触发屏幕出现错误时 事件,然后在这个事件中可以定制个性化的错误处理逻辑。

使用示例

下面每张积木图的右上角都有「复制代码块」,点一下,再到代码块编辑器里按 Ctrl+V, 积木就直接进工程了——不用照着一块块拖。

示例使用中文版设计器中的按钮1标签1等原生组件;拓展组件使用英文名(DeepSeek1Doubao1)。 粘贴后如果工程里没有同名组件,组件块会标红,把名字改成你自己的组件即可。

1. 最简单的一问一答

关掉流式,一次性拿到完整回答。适合翻译、润色这类「问一次、答一段」的功能。以下对话案例使用按钮标签文本输入框等原生组件。

when Screen1.Initialize() {
  DeepSeek1.StreamMode = false
}

when 按钮_发送.Click() {
  标签_回答.Text = "思考中…"
  DeepSeek1.Chat(文本输入框_提问.Text)
}

when DeepSeek1.GotText(text) {
  标签_回答.Text = text
}

2. 流式输出,边生成边显示

保持 StreamMode 为真(默认),回答会一段一段返回,等待感明显更低。 关键是把新内容追加到已有文本后面,而不是覆盖——这是最常见的错误。

when 按钮_发送.Click() {
  标签_回答.Text = ""
  DeepSeek1.Chat(文本输入框_提问.Text)
}

when DeepSeek1.GotStream(part, finished) {
  标签_回答.Text = join(标签_回答.Text, part)
}

每次提问前把标签清空,否则新回答会接在上一轮后面。

3. 显示思考过程

开启思考模式后模型先推理再回答。推理内容走 GotReasoning,回答内容仍走 GotStream, 两条通道完全分开,可以放进两个标签。不想显示思考过程,不连接 GotReasoning 即可。

when Screen1.Initialize() {
  DeepSeek1.ModelName = "deepseek-v4-pro"
  DeepSeek1.ThinkingEnabled = true
}

when 按钮_发送.Click() {
  标签_思考.Text = ""
  标签_回答.Text = ""
  DeepSeek1.Chat(文本输入框_提问.Text)
}

when DeepSeek1.GotReasoning(part, finished) {
  标签_思考.Text = join(标签_思考.Text, part)
}

when DeepSeek1.GotStream(part, finished) {
  标签_回答.Text = join(标签_回答.Text, part)
}

4. 多轮对话与重开一轮

拓展默认就是多轮对话:连续调用 Chat,模型记得前面聊过什么。 想让它忘掉上下文(比如换个话题、或上下文太长开始跑偏),调用 StartNewChat

when 按钮_发送.Click() {
  标签_回答.Text = ""
  DeepSeek1.Chat(文本输入框_提问.Text)
}

when 按钮_新对话.Click() {
  DeepSeek1.StartNewChat()
  标签_回答.Text = ""
  标签_提示.Text = "已开启新对话,模型不再记得之前聊过什么"
}

5. 防止重复点击,给出「回答中」状态

流式回答期间用户容易连点发送。用 finished 判断本轮结束,再把按钮放开。

when 按钮_发送.Click() {
  if 文本输入框_提问.Text == "" {
    标签_提示.Text = "请先输入问题"
  } else {
    按钮_发送.Enabled = false
    按钮_发送.Text = "回答中…"
    标签_回答.Text = ""
    DeepSeek1.Chat(文本输入框_提问.Text)
  }
}

when DeepSeek1.GotStream(part, finished) {
  标签_回答.Text = join(标签_回答.Text, part)
  if finished {
    按钮_发送.Enabled = true
    按钮_发送.Text = "发送"
  }
}

6. 让模型看图说话

需要支持视觉的模型(DeepSeek、豆包、Kimi、通义千问的视觉模型)。 本地图片用 ChatWithImage,网络图片用 ChatWithImageUrl。 使用图像选择器选择图片,交给图像组件显示。

when 按钮_选图.Click() {
  图像选择器1.Open()
}

when 图像选择器1.AfterPicking() {
  图像1.Picture = 图像选择器1.Selection
  标签_回答.Text = ""
  Doubao1.ChatWithImage("请描述这张图片里有什么", 图像选择器1.Selection)
}

when Doubao1.GotStream(part, finished) {
  标签_回答.Text = join(标签_回答.Text, part)
}

7. 拍照识物(DeepSeek 视觉模型)

DeepSeek 识图要用官方视觉模型 deepseek-v4-flash-vision-exp——启动时先把 ModelName 切过去 (deepseek-v4-flash / deepseek-v4-pro 是纯文本模型,传图会报错)。用照相机组件拍一张, 拍完的本地图片路径由拍摄完成事件带回,直接喂给 ChatWithImage;也可以交给图像组件显示。

when Screen1.Initialize() {
  DeepSeek1.ModelName = "deepseek-v4-flash-vision-exp"
}

when 按钮_拍照.Click() {
  照相机1.TakePicture()
}

when 照相机1.AfterPicture(image) {
  图像1.Picture = image
  标签_回答.Text = ""
  DeepSeek1.ChatWithImage("拍到了什么?给出名称和一句简介", image)
}

when DeepSeek1.GotStream(part, finished) {
  标签_回答.Text = join(标签_回答.Text, part)
}

识图对上下文同样生效:紧接着再 Chat("它多少钱?"),模型记得刚才那张图。 每张图最多折算 384 个 token,不必刻意压图;但单图不要超过 32MB。

8. 文生图

仅豆包提供。GenerateImage 发起后立刻返回,图片地址由 GotImage 事件送回,可交给图像组件显示。

when 按钮_画图.Click() {
  标签_提示.Text = "正在生成,请稍候…"
  Doubao1.GenerateImage(文本输入框_提问.Text)
}

when Doubao1.GotImage(imageUrl) {
  图像1.Picture = imageUrl
  标签_提示.Text = "生成完成(该链接有时效,请尽快保存)"
}

返回的是临时链接,过期后图片就打不开了。要长期保留,请及时下载到本地。

9. 处理错误

API Key 不对、余额不足、网络不通等都会触发屏幕出现错误时事件。 记得在这里把界面状态复位,否则按钮会一直卡在「回答中」。

when Screen1.ErrorOccurred(component, functionName, errorNumber, message) {
  按钮_发送.Enabled = true
  按钮_发送.Text = "发送"
  标签_提示.Text = join("出错了:", message)
}

DeepSeek

使用AppInventor2接入DeepSeek大模型(支持思考模式与图片识别)。从深度求索获取 API Key »

v2.1 起支持图片识别:把 ModelName 设为视觉模型 deepseek-v4-flash-vision-exp 后, 即可用 ChatWithImage(本地图片)或 ChatWithImageUrl(图片URL)发图提问。图片支持 JPEG/PNG/GIF/WebP,每张最多折算 384 个 token;不支持视频

当然也可以对接其他厂商部署的DeepSeek服务,比如百度、阿里都有部署,这里选择阿里的DeepSeek服务进行测试验证:

BaseURL 由官方的改为:https://dashscope.aliyuncs.com/compatible-mode/v1

APIKey 用阿里云的。

ModelName 指定:deepseek-v3 或 deepseek-r1 (注意:第三方的模型名称和官方的不太一样)

参考测试结果如下:

llm

属性

APIKey
模型的Api Key。从深度求索获取 API Key »
BaseURL
DeepSeek 基础 URL,默认是官方地址,可修改接入第三方DeepSeek服务地址。
ModelName
模型名称。官方模型填 deepseek-v4-flash(快速模型)、deepseek-v4-pro(深度思考模型)或 deepseek-v4-flash-vision-exp(视觉模型,识图用)。旧名 deepseek-chat / deepseek-reasoner 将于 2026/07/24 弃用。 (注意:第三方的模型名称和官方的不太一样)
StreamMode
流式输出模式是否开启,默认’真’。 流式输出,即生成内容时边计算边返回,减少等待时间,提高响应速度,适用于聊天、代码补全等场景。 不开启,则是最终仅一次返回全部内容。
ThinkingEnabled
思考模式开关。开启后模型会先思考再回答,回答质量更高但耗时更长、token 消耗更多。默认关闭。 仅对 DeepSeek V4 模型有效,其他模型会忽略此参数。
ReasoningEffort
思考强度控制。high 适合普通对话(默认),max 适合复杂推理和 Agent 类请求。 仅对 DeepSeek V4 模型有效,且 ThinkingEnabled 为真时才生效。

关于「隐藏推理过程」:v2.0 早期版本曾提供 HideReason 属性,现已移除。是否显示思考过程改由「是否连接 GotReasoning 事件」决定——想看就连接该事件,不连接即等于隐藏。

事件

GotStream(part,finished)
流式输出,每当有内容返回时都会触发该事件。part 为当前增量的部分内容,finished 标识输出是否已结束。
GotReasoning(part,finished)
模型推理(思考)过程输出事件。part 为推理过程的增量内容,finished 标识推理是否结束。仅支持推理的模型(如 DeepSeek 思考模式)会触发。如果不需要显示思考过程,不连接本事件即可(即等于隐藏);回答内容仍通过 GotStream / GotText 输出。
GotText(text)
非流式输出完成时触发该事件。text 为完整输出内容。

方法

Chat(content)
开始与 DeepSeek 大模型进行对话。
ChatWithImage(prompt,imagePath)
多模态对话:发送本地图片+文本。需先把 ModelName 设为视觉模型 deepseek-v4-flash-vision-expdeepseek-v4-flash / deepseek-v4-pro 是纯文本模型,不支持图片)。
ChatWithImageUrl(prompt,imageUrl)
多模态对话:发送图片URL+文本。需先把 ModelName 设为视觉模型 deepseek-v4-flash-vision-exp
StartNewChat()
开启新对话。默认为多轮对话,此方法将开启一个全新的对话上下文。

Kimi

使用AppInventor2接入Kimi大模型。从 Moonshot 获取 API Key »

属性

APIKey
模型的Api Key。从 Moonshot 获取 API Key »
ModelName
模型名称。
StreamMode
流式输出模式是否开启,默认’真’。 流式输出,即生成内容时边计算边返回,减少等待时间,提高响应速度,适用于聊天、代码补全等场景。 不开启,则是最终仅一次返回全部内容。

事件

GotStream(part,finished)
流式输出,每当有内容返回时都会触发该事件。part 为当前增量的部分内容,finished 标识输出是否已结束。
GotReasoning(part,finished)
模型推理(思考)过程输出事件。不连接本事件即等于隐藏思考过程。回答内容仍通过 GotStream / GotText 输出。
GotText(text)
非流式输出完成时触发该事件。text 为完整输出内容。

方法

Chat(content)
开始与 Kimi 大模型进行对话。
ChatWithImage(prompt,imagePath)
多模态对话:发送本地图片+文本。需使用支持视觉的模型(如 kimi-vl-a32b)。
ChatWithImageUrl(prompt,imageUrl)
多模态对话:发送图片URL+文本。需使用支持视觉的模型。
ChatWithVideoUrl(prompt,videoUrl)
视频多模态对话:发送视频URL+文本。需使用支持视频理解的模型。
StartNewChat()
开启新对话。默认为多轮对话,此方法将开启一个全新的对话上下文。

阿里通义千问

使用AppInventor2接入阿里通义千问大模型。从阿里云获取 API Key »

llm

属性

APIKey
模型的Api Key。从阿里云获取 API Key »
ModelName
模型名称。
StreamMode
流式输出模式是否开启,默认’真’。 流式输出,即生成内容时边计算边返回,减少等待时间,提高响应速度,适用于聊天、代码补全等场景。 不开启,则是最终仅一次返回全部内容。

事件

GotStream(part,finished)
流式输出,每当有内容返回时都会触发该事件。part 为当前增量的部分内容,finished 标识输出是否已结束。
GotReasoning(part,finished)
模型推理(思考)过程输出事件。不连接本事件即等于隐藏思考过程。回答内容仍通过 GotStream / GotText 输出。
GotText(text)
非流式输出完成时触发该事件。text 为完整输出内容。

方法

Chat(content)
开始与千问大模型进行对话。
ChatWithImage(prompt,imagePath)
多模态对话:发送本地图片+文本。需使用支持视觉的模型(如 qwen-vl-plus)。
ChatWithImageUrl(prompt,imageUrl)
多模态对话:发送图片URL+文本。需使用支持视觉的模型。
ChatWithVideoUrl(prompt,videoUrl)
视频多模态对话:发送视频URL+文本。需使用支持视频理解的模型(如 qwen-vl-max)。
StartNewChat()
开启新对话。默认为多轮对话,此方法将开启一个全新的对话上下文。

豆包

使用 AppInventor2 接入字节跳动豆包大模型(火山引擎 Ark 平台),支持对话、图片/视频多模态识别,以及 文生图 / 图生图(Seedream)。从火山引擎获取 API Key 及接入点 »

豆包的 ModelName对话/识图模型:可以是接入点ID(ep- 开头,在 Ark 平台「在线推理」创建),也可直接填模型名(如 doubao-seed-1.6,需 API Key 鉴权,默认最新版)——两者均可,组件原样传给方舟自动识别。注意:对话(Chat)和识图(ChatWithImage / ChatWithImageUrl / ChatWithVideoUrl)都用 ModelName只有文生图/图生图(GenerateImage / GenerateImageFromUrl)用独立的图片模型(如 doubao-seedream-4-0-250828),填入 ImageModelName

文生图/图生图返回的是一个 临时图片URL(通过 GotImage 事件返回),可直接用 图像 组件显示;该URL有时效,建议尽快下载保存到本地。

属性

APIKey
火山引擎 API Key。从火山引擎获取 API Key »
BaseURL
API 基础URL,默认火山引擎 Ark 平台地址 https://ark.cn-beijing.volces.com/api/v3
ModelName
对话/识图模型。两种填法均可:① 接入点ID(ep- 开头,如 ep-20250101xxxxx,在 Ark 平台「在线推理」创建);② 直接填模型名(如 doubao-seed-1.6doubao-pro-32k-240515,需 API Key 鉴权,默认最新版)。组件原样传给方舟,方舟自动识别。
StreamMode
流式输出模式是否开启,默认’真’。不开启则最终一次返回全部内容。
ImageModelName
【仅文生图/图生图用】生图模型,如 doubao-seedream-4-0-250828doubao-seedream-5.0-lite。对话(Chat)和识图(ChatWithImage 等)都用 ModelName、不读本属性,只有 GenerateImage / GenerateImageFromUrl 才用它。
ImageSize
【仅文生图】生成图片尺寸:可填 1K/2K/4K,或具体像素如 1024x10242048x2048。默认 2K
ImageWatermark
【仅文生图】生成的图片是否添加水印,默认不加。

事件

GotStream(part,finished)
流式输出,每当有内容返回时都会触发该事件。part 为当前增量的部分内容,finished 标识输出是否已结束。
GotReasoning(part,finished)
模型推理(思考)过程输出事件。不连接本事件即等于隐藏思考过程。回答内容仍通过 GotStream / GotText 输出。
GotText(text)
非流式输出完成时触发该事件。text 为完整输出内容。
GotImage(imageUrl)
图片生成完成时触发。imageUrl 为生成图片的临时URL(可用图像组件显示,建议尽快下载保存——该URL有时效)。

方法

Chat(content)
开始与豆包大模型对话。
ChatWithImage(prompt,imagePath)
多模态对话:发送本地图片+文本。
ChatWithImageUrl(prompt,imageUrl)
多模态对话:发送图片URL+文本。
ChatWithVideoUrl(prompt,videoUrl)
视频多模态对话:发送视频URL+文本。需使用支持视频理解的模型。
GenerateImage(prompt)
文生图:根据文字描述生成图片。生成完成会触发 GotImage 事件返回图片URL。prompt 为图片描述(≤300汉字)。
GenerateImageFromUrl(prompt,imageUrl)
图生图:基于一张参考图URL + 文字描述生成新图片。生成完成触发 GotImage 事件。
StartNewChat()
开启新对话。默认为多轮对话,此方法将开启一个全新的对话上下文。

Q & A

Q:使用标签进行输出,内容较多部分内容被隐藏,该如何让其可上下滚动呢?

A:请参考《App Inventor 2 标签内容过多,如何做到可上下滑动?》


Q:如何把图片发给大模型?是否支持此项功能?

A:现已支持!使用支持视觉的模型(DeepSeek、豆包、Kimi、通义千问的视觉模型——DeepSeek 需把 ModelName 设为 deepseek-v4-flash-vision-exp),调用 ChatWithImage(本地图片)或 ChatWithImageUrl(图片网络地址)即可把图片发给大模型识别。此外豆包还支持反向的 文生图/图生图GenerateImage / GenerateImageFromUrl)。

文档反馈