Skip to content

Commit a67b9ad

Browse files
author
Emmanuel ERNEST
committed
migrate to gpt-5
1 parent db644ca commit a67b9ad

8 files changed

Lines changed: 406 additions & 98 deletions

File tree

CLAUDE.md

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -229,20 +229,21 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
229229
1. **Hero Creation**: Step-by-step character building with AI-generated avatars
230230
2. **Story Generation**: AI-powered stories using OpenAI GPT-4o with scene extraction
231231
3. **Visual Storytelling**: NEW - AI-generated illustrations synchronized with audio
232-
4. **Visual Consistency**: NEW - Character appearance maintained across all illustrations
233-
5. **Custom Events**: User-defined scenarios with AI enhancement, pictograms, and usage tracking
234-
6. **Multi-Language Support**: 5 languages with localized prompts and voices
235-
7. **Audio Generation**: High-quality MP3 synthesis via gpt-4o-mini-tts
236-
8. **Story Editing**: In-app editing with automatic audio regeneration
237-
9. **Reading Journey**: Comprehensive statistics and progress tracking with charts
238-
10. **Advanced Audio Playback**: Full-featured player with lock screen controls and queue management
239-
11. **Content Safety**: NEW - Comprehensive child-safe content filtering
240-
12. **Error Resilience**: NEW - Graceful failure handling with retry mechanisms
241-
13. **Theme Support**: Light, dark, and system theme preferences
242-
14. **Accessibility**: Full VoiceOver and Dynamic Type support (WCAG AA)
243-
15. **Hero Management**: Complete CRUD operations with avatar and visual profile support
244-
16. **Background Processing**: Continued operation when app is backgrounded
245-
17. **Performance Optimization**: Device-specific adaptations for smooth operation
232+
4. **Visual Consistency**: NEW - Character appearance maintained across all illustrations using GPT-Image-1 multi-turn generation
233+
5. **Multi-Turn Image Generation**: NEW - Each illustration references the previous image for perfect visual consistency
234+
6. **Custom Events**: User-defined scenarios with AI enhancement, pictograms, and usage tracking
235+
7. **Multi-Language Support**: 5 languages with localized prompts and voices
236+
8. **Audio Generation**: High-quality MP3 synthesis via gpt-4o-mini-tts
237+
9. **Story Editing**: In-app editing with automatic audio regeneration
238+
10. **Reading Journey**: Comprehensive statistics and progress tracking with charts
239+
11. **Advanced Audio Playback**: Full-featured player with lock screen controls and queue management
240+
12. **Content Safety**: NEW - Comprehensive child-safe content filtering
241+
13. **Error Resilience**: NEW - Graceful failure handling with retry mechanisms
242+
14. **Theme Support**: Light, dark, and system theme preferences
243+
15. **Accessibility**: Full VoiceOver and Dynamic Type support (WCAG AA)
244+
16. **Hero Management**: Complete CRUD operations with avatar and visual profile support
245+
17. **Background Processing**: Continued operation when app is backgrounded
246+
18. **Performance Optimization**: Device-specific adaptations for smooth operation
246247

247248
## Recent UI Changes
248249

@@ -302,11 +303,14 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
302303
- **Visual Profiles**: Automatic extraction of character characteristics for consistency
303304
- **New Features**: Background control (auto/transparent/opaque), output format selection (PNG/JPEG)
304305

305-
#### NEW: Illustration Generation (GPT-Image-1)
306+
#### NEW: Illustration Generation (GPT-Image-1 with Multi-Turn)
306307
- **Multi-Scene Support**: Generate multiple illustrations per story
307308
- **Audio Synchronization**: Timestamp-based illustration display
308-
- **Visual Consistency**: Character appearance maintained across scenes
309-
- **Error Handling**: Retry mechanisms with graceful failure modes
309+
- **Visual Consistency**: Character appearance maintained across scenes using generation ID chaining
310+
- **Multi-Turn Generation**: Each illustration references the previous image for consistency
311+
- **Sequential Processing**: Illustrations generated one by one to maintain generation chain
312+
- **Generation ID Storage**: Persistent generation IDs for future consistency
313+
- **Error Handling**: Retry mechanisms with graceful failure modes and chain recovery
310314
- **Content Safety**: Child-safe content filtering with multi-language support
311315
- **Storage**: Documents/StoryIllustrations directory with organized file management
312316
- **Enhanced Quality**: Improved instruction following and text rendering capabilities
@@ -325,10 +329,18 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
325329
- **Avatar Generation**: $0.02-0.19 per image (low/medium/high quality with GPT-Image-1)
326330
- **Illustration Generation**: $0.02-0.19 per image (token-based pricing)
327331

332+
### Multi-Turn Image Generation Implementation
333+
- **Generation ID Chaining**: Each illustration references the previous image's generation ID
334+
- **Avatar Integration**: First illustration uses hero avatar's generation ID for consistency
335+
- **Sequential Processing**: Illustrations generated one-by-one to maintain visual chain
336+
- **Error Recovery**: Graceful fallback to previous generation IDs when chain breaks
337+
- **Persistent Storage**: Generation IDs stored in Hero and StoryIllustration models
338+
- **API Integration**: `previous_generation_id` parameter added to GPT-Image-1 requests
339+
328340
### Areas for Improvement
329341
- Implement exponential backoff for rate limiting (partially addressed with error handling)
330-
- Add request queuing and batching for illustration generation
331-
- Implement usage monitoring and cost tracking
342+
- Add request queuing and batching for non-chained generation scenarios
343+
- Implement usage monitoring and cost tracking with token-based pricing
332344
- Develop content caching strategy for illustrations
333345
- Optimize illustration file size and compression
334346
- Add illustration preloading for better performance

InfiniteStories.xcodeproj/xcuserdata/captaindev404.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

Lines changed: 114 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@
176176
endingColumnNumber = "9223372036854775807"
177177
startingLineNumber = "817"
178178
endingLineNumber = "817"
179-
landmarkName = "enhancedBasicSanitization(_:)"
180-
landmarkType = "7">
179+
landmarkName = "OpenAIService"
180+
landmarkType = "3">
181181
</BreakpointContent>
182182
</BreakpointProxy>
183183
<BreakpointProxy
@@ -436,5 +436,117 @@
436436
landmarkType = "7">
437437
</BreakpointContent>
438438
</BreakpointProxy>
439+
<BreakpointProxy
440+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
441+
<BreakpointContent
442+
uuid = "2BC71D88-23AA-4C30-BA3B-46B84EAE233B"
443+
shouldBeEnabled = "No"
444+
ignoreCount = "0"
445+
continueAfterRunningActions = "No"
446+
filePath = "InfiniteStories/Services/AIService.swift"
447+
startingColumnNumber = "9223372036854775807"
448+
endingColumnNumber = "9223372036854775807"
449+
startingLineNumber = "1364"
450+
endingLineNumber = "1364"
451+
landmarkName = "generateSceneIllustration(prompt:hero:previousGenerationId:)"
452+
landmarkType = "7">
453+
</BreakpointContent>
454+
</BreakpointProxy>
455+
<BreakpointProxy
456+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
457+
<BreakpointContent
458+
uuid = "3BE5AD3B-62F5-46D8-B75E-8632345C4018"
459+
shouldBeEnabled = "No"
460+
ignoreCount = "0"
461+
continueAfterRunningActions = "No"
462+
filePath = "InfiniteStories/Services/AIService.swift"
463+
startingColumnNumber = "9223372036854775807"
464+
endingColumnNumber = "9223372036854775807"
465+
startingLineNumber = "1365"
466+
endingLineNumber = "1365"
467+
landmarkName = "generateSceneIllustration(prompt:hero:previousGenerationId:)"
468+
landmarkType = "7">
469+
</BreakpointContent>
470+
</BreakpointProxy>
471+
<BreakpointProxy
472+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
473+
<BreakpointContent
474+
uuid = "267C55BE-DFE6-47AE-A7DD-32111CD6F169"
475+
shouldBeEnabled = "No"
476+
ignoreCount = "0"
477+
continueAfterRunningActions = "No"
478+
filePath = "InfiniteStories/Services/AIService.swift"
479+
startingColumnNumber = "9223372036854775807"
480+
endingColumnNumber = "9223372036854775807"
481+
startingLineNumber = "1361"
482+
endingLineNumber = "1361"
483+
landmarkName = "generateSceneIllustration(prompt:hero:previousGenerationId:)"
484+
landmarkType = "7">
485+
</BreakpointContent>
486+
</BreakpointProxy>
487+
<BreakpointProxy
488+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
489+
<BreakpointContent
490+
uuid = "381BF28D-495A-439D-97D9-F8234D227662"
491+
shouldBeEnabled = "No"
492+
ignoreCount = "0"
493+
continueAfterRunningActions = "No"
494+
filePath = "InfiniteStories/Services/AIService.swift"
495+
startingColumnNumber = "9223372036854775807"
496+
endingColumnNumber = "9223372036854775807"
497+
startingLineNumber = "1461"
498+
endingLineNumber = "1461"
499+
landmarkName = "generateSceneIllustration(prompt:hero:previousGenerationId:)"
500+
landmarkType = "7">
501+
</BreakpointContent>
502+
</BreakpointProxy>
503+
<BreakpointProxy
504+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
505+
<BreakpointContent
506+
uuid = "A171FCC8-C319-4E56-A506-ADEC9FDE54CF"
507+
shouldBeEnabled = "No"
508+
ignoreCount = "0"
509+
continueAfterRunningActions = "No"
510+
filePath = "InfiniteStories/Services/AIService.swift"
511+
startingColumnNumber = "9223372036854775807"
512+
endingColumnNumber = "9223372036854775807"
513+
startingLineNumber = "1468"
514+
endingLineNumber = "1468"
515+
landmarkName = "generateSceneIllustration(prompt:hero:previousGenerationId:)"
516+
landmarkType = "7">
517+
</BreakpointContent>
518+
</BreakpointProxy>
519+
<BreakpointProxy
520+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
521+
<BreakpointContent
522+
uuid = "C759093F-A876-4300-95A1-1498E408208C"
523+
shouldBeEnabled = "No"
524+
ignoreCount = "0"
525+
continueAfterRunningActions = "No"
526+
filePath = "InfiniteStories/Services/AIService.swift"
527+
startingColumnNumber = "9223372036854775807"
528+
endingColumnNumber = "9223372036854775807"
529+
startingLineNumber = "1393"
530+
endingLineNumber = "1393"
531+
landmarkName = "generateSceneIllustration(prompt:hero:previousGenerationId:)"
532+
landmarkType = "7">
533+
</BreakpointContent>
534+
</BreakpointProxy>
535+
<BreakpointProxy
536+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
537+
<BreakpointContent
538+
uuid = "3D18A0CA-F2C5-4CC2-BE5E-9CF50A227EA7"
539+
shouldBeEnabled = "No"
540+
ignoreCount = "0"
541+
continueAfterRunningActions = "No"
542+
filePath = "InfiniteStories/Services/AIService.swift"
543+
startingColumnNumber = "9223372036854775807"
544+
endingColumnNumber = "9223372036854775807"
545+
startingLineNumber = "1442"
546+
endingLineNumber = "1442"
547+
landmarkName = "generateSceneIllustration(prompt:hero:previousGenerationId:)"
548+
landmarkType = "7">
549+
</BreakpointContent>
550+
</BreakpointProxy>
439551
</Breakpoints>
440552
</Bucket>

InfiniteStories/Models/Hero.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ final class Hero {
2020
var avatarImagePath: String?
2121
var avatarPrompt: String?
2222
var avatarGeneratedAt: Date?
23+
var avatarGenerationId: String? // GPT-Image-1 generation ID for multi-turn consistency
2324

2425
@Relationship(deleteRule: .nullify) var stories: [Story] = []
2526
@Relationship var visualProfile: HeroVisualProfile?
@@ -35,6 +36,7 @@ final class Hero {
3536
self.avatarImagePath = nil
3637
self.avatarPrompt = nil
3738
self.avatarGeneratedAt = nil
39+
self.avatarGenerationId = nil
3840
}
3941

4042
var traitsDescription: String {

InfiniteStories/Models/StoryIllustration.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,19 @@ final class StoryIllustration {
4040
var retryCount: Int
4141
var failedAt: Date?
4242

43+
/// GPT-Image-1 generation IDs for multi-turn consistency
44+
var generationId: String? // This illustration's generation ID
45+
var previousGenerationId: String? // Referenced previous image generation ID
46+
4347
/// Relationship to the parent story
4448
@Relationship(inverse: \Story.illustrations) var story: Story?
4549

4650
init(
4751
timestamp: Double,
4852
imagePrompt: String,
4953
displayOrder: Int,
50-
textSegment: String
54+
textSegment: String,
55+
previousGenerationId: String? = nil
5156
) {
5257
self.id = UUID()
5358
self.timestamp = timestamp
@@ -61,6 +66,8 @@ final class StoryIllustration {
6166
self.errorType = nil
6267
self.retryCount = 0
6368
self.failedAt = nil
69+
self.generationId = nil
70+
self.previousGenerationId = previousGenerationId
6471
}
6572

6673
/// Computed property to get the full URL for the image

0 commit comments

Comments
 (0)