/** * Chrome Built-in AI(Prompt API) 타입 정의. * * lib.dom.d.ts 에 아직 들어있지 않아서 우리가 실제로 쓰는 부분만 직접 선언한다. * 스펙 문서: https://developer.chrome.com/docs/ai/prompt-api */ /** 모델 사용 가능 상태. 'available' 만 즉시 사용 가능하고, 'downloadable'은 첫 create()에서 다운로드가 시작된다. */ export type Availability = 'unavailable' | 'downloadable' | 'downloading' | 'available' /** 멀티모달 입력 조각. 이미지는 Blob/Canvas/ImageBitmap, 오디오는 Blob/AudioBuffer 등이 들어간다. */ export interface PromptPart { type: 'text' | 'image' | 'audio' value: unknown } /** 대화 메시지 한 턴 */ export interface PromptMessage { role: 'system' | 'user' | 'assistant' content: string | Array /** true면 모델이 이 메시지를 "이어서" 완성한다(응답 앞부분 고정용). */ prefix?: boolean } /** 에이전트 입력: 단순 문자열이거나 멀티모달 메시지 배열 */ export type AgentInput = string | Array /** JSON Schema. 엄밀한 타입 대신 느슨하게 둔다(스키마 종류가 너무 많음). */ export type JSONSchema = Record export interface PromptOptions { signal?: AbortSignal /** JSON Schema를 주면 모델 출력이 해당 스키마로 강제된다. */ responseConstraint?: JSONSchema /** true면 스키마 자체를 프롬프트에 포함하지 않는다(토큰 절약). */ omitResponseConstraintInput?: boolean } /** LanguageModel.create()가 돌려주는 세션. 대화 히스토리는 세션이 들고 있다. */ export interface LanguageModelSession { prompt: (input: AgentInput, options?: PromptOptions) => Promise promptStreaming: (input: AgentInput, options?: PromptOptions) => AsyncIterable append: (messages: Array) => Promise clone: (options?: { signal?: AbortSignal }) => Promise destroy: () => void /** 현재 사용 중인 컨텍스트 토큰 수 */ readonly contextUsage: number /** 컨텍스트 창 최대 토큰 수 */ readonly contextWindow: number /** * 이 입력을 보내면 창을 얼마나 쓸지 미리 계산한다. 보내기 전에 넘칠지 알 수 있다. * 구형 Chrome에는 없을 수 있으므로 optional이다. */ measureContextUsage?: (input: AgentInput) => Promise addEventListener: (type: 'contextoverflow', listener: () => void) => void } /** 기대하는 입출력 modality 선언(모델 다운로드 대상을 결정한다) */ export interface ExpectedIO { type: 'text' | 'image' | 'audio' languages?: Array } export interface DownloadMonitor { addEventListener: ( type: 'downloadprogress', listener: (event: { loaded: number }) => void, ) => void } export interface CreateOptions { initialPrompts?: Array temperature?: number topK?: number signal?: AbortSignal expectedInputs?: Array expectedOutputs?: Array monitor?: (monitor: DownloadMonitor) => void } /** LanguageModel.params()가 돌려주는 모델 기본값/한계값 */ export interface ModelParams { defaultTopK: number maxTopK: number defaultTemperature: number maxTemperature: number } export interface LanguageModelStatic { availability: (options?: { expectedInputs?: Array expectedOutputs?: Array }) => Promise create: (options?: CreateOptions) => Promise params?: () => Promise } /* ──────────────────────────────────────────────────────────────────────────── * Task API — 번역/요약/언어감지 전용 기능. * * Prompt API와 달리 한 가지 일만 하도록 만들어진 별개 모델이다. 그래서 * (1) 같은 일에 더 정확하고 (2) 더 빠르며 (3) **LanguageModel의 컨텍스트 창을 * 전혀 쓰지 않는다**. 창이 수천 토큰뿐인 온디바이스 환경에서 세 번째가 가장 크다. * ──────────────────────────────────────────────────────────────────────────── */ /** create()가 공통으로 받는 옵션. 이 모델들도 첫 사용 시 다운로드된다. */ export interface TaskCreateOptions { signal?: AbortSignal monitor?: (monitor: DownloadMonitor) => void } export interface TranslatorOptions extends TaskCreateOptions { /** BCP 47 태그. 예: 'en' */ sourceLanguage: string /** BCP 47 태그. 예: 'ko'. sourceLanguage와 같으면 create()가 던진다. */ targetLanguage: string } export interface TranslatorInstance { translate: (input: string, options?: { signal?: AbortSignal }) => Promise destroy: () => void } export interface TranslatorStatic { availability: (options: { sourceLanguage: string targetLanguage: string }) => Promise create: (options: TranslatorOptions) => Promise } export interface SummarizerOptions extends TaskCreateOptions { /** 'tldr' | 'key-points' | 'teaser' | 'headline' */ type?: string /** 'markdown' | 'plain-text' */ format?: string /** 'short' | 'medium' | 'long' */ length?: string /** 모든 요약에 공통으로 깔리는 배경 설명 */ sharedContext?: string expectedInputLanguages?: Array outputLanguage?: string } export interface SummarizerInstance { summarize: ( input: string, options?: { context?: string; signal?: AbortSignal }, ) => Promise destroy: () => void } export interface SummarizerStatic { availability: (options?: SummarizerOptions) => Promise create: (options?: SummarizerOptions) => Promise } /** detect() 결과 한 건. confidence 내림차순으로 온다. */ export interface DetectedLanguage { detectedLanguage: string confidence: number } export interface LanguageDetectorInstance { detect: ( input: string, options?: { signal?: AbortSignal }, ) => Promise> destroy: () => void } export interface LanguageDetectorStatic { availability: (options?: { expectedInputLanguages?: Array }) => Promise create: ( options?: TaskCreateOptions & { expectedInputLanguages?: Array }, ) => Promise } /** write/rewrite 호출마다 줄 수 있는 배경 설명 */ export interface TaskInvokeOptions { context?: string signal?: AbortSignal } export interface WriterOptions extends TaskCreateOptions { /** 'formal' | 'neutral' | 'casual' */ tone?: string /** 'markdown' | 'plain-text' */ format?: string /** 'short' | 'medium' | 'long' */ length?: string sharedContext?: string expectedInputLanguages?: Array outputLanguage?: string } export interface WriterInstance { write: (input: string, options?: TaskInvokeOptions) => Promise destroy: () => void } export interface WriterStatic { availability: (options?: WriterOptions) => Promise create: (options?: WriterOptions) => Promise } export interface RewriterOptions extends TaskCreateOptions { /** 'more-formal' | 'as-is' | 'more-casual' */ tone?: string /** 'as-is' | 'markdown' | 'plain-text' */ format?: string /** 'shorter' | 'as-is' | 'longer' */ length?: string sharedContext?: string expectedInputLanguages?: Array outputLanguage?: string } export interface RewriterInstance { rewrite: (input: string, options?: TaskInvokeOptions) => Promise destroy: () => void } export interface RewriterStatic { availability: (options?: RewriterOptions) => Promise create: (options?: RewriterOptions) => Promise } /** 교정 한 건. 원문에서 몇 번째 글자부터 몇 번째까지가 잘못됐는지 알려준다. */ export interface ProofreadCorrection { startIndex: number endIndex: number correction?: string type?: string explanation?: string } /** proofread() 결과. 고친 전문과 어디를 왜 고쳤는지가 같이 온다. */ export interface ProofreadResult { correctedInput: string corrections: Array } export interface ProofreaderOptions extends TaskCreateOptions { expectedInputLanguages?: Array includeCorrectionTypes?: boolean includeCorrectionExplanations?: boolean } export interface ProofreaderInstance { proofread: ( input: string, options?: { signal?: AbortSignal }, ) => Promise destroy: () => void } export interface ProofreaderStatic { availability: (options?: ProofreaderOptions) => Promise create: (options?: ProofreaderOptions) => Promise } declare global { /** Chrome 138+ 에서 노출되는 전역. 미지원 브라우저에서는 undefined. */ var LanguageModel: LanguageModelStatic | undefined var Translator: TranslatorStatic | undefined var Summarizer: SummarizerStatic | undefined var LanguageDetector: LanguageDetectorStatic | undefined /** Chrome 137~148 오리진 트라이얼. 안정 버전에는 아직 없다. */ var Writer: WriterStatic | undefined var Rewriter: RewriterStatic | undefined /** Chrome 141~145 오리진 트라이얼. 안정 버전에는 아직 없다. */ var Proofreader: ProofreaderStatic | undefined }