Git Product home page Git Product logo

flutter_chat_box's Introduction

flutter_chatgpt

本项目基于一个 flutter 脚手架 https://github.com/bravekingzhang/flutter_template_mason ,开发的一款可以和 ChatGPT 聊天的 App!

全平台支持

  • macOS ✅
  • Linux✅
  • Windows✅
  • Android✅
  • iOS✅

使用方法

release dir 可以直接下载 release 版本,也可以:

  1. clone the repository
  2. flutter pub get
  3. flutter build macos/linux/windows/android/ios

特性展示

  • 支持代码着色
  • 代码可复制
  • 使用 stream 流式 API 请求,响应比较快
  • 清爽的 UI

Mobile support

支持特性

  • 多语言支持
  • 单元测试
  • 组件测试
  • 优秀的全局数据管理方式 flutter_bloc
  • flutter_bloc_test
  • 主题切换
  • 统一的路由管理
  • 全局状态管理
  • 多轮次对话
  • prompt 支持
  • 增加了打字机的震动效果
  • 支持 web 搜索能力
  • 一键到出会话支持
  • 支持高级搜索
  • 等你 issue 来支持

开源共建

让我们一起改进,把这个 App 做得更加好用一些。

加群讨论

欢迎加群讨论技术?随意打赏,请备注 github 名

image

关注作者微信公众号,与作者交流,第一时间知道作者动态? image

License: MIT

本项目采用 MIT 许可证授权。

flutter_chat_box's People

Contributors

bravekingzhang avatar brzhang666 avatar niwaguan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flutter_chat_box's Issues

请问如何disable https?

由于使用的是本地的llm服务,只有http端口,测试过react 的openai客户端接口是可以的。

用dart openai那个包好像无法使用http,只能https,怎么disable掉这个

在中文输入法中按回车会直接发送

背景

  • macos M1 Pro
  • macOS 13.6

自行 build macos

在用中文输入法时,想按回车键打印出输入的字母,结果会直接发送消息。

Expectation:

在中文输入法中按回车,输入栏打印出之前在输入法里输入的字母

Now:

在中文输入法中按回车,输入栏打印出之前在输入法里输入的字母并直接发送消息。(就像连续按了两次回车键)

需要接入azure openai的 可以参考一下。

import 'package:flutter/foundation.dart';
import 'package:chatgpt/data/llm.dart';
import 'package:chatgpt/repository/conversation.dart';
import 'package:get_storage/get_storage.dart';
import 'package:chatgpt/controller/settings.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:dart_openai/dart_openai.dart';

class ChatIF extends LLM {
@OverRide
getResponse(
List messages,
ValueChanged onResponse,
ValueChanged errorCallback,
ValueChanged onSuccess) async {
var messageToBeSend = messages.removeLast();
var prompt = messageToBeSend.text;
var history = messages.length >= 2 ? collectHistory(messages) : [];
print('messages: $messages');
print('history: $history');
print('prompt: $prompt');
List openAIMessages = [];
messages = messages.reversed.toList();
// 将messages里面的每条消息的内容取出来拼接在一起
String content = "";
for (Message message in messages) {
content = content + message.text;
if (content.length < 1800 || openAIMessages.isEmpty) {
// 插入到 openAIMessages 第一个位置
openAIMessages.insert(
0,
OpenAIChatCompletionChoiceMessageModel(
content: message.text,
role: message.role.asOpenAIChatMessageRole,
),
);
}
}
// var message = Message(
// conversationId: messages.first.conversationId,
// text: "",
// role: Role.assistant); //仅仅第一个返回了角色
Message message;
if (messages.isEmpty) {
message = Message(
conversationId: messageToBeSend.conversationId,
text: "",
role: Role.assistant,
);
} else {
message = Message(
conversationId: messages.first.conversationId,
text: "",
role: Role.assistant,
);
}
var msg = [
{"role": "user", "content": prompt}
];
history.addAll(msg);
var body = {
"messages": history,
"stream": SettingsController.to.useStream.value
};
var azureBaseUrl = GetStorage().read("ifBaseUrl") ??
"xxxx";
final request = http.Request("POST", Uri.parse(azureBaseUrl));
request.headers.addAll({'Content-Type': 'application/json'});
request.headers.addAll({'api-key': 'xxxx'});
final requestBody = json.encode(body);
request.body = requestBody;
try {
final response = await request.send();
if (SettingsController.to.useStream.value) {
String buffer = '';
await for (final chunk in response.stream.transform(utf8.decoder)) {
print('chunk====' + chunk);
buffer += chunk;
final lines = buffer.split('\n');
buffer = lines.removeLast();
for (final line in lines) {
if (line.startsWith('data:')) {
final data = line.substring(6).trim();
if (data != "[DONE]") {
final responseData = jsonDecode(data);
print('testData====' + responseData.toString());
// 处理生成的文本逻辑...
if (responseData['choices'][0]['finish_reason'] == "stop") {
onSuccess(message);
} else {
if (responseData['choices'][0]['delta']['content'] != null) {
String generatedText =
responseData['choices'][0]['delta']['content'];
message.text = message.text + generatedText;
onResponse(message);
}
}
}
}
}
}
} else {
await for (final chunk in response.stream.transform(utf8.decoder)) {
Map<String, dynamic> responseData = jsonDecode(chunk);
String generatedText =
responseData['choices'][0]['message']['content'];
message.text = message.text + generatedText;
onSuccess(message);
}
}
} catch (e) {
message.text = e.toString();
print('azure error ====' + e.toString());
errorCallback(message);
}
}
}

List collectHistory(List list) {
List result = [];
int startIndex = list.length - 3;
if (startIndex < 0) {
startIndex = 0;
}
for (int i = list.length - 1; i >= startIndex; i--) {
result.add({
"role": list[i].role == Role.assistant ? "system" : "user",
"content": list[i].text
});
}
result = result.reversed.toList();
return result;
}

项目没法跑起来,依赖的版本可能是不对的?

  1. 克隆了仓库
  2. 执行了:
flutter pub get

但是发现执行完毕后,pubspec.lock 文件发生了变更,并且 lib/components/markdown.dart 文件中也提示某些属性不受支持:
2.1 执行 flutter pub get 后文件的变更:

(base) ➜  flutter_chat_box git:(main) ✗ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   macos/Flutter/GeneratedPluginRegistrant.swift
        modified:   pubspec.lock

2.2 markdown.dart 中提示的不支持的属性:

[{
	"resource": "/Users/sheng/Documents/code/js/github/flutter_chat_box/lib/components/markdown.dart",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": {
		"value": "undefined_named_parameter",
		"target": {
			"$mid": 1,
			"path": "/diagnostics/undefined_named_parameter",
			"scheme": "https",
			"authority": "dart.dev"
		}
	},
	"severity": 8,
	"message": "The named parameter 'inlineSyntaxes' isn't defined.\nTry correcting the name to an existing named parameter's name, or defining a named parameter with the name 'inlineSyntaxes'.",
	"source": "dart",
	"startLineNumber": 23,
	"startColumn": 15,
	"endLineNumber": 23,
	"endColumn": 29
},{
	"resource": "/Users/sheng/Documents/code/js/github/flutter_chat_box/lib/components/markdown.dart",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": {
		"value": "undefined_named_parameter",
		"target": {
			"$mid": 1,
			"path": "/diagnostics/undefined_named_parameter",
			"scheme": "https",
			"authority": "dart.dev"
		}
	},
	"severity": 8,
	"message": "The named parameter 'config' isn't defined.\nTry correcting the name to an existing named parameter's name, or defining a named parameter with the name 'config'.",
	"source": "dart",
	"startLineNumber": 25,
	"startColumn": 15,
	"endLineNumber": 25,
	"endColumn": 21
},{
	"resource": "/Users/sheng/Documents/code/js/github/flutter_chat_box/lib/components/markdown.dart",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": {
		"value": "argument_type_not_assignable",
		"target": {
			"$mid": 1,
			"path": "/diagnostics/argument_type_not_assignable",
			"scheme": "https",
			"authority": "dart.dev"
		}
	},
	"severity": 8,
	"message": "The argument type 'CodeWrapperWidget Function(dynamic, dynamic)' can't be assigned to the parameter type 'Widget Function(Widget, String, String)?'. ",
	"source": "dart",
	"startLineNumber": 27,
	"startColumn": 58,
	"endLineNumber": 27,
	"endColumn": 69
},{
	"resource": "/Users/sheng/Documents/code/js/github/flutter_chat_box/lib/components/markdown.dart",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": {
		"value": "argument_type_not_assignable",
		"target": {
			"$mid": 1,
			"path": "/diagnostics/argument_type_not_assignable",
			"scheme": "https",
			"authority": "dart.dev"
		}
	},
	"severity": 8,
	"message": "The argument type 'CodeWrapperWidget Function(dynamic, dynamic)' can't be assigned to the parameter type 'Widget Function(Widget, String, String)?'. ",
	"source": "dart",
	"startLineNumber": 28,
	"startColumn": 55,
	"endLineNumber": 28,
	"endColumn": 66
}]

Uploading image.png…

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.