From 1a5a01fd4496749ada14586124a46b07863a0532 Mon Sep 17 00:00:00 2001 From: Satsuki Akiba Date: Sat, 7 Jun 2025 11:40:47 +0900 Subject: [PATCH] Update --- services/llm.ts | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/services/llm.ts b/services/llm.ts index 3f7f3e2..4175ff3 100644 --- a/services/llm.ts +++ b/services/llm.ts @@ -14,7 +14,7 @@ export async function openAI_ClassifyFeed(title: string): Promise { if (!title || title.trim() === "") { throw new Error("Feed title is required for classification"); } - + const prompt = ` 以下のRSSフィードのタイトルを見て、適切なトピックカテゴリに分類してください。 @@ -34,24 +34,26 @@ export async function openAI_ClassifyFeed(title: string): Promise { 分類結果を上記カテゴリのいずれか1つだけ返してください。 `; - + try { const response = await openai.chat.completions.create({ model: config.openai.modelName, messages: [{ role: "user", content: prompt.trim() }], temperature: 0.3, }); - + const category = response.choices[0]?.message?.content?.trim(); if (!category) { console.warn("OpenAI returned empty category, using default"); return "その他"; } - + return category; } catch (error) { console.error("Error classifying feed:", error); - throw new Error(`Failed to classify feed: ${error instanceof Error ? error.message : 'Unknown error'}`); + throw new Error( + `Failed to classify feed: ${error instanceof Error ? error.message : "Unknown error"}`, + ); } } @@ -62,17 +64,19 @@ export async function openAI_GeneratePodcastContent( if (!title || title.trim() === "") { throw new Error("Feed title is required for podcast content generation"); } - + if (!items || items.length === 0) { - throw new Error("At least one news item is required for podcast content generation"); + throw new Error( + "At least one news item is required for podcast content generation", + ); } - + // Validate items - const validItems = items.filter(item => item.title && item.link); + const validItems = items.filter((item) => item.title && item.link); if (validItems.length === 0) { throw new Error("No valid news items found (title and link required)"); } - + const prompt = ` あなたはプロのポッドキャスタです。以下に示すフィードタイトルに基づき、そのトピックに関する詳細なポッドキャスト原稿を作成してください。 @@ -82,30 +86,33 @@ export async function openAI_GeneratePodcastContent( ${validItems.map((item, i) => `${i + 1}. ${item.title} - ${item.link}`).join("\n")} 以下の要件を満たしてください: -1. 各ニュース記事の内容を要約し、関連性を説明してください -2. 視聴者にとっての価値や興味ポイントを解説してください -3. 約1000文字〜1500文字程度の長さにしてください -4. 自然な日本語の口語表現を使ってください -5. トピック全体のまとめで締めくくってください +1. もし英単語が含まれている場合は、すべてカタカナに変換してください (例: "Google" → "グーグル") +2. 各ニュース記事の内容を要約し、関連性を説明してください +3. 視聴者にとっての価値や興味ポイントを解説してください +4. 約1000文字〜1500文字程度の長さにしてください +5. 自然な日本語の口語表現を使ってください +6. トピック全体のまとめで締めくくってください この構成でポッドキャスト原稿を書いてください。 `; - + try { const response = await openai.chat.completions.create({ model: config.openai.modelName, messages: [{ role: "user", content: prompt.trim() }], temperature: 0.7, }); - + const scriptText = response.choices[0]?.message?.content?.trim(); if (!scriptText) { throw new Error("OpenAI returned empty podcast content"); } - + return scriptText; } catch (error) { console.error("Error generating podcast content:", error); - throw new Error(`Failed to generate podcast content: ${error instanceof Error ? error.message : 'Unknown error'}`); + throw new Error( + `Failed to generate podcast content: ${error instanceof Error ? error.message : "Unknown error"}`, + ); } }