import 'http_client.dart'; import 'http_util.dart'; import 'models.dart'; import 'providers/base_provider.dart'; /// Port of g4f `IterListProvider`: try each provider until one returns content. class IterListProvider { IterListProvider(this.providers); final List providers; Future create({ required List messages, String? model, }) async { final exceptions = {}; final ordered = [ ...providers.where((p) => p.working && !p.isWebView), ...providers.where((p) => p.working && p.isWebView), ]; for (final provider in ordered) { final alias = provider.resolveModel(model); try { await warmupOrigin(provider.url); final result = await provider.complete(alias, messages); if (looksLikeModelOutput(result)) { return result.trim(); } exceptions[provider.name] = 'unusable text (${result.trim().length} chars)'; } catch (e) { exceptions[provider.name] = e; print('Provider ${provider.name} failed: $e'); } } if (exceptions.isEmpty) { throw Exception('No G4F providers available.'); } if (exceptions.length == 1) { throw Exception('${exceptions.keys.first}: ${exceptions.values.first}'); } throw Exception( 'RetryProvider failed:\n${exceptions.entries.map((e) => '${e.key}: ${e.value}').join('\n')}', ); } }