bfb0d23a2f
[포맷 통일 — Datacollect 가 정본] /wikify 와 Datacollect research 가 각자 포맷 사본을 들고 어긋났던 문제. 더 최신인 Datacollect 포맷을 wiki_format.mjs 정본으로 추출(브리지 측)하고, /wikify 는 GET /api/wiki/template 로 받아 소비. 구버전 브리지면 내장 사본 fallback (정본 v3.1과 동일 내용). 포맷 수정은 이제 wiki_format.mjs 한 곳. /wikify 가 정본을 따르며 고쳐진 것: - category "10_Wiki/Topics"(물리 경로 버그) → 논리 도메인 규칙 - 고정 신뢰도 B/0.8 → 소스 평가 동적 부여 (충돌 신뢰도 권고의 입력 품질) - aliases 빈 배열 → 동의어 3-8개 강제 (어휘갭 검색 보완) - "## 🔗 관련 문서 링크" → "## 🔗 지식 그래프" + 고아 방지 up-link - 인라인 [S#] 출처 인용 + 📚 출처 섹션, 비교표·코드 패턴 조건 섹션 [채팅 URL 접근 — 강제 주입 패턴 4번째 적용] 일반 채팅에 URL 을 주면 "접근 불가"라고 답하던 공백: urlContext 가 URL 감지 시 브리지 /api/web-extract(기존 /wikify 인프라 재사용)로 본문 추출 → 컨텍스트 주입 (8K 캡, 잘림 시 /wikify 안내). 실패 시 정직 블록 (브리지 확인 안내 + 추측 금지). 슬래시 명령은 제외 (자체 처리). 주입 성공 로그 포함. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
49 lines
2.6 KiB
TypeScript
49 lines
2.6 KiB
TypeScript
/**
|
|
* URL 컨텍스트 + wikify 정본 포맷 — 순수 로직 테스트.
|
|
*/
|
|
import { extractUrlFromPrompt } from '../src/lib/contextBuilders/urlContext';
|
|
import { buildWikifyPrompt, type CanonicalWikiFormat } from '../src/features/datacollect/prompts/wikifyPrompt';
|
|
|
|
describe('extractUrlFromPrompt', () => {
|
|
test('URL 추출 + 끝 구두점 제거', () => {
|
|
expect(extractUrlFromPrompt('이 글 요약해줘 https://example.com/post.')).toBe('https://example.com/post');
|
|
expect(extractUrlFromPrompt('https://a.io/x?q=1 내용 확인')).toBe('https://a.io/x?q=1');
|
|
});
|
|
test('슬래시 명령은 제외 (/wikify 가 자체 처리)', () => {
|
|
expect(extractUrlFromPrompt('/wikify https://example.com')).toBeNull();
|
|
});
|
|
test('URL 없으면 null', () => {
|
|
expect(extractUrlFromPrompt('오늘 일정 알려줘')).toBeNull();
|
|
expect(extractUrlFromPrompt('')).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('buildWikifyPrompt — 정본/fallback 포맷', () => {
|
|
const extracted = { url: 'https://ex.com/doc', title: '문서', text: '본문 내용입니다. '.repeat(10), headings: ['h1'] };
|
|
|
|
test('정본 주입 시 placeholder 가 채워진다', () => {
|
|
const canonical: CanonicalWikiFormat = {
|
|
version: '9.9',
|
|
commonRules: '\n7. 규칙 루트={{ROOT}}',
|
|
frontmatter: '---\nid: {{ID}}\ntitle: "{{TITLE}}"\ntags: [{{TAGS}}]\nraw_sources: {{SOURCES}}\n---',
|
|
sections: '# [[{{TOPIC}}]]\n- {{TODAY}}: {{ORIGIN}}',
|
|
};
|
|
const p = buildWikifyPrompt(extracted, '테스트 주제', canonical);
|
|
expect(p).toContain('P-Reinforce v9.9');
|
|
expect(p).toContain('규칙 루트=테스트 주제');
|
|
expect(p).toContain('title: "테스트 주제"');
|
|
expect(p).toContain('raw_sources: ["https://ex.com/doc"]');
|
|
expect(p).not.toContain('{{'); // placeholder 잔존 금지
|
|
});
|
|
|
|
test('정본 없으면 내장 사본 — 현대화 항목 포함', () => {
|
|
const p = buildWikifyPrompt(extracted, '주제', null);
|
|
expect(p).toContain('category는 폴더경로 말고 논리 도메인'); // 물리 경로 버그 수정
|
|
expect(p).toContain("aliases'에 동의어"); // 별칭 강제
|
|
expect(p).toContain('지식 충돌 시 우선순위 판단'); // 동적 신뢰도 — 충돌 권고 입력
|
|
expect(p).toContain('## 🔗 지식 그래프'); // 섹션명 통일 (구 "관련 문서 링크" 대체)
|
|
expect(p).not.toContain('category: "10_Wiki/Topics"');
|
|
expect(p).not.toContain('{{');
|
|
});
|
|
});
|