基于Flutter+Riverpod+MVI 实现的跨平台「AI 提示词优化工具」
·
🚀 Prompt Optimizer:跨平台 AI 提示词优化工具开源分享
一个基于 Flutter + Riverpod 的开源项目,用 MVI 架构优雅地解决提示词优化实例
官网入口
🎯在线体验:https://prompt.jiulang9.com
🌐Android/PC端下载地址 https://app.jiulang9.com
🌐Github开源地址:JIULANG9/PromptOptimizer:
有条件的记得使用自己的 Api key 呀!
如果这个项目对你有帮助,请不要忘记给个 ⭐ Star 支持一下!这对我来说意义重大,也是我持续更新的动力
📌 为什么要做这个项目?
- 🤔 提示词效果不理想 — 同样的需求,不同的表述方式,AI 的回答质量差异巨大
- 🔄 手动优化低效 — 反复调整提示词,浪费大量时间
- 🔐 数据安全顾虑 — API 密钥如何安全存储?历史记录如何保护?
PromptOptimizer 就是为了解决这些痛点而生的:
| 核心功能 | 具体体现 |
|---|---|
| 🎯 提效工具 | 一键优化提示词,支持多种优化模板,实时预览结果 |
| 🌐 跨平台体验 | Android / iOS / Web / Windows / macOS / Linux 无缝切换 |
| 🔐 数据安全 | AES-256 加密存储 API 密钥,本地数据库管理 |
| 🧠 开发友好 | 开源代码,清晰架构,易于二次开发和定制 |
| 💰 完全免费 | 无付费功能,无广告,无数据上传 |
📱 项目预览
☀️ 浅色模式

🌙 深色模式

🔍 功能如何实现?
一、功能设计 — 从用户需求出发
为两种模式
- 用户提示词优化 — 优化你写给 AI 的指令,让 AI 更理解你的需求
- 系统提示词优化 — 优化 AI 的系统角色设定,让 AI 更好地扮演特定身份
🔌 多 API 支持
支持 多个主流 AI 提供商:
| 提供商 | API 地址 | 默认模型 | 适用场景 |
|---|---|---|---|
| 🔵 OpenAI | api.openai.com | gpt-4o | 通用、高质量 |
| 🟠 DashScope(阿里) | dashscope.aliyuncs.com | qwen-max | 国内用户首选 |
| 🟣 DeepSeek | api.deepseek.com | deepseek-chat | 性价比高 |
| 🌙 Moonshot(月之暗面) | api.moonshot.cn | moonshot-v1-8k | 长文本处理 |
| 🧠 Zhipu AI(智谱) | open.bigmodel.cn | glm-4 | 中文优化 |
| 🐉 Baidu(文心一言) | aip.baidubce.com | ernie-4.0-8k | 国内服务 |
| 🎯 Tencent(混元) | hunyuan.tencentcloudapi.com | hunyuan-lite | 腾讯生态 |
| 🌐 OpenRouter(聚合) | openrouter.ai | llama-3.1-8b | 模型丰富 |
关键特性:
- ✅ 支持 OpenAI 兼容接口(自定义 API 端点)
- ✅ AES-256 加密存储 API 密钥
- ✅ 一键切换 API 配置,无需重启应用
📋 模板管理系统
内置 4 个专业模板:
├── 📝 标准优化模板
├── 🎓 学术论文模板
├── 💼 商务文案模板
└── 🔬 技术文档模板
+ 自定义模板支持
└── 使用 {{originalPrompt}} 占位符
模板示例:
【标准优化模板】
请优化以下提示词,使其更清晰、更具体、更容易被 AI 理解:
{{originalPrompt}}
优化要求:
1. 明确目标和预期输出
2. 提供必要的背景信息
3. 指定输出格式
4. 添加约束条件
💾 数据导入导出
一键备份:
├── API 配置
├── 自定义模板
├── 优化历史
└── UI 偏好设置
支持格式:
├── PC 端:文件夹选择
└── 移动端:系统分享
二、技术架构 — 如何优雅地实现这些功能
🏗️ MVI 架构 + 单向数据流
┌──────────────┐
│ UI Layer │ ← 用户交互(点击、输入)
│ (Widget) │
└──────┬───────┘
│ 发送 Intent
↓
┌──────────────────────┐
│ Intent Handler │ ← 业务逻辑处理
│ (Notifier) │
└──────┬───────────────┘
│ 更新 State
↓
┌──────────────────────┐
│ Model (State) │ ← 数据模型
│ (Freezed) │
└──────┬───────────────┘
│ 通知 UI 更新
↓
┌──────────────┐
│ UI Layer │ ← 重新渲染
│ (Widget) │
└──────────────┘
为什么选择 MVI?
| 特点 | 优势 |
|---|---|
| 单向数据流 | 数据流向清晰,易于调试 |
| Intent 明确 | 每个用户操作都有对应的 Intent |
| State 不可变 | 使用 Freezed,避免意外修改 |
| 易于测试 | Intent → State 的映射易于单元测试 |
🔄 Riverpod 状态管理
// 定义一个优化 Intent
class OptimizeIntent {
final String originalPrompt;
final String templateId;
final String apiConfigId;
}
// Notifier 处理 Intent
class OptimizationNotifier extends StateNotifier<OptimizationState> {
OptimizationNotifier() : super(OptimizationState.initial());
// 处理优化 Intent
Future<void> optimize(OptimizeIntent intent) async {
state = state.copyWith(isLoading: true);
try {
final result = await _apiService.optimize(intent);
state = state.copyWith(
result: result,
isLoading: false,
);
} catch (e) {
state = state.copyWith(error: e.toString(), isLoading: false);
}
}
}
// UI 层监听状态
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(optimizationProvider);
return state.when(
loading: () => LoadingWidget(),
data: (result) => ResultWidget(result),
error: (error) => ErrorWidget(error),
);
}
Riverpod 的优势:
- ✅ 编译时安全 — 依赖注入在编译期检查
- ✅ 自动代码生成 — 使用
@riverpod注解 - ✅ 灵活的依赖管理 — 支持 override、watch、select
- ✅ 性能优化 — 精细化的重建控制
🗄️ 数据库设计 — Drift + Hive
┌─────────────────────────────────────┐
│ 数据存储层 │
├─────────────────────────────────────┤
│ Drift (SQLite) │
│ ├── api_configs 表 │
│ ├── prompt_templates 表 │
│ └── optimization_histories 表 │
│ │
│ Hive (KV 存储) │
│ ├── app_settings Box │
│ │ ├── themeMode │
│ │ └── locale │
│ └── 其他偏好设置 │
└─────────────────────────────────────┘
为什么这样设计?
| 存储方案 | 用途 | 原因 |
|---|---|---|
| Drift | API 配置、模板、历史 | 结构化数据,需要复杂查询 |
| Hive | UI 偏好设置 | 简单 KV 数据,快速读写 |
🔐 AES-256 加密
API 密钥存储流程:
┌──────────────────┐
│ 用户输入密钥 │
└────────┬─────────┘
│
↓
┌──────────────────┐
│ AES-256 加密 │
│ (256-bit key) │
└────────┬─────────┘
│
↓
┌──────────────────┐
│ Base64 编码 │
└────────┬─────────┘
│
↓
┌──────────────────┐
│ 存储到数据库 │
└──────────────────┘
使用时反向解密:
数据库 → Base64 解码 → AES-256 解密 → 获得原始密钥
AesCryptoService:
class AesCryptoService {
static const String _encryptionKey = 'your-256-bit-key-here';
// 加密
static String encrypt(String plaintext) {
final key = Key.fromUtf8(_encryptionKey);
final iv = IV.fromSecureRandom(16);
final cipher = Encrypter(AES(key, mode: AESMode.cbc));
final encrypted = cipher.encrypt(plaintext, iv: iv);
return '${iv.base64}:${encrypted.base64}';
}
// 解密
static String decrypt(String encrypted) {
final parts = encrypted.split(':');
final iv = IV.fromBase64(parts[0]);
final cipher = Encrypter(AES(Key.fromUtf8(_encryptionKey), mode: AESMode.cbc));
return cipher.decrypt64(parts[1], iv: iv);
}
}
🔄 GitHub Actions 工作流 CI/CD 流程
┌─────────────────────────────────────┐
│ Git 推送 │
├─────────────────────────────────────┤
│ 分支推送 (main) │
│ └── 代码分析 + Debug 构建 │
│ │
│ Tag 推送 (v1.0.0) │
│ └── 完整构建 + 自动发布 │
│ ├── Android (APK + AAB) │
│ ├── Windows (ZIP) │
│ ├── macOS (ZIP) │
│ ├── Linux (TAR.GZ) │
│ └── Web (TAR.GZ) │
└─────────────────────────────────────┘
💡核心技术亮点
1️⃣ 单向数据流的优雅实现
问题: 传统 setState 容易导致状态混乱,难以追踪数据变化
解决方案: MVI 架构 + Riverpod
Intent (用户操作)
→ Notifier (业务逻辑)
→ State (数据模型)
→ UI (重新渲染)
优势:
- 数据流向一目了然
- 易于调试和测试
- 支持时间旅行调试(DevTools)
2️⃣ 流式响应的高效处理
问题: 大型 AI 响应可能很长,一次性加载会卡顿
解决方案: SSE 流式处理 + 增量更新
// 接收 SSE 流
final stream = _apiService.optimizeStream(prompt);
// 逐 token 处理
await for (final token in stream) {
state = state.copyWith(
result: state.result + token, // 增量拼接
);
}
3️⃣ 跨平台数据同步
实现在多个设备间切换,配置和历史数据不同步
// 导出数据
Future<void> exportData() async {
final data = {
'apiConfigs': await _apiConfigDao.getAllConfigs(),
'templates': await _templateDao.getAllTemplates(),
'histories': await _historyDao.getAllHistories(),
'settings': await _settingsService.getSettings(),
};
final json = jsonEncode(data);
// 保存到文件或分享
}
// 导入数据
Future<void> importData(String jsonData) async {
final data = jsonDecode(jsonData);
await _apiConfigDao.insertConfigs(data['apiConfigs']);
await _templateDao.insertTemplates(data['templates']);
await _historyDao.insertHistories(data['histories']);
await _settingsService.updateSettings(data['settings']);
}
致敬
linshenkx 大佬开发的提示词优化器

开源地址
更多推荐



所有评论(0)