Spaces:
Configuration error
Configuration error
import 'dart:async'; | |
import 'dart:math'; | |
import 'package:chat_gpt_sdk/chat_gpt_sdk.dart'; | |
import 'package:example/constants.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:material_buttonx/materialButtonX.dart'; | |
void main() => runApp(const MyApp()); | |
class MyApp extends StatelessWidget { | |
const MyApp({super.key}); | |
Widget build(BuildContext context) { | |
return const MaterialApp( | |
home: TranslateScreen(), | |
); | |
} | |
} | |
class TranslateScreen extends StatefulWidget { | |
const TranslateScreen({super.key}); | |
State<TranslateScreen> createState() => _TranslateScreenState(); | |
} | |
class _TranslateScreenState extends State<TranslateScreen> { | |
/// text controller | |
final _txtWord = TextEditingController(); | |
late OpenAI openAI; | |
Future<CompleteResponse?>? _translateFuture; | |
void _translateEngToThai() async { | |
final request = CompleteText( | |
prompt: translateEngToThai(word: _txtWord.text.toString()), | |
maxTokens: 200, | |
model: Gpt3TurboInstruct()); | |
setState(() { | |
_translateFuture = openAI.onCompletion(request: request); | |
}); | |
} | |
///parameter name is require | |
void gptFunctionCalling() async { | |
final request = ChatCompleteText( | |
messages: [ | |
Messages( | |
role: Role.user, | |
content: "What is the weather like in Boston?", | |
name: "get_current_weather") | |
.toJson(), | |
], | |
maxToken: 200, | |
model: Gpt41106PreviewChatModel(), | |
tools: [ | |
{ | |
"type": "function", | |
"function": { | |
"name": "get_current_weather", | |
"description": "Get the current weather in a given location", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"location": { | |
"type": "string", | |
"description": "The city and state, e.g. San Francisco, CA" | |
}, | |
"unit": { | |
"type": "string", | |
"enum": ["celsius", "fahrenheit"] | |
} | |
}, | |
"required": ["location"] | |
} | |
} | |
} | |
], | |
toolChoice: 'auto', | |
); | |
ChatCTResponse? response = await openAI.onChatCompletion(request: request); | |
debugPrint("$response"); | |
} | |
void imageInput() async { | |
final request = ChatCompleteText( | |
messages: [ | |
{ | |
"role": "user", | |
"content": [ | |
{"type": "text", "text": "What’s in this image?"}, | |
{ | |
"type": "image_url", | |
"image_url": { | |
"url": | |
"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" | |
} | |
} | |
] | |
} | |
], | |
maxToken: 200, | |
model: Gpt4VisionPreviewChatModel(), | |
); | |
ChatCTResponse? response = await openAI.onChatCompletion(request: request); | |
debugPrint("$response"); | |
} | |
void gpt4() async { | |
final request = ChatCompleteText(messages: [ | |
Messages(role: Role.assistant, content: 'Hello!').toJson(), | |
], maxToken: 200, model: Gpt4ChatModel()); | |
await openAI.onChatCompletion(request: request); | |
} | |
void initState() { | |
openAI = OpenAI.instance.build( | |
token: kToken, | |
baseOption: HttpSetup( | |
receiveTimeout: const Duration(seconds: 20), | |
connectTimeout: const Duration(seconds: 20)), | |
enableLog: true); | |
super.initState(); | |
} | |
Widget build(BuildContext context) { | |
var size = MediaQuery.of(context).size; | |
return Scaffold( | |
backgroundColor: Colors.white, | |
body: SingleChildScrollView( | |
child: Center( | |
child: Padding( | |
padding: const EdgeInsets.symmetric(vertical: 16.0), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
/** | |
* title translate | |
*/ | |
_titleCard(size), | |
/** | |
* input card | |
* insert your text for translate to th.com | |
*/ | |
_inputCard(size), | |
/** | |
* card input translate | |
*/ | |
_resultCard(size), | |
/** | |
* button translate | |
*/ | |
_btnTranslate() | |
], | |
), | |
), | |
), | |
), | |
bottomNavigationBar: _navigation(size), | |
); | |
} | |
Widget _btnTranslate() { | |
return Row( | |
mainAxisAlignment: MainAxisAlignment.end, | |
children: [ | |
Padding( | |
padding: const EdgeInsets.only(right: 16.0), | |
child: MaterialButtonX( | |
message: "Translate", | |
height: 40.0, | |
width: 130.0, | |
color: Colors.blueAccent, | |
icon: Icons.translate, | |
iconSize: 18.0, | |
radius: 46.0, | |
onClick: _translateEngToThai, | |
), | |
), | |
], | |
); | |
} | |
Widget _resultCard(Size size) { | |
return FutureBuilder<CompleteResponse?>( | |
future: _translateFuture, | |
builder: (context, snapshot) { | |
final text = snapshot.data?.choices.last.text; | |
return Container( | |
margin: const EdgeInsets.symmetric(vertical: 32.0), | |
padding: const EdgeInsets.symmetric(horizontal: 16.0), | |
alignment: Alignment.bottomCenter, | |
width: size.width * .86, | |
height: size.height * .3, | |
decoration: heroCard, | |
child: SingleChildScrollView( | |
child: Column( | |
children: [ | |
Text( | |
text ?? 'Loading...', | |
style: const TextStyle(color: Colors.black, fontSize: 18.0), | |
), | |
SizedBox( | |
width: size.width, | |
child: const Divider( | |
color: Colors.grey, | |
thickness: 1, | |
), | |
), | |
const Padding( | |
padding: EdgeInsets.all(12.0), | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.end, | |
children: [ | |
Icon( | |
Icons.copy_outlined, | |
color: Colors.grey, | |
size: 22.0, | |
), | |
Padding( | |
padding: EdgeInsets.symmetric(horizontal: 8.0), | |
child: Icon( | |
Icons.delete_forever, | |
color: Colors.grey, | |
size: 22.0, | |
), | |
) | |
], | |
), | |
) | |
], | |
), | |
), | |
); | |
}); | |
} | |
Padding _navigation(Size size) { | |
return Padding( | |
padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 18.0), | |
child: Container( | |
width: size.width * .8, | |
height: size.height * .06, | |
decoration: heroNav, | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.spaceAround, | |
children: [ | |
Container( | |
padding: const EdgeInsets.all(4.0), | |
decoration: BoxDecoration( | |
color: Colors.indigoAccent, | |
borderRadius: BorderRadius.circular(50.0)), | |
child: const Icon( | |
Icons.translate, | |
color: Colors.white, | |
size: 22.0, | |
), | |
), | |
const Icon( | |
Icons.record_voice_over_outlined, | |
color: Colors.indigoAccent, | |
size: 22.0, | |
), | |
const Icon( | |
Icons.favorite, | |
color: Colors.indigoAccent, | |
size: 22.0, | |
), | |
const Icon( | |
Icons.person, | |
color: Colors.indigoAccent, | |
size: 22.0, | |
) | |
], | |
), | |
), | |
); | |
} | |
Widget _titleCard(Size size) { | |
return Container( | |
margin: const EdgeInsets.symmetric(vertical: 32.0), | |
width: size.width * .86, | |
height: size.height * .08, | |
decoration: heroCard, | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.spaceAround, | |
children: [ | |
Row( | |
children: [ | |
ClipRRect( | |
borderRadius: BorderRadius.circular(30), | |
child: Image.network( | |
"https://www.clipartmax.com/png/middle/200-2009207_francais-english-italiano-english-flag-icon-flat.png", | |
fit: BoxFit.cover, | |
width: 30.0, | |
height: 30.0, | |
), | |
), | |
const Padding( | |
padding: EdgeInsets.symmetric(horizontal: 4.0), | |
child: Text( | |
"Eng", | |
style: TextStyle(color: Colors.grey, fontSize: 12.0), | |
), | |
), | |
Transform.rotate( | |
angle: -pi / 2, | |
child: const Icon( | |
Icons.arrow_back_ios_new, | |
size: 16.0, | |
color: Colors.grey, | |
), | |
) | |
], | |
), | |
const Padding( | |
padding: EdgeInsets.symmetric(horizontal: 12.0), | |
child: Icon( | |
Icons.swap_horiz_outlined, | |
color: Colors.grey, | |
size: 22.0, | |
), | |
), | |
Row( | |
children: [ | |
ClipRRect( | |
borderRadius: BorderRadius.circular(30), | |
child: Image.network( | |
"https://cdn-icons-png.flaticon.com/512/197/197452.png", | |
fit: BoxFit.cover, | |
width: 30.0, | |
height: 30.0, | |
), | |
), | |
const Padding( | |
padding: EdgeInsets.symmetric(horizontal: 4.0), | |
child: Text( | |
"Thai", | |
style: TextStyle(color: Colors.grey, fontSize: 12.0), | |
), | |
), | |
Transform.rotate( | |
angle: -pi / 2, | |
child: const Icon( | |
Icons.arrow_back_ios_new, | |
size: 16.0, | |
color: Colors.grey, | |
), | |
) | |
], | |
) | |
], | |
), | |
); | |
} | |
Widget _inputCard(Size size) { | |
return Container( | |
padding: const EdgeInsets.symmetric(horizontal: 16.0), | |
alignment: Alignment.bottomCenter, | |
width: size.width * .86, | |
height: size.height * .25, | |
decoration: heroCard, | |
child: SingleChildScrollView( | |
child: Column( | |
children: [ | |
TextField( | |
decoration: const InputDecoration( | |
border: InputBorder.none, | |
enabledBorder: InputBorder.none, | |
disabledBorder: InputBorder.none), | |
controller: _txtWord, | |
maxLines: 6, | |
textInputAction: TextInputAction.newline, | |
keyboardType: TextInputType.multiline, | |
), | |
SizedBox( | |
width: size.width, | |
child: const Divider( | |
color: Colors.grey, | |
thickness: 1, | |
), | |
), | |
const Padding( | |
padding: EdgeInsets.all(12.0), | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.end, | |
children: [ | |
Icon( | |
Icons.copy_outlined, | |
color: Colors.grey, | |
size: 22.0, | |
), | |
Padding( | |
padding: EdgeInsets.symmetric(horizontal: 8.0), | |
child: Icon( | |
Icons.record_voice_over_outlined, | |
color: Colors.grey, | |
size: 22.0, | |
), | |
) | |
], | |
), | |
) | |
], | |
), | |
), | |
); | |
} | |
} |