File size: 5,213 Bytes
4e12741
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import gradio as gr
from huggingface_hub import InferenceClient
import os

# Secretsから取得
TOKEN = os.getenv("HF_TOKEN")
# 高性能なLlama-3-70Bを使用(日本語の指示理解が非常に強力です)
client = InferenceClient("meta-llama/Meta-Llama-3-70B-Instruct", token=TOKEN)

def generate_press_release(category, title, key_elements, background, company_info):
    if not TOKEN:
        yield "❌ エラー: HF_TOKEN が設定されていません。Settings > Secretsを確認してください。"
        return

    # カテゴリごとのプロンプト調整用ヒント
    hints = {
        "新製品・新サービス": "革新性、利便性、ターゲットへのメリットを強調してください。",
        "イベント・展示会": "開催の社会的意義、登壇者の魅力、参加者が得られる体験を強調してください。",
        "業務提携・契約": "両社が組むことによる相乗効果(シナジー)と、業界への影響を強調してください。",
        "資金調達": "調達の目的、今後の事業展開、投資家からの期待値を強調してください。",
        "調査レポート": "調査結果の客観的なデータと、そこから見える社会的な傾向を強調してください。",
        "その他(周年・人事・移転等)": "これまでの歩みと、今後の決意やビジョンを強調してください。"
    }

    selected_hint = hints.get(category, "")

    # 強力な日本語プロンプト
    prompt = f"""
あなたは日本の大手PR会社に所属する、エリート広報コンサルタントです。
提供された情報が断片的であったり、多言語が混ざっていたりしても、その本質を汲み取り、メディアが記事にしたくなる【完璧な日本語】のプレスリリースを作成してください。

【入力情報】
- カテゴリ: {category}
- 暫定タイトル: {title}
- 必須要素(詳細): {key_elements}
- 背景・想い(メモ): {background}
- 発信元情報: {company_info}

【絶対ルール】
1. **言語の統一**: 入力に英語やエラーメッセージ、記号が含まれていても、それらを無視または適切な日本語に翻訳・補完してください。
2. **語尾の指定**: すべて「です・ます」調(敬体)で統一してください。「である」「だ」は一切使用しないでください。
3. **構成**: 【タイトル】【リード文】【詳細】【背景・ストーリー】【会社概要・お問い合わせ先】の形式を守ってください。
4. **トーン**: 信頼感、誠実さ、そして革新性が伝わるビジネスレベルの文章にしてください。
5. **指示の反映**: {selected_hint}

出力はすべて日本語のみで行ってください。
"""

    try:
        response = ""
        for message in client.chat_completion(
            messages=[{"role": "user", "content": prompt}],
            max_tokens=3000,
            stream=True,
        ):
            if message.choices and len(message.choices) > 0:
                token = message.choices[0].delta.content
                if token:
                    response += token
                    yield response
    except Exception as e:
        yield f"⚠️ エラーが発生しました: {str(e)}"

# UIデザイン
with gr.Blocks() as demo:
    gr.Markdown("# 📢 プロフェッショナル・プレスリリース・ジェネレーター")
    gr.Markdown("業種を問わず、あらゆるニュースをメディア品質のプレスリリースへ変換します。")
    
    with gr.Row():
        with gr.Column(scale=1):
            category = gr.Dropdown(
                choices=["新製品・新サービス", "イベント・展示会", "業務提携・契約", "資金調達", "調査レポート", "その他(周年・人事・移転等)"], 
                label="ニュースのカテゴリ", value="新製品・新サービス"
            )
            title = gr.Textbox(label="タイトル(仮)", placeholder="例:世界初の〇〇技術を開発")
            elements = gr.Textbox(label="具体的な内容・事実関係", lines=5, placeholder="5W1H(いつ、どこで、誰が、何を...)を入力してください。")
            context = gr.Textbox(label="開発背景・プロジェクトの想い", lines=5, placeholder="メモ書きや多言語が混ざっていても問題ありません。AIが適切に補完します。")
            company = gr.Textbox(label="会社情報・連絡先", placeholder="社名、代表名、本件に関するお問い合わせ先など")
            
            submit_btn = gr.Button("プレスリリースを自動生成", variant="primary")
            
        with gr.Column(scale=1):
            output = gr.Markdown()

    submit_btn.click(
        fn=generate_press_release, 
        inputs=[category, title, elements, context, company], 
        outputs=output
    )

if __name__ == "__main__":
    # Gradio 6.0+ の安定稼働設定
    demo.launch(server_name="0.0.0.0", server_port=7860, show_error=True)