import type { Stream } from "effect" import { Media } from "../src/effect.js" import { Transcription, TranscriptionModel, type TranscriptionEvent, type TranscriptionOptions, } from "../src/experimental.js" import { AssemblyAI, Deepgram, OpenAI } from "../src/providers.js" type StreamItem = T extends Stream.Stream ? A : never type Equal = [A, B] extends [B, A] ? true : false type Assert = T const audio = Media.url("https://example.com/call.mp3") const deepgram = Deepgram.configure({ apiKey: "test" }).transcription("nova-3") const widenTranscription = ( model: TranscriptionModel, ): TranscriptionModel => model void widenTranscription Transcription.generate({ model: deepgram, audio, timestamps: "word", providerOptions: { keyterm: ["OpenCode"], diarize_model: "future-model", futureOption: true }, }) Transcription.start({ model: AssemblyAI.configure({ apiKey: "test" }).transcription("universal-3-5-pro"), audio }) // @ts-expect-error Known provider options are inferred from the selected model. Transcription.generate({ model: deepgram, audio, providerOptions: { keyterm: "OpenCode" } }) // @ts-expect-error Timestamp granularity is a closed set. Transcription.generate({ model: deepgram, audio, timestamps: "character" }) // @ts-expect-error Audio is required. Transcription.request({ model: deepgram }) // @ts-expect-error Speech models cannot be used for transcription requests. Transcription.request({ model: OpenAI.configure({ apiKey: "test" }).speech("gpt-4o-mini-tts"), audio }) const streamed = Transcription.stream({ model: OpenAI.configure({ apiKey: "test" }).transcription("gpt-transcribe"), audio, }) type StreamEvent = Assert, TranscriptionEvent>> void (true satisfies StreamEvent)