참고
https://jschan0911.tistory.com/86
https://velog.io/@simondr/flutter-ChatGPT-%EC%B1%97-%EB%B4%87-%EC%83%98%ED%94%8C
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):
과금 확인
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}}