@moureau/pipeflow 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +833 -0
- package/dist/cjs/agents/agent.js +2 -0
- package/dist/cjs/agents/agent.js.map +7 -0
- package/dist/cjs/agents/index.js +2 -0
- package/dist/cjs/agents/index.js.map +7 -0
- package/dist/cjs/agents/tools/index.js +2 -0
- package/dist/cjs/agents/tools/index.js.map +7 -0
- package/dist/cjs/agents/tools/tools.js +2 -0
- package/dist/cjs/agents/tools/tools.js.map +7 -0
- package/dist/cjs/conversations/conversation/conversation.js +2 -0
- package/dist/cjs/conversations/conversation/conversation.js.map +7 -0
- package/dist/cjs/conversations/conversation/index.js +2 -0
- package/dist/cjs/conversations/conversation/index.js.map +7 -0
- package/dist/cjs/conversations/conversations.js +2 -0
- package/dist/cjs/conversations/conversations.js.map +7 -0
- package/dist/cjs/conversations/index.js +2 -0
- package/dist/cjs/conversations/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/index.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/orchestrator.js +3 -0
- package/dist/cjs/conversations/orchestration/orchestrator/orchestrator.js.map +7 -0
- package/dist/cjs/conversations/transcription/index.js +2 -0
- package/dist/cjs/conversations/transcription/index.js.map +7 -0
- package/dist/cjs/conversations/transcription/transcription.js +2 -0
- package/dist/cjs/conversations/transcription/transcription.js.map +7 -0
- package/dist/cjs/conversations/types.js +2 -0
- package/dist/cjs/conversations/types.js.map +7 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/persistence/adapters/index.js +2 -0
- package/dist/cjs/persistence/adapters/index.js.map +7 -0
- package/dist/cjs/persistence/adapters/memory/index.js +2 -0
- package/dist/cjs/persistence/adapters/memory/index.js.map +7 -0
- package/dist/cjs/persistence/adapters/memory/memory.js +2 -0
- package/dist/cjs/persistence/adapters/memory/memory.js.map +7 -0
- package/dist/cjs/persistence/adapters/sqlite/index.js +2 -0
- package/dist/cjs/persistence/adapters/sqlite/index.js.map +7 -0
- package/dist/cjs/persistence/adapters/sqlite/sqlite.js +58 -0
- package/dist/cjs/persistence/adapters/sqlite/sqlite.js.map +7 -0
- package/dist/cjs/persistence/index.js +2 -0
- package/dist/cjs/persistence/index.js.map +7 -0
- package/dist/cjs/persistence/persistence.js +2 -0
- package/dist/cjs/persistence/persistence.js.map +7 -0
- package/dist/cjs/providers/index.js +2 -0
- package/dist/cjs/providers/index.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/deepseek/deepseek.js +2 -0
- package/dist/cjs/providers/llm/adapters/deepseek/deepseek.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/deepseek/index.js +2 -0
- package/dist/cjs/providers/llm/adapters/deepseek/index.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/index.js +2 -0
- package/dist/cjs/providers/llm/adapters/index.js.map +7 -0
- package/dist/cjs/providers/llm/index.js +2 -0
- package/dist/cjs/providers/llm/index.js.map +7 -0
- package/dist/cjs/providers/llm/types.js +2 -0
- package/dist/cjs/providers/llm/types.js.map +7 -0
- package/dist/cjs/providers/shared.js +2 -0
- package/dist/cjs/providers/shared.js.map +7 -0
- package/dist/cjs/providers/stt/adapters/deepgram/deepgram.js +2 -0
- package/dist/cjs/providers/stt/adapters/deepgram/deepgram.js.map +7 -0
- package/dist/cjs/providers/stt/adapters/deepgram/index.js +2 -0
- package/dist/cjs/providers/stt/adapters/deepgram/index.js.map +7 -0
- package/dist/cjs/providers/stt/adapters/index.js +2 -0
- package/dist/cjs/providers/stt/adapters/index.js.map +7 -0
- package/dist/cjs/providers/stt/index.js +2 -0
- package/dist/cjs/providers/stt/index.js.map +7 -0
- package/dist/cjs/providers/stt/types.js +2 -0
- package/dist/cjs/providers/stt/types.js.map +7 -0
- package/dist/cjs/providers/tts/adapters/index.js +2 -0
- package/dist/cjs/providers/tts/adapters/index.js.map +7 -0
- package/dist/cjs/providers/tts/adapters/kokoro/index.js +2 -0
- package/dist/cjs/providers/tts/adapters/kokoro/index.js.map +7 -0
- package/dist/cjs/providers/tts/adapters/kokoro/kokoro.js +2 -0
- package/dist/cjs/providers/tts/adapters/kokoro/kokoro.js.map +7 -0
- package/dist/cjs/providers/tts/index.js +2 -0
- package/dist/cjs/providers/tts/index.js.map +7 -0
- package/dist/cjs/providers/tts/types.js +2 -0
- package/dist/cjs/providers/tts/types.js.map +7 -0
- package/dist/cjs/transport/adapters/index.js +2 -0
- package/dist/cjs/transport/adapters/index.js.map +7 -0
- package/dist/cjs/transport/adapters/memory/index.js +2 -0
- package/dist/cjs/transport/adapters/memory/index.js.map +7 -0
- package/dist/cjs/transport/adapters/memory/memory.js +2 -0
- package/dist/cjs/transport/adapters/memory/memory.js.map +7 -0
- package/dist/cjs/transport/index.js +2 -0
- package/dist/cjs/transport/index.js.map +7 -0
- package/dist/cjs/transport/types.js +2 -0
- package/dist/cjs/transport/types.js.map +7 -0
- package/dist/esm/agents/agent.js +2 -0
- package/dist/esm/agents/agent.js.map +7 -0
- package/dist/esm/agents/index.js +2 -0
- package/dist/esm/agents/index.js.map +7 -0
- package/dist/esm/agents/tools/index.js +2 -0
- package/dist/esm/agents/tools/index.js.map +7 -0
- package/dist/esm/agents/tools/tools.js +2 -0
- package/dist/esm/agents/tools/tools.js.map +7 -0
- package/dist/esm/conversations/conversation/conversation.js +2 -0
- package/dist/esm/conversations/conversation/conversation.js.map +7 -0
- package/dist/esm/conversations/conversation/index.js +2 -0
- package/dist/esm/conversations/conversation/index.js.map +7 -0
- package/dist/esm/conversations/conversations.js +2 -0
- package/dist/esm/conversations/conversations.js.map +7 -0
- package/dist/esm/conversations/index.js +2 -0
- package/dist/esm/conversations/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/index.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/orchestrator.js +3 -0
- package/dist/esm/conversations/orchestration/orchestrator/orchestrator.js.map +7 -0
- package/dist/esm/conversations/transcription/index.js +2 -0
- package/dist/esm/conversations/transcription/index.js.map +7 -0
- package/dist/esm/conversations/transcription/transcription.js +2 -0
- package/dist/esm/conversations/transcription/transcription.js.map +7 -0
- package/dist/esm/conversations/types.js +2 -0
- package/dist/esm/conversations/types.js.map +7 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/persistence/adapters/index.js +2 -0
- package/dist/esm/persistence/adapters/index.js.map +7 -0
- package/dist/esm/persistence/adapters/memory/index.js +2 -0
- package/dist/esm/persistence/adapters/memory/index.js.map +7 -0
- package/dist/esm/persistence/adapters/memory/memory.js +2 -0
- package/dist/esm/persistence/adapters/memory/memory.js.map +7 -0
- package/dist/esm/persistence/adapters/sqlite/index.js +2 -0
- package/dist/esm/persistence/adapters/sqlite/index.js.map +7 -0
- package/dist/esm/persistence/adapters/sqlite/sqlite.js +58 -0
- package/dist/esm/persistence/adapters/sqlite/sqlite.js.map +7 -0
- package/dist/esm/persistence/index.js +2 -0
- package/dist/esm/persistence/index.js.map +7 -0
- package/dist/esm/persistence/persistence.js +1 -0
- package/dist/esm/persistence/persistence.js.map +7 -0
- package/dist/esm/providers/index.js +2 -0
- package/dist/esm/providers/index.js.map +7 -0
- package/dist/esm/providers/llm/adapters/deepseek/deepseek.js +2 -0
- package/dist/esm/providers/llm/adapters/deepseek/deepseek.js.map +7 -0
- package/dist/esm/providers/llm/adapters/deepseek/index.js +2 -0
- package/dist/esm/providers/llm/adapters/deepseek/index.js.map +7 -0
- package/dist/esm/providers/llm/adapters/index.js +2 -0
- package/dist/esm/providers/llm/adapters/index.js.map +7 -0
- package/dist/esm/providers/llm/index.js +2 -0
- package/dist/esm/providers/llm/index.js.map +7 -0
- package/dist/esm/providers/llm/types.js +1 -0
- package/dist/esm/providers/llm/types.js.map +7 -0
- package/dist/esm/providers/shared.js +1 -0
- package/dist/esm/providers/shared.js.map +7 -0
- package/dist/esm/providers/stt/adapters/deepgram/deepgram.js +2 -0
- package/dist/esm/providers/stt/adapters/deepgram/deepgram.js.map +7 -0
- package/dist/esm/providers/stt/adapters/deepgram/index.js +2 -0
- package/dist/esm/providers/stt/adapters/deepgram/index.js.map +7 -0
- package/dist/esm/providers/stt/adapters/index.js +2 -0
- package/dist/esm/providers/stt/adapters/index.js.map +7 -0
- package/dist/esm/providers/stt/index.js +2 -0
- package/dist/esm/providers/stt/index.js.map +7 -0
- package/dist/esm/providers/stt/types.js +1 -0
- package/dist/esm/providers/stt/types.js.map +7 -0
- package/dist/esm/providers/tts/adapters/index.js +2 -0
- package/dist/esm/providers/tts/adapters/index.js.map +7 -0
- package/dist/esm/providers/tts/adapters/kokoro/index.js +2 -0
- package/dist/esm/providers/tts/adapters/kokoro/index.js.map +7 -0
- package/dist/esm/providers/tts/adapters/kokoro/kokoro.js +2 -0
- package/dist/esm/providers/tts/adapters/kokoro/kokoro.js.map +7 -0
- package/dist/esm/providers/tts/index.js +2 -0
- package/dist/esm/providers/tts/index.js.map +7 -0
- package/dist/esm/providers/tts/types.js +1 -0
- package/dist/esm/providers/tts/types.js.map +7 -0
- package/dist/esm/transport/adapters/index.js +2 -0
- package/dist/esm/transport/adapters/index.js.map +7 -0
- package/dist/esm/transport/adapters/memory/index.js +2 -0
- package/dist/esm/transport/adapters/memory/index.js.map +7 -0
- package/dist/esm/transport/adapters/memory/memory.js +2 -0
- package/dist/esm/transport/adapters/memory/memory.js.map +7 -0
- package/dist/esm/transport/index.js +2 -0
- package/dist/esm/transport/index.js.map +7 -0
- package/dist/esm/transport/types.js +1 -0
- package/dist/esm/transport/types.js.map +7 -0
- package/dist/types/agents/agent.d.ts +60 -0
- package/dist/types/agents/index.d.ts +4 -0
- package/dist/types/agents/tools/index.d.ts +2 -0
- package/dist/types/agents/tools/tools.d.ts +22 -0
- package/dist/types/conversations/conversation/conversation.d.ts +138 -0
- package/dist/types/conversations/conversation/index.d.ts +2 -0
- package/dist/types/conversations/conversations.d.ts +23 -0
- package/dist/types/conversations/index.d.ts +10 -0
- package/dist/types/conversations/orchestration/orchestrator/index.d.ts +2 -0
- package/dist/types/conversations/orchestration/orchestrator/orchestrator.d.ts +98 -0
- package/dist/types/conversations/transcription/index.d.ts +2 -0
- package/dist/types/conversations/transcription/transcription.d.ts +59 -0
- package/dist/types/conversations/types.d.ts +63 -0
- package/dist/types/index.d.ts +45 -0
- package/dist/types/persistence/adapters/index.d.ts +2 -0
- package/dist/types/persistence/adapters/memory/index.d.ts +1 -0
- package/dist/types/persistence/adapters/memory/memory.d.ts +27 -0
- package/dist/types/persistence/adapters/sqlite/index.d.ts +2 -0
- package/dist/types/persistence/adapters/sqlite/sqlite.d.ts +31 -0
- package/dist/types/persistence/index.d.ts +2 -0
- package/dist/types/persistence/persistence.d.ts +38 -0
- package/dist/types/providers/index.d.ts +6 -0
- package/dist/types/providers/llm/adapters/deepseek/deepseek.d.ts +24 -0
- package/dist/types/providers/llm/adapters/deepseek/index.d.ts +2 -0
- package/dist/types/providers/llm/adapters/index.d.ts +1 -0
- package/dist/types/providers/llm/index.d.ts +10 -0
- package/dist/types/providers/llm/types.d.ts +55 -0
- package/dist/types/providers/shared.d.ts +8 -0
- package/dist/types/providers/stt/adapters/deepgram/deepgram.d.ts +57 -0
- package/dist/types/providers/stt/adapters/deepgram/index.d.ts +2 -0
- package/dist/types/providers/stt/adapters/index.d.ts +1 -0
- package/dist/types/providers/stt/index.d.ts +2 -0
- package/dist/types/providers/stt/types.d.ts +30 -0
- package/dist/types/providers/tts/adapters/index.d.ts +1 -0
- package/dist/types/providers/tts/adapters/kokoro/index.d.ts +2 -0
- package/dist/types/providers/tts/adapters/kokoro/kokoro.d.ts +34 -0
- package/dist/types/providers/tts/index.d.ts +2 -0
- package/dist/types/providers/tts/types.d.ts +16 -0
- package/dist/types/transport/adapters/index.d.ts +1 -0
- package/dist/types/transport/adapters/memory/index.d.ts +1 -0
- package/dist/types/transport/adapters/memory/memory.d.ts +20 -0
- package/dist/types/transport/index.d.ts +2 -0
- package/dist/types/transport/types.d.ts +49 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var l=Object.defineProperty;var s=(t,e)=>l(t,"name",{value:e,configurable:!0});class f{static{s(this,"DeepgramSTT")}options;sessions=new Set;constructor(e){if(!e.apiKey)throw new Error("DeepgramSTT requires an apiKey");this.options=e}start(e={}){const n={...this.options,...e},r=c(n),o=n.createSocket??(d=>new WebSocket(d)),i=new p(o(r));return this.sessions.add(i),i.on("close",()=>{this.sessions.delete(i)}),i}cancel(){for(const e of[...this.sessions])e.abort()}}class p{static{s(this,"DeepgramSession")}socket;listeners=new Map;opened=!1;closed=!1;ended=!1;pendingClose={flag:!1};queued=[];endPromise;resolveEnd;constructor(e){this.socket=e,this.endPromise=new Promise(n=>{this.resolveEnd=n}),e.addEventListener("open",()=>{this.opened=!0;for(const n of this.queued)this.socket.send(a(n));this.queued.length=0,this.pendingClose.flag&&this.sendCloseStream()}),e.addEventListener("message",n=>{const r=v(n.data);if(r!==null)try{this.handleResult(JSON.parse(r))}catch{}}),e.addEventListener("error",()=>{this.emit("error",new Error("Deepgram socket error"))}),e.addEventListener("close",()=>{this.closed=!0,this.resolveEnd(),this.emit("close")})}write(e){if(this.closed)throw new Error("Deepgram session is closed");if(!this.opened){this.queued.push(e);return}this.socket.send(a(e))}async end(){if(!this.closed)return this.ended?this.endPromise:(this.ended=!0,this.opened?(this.sendCloseStream(),this.endPromise):(this.pendingClose.flag=!0,this.endPromise))}abort(){this.closed||this.socket.close()}on(e,n){let r=this.listeners.get(e);r||(r=new Set,this.listeners.set(e,r)),r.add(n)}handleResult(e){if(e.type!=="Results")return;const r=e.channel?.alternatives?.[0]?.transcript??"";r&&(e.is_final===!0?this.emit("final",r):this.emit("partial",r))}sendCloseStream(){this.socket.send(JSON.stringify({type:"CloseStream"}))}emit(e,...n){const r=this.listeners.get(e);if(r)for(const o of[...r])o(...n)}}function c(t){const e=new URLSearchParams;return e.set("model",t.model??"nova-3"),e.set("interim_results",t.interimResults??!0?"true":"false"),e.set("encoding",t.encoding??"linear16"),e.set("sample_rate",String(t.sampleRate??16e3)),e.set("punctuate","true"),t.language&&e.set("language",t.language),e.set("token",t.apiKey),`${(t.endpoint??"wss://api.deepgram.com/v1/listen").replace(/\/+$/,"")}?${e.toString()}`}s(c,"buildListenUrl");function a(t){const e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}s(a,"toArrayBuffer");function v(t){return typeof t=="string"?t:t instanceof ArrayBuffer?new TextDecoder().decode(t):ArrayBuffer.isView(t)?new TextDecoder().decode(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)):null}s(v,"decodeMessage");export{f as DeepgramSTT,p as DeepgramSession};
|
|
2
|
+
//# sourceMappingURL=deepgram.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/stt/adapters/deepgram/deepgram.ts"],
|
|
4
|
+
"sourcesContent": ["import type { STT, STTOptions, STTSession } from \"../../types\";\n\n/**\n * The minimal WebSocket surface used by the Deepgram adapter. Both the global\n * `WebSocket` (Bun) and test fakes satisfy this shape.\n */\nexport interface STTSocket {\n send(data: string | ArrayBuffer | ArrayBufferView): void;\n close(code?: number, reason?: string): void;\n addEventListener(\n type: string,\n listener: (event: { data?: unknown; error?: unknown }) => void,\n ): void;\n}\n\nexport interface DeepgramOptions extends STTOptions {\n apiKey: string;\n /** Defaults to `wss://api.deepgram.com/v1/listen`. */\n endpoint?: string;\n /** Injectable socket factory, mainly for tests. */\n createSocket?: (url: string) => STTSocket;\n}\n\ntype DeepgramEvent = \"partial\" | \"final\" | \"error\" | \"close\";\n\n/**\n * Deepgram streaming STT adapter (WebSocket).\n *\n * Audio written before the socket opens is queued and flushed on connect.\n * `end()` sends a `CloseStream` frame and resolves once the server closes\n * the socket.\n */\nexport class DeepgramSTT implements STT {\n private readonly options: DeepgramOptions;\n private readonly sessions = new Set<DeepgramSession>();\n\n constructor(options: DeepgramOptions) {\n if (!options.apiKey) {\n throw new Error(\"DeepgramSTT requires an apiKey\");\n }\n this.options = options;\n }\n\n start(options: STTOptions = {}): STTSession {\n const merged: DeepgramOptions = { ...this.options, ...options };\n const url = buildListenUrl(merged);\n const createSocket = merged.createSocket ?? ((target: string) => new WebSocket(target) as unknown as STTSocket);\n const session = new DeepgramSession(createSocket(url));\n this.sessions.add(session);\n session.on(\"close\", () => {\n this.sessions.delete(session);\n });\n return session;\n }\n\n cancel(): void {\n for (const session of [...this.sessions]) {\n session.abort();\n }\n }\n}\n\nexport class DeepgramSession implements STTSession {\n private readonly socket: STTSocket;\n private readonly listeners = new Map<DeepgramEvent, Set<(...args: any[]) => void>>();\n private opened = false;\n private closed = false;\n private ended = false;\n private readonly pendingClose = { flag: false };\n private readonly queued: Uint8Array[] = [];\n private readonly endPromise: Promise<void>;\n private resolveEnd!: () => void;\n\n constructor(socket: STTSocket) {\n this.socket = socket;\n this.endPromise = new Promise((resolve) => {\n this.resolveEnd = resolve;\n });\n\n socket.addEventListener(\"open\", () => {\n this.opened = true;\n for (const audio of this.queued) {\n this.socket.send(toArrayBuffer(audio));\n }\n this.queued.length = 0;\n if (this.pendingClose.flag) {\n this.sendCloseStream();\n }\n });\n\n socket.addEventListener(\"message\", (event) => {\n const text = decodeMessage(event.data);\n if (text === null) return;\n try {\n this.handleResult(JSON.parse(text));\n } catch {\n // Ignore malformed frames.\n }\n });\n\n socket.addEventListener(\"error\", () => {\n this.emit(\"error\", new Error(\"Deepgram socket error\"));\n });\n\n socket.addEventListener(\"close\", () => {\n this.closed = true;\n this.resolveEnd();\n this.emit(\"close\");\n });\n }\n\n write(audio: Uint8Array): void {\n if (this.closed) {\n throw new Error(\"Deepgram session is closed\");\n }\n if (!this.opened) {\n this.queued.push(audio);\n return;\n }\n this.socket.send(toArrayBuffer(audio));\n }\n\n async end(): Promise<void> {\n if (this.closed) return;\n if (this.ended) return this.endPromise;\n this.ended = true;\n if (!this.opened) {\n this.pendingClose.flag = true;\n return this.endPromise;\n }\n this.sendCloseStream();\n return this.endPromise;\n }\n\n /** Force-close the session without waiting for the server. */\n abort(): void {\n if (this.closed) return;\n this.socket.close();\n }\n\n on(event: \"partial\", listener: (transcript: string) => void): void;\n on(event: \"final\", listener: (transcript: string) => void): void;\n on(event: \"error\", listener: (error: Error) => void): void;\n on(event: \"close\", listener: () => void): void;\n on(event: DeepgramEvent, listener: (...args: any[]) => void): void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener);\n }\n\n private handleResult(message: Record<string, unknown>): void {\n if (message.type !== \"Results\") return;\n const alternatives = (message.channel as { alternatives?: { transcript?: string }[] })\n ?.alternatives;\n const text = alternatives?.[0]?.transcript ?? \"\";\n if (!text) return;\n if (message.is_final === true) {\n this.emit(\"final\", text);\n } else {\n this.emit(\"partial\", text);\n }\n }\n\n private sendCloseStream(): void {\n this.socket.send(JSON.stringify({ type: \"CloseStream\" }));\n }\n\n private emit(event: \"partial\", arg: string): void;\n private emit(event: \"final\", arg: string): void;\n private emit(event: \"error\", arg: Error): void;\n private emit(event: \"close\"): void;\n private emit(event: DeepgramEvent, ...args: any[]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const listener of [...set]) {\n listener(...args);\n }\n }\n}\n\nfunction buildListenUrl(options: DeepgramOptions): string {\n const params = new URLSearchParams();\n params.set(\"model\", options.model ?? \"nova-3\");\n params.set(\"interim_results\", (options.interimResults ?? true) ? \"true\" : \"false\");\n params.set(\"encoding\", options.encoding ?? \"linear16\");\n params.set(\"sample_rate\", String(options.sampleRate ?? 16000));\n params.set(\"punctuate\", \"true\");\n if (options.language) params.set(\"language\", options.language);\n params.set(\"token\", options.apiKey);\n\n const base = (options.endpoint ?? \"wss://api.deepgram.com/v1/listen\").replace(/\\/+$/, \"\");\n return `${base}?${params.toString()}`;\n}\n\nfunction toArrayBuffer(audio: Uint8Array): ArrayBuffer {\n // Copy so the view's backing buffer (possibly larger or shared) is not\n // sent over the socket.\n const copy = new Uint8Array(audio.byteLength);\n copy.set(audio);\n return copy.buffer;\n}\n\nfunction decodeMessage(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength),\n );\n }\n return null;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeepgramSTT", "__name", "options", "merged", "url", "buildListenUrl", "createSocket", "target", "session", "DeepgramSession", "socket", "resolve", "audio", "toArrayBuffer", "event", "text", "decodeMessage", "listener", "set", "message", "args", "params", "copy", "data"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/stt/adapters/deepgram/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { DeepgramSTT, DeepgramSession } from \"./deepgram\";\nexport type { DeepgramOptions, STTSocket } from \"./deepgram\";\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,eAAAA,EAAa,mBAAAC,MAAuB",
|
|
6
|
+
"names": ["DeepgramSTT", "DeepgramSession"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/providers/stt/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type { STT, STTOptions, STTSession } from \"./types\";\nexport { DeepgramSTT } from \"./adapters/index\";\n"],
|
|
5
|
+
"mappings": "AACA,OAAS,eAAAA,MAAmB",
|
|
6
|
+
"names": ["DeepgramSTT"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/tts/adapters/kokoro/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { KokoroTTS } from \"./kokoro\";\nexport type { KokoroOptions } from \"./kokoro\";\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,aAAAA,MAAiB",
|
|
6
|
+
"names": ["KokoroTTS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var h=Object.defineProperty;var n=(i,e)=>h(i,"name",{value:e,configurable:!0});class d{static{n(this,"KokoroTTS")}baseUrl;voice;model;apiKey;chunkSize;fetchImpl;abort=null;constructor(e={}){this.baseUrl=(e.baseUrl??"http://localhost:8880").replace(/\/+$/,""),this.voice=e.voice??"af_heart",this.model=e.model??"kokoro",this.apiKey=e.apiKey,this.chunkSize=e.chunkSize??8192,this.fetchImpl=e.fetch??fetch}stop(){this.abort?.abort()}async*stream(e){if(!e.text)throw new Error("KokoroTTS requires request.text");this.abort?.abort();const t=new AbortController;this.abort=t;try{const o=await this.fetchImpl(`${this.baseUrl}/v1/audio/speech`,{method:"POST",headers:{"content-type":"application/json",...this.apiKey?{authorization:`Bearer ${this.apiKey}`}:{}},body:JSON.stringify({model:this.model,input:e.text,voice:e.voice??this.voice,response_format:e.format,speed:e.speed}),signal:t.signal});if(!o.ok){const a=await o.text();throw new Error(`Kokoro request failed (${o.status}): ${a}`)}if(!o.body)throw new Error("Kokoro returned an empty body");const s=o.body.getReader();let r=new Uint8Array(0);for(;;){if(t.signal.aborted)throw new DOMException("The operation was aborted.","AbortError");const{done:a,value:l}=await s.read();if(a)break;for(r=c(r,l);r.length>=this.chunkSize;)yield r.slice(0,this.chunkSize),r=r.slice(this.chunkSize)}r.length>0&&(yield r)}finally{this.abort===t&&(this.abort=null)}}}function c(i,e){const t=new Uint8Array(i.length+e.length);return t.set(i),t.set(e,i.length),t}n(c,"concat");export{d as KokoroTTS};
|
|
2
|
+
//# sourceMappingURL=kokoro.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/tts/adapters/kokoro/kokoro.ts"],
|
|
4
|
+
"sourcesContent": ["import type { TTS, TTSRequest } from \"../../types\";\nimport type { FetchLike } from \"../../../shared\";\n\nexport interface KokoroOptions {\n /**\n * Base URL of a Kokoro TTS server exposing the OpenAI-compatible\n * `/v1/audio/speech` endpoint. Defaults to a local kokoro-fastapi server.\n */\n baseUrl?: string;\n /** Default voice, e.g. `af_heart`. */\n voice?: string;\n model?: string;\n apiKey?: string;\n /** Size of the audio chunks yielded from the response stream. */\n chunkSize?: number;\n /** Injectable fetch implementation, mainly for tests. */\n fetch?: FetchLike;\n}\n\n/**\n * Kokoro TTS adapter. Consumes a Kokoro server's OpenAI-compatible speech\n * endpoint and re-chunks the returned audio so it can be played as it\n * arrives.\n */\nexport class KokoroTTS implements TTS {\n private readonly baseUrl: string;\n private readonly voice: string;\n private readonly model: string;\n private readonly apiKey: string | undefined;\n private readonly chunkSize: number;\n private readonly fetchImpl: FetchLike;\n private abort: AbortController | null = null;\n\n constructor(options: KokoroOptions = {}) {\n this.baseUrl = (options.baseUrl ?? \"http://localhost:8880\").replace(/\\/+$/, \"\");\n this.voice = options.voice ?? \"af_heart\";\n this.model = options.model ?? \"kokoro\";\n this.apiKey = options.apiKey;\n this.chunkSize = options.chunkSize ?? 8192;\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n stop(): void {\n this.abort?.abort();\n }\n\n async *stream(request: TTSRequest): AsyncGenerator<Uint8Array> {\n if (!request.text) {\n throw new Error(\"KokoroTTS requires request.text\");\n }\n\n this.abort?.abort();\n const controller = new AbortController();\n this.abort = controller;\n\n try {\n const response = await this.fetchImpl(`${this.baseUrl}/v1/audio/speech`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(this.apiKey ? { authorization: `Bearer ${this.apiKey}` } : {}),\n },\n body: JSON.stringify({\n model: this.model,\n input: request.text,\n voice: request.voice ?? this.voice,\n response_format: request.format,\n speed: request.speed,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Kokoro request failed (${response.status}): ${body}`);\n }\n if (!response.body) {\n throw new Error(\"Kokoro returned an empty body\");\n }\n\n const reader = response.body.getReader();\n let buffer: Uint8Array<ArrayBuffer> = new Uint8Array(0);\n\n while (true) {\n if (controller.signal.aborted) {\n throw new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n const { done, value } = await reader.read();\n if (done) break;\n buffer = concat(buffer, value);\n while (buffer.length >= this.chunkSize) {\n yield buffer.slice(0, this.chunkSize);\n buffer = buffer.slice(this.chunkSize);\n }\n }\n\n if (buffer.length > 0) {\n yield buffer;\n }\n } finally {\n if (this.abort === controller) {\n this.abort = null;\n }\n }\n }\n}\n\nfunction concat(\n a: Uint8Array<ArrayBufferLike>,\n b: Uint8Array<ArrayBufferLike>,\n): Uint8Array<ArrayBuffer> {\n const out = new Uint8Array(a.length + b.length);\n out.set(a);\n out.set(b, a.length);\n return out;\n}\n"],
|
|
5
|
+
"mappings": "+EAwBO,MAAMA,CAAyB,CAxBtC,MAwBsC,CAAAC,EAAA,kBACnB,QACA,MACA,MACA,OACA,UACA,UACT,MAAgC,KAExC,YAAYC,EAAyB,CAAC,EAAG,CACvC,KAAK,SAAWA,EAAQ,SAAW,yBAAyB,QAAQ,OAAQ,EAAE,EAC9E,KAAK,MAAQA,EAAQ,OAAS,WAC9B,KAAK,MAAQA,EAAQ,OAAS,SAC9B,KAAK,OAASA,EAAQ,OACtB,KAAK,UAAYA,EAAQ,WAAa,KACtC,KAAK,UAAYA,EAAQ,OAAS,KACpC,CAEA,MAAa,CACX,KAAK,OAAO,MAAM,CACpB,CAEA,MAAO,OAAOC,EAAiD,CAC7D,GAAI,CAACA,EAAQ,KACX,MAAM,IAAI,MAAM,iCAAiC,EAGnD,KAAK,OAAO,MAAM,EAClB,MAAMC,EAAa,IAAI,gBACvB,KAAK,MAAQA,EAEb,GAAI,CACF,MAAMC,EAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,mBAAoB,CACvE,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,GAAI,KAAK,OAAS,CAAE,cAAe,UAAU,KAAK,MAAM,EAAG,EAAI,CAAC,CAClE,EACA,KAAM,KAAK,UAAU,CACnB,MAAO,KAAK,MACZ,MAAOF,EAAQ,KACf,MAAOA,EAAQ,OAAS,KAAK,MAC7B,gBAAiBA,EAAQ,OACzB,MAAOA,EAAQ,KACjB,CAAC,EACD,OAAQC,EAAW,MACrB,CAAC,EAED,GAAI,CAACC,EAAS,GAAI,CAChB,MAAMC,EAAO,MAAMD,EAAS,KAAK,EACjC,MAAM,IAAI,MAAM,0BAA0BA,EAAS,MAAM,MAAMC,CAAI,EAAE,CACvE,CACA,GAAI,CAACD,EAAS,KACZ,MAAM,IAAI,MAAM,+BAA+B,EAGjD,MAAME,EAASF,EAAS,KAAK,UAAU,EACvC,IAAIG,EAAkC,IAAI,WAAW,CAAC,EAEtD,OAAa,CACX,GAAIJ,EAAW,OAAO,QACpB,MAAM,IAAI,aAAa,6BAA8B,YAAY,EAEnE,KAAM,CAAE,KAAAK,EAAM,MAAAC,CAAM,EAAI,MAAMH,EAAO,KAAK,EAC1C,GAAIE,EAAM,MAEV,IADAD,EAASG,EAAOH,EAAQE,CAAK,EACtBF,EAAO,QAAU,KAAK,WAC3B,MAAMA,EAAO,MAAM,EAAG,KAAK,SAAS,EACpCA,EAASA,EAAO,MAAM,KAAK,SAAS,CAExC,CAEIA,EAAO,OAAS,IAClB,MAAMA,EAEV,QAAE,CACI,KAAK,QAAUJ,IACjB,KAAK,MAAQ,KAEjB,CACF,CACF,CAEA,SAASO,EACPC,EACAC,EACyB,CACzB,MAAMC,EAAM,IAAI,WAAWF,EAAE,OAASC,EAAE,MAAM,EAC9C,OAAAC,EAAI,IAAIF,CAAC,EACTE,EAAI,IAAID,EAAGD,EAAE,MAAM,EACZE,CACT,CARSb,EAAAU,EAAA",
|
|
6
|
+
"names": ["KokoroTTS", "__name", "options", "request", "controller", "response", "body", "reader", "buffer", "done", "value", "concat", "a", "b", "out"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/providers/tts/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type { TTS, TTSRequest } from \"./types\";\nexport { KokoroTTS } from \"./adapters/index\";\n"],
|
|
5
|
+
"mappings": "AACA,OAAS,aAAAA,MAAiB",
|
|
6
|
+
"names": ["KokoroTTS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var n=Object.defineProperty;var t=(o,e)=>n(o,"name",{value:e,configurable:!0});class r{static{t(this,"MemoryTransport")}peer=null;listeners=new Set;closed=!1;static pair(){const e=new r,s=new r;return e.peer=s,s.peer=e,[e,s]}get isClosed(){return this.closed}send(e){if(this.closed)throw new Error("Cannot send on a closed transport");const s=this.peer;if(!s)throw new Error("Transport has no peer to send to");if(s.closed)throw new Error("Cannot send to a closed peer transport");s.deliver(e)}onMessage(e){if(this.closed)throw new Error("Cannot subscribe to a closed transport");return this.listeners.add(e),()=>{this.listeners.delete(e)}}async close(){if(this.closed)return;this.closed=!0,this.listeners.clear();const e=this.peer;this.peer=null,e&&!e.closed&&await e.close()}deliver(e){for(const s of[...this.listeners])try{s(e)}catch{}}}export{r as MemoryTransport};
|
|
2
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transport/adapters/memory/memory.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Message, Transport } from \"../../types\";\n\n/**\n * In-process transport used for tests and development.\n *\n * A `MemoryTransport` is always half of a connection: messages sent on one\n * end are delivered to the listeners of the peer end. Use `pair()` to create\n * two connected ends, or `MemoryTransport.pair()` directly.\n */\nexport class MemoryTransport implements Transport {\n private peer: MemoryTransport | null = null;\n private readonly listeners = new Set<(message: Message) => void>();\n private closed = false;\n\n /** Create a pair of connected transports. */\n static pair(): [MemoryTransport, MemoryTransport] {\n const a = new MemoryTransport();\n const b = new MemoryTransport();\n a.peer = b;\n b.peer = a;\n return [a, b];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n send(message: Message): void {\n if (this.closed) {\n throw new Error(\"Cannot send on a closed transport\");\n }\n const peer = this.peer;\n if (!peer) {\n throw new Error(\"Transport has no peer to send to\");\n }\n if (peer.closed) {\n throw new Error(\"Cannot send to a closed peer transport\");\n }\n peer.deliver(message);\n }\n\n onMessage(listener: (message: Message) => void): () => void {\n if (this.closed) {\n throw new Error(\"Cannot subscribe to a closed transport\");\n }\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.listeners.clear();\n const peer = this.peer;\n this.peer = null;\n if (peer && !peer.closed) {\n await peer.close();\n }\n }\n\n private deliver(message: Message): void {\n for (const listener of [...this.listeners]) {\n try {\n listener(message);\n } catch {\n // A faulty listener must not prevent delivery to the others.\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "+EASO,MAAMA,CAAqC,CATlD,MASkD,CAAAC,EAAA,wBACxC,KAA+B,KACtB,UAAY,IAAI,IACzB,OAAS,GAGjB,OAAO,MAA2C,CAChD,MAAMC,EAAI,IAAIF,EACRG,EAAI,IAAIH,EACd,OAAAE,EAAE,KAAOC,EACTA,EAAE,KAAOD,EACF,CAACA,EAAGC,CAAC,CACd,CAEA,IAAI,UAAoB,CACtB,OAAO,KAAK,MACd,CAEA,KAAKC,EAAwB,CAC3B,GAAI,KAAK,OACP,MAAM,IAAI,MAAM,mCAAmC,EAErD,MAAMC,EAAO,KAAK,KAClB,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,kCAAkC,EAEpD,GAAIA,EAAK,OACP,MAAM,IAAI,MAAM,wCAAwC,EAE1DA,EAAK,QAAQD,CAAO,CACtB,CAEA,UAAUE,EAAkD,CAC1D,GAAI,KAAK,OACP,MAAM,IAAI,MAAM,wCAAwC,EAE1D,YAAK,UAAU,IAAIA,CAAQ,EACpB,IAAM,CACX,KAAK,UAAU,OAAOA,CAAQ,CAChC,CACF,CAEA,MAAM,OAAuB,CAC3B,GAAI,KAAK,OAAQ,OACjB,KAAK,OAAS,GACd,KAAK,UAAU,MAAM,EACrB,MAAMD,EAAO,KAAK,KAClB,KAAK,KAAO,KACRA,GAAQ,CAACA,EAAK,QAChB,MAAMA,EAAK,MAAM,CAErB,CAEQ,QAAQD,EAAwB,CACtC,UAAWE,IAAY,CAAC,GAAG,KAAK,SAAS,EACvC,GAAI,CACFA,EAASF,CAAO,CAClB,MAAQ,CAER,CAEJ,CACF",
|
|
6
|
+
"names": ["MemoryTransport", "__name", "a", "b", "message", "peer", "listener"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/transport/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type { Message, Transport } from \"./types\";\nexport { MemoryTransport } from \"./adapters/index\";\n"],
|
|
5
|
+
"mappings": "AACA,OAAS,mBAAAA,MAAuB",
|
|
6
|
+
"names": ["MemoryTransport"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Tool } from "./tools/tools.js";
|
|
2
|
+
import type { LLM, LLMMessage } from "../providers/llm/types.js";
|
|
3
|
+
export interface AgentOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
context?: string;
|
|
6
|
+
tools?: Tool<never, unknown>[];
|
|
7
|
+
/** LLM provider used by `run()`. Injected by `Pipeflow.agent()`. */
|
|
8
|
+
llm?: LLM;
|
|
9
|
+
}
|
|
10
|
+
export interface AgentRunRequest {
|
|
11
|
+
prompt: string;
|
|
12
|
+
/** Prior messages to continue from, e.g. a previous `run()` result. */
|
|
13
|
+
history?: LLMMessage[];
|
|
14
|
+
temperature?: number;
|
|
15
|
+
maxTokens?: number;
|
|
16
|
+
/** Safety bound on the number of tool-call round trips. */
|
|
17
|
+
maxToolIterations?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ExecutedToolCall {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
/** Parsed arguments, or the raw JSON string if parsing failed. */
|
|
23
|
+
arguments: unknown;
|
|
24
|
+
/** The tool result, or `{ error }` when the tool failed or is unknown. */
|
|
25
|
+
result: unknown;
|
|
26
|
+
}
|
|
27
|
+
export interface AgentRunResult {
|
|
28
|
+
/** The assistant's final text response. */
|
|
29
|
+
text: string;
|
|
30
|
+
/** The full message history including the response and tool results. */
|
|
31
|
+
messages: LLMMessage[];
|
|
32
|
+
/** Every tool call executed during the run, in order. */
|
|
33
|
+
toolCalls: ExecutedToolCall[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* An AI persona: a name, a system context, and a set of tools.
|
|
37
|
+
*
|
|
38
|
+
* An agent can participate in conversations or be invoked independently
|
|
39
|
+
* with `run()`.
|
|
40
|
+
*/
|
|
41
|
+
export declare class Agent {
|
|
42
|
+
readonly name: string;
|
|
43
|
+
readonly context: string;
|
|
44
|
+
private readonly toolRegistry;
|
|
45
|
+
/** LLM provider used by `run()` and the orchestrator. */
|
|
46
|
+
readonly llm: LLM | undefined;
|
|
47
|
+
constructor(options: AgentOptions);
|
|
48
|
+
get tools(): Tool<never, unknown>[];
|
|
49
|
+
addTool(tool: Tool<never, unknown>): void;
|
|
50
|
+
hasTool(name: string): boolean;
|
|
51
|
+
getTool(name: string): Tool<never, unknown> | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Run the agent against the LLM, executing any requested tools and
|
|
54
|
+
* feeding their results back until the model responds without a tool
|
|
55
|
+
* call.
|
|
56
|
+
*/
|
|
57
|
+
run(request: AgentRunRequest): Promise<AgentRunResult>;
|
|
58
|
+
private streamOnce;
|
|
59
|
+
private executeToolCall;
|
|
60
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ToolOptions<TArgs, TResult> {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
/** JSON schema describing the arguments for the LLM. */
|
|
5
|
+
parameters?: Record<string, unknown>;
|
|
6
|
+
execute: (args: TArgs) => TResult | Promise<TResult>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A capability exposed by the application to an agent.
|
|
10
|
+
*
|
|
11
|
+
* Tools execute in the application's backend: Pipeflow never runs
|
|
12
|
+
* application code directly.
|
|
13
|
+
*/
|
|
14
|
+
export declare class Tool<TArgs = Record<string, unknown>, TResult = unknown> {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly description: string;
|
|
17
|
+
readonly parameters: Record<string, unknown> | undefined;
|
|
18
|
+
private readonly executor;
|
|
19
|
+
constructor(options: ToolOptions<TArgs, TResult>);
|
|
20
|
+
/** Execute the tool. Sync throws and rejections both surface as rejections. */
|
|
21
|
+
execute(args: TArgs): Promise<TResult>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { Agent } from "../../agents/agent.js";
|
|
2
|
+
import type { Persistence } from "../../persistence/persistence.js";
|
|
3
|
+
import type { AudioChunk, ConversationId, ConversationState, ConversationStatus, Generation, Participant, ParticipantInput, Turn, UserId } from "../types.js";
|
|
4
|
+
import { Transcription, type TranscriptEntry, type TranscriptEntryInput } from "../transcription/transcription.js";
|
|
5
|
+
import type { ToolCall, ToolCallResult } from "../types.js";
|
|
6
|
+
export interface ConversationOptions {
|
|
7
|
+
id: ConversationId;
|
|
8
|
+
agents?: Agent[];
|
|
9
|
+
persistence?: Persistence;
|
|
10
|
+
}
|
|
11
|
+
export interface ConversationEvents {
|
|
12
|
+
start: {
|
|
13
|
+
conversationId: ConversationId;
|
|
14
|
+
};
|
|
15
|
+
stop: {
|
|
16
|
+
conversationId: ConversationId;
|
|
17
|
+
};
|
|
18
|
+
participant: {
|
|
19
|
+
conversationId: ConversationId;
|
|
20
|
+
participant: Participant;
|
|
21
|
+
};
|
|
22
|
+
/** Raw audio fed in via `listen()`. Consumed by the orchestrator. */
|
|
23
|
+
"audio-in": {
|
|
24
|
+
conversationId: ConversationId;
|
|
25
|
+
userId: UserId;
|
|
26
|
+
audio: AudioChunk;
|
|
27
|
+
};
|
|
28
|
+
/** Generated audio to be played by the application. */
|
|
29
|
+
audio: {
|
|
30
|
+
conversationId: ConversationId;
|
|
31
|
+
audio: AudioChunk;
|
|
32
|
+
};
|
|
33
|
+
turn: {
|
|
34
|
+
conversationId: ConversationId;
|
|
35
|
+
turn: Turn;
|
|
36
|
+
};
|
|
37
|
+
transcript: {
|
|
38
|
+
conversationId: ConversationId;
|
|
39
|
+
entry: TranscriptEntry;
|
|
40
|
+
};
|
|
41
|
+
generation: {
|
|
42
|
+
conversationId: ConversationId;
|
|
43
|
+
generation: Generation;
|
|
44
|
+
};
|
|
45
|
+
/** Live STT partials, for captions and fast UX. Not persisted. */
|
|
46
|
+
"partial-transcript": {
|
|
47
|
+
conversationId: ConversationId;
|
|
48
|
+
userId: UserId;
|
|
49
|
+
text: string;
|
|
50
|
+
};
|
|
51
|
+
/** The model requested a tool call. Resolve it with `resolveToolCall()`. */
|
|
52
|
+
"tool-call": {
|
|
53
|
+
conversationId: ConversationId;
|
|
54
|
+
call: ToolCall;
|
|
55
|
+
};
|
|
56
|
+
/** A pending tool call was resolved by the application. */
|
|
57
|
+
"tool-call-result": {
|
|
58
|
+
conversationId: ConversationId;
|
|
59
|
+
result: ToolCallResult;
|
|
60
|
+
};
|
|
61
|
+
interrupt: {
|
|
62
|
+
conversationId: ConversationId;
|
|
63
|
+
};
|
|
64
|
+
/** A provider failure (STT, LLM, or TTS). */
|
|
65
|
+
error: {
|
|
66
|
+
conversationId: ConversationId;
|
|
67
|
+
error: Error;
|
|
68
|
+
};
|
|
69
|
+
state: {
|
|
70
|
+
conversationId: ConversationId;
|
|
71
|
+
state: ConversationState;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The public realtime conversation API.
|
|
76
|
+
*
|
|
77
|
+
* A `Conversation` is a runtime handle to a persistent conversation:
|
|
78
|
+
* lifecycle (`start`/`stop`), participants, audio intake (`listen`), and
|
|
79
|
+
* events. The orchestrator (added later) subscribes to `audio-in` and
|
|
80
|
+
* pushes generated audio, turns, transcripts, and tool calls back through
|
|
81
|
+
* the `push*`/`requestToolCall` methods.
|
|
82
|
+
*/
|
|
83
|
+
export declare class Conversation {
|
|
84
|
+
readonly id: ConversationId;
|
|
85
|
+
readonly agents: readonly Agent[];
|
|
86
|
+
readonly transcription: Transcription;
|
|
87
|
+
readonly state: ConversationState;
|
|
88
|
+
private readonly persistence;
|
|
89
|
+
private readonly listeners;
|
|
90
|
+
private readonly pendingToolCallsById;
|
|
91
|
+
private nextAudioSequence;
|
|
92
|
+
constructor(options: ConversationOptions);
|
|
93
|
+
get status(): ConversationStatus;
|
|
94
|
+
get participants(): Participant[];
|
|
95
|
+
start(): void;
|
|
96
|
+
stop(): Promise<void>;
|
|
97
|
+
participate(input: ParticipantInput | ParticipantInput[]): Promise<Participant[]>;
|
|
98
|
+
/**
|
|
99
|
+
* Send an audio packet. Intentionally synchronous: it means "send this
|
|
100
|
+
* packet", not "wait for this utterance to finish".
|
|
101
|
+
*/
|
|
102
|
+
listen(input: {
|
|
103
|
+
userId: UserId;
|
|
104
|
+
audio: Uint8Array;
|
|
105
|
+
}): void;
|
|
106
|
+
/** Interrupt the current agent output (stop TTS, cancel the generation). */
|
|
107
|
+
interrupt(): void;
|
|
108
|
+
on<K extends keyof ConversationEvents>(event: K, listener: (payload: ConversationEvents[K]) => void): () => void;
|
|
109
|
+
/**
|
|
110
|
+
* Emit an event. Primarily used by the orchestrator to push output
|
|
111
|
+
* (audio, turns, transcripts) into the conversation.
|
|
112
|
+
*/
|
|
113
|
+
emit<K extends keyof ConversationEvents>(event: K, payload: ConversationEvents[K]): void;
|
|
114
|
+
/** Push a chunk of generated audio to the application. */
|
|
115
|
+
pushAudio(audio: AudioChunk): void;
|
|
116
|
+
/** Push a completed participant turn into the conversation. */
|
|
117
|
+
pushTurn(turn: Turn): Promise<void>;
|
|
118
|
+
/** Append a transcript entry and notify listeners. */
|
|
119
|
+
pushTranscript(input: Omit<TranscriptEntryInput, "conversationId">): Promise<TranscriptEntry>;
|
|
120
|
+
/** Push an agent generation into the conversation. */
|
|
121
|
+
pushGeneration(generation: Generation): Promise<void>;
|
|
122
|
+
/** Tool calls requested by the model that are awaiting resolution. */
|
|
123
|
+
get pendingToolCalls(): ToolCall[];
|
|
124
|
+
/**
|
|
125
|
+
* Track and emit a tool call requested by the model. The application
|
|
126
|
+
* listens for `tool-call` events, executes the tool in its own backend,
|
|
127
|
+
* and reports back through `resolveToolCall()`.
|
|
128
|
+
*/
|
|
129
|
+
requestToolCall(call: ToolCall): void;
|
|
130
|
+
/** Resolve a pending tool call with a result or an error. */
|
|
131
|
+
resolveToolCall(result: ToolCallResult): void;
|
|
132
|
+
/** Mark the current generation as completed, recording its final text. */
|
|
133
|
+
completeGeneration(text?: string): Promise<void>;
|
|
134
|
+
/** The live in-memory transcript. */
|
|
135
|
+
transcript(): TranscriptEntry[];
|
|
136
|
+
private cancelCurrentGeneration;
|
|
137
|
+
private emitState;
|
|
138
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Agent } from "../agents/agent.js";
|
|
2
|
+
import type { Persistence } from "../persistence/persistence.js";
|
|
3
|
+
import type { ConversationId } from "./types.js";
|
|
4
|
+
import type { TranscriptEntry } from "./transcription/transcription.js";
|
|
5
|
+
import { Conversation } from "./conversation/conversation.js";
|
|
6
|
+
export interface CreateConversationOptions {
|
|
7
|
+
agents?: Agent[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The conversations API surface of a Pipeflow instance: create persistent
|
|
11
|
+
* conversations and retrieve their transcripts.
|
|
12
|
+
*/
|
|
13
|
+
export declare class Conversations {
|
|
14
|
+
private readonly persistence;
|
|
15
|
+
constructor(persistence: Persistence);
|
|
16
|
+
/** Create a persistent conversation. Realtime execution is separate. */
|
|
17
|
+
create(options?: CreateConversationOptions): Promise<Conversation>;
|
|
18
|
+
/** Retrieve the persisted transcript of a conversation. */
|
|
19
|
+
transcript(id: ConversationId): Promise<TranscriptEntry[]>;
|
|
20
|
+
/** Rehydrate a runtime handle for an existing conversation. */
|
|
21
|
+
get(id: ConversationId): Promise<Conversation | null>;
|
|
22
|
+
private requireConversation;
|
|
23
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { AudioChunk, ConversationId, ConversationState, ConversationStatus, Generation, GenerationStatus, Participant, ParticipantInput, ToolCall, ToolCallResult, Turn, TurnId, UserId, } from "./types.js";
|
|
2
|
+
export { createConversationState } from "./types.js";
|
|
3
|
+
export { Conversation } from "./conversation/index.js";
|
|
4
|
+
export type { ConversationEvents, ConversationOptions, } from "./conversation/index.js";
|
|
5
|
+
export { Conversations } from "./conversations.js";
|
|
6
|
+
export type { CreateConversationOptions } from "./conversations.js";
|
|
7
|
+
export { Orchestrator } from "./orchestration/orchestrator/index.js";
|
|
8
|
+
export type { OrchestratorOptions } from "./orchestration/orchestrator/index.js";
|
|
9
|
+
export { Transcription, TranscriptEntry } from "./transcription/index.js";
|
|
10
|
+
export type { TranscriptEntryInput, TranscriptSpeakerKind, } from "./transcription/index.js";
|