Skip to content

Commit babb23f

Browse files
authored
Merge branch 'develop' into solana_transaction_more_lenient
2 parents 81f72e4 + 94daffc commit babb23f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+3614
-3586
lines changed

.env.example

+38-27
Original file line numberDiff line numberDiff line change
@@ -100,32 +100,32 @@ MEDIUM_HYPERBOLIC_MODEL= # Default: meta-llama/Meta-Llama-3.1-70B-Instruc
100100
LARGE_HYPERBOLIC_MODEL= # Default: meta-llama/Meta-Llama-3.1-405-Instruct
101101

102102
# Infera Configuration
103-
INFERA_API_KEY= # visit api.infera.org/docs to obtain an API key under /signup_user
104-
INFERA_MODEL= # Default: llama3.2:latest
105-
INFERA_SERVER_URL= # Default: https://api.infera.org/
106-
SMALL_INFERA_MODEL= #Recommended: llama3.2:latest
107-
MEDIUM_INFERA_MODEL= #Recommended: mistral-nemo:latest
108-
LARGE_INFERA_MODEL= #Recommended: mistral-small:latest
109-
110-
# Venice Configuration
111-
VENICE_API_KEY= # generate from venice settings
112-
SMALL_VENICE_MODEL= # Default: llama-3.3-70b
113-
MEDIUM_VENICE_MODEL= # Default: llama-3.3-70b
114-
LARGE_VENICE_MODEL= # Default: llama-3.1-405b
115-
IMAGE_VENICE_MODEL= # Default: fluently-xl
116-
117-
# Nineteen.ai Configuration
118-
NINETEEN_AI_API_KEY= # Get a free api key from https://nineteen.ai/app/api
119-
SMALL_NINETEEN_AI_MODEL= # Default: unsloth/Llama-3.2-3B-Instruct
120-
MEDIUM_NINETEEN_AI_MODEL= # Default: unsloth/Meta-Llama-3.1-8B-Instruct
121-
LARGE_NINETEEN_AI_MODEL= # Default: hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4
122-
IMAGE_NINETEEN_AI_MODE= # Default: dataautogpt3/ProteusV0.4-Lightning
123-
124-
# Akash Chat API Configuration docs: https://chatapi.akash.network/documentation
125-
AKASH_CHAT_API_KEY= # Get from https://chatapi.akash.network/
126-
SMALL_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-2-3B-Instruct
127-
MEDIUM_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-3-70B-Instruct
128-
LARGE_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-1-405B-Instruct-FP8
103+
INFERA_API_KEY= # visit api.infera.org/docs to obtain an API key under /signup_user
104+
INFERA_MODEL= # Default: llama3.2:latest
105+
INFERA_SERVER_URL= # Default: https://api.infera.org/
106+
SMALL_INFERA_MODEL= #Recommended: llama3.2:latest
107+
MEDIUM_INFERA_MODEL= #Recommended: mistral-nemo:latest
108+
LARGE_INFERA_MODEL= #Recommended: mistral-small:latest
109+
110+
# Venice Configuration
111+
VENICE_API_KEY= # generate from venice settings
112+
SMALL_VENICE_MODEL= # Default: llama-3.3-70b
113+
MEDIUM_VENICE_MODEL= # Default: llama-3.3-70b
114+
LARGE_VENICE_MODEL= # Default: llama-3.1-405b
115+
IMAGE_VENICE_MODEL= # Default: fluently-xl
116+
117+
# Nineteen.ai Configuration
118+
NINETEEN_AI_API_KEY= # Get a free api key from https://nineteen.ai/app/api
119+
SMALL_NINETEEN_AI_MODEL= # Default: unsloth/Llama-3.2-3B-Instruct
120+
MEDIUM_NINETEEN_AI_MODEL= # Default: unsloth/Meta-Llama-3.1-8B-Instruct
121+
LARGE_NINETEEN_AI_MODEL= # Default: hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4
122+
IMAGE_NINETEEN_AI_MODE= # Default: dataautogpt3/ProteusV0.4-Lightning
123+
124+
# Akash Chat API Configuration docs: https://chatapi.akash.network/documentation
125+
AKASH_CHAT_API_KEY= # Get from https://chatapi.akash.network/
126+
SMALL_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-2-3B-Instruct
127+
MEDIUM_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-3-70B-Instruct
128+
LARGE_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-1-405B-Instruct-FP8
129129

130130
# Livepeer configuration
131131
LIVEPEER_GATEWAY_URL= # Free inference gateways and docs: https://livepeer-eliza.com/
@@ -238,6 +238,13 @@ MEDIUM_VOLENGINE_MODEL= # Default: doubao-pro-128k
238238
LARGE_VOLENGINE_MODEL= # Default: doubao-pro-256k
239239
VOLENGINE_EMBEDDING_MODEL= # Default: doubao-embedding
240240

241+
# DeepSeek Configuration
242+
DEEPSEEK_API_URL= # Default: https://api.deepseek.com
243+
SMALL_DEEPSEEK_MODEL= # Default: deepseek-chat
244+
MEDIUM_DEEPSEEK_MODEL= # Default: deepseek-chat
245+
LARGE_DEEPSEEK_MODEL= # Default: deepseek-chat
246+
247+
241248
# fal.ai Configuration
242249
FAL_API_KEY=
243250
FAL_AI_LORA_PATH=
@@ -541,4 +548,8 @@ AKASH_MANIFEST_MODE=auto
541548
# Default: Will use the SDL directory
542549
AKASH_MANIFEST_PATH=
543550
# Values: "strict" | "lenient" | "none" - Default: "strict"
544-
AKASH_MANIFEST_VALIDATION_LEVEL=strict
551+
AKASH_MANIFEST_VALIDATION_LEVEL=strict
552+
553+
# Quai Network Ecosystem
554+
QUAI_PRIVATE_KEY=
555+
QUAI_RPC_URL=https://rpc.quai.network

agent/package.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
"@elizaos/plugin-0g": "workspace:*",
3535
"@elizaos/plugin-abstract": "workspace:*",
3636
"@elizaos/plugin-aptos": "workspace:*",
37-
"@elizaos/plugin-coingecko": "workspace:*",
3837
"@elizaos/plugin-coinmarketcap": "workspace:*",
3938
"@elizaos/plugin-coingecko": "workspace:*",
4039
"@elizaos/plugin-binance": "workspace:*",
@@ -54,7 +53,8 @@
5453
"@elizaos/plugin-icp": "workspace:*",
5554
"@elizaos/plugin-image-generation": "workspace:*",
5655
"@elizaos/plugin-movement": "workspace:*",
57-
"@elizaos/plugin-nft-generation": "workspace:*",
56+
"@elizaos/plugin-massa": "workspace:*",
57+
"@elizaos/plugin-nft-generation": "workspace:*",
5858
"@elizaos/plugin-node": "workspace:*",
5959
"@elizaos/plugin-solana": "workspace:*",
6060
"@elizaos/plugin-solana-agentkit": "workspace:*",
@@ -72,6 +72,7 @@
7272
"@elizaos/plugin-near": "workspace:*",
7373
"@elizaos/plugin-zksync-era": "workspace:*",
7474
"@elizaos/plugin-twitter": "workspace:*",
75+
"@elizaos/plugin-primus": "workspace:*",
7576
"@elizaos/plugin-cronoszkevm": "workspace:*",
7677
"@elizaos/plugin-3d-generation": "workspace:*",
7778
"@elizaos/plugin-fuel": "workspace:*",
@@ -89,6 +90,7 @@
8990
"@elizaos/plugin-opacity": "workspace:*",
9091
"@elizaos/plugin-hyperliquid": "workspace:*",
9192
"@elizaos/plugin-akash": "workspace:*",
93+
"@elizaos/plugin-quai": "workspace:*",
9294
"readline": "1.3.0",
9395
"ws": "8.18.0",
9496
"yargs": "17.7.2"

agent/src/index.ts

+77-26
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { SlackClientInterface } from "@elizaos/client-slack";
1010
import { TelegramClientInterface } from "@elizaos/client-telegram";
1111
import { TwitterClientInterface } from "@elizaos/client-twitter";
1212
// import { ReclaimAdapter } from "@elizaos/plugin-reclaim";
13+
import { DirectClient } from "@elizaos/client-direct";
14+
import { PrimusAdapter } from "@elizaos/plugin-primus";
15+
1316
import {
1417
AgentRuntime,
1518
CacheManager,
@@ -91,12 +94,14 @@ import { OpacityAdapter } from "@elizaos/plugin-opacity";
9194
import { openWeatherPlugin } from "@elizaos/plugin-open-weather";
9295
import { stargazePlugin } from "@elizaos/plugin-stargaze";
9396
import { akashPlugin } from "@elizaos/plugin-akash";
97+
import { quaiPlugin } from "@elizaos/plugin-quai";
9498
import Database from "better-sqlite3";
9599
import fs from "fs";
96100
import net from "net";
97101
import path from "path";
98102
import { fileURLToPath } from "url";
99103
import yargs from "yargs";
104+
import {dominosPlugin} from "@elizaos/plugin-dominos";
100105

101106
const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file
102107
const __dirname = path.dirname(__filename); // get the name of the directory
@@ -143,6 +148,61 @@ function tryLoadFile(filePath: string): string | null {
143148
return null;
144149
}
145150
}
151+
function mergeCharacters(base: Character, child: Character): Character {
152+
const mergeObjects = (baseObj: any, childObj: any) => {
153+
const result: any = {};
154+
const keys = new Set([...Object.keys(baseObj || {}), ...Object.keys(childObj || {})]);
155+
keys.forEach(key => {
156+
if (typeof baseObj[key] === 'object' && typeof childObj[key] === 'object' && !Array.isArray(baseObj[key]) && !Array.isArray(childObj[key])) {
157+
result[key] = mergeObjects(baseObj[key], childObj[key]);
158+
} else if (Array.isArray(baseObj[key]) || Array.isArray(childObj[key])) {
159+
result[key] = [...(baseObj[key] || []), ...(childObj[key] || [])];
160+
} else {
161+
result[key] = childObj[key] !== undefined ? childObj[key] : baseObj[key];
162+
}
163+
});
164+
return result;
165+
};
166+
return mergeObjects(base, child);
167+
}
168+
async function loadCharacter(filePath: string): Promise<Character> {
169+
const content = tryLoadFile(filePath);
170+
if (!content) {
171+
throw new Error(`Character file not found: ${filePath}`);
172+
}
173+
let character = JSON.parse(content);
174+
validateCharacterConfig(character);
175+
176+
// .id isn't really valid
177+
const characterId = character.id || character.name;
178+
const characterPrefix = `CHARACTER.${characterId.toUpperCase().replace(/ /g, "_")}.`;
179+
const characterSettings = Object.entries(process.env)
180+
.filter(([key]) => key.startsWith(characterPrefix))
181+
.reduce((settings, [key, value]) => {
182+
const settingKey = key.slice(characterPrefix.length);
183+
return { ...settings, [settingKey]: value };
184+
}, {});
185+
if (Object.keys(characterSettings).length > 0) {
186+
character.settings = character.settings || {};
187+
character.settings.secrets = {
188+
...characterSettings,
189+
...character.settings.secrets,
190+
};
191+
}
192+
// Handle plugins
193+
character.plugins = await handlePluginImporting(
194+
character.plugins
195+
);
196+
if (character.extends) {
197+
elizaLogger.info(`Merging ${character.name} character with parent characters`);
198+
for (const extendPath of character.extends) {
199+
const baseCharacter = await loadCharacter(path.resolve(path.dirname(filePath), extendPath));
200+
character = mergeCharacters(baseCharacter, character);
201+
elizaLogger.info(`Merged ${character.name} with ${baseCharacter.name}`);
202+
}
203+
}
204+
return character;
205+
}
146206

147207
export async function loadCharacters(
148208
charactersArg: string
@@ -206,32 +266,7 @@ export async function loadCharacters(
206266
}
207267

208268
try {
209-
const character = JSON.parse(content);
210-
validateCharacterConfig(character);
211-
212-
// .id isn't really valid
213-
const characterId = character.id || character.name;
214-
const characterPrefix = `CHARACTER.${characterId.toUpperCase().replace(/ /g, "_")}.`;
215-
216-
const characterSettings = Object.entries(process.env)
217-
.filter(([key]) => key.startsWith(characterPrefix))
218-
.reduce((settings, [key, value]) => {
219-
const settingKey = key.slice(characterPrefix.length);
220-
return { ...settings, [settingKey]: value };
221-
}, {});
222-
223-
if (Object.keys(characterSettings).length > 0) {
224-
character.settings = character.settings || {};
225-
character.settings.secrets = {
226-
...characterSettings,
227-
...character.settings.secrets,
228-
};
229-
}
230-
231-
// Handle plugins
232-
character.plugins = await handlePluginImporting(
233-
character.plugins
234-
);
269+
const character: Character = await loadCharacter(resolvedPath);
235270

236271
loadedCharacters.push(character);
237272
elizaLogger.info(
@@ -621,6 +656,19 @@ export async function createAgent(
621656
elizaLogger.log("modelProvider", character.modelProvider);
622657
elizaLogger.log("token", token);
623658
}
659+
if (
660+
process.env.PRIMUS_APP_ID &&
661+
process.env.PRIMUS_APP_SECRET &&
662+
process.env.VERIFIABLE_INFERENCE_ENABLED === "true"){
663+
verifiableInferenceAdapter = new PrimusAdapter({
664+
appId: process.env.PRIMUS_APP_ID,
665+
appSecret: process.env.PRIMUS_APP_SECRET,
666+
attMode: "proxytls",
667+
modelProvider: character.modelProvider,
668+
token,
669+
});
670+
elizaLogger.log("Verifiable inference primus adapter initialized");
671+
}
624672

625673
return new AgentRuntime({
626674
databaseAdapter: db,
@@ -773,6 +821,9 @@ export async function createAgent(
773821
getSecret(character, "AKASH_WALLET_ADDRESS")
774822
? akashPlugin
775823
: null,
824+
getSecret(character, "QUAI_PRIVATE_KEY")
825+
? quaiPlugin
826+
: null,
776827
].filter(Boolean),
777828
providers: [],
778829
actions: [],

packages/client-discord/src/actions/joinvoice.ts

+16-16
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
IAgentRuntime,
99
Memory,
1010
State,
11+
generateText,
12+
ModelClass,
1113
} from "@elizaos/core";
1214
import {
1315
Channel,
@@ -17,6 +19,7 @@ import {
1719
Guild,
1820
GuildMember,
1921
} from "discord.js";
22+
import { joinVoiceChannel } from "@discordjs/voice";
2023

2124
export default {
2225
name: "JOIN_VOICE",
@@ -66,12 +69,7 @@ export default {
6669
return false;
6770
}
6871

69-
const client = state.discordClient as Client;
70-
71-
// Check if the client is connected to any voice channel
72-
const isConnectedToVoice = client.voice.adapters.size === 0;
73-
74-
return isConnectedToVoice;
72+
return true;
7573
},
7674
description: "Join a voice channel to participate in voice chat.",
7775
handler: async (
@@ -115,31 +113,30 @@ export default {
115113
);
116114
});
117115

118-
if (!state.voiceManager) {
119-
state.voiceManager = new VoiceManager({
120-
client: state.discordClient,
121-
runtime: runtime,
122-
});
123-
}
124-
125116
if (targetChannel) {
126-
state.voiceManager.joinVoiceChannel({
117+
joinVoiceChannel({
127118
channelId: targetChannel.id,
128119
guildId: (discordMessage as DiscordMessage).guild?.id as string,
129120
adapterCreator: (client.guilds.cache.get(id) as Guild)
130121
.voiceAdapterCreator,
122+
selfDeaf: false,
123+
selfMute: false,
124+
group: client.user.id,
131125
});
132126
return true;
133127
} else {
134128
const member = (discordMessage as DiscordMessage)
135129
.member as GuildMember;
136130
if (member?.voice?.channel) {
137-
state.voiceManager.joinVoiceChannel({
131+
joinVoiceChannel({
138132
channelId: member.voice.channel.id,
139133
guildId: (discordMessage as DiscordMessage).guild
140134
?.id as string,
141135
adapterCreator: (client.guilds.cache.get(id) as Guild)
142136
.voiceAdapterCreator,
137+
selfDeaf: false,
138+
selfMute: false,
139+
group: client.user.id,
143140
});
144141
return true;
145142
}
@@ -204,12 +201,15 @@ You should only respond with the name of the voice channel or none, no commentar
204201
});
205202

206203
if (targetChannel) {
207-
state.voiceManager.joinVoiceChannel({
204+
joinVoiceChannel({
208205
channelId: targetChannel.id,
209206
guildId: (discordMessage as DiscordMessage).guild
210207
?.id as string,
211208
adapterCreator: (client.guilds.cache.get(id) as Guild)
212209
.voiceAdapterCreator,
210+
selfDeaf: false,
211+
selfMute: false,
212+
group: client.user.id,
213213
});
214214
return true;
215215
}

packages/core/src/defaultCharacter.ts

+1
Original file line numberDiff line numberDiff line change
@@ -527,4 +527,5 @@ export const defaultCharacter: Character = {
527527
"meticulous",
528528
"provocative",
529529
],
530+
extends: [],
530531
};

packages/core/src/environment.ts

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ export const CharacterSchema = z.object({
135135
prompt: z.string().optional(),
136136
})
137137
.optional(),
138+
extends: z.array(z.string()).optional(),
138139
});
139140

140141
// Type inference

0 commit comments

Comments
 (0)