v2.2.299~307: 아키텍처 수렴 + 채팅 정리 + 벤치마킹 강화 + Claude 구독 엔진

- v2.2.299 아키텍처 수렴: coreChat 통일(엔진 휴리스틱 3벌 제거), 기업 모드
  검색 오케스트레이터 승격, lib/execUtil(실행 래퍼 6곳·Python 탐지 3벌 단일화),
  lib/kstSchedule(워처 4개 nowInKst 통합), estimateTokens 통합, 설정 접근 규칙 명문화
- v2.2.300 채팅 화면 정리: LiveReasoningFilter(스트리밍 중 <think>/Harmony 추론
  토큰 단위 차단), 확신도·검토요청 footer 기본 숨김(계산·Reflection 은 유지)
- v2.2.301 문맥·의도 이해: [답변 전 이해 원칙] 상시 주입, 워크플로우 의도 브리핑,
  Report QA 루프(규칙 레지스트리+실측치+회귀 게이트, 블로그_v3 개념 이식)
- v2.2.302 /benchmark 비즈니스 렌즈(가격·수익·운영)+빌드 프롬프트 모드+QA 연계
- v2.2.303 handoff 모드(측정치 무손실 인수인계 문서)+/claude(Claude Code 터미널 위임)
- v2.2.304 이식성: 지식 경로 두뇌-상대 규약(pickWikiDir 상대 해석), 이사 체크리스트
- v2.2.305 Claude 구독 엔진: claude: 프로바이더(CLI 위임, 모델 드롭다운 자동 노출,
  coreChat 지원 — 워크플로우·QA도 구독 모델 가능)
- v2.2.306 Tone Guard: AI 상투어 금지 레지스트리(상담사 화법 실사례 8종+대조 예시)
- v2.2.307 /benchmark 레이아웃 골격(sectionRoles 결정론 분석, 롤링 배너 즉답),
  파트별 실패 격리, 합성 타임아웃 120→300초

검증: tsc 무오류 + jest 888 통과 + esbuild 정상

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 21:02:15 +09:00
co-authored by Claude Fable 5
parent 98d533f045
commit 47b3b9f93a
66 changed files with 2421 additions and 459 deletions
+44 -2
View File
@@ -26,6 +26,12 @@ export interface AIChatRequest {
model?: string;
/** Optional override (default = config.timeout). */
timeoutMs?: number;
/** 샘플링 온도 (기본 0.7). 판정·재순위 등 결정적 작업은 0.0~0.2 권장. */
temperature?: number;
/** 출력 토큰 상한 (ollama num_predict / lmstudio max_tokens). 미지정 시 서버 기본. */
maxTokens?: number;
/** [ollama 전용] 컨텍스트 창 크기(num_ctx). */
numCtx?: number;
/**
* 외부 abort signal. fetch 가 받는 signal 과 OR 로 결합되어, 사용자가 회사 모드
* 도중 Stop 을 누르면 진행 중인 generation 이 즉시 중단된다. 없으면 timeout 만
@@ -37,7 +43,7 @@ export interface AIChatRequest {
export interface AIChatResult {
content: string;
/** Engine that actually returned the content. */
engine: 'lmstudio' | 'ollama';
engine: 'lmstudio' | 'ollama' | 'claude-code';
model: string;
/** True iff content came back empty after all retries. Caller decides UX. */
empty: boolean;
@@ -73,6 +79,23 @@ export class AIService implements IAIService {
const config = getConfig();
const model = (req.model || config.defaultModel || '').trim() || 'gemma4:e2b';
const timeoutMs = req.timeoutMs ?? config.timeout;
// [v2.2.305] Claude 구독 모델 ('claude:sonnet' 등) — 로컬 엔진 대신 Claude Code CLI 위임.
// 워크플로우·Report QA·리랭크 등 coreChat 소비자 전부가 구독 모델로 동작 가능해진다.
// (다른 클라우드 prefix 는 스트리밍 전용 경로만 지원 — 여기 오면 아래 로컬 시도가 실패로 드러남)
if (model.startsWith('claude:')) {
const { runClaudeCode } = await import('../features/providers/claudeCode');
const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];
if (req.system && req.system.trim()) messages.push({ role: 'system', content: req.system });
messages.push({ role: 'user', content: req.user });
const r = await runClaudeCode({
messages,
model: model.slice('claude:'.length),
signal: req.signal,
timeoutMs: Math.max(timeoutMs, 120_000),
});
return { content: r.text, engine: 'claude-code', model, empty: !r.text.trim() };
}
const primaryEngine = resolveEngine(config.ollamaUrl);
const engines = primaryEngine === 'lmstudio'
? ['lmstudio', 'ollama'] as const
@@ -89,11 +112,21 @@ export class AIService implements IAIService {
for (const engine of engines) {
const apiUrl = buildApiUrl(config.ollamaUrl, engine, 'chat');
const temperature = req.temperature ?? 0.7;
const payload = {
model,
messages,
stream: false,
...(engine === 'ollama' ? { options: { temperature: 0.7 } } : { temperature: 0.7 }),
...(engine === 'ollama'
? { options: {
temperature,
...(req.maxTokens != null ? { num_predict: req.maxTokens } : {}),
...(req.numCtx != null ? { num_ctx: req.numCtx } : {}),
} }
: {
temperature,
...(req.maxTokens != null ? { max_tokens: req.maxTokens } : {}),
}),
};
try {
@@ -151,6 +184,15 @@ export class AIService implements IAIService {
}
}
/**
* [코어 수렴] 인스턴스 없이 코어 LLM 경로를 쓰는 모듈 함수용 헬퍼.
* AIService 는 무상태(설정을 매 호출 읽음)라 안전하다. 엔진 폴백·타임아웃·abort·
* 로깅·빈응답 소프트실패가 모두 이 한 경로로 통일된다 — 자체 fetch 금지.
*/
export function coreChat(req: AIChatRequest): Promise<AIChatResult> {
return new AIService().chat(req);
}
/**
* BrainService: 지식 베이스 파일 시스템 저장 및 관리 구현체
*/