Skip to content

Commit 893729b

Browse files
committed
implement runtime.clients as a dict, make character settings optional, improve client guards, upload clients into runtime, make startAgent return runtime
1 parent 9e9d23b commit 893729b

File tree

1 file changed

+35
-17
lines changed

1 file changed

+35
-17
lines changed

agent/src/index.ts

+35-17
Original file line numberDiff line numberDiff line change
@@ -318,42 +318,53 @@ function initializeDatabase(dataDir: string) {
318318
}
319319
}
320320

321+
// also adds plugins from character file into the runtime
321322
export async function initializeClients(
322323
character: Character,
323324
runtime: IAgentRuntime
324325
) {
325-
const clients = [];
326-
const clientTypes =
326+
// each client can only register once
327+
// and if we want two we can explicitly support it
328+
const clients:Record<string, any> = {};
329+
const clientTypes:string[] =
327330
character.clients?.map((str) => str.toLowerCase()) || [];
331+
elizaLogger.log('initializeClients', clientTypes, 'for', character.name)
328332

329333
if (clientTypes.includes("auto")) {
330334
const autoClient = await AutoClientInterface.start(runtime);
331-
if (autoClient) clients.push(autoClient);
335+
if (autoClient) clients.auto = autoClient;
332336
}
333337

334338
if (clientTypes.includes("discord")) {
335-
clients.push(await DiscordClientInterface.start(runtime));
339+
const discordClient = await DiscordClientInterface.start(runtime);
340+
if (discordClient) clients.discord = discordClient;
336341
}
337342

338343
if (clientTypes.includes("telegram")) {
339344
const telegramClient = await TelegramClientInterface.start(runtime);
340-
if (telegramClient) clients.push(telegramClient);
345+
if (telegramClient) clients.telegram = telegramClient;
341346
}
342347

343348
if (clientTypes.includes("twitter")) {
344349
TwitterClientInterface.enableSearch = !isFalsish(getSecret(character, "TWITTER_SEARCH_ENABLE"));
345-
const twitterClients = await TwitterClientInterface.start(runtime);
346-
clients.push(twitterClients);
350+
const twitterClient = await TwitterClientInterface.start(runtime);
351+
if (twitterClient) clients.twitter = twitterClient;
347352
}
348353

349354
if (clientTypes.includes("farcaster")) {
350-
const farcasterClients = new FarcasterAgentClient(runtime);
351-
farcasterClients.start();
352-
clients.push(farcasterClients);
355+
// why is this one different :(
356+
const farcasterClient = new FarcasterAgentClient(runtime);
357+
if (farcasterClient) {
358+
farcasterClient.start();
359+
clients.farcaster = farcasterClient;
360+
}
353361
}
354362

363+
elizaLogger.log('client keys', Object.keys(clients));
364+
355365
if (character.plugins?.length > 0) {
356366
for (const plugin of character.plugins) {
367+
// if plugin has clients, add those..
357368
if (plugin.clients) {
358369
for (const client of plugin.clients) {
359370
clients.push(await client.start(runtime));
@@ -382,7 +393,7 @@ function isFalsish(input: any): boolean {
382393
}
383394

384395
function getSecret(character: Character, secret: string) {
385-
return character.settings.secrets?.[secret] || process.env[secret];
396+
return character.settings?.secrets?.[secret] || process.env[secret];
386397
}
387398

388399
let nodePlugin: any | undefined;
@@ -392,7 +403,7 @@ export async function createAgent(
392403
db: IDatabaseAdapter,
393404
cache: ICacheManager,
394405
token: string
395-
) {
406+
):AgentRuntime {
396407
elizaLogger.success(
397408
elizaLogger.successesTitle,
398409
"Creating runtime for character",
@@ -425,6 +436,7 @@ export async function createAgent(
425436
modelProvider: character.modelProvider,
426437
evaluators: [],
427438
character,
439+
// character.plugins are handled when clients are added
428440
plugins: [
429441
bootstrapPlugin,
430442
getSecret(character, "CONFLUX_CORE_PRIVATE_KEY")
@@ -495,7 +507,7 @@ function initializeDbCache(character: Character, db: IDatabaseCacheAdapter) {
495507
return cache;
496508
}
497509

498-
async function startAgent(character: Character, directClient) {
510+
async function startAgent(character: Character, directClient):AgentRuntime {
499511
let db: IDatabaseAdapter & IDatabaseCacheAdapter;
500512
try {
501513
character.id ??= stringToUuid(character.name);
@@ -514,15 +526,21 @@ async function startAgent(character: Character, directClient) {
514526
await db.init();
515527

516528
const cache = initializeDbCache(character, db);
517-
const runtime = await createAgent(character, db, cache, token);
529+
const runtime:AgentRuntime = await createAgent(character, db, cache, token);
518530

531+
// start services/plugins/process knowledge
519532
await runtime.initialize();
520533

521-
const clients = await initializeClients(character, runtime);
534+
// start assigned clients
535+
runtime.clients = await initializeClients(character, runtime);
522536

537+
// add to container
523538
directClient.registerAgent(runtime);
524539

525-
return clients;
540+
// report to console
541+
elizaLogger.debug(`Started ${character.name} as ${runtime.agentId}`)
542+
543+
return runtime;
526544
} catch (error) {
527545
elizaLogger.error(
528546
`Error starting agent for character ${character.name}:`,
@@ -566,8 +584,8 @@ const startAgents = async () => {
566584
});
567585
}
568586

569-
elizaLogger.log("Chat started. Type 'exit' to quit.");
570587
if (!args["non-interactive"]) {
588+
elizaLogger.log("Chat started. Type 'exit' to quit.");
571589
chat();
572590
}
573591
};

0 commit comments

Comments
 (0)