Flutter Web 实现ChatGPT对话与Function Call

Flutter-ChatGPT

基于Flutter Web实现ChatGPT多轮聊天、翻译、Prompt文本生成、企业知识库、本地文档问答、functions_call等功能,页面流式输出采用StreamBuilder Widget实现,各业务模块Repository均提供直连OpenAI接口与python后端API接口流式输出功能实例

Github仓库地址

backend

采用FastApi实现后端LangChain调用OpenAI接口

backend-data

  • 提供初始化向量文档,构建向量索引代码位于vector_index.py

backend-service

  • function_call.py 提供openai function call相关实例功能
  • model_query.py 提供python方法调用参数封装模型,涉及文档问答与多轮对话
  • vector_index.py 提供本地知识库/上传文档向量化相关实例功能

backend-env

提供设置OpenAI参数设置OPENAI_API_KEY

ini 复制代码
# openai
openai.log = "debug"
openai.api_key = os.environ["OPENAI_API_KEY"]

backend-main.py

提供FastApi接口功能实例,包括response stream流处理

backend-requirments.txt

依赖组件配置,可通过terminal执行

复制代码
pip install -r requirments.txt

frontend

采用Flutter实现Web-UI(Material3)功能,具体功能可查看screenshot,已增加页面字符国际化配置

frontend-db

web浏览器IndexedDB数据库操作与模型实例

frontend-pages

业务功能模块,包含以下内容:

  1. 智能对话
  2. 智能翻译
  3. 智能写作
  4. 智能文档
  5. 智能任务
  • 各模块遵循repository-model-provider-view分包方式
  • 各view模块按功能复杂度拆分widgets与states 具体拆分粒度按实际业务要求处理,尽可能执行局部刷新
  • 通过go_routerStatefulShellBranch实现各页面路由状态管理
  • 通过Riverpod管理Widget UI-States(riverpod.dev/)
  • 页面逐字打印采用SteamBuild Widget实现,具体代码如下message_bot.dart:
kotlin 复制代码
    ///
    /// 流式请求[request task stream message]
    ///
    Stream<String>? stream(WidgetRef ref, bool mounted) {
      return
          //ref.read(taskStateProvider.notifier).sendMessageStream('', '', () {
          ref.read(taskStateProvider.notifier).sendMessageStreamApi('', '', () {
        if (!mounted) return;
        ref.read(allowInputTaskProvider.notifier).update((state) => false);
      }, () {
        if (!mounted) return;
        ref.read(allowInputTaskProvider.notifier).update((state) => true);
      });
    }

    ///
    /// StreamBuilder
    ///
    class MessageBotStream extends ConsumerWidget {
      const MessageBotStream(this.stream, this.controller, {super.key});

      final Stream<String>? stream;

      //滚动控制
      final ScrollController controller;

      @override
      Widget build(BuildContext context, WidgetRef ref) {
        return StreamBuilder(
          stream: stream,
          key: Key('${Random().nextDouble()}'),
          builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
            if (snapshot.hasError) {
              return Text("${t.app.error}: ${snapshot.error}");
            }
            if (snapshot.hasData) {
              String content = snapshot.data ?? "";
              scrollEnd(controller, 200);
              if (content.isNotEmpty) return Text(content);
            }
            return const MessageLoading();
          },
        );
      }
    }

frontend-assets

提供业务模块使用图标与i18n国际化语言配置,slang国际化内容生成gen

演示效果截图

具体前往查看screenshot,或者本地运行前后端项目(需自行提供OpenAI Key)

引用pub flutter库(pub.dev/)

Flutter SDK version: 3.13.2 (stable)

Dart SDK version: 3.1.0 (stable)

animated_text_kit: ^4.2.2
flutter_spinkit: ^5.2.0
go_router: ^10.1.2
hooks_riverpod: ^2.3.10
logger: ^2.0.1
shared_preferences: ^2.2.1
sembast_web: ^2.1.3
http: ^1.1.0
file_picker: ^5.5.0
slang: ^3.23.0
slang_flutter: ^3.23.0

相关推荐
天天被压力1 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力1 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
看浪的路人1 小时前
第3讲:输出安全——PII 脱敏与有害内容过滤
chatgpt
特立独行的猫A1 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
小lo想吃棒棒糖1 小时前
把机器人训练从 GPU 搬到昇腾 NPU:启元 Q1 起身动作 PPO 训练全记录
python·机器人·昇腾·启元机器人
Thanks_ks2 小时前
【第 006 讲】搭建 PyCharm 开发环境:PyCharm 的下载与安装 | 初始设置与常用配置
ide·python·pycharm·开发工具·jetbrains·开发环境·集成开发环境
青少儿编程课堂3 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
tellmewhoisi3 小时前
nlp:知识库检索和dify知识库创建
python·自然语言处理
2601_968793143 小时前
Python Requests 轻量自动化:无需浏览器,实现真人级账号浏览模拟
开发语言·python·自动化
段一凡-华北理工大学12 小时前
工业智能体:从Codex/Claude到项目实战~系列文章05:从“AI助手“到“工业智能体“:能力跃迁与落地范式
人工智能·python·claude·codex·工业智能体·高炉炼铁智能化