tomo2chin2 commited on
Commit
ac872fa
·
verified ·
1 Parent(s): d333263

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -36
app.py CHANGED
@@ -180,64 +180,96 @@ def load_system_instruction(style="standard"):
180
  def generate_html_from_text(text, temperature=0.3, style="standard"):
181
  """テキストからHTMLを生成する"""
182
  try:
183
- # --- API キー & モデル判定 ---
184
  api_key = os.environ.get("GEMINI_API_KEY")
185
  if not api_key:
186
  logger.error("GEMINI_API_KEY 環境変数が設定されていません")
187
  raise ValueError("GEMINI_API_KEY 環境変数が設定されていません")
188
-
 
189
  model_name = os.environ.get("GEMINI_MODEL", "gemini-1.5-pro")
190
  logger.info(f"使用するGeminiモデル: {model_name}")
191
-
 
192
  genai.configure(api_key=api_key)
193
-
 
194
  system_instruction = load_system_instruction(style)
195
-
196
- # --- GenerationConfig (thinking_budget は含めない) ---
 
 
 
 
 
 
197
  generation_config = {
198
- "temperature": temperature,
199
- "top_p": 0.7,
200
- "top_k": 20,
201
  "max_output_tokens": 8192,
202
- "candidate_count": 1
203
  }
204
-
205
- # --- 追加: Flash‑preview 用の追加 kwargs ---
206
- extra_kwargs = {}
207
- if model_name == "gemini-2.5-flash-preview-04-17":
208
- extra_kwargs["thinking_budget"] = 0
209
- logger.info("thinking_budget=0 をトップレベルで付与しました")
210
-
211
- # --- モデル初期化 & 生成 ---
212
- model = genai.GenerativeModel(model_name)
213
-
 
 
 
 
 
 
 
 
 
 
 
 
214
  prompt = f"{system_instruction}\n\n{text}"
 
 
215
  response = model.generate_content(
216
  prompt,
217
  generation_config=generation_config,
218
- safety_settings=[
219
- {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
220
- {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
221
- {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
222
- {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_MEDIUM_AND_ABOVE"},
223
- ],
224
- **extra_kwargs # ← ここで thinking_budget を渡す
225
  )
226
-
227
- # --- レスポンス処理は従来どおり ---
228
  raw_response = response.text
229
- html_start = raw_response.find("```html")
230
- html_end = raw_response.rfind("```")
231
-
 
 
 
 
 
 
232
  if html_start != -1 and html_end != -1 and html_start < html_end:
233
- html_code = raw_response[html_start + 7:html_end].strip()
 
 
 
 
 
234
  html_code = enhance_font_awesome_layout(html_code)
235
- logger.info(f"HTMLの生成に成功 (len={len(html_code)})")
 
236
  return html_code
237
  else:
238
- logger.warning("```html``` タグが見つかりませんでした。全文を返します。")
 
 
 
239
  return raw_response
240
-
241
  except Exception as e:
242
  logger.error(f"HTML生成中にエラーが発生: {e}", exc_info=True)
243
  raise Exception(f"Gemini APIでのHTML生成に失敗しました: {e}")
 
180
  def generate_html_from_text(text, temperature=0.3, style="standard"):
181
  """テキストからHTMLを生成する"""
182
  try:
183
+ # APIキーの取得と設定
184
  api_key = os.environ.get("GEMINI_API_KEY")
185
  if not api_key:
186
  logger.error("GEMINI_API_KEY 環境変数が設定されていません")
187
  raise ValueError("GEMINI_API_KEY 環境変数が設定されていません")
188
+
189
+ # モデル名の取得(環境変数から、なければデフォルト値)
190
  model_name = os.environ.get("GEMINI_MODEL", "gemini-1.5-pro")
191
  logger.info(f"使用するGeminiモデル: {model_name}")
192
+
193
+ # Gemini APIの設定
194
  genai.configure(api_key=api_key)
195
+
196
+ # 指定されたスタイルのシステムインストラクションを読み込む
197
  system_instruction = load_system_instruction(style)
198
+
199
+ # モデル初期化
200
+ logger.info(f"Gemini APIにリクエストを送信: テキスト長さ = {len(text)}, 温度 = {temperature}, スタイル = {style}")
201
+
202
+ # モデル初期化
203
+ model = genai.GenerativeModel(model_name)
204
+
205
+ # 生成設定 - ばらつきを減らすために設定を調整
206
  generation_config = {
207
+ "temperature": temperature, # より低い温度を設定
208
+ "top_p": 0.7, # 0.95から0.7に下げて出力の多様性を制限
209
+ "top_k": 20, # 64から20に下げて候補を絞る
210
  "max_output_tokens": 8192,
211
+ "candidate_count": 1 # 候補は1つだけ生成
212
  }
213
+
214
+ # 安全設定 - デフォルトの安全設定を使用
215
+ safety_settings = [
216
+ {
217
+ "category": "HARM_CATEGORY_HARASSMENT",
218
+ "threshold": "BLOCK_MEDIUM_AND_ABOVE"
219
+ },
220
+ {
221
+ "category": "HARM_CATEGORY_HATE_SPEECH",
222
+ "threshold": "BLOCK_MEDIUM_AND_ABOVE"
223
+ },
224
+ {
225
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
226
+ "threshold": "BLOCK_MEDIUM_AND_ABOVE"
227
+ },
228
+ {
229
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
230
+ "threshold": "BLOCK_MEDIUM_AND_ABOVE"
231
+ }
232
+ ]
233
+
234
+ # プロンプト構築
235
  prompt = f"{system_instruction}\n\n{text}"
236
+
237
+ # コンテンツ生成
238
  response = model.generate_content(
239
  prompt,
240
  generation_config=generation_config,
241
+ safety_settings=safety_settings
 
 
 
 
 
 
242
  )
243
+
244
+ # レスポンスからHTMLを抽出
245
  raw_response = response.text
246
+
247
+ # HTMLタグ部分だけを抽出(
248
+ html と
249
+ の間)
250
+ html_start = raw_response.find("
251
+ html")
252
+ html_end = raw_response.rfind("
253
+ ")
254
+
255
  if html_start != -1 and html_end != -1 and html_start < html_end:
256
+ html_start += 7 # "
257
+ html" の長さ分進める
258
+ html_code = raw_response[html_start:html_end].strip()
259
+ logger.info(f"HTMLの生成に成功: 長さ = {len(html_code)}")
260
+
261
+ # Font Awesomeのレイアウト改善
262
  html_code = enhance_font_awesome_layout(html_code)
263
+ logger.info("Font Awesomeレイアウトの最適化を適用しました")
264
+
265
  return html_code
266
  else:
267
+ # HTMLタグが見つからない場合、レスポンス全体を返す
268
+ logger.warning("レスポンスから
269
+ html
270
+ タグが見つかりませんでした。全テキストを返します。")
271
  return raw_response
272
+
273
  except Exception as e:
274
  logger.error(f"HTML生成中にエラーが発生: {e}", exc_info=True)
275
  raise Exception(f"Gemini APIでのHTML生成に失敗しました: {e}")