Compare commits

...

2 Commits

Author SHA1 Message Date
Ponshu Developer 3cbd9bad2c chore: update download page to v1.0.23 2026-04-09 19:22:21 +09:00
Ponshu Developer 182e498188 fix: save as draft when Gemini 503 exhausts all retries
When API congestion persists after 3 retries + fallback:
- Mark exception with [CONGESTION] tag
- camera_screen catches it and calls DraftService.saveDraft()
- Shows orange snackbar (same UX as offline) instead of red error

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:17:30 +09:00
3 changed files with 52 additions and 11 deletions

View File

@ -567,12 +567,52 @@ class _CameraScreenState extends ConsumerState<CameraScreen> with SingleTickerPr
} catch (e) {
if (mounted) {
Navigator.of(context).pop(); // Close AnalyzingDialog
// Check for Quota Error to set Lockout
if (e.toString().contains('Quota') || e.toString().contains('429')) {
setState(() {
_quotaLockoutTime = DateTime.now().add(const Duration(minutes: 1));
});
final errStr = e.toString();
// AIサーバー混雑503
if (errStr.contains('[CONGESTION]')) {
try {
await DraftService.saveDraft(_capturedImages);
if (!mounted) return;
Navigator.of(context).pop(); // Close camera screen
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(LucideIcons.cloudOff, color: Colors.white, size: 16),
SizedBox(width: 8),
Text('AIサーバー混雑', style: TextStyle(fontWeight: FontWeight.bold)),
],
),
SizedBox(height: 4),
Text('写真を「解析待ち」として保存しました。'),
Text('時間をおいてホーム画面から解析できます。'),
],
),
duration: Duration(seconds: 5),
backgroundColor: Colors.orange,
),
);
} catch (_) {
//
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('解析もドラフト保存も失敗しました。再試行してください。')),
);
}
return;
}
// Quota 429
if (errStr.contains('Quota') || errStr.contains('429')) {
setState(() {
_quotaLockoutTime = DateTime.now().add(const Duration(minutes: 1));
});
}
final appColors = Theme.of(context).extension<AppColors>()!;

View File

@ -349,7 +349,8 @@ $extractedText
if (isLastAttempt || !is503) {
// or 503
if (is503) {
throw Exception('AIサーバーが混雑しています。しばらく待ってから再試行してください。');
// [CONGESTION] camera_screen
throw Exception('[CONGESTION] AIサーバーが混雑しています。解析待ちとして保存します。');
}
throw Exception('AI解析エラー(Direct): $e');
}

View File

@ -1,18 +1,18 @@
{
"date": "2026-04-06",
"name": "Ponshu Room 1.0.22 (2026-04-09)",
"version": "v1.0.22",
"name": "Ponshu Room 1.0.23 (2026-04-09)",
"version": "v1.0.23",
"apks": {
"eiji": {
"lite": {
"url": "https://posimai-lab.tail72e846.ts.net/mai/ponshu-room-lite/releases/download/v1.0.22/ponshu_room_consumer_eiji.apk",
"url": "https://posimai-lab.tail72e846.ts.net/mai/ponshu-room-lite/releases/download/v1.0.23/ponshu_room_consumer_eiji.apk",
"size_mb": 89,
"filename": "ponshu_room_consumer_eiji.apk"
}
},
"maita": {
"lite": {
"url": "https://posimai-lab.tail72e846.ts.net/mai/ponshu-room-lite/releases/download/v1.0.22/ponshu_room_consumer_maita.apk",
"url": "https://posimai-lab.tail72e846.ts.net/mai/ponshu-room-lite/releases/download/v1.0.23/ponshu_room_consumer_maita.apk",
"size_mb": 89,
"filename": "ponshu_room_consumer_maita.apk"
}