aminskjen commited on
Commit
e152140
·
verified ·
1 Parent(s): f0bcc07

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +66 -70
app.py CHANGED
@@ -8,44 +8,40 @@ import cohere
8
  import requests
9
  import uuid
10
  from datetime import datetime
11
- import base64
12
 
13
- # Logging setup
14
  logging.basicConfig(level=logging.INFO)
15
 
16
- # SQLAlchemy base class
17
  class Base(DeclarativeBase):
18
  pass
19
 
20
- # Flask app
21
- app = Flask(__name__)
22
  app.secret_key = os.environ.get("SESSION_SECRET", os.urandom(24).hex())
23
 
24
  # Database config
25
  app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get("DATABASE_URL", "sqlite:///inkboard.db")
26
  app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
27
- app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {'pool_pre_ping': True, "pool_recycle": 300}
 
 
 
28
 
29
  db = SQLAlchemy(app, model_class=Base)
30
 
31
- # Login manager setup
32
  login_manager = LoginManager()
33
  login_manager.init_app(app)
34
  login_manager.login_view = 'login'
 
35
 
36
- # API keys and clients
37
  API_KEY = os.environ.get("Api_key")
38
  HUGGINGFACE_API_KEY = os.environ.get("HUGGINGFACE_API_KEY")
39
-
40
- if not API_KEY:
41
- logging.warning("⚠️ Missing Cohere API key!")
42
- cohere_client = None
43
- else:
44
- cohere_client = cohere.Client(API_KEY)
45
-
46
  HF_IMAGE_MODEL = "stabilityai/stable-diffusion-2-1"
47
 
48
- # Load user from session
 
49
  @login_manager.user_loader
50
  def load_user(user_id):
51
  from models import User
@@ -70,11 +66,13 @@ def register():
70
 
71
  user = User(username=username, email=email)
72
  user.set_password(password)
 
73
  db.session.add(user)
74
  db.session.commit()
75
  login_user(user)
76
 
77
  return jsonify({'success': True, 'redirect': url_for('index')}) if request.is_json else redirect(url_for('index'))
 
78
  return render_template('register.html')
79
 
80
  @app.route('/login', methods=['GET', 'POST'])
@@ -85,10 +83,13 @@ def login():
85
  username, password = data.get('username', '').strip(), data.get('password', '').strip()
86
 
87
  user = User.query.filter((User.username == username) | (User.email == username)).first()
 
88
  if user and user.check_password(password):
89
  login_user(user)
90
  return jsonify({'success': True, 'redirect': url_for('index')}) if request.is_json else redirect(url_for('index'))
 
91
  return jsonify({'error': 'Invalid credentials'}), 401
 
92
  return render_template('login.html')
93
 
94
  @app.route('/logout')
@@ -101,21 +102,19 @@ def logout():
101
  @login_required
102
  def generate_content():
103
  from models import Creation
104
-
105
  data = request.get_json()
106
  scene_idea = data.get('scene_idea', '').strip()
107
- logging.info(f"🎨 New prompt: {scene_idea}")
108
 
109
  if not scene_idea:
110
  return jsonify({'error': 'Please provide a scene idea'}), 400
111
 
112
  if not cohere_client:
113
- return jsonify({'error': 'Cohere API key not configured'}), 500
114
 
115
- try:
116
- story_prompt = f"""Transform this scene idea into a vivid, poetic paragraph with beautiful imagery:
117
  Scene idea: {scene_idea}"""
118
 
 
119
  story_response = cohere_client.generate(
120
  model='command',
121
  prompt=story_prompt,
@@ -123,49 +122,40 @@ Scene idea: {scene_idea}"""
123
  temperature=0.7,
124
  k=0
125
  )
126
-
127
  expanded_story = story_response.generations[0].text.strip()
128
- logging.info(f"📝 Story generated: {expanded_story[:60]}...")
129
-
130
- image_url = None
131
- if HUGGINGFACE_API_KEY:
132
- image_url = generate_image_hf(scene_idea, expanded_story)
133
- else:
134
- logging.warning("⚠️ Missing HuggingFace API key. No image will be generated.")
135
-
136
- creation = Creation(
137
- id=str(uuid.uuid4()),
138
- user_id=current_user.id,
139
- scene_idea=scene_idea,
140
- story=expanded_story,
141
- image_url=image_url
142
- )
143
- db.session.add(creation)
144
- db.session.commit()
145
-
146
- return jsonify({
147
- 'success': True,
148
- 'story': expanded_story,
149
- 'image_url': image_url,
150
- 'creation_id': creation.id
151
- })
152
 
 
 
 
153
  except Exception as e:
154
- logging.error(f" Error generating content: {e}")
155
- return jsonify({'error': 'An error occurred during generation. Check logs.'}), 500
 
 
 
 
 
 
 
 
 
 
 
 
 
156
 
157
  @app.route('/save_journal', methods=['POST'])
158
  @login_required
159
  def save_journal():
160
  from models import Creation
161
  data = request.get_json()
162
- creation_id = data.get('creation_id')
163
- journal_entry = data.get('journal_entry', '').strip()
164
-
165
  creation = Creation.query.filter_by(id=creation_id, user_id=current_user.id).first()
166
  if not creation:
167
  return jsonify({'error': 'Not found'}), 404
168
-
169
  creation.journal_entry = journal_entry
170
  creation.updated_at = datetime.utcnow()
171
  db.session.commit()
@@ -186,24 +176,30 @@ def get_creations():
186
  } for c in creations]})
187
 
188
  def generate_image_hf(scene_idea, story):
189
- prompt = f"An artistic illustration of: {scene_idea}, dreamy, vivid, high detail"
190
- model = HF_IMAGE_MODEL
191
- try:
192
- response = requests.post(
193
- f"https://api-inference.huggingface.co/models/{model}",
194
- headers={"Authorization": f"Bearer {HUGGINGFACE_API_KEY}"},
195
- json={"inputs": prompt},
196
- timeout=60
197
- )
198
- if response.status_code == 200:
199
- return f"data:image/png;base64,{base64.b64encode(response.content).decode()}"
200
- else:
201
- logging.warning(f"Model failed: {response.status_code} - {response.text}")
202
- except Exception as e:
203
- logging.error(f"Exception generating image: {e}")
204
- return None # fallback
205
-
206
- # Import models and initialize DB
 
 
 
 
 
 
207
  from models import User, Creation
208
  with app.app_context():
209
  db.create_all()
 
8
  import requests
9
  import uuid
10
  from datetime import datetime
 
11
 
12
+ # Setup logging
13
  logging.basicConfig(level=logging.INFO)
14
 
 
15
  class Base(DeclarativeBase):
16
  pass
17
 
18
+ # Use writable instance_path to avoid PermissionError
19
+ app = Flask(__name__, instance_path=os.path.join(os.getcwd(), 'instance'))
20
  app.secret_key = os.environ.get("SESSION_SECRET", os.urandom(24).hex())
21
 
22
  # Database config
23
  app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get("DATABASE_URL", "sqlite:///inkboard.db")
24
  app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
25
+ app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {
26
+ 'pool_pre_ping': True,
27
+ "pool_recycle": 300,
28
+ }
29
 
30
  db = SQLAlchemy(app, model_class=Base)
31
 
32
+ # Flask-Login setup
33
  login_manager = LoginManager()
34
  login_manager.init_app(app)
35
  login_manager.login_view = 'login'
36
+ login_manager.login_message = 'Please log in to access InkBoard'
37
 
38
+ # API keys
39
  API_KEY = os.environ.get("Api_key")
40
  HUGGINGFACE_API_KEY = os.environ.get("HUGGINGFACE_API_KEY")
 
 
 
 
 
 
 
41
  HF_IMAGE_MODEL = "stabilityai/stable-diffusion-2-1"
42
 
43
+ cohere_client = cohere.Client(API_KEY) if API_KEY else None
44
+
45
  @login_manager.user_loader
46
  def load_user(user_id):
47
  from models import User
 
66
 
67
  user = User(username=username, email=email)
68
  user.set_password(password)
69
+
70
  db.session.add(user)
71
  db.session.commit()
72
  login_user(user)
73
 
74
  return jsonify({'success': True, 'redirect': url_for('index')}) if request.is_json else redirect(url_for('index'))
75
+
76
  return render_template('register.html')
77
 
78
  @app.route('/login', methods=['GET', 'POST'])
 
83
  username, password = data.get('username', '').strip(), data.get('password', '').strip()
84
 
85
  user = User.query.filter((User.username == username) | (User.email == username)).first()
86
+
87
  if user and user.check_password(password):
88
  login_user(user)
89
  return jsonify({'success': True, 'redirect': url_for('index')}) if request.is_json else redirect(url_for('index'))
90
+
91
  return jsonify({'error': 'Invalid credentials'}), 401
92
+
93
  return render_template('login.html')
94
 
95
  @app.route('/logout')
 
102
  @login_required
103
  def generate_content():
104
  from models import Creation
 
105
  data = request.get_json()
106
  scene_idea = data.get('scene_idea', '').strip()
 
107
 
108
  if not scene_idea:
109
  return jsonify({'error': 'Please provide a scene idea'}), 400
110
 
111
  if not cohere_client:
112
+ return jsonify({'error': 'Cohere API not configured'}), 500
113
 
114
+ story_prompt = f"""Transform this scene idea into a vivid paragraph:
 
115
  Scene idea: {scene_idea}"""
116
 
117
+ try:
118
  story_response = cohere_client.generate(
119
  model='command',
120
  prompt=story_prompt,
 
122
  temperature=0.7,
123
  k=0
124
  )
 
125
  expanded_story = story_response.generations[0].text.strip()
126
+ except Exception as e:
127
+ logging.error(f"Error generating story: {e}")
128
+ return jsonify({'error': 'Story generation failed'}), 500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
 
130
+ image_url = None
131
+ try:
132
+ image_url = generate_image_hf(scene_idea, expanded_story)
133
  except Exception as e:
134
+ logging.warning(f"Image generation failed: {e}")
135
+
136
+ creation_id = str(uuid.uuid4())
137
+ creation = Creation(
138
+ id=creation_id,
139
+ user_id=current_user.id,
140
+ scene_idea=scene_idea,
141
+ story=expanded_story,
142
+ image_url=image_url
143
+ )
144
+
145
+ db.session.add(creation)
146
+ db.session.commit()
147
+
148
+ return jsonify({'success': True, 'story': expanded_story, 'image_url': image_url, 'creation_id': creation_id})
149
 
150
  @app.route('/save_journal', methods=['POST'])
151
  @login_required
152
  def save_journal():
153
  from models import Creation
154
  data = request.get_json()
155
+ creation_id, journal_entry = data.get('creation_id'), data.get('journal_entry', '').strip()
 
 
156
  creation = Creation.query.filter_by(id=creation_id, user_id=current_user.id).first()
157
  if not creation:
158
  return jsonify({'error': 'Not found'}), 404
 
159
  creation.journal_entry = journal_entry
160
  creation.updated_at = datetime.utcnow()
161
  db.session.commit()
 
176
  } for c in creations]})
177
 
178
  def generate_image_hf(scene_idea, story):
179
+ prompt = f"An artistic illustration of: {scene_idea}, dreamy and vivid"
180
+ for model in [
181
+ "runwayml/stable-diffusion-v1-5",
182
+ "stabilityai/stable-diffusion-2-1",
183
+ "CompVis/stable-diffusion-v1-4"
184
+ ]:
185
+ try:
186
+ res = requests.post(
187
+ f"https://api-inference.huggingface.co/models/{model}",
188
+ headers={"Authorization": f"Bearer {HUGGINGFACE_API_KEY}"},
189
+ json={"inputs": prompt},
190
+ timeout=60
191
+ )
192
+ if res.status_code == 200:
193
+ import base64
194
+ return f"data:image/png;base64,{base64.b64encode(res.content).decode()}"
195
+ except Exception as e:
196
+ continue
197
+ return generate_svg_placeholder(scene_idea, story)
198
+
199
+ def generate_svg_placeholder(scene_idea, story):
200
+ return "<svg>Your beautiful fallback SVG here</svg>"
201
+
202
+ # DB setup
203
  from models import User, Creation
204
  with app.app_context():
205
  db.create_all()