Flutter ChatGPT 이슈

Chance·2023년 7월 12일

참고
https://jschan0911.tistory.com/86
https://velog.io/@simondr/flutter-ChatGPT-%EC%B1%97-%EB%B4%87-%EC%83%98%ED%94%8C

ChatGPT 사용하기

import 'dart:convert';

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

const apiKey = 'APIKEY발급';
const apiUrl = 'https://api.openai.com/v1/completions';

class ChatGPTScreen extends StatelessWidget {
  const ChatGPTScreen({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    String prompt = 'what is flutter?';

    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            Future<String> data = generateText(prompt);
            data.then((value) {
              print(value);
            });
          },
          child: Text('질문하기'),
        ),
      ),
    );
  }
}

// prompt입력받아 ChatGPT질문 후 답변 출력
Future<String> generateText(String prompt) async {
  final response = await http.post(
    Uri.parse(apiUrl),
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer $apiKey',
    },
    body: jsonEncode({
      'model': 'text-davinci-003',
      'prompt': prompt,
      'max_tokens': 50, // 생성되는 응답의 최대 길이를 나타낸다. (기본값 : 50)
      'temperature': 0.5, // 응답 생성 시 사용되는 온도 값, 온도가 높을수록 다양한 응답을 생성한다. (기본값 : 0.5)
      'top_p': 1, // 응답 생성 시 사용되는 확률 분포의 상위 %를 사용한다. (기본값: 1)
      'frequency_penalty': 0, // 빈번한 단어나 구문을 생성하는 것을 방지한다. (기본값: 0)
      'presence_penalty': 0 // 특정 키워드를 포함하지 않는 응답을 생성하는 것을 방지하는데 사용된다. (기본값: 0)
    }),
  );

  if (response.statusCode == 200) {
    Map<String, dynamic> data = jsonDecode(utf8.decode(response.bodyBytes));
    String text = data["choices"][0]["text"].toString().trim();

    return text;
  } else {
    throw Exception("Failed to generate response: ${response.statusCode}");
  }
}

다음 코드 작성 시 에러 발생

E/flutter ( 918): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Exception: Failed to generate response: 429
E/flutter ( 918): #0 generateText (package:flutterbox/screen/ChatGPT_screen.dart:57:5)
E/flutter ( 918):

429에러

  • 429는 과도한 요청을 보낼 때 발생하는 에러
  • 그러나 현재 무료 API는 기간 만료 시 해당 에러를 내보내는 듯 하다.

과금 확인

https://platform.openai.com/account/usage

chat_gpt_sdk 라이브러리

https://pub.dev/packages/chat_gpt_sdk/example

const apiKey = 'APIKEY발급';
const apiUrl = 'https://api.openai.com/v1/completions';

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

  
  State<ChatGPTScreen> createState() => _ChatGPTScreenState();
}

class _ChatGPTScreenState extends State<ChatGPTScreen> {
  late OpenAI openAI;
  String prompt = 'what is flutter?';
  Future<CompleteResponse?>? _gptResponse;

  
  void initState() {
    openAI = OpenAI.instance.build(
        token: apiKey,
        baseOption: HttpSetup(
            receiveTimeout: const Duration(seconds: 20),
            connectTimeout: const Duration(seconds: 20),
            sendTimeout: const Duration(seconds: 5)),
        enableLog: true);

    super.initState();
  }

  
  Widget build(BuildContext context) {
    // String prompt = 'what is flutter?';

    return Scaffold(
      body: Center(
          child: Padding(
        padding: EdgeInsets.all(8.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {_inputPrompt();},
              child: Text(prompt),
            ),

            _resultPrompt()

          ],
        ),
      )),
    );
  }

  void _inputPrompt() async {
    final request = CompleteText(
      prompt: prompt,
      model: TextDavinci3Model(),
    );

    setState(() {
      _gptResponse = openAI.onCompletion(request: request);
    });
  }

  Widget _resultPrompt() {
    return FutureBuilder(
      future: _gptResponse,
      builder: (context, snapshot) {
        final text = snapshot.data?.choices.last.text;

        return Container(
          padding: EdgeInsets.all(8.0),
          child: Text(text ?? 'Loading...'),
        );
      },
    );
  }
}

라이브러리 또한 같은 에러 발생

[OpenAI] starting request
[OpenAI] request body :{prompt: what is flutter?, model: text-davinci-003, temperature: 0.3, max_tokens: 100, top_p: 1.0, frequency_penalty: 0.0, presence_penalty: 0.0, stop: null}
[OpenAI] error code: 429, message :The request returned an invalid status code of 429. data:{error: {message: You exceeded your current quota, please check your plan and billing details., type: insufficient_quota, param: null, code: insufficient_quota}}

0개의 댓글