cryogenic22 commited on
Commit
d514e7b
·
verified ·
1 Parent(s): c15551c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +162 -182
app.py CHANGED
@@ -6,14 +6,17 @@
6
  import streamlit as st
7
  import os
8
  import json
 
 
9
  from multi_agent_book_workflow import BookWritingOrchestrator
 
10
 
11
  class BookWritingApp:
12
  def __init__(self):
13
  """
14
  Initialize the Streamlit application for book writing
15
 
16
- Manages session state for the entire book writing project
17
  """
18
  # Set page configuration
19
  st.set_page_config(
@@ -22,217 +25,194 @@ class BookWritingApp:
22
  layout="wide"
23
  )
24
 
25
- # Initialize session state
26
- if 'project_orchestrator' not in st.session_state:
27
- st.session_state.project_orchestrator = None
28
 
29
- if 'book_concept' not in st.session_state:
30
- st.session_state.book_concept = None
31
 
32
- # Track generated chapters
33
- if 'generated_chapters' not in st.session_state:
34
- st.session_state.generated_chapters = {}
35
 
36
- # Track project metadata
37
- if 'project_metadata' not in st.session_state:
38
- st.session_state.project_metadata = {
39
- 'title': 'Untitled Project',
40
- 'genre': 'Unspecified',
41
- 'total_chapters': 0
42
- }
43
 
44
- def render_book_generation_interface(self):
45
  """
46
- Comprehensive interface for book generation with progress tracking
47
  """
48
- # Tabs for different aspects of book writing
49
- tab1, tab2, tab3 = st.tabs([
50
- "Book Concept",
51
- "Chapter Generation",
52
- "Book Progress"
53
- ])
54
 
55
- with tab1:
56
- self._render_concept_development()
 
57
 
58
- with tab2:
59
- self._render_chapter_generation()
60
 
61
- with tab3:
62
- self._render_book_progress()
 
63
 
64
- def _render_concept_development(self):
65
  """
66
- Render the book concept development interface
67
  """
68
- st.header("📘 Book Concept Development")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
- # Initial concept input
71
- initial_concept = st.text_area(
72
- "Describe Your Book Idea",
73
- height=200,
74
- placeholder="Enter a comprehensive description of your book concept..."
75
- )
 
76
 
77
- if st.button("Generate Book Concept"):
78
- if not st.session_state.project_orchestrator:
79
- st.session_state.project_orchestrator = BookWritingOrchestrator()
 
 
80
 
81
- with st.spinner("Developing Book Concept..."):
82
- try:
83
- book_concept = st.session_state.project_orchestrator.generate_book_concept(
84
- initial_concept
85
- )
86
- st.session_state.book_concept = book_concept
87
-
88
- # Update project metadata
89
- st.session_state.project_metadata.update({
90
- 'title': book_concept.get('title', 'Untitled Project'),
91
- 'genre': book_concept.get('genre', 'Unspecified')
92
- })
93
-
94
- # Display Concept Details
95
- st.subheader("Generated Book Concept")
96
- st.json(book_concept)
97
 
98
- except Exception as e:
99
- st.error(f"Error generating book concept: {e}")
 
 
 
 
100
 
101
- def _render_chapter_generation(self):
102
  """
103
- Render the chapter generation interface with progress tracking
104
  """
105
- st.header("✍️ Chapter Generation")
106
-
107
- # Check if book concept exists
108
- if not st.session_state.book_concept:
109
- st.warning("Please generate a book concept first.")
110
- return
111
-
112
- # Chapter generation controls
113
- col1, col2 = st.columns(2)
114
-
115
- with col1:
116
- # Chapter number selection
117
- max_chapters = 20 # Can be adjusted
118
- chapter_number = st.number_input(
119
- "Select Chapter to Generate",
120
- min_value=1,
121
- max_value=max_chapters,
122
- value=len(st.session_state.generated_chapters) + 1
123
- )
124
-
125
- with col2:
126
- # Total chapters planning
127
- total_chapters = st.number_input(
128
- "Total Planned Chapters",
129
- min_value=1,
130
- max_value=max_chapters,
131
- value=st.session_state.project_metadata.get('total_chapters', 10)
132
- )
133
- st.session_state.project_metadata['total_chapters'] = total_chapters
134
-
135
- # Generate Chapter Button
136
- if st.button("Generate Chapter"):
137
- with st.spinner(f"Generating Chapter {chapter_number}..."):
138
- try:
139
- # Generate chapter content
140
- chapter_content = st.session_state.project_orchestrator.generate_chapter_content(
141
- st.session_state.book_concept,
142
- chapter_number
143
- )
144
-
145
- # Store generated chapter
146
- st.session_state.generated_chapters[chapter_number] = {
147
- 'content': chapter_content,
148
- 'status': 'Generated'
149
- }
150
-
151
- # Display Chapter Content
152
- st.subheader(f"Chapter {chapter_number}")
153
- st.write(chapter_content)
154
-
155
- # Optional: Edit Chapter
156
- edited_content = st.text_area(
157
- "Edit Chapter Content",
158
- value=chapter_content,
159
- height=400
160
- )
161
-
162
- # Save edited content
163
- if st.button(f"Save Chapter {chapter_number}"):
164
- st.session_state.generated_chapters[chapter_number]['content'] = edited_content
165
- st.success(f"Chapter {chapter_number} saved!")
166
-
167
- except Exception as e:
168
- st.error(f"Error generating chapter: {e}")
169
 
170
- def _render_book_progress(self):
171
  """
172
- Render a comprehensive view of book writing progress
173
  """
174
- st.header("📊 Book Writing Progress")
175
-
176
- # Project Metadata
177
- st.subheader("Project Overview")
178
- col1, col2 = st.columns(2)
179
-
180
- with col1:
181
- st.metric("Book Title", st.session_state.project_metadata.get('title', 'Untitled'))
182
- st.metric("Genre", st.session_state.project_metadata.get('genre', 'Unspecified'))
183
-
184
- with col2:
185
- total_chapters = st.session_state.project_metadata.get('total_chapters', 0)
186
- generated_chapters = len(st.session_state.generated_chapters)
187
 
188
- st.metric("Total Planned Chapters", total_chapters)
189
- st.metric("Chapters Generated", generated_chapters)
190
 
191
- # Progress Bar
192
- progress = generated_chapters / total_chapters if total_chapters > 0 else 0
193
- st.progress(progress)
194
-
195
- # Chapter Navigation and Details
196
- st.subheader("Generated Chapters")
197
-
198
- # Create tabs for each generated chapter
199
- if st.session_state.generated_chapters:
200
- chapter_tabs = st.tabs([
201
- f"Chapter {ch_num}" for ch_num in sorted(st.session_state.generated_chapters.keys())
202
- ])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
 
204
- for i, ch_num in enumerate(sorted(st.session_state.generated_chapters.keys())):
205
- with chapter_tabs[i]:
206
- chapter_data = st.session_state.generated_chapters[ch_num]
207
- st.write(chapter_data['content'])
208
-
209
- # Chapter status and actions
210
- col1, col2 = st.columns(2)
211
- with col1:
212
- status = st.selectbox(
213
- "Chapter Status",
214
- ["Generated", "In Review", "Completed"],
215
- key=f"status_{ch_num}"
216
- )
217
-
218
- with col2:
219
- if st.button(f"Export Chapter {ch_num}"):
220
- # Export chapter functionality
221
- with open(f"chapter_{ch_num}.txt", "w") as f:
222
- f.write(chapter_data['content'])
223
- st.success(f"Chapter {ch_num} exported!")
224
- else:
225
- st.info("No chapters generated yet. Start writing your book!")
226
 
227
  def run(self):
228
  """
229
- Run the Streamlit application
230
  """
231
- # Main title
232
- st.title("🚀 AI-Powered Book Writing Assistant")
 
 
 
233
 
234
- # Render the comprehensive book generation interface
235
- self.render_book_generation_interface()
 
 
 
236
 
237
  def main():
238
  # Initialize and run the application
 
6
  import streamlit as st
7
  import os
8
  import json
9
+ import uuid
10
+
11
  from multi_agent_book_workflow import BookWritingOrchestrator
12
+ from persistence_manager import HuggingFacePersistenceManager, check_huggingface_storage
13
 
14
  class BookWritingApp:
15
  def __init__(self):
16
  """
17
  Initialize the Streamlit application for book writing
18
 
19
+ Manages session state, persistence, and API resilience
20
  """
21
  # Set page configuration
22
  st.set_page_config(
 
25
  layout="wide"
26
  )
27
 
28
+ # Initialize persistence manager
29
+ self.persistence_manager = HuggingFacePersistenceManager()
 
30
 
31
+ # Verify storage capabilities
32
+ self._verify_storage()
33
 
34
+ # Initialize session state
35
+ self._initialize_session_state()
 
36
 
37
+ # Set up resilient API handling
38
+ self._setup_resilient_api_handler()
 
 
 
 
 
39
 
40
+ def _verify_storage(self):
41
  """
42
+ Verify Hugging Face storage capabilities
43
  """
44
+ storage_check = check_huggingface_storage()
 
 
 
 
 
45
 
46
+ # Display warnings if storage is not fully accessible
47
+ if not storage_check['data_dir_exists']:
48
+ st.error("Persistent storage directory not found. Some features may be limited.")
49
 
50
+ if not storage_check['data_dir_writable']:
51
+ st.warning("Cannot write to persistent storage. Data may not be saved.")
52
 
53
+ # Optional: Display free space
54
+ free_space_mb = storage_check['free_space'] / (1024 * 1024)
55
+ st.sidebar.info(f"Available Storage: {free_space_mb:.2f} MB")
56
 
57
+ def _initialize_session_state(self):
58
  """
59
+ Initialize and manage Streamlit session state
60
  """
61
+ # Project tracking
62
+ if 'active_project_id' not in st.session_state:
63
+ st.session_state.active_project_id = None
64
+
65
+ # Restore last active project if exists
66
+ if st.session_state.active_project_id:
67
+ self._load_project(st.session_state.active_project_id)
68
+
69
+ # Ensure core session state variables exist
70
+ session_defaults = {
71
+ 'project_orchestrator': None,
72
+ 'book_concept': None,
73
+ 'generated_chapters': {},
74
+ 'project_metadata': {
75
+ 'title': 'Untitled Project',
76
+ 'genre': 'Unspecified',
77
+ 'total_chapters': 0
78
+ }
79
+ }
80
 
81
+ for key, default in session_defaults.items():
82
+ if key not in st.session_state:
83
+ st.session_state[key] = default
84
+
85
+ def _load_project(self, project_id):
86
+ """
87
+ Load a project from persistent storage
88
 
89
+ Args:
90
+ project_id (str): Unique identifier for the project
91
+ """
92
+ try:
93
+ loaded_project = self.persistence_manager.load_project(project_id)
94
 
95
+ if loaded_project:
96
+ # Update session state with loaded project
97
+ st.session_state.active_project_id = project_id
98
+ st.session_state.book_concept = loaded_project.get('book_concept')
99
+ st.session_state.generated_chapters = loaded_project.get('chapters', {})
100
+ st.session_state.project_metadata = {
101
+ 'title': loaded_project.get('title', 'Untitled Project'),
102
+ 'genre': loaded_project.get('genre', 'Unspecified'),
103
+ 'total_chapters': loaded_project.get('total_chapters', 0)
104
+ }
 
 
 
 
 
 
105
 
106
+ st.success(f"Loaded project: {loaded_project.get('title', 'Untitled')}")
107
+ else:
108
+ st.warning("Could not load project.")
109
+
110
+ except Exception as e:
111
+ st.error(f"Error loading project: {e}")
112
 
113
+ def _setup_resilient_api_handler(self):
114
  """
115
+ Set up resilient API handling for different language models
116
  """
117
+ # Initialize with primary and fallback models from workflow
118
+ if not st.session_state.project_orchestrator:
119
+ st.session_state.project_orchestrator = BookWritingOrchestrator()
120
+
121
+ openai_model = st.session_state.project_orchestrator.openai_llm
122
+ anthropic_model = st.session_state.project_orchestrator.anthropic_llm
123
+
124
+ # Create resilient handler (complete implementation needed)
125
+ from persistence_manager import ResiliентAPIHandler
126
+ self.resilient_handler = ResiliентAPIHandler(
127
+ primary_model=openai_model,
128
+ fallback_model=anthropic_model
129
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
131
+ def _save_current_project(self):
132
  """
133
+ Save the current project to persistent storage
134
  """
135
+ try:
136
+ # Prepare project data for saving
137
+ project_data = {
138
+ 'project_id': st.session_state.active_project_id or str(uuid.uuid4()),
139
+ 'title': st.session_state.project_metadata.get('title', 'Untitled Project'),
140
+ 'genre': st.session_state.project_metadata.get('genre', 'Unspecified'),
141
+ 'book_concept': st.session_state.book_concept,
142
+ 'chapters': st.session_state.generated_chapters,
143
+ 'total_chapters': st.session_state.project_metadata.get('total_chapters', 0)
144
+ }
145
+
146
+ # Save project
147
+ project_id = self.persistence_manager.save_project(project_data)
148
 
149
+ # Update active project ID
150
+ st.session_state.active_project_id = project_id
151
 
152
+ st.success(f"Project saved with ID: {project_id}")
153
+
154
+ except Exception as e:
155
+ st.error(f"Error saving project: {e}")
156
+
157
+ def render_project_management(self):
158
+ """
159
+ Render project management interface
160
+ """
161
+ st.sidebar.header("Project Management")
162
+
163
+ # New Project Button
164
+ if st.sidebar.button("Start New Project"):
165
+ # Reset session state
166
+ st.session_state.active_project_id = None
167
+ st.session_state.book_concept = None
168
+ st.session_state.generated_chapters = {}
169
+ st.session_state.project_metadata = {
170
+ 'title': 'Untitled Project',
171
+ 'genre': 'Unspecified',
172
+ 'total_chapters': 0
173
+ }
174
+ st.experimental_rerun()
175
+
176
+ # Load Project
177
+ project_list = self.persistence_manager.list_projects()
178
+ if project_list:
179
+ selected_project = st.sidebar.selectbox(
180
+ "Load Existing Project",
181
+ [p['title'] for p in project_list],
182
+ index=None,
183
+ placeholder="Select a project..."
184
+ )
185
 
186
+ if selected_project:
187
+ # Find project ID
188
+ project_id = next(
189
+ p['project_id'] for p in project_list
190
+ if p['title'] == selected_project
191
+ )
192
+
193
+ # Load project
194
+ if st.sidebar.button("Load Selected Project"):
195
+ self._load_project(project_id)
196
+
197
+ # Save Current Project
198
+ if st.sidebar.button("Save Current Project"):
199
+ self._save_current_project()
 
 
 
 
 
 
 
 
200
 
201
  def run(self):
202
  """
203
+ Run the main Streamlit application
204
  """
205
+ # Render project management sidebar
206
+ self.render_project_management()
207
+
208
+ # Main application content (placeholder)
209
+ st.title("🚀 AI Book Writing Assistant")
210
 
211
+ # TODO: Add main application workflow
212
+ # This would include:
213
+ # 1. Book concept development
214
+ # 2. Chapter generation
215
+ # 3. Project progress tracking
216
 
217
  def main():
218
  # Initialize and run the application