fudii0921 commited on
Commit
ab0a4bd
·
verified ·
1 Parent(s): c01b309

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +1243 -161
app.py CHANGED
@@ -1,40 +1,564 @@
1
  import gradio as gr
 
 
 
 
 
 
 
 
 
2
  from google import genai
3
  from google.genai import types
4
  import os
5
  from dotenv import load_dotenv
6
  import tempfile
7
- import zipfile
8
- #pip3 install pdfkit' と 'brew install wkhtmltopdf'を実行してください
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
- # Load environment variables
11
- load_dotenv()
12
 
13
- # Configure the Gemini client
14
- # NOTE: Make sure your GEMINI_API_KEY is set in your .env file
15
- client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
 
 
 
16
 
17
- # Define the grounding tool
18
- grounding_tool = types.Tool(
19
- google_search=types.GoogleSearch()
20
- )
21
 
22
- eval_kijyun = "評価会議のための質問事項(ディスカッションガイド)1. イントロダクションと全体像の確認対象質問・論点目的評価者「この評価レポートの意図は、過去を裁くことではなく、今後の成長を最大化することです。まず、レポートの全体的な評価について、あなたの最初の感想を教えてください。」建設的な雰囲気を作り、自己評価と他者評価のギャップを認識させる。評価者「期間を通じて、あなたが設定していた最も重要な目標は何でしたか?その目標達成について、自己評価はどの程度ですか?」評価の焦点を合わせ、本人の認識を明確にする。2. 業績評価に関する質問(成果の深掘り)対象質問・論点目的コンサルタント「期間中、あなたが最も価値を提供できたと実感しているプロジェクト(または成果物)はどれですか?具体的にクライアントにどのようなインパクトを与えましたか?」本人が誇る成果を確認し、具体的な事例を掘り下げる。評価者「『プロジェク��〇〇』での目標達成度は高いと評価しましたが、その成功の**最も大きな要因(KFS)**は何だったと考えますか?」成功の再現性を高めるための要因分析を促す。評価者「逆に、目標を達成できなかった、あるいは難航したプロジェクトについて、主要なボトルネックは何でしたか?それはコントロール可能な要因とコントロール不能な要因のどちらでしたか?」失敗からの学びを引き出し、客観的な状況分析力を評価する。評価者「ファームへの貢献(ナレッジ共有、採用など)で特に注力した点はありますか?その活動を通じてチームにどのような変化をもたらしましたか?」チーム・組織へのコミットメントと影響力を評価する。3. 能力評価に関する質問(スキルの具体化)対象質問・論点目的評価者「能力評価において『問題解決・論理的思考力』を高く評価しましたが、これを最もよく示していた具体的な行動や発言を一つ教えてください。」評価者の判断根拠を共有し、評価の納得度を高める。コンサルタント「次期に向けて、コンサルタントとして最も強化が必要だと感じているスキルは何ですか?なぜそれが重要だと考えますか?」課題意識と成長意欲、そして自己認識の正確さを評価する。評価者「あなたの提案資料は非常に論理的でしたが、**『伝達力』**の項目で改善点があると評価したのは、どのような場面(例:クライアントとの交渉、経営層へのプレゼン)でのことですか?」定性的な評価について、具体的な場面(コンテキスト)を示してフィードバックする。4. 行動評価に関する質問(プロセスとプロフェッショナリズム)対象質問・論点目的評価者「『プロジェクトA』の緊迫した状況下で、あなたはチームに対してどのようなリーダーシップを発揮しましたか?具体的な行動を教えてください。」プレッシャー下での行動やチームへの影響力を評価する。コンサルタント「期間中の業務プロセスを振り返って、より良い結果を出すために一つだけ変えられるとしたら、どの時点のどの行動を変えますか?」振り返りから改善につなげる内省力と、行動の重要性を理解しているかを評価する。評価者「クライアントとのコミュニケーションにおいて、特に信頼関係を深めるために意識的に行っていたことは何ですか?結果としてどうなりましたか?」クライアントリレーション構築における意識的な努力と、その結果を評価する。5. 総括とネクストステップ(キャリア開発)対象質問・論点目的評価者「総合的に見て、次の職位(例:マネージャー)へ昇進するために、現時点で最も不足していると判断するスキルや行動は何ですか? 具体的な基準に照らして説明します。」次の職位への期待値(卒業要件)を明確に伝え、ギャップを埋めるための目標設定につなげる。コンサルタント「この評価結果を踏まえ、次期の重点目標としてレポートに記載した内容(専門性向上やキャリアゴール)は、あなたのキャリアパスと合致していますか?」個人の目標とファームのニーズとの整合性を確認する。コンサルタント「目標達成のために、ファーム(評価者やチーム)にどのようなサポートやリソースを期待しますか?」育成計画に必要なリソースや環境整備について具体的に議論する。評価者「この評価レビューを通じて、他に懸念点や疑問点はありますか?私からのフィードバックに納得できない点があれば、ぜひ教えてください。」相互理解を深め、オープンな関係を維持したまま会議を終える。"
 
23
 
 
 
24
 
25
- template = """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  <!DOCTYPE html>
27
  <html lang="ja">
28
 
29
  <head>
30
  <meta charset="UTF-8">
31
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
32
- <title>パフォーマンスレポート:名前</title>
33
  <link
34
  href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Roboto:wght@400;700&display=swap"
35
  rel="stylesheet">
36
  <style>
37
- /* --- 変数設定とリセット --- */
38
  :root {
39
  --primary-color: #0d1a2f;
40
  /* ディープネイビー/チャコールブルー */
@@ -188,20 +712,88 @@ template = """
188
  margin-right: 5px;
189
  }
190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  /* --- 総合評価スコア --- */
192
  .overall-score-block {
193
  margin-top: 35px;
194
  padding: 25px;
195
- background-color: var(--primary-color);
196
- /* 背景をディープネイビーに */
197
  border-radius: 10px;
198
- color: white;
199
- /* テキストを白に */
 
 
200
  }
201
 
202
  .overall-score-block h3 {
203
- color: var(--secondary-color);
204
- /* 見出しをルドに */
205
  margin-top: 0;
206
  border-bottom: 1px solid var(--secondary-color);
207
  padding-bottom: 10px;
@@ -217,7 +809,8 @@ template = """
217
  .score-item label {
218
  display: block;
219
  font-weight: 400;
220
- color: #c0c0c0;
 
221
  margin-bottom: 5px;
222
  }
223
 
@@ -236,7 +829,8 @@ template = """
236
  line-height: 45px;
237
  text-align: center;
238
  border-radius: 50%;
239
- color: var(--primary-color);
 
240
  /* フォントをネイビーに */
241
  background-color: var(--secondary-color);
242
  /* 背景をゴールドに */
@@ -343,7 +937,6 @@ template = """
343
  <h1>パフォーマンスレポート</h1>
344
  <p><strong>被評価者氏名:</strong> 被評価者氏名</p>
345
  </header>
346
-
347
  <section class="section-card basic-info">
348
  <h2>1. 基本情報</h2>
349
  <div class="info-grid">
@@ -365,10 +958,8 @@ template = """
365
  </div>
366
  </div>
367
  </section>
368
-
369
  <section class="section-card project-evaluation">
370
  <h2>2. プロジェクト別評価</h2>
371
-
372
  <div class="project-block">
373
  <h3>💼 XXXコスト削減プロジェクト</h3>
374
  <p class="project-subtitle">大手製造業のコスト構造改革</p>
@@ -407,7 +998,6 @@ template = """
407
  </div>
408
  </div>
409
  </div>
410
-
411
  <div class="project-block">
412
  <h3>🧪 XXX化学新規事業戦略策定プロジェクト</h3>
413
  <p class="project-subtitle">���規事業参入戦略</p>
@@ -446,9 +1036,16 @@ template = """
446
  </div>
447
  </section>
448
 
449
- <section class="section-card overall-evaluation">
450
- <h2>3. フムへの貢献と総合評価</h2>
 
 
 
 
 
451
 
 
 
452
  <div class="evaluation-detail">
453
  <h4 class="detail-title">ファームへの貢献</h4>
454
  <div class="self-eval comment-box">
@@ -460,7 +1057,6 @@ template = """
460
  <p><strong>評価者コメント:</strong> 新メンバーへの導入支援は模範的であり、早期戦力化に貢献。ナレッジ共有の取り組みも積極的で、ファームの知識資本への貢献度が高い。</p>
461
  </div>
462
  </div>
463
-
464
  <div class="evaluation-detail">
465
  <h4 class="detail-title">チームワーク・協調性</h4>
466
  <div class="self-eval comment-box">
@@ -470,7 +1066,6 @@ template = """
470
  <p><strong>評価者コメント:</strong> チーム内での人望が厚く、ポジティブな職場環境づくりに貢献している。</p>
471
  </div>
472
  </div>
473
-
474
  <div class="overall-score-block">
475
  <h3>総合評価(評価者による)</h3>
476
  <div class="score-grid">
@@ -488,30 +1083,25 @@ template = """
488
  </div>
489
  </div>
490
  </div>
491
-
492
  <div class="total-summary">
493
  <h3>総括(評価者記入欄)</h3>
494
  <div class="evaluator-comment comment-box large-comment">
495
  <p><span class="kudos">期間中の最も優れていた点(Kudos):</span></p>
496
  <p>田中さんは、期間を通じて極めて高い分析力と責任感を発揮し、特にコニカコスト削減プロジェクトでは目標を上回る成果に決定的に貢献しました。シミュレーションモデルの正確性と、期限厳守の姿勢は、ファームの信頼を高めています。次の職位(マネージャー)への昇進に必要な問題解決能力と専門知識は完全に満たしていると評価します。
497
  </p>
498
-
499
  <p><span class="focus-area">成長のための主要な改善点(Focus Area):</span></p>
500
  <p>次期は、単なるタスク遂行者から「プロジェクトのオーナー」へと意識をシフトする必要があります。特に、クライアントやチームに対して、明確な方向性を提示するファシリテーション力と、自らのタスクを適切に任せて成果を出す「委譲と育成」のリーダーシップを重点的に強化してください。
501
  </p>
502
  </div>
503
  </div>
504
  </section>
505
-
506
  <section class="section-card goals">
507
- <h2>4. 今後の目標とネクストステップ</h2>
508
-
509
  <div class="goal-item">
510
  <h4 class="detail-title">専門性向上</h4>
511
  <p><strong>目標設定:</strong> M&A後のPMI(Post Merger Integration)に関する専門知識とケーススタディを習得し、関連プロジェクトに参画する。</p>
512
  <p><strong>サポート・トレーニング計画:</strong> 外部M&A専門家によるトレーニングプログラム(全3回)への参加。プロジェクトB'のPMIフェーズへのアサインメント。</p>
513
  </div>
514
-
515
  <div class="goal-item">
516
  <h4 class="detail-title">キャリアゴール</h4>
517
  <p><strong>目標設定:</strong> 評価期間内にマネージャーへのプロモーションを目指す。そのために、チームメンバー2名に対し、デリバラブル作成に関するメンタリングを最低3ヶ月実施する。</p>
@@ -519,7 +1109,6 @@ template = """
519
  佐藤(評価者)による月次の1on1ミーティングを設定し、委譲と育成の進捗をレビューする。シニアマネージャーが主催するリーダーシップ・ワークショップへの招待。</p>
520
  </div>
521
  </section>
522
-
523
  <footer class="review-footer">
524
  <div class="signature">
525
  <p>被評価者 署名: <span class="signature-line"></span></p>
@@ -535,169 +1124,662 @@ template = """
535
  </body>
536
 
537
  </html>
538
- """
539
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
540
 
541
- # Define the generation settings
542
- config = types.GenerateContentConfig(
543
- tools=[grounding_tool]
544
- )
 
 
 
 
 
 
 
 
 
545
 
546
- def change_input(prompt):
547
- if len(prompt) > 0:
548
- return gr.update(visible=True)
 
549
  else:
550
- return gr.update(visible=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
551
 
552
 
553
- def create_zip_from_html(html_file_path, output_zip_path):
554
- """
555
- 指定されたHTMLファイルをZIPファイルに圧縮する関数。
556
 
557
- Args:
558
- html_file_path (str): 圧縮したいHTMLファイルのパス。
559
- output_zip_path (str): 作成するZIPファイルのパス(例: 'output.zip')。
560
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
561
 
562
- # HTMLファイルが存在するか確認
563
- if not os.path.exists(html_file_path):
564
- print(f"エラー: ファイル '{html_file_path}' が見つかりません。")
565
- return
566
 
567
- # 'w' (書き込み) モードでZIPファイルを開く
568
- try:
569
- with zipfile.ZipFile(output_zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
570
- # ZIPファイルにHTMLファイルを追加する
571
- # arcname=os.path.basename(html_file_path) で、
572
- # ZIPファイル内のファイル名を元のファイル名(パスを含まない)にする
573
- zipf.write(html_file_path, arcname=os.path.basename(html_file_path))
574
-
575
- return output_zip_path
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
576
 
577
- except Exception as e:
578
- return f"❌ エラーが発生しました: {e}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
579
 
 
 
 
 
 
 
580
 
581
- # --- Python function for the Gradio app ---
582
- def generate_response(prompt):
583
  """
584
- This function takes a user's prompt, calls the Gemini API
585
- with the performance evaluation tool, and returns the response text.
586
  """
587
  try:
588
- final_prompt = prompt + f'{eval_kijyun}に基づいて{prompt}に記載されているコンサルタントのパフォーマンスをプロジェクト毎に分けて評価ください。必ず、評価者の総合評価く記載してください。答えは{template}に合わせてHTML形式にしてください'
 
589
  response = client.models.generate_content(
590
  model="gemini-2.5-flash",
591
  contents=final_prompt,
592
- config=config,
593
  )
594
- #print(response.text)
595
- final_html = response.text
596
- final_html = final_html.replace("```html", "")
597
- final_html = final_html.replace("```", "")
598
-
599
- with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".html", encoding="utf-8") as tmp_file:
600
- # レポート内容をファイルに書き込む
601
- #pdfkit.from_string(final_html, tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".pdf", encoding="utf-8").name)
602
- tmp_file.write(final_html)
603
-
604
- # ファイルパスを取得
605
- file_path = tmp_file.name
606
- #return final_html,file_path
607
-
608
- zip_name = tmp_file.name.replace('.html','')
609
- output_zip = zip_name + '.zip'
610
- create_zip_from_html(file_path, output_zip)
611
 
612
- return final_html,output_zip
613
-
614
  except Exception as e:
615
  return f"An error occurred: {e}"
616
 
617
- # --- Gradio UI Block ---
618
- with gr.Blocks(title="Gemini API with Performance Review") as gsearch:
619
- gr.HTML('<div id="header"><span>🔖 パフォーマンス評価</span><img id="logo" src="https://www.ryhintl.com/images/ryhlogo/ryhlogo.png" width="64" height="64" alt="Logo"></div>')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
620
 
621
- with gr.Sidebar(open=False):
622
- gr.Textbox(label="御社の評価基準", value="""
623
- 1. イントロダクションと全体像の確認 (Introduction and Overview)
624
- 役割対象質問・論点目的評価者「この評価レポートの意図は、過去を裁くことではなく、今後の成長を最大化することです。
625
- まず、レポートの全体的な評価について、あなたの最初の感想を教えてください。」建設的な雰囲気を作り、自己評価と他者評価のギャップを認識させる。評価者「期間を通じて、あなたが設定していた最も重要な目標は何でしたか?その目標達成について、自己評価はどの程度ですか?」評価の焦点を合わせ、本人の認識を明確にする。
626
-
627
- 2. 業績評価に関する質問(成果の深掘り)(Performance and Achievement)役割対象質問・論点目的コンサルタント「期間中、あなたが**最も価値を提供できたと実感しているプロジェクト(または成果物)**はどれですか?具体的にクライアントにどのようなインパクトを与えましたか?」本人が誇る成果を確認し、具体的な事例を掘り下げる。評価者「『プロジェクト〇〇』での目標達成度は高いと評価しましたが、その成功の**最も大きな要因(KFS:Key Factor for Success)**は何だったと考えますか?」成功の再現性を高めるための要因分析を促す。評価者「逆に、目標を達成できなかった、あるいは難航したプロジェクトについて、主要なボトルネックは何でしたか?それはコントロール可能な要因とコントロール不能な要因のどちらでしたか?」失敗からの学びを引き出し、客観的な状況分析力を評価する。評価者「ファームへの貢献(ナレッジ共有、採用など)で特に注力した点はありますか?その活動を通じてチームにどのような変化をもたらしましたか?」チーム・組織へのコミットメントと影響力を評価する。
628
-
629
- 3. 能力評価に関する質問(スキルの具体化)(Competency and Skills)役割対象質問・論点目的評価者「能力評価において『問題解決・論理的思考力』を高く評価しましたが、これを最もよく示していた具体的な行動や発言を一つ教えてください。」評価者の判断根拠を共有し、評価の納得度を高める。コンサルタント「次期に向けて、コンサルタントとして最も強化が必要だと感じているスキルは何ですか?なぜそれが重要だと考えますか?」課題意識と成長意欲、そして自己認識の正確さを評価する。評価者「あなたの提案資料は非常に論理的でしたが、『伝達力』の項目で改善点があると評価したのは、どのような**場面(例:クライアントとの交渉、経営層へのプレゼン)**でのことですか?」定性的な評価について、具体的な場面(コンテキスト)を示してフィードバックする。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
630
 
631
- 4. 行動評価に関する質問(プロセスとプロフェッショナリズム)(Behavior and Professionalism)役割対象質問・論点目的評価者「『プロジェクトA』の緊迫した状況下で、あなたはチームに対してどのようなリーダーシップを発揮しましたか?具体的な行動を教え���ください。」プレッシャー下での行動やチームへの影響力を評価する。コンサルント「期間中の業務プロセスを振り返って、より良い結果を出すために一つだけ変えられるとしたら、どの時点のどの行動を変えますか?」振り返りから改善につなげる内省力と、行動の重要性を理解しているかを評価する。評価者「クライアントとのコミュニケーションにおいて、特に信頼関係を深めるために意識的に行っていたことは何ですか?結果としてどうなりましたか?」クライアントリレーション構築における意識的な努力と、その結果を評価する。5. 総括とネクストステップ(キャリア開発)(Summary and Next Steps)役割対象質問・論点目的評価者「総合的に見て、次の職位(例:マネージャー)へ昇進するために、現時点で最も不足していると判断するスキルや行動は何ですか? 具体的な基準に照らして説明します。」次の職位への期待値(卒業要件)を明確に伝え、ギャップを埋めるための目標設定につなげる。コンサルタント「この評価結果を踏まえ、次期の重点目標としてレポートに記載した内容(専門性向上やキャリアゴール)は、あなたのキャリアパスと合致していますか?」個人の目標とファームのニーズとの整合性を確認する。コンサルタント「目標達成のために、ファーム(評価者やチーム)にどのようなサポートやリソースを期待しますか?」育成計画に必要なリソースや環境整備について具体的に議論する。評価者「この評価レビューを通じて、他に懸念点や疑問点はありますか?私からのフィードバックに納得できない点があれば、ぜひ教えてください。」相互理解を深め、オープンな関係を維持したまま会議を終える。
632
- """)
633
-
634
- gr.Textbox(label="サンプル", value="""
635
- パフォーマンスレポート
636
 
637
- 被評価者氏名 竹中 太郎
638
- 職位/役職 シニアアソシエイト
639
- 評価期間: 2024年4月1日 〜 2025年3月31日
640
- 評価者: 池山隆
641
 
642
- 1. 業績評価の概要(総合評価:A)
643
- 田中氏は、期間中、極めて優れた業績を達成しました。特に「コストコ・コスト削減プロジェクト」では、契約目標であるコスト10%削減に対し、12%の削減プランを策定し、初年度実行目標を達成しました。この成功において、田中氏が主導したミュレーョンモデルは、迅速かつ正確であり、定量的目標を上回る結果に決定的に貢献したと評価されています(A+評価)。
 
 
644
 
645
- クライアント満足度も非常に高く、「非常に満足」の評価を得て後続案件受注に貢献しましたが、部門間の利害調整が難航した際、一歩踏み込んだファシリテーションの機会を逸した点が、今後の改善点として挙げられています。また、ファームへの貢献としては、新メンバー2名へのOJT実施や、社内勉強会での積極的なナレッジ共有が高く評価されています。
 
646
 
647
- 2. 能力評価の概要(総合評価:A+)
648
- 竹中氏の能力評価は「A+」であり、その核となる「問題解決・論理的思考力」は極めて高いと評価されています。
649
 
650
- 「エステ化学新規事業戦略策定プロジェクト」では、市場データから**「参入すべきではない理由」を検証するクリティカルな仮説**を提示し、戦略精度を向上させました。専門知識特にデータ分析ツールPython/Rの活用能力についてもファーム内トップクラスとされています。
 
651
 
652
- 一方で、なる成長のために、複雑分析結果経営層だけでく非専門現場スッフ)に対し、**シンプルな「メッセジ」や「必要性・メリッして伝える際の「大胆と示唆の鋭さ」**を磨くことが求められています。
653
 
654
- 3. 行動評価概要総合評価:A
655
- リーダーシップと責任感においても、田中氏は高い評価を得ています。「信越化学新規事業戦略策策定プロジェクト」の終盤でチームの士気が低下した際、自発的なミーティングを企画してタスクを再分配し、チームを再結集させたことは、その影響力を示す具体的な事例です。
656
 
657
- また、担当タスクの納期遅延やミスの発生はゼロであり、極めて高い実力と責任感を証明しています。
 
658
 
659
- 主要な改善点として自身のタスク遂行能力高さゆえに、チームメンバーへ「委譲(せる)」スキルが不足している点が指摘されした。次期は、仕事を適切に分散させ、チーム全体の生産性を向上させるためのリーダーシップの強化が必要です。
660
 
661
- 4. 総括次期への
662
- 期間中の最も優れていた点(Kudos)
663
- 田中氏は、マネージャーへの昇進に必要な問題解決能力と専門知識を完全に満たしていると評価されています。高い分析力と責任感は、ファームの信頼構築に不可欠な要素です。
664
 
665
- 成長ための主要な改善(Focus Area)
666
- は、単なるタスク遂行者から**「プロジェクトオーナー」へと意識をシフトすること**が重要課題です。
 
667
 
668
- 具体的には、クライアントやチームに対して明確な方向性を提示するファシリテーション力と、自らのタスクを適切に任せて果を出す「委譲と育成」リーダーシップを重点的に強化する必があります。""")
 
669
 
670
- # Input component for the user's question
671
- user_input = gr.Textbox(
672
- label="パフォーマンス:",
673
- info="パフォーマンス評価を入力してください。",
674
- lines=10
675
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
676
 
677
- # Output component to display the model's response
678
- output_text = gr.HTML(
679
- label="パフォーマンス評価:",
680
- value='<div>結果</div>'
681
- )
682
 
683
- output_html = gr.File(
684
- label="パフォーマンス評価ファイル(ZIP)"
685
- )
686
- # Button to trigger the API call
687
- submit_button = gr.Button("生成", visible=False)
688
-
689
- user_input.change(fn=change_input, inputs=[user_input], outputs=[submit_button])
690
-
691
- # Connect the components: when the button is clicked,
692
- # the generate_response function is called with the user_input,
693
- # and the result is displayed in the output_text box.
694
- submit_button.click(
695
- fn=generate_response,
696
- inputs=user_input,
697
- outputs=[output_text, output_html]
698
- )
699
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
700
 
701
- # Launch the Gradio app
702
- if __name__ == "__main__":
703
- gsearch.launch(favicon_path="path.ico", theme=gr.themes.Soft(), css="""footer {visibility: hidden;} #header {display: flex; justify-content: space-between; align-items: center; font-size: 24px; font-weight: bold;} #logo {width: 50px; height: 50px;}""")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ import re
3
+ import hashlib
4
+ import mysql.connector as mydb
5
+ import time
6
+ import numpy as np
7
+ import matplotlib
8
+ import matplotlib.pyplot as plt
9
+ import japanize_matplotlib
10
+
11
  from google import genai
12
  from google.genai import types
13
  import os
14
  from dotenv import load_dotenv
15
  import tempfile
16
+ import os
17
+ import msal
18
+ import json
19
+ import logging
20
+ import logging.handlers
21
+ import requests
22
+
23
+ matplotlib.use('Agg') # 重要な設定
24
+
25
+ load_dotenv(verbose=True)
26
+
27
+ try:
28
+ with open("parameters.json") as f:
29
+ config = json.load(f)
30
+ except FileNotFoundError:
31
+ print("Error: parameters.json not found. Please create the file.")
32
+ config = {}
33
+
34
+ # msal.ConfidentialClientApplicationのインスタンス化
35
+ if config:
36
+ app = msal.ConfidentialClientApplication(
37
+ config["client_id"], authority=config["authority"],
38
+ client_credential=config["secret"],
39
+ )
40
+
41
+ client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
42
+
43
+ eval_kijyun = "評価会議のための質問事項(ディスカッションガイド)1. イントロダクションと全体像の確認対象質問・論点目的評価者「この評価レポートの意図は、過去を裁くことではなく、今後の成長を最大化することです。まず、レポートの全体的な評価について、あなたの最初の感想を教えてください。」建設的な雰囲気を作り、自己評価と他者評価のギャップを認識させる。評価者「期間を通じて、あなたが設定していた最も重要な目標は何でしたか?その目標達成について、自己評価はどの程度ですか?」評価の焦点を合わせ、本人の認識を明確にする。2. 業績評価に関する質問(成果の深掘り)対象質問・論点目的コンサルタント「期間中、あなたが最も価値を提供できたと実感しているプロジェクト(または成果物)はどれですか?具体的にクライアントにどのようなインパクトを与えましたか?」本人が誇る成果を確認し、具体的な事例を掘り下げる。評価者「『プロジェクト〇〇』での目標達成度は高いと評価しましたが、その成功の**最も大きな要因(KFS)**は何だったと考えますか?」成功の再現性を高めるための要因分析を促す。評価者「逆に、目標を達成できなかった、あるいは難航したプロジェクトについて、主要なボトルネックは何でしたか?それはコントロール可能な要因とコントロール不能な要因のどちらでしたか?」失敗からの学びを引き出し、客観的な状況分析力を評価する。評価者「ファームへの貢献(ナレッジ共有、採用など)で特に注力した点はありますか?その活動を通じてチームにどのような変化をもたらしましたか?」チーム・組織へのコミットメントと影響力を評価する。3. 能力評価に関する質問(スキルの具体化)対象質問・論点目的評価者「能力評価において『問題解決・論理的思考力』を高く評価しましたが、これを最もよく示していた具体的な行動や発言を一つ教えてください。」評価者の判断根拠を共有し、評価の納得度を高める。コンサルタント「次期に向けて、コンサルタントとして最も強化が必要だと感じているスキルは何ですか?なぜそれが重要だと考えますか?」課題意識と成長意欲、そして自己認識の正確さを評価する。評価者「あなたの提案資料は非常に論理的でしたが、**『伝達力』**の項目で改善点があると評価したのは、どのような場面(例:クライアントとの交渉、経営層へのプレゼン)でのことですか?」定性的な評価について、具体的な場面(コンテキスト)を示してフィードバックする。4. 行動評価に関する質問(プロセスとプロフェッショナリズム)対象質問・論点目的評価者「『プロジェクトA』の緊迫した状況下で、あなたはチームに対してどのようなリーダーシップを発揮しましたか?具体的な行動を教えてください。」プレッシャー下での行動やチームへの影響力を評価する。コンサルタント「期間中の業務プロセスを振り返って、より良い結果を出すために一つだけ変えられるとしたら、どの時点のどの行動を変えますか?」振り返りから改善につなげる内省力と、行動の重要性を理解しているかを評価する。評価者「クライアントとのコミュニケーションにおいて、特に信頼関係を深めるために意識的に行っていたことは何ですか?結果としてどうなりましたか?」クライア���トリレーション構築における意識的な努力と、その結果を評価する。5. 総括とネクストステップ(キャリア開発)対象質問・論点目的評価者「総合的に見て、次の職位(例:マネージャー)へ昇進するために、現時点で最も不足していると判断するスキルや行動は何ですか? 具体的な基準に照らして説明します。」次の職位への期待値(卒業要件)を明確に伝え、ギャップを埋めるための目標設定につなげる。コンサルタント「この評価結果を踏まえ、次期の重点目標としてレポートに記載した内容(専門性向上やキャリアゴール)は、あなたのキャリアパスと合致していますか?」個人の目標とファームのニーズとの整合性を確認する。コンサルタント「目標達成のために、ファーム(評価者やチーム)にどのようなサポートやリソースを期待しますか?」育成計画に必要なリソースや環境整備について具体的に議論する。評価者「この評価レビューを通じて、他に懸念点や疑問点はありますか?私からのフィードバックに納得できない点があれば、ぜひ教えてください。」相互理解を深め、オープンな関係を維持したまま会議を終える。"
44
+
45
+ grounding_tool = types.Tool(
46
+ google_search=types.GoogleSearch()
47
+ )
48
+
49
+ #configs = types.GenerateContentConfig(
50
+ # tools=[grounding_tool]
51
+ #)
52
+
53
+ template = """
54
+ <!DOCTYPE html>
55
+ <html lang="ja">
56
+ <head>
57
+ <meta charset="UTF-8">
58
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
59
+ <title>パフォーマンスレポート:名前</title>
60
+ <link
61
+ href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Roboto:wght@400;700&display=swap"
62
+ rel="stylesheet">
63
+ <style>
64
+ /* --- 変数設定とリセット --- */
65
+ :root {
66
+ --primary-color: #0d1a2f;
67
+ /* ディープネイビー/チャコールブルー */
68
+ --secondary-color: #c9b16e;
69
+ /* ゴールド/ブロンズ */
70
+ --bg-light: #f5f5f5;
71
+ --text-dark: #333;
72
+ --shadow-gorgeous: 0 15px 30px rgba(0, 0, 0, 0.15);
73
+ }
74
+ body {
75
+ font-family: 'Roboto', sans-serif;
76
+ line-height: 1.6;
77
+ background-color: var(--bg-light);
78
+ color: var(--text-dark);
79
+ padding: 30px;
80
+ }
81
+ /* --- コンテナとヘッダー --- */
82
+ .review-container {
83
+ max-width: 950px;
84
+ margin: 0 auto;
85
+ background-color: #fff;
86
+ padding: 50px;
87
+ border-radius: 10px;
88
+ box-shadow: var(--shadow-gorgeous);
89
+ }
90
+ .review-header {
91
+ text-align: center;
92
+ border-bottom: 4px double var(--secondary-color);
93
+ /* ゴージャスな二重線 */
94
+ padding-bottom: 15px;
95
+ margin-bottom: 40px;
96
+ }
97
+ .review-header h1 {
98
+ font-family: 'Playfair Display', serif;
99
+ /* ゴージャスなフォント */
100
+ color: var(--primary-color);
101
+ font-size: 3em;
102
+ font-weight: 700;
103
+ margin-bottom: 5px;
104
+ letter-spacing: 1px;
105
+ }
106
+ .review-header p {
107
+ color: #666;
108
+ font-size: 1.1em;
109
+ }
110
+ /* --- セクションカード --- */
111
+ .section-card {
112
+ background-color: #ffffff;
113
+ border: 1px solid #e0e0e0;
114
+ padding: 30px;
115
+ margin-bottom: 35px;
116
+ border-radius: 10px;
117
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
118
+ }
119
+ .section-card h2 {
120
+ font-family: 'Playfair Display', serif;
121
+ color: var(--primary-color);
122
+ padding-bottom: 10px;
123
+ margin-bottom: 25px;
124
+ font-size: 1.8em;
125
+ border-left: 8px solid var(--secondary-color);
126
+ /* ゴールドの太いアクセントライン */
127
+ padding-left: 18px;
128
+ font-weight: 700;
129
+ }
130
+ /* --- 基本情報グリッド --- */
131
+ .info-grid {
132
+ display: grid;
133
+ grid-template-columns: 1fr 1fr;
134
+ gap: 15px 40px;
135
+ }
136
+ .info-item label {
137
+ font-weight: bold;
138
+ color: var(--primary-color);
139
+ display: inline-block;
140
+ margin-right: 10px;
141
+ font-size: 1em;
142
+ text-transform: uppercase;
143
+ }
144
+ /* --- プロジェクトブロック --- */
145
+ .project-block {
146
+ margin-bottom: 40px;
147
+ padding: 20px;
148
+ border: 1px solid #eee;
149
+ border-left: 5px solid var(--secondary-color);
150
+ /* ゴールドの細いライン */
151
+ border-radius: 8px;
152
+ background-color: #fcfcfc;
153
+ }
154
+ .project-block h3 {
155
+ color: var(--primary-color);
156
+ font-size: 1.5em;
157
+ border-bottom: 1px solid #ddd;
158
+ padding-bottom: 5px;
159
+ margin-bottom: 10px;
160
+ }
161
+ .project-subtitle {
162
+ font-style: italic;
163
+ color: #888;
164
+ margin-bottom: 15px;
165
+ font-size: 0.9em;
166
+ }
167
+ /* --- 評価詳細とコメントボックス --- */
168
+ .evaluation-detail {
169
+ margin-bottom: 25px;
170
+ }
171
+ .detail-title {
172
+ color: var(--primary-color);
173
+ font-size: 1.15em;
174
+ margin-top: 15px;
175
+ margin-bottom: 8px;
176
+ font-weight: 700;
177
+ text-transform: capitalize;
178
+ }
179
+ .comment-box {
180
+ padding: 15px;
181
+ border-radius: 4px;
182
+ margin-top: 8px;
183
+ line-height: 1.5;
184
+ }
185
+ .self-eval {
186
+ background-color: #f7f9fd;
187
+ /* 非常に薄い青 */
188
+ border-left: 5px solid var(--primary-color);
189
+ }
190
+ .evaluator-comment {
191
+ background-color: #fffdf5;
192
+ /* 非常に薄いゴールド */
193
+ border-left: 5px solid var(--secondary-color);
194
+ }
195
+ .comment-box p strong {
196
+ color: var(--primary-color);
197
+ margin-right: 5px;
198
+ }
199
+ /* --- 総合評価スコア --- */
200
+ .overall-score-block {
201
+ margin-top: 35px;
202
+ padding: 25px;
203
+ /*background-color: var(--primary-color);*/
204
+ background-color: #fffdf5;
205
+ /* 背景をディープネイビーに */
206
+ border-radius: 10px;
207
+ color: white;
208
+ /* テキストを白に */
209
+ }
210
+ .overall-score-block h3 {
211
+ color: var(--secondary-color);
212
+ /* 見出しをゴールドに */
213
+ margin-top: 0;
214
+ border-bottom: 1px solid var(--secondary-color);
215
+ padding-bottom: 10px;
216
+ margin-bottom: 20px;
217
+ }
218
+ .score-grid {
219
+ display: flex;
220
+ justify-content: space-around;
221
+ text-align: center;
222
+ }
223
+ .score-item label {
224
+ display: block;
225
+ font-weight: 400;
226
+ color: #c0c0c0;
227
+ margin-bottom: 5px;
228
+ }
229
+ /* --- 評価バッジ (ゴージャス版) --- */
230
+ .rating-badge {
231
+ font-weight: 700;
232
+ padding: 4px 10px;
233
+ border-radius: 4px;
234
+ display: inline-block;
235
+ }
236
+ .score-badge {
237
+ display: inline-block;
238
+ width: 45px;
239
+ height: 45px;
240
+ line-height: 45px;
241
+ text-align: center;
242
+ border-radius: 50%;
243
+ color: var(--primary-color);
244
+ /* フォントをネイビーに */
245
+ background-color: var(--secondary-color);
246
+ /* 背景をゴールドに */
247
+ font-weight: 700;
248
+ font-size: 1.2em;
249
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
250
+ /* 影で立体感 */
251
+ }
252
+ .badge-a-plus {
253
+ background-color: #4CAF50;
254
+ /* A+はエメラルドグリーン */
255
+ color: white;
256
+ }
257
+ .badge-a {
258
+ background-color: var(--secondary-color);
259
+ color: var(--primary-color);
260
+ }
261
+ /* --- 総括コメント --- */
262
+ .total-summary {
263
+ margin-top: 25px;
264
+ }
265
+ .large-comment {
266
+ padding: 25px;
267
+ border: 2px dashed var(--secondary-color);
268
+ background-color: #fff;
269
+ }
270
+ .kudos {
271
+ color: #4CAF50;
272
+ /* 成功は緑 */
273
+ font-weight: 700;
274
+ display: block;
275
+ margin-top: 5px;
276
+ font-size: 1.15em;
277
+ }
278
+ .focus-area {
279
+ color: var(--secondary-color);
280
+ /* 成長領域はゴールド */
281
+ font-weight: 700;
282
+ display: block;
283
+ margin-top: 15px;
284
+ font-size: 1.15em;
285
+ }
286
+ /* --- 目標設定 --- */
287
+ .goal-item {
288
+ margin-bottom: 25px;
289
+ padding-bottom: 15px;
290
+ border-left: 3px solid #eee;
291
+ padding-left: 15px;
292
+ }
293
+ .goal-item p strong {
294
+ color: var(--primary-color);
295
+ }
296
+ /* --- フッターと署名 --- */
297
+ .review-footer {
298
+ display: flex;
299
+ justify-content: space-between;
300
+ align-items: flex-end;
301
+ margin-top: 50px;
302
+ padding-top: 30px;
303
+ border-top: 2px solid var(--primary-color);
304
+ /* 濃い線 */
305
+ }
306
+ .signature {
307
+ width: 30%;
308
+ }
309
+ .date {
310
+ width: 30%;
311
+ text-align: right;
312
+ }
313
+ .signature p,
314
+ .date p {
315
+ margin-bottom: 10px;
316
+ font-style: italic;
317
+ color: var(--primary-color);
318
+ font-weight: bold;
319
+ }
320
+ .signature-line {
321
+ display: block;
322
+ width: 100%;
323
+ border-bottom: 2px dotted var(--secondary-color);
324
+ /* 署名欄はゴールドの点線 */
325
+ margin-top: 8px;
326
+ height: 1px;
327
+ }
328
+ </style>
329
+ </head>
330
+ <body>
331
+ <div class="review-container">
332
+ <header class="review-header">
333
+ <h1>パフォーマンスレポート</h1>
334
+ <p><strong>被評価者氏名:</strong> 被評価者氏名</p>
335
+ </header>
336
+ <section class="section-card basic-info">
337
+ <h2>1. 基本情報</h2>
338
+ <div class="info-grid">
339
+ <div class="info-item">
340
+ <label>職位/役職:</label>
341
+ <span>シニアアソシエイト</span>
342
+ </div>
343
+ <div class="info-item">
344
+ <label>評価期間:</label>
345
+ <span>xxxx年4月1日 〜 xxxx年3月31日</span>
346
+ </div>
347
+ <div class="info-item">
348
+ <label>評価者氏名:</label>
349
+ <span>評価者名前</span>
350
+ </div>
351
+ <div class="info-item">
352
+ <label>評価日:</label>
353
+ <span>xxxx年xx月xx日</span>
354
+ </div>
355
+ </div>
356
+ </section>
357
+ <section class="section-card project-evaluation">
358
+ <h2>2. プロジェクト別評価</h2>
359
+ <div class="project-block">
360
+ <h3>💼 XXXコスト削減プロジェクト</h3>
361
+ <p class="project-subtitle">大手製造業のコスト構造改革</p>
362
+ <div class="evaluation-detail">
363
+ <h4 class="detail-title">主要プロジェクトの達成目標</h4>
364
+ <div class="self-eval comment-box">
365
+ <p><strong>自己評価:</strong> 契約目標(コスト10%削減)に対し、12%の削減プランを策定し、初年度実行目標(5%削減)を達成。データ収集と経営層向け報告書作成を主導。
366
+ </p>
367
+ </div>
368
+ <div class="evaluator-comment comment-box rating-a-plus">
369
+ <p><strong>評価者コメント:</strong> <span
370
+ class="rating-badge badge-a-plus">A+評価</span>。田中さんのシミュレーションモデルは迅速かつ正確で、定量的目標を上回る結果に大きく貢献した。
371
+ </p>
372
+ </div>
373
+ </div>
374
+ <div class="evaluation-detail">
375
+ <h4 class="detail-title">クライアント満足度</h4>
376
+ <div class="self-eval comment-box">
377
+ <p><strong>自己評価:</strong>
378
+ クライアント担当者(部長層)と密に連携し、複雑なデータ要件を円滑に調整。プロジェクト後のアンケートで「非常に満足」を獲得し、後続案件の受注に貢献した。</p>
379
+ </div>
380
+ <div class="evaluator-comment comment-box">
381
+ <p><strong>評価者コメント:</strong>
382
+ クライアントとの専門的なやり取りはスムーズ。ただし、部門間の利害調整が難航した際、一歩踏み込んだファシリテーションの機会を逸した点は、マネージャー昇進に向けての改善点となる。</p>
383
+ </div>
384
+ </div>
385
+ <div class="evaluation-detail">
386
+ <h4 class="detail-title">実行力・責任感</h4>
387
+ <div class="self-eval comment-box">
388
+ <p><strong>自己評価:</strong> 期間を通じて、担当タスクの納期遅延やミスの発生はゼロ。クライアントへの提出物については、常にレビュー期限より1日早く準備を完了させた。
389
+ </p>
390
+ </div>
391
+ <div class="evaluator-comment comment-box">
392
+ <p><strong>評価者コメント:</strong>
393
+ 計画的で極めて責任感が強い。自身のタスク管理については完璧。次期は、プロジェクト全体の進捗リスクを先読みし、評価者に報告する頻度を増やしてほしい。</p>
394
+ </div>
395
+ </div>
396
+ </div>
397
+ <div class="project-block">
398
+ <h3>🧪 XXX化学新規事業戦略策定プロジェクト</h3>
399
+ <p class="project-subtitle">新規事業参入戦略</p>
400
+ <div class="evaluation-detail">
401
+ <h4 class="detail-title">問題解決・論理的思考力</h4>
402
+ <div class="self-eval comment-box">
403
+ <p><strong>自己評価:</strong> 膨大な市場データから「参入すべきではない理由」を深く検証するクリティカルな仮説を提示し、戦略の精度を向上させた。</p>
404
+ </div>
405
+ <div class="evaluator-comment comment-box">
406
+ <p><strong>評価者コメント:</strong>
407
+ 分析能力と論理構造の構築力は極めて高い。今後は、複雑な事象をさらにシンプルな「メッセージ」に落とし込む際の、大胆さと示唆の鋭さを磨く必要がある。</p>
408
+ </div>
409
+ </div>
410
+ <div class="evaluation-detail">
411
+ <h4 class="detail-title">専門知識とスキル</h4>
412
+ <div class="self-eval comment-box">
413
+ <p><strong>自己評価:</strong> 製造業のコストマネジメントに関する最新の手法を自習し、信越化学新規事業戦略策定プロジェクトで即座に適用した。財務モデリングスキルも向上した。
414
+ </p>
415
+ </div>
416
+ <div class="evaluator-comment comment-box">
417
+ <p><strong>評価者コメント:</strong> 技術的な専門性は申し分ない。特にデータ分析ツール(Python/R)の活用能力は、ファーム内でもトップクラス。</p>
418
+ </div>
419
+ </div>
420
+ <div class="evaluation-detail">
421
+ <h4 class="detail-title">リーダーシップ・影響力</h4>
422
+ <div class="self-eval comment-box">
423
+ <p><strong>自己評価:</strong> プロジェクトの終盤でチームの士気が低下した際、自発的にチームミーティングを企画し、残りのタスクを再分配することで、チームを再結集させた。
424
+ </p>
425
+ </div>
426
+ <div class="evaluator-comment comment-box">
427
+ <p><strong>評価者コメント:</strong>
428
+ 個人的なタスク遂行能力の高さから、ときにチームメンバーのフォローを待たずに単独で進めてしまう傾向が見られた。今後は、仕事を「任せる(委譲する)」スキルを意識的に磨き、チーム全体の生産性を向上させてほしい。
429
+ </p>
430
+ </div>
431
+ </div>
432
+ </div>
433
+ </section>
434
+ <section class="section-card overall-evaluation">
435
+ <h2>3. ファームへの貢献と総合評価</h2>
436
+ <div class="evaluation-detail">
437
+ <h4 class="detail-title">ファームへの貢献</h4>
438
+ <div class="self-eval comment-box">
439
+ <p><strong>自己評価:</strong>
440
+ 期間中に新たに参画したメンバー(2名)に対し、社内ナレッジベースの使い方、主要な分析ツールの操作方法についてOJTを実施。社内勉強会で「製造業のサプライチェーン改革」に関する発表を行った。
441
+ </p>
442
+ </div>
443
+ <div class="evaluator-comment comment-box">
444
+ <p><strong>評価者コメント:</strong> 新メンバーへの導入支援は模範的であり、早期戦力化に貢献。ナレッジ共有の取り組みも積極的で、ファームの知識資本への貢献度が高い。</p>
445
+ </div>
446
+ </div>
447
+ <div class="evaluation-detail">
448
+ <h4 class="detail-title">チームワーク・協調性</h4>
449
+ <div class="self-eval comment-box">
450
+ <p><strong>自己評価:</strong> 新任のアソシエイトからの質問に常に快く答え、タスクが遅延しそうなメンバーに対しては、期日前に声をかけてサポートを提供した。</p>
451
+ </div>
452
+ <div class="evaluator-comment comment-box">
453
+ <p><strong>評価者コメント:</strong> チーム内での人望が厚く、ポジティブな職場環境づくりに貢献している。</p>
454
+ </div>
455
+ </div>
456
+ <div class="overall-score-block">
457
+ <h3>総合評価(評価者による)</h3>
458
+ <div class="score-grid">
459
+ <div class="score-item">
460
+ <label>業績:</label>
461
+ <span class="score-badge badge-a">A</span>
462
+ </div>
463
+ <div class="score-item">
464
+ <label>能力:</label>
465
+ <span class="score-badge badge-a-plus">A+</span>
466
+ </div>
467
+ <div class="score-item">
468
+ <label>行動:</label>
469
+ <span class="score-badge badge-a">A</span>
470
+ </div>
471
+ </div>
472
+ </div>
473
+ <div class="total-summary">
474
+ <h3>総括(評価者記入欄)</h3>
475
+ <div class="evaluator-comment comment-box large-comment">
476
+ <p><span class="kudos">期間中の最も優れていた点(Kudos):</span></p>
477
+ <p>田中さんは、期間を通じて極めて高い分析力と責任感を発揮し、特にコニカコスト削減プロジェクトでは目標を上回る成果に決定的に貢献しました。シミュレーションモデルの正確性と、期限厳守の姿勢は、ファームの信頼を高めています。次の職位(マネージャー)への昇進に必要な問題解決能力と専門知識は完全に満たしていると評価します。
478
+ </p>
479
+ <p><span class="focus-area">成長のための主要な改善点(Focus Area):</span></p>
480
+ <p>次期は、単なるタスク遂行者から「プロジェクトのオーナー」へと意識をシフトする必要があります。特に、クライアントやチームに対して、明確な方向性を提示するファシリテーション力と、自らのタスクを適切に任せて成果を出す「委譲と育成」のリーダーシップを重点的に強化してください。
481
+ </p>
482
+ </div>
483
+ </div>
484
+ </section>
485
+ <section class="section-card goals">
486
+ <h2>4. 今後の目標とネクストステップ</h2>
487
+ <div class="goal-item">
488
+ <h4 class="detail-title">専門性向上</h4>
489
+ <p><strong>目標設定:</strong> M&A後のPMI(Post Merger Integration)に関する専門知識とケーススタディを習得し、関連プロジェクトに参画する。</p>
490
+ <p><strong>サポート・トレーニング計画:</strong> 外部M&A専門家によるトレーニングプログラム(全3回)への参加。プロジェクトB'のPMIフェーズへのアサインメント。</p>
491
+ </div>
492
+ <div class="goal-item">
493
+ <h4 class="detail-title">キャリアゴール</h4>
494
+ <p><strong>目標設定:</strong> 評価期間内にマネージャーへのプロモーションを目指す。そのために、チームメンバー2名に対し、デリバラブル作成に関するメンタリングを最低3ヶ月実施する。</p>
495
+ <p><strong>サポート・トレーニング計画:</strong>
496
+ 佐藤(評価者)による月次の1on1ミーティングを設定し、委譲と育成の進捗をレビューする。シニアマネージャーが主催するリーダーシップ・ワークショップへの招待。</p>
497
+ </div>
498
+ </section>
499
+ <footer class="review-footer">
500
+ <div class="signature">
501
+ <p>被評価者 署名: <span class="signature-line"></span></p>
502
+ </div>
503
+ <div class="signature">
504
+ <p>評価者 署名: <span class="signature-line"></span></p>
505
+ </div>
506
+ <div class="date">
507
+ <p>日付: <span class="signature-line"></span></p>
508
+ </div>
509
+ </footer>
510
+ </div>
511
+ </body>
512
+ </html>
513
+ """
514
 
 
 
515
 
516
+ class DoSwitch:
517
+ def __init__(self):
518
+ # 状態(state)をインスタンス変数として保持
519
+ self.is_logged = False
520
+ self.first_exec = False
521
+ self.lastlog = ""
522
 
523
+ def log_on(self):
524
+ self.is_logged = True
 
 
525
 
526
+ def log_oout(self):
527
+ self.log_on = False
528
 
529
+ def first_executed(self):
530
+ self.first_exec = True
531
 
532
+ my_switch = DoSwitch()
533
+
534
+ def change_input(prompt):
535
+ if len(prompt) > 0:
536
+ return gr.update(visible=True)
537
+ else:
538
+ return gr.update(visible=False)
539
+
540
+
541
+ def generate_review(prompt, scores, userid):
542
+ #global chart_path
543
+ chart_path = generate_chart(scores, userid)
544
+ #print("chart_path",chart_path)
545
+ print("chart_path",chart_path)
546
+ current_chart_path = chart_path
547
+
548
+ global template
549
+ template = '''
550
  <!DOCTYPE html>
551
  <html lang="ja">
552
 
553
  <head>
554
  <meta charset="UTF-8">
555
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
556
+ <title>パフォーマンスレポート:名前 (静的版)</title>
557
  <link
558
  href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Roboto:wght@400;700&display=swap"
559
  rel="stylesheet">
560
  <style>
561
+
562
  :root {
563
  --primary-color: #0d1a2f;
564
  /* ディープネイビー/チャコールブルー */
 
712
  margin-right: 5px;
713
  }
714
 
715
+ /* --- チャートコンテナ --- */
716
+ /* 注: JavaScriptを削除したため、ここには静的な表とプレースホルダーを表示します */
717
+ /*.chart-container {
718
+ max-width: 90%;
719
+ margin: 30px auto;
720
+ padding: 20px;
721
+ background-color: #ffffff;
722
+ border: 1px solid #e0e0e0;
723
+ border-radius: 10px;
724
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
725
+ }*/
726
+
727
+ .chart-container {
728
+ /* Flexboxを有効化 */
729
+ display: flex;
730
+ /* 子要素(画像)を水平方向の中央に配置 */
731
+ justify-content: center;
732
+ /* 垂直方向も中央に配置したい場合は以下も追加 */
733
+ /* align-items: center; */
734
+
735
+ /* 適切な幅を設定(必要に応じて) */
736
+ width: 100%;
737
+ /* 動作確認用に枠線をつけても良い */
738
+ /* border: 1px solid red; */
739
+ }
740
+
741
+ .chart-placeholder {
742
+ min-height: 350px;
743
+ background-color: #eee;
744
+ border: 2px dashed var(--secondary-color);
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: center;
748
+ color: #999;
749
+ font-size: 1.2em;
750
+ margin-bottom: 20px;
751
+ border-radius: 8px;
752
+ }
753
+
754
+ .score-table {
755
+ width: 100%;
756
+ border-collapse: collapse;
757
+ margin-top: 15px;
758
+ }
759
+
760
+ .score-table th,
761
+ .score-table td {
762
+ border: 1px solid #ddd;
763
+ padding: 12px;
764
+ text-align: left;
765
+ }
766
+
767
+ .score-table th {
768
+ background-color: var(--primary-color);
769
+ color: white;
770
+ font-weight: 700;
771
+ }
772
+
773
+ .score-table td:nth-child(2) {
774
+ text-align: center;
775
+ font-weight: 700;
776
+ color: var(--secondary-color);
777
+ font-size: 1.1em;
778
+ background-color: #fffdf5;
779
+ }
780
+
781
  /* --- 総合評価スコア --- */
782
  .overall-score-block {
783
  margin-top: 35px;
784
  padding: 25px;
785
+ background-color: #fffdf5;
786
+ /* 薄いゴールド背景を維持 */
787
  border-radius: 10px;
788
+ border: 1px solid var(--secondary-color);
789
+ /* ゴールドの枠線 */
790
+ color: var(--primary-color);
791
+ /* テキストカラーを濃い色に */
792
  }
793
 
794
  .overall-score-block h3 {
795
+ color: var(--primary-color);
796
+ /* 見出しをネイビーに */
797
  margin-top: 0;
798
  border-bottom: 1px solid var(--secondary-color);
799
  padding-bottom: 10px;
 
809
  .score-item label {
810
  display: block;
811
  font-weight: 400;
812
+ color: #666;
813
+ /* テキスト色を調整 */
814
  margin-bottom: 5px;
815
  }
816
 
 
829
  line-height: 45px;
830
  text-align: center;
831
  border-radius: 50%;
832
+ /*color: var(--primary-color);*/
833
+ color: white;
834
  /* フォントをネイビーに */
835
  background-color: var(--secondary-color);
836
  /* 背景をゴールドに */
 
937
  <h1>パフォーマンスレポート</h1>
938
  <p><strong>被評価者氏名:</strong> 被評価者氏名</p>
939
  </header>
 
940
  <section class="section-card basic-info">
941
  <h2>1. 基本情報</h2>
942
  <div class="info-grid">
 
958
  </div>
959
  </div>
960
  </section>
 
961
  <section class="section-card project-evaluation">
962
  <h2>2. プロジェクト別評価</h2>
 
963
  <div class="project-block">
964
  <h3>💼 XXXコスト削減プロジェクト</h3>
965
  <p class="project-subtitle">大手製造業のコスト構造改革</p>
 
998
  </div>
999
  </div>
1000
  </div>
 
1001
  <div class="project-block">
1002
  <h3>🧪 XXX化学新規事業戦略策定プロジェクト</h3>
1003
  <p class="project-subtitle">���規事業参入戦略</p>
 
1036
  </div>
1037
  </section>
1038
 
1039
+ <section class="section-card performance-summary">
1040
+ <h2>3. マンスKPIサマリー</h2>
1041
+ <p style="text-align: center; color: #666; margin-bottom: 20px;">評価者による6つの主要スキル項目の10段階評価</p>
1042
+ <div class="chart-container">
1043
+ <img src="'''+current_chart_path+'''" alt="レーダーチャート" width="500" height="500" />
1044
+ </div>
1045
+ </section>
1046
 
1047
+ <section class="section-card overall-evaluation">
1048
+ <h2>4. ファームへの貢献と総合評価</h2>
1049
  <div class="evaluation-detail">
1050
  <h4 class="detail-title">ファームへの貢献</h4>
1051
  <div class="self-eval comment-box">
 
1057
  <p><strong>評価者コメント:</strong> 新メンバーへの導入支援は模範的であり、早期戦力化に貢献。ナレッジ共有の取り組みも積極的で、ファームの知識資本への貢献度が高い。</p>
1058
  </div>
1059
  </div>
 
1060
  <div class="evaluation-detail">
1061
  <h4 class="detail-title">チームワーク・協調性</h4>
1062
  <div class="self-eval comment-box">
 
1066
  <p><strong>評価者コメント:</strong> チーム内での人望が厚く、ポジティブな職場環境づくりに貢献している。</p>
1067
  </div>
1068
  </div>
 
1069
  <div class="overall-score-block">
1070
  <h3>総合評価(評価者による)</h3>
1071
  <div class="score-grid">
 
1083
  </div>
1084
  </div>
1085
  </div>
 
1086
  <div class="total-summary">
1087
  <h3>総括(評価者記入欄)</h3>
1088
  <div class="evaluator-comment comment-box large-comment">
1089
  <p><span class="kudos">期間中の最も優れていた点(Kudos):</span></p>
1090
  <p>田中さんは、期間を通じて極めて高い分析力と責任感を発揮し、特にコニカコスト削減プロジェクトでは目標を上回る成果に決定的に貢献しました。シミュレーションモデルの正確性と、期限厳守の姿勢は、ファームの信頼を高めています。次の職位(マネージャー)への昇進に必要な問題解決能力と専門知識は完全に満たしていると評価します。
1091
  </p>
 
1092
  <p><span class="focus-area">成長のための主要な改善点(Focus Area):</span></p>
1093
  <p>次期は、単なるタスク遂行者から「プロジェクトのオーナー」へと意識をシフトする必要があります。特に、クライアントやチームに対して、明確な方向性を提示するファシリテーション力と、自らのタスクを適切に任せて成果を出す「委譲と育成」のリーダーシップを重点的に強化してください。
1094
  </p>
1095
  </div>
1096
  </div>
1097
  </section>
 
1098
  <section class="section-card goals">
1099
+ <h2>5. 今後の目標とネクストステップ</h2>
 
1100
  <div class="goal-item">
1101
  <h4 class="detail-title">専門性向上</h4>
1102
  <p><strong>目標設定:</strong> M&A後のPMI(Post Merger Integration)に関する専門知識とケーススタディを習得し、関連プロジェクトに参画する。</p>
1103
  <p><strong>サポート・トレーニング計画:</strong> 外部M&A専門家によるトレーニングプログラム(全3回)への参加。プロジェクトB'のPMIフェーズへのアサインメント。</p>
1104
  </div>
 
1105
  <div class="goal-item">
1106
  <h4 class="detail-title">キャリアゴール</h4>
1107
  <p><strong>目標設定:</strong> 評価期間内にマネージャーへのプロモーションを目指す。そのために、チームメンバー2名に対し、デリバラブル作成に関するメンタリングを最低3ヶ月実施する。</p>
 
1109
  佐藤(評価者)による月次の1on1ミーティングを設定し、委譲と育成の進捗をレビューする。シニアマネージャーが主催するリーダーシップ・ワークショップへの招待。</p>
1110
  </div>
1111
  </section>
 
1112
  <footer class="review-footer">
1113
  <div class="signature">
1114
  <p>被評価者 署名: <span class="signature-line"></span></p>
 
1124
  </body>
1125
 
1126
  </html>
1127
+ '''
1128
 
1129
+ try:
1130
+ final_prompt = prompt + f'{eval_kijyun}に基づいて{prompt}に記載されているコンサルタントのパフォーマンスをプロジェクト毎に分けて評価してください。必ず、評価者の総合評価を詳しく記載してください。答えは{template}に合わせてHTML形式にしてください'
1131
+ response = client.models.generate_content(
1132
+ model="gemini-2.5-flash",
1133
+ contents=final_prompt,
1134
+ #config=config,
1135
+ )
1136
+ #print(response.text)
1137
+ final_html = response.text
1138
+ #final_html = final_html.replace("```html", "")
1139
+ #final_html = final_html.replace("```", "")
1140
+ fin1 = final_html.find('```html')
1141
+ fin2 = final_html.rfind('```')
1142
+ final_html = final_html[fin1+7:fin2-3]
1143
+ #print("final_html:",final_html)
1144
 
1145
+ with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".html", encoding="utf-8") as tmp_file:
1146
+ # レポート内容をファイルに書き込む
1147
+ #pdfkit.from_string(final_html, tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".pdf", encoding="utf-8").name)
1148
+ tmp_file.write(final_html)
1149
+
1150
+ # ファイルパスを取得
1151
+ file_path = tmp_file.name
1152
+ weburl = put_file_to_graph_api(f"https://graph.microsoft.com/v1.0/sites/richardhuh.sharepoint.com,049de070-ff59-4a3e-b236-909dd06d18dc,928892cd-d109-40fe-9c67-c6fb82eb3b8d/drives/b!cOCdBFn_PkqyNpCd0G0Y3M2SiJIJ0f5AnGfG-4LrO428BidG9UKZQ4RHLePvALXz/root:/Work/{tmp_file.name}:/content", file_path)
1153
+ #print("weburl:", weburl)
1154
+ return final_html, '<div style="text-align: center; width: 100%;"><a href="' + weburl + '" style="display: block; width: fit-content; margin: 0 auto;">ファイルを表示</a></div>'
1155
+ #return final_html,file_path
1156
+ except Exception as e:
1157
+ return f"An error occurred: {e}", None
1158
 
1159
+
1160
+ def update_prompt_suffix(prompt_suffix):
1161
+ if prompt_suffix == "投資判断用の要約":
1162
+ return temp_in
1163
  else:
1164
+ return ""
1165
+
1166
+
1167
+ def get_access_token() -> dict:
1168
+ """MSALを使用してアクセストークンを取得またはキャッシュから読み込む"""
1169
+ if not config:
1170
+ raise Exception("Configuration (parameters.json) is missing.")
1171
+ result = app.acquire_token_silent(config["scope"], account=None)
1172
+
1173
+ if not result:
1174
+ logging.info("No suitable token exists in cache. Let's get a new one from AAD.")
1175
+ result = app.acquire_token_for_client(scopes=config["scope"])
1176
+
1177
+ return result
1178
+
1179
+ def get_some_data_from_graph_api(endpoint: str) -> None:
1180
+ """Graph APIからデータを取得(今回は未使用だが残しておく)"""
1181
+ access_token = get_access_token()
1182
+ if "access_token" in access_token:
1183
+ graph_data = requests.get(
1184
+ endpoint,
1185
+ headers={'Authorization': 'Bearer ' + access_token['access_token']}, ).json()
1186
+ return graph_data
1187
+ else:
1188
+ raise Exception("===Failed to call MS Graph API. See stderr for details.===")
1189
+
1190
+ def put_file_to_graph_api(endpoint: str, file_path: str) -> dict:
1191
+ """Graph APIを使用してファイルをOneDrive/SharePointにアップロードする"""
1192
+ access_token = get_access_token()
1193
+
1194
+ if "access_token" in access_token:
1195
+ try:
1196
+ with open(file_path, 'rb') as f:
1197
+ graph_data = requests.put(
1198
+ endpoint,
1199
+ headers={'Authorization': 'Bearer ' + access_token['access_token']},
1200
+ data=f).json()
1201
+ print("graph_data:", graph_data.get('webUrl'))
1202
+ global fileurl
1203
+ # アップロードされたファイルのURLをグローバル変数に保存
1204
+ fileurl = graph_data.get('webUrl', 'URL not available')
1205
+ #print("fileurl:", fileurl)
1206
+ return fileurl
1207
+ #return graph_data
1208
+ except Exception as e:
1209
+ print(f"File upload error: {e}")
1210
+ raise Exception(f"===Failed to upload file to MS Graph API. Details: {e}===")
1211
+ else:
1212
+ raise Exception("===Failed to call MS Graph API. See stderr for details.===")
1213
 
1214
 
 
 
 
1215
 
1216
+ def open_signup_window():
 
 
1217
  """
1218
+ gr.HTMLコンポーネントを使って、HTMLのリンクをボタンのように表示します。
1219
+ """
1220
+ # HTMLのaタグを生成し、target="_blank"で新しいタブを開くように指定します。
1221
+ # このリンクをCSSでボタンのようにスタイルします。
1222
+ # この文字列全体がHTMLとしてGradioにレンダリングされます。
1223
+ html_content = """
1224
+ <div style="text-align: center; padding: 20px;">
1225
+ <a href="https://accounts.google.com/v3/signin/identifier?authuser=0&continue=https://www.google.com/&ec=futura_exp_og_si_72776762_e&hl=ja&flowName=GlifWebSignIn&flowEntry=AddSession&dsh=S-1088503595%3A1757031827842666" target="_blank"
1226
+ style="
1227
+ display: inline-block;
1228
+ padding: 15px 30px;
1229
+ background-color: #4CAF50;
1230
+ color: white;
1231
+ text-decoration: none;
1232
+ font-weight: bold;
1233
+ border-radius: 10px;
1234
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
1235
+ transition: all 0.3s ease;
1236
+ "
1237
+ onmouseover="this.style.backgroundColor='#45a049';"
1238
+ onmouseout="this.style.backgroundColor='#4CAF50';"
1239
+ onclick="this.style.display='none';"
1240
+ >
1241
+ サインアップページを開く
1242
+ </a>
1243
+ </div>
1244
+ """
1245
+ return gr.HTML(html_content)
1246
+
1247
+ def clean_text(text):
1248
+ # 改行とタブを削除
1249
+ return text.replace('\n', '').replace('\t', '').replace(' ', '')
1250
+
1251
+
1252
+ def generate_chart(scores: str, userid: str):
1253
+ #global uid
1254
+ uid = userid
1255
+ print('chart-uid:',uid)
1256
+ #print("uid",uid)
1257
+ #scores = [int(score) for score in scores.split(",")]
1258
+ scores = eval(scores)
1259
+ labels = [
1260
+ '主要プロジェクトの達成目標',
1261
+ 'クライアント満足度',
1262
+ '実行力・責任感',
1263
+ '問題解決・論理的思考力',
1264
+ '専門知識とスキル',
1265
+ 'リーダーシップ・影響力'
1266
+ ]
1267
+
1268
+ # データの準備:レーダーチャートは閉じたプロットが必要なため、最初のデータをリストの最後に追加
1269
+ num_vars = len(labels)
1270
+ data = np.concatenate((scores, [scores[0]]))
1271
+ angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False)
1272
+ angles = np.concatenate((angles, [angles[0]]))
1273
+
1274
+ fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
1275
+
1276
+ # グラフのプロット
1277
+ ax.plot(angles, data, color='#c9b16e', linewidth=2, linestyle='solid', label='評価スコア')
1278
+ # 領域の塗りつぶし
1279
+ ax.fill(angles, data, color='#c9b16e', alpha=0.3)
1280
+
1281
+ # 軸ラベルの設定
1282
+ ax.set_xticks(angles[:-1])
1283
+ ax.set_xticklabels(labels, size=12, y=0.01) # ラベルの位置調整
1284
+
1285
+ # 目盛りの設定 (0から10まで)
1286
+ ax.set_yticks(np.arange(0, 11, 2))
1287
+ ax.set_ylim(0, 10) # 評価の最大値 (10点満点)
1288
+ ax.set_yticklabels([str(i) for i in np.arange(0, 11, 2)], color="grey", size=10)
1289
+
1290
+ # タイトル
1291
+ ax.set_title('パフォーマンス KPI サマリー', size=16, color='#0d1a2f', y=1.1)
1292
+
1293
+ # グリッド線のスタイル調整
1294
+ ax.grid(True, linestyle='--', alpha=0.7)
1295
+
1296
+ # 凡例を表示
1297
+ ax.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))
1298
+
1299
+ plt.savefig(f'/Library/WebServer/Documents/charts/{uid}.png', dpi=300)
1300
+ plt.savefig(f'./{uid}.png', dpi=300)
1301
+
1302
+ #return '/Library/WebServer/Documents/charts/{uid}.png'
1303
+ return f'http://localhost/charts/{uid}.png'
1304
+
1305
+
1306
+ def validate_username(username):
1307
+ if len(username) < 4:
1308
+ return "ユーザー名は4文字以上である必要があります"
1309
+ if not re.match("^[a-zA-Z0-9_]+$", username):
1310
+ return "ユーザー名には文字、数字、アンダースコアのみ使用できます"
1311
+ return None
1312
+
1313
+ def validate_email(email):
1314
+ if not re.match(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", email):
1315
+ return "有効なメールアドレスを入力してください"
1316
+ return None
1317
+
1318
+ def validate_password(password):
1319
+ if len(password) < 8:
1320
+ return "パスワードは8文字以上でなければなりません"
1321
+ if not any(char.isdigit() for char in password):
1322
+ return "パスワードには少なくとも1つの数字を含める必要があります"
1323
+ if not any(char.isupper() for char in password):
1324
+ return "パスワードには少なくとも1つの大文字を含める必要があります"
1325
+ return None
1326
+
1327
+ def validate_phone(phone):
1328
+ if phone and not re.match(r"^\+?[0-9\s\-]+$", phone):
1329
+ return "有効な電話番号を入力してください"
1330
+ return None
1331
+
1332
+ def hash_password(password):
1333
+ return hashlib.sha256(password.encode()).hexdigest()
1334
+
1335
+
1336
+ def login_user(username, password):
1337
+ conn = mydb.connect(
1338
+ host='www.ryhintl.com',
1339
+ port='36000',
1340
+ user='smairuser',
1341
+ password='smairuser',
1342
+ database='smair'
1343
+ )
1344
+ c = conn.cursor()
1345
+ hashed_pw = hash_password(password)
1346
+ sqlcmd = "SELECT * FROM gyoseki_users WHERE username = '"+username+"' AND password = '"+hashed_pw+"'"
1347
+ c.execute(sqlcmd)
1348
 
1349
+ user = c.fetchone()
1350
+ conn.close()
 
 
1351
 
1352
+ if user:
1353
+ return True, user
1354
+ return False, "ユーザー名またはパスワードが無効です"
1355
+
1356
+
1357
+ def process_logout():
1358
+ time.sleep(1)
1359
+ return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False)
1360
+
1361
+ # Login Logic
1362
+ def process_login(username, password, current_user_info_state):
1363
+ username_error = validate_username(username)
1364
+ password_error = validate_password(password)
1365
+
1366
+ if username_error:
1367
+ return gr.update(value=f"<p class='error-message'>{username_error}</p>"), False, None, None, gr.update(visible=True), gr.update(visible=False)
1368
+ elif password_error:
1369
+ return gr.update(value=f"<p class='error-message'>{password_error}</p>"), False, None, None, gr.update(visible=True), gr.update(visible=False)
1370
+ else:
1371
+ success, result = login_user(username, password)
1372
+ if success:
1373
+ user_info = {
1374
+ "id": result[0],
1375
+ "username": result[1],
1376
+ "email": result[2],
1377
+ "phone": result[4],
1378
+ "basic_format": result[5]
1379
+ }
1380
+
1381
+ uid = result[5]
1382
 
1383
+ conn = mydb.connect(
1384
+ host='www.ryhintl.com',
1385
+ port='36000',
1386
+ user='smairuser',
1387
+ password='smairuser',
1388
+ database='smair'
1389
+ )
1390
+ c = conn.cursor()
1391
+
1392
+ sqlcmd = "SELECT contents FROM gyoseki_basic_format WHERE id = "+str(uid)
1393
+ c.execute(sqlcmd)
1394
+
1395
+ content = c.fetchone()
1396
+ global basic_format
1397
+ basic_format = content
1398
+ conn.close()
1399
 
1400
+ return gr.update(value="<p class='success-message'></p>"), True, username, user_info, gr.update(visible=False), gr.update(visible=True), gr.update(visible=True), gr.update(visible=False)
1401
+ #return gr.update(value="<p class='success-message'></p>"), True, username, user_info, gr.update(visible=False), gr.update(visible=True)
1402
+ else:
1403
+ #return gr.update(visible=False), gr.update(visible=True)
1404
+ return gr.update(value=f"<p class='error-message'>{result}</p>"), False, None, None, gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)
1405
+ #return gr.update(value=f"<p class='error-message'>{result}</p>"), False, None, None, gr.update(visible=True), gr.update(visible=False)
1406
 
1407
+
1408
+ def get_grounded_response(prompt1, prompt2, prompt3):
1409
  """
1410
+ Calls the Gemini API with the given prompt, applies grounding,
1411
+ and returns the response text with added citations.
1412
  """
1413
  try:
1414
+ final_prompt = f"{prompt1}{prompt2}と{prompt3}元に、プロジェクト毎に評価を含め最終評価レポート作成してください。"
1415
+ # Make the request to the Gemini model
1416
  response = client.models.generate_content(
1417
  model="gemini-2.5-flash",
1418
  contents=final_prompt,
1419
+ #config=config,
1420
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1421
 
1422
+ return response.text
 
1423
  except Exception as e:
1424
  return f"An error occurred: {e}"
1425
 
1426
+ def set_eval_kijyun(kijun):
1427
+ global eval_kijyun
1428
+ eval_kijyun = kijun
1429
+ return "基準が設定されました"
1430
+
1431
+ def prompt_change(prompt):
1432
+ if len(prompt) > 0:
1433
+ return gr.update(visible=True)
1434
+ else:
1435
+ return gr.update(visible=False)
1436
+
1437
+ def show_tab_1():
1438
+ return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False)
1439
+
1440
+ def show_tab_2():
1441
+ return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False)
1442
+
1443
+ def show_tab_3():
1444
+ return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)
1445
+
1446
+
1447
+ with gr.Blocks(title="パフォーマンス評価", theme=gr.themes.Soft(), css="""footer {visibility: hidden;} #header {display: flex; justify-content: space-between; align-items: center; font-size: 24px; font-weight: bold;} #logo {width: 50px; height: 50px;}
1448
+ .gradio-container {
1449
+ background-color: #f8f9fa;
1450
+ /*width: 100%;
1451
+ height: 100%;
1452
+ background-image: url('https://images.unsplash.com/photo-1527181152855-fc03fc7949c8?auto=format&w=1000&dpr=2');
1453
+ background-size: cover;
1454
+ background-repeat: no-repeat;
1455
+ background-position: center center;*/
1456
+ }
1457
+ .main {
1458
+ background-color: #f8f9fa;
1459
+ }
1460
+ .logo-container {
1461
+ position: absolute;
1462
+ top: 1px;
1463
+ left: 20px;
1464
+ z-index: 1000;
1465
+ }
1466
+ .logo-container img {
1467
+ height: 30px;
1468
+ width: auto;
1469
+ }
1470
+ .title {
1471
+ font-size: 1.5rem;
1472
+ font-weight: 700;
1473
+ color: #2c3e50;
1474
+ text-align: center;
1475
+ margin-bottom: 1.5rem;
1476
+ }
1477
+ .subtitle {
1478
+ font-size: 0.1rem;
1479
+ color: #7f8c8d;
1480
+ text-align: center;
1481
+ margin-bottom: 2rem;
1482
+ }
1483
+
1484
+ .rcard {
1485
+ background: #000055;
1486
+ border-radius: 15px;
1487
+ padding: 2rem;
1488
+ box-shadow: 0 10px 20px rgba(0,0,0,0.1);
1489
+ margin-bottom: 1rem;
1490
+ height: 650px;
1491
+ overflow: hidden;
1492
+ }
1493
+
1494
+ .card {
1495
+ background: white;
1496
+ border-radius: 15px;
1497
+ padding: 2rem;
1498
+ box-shadow: 0 10px 20px rgba(0,0,0,0.1);
1499
+ margin-bottom: 1rem;
1500
+ }
1501
+ .success-message {
1502
+ color: #27ae60;
1503
+ text-align: center;
1504
+ margin-top: 1rem;
1505
+ }
1506
+ .error-message {
1507
+ color: #e74c3c;
1508
+ text-align: center;
1509
+ margin-top: 1rem;
1510
+ }
1511
+ .footer {
1512
+ text-align: center;
1513
+ margin-top: 1rem;
1514
+ color: #95a5a6;
1515
+ font-size: 0.8rem;
1516
+ }
1517
+ .avatar {
1518
+ width: 50px;
1519
+ height: 50px;
1520
+ border-radius: 50%;
1521
+ margin: 0 auto 1rem auto;
1522
+ display: block;
1523
+ object-fit: cover;
1524
+ border: 3px solid #4a90e2;
1525
+ }
1526
 
1527
+ .avatar:hover {
1528
+ transform: scale(1.2);
1529
+ border: 3px solid #4a90e2;
1530
+ }
1531
+ .gr-button {
1532
+ width: 100%;
1533
+ border-radius: 10px;
1534
+ padding: 10px;
1535
+ background-color: #4a90e2;
1536
+ color: white;
1537
+ border: none;
1538
+ font-weight: 500;
1539
+ transition: all 0.3s;
1540
+ }
1541
+ .gr-button:hover {
1542
+ background-color: #357abd;
1543
+ color: lightyellow;
1544
+ transform: translateY(-2px);
1545
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
1546
+ }
1547
+ .gr-textinput, .gr-textbox {
1548
+ border-radius: 10px;
1549
+ padding: 10px;
1550
+ border: 1px solid #ced4da;
1551
+ }
1552
+ .my-custom-button {
1553
+ background-color: transparent !important; /* 緑色 */
1554
+ color: black !important;
1555
+ padding: 10px 20px !important;
1556
+ border: solid thin black !important;
1557
+ border-radius: 5px !important;
1558
+ cursor: pointer !important;
1559
+ font-size: 16px !important;
1560
+ width: 100%;
1561
+ transition: background-color 0.3s ease !important;
1562
+ }
1563
+
1564
+ .my-custom-button:hover {
1565
+ background-color: #fff5ee !important; /* ホバー時の色 */
1566
+ }
1567
+ """) as demo:
1568
+ gr.HTML('<div id="header"><span>🔖 パフォーマンス評価</span><img id="logo" src="https://www.ryhintl.com/images/ryhlogo/ryhlogo.png" width="64" height="64" alt="Logo"></div>')
1569
+
1570
+ # State variables
1571
+ current_username = gr.State(None)
1572
+ current_user_info = gr.State(None)
1573
+ logged_in_state = gr.State(False)
1574
+
1575
+ with gr.Sidebar(position="left", open=True):
1576
+ gr.Markdown("©️ Performance Review 2025")
1577
+ signin = gr.Button("サインイン", visible=True, elem_classes=["my-custom-button"], icon="https://img.icons8.com/fluency/48/azure-1.png")
1578
+ query = gr.Button("パフォーマンス評価", visible=False, elem_classes=["my-custom-button"], icon="https://img.icons8.com/fluency/48/orthogonal-view.png")
1579
+ smry = gr.Button("評価基準設定", visible=False, elem_classes=["my-custom-button"], icon="https://img.icons8.com/3d-fluency/48/domain.png")
1580
+
1581
+ #with gr.Tabs() as tabs:
1582
+ # Set the first tab to be visible by default
1583
+ with gr.Column("タブ1", visible=False, elem_classes="card") as b1:
1584
+ signup_btn = gr.Button("サインアップ", elem_classes=["my-custom-button"], icon="https://img.icons8.com/color/48/000000/google-logo.png")
1585
+ login_username = gr.Textbox(label="ユーザー名", placeholder="ユーザー名を入力してください", value="fmuser1")
1586
+ login_password = gr.Textbox(label="パスワード", type="password", placeholder="パスワードを入力してください", value="fmuser1@Mails")
1587
+ login_status = gr.Markdown("")
1588
+ login_btn = gr.Button("サインイン")
1589
+
1590
+ output_html = gr.HTML()
1591
+
1592
+ signup_btn.click(
1593
+ fn=open_signup_window,
1594
+ inputs=[],
1595
+ outputs=[output_html]
1596
+ )
1597
+
1598
+ login_btn.click(
1599
+ process_login,
1600
+ inputs=[login_username, login_password, current_user_info],
1601
+ outputs=[login_status, logged_in_state, current_username, current_user_info, signin, query, smry, b1]
1602
+ )
1603
 
1604
+ with gr.Column("ブ2", visible=False) as b2:
1605
+ with gr.TabItem("パフォーマンス評価"):
1606
+ logout_btn = gr.Button("ログアウト")
 
 
1607
 
1608
+ with gr.Row(visible=True) as filecomp:
1609
+ gr.Textbox(label="サンプル", show_copy_button=True, lines=10, value="""
1610
+ パフォーマンスレポート
 
1611
 
1612
+ 評価者氏名 田中 太郎
1613
+ 職位/役職 ニアアソエイト
1614
+ 評価期間: 2024年4月1日 〜 2025年3月31日
1615
+ 評価者名前 吉岡晴彦
1616
 
1617
+ 1. 業績評価の概要(総合評価:A)
1618
+ 田中氏は、期間中、極めて優れた業績を達成しました。特に「コニカコスト削減プロジェクト」では、契約目標であるコスト10%削減に対し、12%の削減プランを策定し、初年度実行目標を達成しました。この成功において、田中氏が主導したシミュレーションモデルは、迅速かつ正確であり、定量的目標を上回る結果に決定的に貢献したと評価されています(A+評価)。
1619
 
1620
+ クライアント満足度も非常に高く、「非常に満足」の評価を得て後続案件受注に貢献しましたが、部門間の利害調整が難航した際、一歩踏み込んだファシリテーションの機会を逸した点が、今後の改善点として挙げられています。また、ファームへの��献としては、新メンバー2名へのOJT実施や、社内勉強会での積極的なナレッジ共有が高く評価されています。
 
1621
 
1622
+ 2. 能力評価概要総合評価A+
1623
+ 田中氏の能力評価は「A+」であり、その核となる「問題解決・論理的思考力」は極めて高いと評価されています。
1624
 
1625
+ 「信越化学新規事業戦略策定プロジェクト」市場データか**「参入すべきではない理由」検証するクリティカル仮説**を提示し、戦略の精度を向上させました。専門知識特にデー分析ツール:Python/Rの活用能力)についてもファム内ップクラスとされています。
1626
 
1627
+ 一方で、さらなる成長ためには、複雑な分析結果を経営層だけでなく非専門家現場スタッフに対し、**シンプルな「メッセージ」や「必要性・メリット」として伝える際の「大胆さと示唆の鋭さ」**を磨くことが求められています。
 
1628
 
1629
+ 3. 動評価の概要(総合評価:A)
1630
+ リーダーシップと責任感においても、田中氏は高い評価を得ています。「信越化学新規事業戦略策策定プロジェクト」の終盤でチームの士気が低下した際、自発的なミーティングを企画してタスクを再分配し、チームを再結集させたことは、その影響力を示す具体的な事例です。
1631
 
1632
+ また担当タスクの納期遅延やミス発生はゼロであり、極めて高い実行力と責感を証明しています。
1633
 
1634
+ 主要な改善点して、自身のタスク遂行能力の高さゆえに、チームメンバーへの「委譲(任せる)」スキルが不足しているが指摘されました。次期は、仕事を適切に分散させ、チーム全体の生産性を向上させるためのリーダーシップの強化が必要です。
 
 
1635
 
1636
+ 4. 総括と次期へ
1637
+ 間中の最も優れていた点(Kudos)
1638
+ 田中氏は、マネージャーへの昇進に必要な問題解決能力と専門知識を完全に満たしていると評価されています。高い分析力と責任感は、ファームの信頼構築に不可欠な要素です。
1639
 
1640
+ ための主な改善点(Focus Area)
1641
+ 次期は、単なるタスク遂行者から**「プロジェクトのオーナー」へと意識をシフトすること**が最重要課題です。
1642
 
1643
+ 具体的には、クライアントやチームに対して明確な方向性を提示するファシリテーション力と、自らのタスクを適切に任せて成果を出す「委譲と育成」のリーダーシップを重点的に強化する必要があります。""")
1644
+
1645
+ user_input = gr.Textbox(
1646
+ label="パフォーマンス:",
1647
+ info="パフォーマンス評価を入力してください。",
1648
+ lines=10
1649
+ )
1650
+
1651
+ user_score = gr.Textbox(
1652
+ label="評価者の総合評価:",
1653
+ info="評価者の総合評価を入力してください。",
1654
+ lines=1
1655
+ )
1656
+
1657
+ user_userid = gr.Textbox(
1658
+ label="評価者のID:",
1659
+ info="評価者のIDを入力してください。",
1660
+ lines=1
1661
+ )
1662
+
1663
+
1664
+
1665
+ # Output component to display the model's response
1666
+ output_text = gr.HTML(
1667
+ label="パフォーマンス評価:",
1668
+ value='<div>結果</div>'
1669
+ )
1670
+
1671
+ output_file = gr.HTML(
1672
+ label="パフォーマンス評価ファイル"
1673
+ )
1674
+
1675
+ '''output_html = gr.File(
1676
+ label="パフォーマンス評価ファイル"
1677
+ )'''
1678
+ # Button to trigger the API call
1679
+ submit_button = gr.Button("生成", visible=False)
1680
+
1681
+ user_input.change(fn=change_input, inputs=[user_input], outputs=[submit_button])
1682
+
1683
+ # Connect the components: when the button is clicked,
1684
+ # the generate_response function is called with the user_input,
1685
+ # and the result is displayed in the output_text box.
1686
+ submit_button.click(
1687
+ fn=generate_review,
1688
+ inputs=[user_input, user_score, user_userid],
1689
+ outputs=[output_text, output_file]
1690
+ #outputs=[output_text, output_html]
1691
+ )
1692
+
1693
+ with gr.Column("タブ3", visible=False) as b3:
1694
+ with gr.TabItem("パフォーマンス評価基準作成"):
1695
+
1696
+
1697
+
1698
+
1699
+ kijun_input = gr.Textbox(
1700
+ label="御社のパフォーマンス評価基準",
1701
+ lines=10,
1702
+ value="""
1703
+ 評価会議のための質問事項(評価ガイド)
1704
+
1705
+ 1. イントロダクションと全体像の確認対象質問・論点目的評価者「この評価レポートの意図は、過去を裁くことではなく、今後の成長を最大化することです。まず、レポートの全体的な評価について、あなたの最初の感想を教えてください。」建設的な雰囲気を作り、自己評価と他者評価のギャップを認識させる。評価者「期間を通じて、あなたが設定していた最も重要な目標は何でしたか?その目標達成度はどの程度ですか?」評価の焦点を合わせ、本人の認識を明確にする。
1706
+
1707
+ 2. 業績評価に関する質問(成果の深掘り)対象質問・論点目的コンサルタント「期間中、あなたが最も価値を提供できたと実感しているプロジェクト(または成果物)はどれですか?具体的にクライアントにどのようなインパクトを与えましたか?」本人が誇る成果を確認し、具体的な事例を掘り下げる。評価者「『プロジェクト〇〇』での目標達成度は高いと評価しましたが、その成功の**最も大きな要因(KFS)**は何だったと考えますか?」成功の再現性を高めるための要因分析を促す。評価者「逆に、目標を達成できなかった、あるいは難航したプロジェクトについて、主要なボトルネックは何でしたか?それはコントロール可能な要因とコントロール不能な要因のどちらでしたか?」失敗からの学びを引き出し、客観的な状況分析力を評価する。評価者「あなたの提案資料は非常に論理的でしたが、**『伝達力』**の項目で改善点があると評価したのは、どのような場面(例:クライアントとの交渉、経営層へのプレゼン)でのことですか?」定性的な評価について、具体的な場面(コンテキスト)を示してフィードバックする。
1708
+
1709
+ 3. 行動評価に関する質問(プロセスとプロフェッショナリズム)対象質問・論点目的評価者「『プロジェクトA』の緊迫した状況下で、あなたはチームに対してどのようなリーダーシップを発揮しましたか?具体的な行動を教えてください。」プレッシャー下での行動やチームへの影響力を評価する。コンサルタント「期間中の業務プロセスを振り返って、より良い���果を出すために一つだけ変えられるとしたら、どの時点のどの行動を変えますか?」振り返りから改善につなげる内省力と、行動の重要性を理解しているかを評価する。評価者「クライアントとのコミュニケーションにおいて、特に信頼関係を深めるために意識的に行っていたことは何ですか?結果としてどうなりましたか?」クライアントリレーション構築における意識的な努力と、その結果を評価する。
1710
+
1711
+ 4. 総括とネクストステップ(キャリア開発)対象質問・論点目的評価者「総合的に見て、次の職位(例:マネージャー)へ昇進するために、現時点で最も不足していると判断するスキルや行動は何ですか? 具体的な基準に照らして説明します。」次の職位への期待値(卒業要件)を明確に伝え、ギャップを埋めるための目標設定につなげる。コンサルタント「この評価レビューを通じて、他に懸念点や疑問点はありますか?私からのフィードバックに納得できない点があれば、ぜひ教えてください。」相互理解を深め、オープンな関係を維持したまま会議を終える。
1712
+ """
1713
+ )
1714
 
 
 
 
 
 
1715
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1716
 
1717
+ set_button = gr.Button("パフォーマンス評価基準", variant="primary",visible=True)
1718
+
1719
+ set_button.click(
1720
+ fn=set_eval_kijyun,
1721
+ inputs=[kijun_input],
1722
+ outputs=[kijun_input]
1723
+ )
1724
+
1725
+
1726
+ user_input1 = gr.Textbox(
1727
+ label="評価プロファイル",
1728
+ info="""
1729
+ 被評価者氏名 田中 太郎
1730
+ 職位/役職 シニアアソシエイト
1731
+ 評価期間 2024年4月1日 〜 2025年3月31日
1732
+ 評価者名前 吉岡晴彦
1733
+ 評価日 2025年12月2日
1734
+ """,
1735
+ lines=5,
1736
+ interactive=True # Allow user to type
1737
+ )
1738
+
1739
+ user_input2 = gr.Textbox(
1740
+ label="評価1",
1741
+ info="""
1742
+ コニカコスト削減プロジェクト」の成果と次期マネージャーへの課題
1743
+ 田中さんは、本プロジェクトにおいて、シニアアソシエイトとして期待される水準を大きく上回る成果を達成しました。特に、コスト削減の契約目標(10%)を上回る12%の削減プランの策定に決定的に貢献した、迅速かつ正確なシミュレーションモデル構築能力は特筆すべき点です。これは、田中さんが持つ高度な分析専門知識と、プロジェクト遂行における極めて高い実行力・責任感の証左であり、「担当タスクの納期遅延やミスの発生がゼロ」という事実からも裏付けられています。業績評価における「A+」は、この定量的な成果と、クライアントからの「非常に満足」という高い評価に基づいてい ます。
1744
+ 一方で、次期マネージャーへのプロモーションを視野に入れる上で、プロジェクトのオーナーシップの面で改善すべき点が浮き彫りになりました。クライアント満足度が高く、個別ステークホルダーへの配慮は優れているものの、「部門間の利害調整が難航した際、一歩踏み込んだファシリテーションの機会を逸した」という自己評価は、まさにこの課題を指し示しています。シニアアソシエイトは「タスクの最高責任者」ですが、マネージャーは「プロジェクト全体の結論と方向性の最高責任者」です。今後は、困難な状況で明確な「Go/No-Go」を提示し、コンセンサスを形成する「大胆なファシリテーション力」を重点的に磨く必要があります。これは、単なる調整役ではなく、プロジェクトを成功に導く推進力に直結します。""",
1745
+ lines=5,
1746
+ interactive=True # Allow user to type
1747
+ )
1748
+
1749
+ user_input3 = gr.Textbox(
1750
+ label="評価2",
1751
+ info="""
1752
+ 信越化学新規事業���略策定プロジェクト」における知見の深化とリーダーシップの強化
1753
+ 田中さんは、信越化学新規事業戦略策定プロジェクト」では、問題解決能力と論理的思考力がファーム内でトップクラスであることを改めて証明しました。特に、「一般的な推奨とは異なる**『参入すべきではない理由』を検証するクリティカルな仮説**」を提示したことは、膨大なデータに溺れることなく、真の戦略的な示唆を抽出する田中さんの本質を見抜く力を示しています。技術的な専門知識、特にPython/Rを用いたデータ分析能力は、チームの生産性を大きく押し上げました。
1754
+ しかし、この高度な専門性を、より広いビジネスインパクトに結びつけるための**「伝達力」と「委譲能力」の強化が求められます。複雑な分析結果を、経営層や非専門家である現場スタッフに対し、「なぜ、今これをやるべきか」というシンプルな「メッセージ」と「示唆の鋭さ」をもって伝えきる能力は、田中さんが今後、大規模プロジェクトを牽引するために不可欠なスキルです。高度な分析結果を「翻訳」し、組織全体を動かす「影響力」**を意識してほしい。
1755
+ また、リーダーシップの面では、士気の低下したチームを自発的に再結集させた功績は素晴らしいものの、「自身のタスク遂行能力の高さゆえに、チームメンバーへの**『委譲(任せる)スキルが不足している』」という指摘は重要です。マネージャーは、自分一人で成果を出すのではなく、チーム全体のパフォーマンスを最大化することが役割です。次期は、タスクを任せることでメンバーを成長させ、プロジェクトの生産性を複利的に高める「育成と委譲のリーダーシップ」**を意識的に実践していくことが、最重要課題となります。""",
1756
+ lines=5,
1757
+ interactive=True # Allow user to type
1758
+ )
1759
+
1760
+ output_text = gr.Textbox(
1761
+ label="プレ・レビュー・レポート",
1762
+ lines=10,
1763
+ show_copy_button=True,
1764
+ interactive=False # Allow user to type
1765
+ )
1766
+
1767
+
1768
+ pre_button = gr.Button("プレ・レビュー・レポートを作成")
1769
 
1770
+ pre_button.click(
1771
+ fn=get_grounded_response,
1772
+ inputs=[user_input1, user_input2, user_input3],
1773
+ outputs=output_text
1774
+ )
1775
+
1776
+ signin.click(show_tab_1, inputs=None, outputs=[b1, b2, b3])
1777
+ query.click(show_tab_2, inputs=None, outputs=[b1, b2, b3])
1778
+ smry.click(show_tab_3, inputs=None, outputs=[b1, b2, b3])
1779
+ logout_btn.click(
1780
+ process_logout,
1781
+ inputs=[],
1782
+ outputs=[signin,query,smry,b2]
1783
+ )
1784
+
1785
+ demo.launch(favicon_path="favicon.ico")