0a97324f1b
R56–R59: agent.ts 2731→1529줄 god-file 분해 (25 modules) · attrParsers + LLM 메서드 8개 (callNonStreaming, streamChatOnce 등) · executeActions 415줄 → 8 handler 그룹 (file/run/list/brain/calendar/sheets/tasks) · handlePrompt 1100줄 → 7 phase 모듈 (system prompt + budget + autoContinue 등) R50–R55: extension.ts 1145→349줄 (telegram/settings/provider commands 분리) Stocks feature 신규: /stocks slash command (v2.2.152~158) · .astra/stocks.json 저장소 + Yahoo Finance 현재가 갱신 · 8 키워드 필터 (ROE/성장성/유동성/수익성/영업효율/기술력/안정성/PBR) · Naver 시가총액 페이지 JSON API (m.stock.naver.com) 발굴 · LLM Top 5 매력도 분석 + Telegram 자동 보고서 · KST 09:00/15:00 watcher 자동 모니터링 대화 연속성 (v2.2.150~157): · [PRIOR TURN CONCLUSION] block 으로 직전 결론 anchor · thin follow-up 분류 → boilerplate 헤더 suppression · slash 명령 결과 chatHistory mirror (capture wrapper) · echo/parrot 금지 system prompt rule 기타: /stocks 슬래시 자동완성 dropdown UI, Naver JSON API 전환 (cheerio 제거) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
57 lines
2.1 KiB
TypeScript
57 lines
2.1 KiB
TypeScript
import type { ChatMessage } from '../../agent';
|
|
|
|
/**
|
|
* LLM 엔진 호출 직전 메시지 배열 정규화 + 엔진별 variant 생성.
|
|
*
|
|
* - normalizeMessages — content 가 객체면 stringify (Ollama Vision 의 images
|
|
* 필드는 보존). 엔진 API 가 항상 plain object array 만 받기 때문.
|
|
* - buildEngineMessageVariants — LM Studio 한정으로 system role 이 가끔 무시되는
|
|
* 버그 우회용 fallback variant 도 함께 만들어 호출자가 차례로 시도하게 한다
|
|
* (native-system 실패 → flattened-system-fallback). Ollama 는 그냥 native 1개.
|
|
*
|
|
* 둘 다 stateless — agent.ts 의 private 메서드를 그대로 추출.
|
|
*/
|
|
|
|
export function normalizeMessages(messages: ChatMessage[]) {
|
|
return messages.map((message) => {
|
|
const normalizedContent = typeof message.content === 'string'
|
|
? message.content
|
|
: JSON.stringify(message.content);
|
|
|
|
const result: any = {
|
|
role: message.role,
|
|
content: normalizedContent,
|
|
};
|
|
// Ollama Vision: images 필드 보존
|
|
if ((message as any).images) {
|
|
result.images = (message as any).images;
|
|
}
|
|
return result;
|
|
});
|
|
}
|
|
|
|
export function buildEngineMessageVariants(messages: ChatMessage[], engine: 'lmstudio' | 'ollama') {
|
|
const normalized = normalizeMessages(messages);
|
|
if (engine !== 'lmstudio') {
|
|
return [{ name: 'native', messages: normalized }];
|
|
}
|
|
|
|
// LM Studio system-role bug 우회: system 메시지를 "[System Instruction - do not
|
|
// answer this message]\n…" 로 감싸 user role 로 변환. 호출자는 native 가 실패하면
|
|
// 이 flattened variant 로 재시도한다.
|
|
const flattened = normalized.map((message) => {
|
|
if (message.role === 'system') {
|
|
return {
|
|
role: 'user' as const,
|
|
content: `[System Instruction - do not answer this message]\n${message.content}`,
|
|
};
|
|
}
|
|
return message;
|
|
});
|
|
|
|
return [
|
|
{ name: 'native-system', messages: normalized },
|
|
{ name: 'flattened-system-fallback', messages: flattened },
|
|
];
|
|
}
|