Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions agents/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,5 +220,51 @@ export const runApp = (opts: WorkerOptions) => {
});
});

program
.command('console')
.description('Start a new conversation inside the console')
.action(async () => {
const options = program.optsWithGlobals();
initializeLogger({ pretty: true, level: options.logLevel });
const logger = log();

if (!process.env.LIVEKIT_ENABLE_CONSOLE_MODE) {
logger.fatal('Console mode is disabled. Set LIVEKIT_ENABLE_CONSOLE_MODE=true to enable.');
process.exit(1);
}

try {
const mod = await import(new URL(opts.agent, import.meta.url).href);
const agentDef = mod?.default;

if (!agentDef?.entry) {
logger.fatal('default export must have an entry() function');
process.exit(1);
}

const { CurrentJobContext } = await import('./job.js');

const mockCtx = {
room: undefined,
proc: { userData: {} },
connect: async () => {},
inferenceExecutor: {
doInference: async () => ({}), // Mock inference executor for now to keep things simple
},
};

new CurrentJobContext(mockCtx as any);

if (agentDef.prewarm) {
await agentDef.prewarm(mockCtx.proc as any);
}

await agentDef.entry(mockCtx as any);
} catch (error) {
logger.fatal(error);
process.exit(1);
}
});

program.parse();
};
52 changes: 30 additions & 22 deletions agents/src/voice/agent_session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ export class AgentSession<
outputOptions,
}: {
agent: Agent;
room: Room;
room?: Room;
inputOptions?: Partial<RoomInputOptions>;
outputOptions?: Partial<RoomOutputOptions>;
}): Promise<void> {
Expand All @@ -180,30 +180,38 @@ export class AgentSession<
this.agent = agent;
this._updateAgentState('initializing');

// Check for existing input/output configuration and warn if needed
if (this.input.audio && inputOptions?.audioEnabled !== false) {
this.logger.warn('RoomIO audio input is enabled but input.audio is already set, ignoring..');
}
if (!room) {
const { ChatCLI } = await import('./chat_cli.js');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are we using dynamic import here?

const chatCli = new ChatCLI(this);
await chatCli.start();
} else {
// Room mode
if (this.input.audio && inputOptions?.audioEnabled !== false) {
this.logger.warn(
'RoomIO audio input is enabled but input.audio is already set, ignoring..',
);
}

if (this.output.audio && outputOptions?.audioEnabled !== false) {
this.logger.warn(
'RoomIO audio output is enabled but output.audio is already set, ignoring..',
);
}
if (this.output.audio && outputOptions?.audioEnabled !== false) {
this.logger.warn(
'RoomIO audio output is enabled but output.audio is already set, ignoring..',
);
}

if (this.output.transcription && outputOptions?.transcriptionEnabled !== false) {
this.logger.warn(
'RoomIO transcription output is enabled but output.transcription is already set, ignoring..',
);
}
if (this.output.transcription && outputOptions?.transcriptionEnabled !== false) {
this.logger.warn(
'RoomIO transcription output is enabled but output.transcription is already set, ignoring..',
);
}

this.roomIO = new RoomIO({
agentSession: this,
room,
inputOptions,
outputOptions,
});
this.roomIO.start();
this.roomIO = new RoomIO({
agentSession: this,
room,
inputOptions,
outputOptions,
});
this.roomIO.start();
}

this.updateActivity(this.agent);

Expand Down
Loading