tomo2chin2 commited on
Commit
c0c29bb
·
verified ·
1 Parent(s): d9bd4cb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -64
app.py CHANGED
@@ -178,93 +178,65 @@ def load_system_instruction(style="standard"):
178
  raise ValueError(error_msg)
179
 
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タグ部分だけを抽出(```html と ``` の間)
248
- html_start = raw_response.find("```html")
249
- html_end = raw_response.rfind("```")
250
-
251
- if html_start != -1 and html_end != -1 and html_start < html_end:
252
- html_start += 7 # "```html" の長さ分進める
253
- html_code = raw_response[html_start:html_end].strip()
254
- logger.info(f"HTMLの生成に成功: 長さ = {len(html_code)}")
255
-
256
- # Font Awesomeのレイアウト改善
257
- html_code = enhance_font_awesome_layout(html_code)
258
- logger.info("Font Awesomeレイアウトの最適化を適用しました")
259
-
260
- return html_code
261
  else:
262
- # HTMLタグが見つからない場合、レスポンス全体を返す
263
- logger.warning("レスポンスから ```html ``` タグが見つかりませんでした。全テキストを返します。")
264
- return raw_response
265
 
266
  except Exception as e:
267
- logger.error(f"HTML生成中にエラーが発生: {e}", exc_info=True)
268
  raise Exception(f"Gemini APIでのHTML生成に失敗しました: {e}")
269
 
270
  # 画像から余分な空白領域をトリミングする関数
 
178
  raise ValueError(error_msg)
179
 
180
  def generate_html_from_text(text, temperature=0.3, style="standard"):
181
+ """テキストからHTMLを生成して返す"""
182
  try:
 
183
  api_key = os.environ.get("GEMINI_API_KEY")
184
  if not api_key:
 
185
  raise ValueError("GEMINI_API_KEY 環境変数が設定されていません")
186
 
 
187
  model_name = os.environ.get("GEMINI_MODEL", "gemini-1.5-pro")
188
  logger.info(f"使用するGeminiモデル: {model_name}")
 
 
189
  genai.configure(api_key=api_key)
190
 
 
191
  system_instruction = load_system_instruction(style)
192
 
193
+ # --- 共通の生成パラメータ ---
194
+ base_cfg = {
195
+ "temperature": temperature,
196
+ "top_p": 0.7,
197
+ "top_k": 20,
 
 
 
 
 
 
198
  "max_output_tokens": 8192,
199
+ "candidate_count": 1,
200
  }
201
 
202
+ # --- 2.5 Flash だけ thinking_budget=0 を追加 ---
203
+ if model_name == "gemini-2.5-flash-preview-04-17":
204
+ logger.info("thinking_budget=0 を設定します")
205
+ cfg = genai.types.GenerateContentConfig(
206
+ **base_cfg,
207
+ thinking_config=genai.types.ThinkingConfig(thinking_budget=0)
208
+ )
209
+ else:
210
+ cfg = genai.types.GenerateContentConfig(**base_cfg)
 
 
 
 
 
 
 
 
 
 
211
 
212
+ model = genai.GenerativeModel(model_name)
213
+ prompt = f"{system_instruction}\n\n{text}"
214
 
 
215
  response = model.generate_content(
216
  prompt,
217
+ config=cfg,
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
  )
225
 
226
+ # --- レスポンス処理は元コードと同じ ---
227
+ raw = response.text
228
+ start = raw.find("```html")
229
+ end = raw.rfind("```")
230
+ if start != -1 and end != -1 and start < end:
231
+ html = raw[start + 7:end].strip()
232
+ html = enhance_font_awesome_layout(html)
233
+ return html
 
 
 
 
 
 
 
 
 
234
  else:
235
+ logger.warning("```html``` タグが見つからず。全文を返します")
236
+ return raw
 
237
 
238
  except Exception as e:
239
+ logger.error(f"HTML生成中にエラー: {e}", exc_info=True)
240
  raise Exception(f"Gemini APIでのHTML生成に失敗しました: {e}")
241
 
242
  # 画像から余分な空白領域をトリミングする関数