본문 바로가기

Flutter

Flutter Google Bard Gemini chat채팅 봇 만들기.

 

https://pub.dev/packages/dash_chat_2

 

dash_chat_2 | Flutter Package

The most complete Chat UI for flutter. Easy to use, highly customizable and fully featured

pub.dev

 

APi key 를 발급 받는다.

https://ai.google.dev/

 

회신으로 들어오는 답변은 다음 과 같다.

카테고리 범주등이 눈에 보인다. text 만 쓰기로 한다.

회신 받기까지의 코드는 아래에 ~

// respose.body 에서 text만 추출하기 ['candidates'][0]['content']['parts'][0]['text']
{candidates: [{content: {parts: [{text: 네, 안녕하세요. 무엇을 도와드릴까요?}], role: model}, finishReason: STOP, index: 0, safetyRatings: [{category: HARM_CATEGORY_SEXUALLY_EXPLICIT, probability: NEGLIGIBLE}, {category: HARM_CATEGORY_HATE_SPEECH, probability: NEGLIGIBLE}, {category: HARM_CATEGORY_HARASSMENT, probability: NEGLIGIBLE}, {category: HARM_CATEGORY_DANGEROUS_CONTENT, probability: NEGLIGIBLE}] }], promptFeedback: {safetyRatings: [{category: HARM_CATEGORY_SEXUALLY_EXPLICIT, probability: NEGLIGIBLE}, {category: HARM_CATEGORY_HATE_SPEECH, probability: NEGLIGIBLE}, {category: HARM_CATEGORY_HARASSMENT, probability: NEGLIGIBLE}, {category: HARM_CATEGORY_DANGEROUS_CONTENT, probability: NEGLIGIBLE}]}}
 

 

 

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:dash_chat_2/dash_chat_2.dart';
import 'package:http/http.dart' as http;

import 'bard_key.dart';
// flutter pub add dash_chat_2

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

  @override
  State<BardChat> createState() => _BardChatState();
}

class _BardChatState extends State<BardChat> {
  final header = {'Content-Type': 'application/json'};
  final baseUrl =
      'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${APIKey.apiKey}';
  ChatUser thisUser = ChatUser(id: '1', firstName: 'User');
  ChatUser bardBot = ChatUser(id: '2', firstName: 'GEMINI');
  List<ChatMessage> messageList = [];
  List<ChatUser> chatting = [];

  getData(ChatMessage msg) async {
    chatting.add(bardBot);
    messageList.insert(0, msg);
    setState(() {});

    var chatdata = {
      'contents': [
        {
          'parts': [
            {'text': msg.text}
          ]
        }
      ]
    };

    await http.post(Uri.parse(baseUrl), headers: header, body: jsonEncode(chatdata)).then((value) {
      if (value.statusCode == 200) {
        var result = jsonDecode(value.body);
        print(result['candidates'][0]['content']['parts'][0]['text']);
        ChatMessage msg1 = ChatMessage(
          text: result['candidates'][0]['content']['parts'][0]['text'],
          user: bardBot,
          createdAt: DateTime.now(),
        );
        messageList.insert(0, msg1);
      } else {
        print('error connection');
      }
    }).catchError((onError) {});
    //
    chatting.remove(bardBot);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        theme: ThemeData.light(),
        home: Scaffold(
          appBar: AppBar(title: Text('bard gemini chat bubble')),
          body: DashChat(
            typingUsers: chatting,
            currentUser: thisUser,
            onSend: (ChatMessage msg) {
              getData(msg);
            },
            messages: messageList,
          ),
        ));
  }
}