import { Runnable } from './agent.js'; import { ProofreadResult, ProofreaderOptions, RewriterOptions, SummarizerOptions, WriterOptions } from './types.js'; /** * Task API 단계 — 번역·요약·언어감지·작성·재작성·교정을 Runnable로 감싼 것. * * 이 단계들은 Prompt API 세션을 **전혀 만들지 않는다**. 그래서 chain 중간에 몇 개를 끼워도 * 에이전트의 컨텍스트 창을 1토큰도 먹지 않는다. 창이 좁은 온디바이스 환경에서 * "모델에게 시키지 않고 끝낼 수 있는 일"을 골라내는 것이 가장 큰 절약이다. * * ```ts * chain(analyst, summarizer(), translator({ to: 'ko' })) * // ↑ 모델 ↑ 요약 전용 ↑ 번역 전용 (뒤 둘은 창 사용량 0) * ``` * * **출시 상태가 제각각이다.** translator·summarizer·languageDetector는 Chrome 138부터 * 안정 버전에 있고, writer·rewriter·proofreader는 아직 오리진 트라이얼이다. * 어느 쪽이든 못 쓰면 fallback으로 넘어가므로, 지금 코드를 그대로 두면 * Chrome이 정식 출시하는 시점에 자동으로 빠른 경로를 타게 된다. */ /** 모든 Task 단계가 공통으로 받는 옵션 */ export interface TaskOptions { signal?: AbortSignal; /** * 이 기능을 쓸 수 없을 때 대신 실행할 단계. 보통 같은 일을 하도록 지시한 Agent를 준다. * * 언어 조합을 지원하지 않거나, 구형 Chrome이거나, 모델이 아직 없을 때로 넘어간다. * 주지 않으면 그 상황에서 에러를 던진다. * * ```ts * translator({ * to: 'ko', * fallback: new Agent({ instruction: '입력을 한국어로만 번역해 출력해라.' }), * }) * ``` */ fallback?: Runnable; /** 모델 다운로드 진행률(0~1). Task 모델도 첫 사용 시 내려받는다. */ onDownloadProgress?: (loaded: number) => void; } /** Runnable에 정리(destroy)를 얹은 형태. Task 모델도 다 쓰면 놓아줘야 한다. */ export interface TaskRunnable extends Runnable { destroy: () => void; } export interface TranslatorStepOptions extends TaskOptions { /** 도착어. BCP 47 태그. 예: 'ko' */ to: string; /** * 출발어. 생략하면 LanguageDetector로 입력을 보고 감지한다. * * 도착어는 감지할 수 없다(입력만 봐서는 무엇으로 바꾸길 원하는지 알 수 없다). * 그래서 to는 필수, from은 선택이다. */ from?: string; } /** * 번역 단계. 언어 조합마다 인스턴스가 따로 필요해서 다른 단계들과 모양이 조금 다르다. * * ```ts * const toKo = translator({ to: 'ko' }) * await toKo.run('Hello') // → '안녕하세요' * ``` * * 출발어와 도착어가 같으면 입력을 그대로 돌려준다(Translator.create가 던지는 조합이다). */ export declare function translator(options: TranslatorStepOptions): TaskRunnable; /** * 언어 감지 단계. 언어 코드 문자열('en', 'ko' …)을 돌려준다. * * router의 분류기 대신 쓰면 모델을 한 번 덜 부른다. * * ```ts * await languageDetector().run('Bonjour') // → 'fr' * ``` */ export declare function languageDetector(options?: TaskOptions & { expectedInputLanguages?: Array; }): TaskRunnable; export interface SummarizerStepOptions extends TaskOptions, Omit { } /** * 요약 단계. * * ```ts * const brief = summarizer({ type: 'tldr', length: 'short' }) * await brief.run(longText) * ``` * * 컨텍스트 창이 찼을 때 지난 대화를 접는 용도로도 쓴다. 요약에 모델 창을 쓰지 않으므로 * "창을 아끼려고 창을 쓰는" 문제가 생기지 않는다. */ export declare function summarizer(options?: SummarizerStepOptions): TaskRunnable; export interface WriterStepOptions extends TaskOptions, Omit { /** 매 호출에 함께 넘길 배경 설명 */ context?: string; } /** * 작성 단계. 입력을 "무엇을 써 달라"는 지시로 보고 새 글을 만든다. * * ```ts * await writer({ tone: 'formal', length: 'short' }).run('환불 요청 메일') * ``` * * Chrome 137~148 오리진 트라이얼이라 안정 버전에는 아직 없다. fallback을 같이 주는 것을 권한다. */ export declare function writer(options?: WriterStepOptions): TaskRunnable; export interface RewriterStepOptions extends TaskOptions, Omit { /** 매 호출에 함께 넘길 배경 설명 */ context?: string; } /** * 재작성 단계. 기존 글의 어조를 바꾸거나 길이를 늘리고 줄인다. * * ```ts * chain(draft, rewriter({ tone: 'more-casual', length: 'shorter' })) * ``` * * Chrome 137~148 오리진 트라이얼이라 안정 버전에는 아직 없다. */ export declare function rewriter(options?: RewriterStepOptions): TaskRunnable; export interface ProofreaderStepOptions extends TaskOptions, Omit { } export interface ProofreaderRunnable extends TaskRunnable { /** * 고친 전문뿐 아니라 어디를 왜 고쳤는지까지 받는다. * * run()은 Runnable 규약상 문자열만 돌려주므로 교정 목록이 사라진다. * 편집기에서 밑줄을 그으려면 이쪽을 써라. fallback은 적용되지 않는다. */ proofread: (input: string) => Promise; } /** * 교정 단계. 문법과 가독성을 고친다. run()은 고쳐진 글만 돌려준다. * * ```ts * const fix = proofreader({ expectedInputLanguages: ['en'] }) * await fix.run('I seen him yesterday') // → 'I saw him yesterday' * const detail = await fix.proofread('...') // 어디를 고쳤는지까지 * ``` * * Chrome 141~145 오리진 트라이얼이었고 안정 버전에는 아직 없다. */ export declare function proofreader(options?: ProofreaderStepOptions): ProofreaderRunnable;