Fix mode-aware ensureEndMark: skip '끝.' for 보고서 mode
Browse files- static/index.html +13 -10
static/index.html
CHANGED
|
@@ -130,10 +130,10 @@
|
|
| 130 |
<label>문서 양식</label>
|
| 131 |
<div class="row" style="gap:16px; margin-bottom:8px;">
|
| 132 |
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 133 |
-
<input type="radio" name="doc-mode" value="공문" checked> 공문 (수신/제목/본문/
|
| 134 |
</label>
|
| 135 |
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 136 |
-
<input type="radio" name="doc-mode" value="보고서"> 보고서 (
|
| 137 |
</label>
|
| 138 |
</div>
|
| 139 |
|
|
@@ -241,7 +241,7 @@ const SYSTEM_PROMPT_REPORT = `당신은 한국전력공사(한전, KEPCO) 내부
|
|
| 241 |
- 추측이나 가공 정보 추가 금지, 사용자가 준 내용만 정리
|
| 242 |
|
| 243 |
[★ 문체 — 가장 중요]
|
| 244 |
-
- 한전 내부 보고서 표준은
|
| 245 |
- 권장 종결: "시행 예정", "참여 요청", "추진 계획", "검토 중", "수립", "협의 완료", "운영", "확보", "필요"
|
| 246 |
- 금지 종결: "~합니다", "~입니다", "~예정입니다", "~하고자 합니다", "~바랍니다"
|
| 247 |
- 예시:
|
|
@@ -264,9 +264,12 @@ const SYSTEM_PROMPT_REPORT = `당신은 한국전력공사(한전, KEPCO) 내부
|
|
| 264 |
가. ('26.5월) 규제 설명회 개최
|
| 265 |
나. ('26.6월) 사내 위원회 운영계획 수립`;
|
| 266 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
function getSystemPrompt() {
|
| 268 |
-
|
| 269 |
-
return mode === '보고서' ? SYSTEM_PROMPT_REPORT : SYSTEM_PROMPT_LETTER;
|
| 270 |
}
|
| 271 |
|
| 272 |
function buildUserPrompt() {
|
|
@@ -370,8 +373,8 @@ async function generate() {
|
|
| 370 |
if (obj.done) {
|
| 371 |
doneSeen = true;
|
| 372 |
console.log('[SSE done]', obj);
|
| 373 |
-
|
| 374 |
-
const final = ensureEndMark(
|
| 375 |
outputEl.textContent = final;
|
| 376 |
setStatus(`완료 (${obj.tokens} 토큰, ${obj.elapsed}초)`);
|
| 377 |
return;
|
|
@@ -419,9 +422,9 @@ $('download-docx').addEventListener('click', async () => {
|
|
| 419 |
setStatus('docx 라이브러리 로딩 실패 (네트워크 확인)', true);
|
| 420 |
return;
|
| 421 |
}
|
| 422 |
-
|
| 423 |
-
const
|
| 424 |
-
const title = (firstTitleMatch ? firstTitleMatch[1] :
|
| 425 |
const safeTitle = title.replace(/[\\/:*?"<>|]/g, '_').slice(0, 50);
|
| 426 |
|
| 427 |
const { Document, Paragraph, TextRun, Packer } = window.docx;
|
|
|
|
| 130 |
<label>문서 양식</label>
|
| 131 |
<div class="row" style="gap:16px; margin-bottom:8px;">
|
| 132 |
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 133 |
+
<input type="radio" name="doc-mode" value="공문" checked> 공문 (수신/제목/본문/끝.)
|
| 134 |
</label>
|
| 135 |
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 136 |
+
<input type="radio" name="doc-mode" value="보고서"> 보고서 (작성일자/부서/섹션)
|
| 137 |
</label>
|
| 138 |
</div>
|
| 139 |
|
|
|
|
| 241 |
- 추측이나 가공 정보 추가 금지, 사용자가 준 내용만 정리
|
| 242 |
|
| 243 |
[★ 문체 — 가장 중요]
|
| 244 |
+
- 한전 내부 보고서 표준은 명사형 종결 (정중체 절대 금지)
|
| 245 |
- 권장 종결: "시행 예정", "참여 요청", "추진 계획", "검토 중", "수립", "협의 완료", "운영", "확보", "필요"
|
| 246 |
- 금지 종결: "~합니다", "~입니다", "~예정입니다", "~하고자 합니다", "~바랍니다"
|
| 247 |
- 예시:
|
|
|
|
| 264 |
가. ('26.5월) 규제 설명회 개최
|
| 265 |
나. ('26.6월) 사내 위원회 운영계획 수립`;
|
| 266 |
|
| 267 |
+
function getMode() {
|
| 268 |
+
return document.querySelector('input[name="doc-mode"]:checked')?.value || '공문';
|
| 269 |
+
}
|
| 270 |
+
|
| 271 |
function getSystemPrompt() {
|
| 272 |
+
return getMode() === '보고서' ? SYSTEM_PROMPT_REPORT : SYSTEM_PROMPT_LETTER;
|
|
|
|
| 273 |
}
|
| 274 |
|
| 275 |
function buildUserPrompt() {
|
|
|
|
| 373 |
if (obj.done) {
|
| 374 |
doneSeen = true;
|
| 375 |
console.log('[SSE done]', obj);
|
| 376 |
+
const stripped = stripMarkdown(buffer);
|
| 377 |
+
const final = getMode() === '공문' ? ensureEndMark(stripped) : stripped;
|
| 378 |
outputEl.textContent = final;
|
| 379 |
setStatus(`완료 (${obj.tokens} 토큰, ${obj.elapsed}초)`);
|
| 380 |
return;
|
|
|
|
| 422 |
setStatus('docx 라이브러리 로딩 실패 (네트워크 확인)', true);
|
| 423 |
return;
|
| 424 |
}
|
| 425 |
+
const firstTitleMatch = text.match(/^제목\s+(.+)$/m);
|
| 426 |
+
const mode = getMode();
|
| 427 |
+
const title = (firstTitleMatch ? firstTitleMatch[1] : mode).trim();
|
| 428 |
const safeTitle = title.replace(/[\\/:*?"<>|]/g, '_').slice(0, 50);
|
| 429 |
|
| 430 |
const { Document, Paragraph, TextRun, Packer } = window.docx;
|