Class: SpeechProviderResolver
Defined in: packages/agentos/src/speech/SpeechProviderResolver.ts:69
Central resolver for speech providers (STT, TTS, VAD, wake-word).
Resolution Algorithm
-
Registration — Providers are registered via
register()with a uniqueid, akind(stt/tts/vad/wake-word), a numericpriority, and a booleanisConfiguredflag. -
Filtering — When a consumer calls
resolveSTT(),resolveTTS(),resolveVAD(), orresolveWakeWord(), the resolver filters registrations bykindandisConfigured === true. -
Requirements matching — Optional ProviderRequirements further filter by
streaming,local, andfeaturescapabilities from the provider's catalog entry. -
Priority ordering — Remaining candidates are sorted by ascending
priority(lower number = tried first). Core providers default to 100, extensions to 200, and user-preferred providers get boosted to 50+. -
Fallback wrapping — When
config.stt.fallbackorconfig.tts.fallbackistrueand multiple candidates survive, they are wrapped in a FallbackSTTProxy or FallbackTTSProxy that tries each in order, emittingprovider_fallbackevents on failure.
Priority Tiers
| Tier | Priority Range | Source |
|---|---|---|
| User-preferred | 50–59 | config.stt.preferred / config.tts.preferred |
| Core | 100 | Built-in provider catalog |
| Extension | 200 | Discovered via ExtensionManager |
Events
| Event | Payload | When |
|---|---|---|
provider_registered | { id, kind, source } | A provider is registered via register() |
See
- FallbackSTTProxy for the STT fallback chain implementation
- FallbackTTSProxy for the TTS fallback chain implementation
- ProviderRequirements for available filtering criteria
Example
const resolver = new SpeechProviderResolver(
{ stt: { preferred: ['deepgram-batch'], fallback: true } },
process.env,
);
await resolver.refresh();
const stt = resolver.resolveSTT({ features: ['diarization'] });
Extends
EventEmitter
Constructors
Constructor
new SpeechProviderResolver(
config?,env?):SpeechProviderResolver
Defined in: packages/agentos/src/speech/SpeechProviderResolver.ts:95
Creates a new SpeechProviderResolver.
Parameters
config?
Optional resolver configuration controlling preferred providers and fallback behaviour for each provider kind.
env?
Record<string, string | undefined> = process.env
Environment variable map used to check whether a provider's
required API keys are present. Defaults to process.env so unit tests
can inject a controlled map without polluting the real environment.
Returns
SpeechProviderResolver
Example
// Production: use real env vars
const resolver = new SpeechProviderResolver({ stt: { fallback: true } });
// Testing: inject controlled env
const resolver = new SpeechProviderResolver(undefined, { OPENAI_API_KEY: 'test' });
Overrides
EventEmitter.constructor
Properties
captureRejections
staticcaptureRejections:boolean
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:426
Value: boolean
Change the default captureRejections option on all new EventEmitter objects.
Since
v13.4.0, v12.16.0
Inherited from
EventEmitter.captureRejections
captureRejectionSymbol
readonlystaticcaptureRejectionSymbol: typeofcaptureRejectionSymbol
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:419
Value: Symbol.for('nodejs.rejection')
See how to write a custom rejection handler.
Since
v13.4.0, v12.16.0
Inherited from
EventEmitter.captureRejectionSymbol
defaultMaxListeners
staticdefaultMaxListeners:number
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:465
By default, a maximum of 10 listeners can be registered for any single
event. This limit can be changed for individual EventEmitter instances
using the emitter.setMaxListeners(n) method. To change the default
for allEventEmitter instances, the events.defaultMaxListeners property
can be used. If this value is not a positive number, a RangeError is thrown.
Take caution when setting the events.defaultMaxListeners because the
change affects all EventEmitter instances, including those created before
the change is made. However, calling emitter.setMaxListeners(n) still has
precedence over events.defaultMaxListeners.
This is not a hard limit. The EventEmitter instance will allow
more listeners to be added but will output a trace warning to stderr indicating
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to
temporarily avoid this warning:
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings command-line flag can be used to display the
stack trace for such warnings.
The emitted warning can be inspected with process.on('warning') and will
have the additional emitter, type, and count properties, referring to
the event emitter instance, the event's name and the number of attached
listeners, respectively.
Its name property is set to 'MaxListenersExceededWarning'.
Since
v0.11.2
Inherited from
EventEmitter.defaultMaxListeners
errorMonitor
readonlystaticerrorMonitor: typeoferrorMonitor
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:412
This symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.
Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no
regular 'error' listener is installed.
Since
v13.6.0, v12.17.0
Inherited from
EventEmitter.errorMonitor
Methods
[captureRejectionSymbol]()?
optional[captureRejectionSymbol]<K>(error,event, ...args):void
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:103
Type Parameters
K
K
Parameters
error
Error
event
string | symbol
args
...AnyRest
Returns
void
Inherited from
EventEmitter.[captureRejectionSymbol]
addListener()
addListener<
K>(eventName,listener):this
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:643
Alias for emitter.on(eventName, listener).
Type Parameters
K
K
Parameters
eventName
string | symbol
listener
(...args) => void
Returns
this
Since
v0.1.26
Inherited from
EventEmitter.addListener
emit()
emit<
K>(eventName, ...args):boolean
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:905
Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments
to each.
Returns true if the event had listeners, false otherwise.
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
K
K
Parameters
eventName
string | symbol
args
...AnyRest
Returns
boolean
Since
v0.1.26
Inherited from
EventEmitter.emit
eventNames()
eventNames(): (
string|symbol)[]
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:968
Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbols.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns
(string | symbol)[]
Since
v6.0.0
Inherited from
EventEmitter.eventNames
getMaxListeners()
getMaxListeners():
number
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:820
Returns the current max listener value for the EventEmitter which is either
set by emitter.setMaxListeners(n) or defaults to EventEmitter.defaultMaxListeners.
Returns
number
Since
v1.0.0
Inherited from
EventEmitter.getMaxListeners
listenerCount()
listenerCount<
K>(eventName,listener?):number
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:914
Returns the number of listeners listening for the event named eventName.
If listener is provided, it will return how many times the listener is found
in the list of the listeners of the event.
Type Parameters
K
K
Parameters
eventName
The name of the event being listened for
string | symbol
listener?
Function
The event handler function
Returns
number
Since
v3.2.0
Inherited from
EventEmitter.listenerCount
listeners()
listeners<
K>(eventName):Function[]
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:833
Returns a copy of the array of listeners for the event named eventName.
server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
K
K
Parameters
eventName
string | symbol
Returns
Function[]
Since
v0.1.26
Inherited from
EventEmitter.listeners
listProviders()
listProviders(
kind):ProviderRegistration[]
Defined in: packages/agentos/src/speech/SpeechProviderResolver.ts:146
List all registrations for a given provider kind, sorted ascending by priority (lower number = higher priority = tried first).
This returns both configured and unconfigured providers — use
.filter(r => r.isConfigured) if you only want usable ones.
Parameters
kind
The provider kind to filter by.
Returns
A new array of registrations sorted by ascending priority.
Example
const allSTT = resolver.listProviders('stt');
const configured = allSTT.filter(r => r.isConfigured);
console.log(`${configured.length} of ${allSTT.length} STT providers ready`);
off()
off<
K>(eventName,listener):this
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:793
Alias for emitter.removeListener().
Type Parameters
K
K
Parameters
eventName
string | symbol
listener
(...args) => void
Returns
this
Since
v10.0.0
Inherited from
EventEmitter.off
on()
on<
K>(eventName,listener):this
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:675
Adds the listener function to the end of the listeners array for the event
named eventName. No checks are made to see if the listener has already
been added. Multiple calls passing the same combination of eventName and
listener will result in the listener being added, and called, multiple times.
server.on('connection', (stream) => {
console.log('someone connected!');
});
Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the
event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
K
K
Parameters
eventName
The name of the event.
string | symbol
listener
(...args) => void
The callback function
Returns
this
Since
v0.1.101
Inherited from
EventEmitter.on
once()
once<
K>(eventName,listener):this
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:705
Adds a one-time listener function for the event named eventName. The
next time eventName is triggered, this listener is removed and then invoked.
server.once('connection', (stream) => {
console.log('Ah, we have our first user!');
});
Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the
event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
K
K