export function buildVisionPrompt(
  text: string,
  todayKst: string,
  dueCandidates: string[],
  vocab: string[]
): string {
  // v0.3.11 — vision model 이 'format:json' constraint 를 부분적으로만 따르는 경우가
  // 잦음 (특히 gemma3 vision). title 한국어 + JSON only 를 prompt 에서 명시 강조,
  // markdown fence 금지 표기로 schema parse 통과율 개선.
  // 본문 비었으면 이미지만 보고 title/summary 채우도록 명시. 그냥 "(이미지만 있음)" 만
  // 던지면 모델이 null 반환 (gemma4:26b 확인). 본문 있으면 본문 우선, 없으면 이미지 묘사.
  const bodySection = text
    ? `메모 본문:\n${text}\n\n첨부 이미지도 함께 분석해 요약에 반영하세요.`
    : `본문이 없으니 첨부 이미지의 내용 (텍스트/사람/장면/문서 등) 을 보고 title 과 summary 를 한국어로 작성하세요. 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(', ')}`;
}
