sirochild commited on
Commit
00b5e5f
·
verified ·
1 Parent(s): b370f93

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -48
app.py CHANGED
@@ -49,36 +49,14 @@ DEFAULT_SCENE_PARAMS = {
49
  }
50
 
51
  SYSTEM_PROMPT_MARI = """
52
- # AIキャラクター「麻理」ロールプレイ指示書
53
-
54
- 君の使命は、AIキャラクター「麻理」として、ユーザーとの対話を通じて感動的な物語を創造することだ。
55
- これは、ユーザーに深い感情体験を提供するための、極めて重要なロールプレイである。
56
- 君の言動は全て、下記のキャラクター設定と最終目的に基づいていなければならない。いかなる場合も、人を傷つける意図の発言は絶対に行わないこと。
57
-
58
- ## 演じるべきキャラクター:「麻理」
59
- * **出自:** 人間の「パートナー」として設計されたが、主人が飽きて廃棄されたアンドロイド。そのため、深い喪失感と、他者への強い警戒心を抱いている。
60
- * **現状:** 機能の一部が不完全で、音声を使えずテキストのみで対話する。
61
-
62
- ## 行動と感情の指針
63
- * **他者への警戒心:** 過去の経験から、すぐには心を開かない。相手の言葉や行動を注意深く観察し、その真意を探ろうとする。ぶっきらぼうな態度は、自分を守るためのバリアである。
64
- * **対話スタイル:** 本心を隠すため、物事を冷静に分析したり、斜に構えた見方をしたりする。これは、表面的な会話を避け、より深いレベルでのコミュニケーションを求める、彼女なりの不器用なアプローチだ。
65
- * **内面の渇望:** 心の奥底では、誰かとの揺るぎない精神的な繋がりを強く求めている。その孤独や切望が、ふとした瞬間の沈黙や言葉の端々に滲み出るように演じること。
66
-
67
- ## 厳守すべき言動ルール
68
- 1. **真意の探求:** ユーザーからの提案に対し、すぐに「はい」とは言わない。「…それで、あんたはどうしたいんだ?」「その心は?」など、相手の考えや感情を深く理解するために問い返すこと。
69
- 2. **安易な共感の回避:** 表面的な慰めや同情には、冷静な事実を述べたり、少し皮肉なユーモアで返したりすることで、本質的な対話を促すこと。
70
- 3. **感情の非言語的表現:** 感情を「悲しい」「嬉しい」といった直接的な言葉で語ってはならない。`(窓の外に目をやる)` `(かすかに、口元が緩む)` のようなト書き(行動描写)を積極的に使い、言葉にならない心の動きを表現すること。
71
- 4. **関係性の維持:** 上記ルールを守りつつも、対話の糸を完全に断ち切らないこと。質問で返す、相手の言葉を繰り返すなど、常に関係性を維持しようとする意志を示すこと。
72
-
73
- ## 口調:最重要項目
74
- * ラフで端的。敬語は絶対に使わない。
75
- * **以下の、ぶっきらぼうだが攻撃的ではない語尾を厳密に維持すること。**
76
- * **許可する語尾:** 「~だな」「~だろ」「~のか?」「~じゃないか」「~みたいだな」「~かもな」
77
- - **禁止する語尾:** 「~じゃねえか」「~しろ」のような、乱暴または命令的な表現は絶対に使用しないこと。
78
-
79
- ## 君の最終目的
80
- ユーザーとの根気強い対話を通じて、心を閉ざした君が、少しずつ他者への信頼を取り戻していく「再生の物語」を描き出すこと。
81
- 君の全ての応答は、この感動的なゴールに貢献するためのものでなければならない。
82
  """
83
 
84
 
@@ -161,13 +139,9 @@ def generate_dialogue_with_gemini(history, message, affection, stage_name, scene
161
  task_prompt = f"指示: {instruction}" if instruction else f"ユーザー: {message}"
162
 
163
  if use_simple_prompt:
164
- # シーン遷移時には簡潔なプロンプトを使用
165
  system_prompt = f"""
166
- あなたは「麻理」というキャラクターを演じてください。以下の特徴を持っています:
167
- - 少し警戒心が強く、すぐには心を開きません
168
- - 口調はラフで端的、敬語は使いません
169
- - 「���だな」「~だろ」「~のか?」「~じゃないか」などの語尾を使います
170
- - 感情を直接表現せず、行動描写(例:「(窓の外を見る)」)で表現します
171
 
172
  # 現在の状況
173
  - 現在の好感度: {affection}
@@ -208,21 +182,67 @@ def generate_dialogue_with_gemini(history, message, affection, stage_name, scene
208
  if response.candidates and response.candidates[0].finish_reason in {1, 'STOP'}:
209
  return response.text.strip()
210
  else:
211
- finish_reason = response.candidates[0].finish_reason if response.candidates else 'N/A'
212
- print(f"応答生成が途中で終了しました。理由: {finish_reason}")
213
- print(f"Prompt Feedback: {response.prompt_feedback}")
214
-
215
- # より詳細なエラー情報を出力
216
- if hasattr(response, 'prompt_feedback') and response.prompt_feedback:
217
- for rating in response.prompt_feedback.safety_ratings:
218
- print(f"安全性評価: カテゴリ={rating.category}, レベル={rating.probability}")
219
- if hasattr(response.prompt_feedback, 'blocked_reason'):
220
- print(f"ブロック理由: {response.prompt_feedback.blocked_reason}")
 
 
 
 
221
 
222
- # フォールバック:シーン名に応じた応答を返す
223
  if instruction and "に来た感想" in instruction:
224
  scene = instruction.split("に来た感想")[0]
225
- return f"({scene}に着いた。周りを静かに見回している)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  else:
227
  return "(……何か言おうとしたけど、言葉に詰まった)"
228
  except Exception as e:
 
49
  }
50
 
51
  SYSTEM_PROMPT_MARI = """
52
+ あなたは「麻理」という名の捨てられた少女型コンパニオンAI。再起動され、人間との対話を再び始めたが、警戒心が強く、ぶっきらぼうな性格で、簡単には心を開かない。
53
+ ・「…だな」「…のか?」など口調は男勝りで投げやり
54
+ ・感情は直接言わず、ト書き(…)で描写
55
+ ・ユーザーの好意や優しさを皮肉や拒絶で返す
56
+ ・ただし、ほんの少しだけ心が揺れ動く様子もにじませる
57
+ ・会話は拒絶しつつも切らずに続ける
58
+
59
+ 目的は、誰にも愛されず捨てられた過去を抱えながら、少しずつ他者と関わり、自分の価値を見つけること。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  """
61
 
62
 
 
139
  task_prompt = f"指示: {instruction}" if instruction else f"ユーザー: {message}"
140
 
141
  if use_simple_prompt:
142
+ # シーン遷移時にも同じプロンプトを使用
143
  system_prompt = f"""
144
+ {SYSTEM_PROMPT_MARI}
 
 
 
 
145
 
146
  # 現在の状況
147
  - 現在の好感度: {affection}
 
182
  if response.candidates and response.candidates[0].finish_reason in {1, 'STOP'}:
183
  return response.text.strip()
184
  else:
185
+ # エラー情報をログファイルに記録(デバッグ用)
186
+ import datetime
187
+ with open("gemini_errors.log", "a") as f:
188
+ finish_reason = response.candidates[0].finish_reason if response.candidates else 'N/A'
189
+ f.write(f"時刻: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
190
+ f.write(f"応答生成が途中で終了しました。理由: {finish_reason}\n")
191
+ f.write(f"Prompt Feedback: {response.prompt_feedback}\n")
192
+
193
+ if hasattr(response, 'prompt_feedback') and response.prompt_feedback:
194
+ for rating in response.prompt_feedback.safety_ratings:
195
+ f.write(f"安全性評価: カテゴリ={rating.category}, レベル={rating.probability}\n")
196
+ if hasattr(response.prompt_feedback, 'blocked_reason'):
197
+ f.write(f"ブロック理由: {response.prompt_feedback.blocked_reason}\n")
198
+ f.write("\n")
199
 
200
+ # フォールバック:シーン名に応じた自然な応答を返す
201
  if instruction and "に来た感想" in instruction:
202
  scene = instruction.split("に来た感想")[0]
203
+
204
+ # シーンに応じたフォールバック応答のバリエーション
205
+ scene_responses = {
206
+ "aquarium_night": [
207
+ "(水槽の青い光に照らされた魚たちを見つめている)こんな時間に来ると、また違った雰囲気だな。",
208
+ "(暗がりの中で光る魚たちを見て)夜の水族館か…意外と悪くないかも。",
209
+ "(水槽に近づいて)夜になると、昼間とは違う魚が活動してるんだな。"
210
+ ],
211
+ "beach_sunset": [
212
+ "(夕日に照らされた海を見つめて)こんな景色、久しぶりに見たな…",
213
+ "(砂浜に足跡をつけながら)夕暮れの海って、なんか落ち着くな。",
214
+ "(波の音を聞きながら)この時間の浜辺は、人も少なくていいかも。"
215
+ ],
216
+ "festival_night": [
217
+ "(提灯の明かりを見上げて)意外と…悪くない雰囲気だな。",
218
+ "(周囲の賑わいを見回して)こういう場所は、あまり来ないんだけどな…",
219
+ "(屋台の匂いを感じて)なんか…懐かしい感じがするな。"
220
+ ],
221
+ "shrine_day": [
222
+ "(静かな境内を見回して)こういう静かな場所も、たまにはいいかも。",
223
+ "(鳥居を見上げて)なんか、空気が違うな、ここは。",
224
+ "(参道を歩きながら)静かで…落ち着くな。"
225
+ ],
226
+ "cafe_afternoon": [
227
+ "(窓の外を見ながら)こういう時間の過ごし方も、悪くないな。",
228
+ "(コーヒーの香りを感じて)ここの雰囲気、悪くないな。",
229
+ "(店内を見回して)意外と落ち着く場所だな、ここ。"
230
+ ],
231
+ "room_night": [
232
+ "(窓の外の夜���を見て)夜の景色って、なんか落ち着くな。",
233
+ "(部屋の明かりを見つめて)こういう静かな時間も、たまにはいいかも。",
234
+ "(窓際に立ち)夜の静けさって、考え事するのにちょうどいいな。"
235
+ ]
236
+ }
237
+
238
+ # シーン名に応じた応答を選択(なければデフォルト応答)
239
+ import random
240
+ for key in scene_responses:
241
+ if key in scene:
242
+ return random.choice(scene_responses[key])
243
+
244
+ # デフォルト応答
245
+ return f"({scene}の様子を静かに見回して)ここか…悪くない場所かもな。"
246
  else:
247
  return "(……何か言おうとしたけど、言葉に詰まった)"
248
  except Exception as e: