团队接入AI网关,为什么我坚持让Flutter端直连流式接口
一个管理者的真实顾虑
上个月,我们四人的小团队决定在App里加一个AI对话功能。讨论会上出现了两种声音:
一种是“后端做个中转服务,Flutter只管调我们自己的接口”。理由是可控、安全。另一种是“直接用OpenAI兼容的AI网关,客户端直连,省一个后端模块”。
我最终选了后者,但加了几条管控规则。这篇文章分享的就是这套决策和落地过程——尤其是Flutter端如何实现流式(SSE)对话,以及作为团队负责人,你需要提前想清楚的三件事。
为什么选AI网关直连
传统做法是:Flutter → 自建后端 → 模型API。这条链路的问题在于,对于一个没有专职运维的小团队,自建中转意味着:
- 多一个要部署、监控、扩容的服务
- 流式转发(SSE透传)在后端做反而容易出bug
- 模型切换时,后端和中转层都要改
而ThisToken.AI这类OpenAI兼容的AI网关,统一了协议:Flutter端按OpenAI格式发请求,换模型只改一个字符串。这正是我们在另一篇文章里讨论过的“接口写三遍”问题的解法,这里不再展开。
管理者需要想清楚的三件事:
- 密钥归属:API Key由谁申请、谁保管、如何轮换。建议团队共用网关账号,密钥由一人统一管理(具体价格以官网价格页为准)。
- 用量边界:上线前设置调用上限,避免某个客户端bug把预算烧穿。
- 降级预案:模型不可用时用户看到什么。流式接口的超时和断线处理必须写进验收标准。
准备工作:注册与获取Key
- 打开 https://api.thistoken.ai/register 注册团队账号(建议用公司邮箱,方便后续成员协作与账单管理)。
- 进入控制台,创建API Key。建议按环境分Key:
dev-staging、prod-app,出问题时可以单独禁用某一个,不影响全局。 - 记下Base URL:
https://api.thistoken.ai/v1。所有请求都走这个地址。
团队协作上,我建议把Key放进环境变量或CI的Secret里,代码仓库中只留占位符。这一条写进Code Review清单。
Flutter端流式对话的实现
Flutter中处理SSE流式响应,最简单的方案是 http 包的 StreamedRequest。下面这段代码可以直接跑通:
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
Future<void> chatStream(String userMessage) async {
final request = http.Request(
'POST',
Uri.parse('https://api.thistoken.ai/v1/chat/completions'),
);
// Key从环境变量或安全存储读取,不要硬编码进仓库
request.headers['Content-Type'] = 'application/json';
request.headers['Authorization'] =
'Bearer ${const String.fromEnvironment('THISTOKEN_API_KEY')}';
request.body = jsonEncode({
'model': 'gpt-4o-mini', // 换模型只改这一行
'stream': true,
'messages': [
{'role': 'system', 'content': '你是一个简洁的助手'},
{'role': 'user', 'content': userMessage},
],
});
final response = await http.Client().send(request);
final lines = response.stream
.transform(utf8.decoder)
.transform(const LineSplitter());
await for (final line in lines) {
if (!line.startsWith('data: ')) continue;
final payload = line.substring(6).trim();
if (payload == '[DONE]') break;
final delta = jsonDecode(payload)['choices'][0]['delta']['content'];
if (delta != null) {
stdout.write(delta); // 实际项目中用setState更新UI
}
}
}
void main() async {
await chatStream('用一句话介绍流式输出');
}运行方式:
flutter run --dart-define=THISTOKEN_API_KEY=sk-你的密钥几个团队规范层面的细节:
stream: true是流式的开关,忘了写就是一次性返回,用户会盯着空白转圈。- UI层用
StreamBuilder消费,上面代码里stdout.write换成你的文本组件更新即可。 - 错误处理要区分:网络断开、Key失效、模型限流,给用户的提示应该不同。这是验收时最容易漏的一项。
风险控制清单
作为管事的人,我最后落了这张清单,上线前逐项打勾:
| 项目 | 措施 |
|---|---|
| 密钥泄露 | 按环境分Key,进安全存储,禁用走流程 |
| 预算失控 | 控制台设调用上限,用量告警(费用以官网价格页为准) |
| 体验劣化 | 客户端做30秒无首字节超时,提示重试 |
| 模型故障 | 预留备选模型名,一行代码可切换 |
小结
小团队接AI能力,最大的成本往往不是代码,而是协作规则的缺位。AI网关把协议统一了,剩下的是把密钥、预算、降级这三件事在第一天就定好。Flutter直连流式接口,十几行代码就能跑通Demo——建议你现在就注册一个账号,把上面的代码跑起来,剩下的规范可以边跑边补。
注册入口:https://api.thistoken.ai/register
---
本文的示例只需一个 API Key 就能复现:在 https://api.thistoken.ai/register 注册即用。