@@ -8,12 +8,14 @@ class ProviderDetailScreen extends StatefulWidget {
88 final AiProvider provider;
99 final String ? existingApiKey;
1010 final String ? existingModel;
11+ final String ? existingBaseUrl;
1112
1213 const ProviderDetailScreen ({
1314 super .key,
1415 required this .provider,
1516 this .existingApiKey,
1617 this .existingModel,
18+ this .existingBaseUrl,
1719 });
1820
1921 @override
@@ -24,6 +26,7 @@ class _ProviderDetailScreenState extends State<ProviderDetailScreen> {
2426 static const _customModelSentinel = '__custom__' ;
2527
2628 late final TextEditingController _apiKeyController;
29+ late final TextEditingController _baseUrlController;
2730 late final TextEditingController _customModelController;
2831 late String _selectedModel;
2932 bool _isCustomModel = false ;
@@ -41,6 +44,9 @@ class _ProviderDetailScreenState extends State<ProviderDetailScreen> {
4144 void initState () {
4245 super .initState ();
4346 _apiKeyController = TextEditingController (text: widget.existingApiKey ?? '' );
47+ _baseUrlController = TextEditingController (
48+ text: widget.existingBaseUrl ?? widget.provider.baseUrl,
49+ );
4450 _customModelController = TextEditingController ();
4551
4652 final existing = widget.existingModel ?? widget.provider.defaultModels.first;
@@ -57,6 +63,7 @@ class _ProviderDetailScreenState extends State<ProviderDetailScreen> {
5763 @override
5864 void dispose () {
5965 _apiKeyController.dispose ();
66+ _baseUrlController.dispose ();
6067 _customModelController.dispose ();
6168 super .dispose ();
6269 }
@@ -69,6 +76,13 @@ class _ProviderDetailScreenState extends State<ProviderDetailScreen> {
6976 );
7077 return ;
7178 }
79+ final baseUrl = _baseUrlController.text.trim ();
80+ if (baseUrl.isEmpty) {
81+ ScaffoldMessenger .of (context).showSnackBar (
82+ const SnackBar (content: Text ('API URL cannot be empty' )),
83+ );
84+ return ;
85+ }
7286 final model = _effectiveModel;
7387 if (model.isEmpty) {
7488 ScaffoldMessenger .of (context).showSnackBar (
@@ -82,6 +96,7 @@ class _ProviderDetailScreenState extends State<ProviderDetailScreen> {
8296 await ProviderConfigService .saveProviderConfig (
8397 provider: widget.provider,
8498 apiKey: apiKey,
99+ baseUrl: baseUrl,
85100 model: model,
86101 );
87102 if (mounted) {
@@ -214,6 +229,20 @@ class _ProviderDetailScreenState extends State<ProviderDetailScreen> {
214229 ),
215230 const SizedBox (height: 24 ),
216231
232+ // API URL
233+ Text (
234+ 'API URL' ,
235+ style: theme.textTheme.titleSmall? .copyWith (fontWeight: FontWeight .w600),
236+ ),
237+ const SizedBox (height: 8 ),
238+ TextField (
239+ controller: _baseUrlController,
240+ decoration: const InputDecoration (
241+ hintText: 'https://api.example.com/v1' ,
242+ ),
243+ ),
244+ const SizedBox (height: 24 ),
245+
217246 // Model selection
218247 Text (
219248 'Model' ,
0 commit comments