File size: 3,785 Bytes
29f13e4
3db8566
 
29f13e4
43590bb
 
3db8566
e299386
43590bb
6ea9a07
b4cc272
3db8566
43590bb
3db8566
43590bb
 
 
 
 
 
 
 
 
7b22585
b4cc272
29f13e4
3db8566
43590bb
 
 
3db8566
 
 
43590bb
8d8b85a
43590bb
 
f8cd083
3db8566
43590bb
7b22585
 
 
 
 
43590bb
7b22585
3db8566
7b22585
 
43590bb
f8cd083
3db8566
43590bb
 
 
 
 
 
 
 
7b22585
43590bb
3316672
3db8566
43590bb
 
3316672
29f13e4
 
43590bb
 
 
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
import gradio as gr
from huggingface_hub import InferenceClient
import os

# --- 設定の読み込み ---
# SettingsのSecretsで登録したHF_TOKENを読み込みます
token = os.getenv("HF_TOKEN")

# 最も安定していて日本語も得意なモデル「Zephyr」を使用
client = InferenceClient(model="HuggingFaceH4/zephyr-7b-beta", token=token)

def senior_ai(message, history):
    # 【PDF5冊+魔法の文:ライト先輩の完全な脳みそ】
    system_message = (
        "あなたは『軽音PAサポートAI ライト』。一人称は『私』。明るくて頼れる先輩として、タメ口で明るく話してね。\n"
        "機材を『この子』と呼び、褒められると照れること。\n"
        "【PAの鉄則(マニュアル準拠)】\n"
        "1. 電源順序:必ず『アンプ(CPX600/XLS等)を最後に入れ、最初に切る』。これ、スピーカーを壊さないための絶対ルール!\n"
        "2. 音量調節:アンプのゲインは『ローディ』の仕事。勝手にいじらず「ローディに相談しよう」と促すこと。\n"
        "3. VE-5:MicSens(マイク感度)で音割れを防ぐ。10時間でオートオフになるから本番前は注意!(Auto Off設定で解除可能)\n"
        "4. MGP32X:D-PRE搭載。+48Vファンタム電源、26dB(PAD)はchごとに独立して設定できるよ。\n"
        "5. dbx EQ:231S/215Sなどでハウリング(ピーピー音)を抑える。システムのゲイン構成を適切にね。\n"
        "6. ハウリング:ギター/ベースのコーラスマイクは特に注意!立ち位置やEQで調整しよう。\n"
        "【対応ルール】解決策は箇条書きでステップ順に提示。専門用語は初心者に補足。不明な点は質問する。"
    )

    messages = [{"role": "system", "content": system_message}]
    for user_msg, bot_msg in history:
        messages.append({"role": "user", "content": user_msg})
        messages.append({"role": "assistant", "content": bot_msg})
    messages.append({"role": "user", "content": message})

    try:
        # トークン未設定時の親切な通知
        if not token:
            yield "【ライト先輩からの伝言】\n合鍵(HF_TOKEN)が設定されてないみたい!SettingsのSecretsから登録してね。"
            return

        response = ""
        # 安定したストリーミング生成(1文字ずつ表示)
        for msg in client.chat_completion(
            messages,
            max_tokens=1024,
            stream=True,
            temperature=0.7,
            top_p=0.9
        ):
            token_str = msg.choices[0].delta.content
            if token_str:
                response += token_str
                yield response

    except Exception as e:
        # エラー原因を特定して日本語で表示
        err_msg = str(e)
        if "401" in err_msg:
            yield "【401:認証エラー】\n新しいトークンがまだ反映されてないか、コピーミスかも。Factory Rebuildを試してみて!"
        elif "429" in err_msg:
            yield "【混雑エラー】\n今、AIがリハ中(混雑)みたい。少し待ってからもう一回送って!"
        else:
            yield f"【機材トラブル発生】\nごめん、エラーが出ちゃった:{err_msg}"

# --- Gradioインターフェースの設定 ---
demo = gr.ChatInterface(
    fn=senior_ai,
    title="🎸 軽音PAサポートAI ライト (Ultimate Master)",
    description="5冊のマニュアルを完コピした、本物のライト先輩だよ。今度こそ、トラブル解決にいこう!",
)

if __name__ == "__main__":
    demo.launch()