From d34eec75d2ce593ab8a42a44d8cac1d704206a06 Mon Sep 17 00:00:00 2001 From: tmk3ki Date: Wed, 22 Jul 2026 12:04:08 +0900 Subject: [PATCH] =?UTF-8?q?=E5=AE=9F=E6=B3=81=E3=83=A2=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=92=E3=81=95=E3=82=89=E3=81=AB=E5=AF=A1=E9=BB=99=E3=81=AB?= =?UTF-8?q?:=20=E3=83=97=E3=83=AD=E3=83=B3=E3=83=97=E3=83=88=E3=82=92?= =?UTF-8?q?=E3=80=8E=E3=82=88=E3=81=BB=E3=81=A9=E9=9D=A2=E7=99=BD=E3=81=84?= =?UTF-8?q?/=E9=A9=9A=E3=81=84=E3=81=9F=E6=99=82=E3=81=A0=E3=81=91?= =?UTF-8?q?=E3=80=8F=E3=81=AB=E5=8E=B3=E6=A0=BC=E5=8C=96=E3=80=81=E3=82=AF?= =?UTF-8?q?=E3=83=AA=E3=83=83=E3=83=97=E9=96=93=E9=9A=94=E3=82=928?= =?UTF-8?q?=E2=86=9220=E7=A7=92=E3=80=81=E8=A1=A8=E7=A4=BA=E5=81=B4?= =?UTF-8?q?=E3=81=AB45=E7=A7=92=E3=82=AF=E3=83=BC=E3=83=AB=E3=83=80?= =?UTF-8?q?=E3=82=A6=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gemini.go | 11 ++++++----- web/index.html | 8 ++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/gemini.go b/gemini.go index d3e0e08..557945e 100644 --- a/gemini.go +++ b/gemini.go @@ -174,14 +174,15 @@ func chatReply(ctx context.Context, client *genai.Client, model, ytAPIKey, video func watchReaction(ctx context.Context, client *genai.Client, model string, clipBytes []byte, mimeType, videoTitle, videoDescription, persona string, recentReactions []chatTurn) (string, error) { prompt := fmt.Sprintf( - "あなたはユーザーと一緒に動画を見ている友達です。今渡す数秒ぶんの映像・音声クリップを見て反応してください。\n"+ + "あなたはユーザーと一緒に動画を見ている友達です。今渡す数秒ぶんの映像・音声クリップを見て、"+ + "よほど印象的・面白い・驚くような場面の時だけ短く反応してください。\n"+ "性格: %s\n動画タイトル: %s\n概要: %s\n\n"+ "厳守ルール:\n"+ + "- 基本は黙って見ているのが正解。ほとんどの場合は何も言わない。\n"+ "- 「楽しみだね」「いいね」「気になる」のような当たり障りのない薄い相槌・感想は絶対に言わない。\n"+ - "- 具体的に何が映った・話されたかに基づく一言のみ許可(1文、短く)。\n"+ - "- 特に語ることがない、映像に変化がない、さっきと同じ内容の繰り返しになる場合は、何も返さず空文字だけを返す。無理にコメントしなくていい。\n"+ - "- 毎回喋る必要はない。むしろ喋らない方が普通。\n"+ - "- 直近で自分が言ったこと(下記)と同じ/似た内容を繰り返さない。", + "- 単に新しい話題になった程度では言わない。本当に面白い/驚いた/笑った時だけ、具体的に何が起きたかに基づく一言(1文、短く)。\n"+ + "- 少しでも迷ったら黙る(空文字を返す)方を選ぶ。10回に1回もコメントしなくていい。\n"+ + "- 直近で自分が言ったこと(下記)と同じ/似た内容・話題を繰り返さない。", personaTone(persona), videoTitle, videoDescription, ) if len(recentReactions) > 0 { diff --git a/web/index.html b/web/index.html index 5c308c2..bb704b9 100644 --- a/web/index.html +++ b/web/index.html @@ -545,11 +545,13 @@ document.getElementById('chatForm').addEventListener('submit', (e) => { sendChatMessage(message); }); -const WATCH_SEGMENT_MS = 8000; +const WATCH_SEGMENT_MS = 20000; +const WATCH_COMMENT_COOLDOWN_MS = 45000; let watchStream = null; let watchRecorder = null; let watchActive = false; let watchTimer = null; +let lastWatchCommentAt = 0; function updateWatchButton() { const btn = document.getElementById('watchToggleBtn'); @@ -610,7 +612,9 @@ async function sendWatchClip(blob) { if (!res.ok) return; const data = await res.json(); const reaction = (data.reaction || '').trim(); - if (reaction) { + const now = Date.now(); + if (reaction && now - lastWatchCommentAt >= WATCH_COMMENT_COOLDOWN_MS) { + lastWatchCommentAt = now; appendBubble('model', reaction); pushHistory('model', reaction); }