kernl 0.9.0 → 0.10.0
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +33 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/lib/env.d.ts.map +1 -1
- package/dist/lib/env.js +1 -1
- package/dist/lifecycle.d.ts +3 -18
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +3 -20
- package/dist/memory/memory.js +1 -1
- package/dist/realtime/index.d.ts +1 -1
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js +1 -1
- package/dist/realtime/session.d.ts +31 -22
- package/dist/realtime/session.d.ts.map +1 -1
- package/dist/realtime/session.js +64 -55
- package/dist/realtime/transport.d.ts +45 -0
- package/dist/realtime/transport.d.ts.map +1 -0
- package/dist/realtime/transport.js +32 -0
- package/dist/realtime/types.d.ts +8 -2
- package/dist/realtime/types.d.ts.map +1 -1
- package/package.json +9 -6
- package/src/index.ts +10 -1
- package/src/lib/env.ts +3 -1
- package/src/lifecycle.ts +3 -53
- package/src/memory/memory.ts +1 -1
- package/src/realtime/index.ts +1 -1
- package/src/realtime/session.ts +88 -64
- package/src/realtime/transport.ts +64 -0
- package/src/realtime/types.ts +10 -2
- package/dist/realtime/channel.d.ts +0 -30
- package/dist/realtime/channel.d.ts.map +0 -1
- package/dist/realtime/channel.js +0 -1
- package/src/realtime/channel.ts +0 -32
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# @kernl/core
|
|
2
2
|
|
|
3
|
+
## 0.10.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- f593374: Add realtime voice agents with multi-provider support.
|
|
8
|
+
- `RealtimeAgent` and `RealtimeSession` for voice-enabled AI agents
|
|
9
|
+
- OpenAI GPT-4o realtime with WebSocket streaming
|
|
10
|
+
- xAI Grok realtime with OpenAI-compatible protocol
|
|
11
|
+
- React hooks: `useRealtime`, `useBrowserAudio`, `LiveWaveform`
|
|
12
|
+
- Ephemeral credential pattern for secure browser connections
|
|
13
|
+
- Tool execution with client-side context support
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [f593374]
|
|
18
|
+
- @kernl-sdk/protocol@0.4.0
|
|
19
|
+
- @kernl-sdk/retrieval@0.1.6
|
|
20
|
+
|
|
21
|
+
## 0.9.1
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- 25e46e7: Move zod to peerDependencies to prevent version conflicts
|
|
26
|
+
|
|
27
|
+
Consumers should add `zod` as a direct dependency in their project. This ensures
|
|
28
|
+
a single zod instance is used across all packages, avoiding type incompatibilities
|
|
29
|
+
that could cause TypeScript to hang during type checking.
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [25e46e7]
|
|
32
|
+
- @kernl-sdk/shared@0.3.1
|
|
33
|
+
- @kernl-sdk/protocol@0.3.1
|
|
34
|
+
- @kernl-sdk/retrieval@0.1.5
|
|
35
|
+
|
|
3
36
|
## 0.9.0
|
|
4
37
|
|
|
5
38
|
### Minor Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ export { Kernl } from "./kernl/index.js";
|
|
|
2
2
|
export type { KernlOptions, StorageOptions, AgentRegistry, ModelRegistry, } from "./kernl/index.js";
|
|
3
3
|
export { Agent } from "./agent.js";
|
|
4
4
|
export { Context } from "./context.js";
|
|
5
|
+
export { RealtimeAgent, RealtimeSession, WebSocketTransport } from "./realtime/index.js";
|
|
6
|
+
export type { RealtimeAgentConfig, RealtimeAgentVoiceConfig, RealtimeSessionOptions, WebSocketTransportOptions, } from "./realtime/index.js";
|
|
5
7
|
export { tool, Toolkit, FunctionToolkit, MCPToolkit } from "./tool/index.js";
|
|
6
8
|
export { MCPServerSSE } from "./mcp/sse.js";
|
|
7
|
-
export { MCPServerStdio } from "./mcp/stdio.js";
|
|
8
9
|
export { MCPServerStreamableHttp } from "./mcp/http.js";
|
|
9
10
|
export type { MThread as Thread, MThreadEvent as ThreadEvent, MThreadEventBase as ThreadEventBase, } from "./api/models/index.js";
|
|
10
11
|
export type { RThreadsListParams as ThreadsListParams, RThreadGetOptions as ThreadGetOptions, RThreadHistoryParams as ThreadHistoryParams, RThreadCreateParams as ThreadCreateParams, RThreadUpdateParams as ThreadUpdateParams, } from "./api/resources/threads/index.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChF,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAIrD,YAAY,EACV,OAAO,IAAI,MAAM,EACjB,YAAY,IAAI,WAAW,EAC3B,gBAAgB,IAAI,eAAe,GACpC,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,kBAAkB,IAAI,iBAAiB,EACvC,iBAAiB,IAAI,gBAAgB,EACrC,oBAAoB,IAAI,mBAAmB,EAC3C,mBAAmB,IAAI,kBAAkB,EACzC,mBAAmB,IAAI,kBAAkB,GAC1C,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAC;AAIxB,YAAY,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACrD,YAAY,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
export { Kernl } from "./kernl/index.js";
|
|
2
2
|
export { Agent } from "./agent.js";
|
|
3
3
|
export { Context } from "./context.js";
|
|
4
|
+
// --- realtime ---
|
|
5
|
+
export { RealtimeAgent, RealtimeSession, WebSocketTransport } from "./realtime/index.js";
|
|
4
6
|
// --- tools --
|
|
5
7
|
export { tool, Toolkit, FunctionToolkit, MCPToolkit } from "./tool/index.js";
|
|
6
8
|
export { MCPServerSSE } from "./mcp/sse.js";
|
|
7
|
-
export { MCPServerStdio } from "./mcp/stdio.js";
|
|
8
9
|
export { MCPServerStreamableHttp } from "./mcp/http.js";
|
|
9
10
|
export { THREAD_STATES, } from "./thread/types.js";
|
|
10
11
|
// --- memory ---
|
package/dist/lib/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;iBAab,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,GAAG;;;;
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;iBAab,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,GAAG;;;;CAEf,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC"}
|
package/dist/lib/env.js
CHANGED
package/dist/lifecycle.d.ts
CHANGED
|
@@ -1,24 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Emitter } from "@kernl-sdk/shared";
|
|
2
2
|
import { Agent } from "./agent.js";
|
|
3
3
|
import { Context, UnknownContext } from "./context.js";
|
|
4
4
|
import { Tool } from "./tool/index.js";
|
|
5
5
|
import type { ToolCall } from "@kernl-sdk/protocol";
|
|
6
6
|
import { AgentOutputType } from "./agent/types.js";
|
|
7
7
|
import { TextOutput } from "./thread/types.js";
|
|
8
|
-
export type EventEmitterEvents = Record<string, any[]>;
|
|
9
|
-
/**
|
|
10
|
-
* Generic typed event emitter that wraps Node's EventEmitter with type safety
|
|
11
|
-
*/
|
|
12
|
-
declare class TypedEventEmitter<EventTypes extends EventEmitterEvents = Record<string, any[]>> extends EventEmitter {
|
|
13
|
-
on<K extends keyof EventTypes>(event: K, listener: (...args: EventTypes[K]) => void): this;
|
|
14
|
-
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
15
|
-
off<K extends keyof EventTypes>(event: K, listener: (...args: EventTypes[K]) => void): this;
|
|
16
|
-
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
17
|
-
emit<K extends keyof EventTypes>(event: K, ...args: EventTypes[K]): boolean;
|
|
18
|
-
emit(event: string | symbol, ...args: any[]): boolean;
|
|
19
|
-
once<K extends keyof EventTypes>(event: K, listener: (...args: EventTypes[K]) => void): this;
|
|
20
|
-
once(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
21
|
-
}
|
|
22
8
|
export type AgentHookEvents<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> = {
|
|
23
9
|
/**
|
|
24
10
|
* @param context - The context of the run
|
|
@@ -60,7 +46,7 @@ export type AgentHookEvents<TContext = UnknownContext, TOutput extends AgentOutp
|
|
|
60
46
|
* Event emitter that every Agent instance inherits from and that emits events for the lifecycle
|
|
61
47
|
* of the agent.
|
|
62
48
|
*/
|
|
63
|
-
export declare class AgentHooks<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> extends
|
|
49
|
+
export declare class AgentHooks<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> extends Emitter<AgentHookEvents<TContext, TOutput>> {
|
|
64
50
|
}
|
|
65
51
|
/**
|
|
66
52
|
* Events emitted by the kernl during execution.
|
|
@@ -127,7 +113,6 @@ export type KernlHookEvents<TContext = UnknownContext, TOutput extends AgentOutp
|
|
|
127
113
|
/**
|
|
128
114
|
* Event emitter that the kernl uses to emit events for the lifecycle of every agent run.
|
|
129
115
|
*/
|
|
130
|
-
export declare class KernlHooks<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> extends
|
|
116
|
+
export declare class KernlHooks<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> extends Emitter<KernlHookEvents<TContext, TOutput>> {
|
|
131
117
|
}
|
|
132
|
-
export {};
|
|
133
118
|
//# sourceMappingURL=lifecycle.d.ts.map
|
package/dist/lifecycle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/lifecycle.js
CHANGED
|
@@ -1,29 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
/**
|
|
3
|
-
* Generic typed event emitter that wraps Node's EventEmitter with type safety
|
|
4
|
-
*/
|
|
5
|
-
class TypedEventEmitter extends EventEmitter {
|
|
6
|
-
on(event, listener) {
|
|
7
|
-
return super.on(event, listener);
|
|
8
|
-
}
|
|
9
|
-
off(event, listener) {
|
|
10
|
-
return super.off(event, listener);
|
|
11
|
-
}
|
|
12
|
-
emit(event, ...args) {
|
|
13
|
-
return super.emit(event, ...args);
|
|
14
|
-
}
|
|
15
|
-
once(event, listener) {
|
|
16
|
-
return super.once(event, listener);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
1
|
+
import { Emitter } from "@kernl-sdk/shared";
|
|
19
2
|
/**
|
|
20
3
|
* Event emitter that every Agent instance inherits from and that emits events for the lifecycle
|
|
21
4
|
* of the agent.
|
|
22
5
|
*/
|
|
23
|
-
export class AgentHooks extends
|
|
6
|
+
export class AgentHooks extends Emitter {
|
|
24
7
|
}
|
|
25
8
|
/**
|
|
26
9
|
* Event emitter that the kernl uses to emit events for the lifecycle of every agent run.
|
|
27
10
|
*/
|
|
28
|
-
export class KernlHooks extends
|
|
11
|
+
export class KernlHooks extends Emitter {
|
|
29
12
|
}
|
package/dist/memory/memory.js
CHANGED
package/dist/realtime/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
package/dist/realtime/index.js
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { RealtimeModel } from "@kernl-sdk/protocol";
|
|
1
|
+
import { Emitter } from "@kernl-sdk/shared";
|
|
2
|
+
import { RealtimeModel, RealtimeServerEvent, RealtimeChannel, TransportStatus } from "@kernl-sdk/protocol";
|
|
3
3
|
import { Context, UnknownContext } from "../context.js";
|
|
4
4
|
import { RealtimeAgent } from "./agent.js";
|
|
5
|
-
import type { RealtimeChannel } from "./channel.js";
|
|
6
5
|
import type { RealtimeSessionOptions } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Events emitted by a realtime session.
|
|
8
|
+
*/
|
|
9
|
+
export type RealtimeSessionEvents = {
|
|
10
|
+
audio: [event: RealtimeServerEvent];
|
|
11
|
+
transcript: [event: RealtimeServerEvent];
|
|
12
|
+
text: [event: RealtimeServerEvent];
|
|
13
|
+
error: [error: Error];
|
|
14
|
+
status: [status: TransportStatus];
|
|
15
|
+
};
|
|
7
16
|
/**
|
|
8
17
|
* A realtime session manages the connection to a realtime model.
|
|
9
18
|
*
|
|
10
19
|
* Handles the bidirectional communication between an agent and a model,
|
|
11
20
|
* including audio I/O (via channels), tool execution, and event routing.
|
|
12
21
|
*/
|
|
13
|
-
export declare class RealtimeSession<TContext = UnknownContext> extends
|
|
22
|
+
export declare class RealtimeSession<TContext = UnknownContext> extends Emitter<RealtimeSessionEvents> {
|
|
14
23
|
/**
|
|
15
24
|
* Session ID. Null until connected.
|
|
16
25
|
*/
|
|
@@ -48,24 +57,6 @@ export declare class RealtimeSession<TContext = UnknownContext> extends EventEmi
|
|
|
48
57
|
* Initialize event listeners and send session configuration.
|
|
49
58
|
*/
|
|
50
59
|
private init;
|
|
51
|
-
/**
|
|
52
|
-
* Build session configuration from agent.
|
|
53
|
-
*/
|
|
54
|
-
private buildSessionConfig;
|
|
55
|
-
/**
|
|
56
|
-
* Handle incoming events from the connection.
|
|
57
|
-
*
|
|
58
|
-
* Maps protocol events to simplified user-facing events:
|
|
59
|
-
* - 'audio' - audio output from assistant
|
|
60
|
-
* - 'transcript' - speech transcriptions (user or assistant)
|
|
61
|
-
* - 'text' - text output from assistant
|
|
62
|
-
* - 'error' - errors
|
|
63
|
-
*/
|
|
64
|
-
private onEvent;
|
|
65
|
-
/**
|
|
66
|
-
* Execute tool calls from the model.
|
|
67
|
-
*/
|
|
68
|
-
private performActions;
|
|
69
60
|
/**
|
|
70
61
|
* Send audio to the model.
|
|
71
62
|
*/
|
|
@@ -94,5 +85,23 @@ export declare class RealtimeSession<TContext = UnknownContext> extends EventEmi
|
|
|
94
85
|
* Close the session and release resources.
|
|
95
86
|
*/
|
|
96
87
|
close(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Build session configuration from agent.
|
|
90
|
+
*/
|
|
91
|
+
private buildSessionConfig;
|
|
92
|
+
/**
|
|
93
|
+
* Handle incoming events from the connection.
|
|
94
|
+
*
|
|
95
|
+
* Maps protocol events to simplified user-facing events:
|
|
96
|
+
* - 'audio' - audio output from assistant
|
|
97
|
+
* - 'transcript' - speech transcriptions (user or assistant)
|
|
98
|
+
* - 'text' - text output from assistant
|
|
99
|
+
* - 'error' - errors
|
|
100
|
+
*/
|
|
101
|
+
private onEvent;
|
|
102
|
+
/**
|
|
103
|
+
* Execute tool calls from the model.
|
|
104
|
+
*/
|
|
105
|
+
private performActions;
|
|
97
106
|
}
|
|
98
107
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/realtime/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/realtime/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACL,aAAa,EAEb,mBAAmB,EAEnB,eAAe,EAEf,eAAe,EAEhB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACpC,UAAU,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtB,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACnC,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,eAAe,CAC1B,QAAQ,GAAG,cAAc,CACzB,SAAQ,OAAO,CAAC,qBAAqB,CAAC;IACtC;;OAEG;IACH,EAAE,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEzB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAEzC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAmC;IAErD;;OAEG;IACH,OAAO,CAAC,OAAO,CAAmC;gBAGhD,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC9B,OAAO,GAAE,sBAAsB,CAAC,QAAQ,CAAM;IAiBhD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B;;OAEG;YACW,IAAI;IAalB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO/B;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;YACW,kBAAkB;IAehC;;;;;;;;OAQG;IACH,OAAO,CAAC,OAAO;IAuCf;;OAEG;YACW,cAAc;CAwB7B"}
|
package/dist/realtime/session.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Emitter } from "@kernl-sdk/shared";
|
|
2
2
|
import { message, } from "@kernl-sdk/protocol";
|
|
3
3
|
import { Context } from "../context.js";
|
|
4
4
|
import { MisconfiguredError } from "../lib/error.js";
|
|
@@ -8,7 +8,7 @@ import { MisconfiguredError } from "../lib/error.js";
|
|
|
8
8
|
* Handles the bidirectional communication between an agent and a model,
|
|
9
9
|
* including audio I/O (via channels), tool execution, and event routing.
|
|
10
10
|
*/
|
|
11
|
-
export class RealtimeSession extends
|
|
11
|
+
export class RealtimeSession extends Emitter {
|
|
12
12
|
/**
|
|
13
13
|
* Session ID. Null until connected.
|
|
14
14
|
*/
|
|
@@ -56,6 +56,7 @@ export class RealtimeSession extends EventEmitter {
|
|
|
56
56
|
const options = {
|
|
57
57
|
...this.options.connectOptions,
|
|
58
58
|
sessionConfig,
|
|
59
|
+
credential: this.options.credential ?? this.options.connectOptions?.credential,
|
|
59
60
|
};
|
|
60
61
|
this.connection = this.options.transport
|
|
61
62
|
? await this.options.transport.connect(this.model, options)
|
|
@@ -63,6 +64,9 @@ export class RealtimeSession extends EventEmitter {
|
|
|
63
64
|
this.connection.on("event", this.onEvent.bind(this));
|
|
64
65
|
this.connection.on("error", (e) => this.emit("error", e));
|
|
65
66
|
this.connection.on("status", (s) => this.emit("status", s));
|
|
67
|
+
this.connection.on("interrupted", () => this.channel?.interrupt());
|
|
68
|
+
// Emit current status (may have been set before listeners attached)
|
|
69
|
+
this.emit("status", this.connection.status);
|
|
66
70
|
this.init();
|
|
67
71
|
}
|
|
68
72
|
/**
|
|
@@ -79,6 +83,53 @@ export class RealtimeSession extends EventEmitter {
|
|
|
79
83
|
config: await this.buildSessionConfig(),
|
|
80
84
|
});
|
|
81
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Send audio to the model.
|
|
88
|
+
*/
|
|
89
|
+
sendAudio(audio) {
|
|
90
|
+
this.connection?.send({ kind: "audio.input.append", audio });
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Commit the audio buffer (signal end of speech).
|
|
94
|
+
*/
|
|
95
|
+
commit() {
|
|
96
|
+
this.connection?.send({ kind: "audio.input.commit" });
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Send a text message to the model.
|
|
100
|
+
*/
|
|
101
|
+
sendMessage(text) {
|
|
102
|
+
this.connection?.send({
|
|
103
|
+
kind: "item.create",
|
|
104
|
+
item: message({ role: "user", text }),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Interrupt the current response.
|
|
109
|
+
*/
|
|
110
|
+
interrupt() {
|
|
111
|
+
this.connection?.send({ kind: "response.cancel" });
|
|
112
|
+
this.channel?.interrupt();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Mute audio input.
|
|
116
|
+
*/
|
|
117
|
+
mute() {
|
|
118
|
+
this.connection?.mute();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Unmute audio input.
|
|
122
|
+
*/
|
|
123
|
+
unmute() {
|
|
124
|
+
this.connection?.unmute();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Close the session and release resources.
|
|
128
|
+
*/
|
|
129
|
+
close() {
|
|
130
|
+
this.channel?.close();
|
|
131
|
+
this.connection?.close();
|
|
132
|
+
}
|
|
82
133
|
/**
|
|
83
134
|
* Build session configuration from agent.
|
|
84
135
|
*/
|
|
@@ -88,6 +139,11 @@ export class RealtimeSession extends EventEmitter {
|
|
|
88
139
|
instructions: await this.agent.instructions(this.context),
|
|
89
140
|
tools: tools.map((t) => t.serialize()),
|
|
90
141
|
voice: this.agent.voice,
|
|
142
|
+
turnDetection: { mode: "server_vad" },
|
|
143
|
+
audio: {
|
|
144
|
+
inputFormat: { mimeType: "audio/pcm", sampleRate: 24000 },
|
|
145
|
+
outputFormat: { mimeType: "audio/pcm", sampleRate: 24000 },
|
|
146
|
+
},
|
|
91
147
|
};
|
|
92
148
|
}
|
|
93
149
|
/**
|
|
@@ -101,7 +157,7 @@ export class RealtimeSession extends EventEmitter {
|
|
|
101
157
|
*/
|
|
102
158
|
onEvent(event) {
|
|
103
159
|
switch (event.kind) {
|
|
104
|
-
//
|
|
160
|
+
// audio output → 'audio'
|
|
105
161
|
case "audio.output.delta":
|
|
106
162
|
this.channel?.sendAudio(event.audio);
|
|
107
163
|
this.emit("audio", event);
|
|
@@ -109,24 +165,24 @@ export class RealtimeSession extends EventEmitter {
|
|
|
109
165
|
case "audio.output.done":
|
|
110
166
|
this.emit("audio", event);
|
|
111
167
|
break;
|
|
112
|
-
//
|
|
168
|
+
// speech transcriptions → 'transcript'
|
|
113
169
|
case "transcript.input":
|
|
114
170
|
case "transcript.output":
|
|
115
171
|
this.emit("transcript", event);
|
|
116
172
|
break;
|
|
117
|
-
//
|
|
173
|
+
// text output → 'text'
|
|
118
174
|
case "text.output":
|
|
119
175
|
this.emit("text", event);
|
|
120
176
|
break;
|
|
121
|
-
//
|
|
177
|
+
// ERrors → 'error'
|
|
122
178
|
case "session.error":
|
|
123
179
|
this.emit("error", event.error);
|
|
124
180
|
break;
|
|
125
|
-
//
|
|
181
|
+
// tool calls - handled internally
|
|
126
182
|
case "tool.call":
|
|
127
183
|
this.performActions(event);
|
|
128
184
|
break;
|
|
129
|
-
//
|
|
185
|
+
// session lifecycle - internal state
|
|
130
186
|
case "session.created":
|
|
131
187
|
this.id = event.session.id;
|
|
132
188
|
break;
|
|
@@ -153,51 +209,4 @@ export class RealtimeSession extends EventEmitter {
|
|
|
153
209
|
error: result.error ?? undefined,
|
|
154
210
|
});
|
|
155
211
|
}
|
|
156
|
-
/**
|
|
157
|
-
* Send audio to the model.
|
|
158
|
-
*/
|
|
159
|
-
sendAudio(audio) {
|
|
160
|
-
this.connection?.send({ kind: "audio.input.append", audio });
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Commit the audio buffer (signal end of speech).
|
|
164
|
-
*/
|
|
165
|
-
commit() {
|
|
166
|
-
this.connection?.send({ kind: "audio.input.commit" });
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Send a text message to the model.
|
|
170
|
-
*/
|
|
171
|
-
sendMessage(text) {
|
|
172
|
-
this.connection?.send({
|
|
173
|
-
kind: "item.create",
|
|
174
|
-
item: message({ role: "user", text }),
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Interrupt the current response.
|
|
179
|
-
*/
|
|
180
|
-
interrupt() {
|
|
181
|
-
this.connection?.send({ kind: "response.cancel" });
|
|
182
|
-
this.channel?.interrupt();
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Mute audio input.
|
|
186
|
-
*/
|
|
187
|
-
mute() {
|
|
188
|
-
this.connection?.mute();
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Unmute audio input.
|
|
192
|
-
*/
|
|
193
|
-
unmute() {
|
|
194
|
-
this.connection?.unmute();
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Close the session and release resources.
|
|
198
|
-
*/
|
|
199
|
-
close() {
|
|
200
|
-
this.channel?.close();
|
|
201
|
-
this.connection?.close();
|
|
202
|
-
}
|
|
203
212
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { RealtimeModel, RealtimeConnection, RealtimeTransport, RealtimeConnectOptions, WebSocketConstructor } from "@kernl-sdk/protocol";
|
|
2
|
+
/**
|
|
3
|
+
* Options for creating a WebSocket transport.
|
|
4
|
+
*/
|
|
5
|
+
export interface WebSocketTransportOptions {
|
|
6
|
+
/**
|
|
7
|
+
* WebSocket constructor to use.
|
|
8
|
+
*
|
|
9
|
+
* Required in Node.js <22 (provide the 'ws' package).
|
|
10
|
+
* Optional in browsers and Node.js 22+ (uses globalThis.WebSocket).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import WebSocket from 'ws';
|
|
15
|
+
* new WebSocketTransport({ websocket: WebSocket });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
websocket?: WebSocketConstructor;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* WebSocket transport for realtime connections.
|
|
22
|
+
*
|
|
23
|
+
* Use this transport when you need to provide a custom WebSocket implementation,
|
|
24
|
+
* such as the 'ws' package in Node.js <22.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* // Node.js <22
|
|
29
|
+
* import WebSocket from 'ws';
|
|
30
|
+
* const session = new RealtimeSession(agent, {
|
|
31
|
+
* transport: new WebSocketTransport({ websocket: WebSocket }),
|
|
32
|
+
* ...
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // Browser or Node.js 22+ - no transport needed
|
|
36
|
+
* const session = new RealtimeSession(agent, { ... });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare class WebSocketTransport implements RealtimeTransport {
|
|
40
|
+
readonly handlesAudio = false;
|
|
41
|
+
private WS;
|
|
42
|
+
constructor(options?: WebSocketTransportOptions);
|
|
43
|
+
connect(model: RealtimeModel, options?: RealtimeConnectOptions): Promise<RealtimeConnection>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/realtime/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,kBAAmB,YAAW,iBAAiB;IAC1D,QAAQ,CAAC,YAAY,SAAS;IAC9B,OAAO,CAAC,EAAE,CAAmC;gBAEjC,OAAO,CAAC,EAAE,yBAAyB;IAIzC,OAAO,CACX,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;CAM/B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket transport for realtime connections.
|
|
3
|
+
*
|
|
4
|
+
* Use this transport when you need to provide a custom WebSocket implementation,
|
|
5
|
+
* such as the 'ws' package in Node.js <22.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* // Node.js <22
|
|
10
|
+
* import WebSocket from 'ws';
|
|
11
|
+
* const session = new RealtimeSession(agent, {
|
|
12
|
+
* transport: new WebSocketTransport({ websocket: WebSocket }),
|
|
13
|
+
* ...
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* // Browser or Node.js 22+ - no transport needed
|
|
17
|
+
* const session = new RealtimeSession(agent, { ... });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class WebSocketTransport {
|
|
21
|
+
handlesAudio = false;
|
|
22
|
+
WS;
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.WS = options?.websocket;
|
|
25
|
+
}
|
|
26
|
+
async connect(model, options) {
|
|
27
|
+
return model.connect({
|
|
28
|
+
...options,
|
|
29
|
+
websocket: this.WS ?? options?.websocket,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
package/dist/realtime/types.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { RealtimeModel, RealtimeTransport, RealtimeConnectOptions } from "@kernl-sdk/protocol";
|
|
1
|
+
import { RealtimeModel, RealtimeTransport, RealtimeConnectOptions, RealtimeChannel, ClientCredential } from "@kernl-sdk/protocol";
|
|
2
2
|
import { Context, UnknownContext } from "../context.js";
|
|
3
3
|
import type { BaseAgentConfig } from "../agent/base.js";
|
|
4
|
-
import type { RealtimeChannel } from "./channel.js";
|
|
5
4
|
/**
|
|
6
5
|
* Configuration for a realtime agent.
|
|
7
6
|
*/
|
|
@@ -50,6 +49,13 @@ export interface RealtimeSessionOptions<TContext = UnknownContext> {
|
|
|
50
49
|
* Context for this session.
|
|
51
50
|
*/
|
|
52
51
|
context?: Context<TContext>;
|
|
52
|
+
/**
|
|
53
|
+
* Ephemeral credential for client-side connections.
|
|
54
|
+
*
|
|
55
|
+
* Obtained from model.authenticate() on the server.
|
|
56
|
+
* Shorthand for connectOptions.credential.
|
|
57
|
+
*/
|
|
58
|
+
credential?: ClientCredential;
|
|
53
59
|
/**
|
|
54
60
|
* Options passed to model.connect() or transport.connect().
|
|
55
61
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,GAAG,cAAc,CAC5D,SAAQ,eAAe,CAAC,QAAQ,CAAC;IACjC;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,QAAQ,GAAG,cAAc;IAC/D;;OAEG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;;OAGG;IACH,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAE9B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;OAEG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;CACzC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kernl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "A modern AI agent framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"kernl",
|
|
@@ -34,10 +34,12 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@modelcontextprotocol/sdk": "^1.20.2",
|
|
36
36
|
"yaml": "^2.8.2",
|
|
37
|
-
"
|
|
38
|
-
"@kernl-sdk/
|
|
39
|
-
"@kernl-sdk/
|
|
40
|
-
|
|
37
|
+
"@kernl-sdk/protocol": "0.4.0",
|
|
38
|
+
"@kernl-sdk/retrieval": "0.1.6",
|
|
39
|
+
"@kernl-sdk/shared": "^0.3.1"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"zod": "^4.1.8"
|
|
41
43
|
},
|
|
42
44
|
"devDependencies": {
|
|
43
45
|
"@ai-sdk/openai": "3.0.0-beta.57",
|
|
@@ -45,7 +47,8 @@
|
|
|
45
47
|
"tsc-alias": "^1.8.10",
|
|
46
48
|
"typescript": "5.9.2",
|
|
47
49
|
"vitest": "^4.0.8",
|
|
48
|
-
"
|
|
50
|
+
"zod": "^4.1.8",
|
|
51
|
+
"@kernl-sdk/ai": "0.3.3"
|
|
49
52
|
},
|
|
50
53
|
"scripts": {
|
|
51
54
|
"clean": "rm -rf dist",
|
package/src/index.ts
CHANGED
|
@@ -8,11 +8,20 @@ export type {
|
|
|
8
8
|
export { Agent } from "./agent";
|
|
9
9
|
export { Context } from "./context";
|
|
10
10
|
|
|
11
|
+
// --- realtime ---
|
|
12
|
+
|
|
13
|
+
export { RealtimeAgent, RealtimeSession, WebSocketTransport } from "./realtime";
|
|
14
|
+
export type {
|
|
15
|
+
RealtimeAgentConfig,
|
|
16
|
+
RealtimeAgentVoiceConfig,
|
|
17
|
+
RealtimeSessionOptions,
|
|
18
|
+
WebSocketTransportOptions,
|
|
19
|
+
} from "./realtime";
|
|
20
|
+
|
|
11
21
|
// --- tools --
|
|
12
22
|
|
|
13
23
|
export { tool, Toolkit, FunctionToolkit, MCPToolkit } from "./tool";
|
|
14
24
|
export { MCPServerSSE } from "./mcp/sse";
|
|
15
|
-
export { MCPServerStdio } from "./mcp/stdio";
|
|
16
25
|
export { MCPServerStreamableHttp } from "./mcp/http";
|
|
17
26
|
|
|
18
27
|
// --- threads ---
|
package/src/lib/env.ts
CHANGED
|
@@ -28,7 +28,9 @@ const envSchema = z.object({
|
|
|
28
28
|
* import { env } from '@/env';
|
|
29
29
|
* console.log(env.LOG_LEVEL);
|
|
30
30
|
*/
|
|
31
|
-
export const env = envSchema.parse(
|
|
31
|
+
export const env = envSchema.parse(
|
|
32
|
+
typeof process !== "undefined" ? process.env : {},
|
|
33
|
+
);
|
|
32
34
|
|
|
33
35
|
/**
|
|
34
36
|
* Type of the validated environment variables
|
package/src/lifecycle.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Emitter } from "@kernl-sdk/shared";
|
|
2
2
|
|
|
3
3
|
import { Agent } from "./agent";
|
|
4
4
|
import { Context, UnknownContext } from "./context";
|
|
@@ -8,56 +8,6 @@ import type { ToolCall } from "@kernl-sdk/protocol";
|
|
|
8
8
|
import { AgentOutputType } from "@/agent/types";
|
|
9
9
|
import { TextOutput } from "@/thread/types";
|
|
10
10
|
|
|
11
|
-
export type EventEmitterEvents = Record<string, any[]>;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Generic typed event emitter that wraps Node's EventEmitter with type safety
|
|
15
|
-
*/
|
|
16
|
-
class TypedEventEmitter<
|
|
17
|
-
EventTypes extends EventEmitterEvents = Record<string, any[]>,
|
|
18
|
-
> extends EventEmitter {
|
|
19
|
-
// Overload for typed events
|
|
20
|
-
on<K extends keyof EventTypes>(
|
|
21
|
-
event: K,
|
|
22
|
-
listener: (...args: EventTypes[K]) => void,
|
|
23
|
-
): this;
|
|
24
|
-
// Fallback for compatibility with parent
|
|
25
|
-
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
26
|
-
on(event: any, listener: any): this {
|
|
27
|
-
return super.on(event, listener);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Overload for typed events
|
|
31
|
-
off<K extends keyof EventTypes>(
|
|
32
|
-
event: K,
|
|
33
|
-
listener: (...args: EventTypes[K]) => void,
|
|
34
|
-
): this;
|
|
35
|
-
// Fallback for compatibility with parent
|
|
36
|
-
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
37
|
-
off(event: any, listener: any): this {
|
|
38
|
-
return super.off(event, listener);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Overload for typed events
|
|
42
|
-
emit<K extends keyof EventTypes>(event: K, ...args: EventTypes[K]): boolean;
|
|
43
|
-
// Fallback for compatibility with parent
|
|
44
|
-
emit(event: string | symbol, ...args: any[]): boolean;
|
|
45
|
-
emit(event: any, ...args: any[]): boolean {
|
|
46
|
-
return super.emit(event, ...args);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Overload for typed events
|
|
50
|
-
once<K extends keyof EventTypes>(
|
|
51
|
-
event: K,
|
|
52
|
-
listener: (...args: EventTypes[K]) => void,
|
|
53
|
-
): this;
|
|
54
|
-
// Fallback for compatibility with parent
|
|
55
|
-
once(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
56
|
-
once(event: any, listener: any): this {
|
|
57
|
-
return super.once(event, listener);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
11
|
export type AgentHookEvents<
|
|
62
12
|
TContext = UnknownContext,
|
|
63
13
|
TOutput extends AgentOutputType = TextOutput,
|
|
@@ -108,7 +58,7 @@ export type AgentHookEvents<
|
|
|
108
58
|
export class AgentHooks<
|
|
109
59
|
TContext = UnknownContext,
|
|
110
60
|
TOutput extends AgentOutputType = TextOutput,
|
|
111
|
-
> extends
|
|
61
|
+
> extends Emitter<AgentHookEvents<TContext, TOutput>> {}
|
|
112
62
|
|
|
113
63
|
/**
|
|
114
64
|
* Events emitted by the kernl during execution.
|
|
@@ -178,4 +128,4 @@ export type KernlHookEvents<
|
|
|
178
128
|
export class KernlHooks<
|
|
179
129
|
TContext = UnknownContext,
|
|
180
130
|
TOutput extends AgentOutputType = TextOutput,
|
|
181
|
-
> extends
|
|
131
|
+
> extends Emitter<KernlHookEvents<TContext, TOutput>> {}
|
package/src/memory/memory.ts
CHANGED
package/src/realtime/index.ts
CHANGED
package/src/realtime/session.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Emitter } from "@kernl-sdk/shared";
|
|
3
2
|
import {
|
|
4
3
|
RealtimeModel,
|
|
5
4
|
RealtimeConnection,
|
|
6
5
|
RealtimeServerEvent,
|
|
7
6
|
RealtimeSessionConfig,
|
|
7
|
+
RealtimeChannel,
|
|
8
8
|
ToolCallEvent,
|
|
9
|
+
TransportStatus,
|
|
9
10
|
message,
|
|
10
11
|
} from "@kernl-sdk/protocol";
|
|
11
12
|
|
|
@@ -13,16 +14,28 @@ import { Context, UnknownContext } from "@/context";
|
|
|
13
14
|
import { MisconfiguredError } from "@/lib/error";
|
|
14
15
|
|
|
15
16
|
import { RealtimeAgent } from "./agent";
|
|
16
|
-
import type { RealtimeChannel } from "./channel";
|
|
17
17
|
import type { RealtimeSessionOptions } from "./types";
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Events emitted by a realtime session.
|
|
21
|
+
*/
|
|
22
|
+
export type RealtimeSessionEvents = {
|
|
23
|
+
audio: [event: RealtimeServerEvent];
|
|
24
|
+
transcript: [event: RealtimeServerEvent];
|
|
25
|
+
text: [event: RealtimeServerEvent];
|
|
26
|
+
error: [error: Error];
|
|
27
|
+
status: [status: TransportStatus];
|
|
28
|
+
};
|
|
29
|
+
|
|
19
30
|
/**
|
|
20
31
|
* A realtime session manages the connection to a realtime model.
|
|
21
32
|
*
|
|
22
33
|
* Handles the bidirectional communication between an agent and a model,
|
|
23
34
|
* including audio I/O (via channels), tool execution, and event routing.
|
|
24
35
|
*/
|
|
25
|
-
export class RealtimeSession<
|
|
36
|
+
export class RealtimeSession<
|
|
37
|
+
TContext = UnknownContext,
|
|
38
|
+
> extends Emitter<RealtimeSessionEvents> {
|
|
26
39
|
/**
|
|
27
40
|
* Session ID. Null until connected.
|
|
28
41
|
*/
|
|
@@ -85,6 +98,8 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
|
|
|
85
98
|
const options = {
|
|
86
99
|
...this.options.connectOptions,
|
|
87
100
|
sessionConfig,
|
|
101
|
+
credential:
|
|
102
|
+
this.options.credential ?? this.options.connectOptions?.credential,
|
|
88
103
|
};
|
|
89
104
|
|
|
90
105
|
this.connection = this.options.transport
|
|
@@ -94,6 +109,10 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
|
|
|
94
109
|
this.connection.on("event", this.onEvent.bind(this));
|
|
95
110
|
this.connection.on("error", (e) => this.emit("error", e));
|
|
96
111
|
this.connection.on("status", (s) => this.emit("status", s));
|
|
112
|
+
this.connection.on("interrupted", () => this.channel?.interrupt());
|
|
113
|
+
|
|
114
|
+
// Emit current status (may have been set before listeners attached)
|
|
115
|
+
this.emit("status", this.connection.status);
|
|
97
116
|
|
|
98
117
|
this.init();
|
|
99
118
|
}
|
|
@@ -114,6 +133,60 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
|
|
|
114
133
|
});
|
|
115
134
|
}
|
|
116
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Send audio to the model.
|
|
138
|
+
*/
|
|
139
|
+
sendAudio(audio: string): void {
|
|
140
|
+
this.connection?.send({ kind: "audio.input.append", audio });
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Commit the audio buffer (signal end of speech).
|
|
145
|
+
*/
|
|
146
|
+
commit(): void {
|
|
147
|
+
this.connection?.send({ kind: "audio.input.commit" });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Send a text message to the model.
|
|
152
|
+
*/
|
|
153
|
+
sendMessage(text: string): void {
|
|
154
|
+
this.connection?.send({
|
|
155
|
+
kind: "item.create",
|
|
156
|
+
item: message({ role: "user", text }),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Interrupt the current response.
|
|
162
|
+
*/
|
|
163
|
+
interrupt(): void {
|
|
164
|
+
this.connection?.send({ kind: "response.cancel" });
|
|
165
|
+
this.channel?.interrupt();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Mute audio input.
|
|
170
|
+
*/
|
|
171
|
+
mute(): void {
|
|
172
|
+
this.connection?.mute();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Unmute audio input.
|
|
177
|
+
*/
|
|
178
|
+
unmute(): void {
|
|
179
|
+
this.connection?.unmute();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Close the session and release resources.
|
|
184
|
+
*/
|
|
185
|
+
close(): void {
|
|
186
|
+
this.channel?.close();
|
|
187
|
+
this.connection?.close();
|
|
188
|
+
}
|
|
189
|
+
|
|
117
190
|
/**
|
|
118
191
|
* Build session configuration from agent.
|
|
119
192
|
*/
|
|
@@ -124,6 +197,11 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
|
|
|
124
197
|
instructions: await this.agent.instructions(this.context),
|
|
125
198
|
tools: tools.map((t) => t.serialize()),
|
|
126
199
|
voice: this.agent.voice,
|
|
200
|
+
turnDetection: { mode: "server_vad" },
|
|
201
|
+
audio: {
|
|
202
|
+
inputFormat: { mimeType: "audio/pcm", sampleRate: 24000 },
|
|
203
|
+
outputFormat: { mimeType: "audio/pcm", sampleRate: 24000 },
|
|
204
|
+
},
|
|
127
205
|
};
|
|
128
206
|
}
|
|
129
207
|
|
|
@@ -138,7 +216,7 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
|
|
|
138
216
|
*/
|
|
139
217
|
private onEvent(event: RealtimeServerEvent): void {
|
|
140
218
|
switch (event.kind) {
|
|
141
|
-
//
|
|
219
|
+
// audio output → 'audio'
|
|
142
220
|
case "audio.output.delta":
|
|
143
221
|
this.channel?.sendAudio(event.audio);
|
|
144
222
|
this.emit("audio", event);
|
|
@@ -147,28 +225,28 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
|
|
|
147
225
|
this.emit("audio", event);
|
|
148
226
|
break;
|
|
149
227
|
|
|
150
|
-
//
|
|
228
|
+
// speech transcriptions → 'transcript'
|
|
151
229
|
case "transcript.input":
|
|
152
230
|
case "transcript.output":
|
|
153
231
|
this.emit("transcript", event);
|
|
154
232
|
break;
|
|
155
233
|
|
|
156
|
-
//
|
|
234
|
+
// text output → 'text'
|
|
157
235
|
case "text.output":
|
|
158
236
|
this.emit("text", event);
|
|
159
237
|
break;
|
|
160
238
|
|
|
161
|
-
//
|
|
239
|
+
// ERrors → 'error'
|
|
162
240
|
case "session.error":
|
|
163
241
|
this.emit("error", event.error);
|
|
164
242
|
break;
|
|
165
243
|
|
|
166
|
-
//
|
|
244
|
+
// tool calls - handled internally
|
|
167
245
|
case "tool.call":
|
|
168
246
|
this.performActions(event);
|
|
169
247
|
break;
|
|
170
248
|
|
|
171
|
-
//
|
|
249
|
+
// session lifecycle - internal state
|
|
172
250
|
case "session.created":
|
|
173
251
|
this.id = event.session.id;
|
|
174
252
|
break;
|
|
@@ -202,58 +280,4 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
|
|
|
202
280
|
error: result.error ?? undefined,
|
|
203
281
|
});
|
|
204
282
|
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Send audio to the model.
|
|
208
|
-
*/
|
|
209
|
-
sendAudio(audio: string): void {
|
|
210
|
-
this.connection?.send({ kind: "audio.input.append", audio });
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Commit the audio buffer (signal end of speech).
|
|
215
|
-
*/
|
|
216
|
-
commit(): void {
|
|
217
|
-
this.connection?.send({ kind: "audio.input.commit" });
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Send a text message to the model.
|
|
222
|
-
*/
|
|
223
|
-
sendMessage(text: string): void {
|
|
224
|
-
this.connection?.send({
|
|
225
|
-
kind: "item.create",
|
|
226
|
-
item: message({ role: "user", text }),
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Interrupt the current response.
|
|
232
|
-
*/
|
|
233
|
-
interrupt(): void {
|
|
234
|
-
this.connection?.send({ kind: "response.cancel" });
|
|
235
|
-
this.channel?.interrupt();
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Mute audio input.
|
|
240
|
-
*/
|
|
241
|
-
mute(): void {
|
|
242
|
-
this.connection?.mute();
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Unmute audio input.
|
|
247
|
-
*/
|
|
248
|
-
unmute(): void {
|
|
249
|
-
this.connection?.unmute();
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Close the session and release resources.
|
|
254
|
-
*/
|
|
255
|
-
close(): void {
|
|
256
|
-
this.channel?.close();
|
|
257
|
-
this.connection?.close();
|
|
258
|
-
}
|
|
259
283
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
RealtimeModel,
|
|
3
|
+
RealtimeConnection,
|
|
4
|
+
RealtimeTransport,
|
|
5
|
+
RealtimeConnectOptions,
|
|
6
|
+
WebSocketConstructor,
|
|
7
|
+
} from "@kernl-sdk/protocol";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Options for creating a WebSocket transport.
|
|
11
|
+
*/
|
|
12
|
+
export interface WebSocketTransportOptions {
|
|
13
|
+
/**
|
|
14
|
+
* WebSocket constructor to use.
|
|
15
|
+
*
|
|
16
|
+
* Required in Node.js <22 (provide the 'ws' package).
|
|
17
|
+
* Optional in browsers and Node.js 22+ (uses globalThis.WebSocket).
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import WebSocket from 'ws';
|
|
22
|
+
* new WebSocketTransport({ websocket: WebSocket });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
websocket?: WebSocketConstructor;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* WebSocket transport for realtime connections.
|
|
30
|
+
*
|
|
31
|
+
* Use this transport when you need to provide a custom WebSocket implementation,
|
|
32
|
+
* such as the 'ws' package in Node.js <22.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* // Node.js <22
|
|
37
|
+
* import WebSocket from 'ws';
|
|
38
|
+
* const session = new RealtimeSession(agent, {
|
|
39
|
+
* transport: new WebSocketTransport({ websocket: WebSocket }),
|
|
40
|
+
* ...
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // Browser or Node.js 22+ - no transport needed
|
|
44
|
+
* const session = new RealtimeSession(agent, { ... });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export class WebSocketTransport implements RealtimeTransport {
|
|
48
|
+
readonly handlesAudio = false;
|
|
49
|
+
private WS: WebSocketConstructor | undefined;
|
|
50
|
+
|
|
51
|
+
constructor(options?: WebSocketTransportOptions) {
|
|
52
|
+
this.WS = options?.websocket;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async connect(
|
|
56
|
+
model: RealtimeModel,
|
|
57
|
+
options?: RealtimeConnectOptions,
|
|
58
|
+
): Promise<RealtimeConnection> {
|
|
59
|
+
return model.connect({
|
|
60
|
+
...options,
|
|
61
|
+
websocket: this.WS ?? options?.websocket,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
package/src/realtime/types.ts
CHANGED
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
RealtimeModel,
|
|
3
3
|
RealtimeTransport,
|
|
4
4
|
RealtimeConnectOptions,
|
|
5
|
+
RealtimeChannel,
|
|
6
|
+
ClientCredential,
|
|
5
7
|
} from "@kernl-sdk/protocol";
|
|
6
8
|
|
|
7
9
|
import { Context, UnknownContext } from "@/context";
|
|
8
10
|
import type { BaseAgentConfig } from "@/agent/base";
|
|
9
11
|
|
|
10
|
-
import type { RealtimeChannel } from "./channel";
|
|
11
|
-
|
|
12
12
|
/**
|
|
13
13
|
* Configuration for a realtime agent.
|
|
14
14
|
*/
|
|
@@ -66,6 +66,14 @@ export interface RealtimeSessionOptions<TContext = UnknownContext> {
|
|
|
66
66
|
*/
|
|
67
67
|
context?: Context<TContext>;
|
|
68
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Ephemeral credential for client-side connections.
|
|
71
|
+
*
|
|
72
|
+
* Obtained from model.authenticate() on the server.
|
|
73
|
+
* Shorthand for connectOptions.credential.
|
|
74
|
+
*/
|
|
75
|
+
credential?: ClientCredential;
|
|
76
|
+
|
|
69
77
|
/**
|
|
70
78
|
* Options passed to model.connect() or transport.connect().
|
|
71
79
|
*/
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from "node:events";
|
|
2
|
-
/**
|
|
3
|
-
* Base interface for audio I/O channels.
|
|
4
|
-
*
|
|
5
|
-
* Channels bridge between audio sources (browser mic, Twilio, Discord)
|
|
6
|
-
* and the realtime session. They handle audio capture/playback and emit
|
|
7
|
-
* events that the session listens to.
|
|
8
|
-
*
|
|
9
|
-
* Events emitted:
|
|
10
|
-
* - 'audio' (audio: string) - Raw audio chunk (base64)
|
|
11
|
-
* - 'commit' () - User finished speaking (VAD or manual)
|
|
12
|
-
* - 'interrupt' () - User started speaking mid-response
|
|
13
|
-
*/
|
|
14
|
-
export interface RealtimeChannel extends EventEmitter {
|
|
15
|
-
/**
|
|
16
|
-
* Send audio to be played/transmitted by the channel.
|
|
17
|
-
* Called by session when audio is received from the model.
|
|
18
|
-
*/
|
|
19
|
-
sendAudio(audio: string): void;
|
|
20
|
-
/**
|
|
21
|
-
* Interrupt current audio playback.
|
|
22
|
-
* Called by session when response is cancelled.
|
|
23
|
-
*/
|
|
24
|
-
interrupt(): void;
|
|
25
|
-
/**
|
|
26
|
-
* Clean up resources and close the channel.
|
|
27
|
-
*/
|
|
28
|
-
close(): void;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/realtime/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B;;;OAGG;IACH,SAAS,IAAI,IAAI,CAAC;IAElB;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf"}
|
package/dist/realtime/channel.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/src/realtime/channel.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from "node:events";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Base interface for audio I/O channels.
|
|
5
|
-
*
|
|
6
|
-
* Channels bridge between audio sources (browser mic, Twilio, Discord)
|
|
7
|
-
* and the realtime session. They handle audio capture/playback and emit
|
|
8
|
-
* events that the session listens to.
|
|
9
|
-
*
|
|
10
|
-
* Events emitted:
|
|
11
|
-
* - 'audio' (audio: string) - Raw audio chunk (base64)
|
|
12
|
-
* - 'commit' () - User finished speaking (VAD or manual)
|
|
13
|
-
* - 'interrupt' () - User started speaking mid-response
|
|
14
|
-
*/
|
|
15
|
-
export interface RealtimeChannel extends EventEmitter {
|
|
16
|
-
/**
|
|
17
|
-
* Send audio to be played/transmitted by the channel.
|
|
18
|
-
* Called by session when audio is received from the model.
|
|
19
|
-
*/
|
|
20
|
-
sendAudio(audio: string): void;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Interrupt current audio playback.
|
|
24
|
-
* Called by session when response is cancelled.
|
|
25
|
-
*/
|
|
26
|
-
interrupt(): void;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Clean up resources and close the channel.
|
|
30
|
-
*/
|
|
31
|
-
close(): void;
|
|
32
|
-
}
|