Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

혼자서 앱 만드는 개발자 함께하는 AI 세상

flutter chatgpt3 연동해서 오픈 채팅방에 추가하였다. 본문

마이봇 chat GPT 오픈 프로젝트

flutter chatgpt3 연동해서 오픈 채팅방에 추가하였다.

혼앱사 2023. 2. 14. 23:00
반응형

구글검색을 통해 chatgpt3 .관련 flutter 개발 오픈소스를 검색했으나 정확이 딱 맞는 소스를 구하기 힘들어서 약간 편집해서 오픈채팅앱에 추가하였다.

아래 2개의 소스를 편집해서 만들었습니다.

https://github.com/coskuncay/flutter_chatgpt_api

 

GitHub - coskuncay/flutter_chatgpt_api: Use ChatGPT from Flutter / Dart

Use ChatGPT from Flutter / Dart. Contribute to coskuncay/flutter_chatgpt_api development by creating an account on GitHub.

github.com

https://github.com/redevRx/Flutter-ChatGPT

 

GitHub - redevRx/Flutter-ChatGPT: Flutter ChatGPT

Flutter ChatGPT. Contribute to redevRx/Flutter-ChatGPT development by creating an account on GitHub.

github.com

 

ChatGPT 인스턴스 생성 하고 key 를 받아서 적용하면된다.

    •  토큰
      • 비밀 API 키가 아래에 나열되어 있습니다. 비밀 API 키를 생성한 후에는 다시 표시하지 않습니다.
      • API 키를 다른 사람과 공유하거나 브라우저 또는 기타 클라이언트측 코드에 노출하지 마십시오. 계정의 보안을 보호하기 위해 OpenAI는 공개적으로 유출된 API 키를 자동으로 교체할 수도 있습니다.
      • https://beta.openai.com/account/api-keys
  • 조직 ID

 

 

수정된 소스 입니다.

import 'dart:async';
import 'dart:math';
import 'package:chat_gpt_sdk/chat_gpt_sdk.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_chatgpt_api/flutter_chatgpt_api.dart';
import 'package:material_buttonx/materialButtonX.dart';
import 'constants.dart';

const backgroundColor = Color(0xff343541);
const botBackgroundColor = Color(0xff444654);

class ChatPage3 extends StatefulWidget {
  const ChatPage3({super.key});

  @override
  State<ChatPage3> createState() => _ChatPageState();
}

class _ChatPageState extends State<ChatPage3> {
  final _textController = TextEditingController();
  final _scrollController = ScrollController();
  final List<ChatMessage> _messages = [];

  late OpenAI openAI;
  String oldText = "";
  String? _parentMessageId;
  String? _conversationId;
  late bool isLoading;

  @override
  void initState() {
    openAI = OpenAI.instance.build(
        token: token,
        baseOption: HttpSetup(receiveTimeout: 30000),
        isLogger: true);

    super.initState();

    isLoading = false;
  }

  void _translateEngToThai() async {
    final request = CompleteText(
        prompt: _textController.text, maxTokens: 200, model: kTranslateModelV3);

    openAI
        .onCompleteStream(request: request)
        .listen((response) => addMessage(response))
        .onError((err) {
      setState(() {
        isLoading = false;
        _messages.add(
          ChatMessage(
            text: '답변을 들을수 없어요 ㅠㅠ',
            chatMessageType: ChatMessageType.bot,
          ),
        );
      });

      print("$err");
    });
  }

  addMessage(response) {
    if (response.choices.last.text != '') {
      if (response.choices.last.text != oldText) {
        oldText = response.choices.last.text;
        setState(() {
          isLoading = false;
          _messages.add(
            ChatMessage(
              text: response.choices.last.text,
              chatMessageType: ChatMessageType.bot,
            ),
          );
        });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: Image.asset(
          'assets/bot.png',
          color: Colors.white,
          scale: 1.5,
        ),
        toolbarHeight: 50,
        title: const Padding(
          padding: EdgeInsets.all(1.0),
          child: Text(
            'GPT3 bot과 대화',
            maxLines: 1,
            textAlign: TextAlign.center,
          ),
        ),
        backgroundColor: botBackgroundColor,
      ),
      backgroundColor: backgroundColor,
      body: SafeArea(
        child: Column(
          children: [
            Expanded(
              child: _buildList(),
            ),
            Visibility(
              visible: isLoading,
              child: const Padding(
                padding: EdgeInsets.all(8.0),
                child: CircularProgressIndicator(
                  color: Colors.white,
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                children: [
                  _buildInput(),
                  _buildSubmit(),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildSubmit() {
    return Visibility(
      visible: !isLoading,
      child: Container(
        color: botBackgroundColor,
        child: IconButton(
          icon: const Icon(
            Icons.send_rounded,
            color: Color.fromRGBO(142, 142, 160, 1),
          ),
          onPressed: () async {
            _translateEngToThai();

            setState(
              () {
                _messages.add(
                  ChatMessage(
                    text: _textController.text,
                    chatMessageType: ChatMessageType.user,
                  ),
                );
                isLoading = true;
              },
            );
            var input = _textController.text;
            _textController.clear();
            Future.delayed(const Duration(milliseconds: 50))
                .then((_) => _scrollDown());

            setState(() {});
            _textController.clear();
            Future.delayed(const Duration(milliseconds: 50))
                .then((_) => _scrollDown());
          },
        ),
      ),
    );
  }

  Expanded _buildInput() {
    return Expanded(
      child: TextField(
        textCapitalization: TextCapitalization.sentences,
        style: const TextStyle(color: Colors.white),
        controller: _textController,
        decoration: const InputDecoration(
          hintText: 'GPT3 bot 에게 물어보세요',
          hintStyle: TextStyle(
            color: Colors.grey,
          ),
          fillColor: botBackgroundColor,
          filled: true,
          border: InputBorder.none,
          focusedBorder: InputBorder.none,
          enabledBorder: InputBorder.none,
          errorBorder: InputBorder.none,
          disabledBorder: InputBorder.none,
        ),
      ),
    );
  }

  ListView _buildList() {
    return ListView.builder(
      controller: _scrollController,
      itemCount: _messages.length,
      itemBuilder: (context, index) {
        var message = _messages[index];
        return ChatMessageWidget(
          text: message.text,
          chatMessageType: message.chatMessageType,
        );
      },
    );
  }

  void _scrollDown() {
    _scrollController.animateTo(
      _scrollController.position.maxScrollExtent,
      duration: const Duration(milliseconds: 300),
      curve: Curves.easeOut,
    );
  }
}

class ChatMessageWidget extends StatelessWidget {
  const ChatMessageWidget(
      {super.key, required this.text, required this.chatMessageType});

  final String text;
  final ChatMessageType chatMessageType;

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.symmetric(vertical: 10.0),
      padding: const EdgeInsets.all(16),
      color: chatMessageType == ChatMessageType.bot
          ? botBackgroundColor
          : backgroundColor,
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          chatMessageType == ChatMessageType.bot
              ? Container(
                  margin: const EdgeInsets.only(right: 16.0),
                  child: CircleAvatar(
                    backgroundColor: const Color.fromRGBO(16, 163, 127, 1),
                    child: Image.asset(
                      'assets/bot.png',
                      color: Colors.white,
                      scale: 1.5,
                    ),
                  ),
                )
              : Container(
                  margin: const EdgeInsets.only(right: 16.0),
                  child: const CircleAvatar(
                    child: Icon(
                      Icons.person,
                    ),
                  ),
                ),
          Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisAlignment: MainAxisAlignment.start,
              children: <Widget>[
                Container(
                    decoration: const BoxDecoration(
                      borderRadius: BorderRadius.all(Radius.circular(1.0)),
                    ),
                    child: Text(
                      text,
                      style: Theme.of(context)
                          .textTheme
                          .bodyLarge
                          ?.copyWith(color: Colors.white),
                    )),
              ],
            ),
          ),
          CupertinoButton(
            minSize: 0.0,
            child: Icon(
              Icons.copy,
              size: 20,
            ),
            padding: EdgeInsets.zero,
            color: Colors.black,
            onPressed: () {
              Clipboard.setData(ClipboardData(text: text));
            },
          )
        ],
      ),
    );
  }
}

 

  • 플러터를 적용해서 쉽게 만들 수 있는데 아직 베타 테스트라서 아쉽긴 합니다.
  • 만약 유료화된다면 광고라도 부쳐서 수익을 내야하나 걱정입니다.
  • 일단 테스트 해보시고  코딩도 하고  ai 학습하는 것으로 만족합니다.

아직 업데이트 전이라 업데이트 되면 올리겠습니다.

https://play.google.com/store/apps/details?id=com.shsoft.openchat 

 

오픈챗 - Google Play 앱

webrtc 기반 채팅 앱

play.google.com

apk 파일 올렸으니 받으셔서 깔아보세요

openchat.zip
7.81MB

 

 

 

 

728x90
반응형
Comments