Desert Ant Labs

更聪明的聊天,就在设备上。

消息发出前隐藏个人数据,发布前标记辱骂内容,边输入边推荐表情符号,还能转写语音消息,全部在设备上完成。

为聊天打造的 AI 模型

端到端加密的聊天里也能用

每个模型都在设备上运行:在消息加密之前,或解密之后处理它。你的服务器从不接触文本,因此加上这项功能,既不削弱加密,也不必新增任何要运维的服务。

没有按次调用费用

用户收发的每条消息都能检查,不按消息计费,也没有基础设施要运维。产品团队加一项功能,不必先预估云端开支。

比打字还快

Emo 推荐表情符号用时不到 2 毫秒,因此每按一个键,建议都会随之更新。Tongue 识别一条收到的消息是什么语言,只需几十微秒。

示例

每个示例都回放模型的真实输出。打开模型页面,就能用你自己的文本试一试。

Redact · PII 脱敏

发出银行账号或证件号码之前,先提醒一下

用户在消息框里输入时,Redact 就能找出其中的美国社会安全号码、银行卡号、IBAN 和电话号码。银行卡号和 IBAN 必须通过校验和,因此这类提醒很可靠。Redact 漏得最多的,是格式自由的姓名和地址。

88.8%捕获的个人数据
11.6MB设备端Apple;Android 和 Web 上为 24.5 MB
27语言
Redact

Toxic · 仇恨言论初筛 · 测试版

伤人的消息发出之前,再看一眼

每条消息发出之前,Toxic 都会为其中的仇恨、辱骂和威胁打分,支持 35 种语言。分数高时,给发送者一点时间改写。Toxic 是初筛工具,被标记的内容请交给人工复核,而不是直接删除。

35语言
3评分项仇恨、辱骂、威胁
102MB设备端Apple;Android 和 Web 上为 103 MB
Toxic

Moderator · 内容审核

不请自来的图片,在被看到之前先打上马赛克

Moderator 在发送者的设备上检查每张照片,因此即便在端到端加密的聊天里,也没有任何图片需要发到服务器上检查。裸露照片到达时已经打上马赛克,由接收者选择查看还是举报。

87.8%捕获的裸露内容
93.7%放行的正常照片
9.7MB设备端Apple;Android 和 Web 上为 9.2 MB
Moderator

Emo · 表情符号建议

跟着消息走的表情符号

每按一次键,Emo 都会更新建议:团队披萨聚会配 🍕,西班牙语的生日消息配 🎂,法语的牙医预约配 🦷。

<2ms每条建议
5MB设备端Apple;Android 和 Web 上为 11 MB
22语言
Emo

Tongue · 语言识别

只看开头几个词,就能提供翻译

Tongue 凭几个词就能识别收到的消息是什么语言,因此「翻译」按钮只会出现在需要翻译的消息上。翻译本身来自你自己的翻译服务。

84语言
2MB设备端内置于包中,无需下载
0.933FLORES-200,3 个词293 MB 的检测器为 0.887
Tongue

Voz · 语音识别

语音消息不用播放,直接读

Voz 转写语音消息时给每个词都标上时间,文字显示在波形下方,播放时逐词跟随。Voz 支持 25 种欧洲语言,可以搭配 Ear 先识别语种。

2s10 分钟音频iPhone 17 Pro
25语言欧洲语言
337MB磁盘占用Apple,首次使用时下载
Voz

开始使用

从同一个 SDK 安装你需要的模型,支持 Swift、Kotlin 和 JavaScript。示例用 Toxic 和 Redact 检查每一条发出的消息。

iOS, macOS, Linux, Windows

安装
// Swift Package Manager
.package(url: "https://github.com/Desert-Ant-Labs/desert-ant-core", from: "4.3.0")
// target dependencies
.product(name: "Redact", package: "desert-ant-core")
.product(name: "Toxic", package: "desert-ant-core")
.product(name: "Emo", package: "desert-ant-core")
.product(name: "Tongue", package: "desert-ant-core")
示例 - Swift
import Redact
import Toxic

let redact = Redact()
let toxic = Toxic()

// before a message is sent
let check = try await toxic.analyze(message)
if check.isToxic { askToRewrite(check.content) }

let r = try await redact.redaction(of: message)
if !r.items.isEmpty { offerToMask(r.items) }

Android

安装
// build.gradle.kts (Maven Central)
implementation("ai.desertant:redact:4.3.0")
implementation("ai.desertant:toxic:4.3.0")
implementation("ai.desertant:emo:4.3.0")
implementation("ai.desertant:tongue:4.3.0")
示例 - Kotlin
import ai.desertant.redact.Redact
import ai.desertant.toxic.Toxic

val redact = Redact(context)
val toxic = Toxic(context)

// before a message is sent
val check = toxic.analyze(message)
if (check.isToxic) askToRewrite(check.content)

val r = redact.redaction(message)
if (r.redactedText != message) offerToMask(r)

Web, Node.js

安装
npm i @desert-ant-labs/redact @desert-ant-labs/toxic @desert-ant-labs/emo @desert-ant-labs/tongue @litertjs/core
示例 - TypeScript
import { Redact } from "@desert-ant-labs/redact";
import { Toxic } from "@desert-ant-labs/toxic";

const redact = await Redact.load();
const toxic = await Toxic.load();

// before a message is sent
const check = await toxic.analyze(message);
if (check.isToxic) askToRewrite(check.content);

const r = await redact.redaction(message);
if (r.items.length) offerToMask(r.items);

在做聊天产品?

告诉我们你想为用户加上什么,我们会帮你挑选模型、规划集成。