export function buildVisionPrompt(
  text: string,
  todayKst: string,
  dueCandidates: string[],
  vocab: string[]
): string {
  // v0.3.14 — 본문 빈 케이스에 one-shot 예시 추가. gemma4:26b 등이 본문 없이
  // 이미지만 받으면 null 반환하는 한계 우회. 예시 입력/출력 구조 따라가도록 유도.
  const bodySection = text
    ? `메모 본문:\n${text}\n\n첨부 이미지도 함께 분석해 요약에 반영하세요.`
    : `본문이 없습니다. 첨부 이미지의 내용 (텍스트/사람/장면/문서 등) 만으로 한국어 title 과 summary 를 작성하세요. null 반환 절대 금지.

예시 (이미지: 갈색 강아지가 잔디 위에 앉은 사진):
{"title":"잔디 위 강아지","summary":"갈색 강아지가 잔디 위에 앉아 있다.\\n배경에 나무가 보인다.\\n날씨가 맑다.","tags":["pet"],"due_date":null}

예시 (이미지: 회의실 화이트보드 사진):
{"title":"회의실 화이트보드","summary":"화이트보드에 일정과 안건이 적혀 있다.\\n프로젝트 이름이 보인다.\\n다이어그램이 그려져 있다.","tags":["meeting"],"due_date":null}

이제 첨부된 실제 이미지를 보고 같은 형식으로 작성하세요.`;

  return `다음 메모를 한국어로 분석해 JSON 으로 정리하세요.

${bodySection}

규칙 (위반 시 재시도):
- "title": 한국어 문자열 필수, null 금지. 60자 이내. 영어 단독 금지.
- "summary": 한국어 문자열 필수, null 금지. 3줄. 이미지 시각 정보 (텍스트/사람/장면) 포함.
- "tags": 영문 kebab-case 배열 (예: ["meeting-notes"]), 최대 3개. 한국어 태그 금지. 없으면 [].
- "due_date": ISO YYYY-MM-DD 또는 null. 빈 문자열 금지.

오직 JSON 객체 하나만 출력. markdown 코드 펜스 (\`\`\`) / 설명 prose 금지.
출력 형식: {"title":"...","summary":"...","tags":[],"due_date":null}

오늘: ${todayKst}
가능한 due 후보: ${dueCandidates.join(', ')}
빈출 태그: ${vocab.slice(0, 20).join(', ')}`;
}
