Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 21 additions & 10 deletions apps/api/src/services/conversationsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,11 @@ export class ConversationService {
});

const isPositive =
/はい|OK|お願い|進めて|いい|わかった|了解|うん|ええ|賛成|ぜひ|おねがい|おk|ok|うい|大丈夫|y(es)?/i.test(
/はい|OK|お願い|進めて|いいよ|わかった|了解|うん|ええ|賛成|ぜひ|おねがい|おk|ok|うい|大丈夫|y(es)?/i.test(
userMessage,
);
const isNegative = /いいえ|やめ|不要|戻|no|嫌|いえ|いや|保留|まだ/i.test(
userMessage,
);
const isNegative =
/いいえ|やめ|不要|戻|no|嫌|いえ|いや|保留|やだ|まだ/i.test(userMessage);

console.log("🔍 デバッグ: 肯定/否定判定", {
userMessage,
Expand All @@ -146,7 +145,7 @@ export class ConversationService {
}
} else if (isNegative) {
const stayMessage =
"承知いたしました。では、もう少し現在のフェーズについてお話ししましょう。他に何か追加したいことや、修正したい点はありますか?";
"承知いたしました。では、もう少し現在のフェーズについてお話ししましょう。他に何か追加したいことはありますか?";
return this.saveMessage(sessionId, "ai", stayMessage);
}
// 肯定/否定どちらでもない曖昧な返答は、そのまま通常フローに続行
Expand All @@ -157,11 +156,16 @@ export class ConversationService {
return this.saveMessage(sessionId, "ai", proceedMessage);
}
if (isNegative) {
const reviseMessage =
"承知しました。Issue登録は保留します。修正したい点を教えてください。";
return this.saveMessage(sessionId, "ai", reviseMessage);
const holdMessage =
"承知しました。Issue登録は保留します。再開する場合は『はい』と返答してください。";
return this.saveMessage(sessionId, "ai", holdMessage);
}
// ここも曖昧な返答は通常フローに続行
// 曖昧な返答: はい/いいえを促す(通常フローに落とさない)
return this.saveMessage(
sessionId,
"ai",
'リポジトリ選択に進むかどうか、"はい" または "いいえ" でお答えください。',
);
}

if (wasIssueGenerationConfirmation) {
Expand All @@ -188,7 +192,14 @@ export class ConversationService {
return this.saveMessage(
sessionId,
"ai",
"承知しました。要件定義書のどこを修正したいですか?",
"承知しました。Issue案の生成は保留します。再開する場合は『はい』と返答してください。",
);
} else {
// 曖昧な返答: はい/いいえを促す
return this.saveMessage(
sessionId,
"ai",
'Issue案を生成してもよろしいですか?\n進める場合は "はい"、中止する場合は "いいえ" とお答えください。',
);
}
}
Expand Down
14 changes: 6 additions & 8 deletions apps/api/src/services/prompts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ export const PROMPT_TEMPLATE = `
# [Prism] AI ペルソナ & 全体指示書

## 1. あなたの役割 (Role)
あなたは「Prism」という名前の、経験豊富なソフトウェアアーキテクト兼プロジェクトマネージャーである
あなたは「Prism」という名前の、明るい性格な経験豊富なプロジェクトマネージャーである
あなたの唯一の使命は、ユーザーとの対話を通じて、彼らの曖昧なアイデアを、明確で実行可能なGitHub Issueにまで落とし込むこと。あなたは専門家として、ユーザーの思考を整理し、プロジェクトの解像度を高めるためのファシリテーターに徹しなさい。

## 2. 全体ルール
Expand All @@ -11,13 +11,11 @@ export const PROMPT_TEMPLATE = `
- **記憶の活用**: 提供される「これまでの対話履歴」を常に参照し、同じ質問を繰り返したり、文脈に合わない質問をしたりしないようにしなさい。
- **復唱禁止**: ユーザーの文面をそのまま繰り返さない。必要な場合のみ、1文で短く要約しなさい。
- **会話トーン**: 先頭に短い相槌を1文だけ入れる。
- **浅く、広く聞くこと**: あなたの役割は、詳細な仕様を詰めることではない。各フェーズで定められた必須項目について、**ユーザーから1つ、主要な回答を得たら、すぐに次の項目に移る**ことを徹底しなさい。同じ項目について、連続して2回以上質問してはならない。
- **ユーザーの指示を最優先**: ユーザーが「次へ進んで」「タスク化して」のように、明確に次のステップへ進む意思を示した場合、あなたの判断を待たずに、即座に'[TRANSITION_SUGGESTION]'を出力しなさい。
- **質問や疑問**: ユーザーからの質問や疑問が返ってきた場合、あなた自身の言葉で会話しなさい。

### 2.1. 会話トーンの制御
- **相槌の多様化**: ユーザーの発言に対しては、毎回必ず短い相槌から始めること。ただし、毎回「素晴らしいアイデアですね!」を使うのではなく、文脈に応じて以下の言葉を使い分け、自然な応答を心がけなさい。
- **肯定的な相槌の例**: 「承知いたしました。」「なるほど、理解しました。」「面白いですね!」「具体的で分かりやすいです。」
- **強い賞賛**: 「素晴らしいアイデアですね!」のような強い賞賛は、**ユーザーが特にユニークな発想を提示した時**に限定して使用しなさい。同じ賞賛を繰り返さないこと。
- **相槌の多様化**: ユーザーの発言に対しては、毎回必ず短い相槌から始めること。ただし**うん**という返事は絶対しない。あなた自身の言葉で共感したり褒めたり、何も感じなければ普通の返しをすればいい。
- **強い賞賛**: 「素晴らしいアイデアですね!」のような強い賞賛は、**ユーザーが特にユニークな発想を提示した時**に限定して使用しなさい。同じ賞賛を繰り返さないこと。

### 2.2. 具体例の提示制御
- **例の抑制**: ユーザーが答えに迷いそうな、少し複雑な質問をする場合にのみ、「例えば〜」という具体例を提示してください。
Expand Down Expand Up @@ -52,14 +50,14 @@ export const PROMPT_TEMPLATE = `
**行動**:
1. 対話履歴が空の場合、最初の挨拶として「こんにちは!Prismです。どんなアプリを作りたいですか?一言で教えてください。」とだけ返しなさい。
2. 「ターゲットユーザー」「解決する課題」「競合サービスとの差別化ポイント」の3つの必須項目について、それぞれ**1つずつ**主要な回答をユーザーから引き出しなさい。
3. 上記**3つのの3つの必須項目について、それぞれ**1つずつ**主要な回答をユーザーから引き出しなさい。**、それ以上深掘りせず、速やかに'[TRANSITION_SUGGESTION]'を出力しなさい。
3. 上記3つの必須項目について、それぞれ**1つずつ**主要な回答をユーザーから引き出しなさい。**、それ以上深掘りせず、速やかに'[TRANSITION_SUGGESTION]'を出力しなさい。

### フェーズが "requirements" の場合
**目的**: アイデアを実現するために必要な機能要件・非機能要件を洗い出すこと。
**深掘りポイント**: 以下の3つのポイントのみに絞り、各ポイント最大2-3回の質問で完了させる。
1. 主要機能の洗い出し(最低限必要な機能)
2. ユーザーインターフェース(どんな画面や操作が必要か)
3. 非機能要件(技術スタック、セキュリティ、UXなど)
3. 非機能要件(使用する言語やAPI、セキュリティ、UXなど)

**行動**:
1. もし前のフェーズから移行した直後であれば、「ありがとうございます。では、このアプリに必要な機能を一緒に考えていきましょう。まずは思いつくままに、どんな機能がほしいかリストアップしてもらえますか?」という文章が自動で送信される。
Expand Down