Skip to content

Commit c733bfa

Browse files
authored
feat: Add support for Secret AI LLM (elizaOS#3615)
* Add support for Secret AI LLM * Add missing brackets
1 parent 295aca8 commit c733bfa

File tree

5 files changed

+113
-2
lines changed

5 files changed

+113
-2
lines changed

.env.example

+8-2
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,13 @@ SMALL_LMSTUDIO_MODEL= # Default: hermes-3-llama-3.1-8b
352352
MEDIUM_LMSTUDIO_MODEL= # Default: hermes-3-llama-3.1-8b
353353
LARGE_LMSTUDIO_MODEL= # Default: hermes-3-llama-3.1-8b
354354

355+
# Secret AI Configuration
356+
SECRET_AI_API_KEY= # Secret AI API Key
357+
SECRET_AI_URL= # Default: https://ai1.scrtlabs.com:21434
358+
SMALL_SECRET_AI_MODEL= # Default: deepseek-r1:70b
359+
MEDIUM_SECRET_AI_MODEL= # Default: deepseek-r1:70b
360+
LARGE_SECRET_AI_MODEL= # Default: deepseek-r1:70b
361+
355362
# NEAR AI (https://near.ai) Configuration
356363
NEARAI_API_URL= # Default: https://api.near.ai/v1
357364
NEARAI_API_KEY= # NEAR AI API Key (optional). If you have run `nearai login` with NEAR AI CLI, the API key will be parsed from `~/.nearai/config.json`: https://docs.near.ai/agents/quickstart/
@@ -978,7 +985,6 @@ BUNDLE_EXECUTOR_ADDRESS= # Address of the bundle executor contract
978985
DESK_EXCHANGE_PRIVATE_KEY= # Required for trading and cancelling orders
979986
DESK_EXCHANGE_NETWORK= # "mainnet" or "testnet
980987

981-
982988
# Compass plugin configuration
983989
COMPASS_WALLET_PRIVATE_KEY=
984990
COMPASS_ARBITRUM_RPC_URL=
@@ -991,4 +997,4 @@ DATA_AUTH_TOKEN= # Your d.a.t.a auth token
991997

992998
# NKN Configuration
993999
NKN_CLIENT_PRIVATE_KEY= # Required, NKN client private key
994-
NKN_CLIENT_ID= # Optional, NKN client ID
1000+
NKN_CLIENT_ID= # Optional, NKN client ID

agent/src/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,11 @@ export function getTokenForProvider(
546546
character.settings?.secrets?.LIVEPEER_GATEWAY_URL ||
547547
settings.LIVEPEER_GATEWAY_URL
548548
);
549+
case ModelProviderName.SECRETAI:
550+
return (
551+
character.settings?.secrets?.SECRET_AI_API_KEY ||
552+
settings.SECRET_AI_API_KEY
553+
);
549554
case ModelProviderName.NEARAI:
550555
try {
551556
const config = JSON.parse(fs.readFileSync(path.join(os.homedir(), '.nearai/config.json'), 'utf8'));

packages/core/src/generation.ts

+66
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,34 @@ export async function generateText({
12911291
break;
12921292
}
12931293

1294+
case ModelProviderName.SECRETAI:
1295+
{
1296+
elizaLogger.debug("Initializing SecretAI model.");
1297+
1298+
const secretAiProvider = createOllama({
1299+
baseURL: getEndpoint(provider) + "/api",
1300+
fetch: runtime.fetch,
1301+
headers: {
1302+
"Content-Type": "application/json",
1303+
Authorization: `Bearer ${apiKey}`,
1304+
}
1305+
});
1306+
const secretAi = secretAiProvider(model);
1307+
1308+
const { text: secretAiResponse } = await aiGenerateText({
1309+
model: secretAi,
1310+
prompt: context,
1311+
tools: tools,
1312+
onStepFinish: onStepFinish,
1313+
temperature: temperature,
1314+
maxSteps: maxSteps,
1315+
maxTokens: max_response_length,
1316+
});
1317+
1318+
response = secretAiResponse;
1319+
}
1320+
break;
1321+
12941322
case ModelProviderName.BEDROCK: {
12951323
elizaLogger.debug("Initializing Bedrock model.");
12961324

@@ -1696,6 +1724,8 @@ export const generateImage = async (
16961724
return runtime.getSetting("VENICE_API_KEY");
16971725
case ModelProviderName.LIVEPEER:
16981726
return runtime.getSetting("LIVEPEER_GATEWAY_URL");
1727+
case ModelProviderName.SECRETAI:
1728+
return runtime.getSetting("SECRET_AI_API_KEY");
16991729
default:
17001730
// If no specific match, try the fallback chain
17011731
return (
@@ -2239,6 +2269,8 @@ export async function handleProvider(
22392269
return await handleDeepSeek(options);
22402270
case ModelProviderName.LIVEPEER:
22412271
return await handleLivepeer(options);
2272+
case ModelProviderName.SECRETAI:
2273+
return await handleSecretAi(options);
22422274
default: {
22432275
const errorMessage = `Unsupported provider: ${provider}`;
22442276
elizaLogger.error(errorMessage);
@@ -2587,6 +2619,40 @@ async function handleLivepeer({
25872619
});
25882620
}
25892621

2622+
/**
2623+
* Handles object generation for Secret AI models.
2624+
*
2625+
* @param {ProviderOptions} options - Options specific to Secret AI.
2626+
* @returns {Promise<GenerateObjectResult<unknown>>} - A promise that resolves to generated objects.
2627+
*/
2628+
async function handleSecretAi({
2629+
model,
2630+
apiKey,
2631+
schema,
2632+
schemaName,
2633+
schemaDescription,
2634+
mode = "json",
2635+
modelOptions,
2636+
provider,
2637+
}: ProviderOptions): Promise<GenerateObjectResult<unknown>> {
2638+
const secretAiProvider = createOllama({
2639+
baseURL: getEndpoint(provider) + "/api",
2640+
headers: {
2641+
"Content-Type": "application/json",
2642+
Authorization: `Bearer ${apiKey}`,
2643+
}
2644+
});
2645+
const secretAi = secretAiProvider(model);
2646+
return await aiGenerateObject({
2647+
model: secretAi,
2648+
schema,
2649+
schemaName,
2650+
schemaDescription,
2651+
mode,
2652+
...modelOptions,
2653+
});
2654+
}
2655+
25902656
// Add type definition for Together AI response
25912657
interface TogetherAIImageResponse {
25922658
data: Array<{

packages/core/src/models.ts

+32
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,38 @@ export const models: Models = {
11511151
},
11521152
},
11531153
},
1154+
[ModelProviderName.SECRETAI]: {
1155+
endpoint: settings.SECRET_AI_URL || "https://ai1.scrtlabs.com:21434",
1156+
model: {
1157+
[ModelClass.SMALL]: {
1158+
name:
1159+
settings.SMALL_SECRET_AI_MODEL ||
1160+
"deepseek-r1:70b",
1161+
stop: [],
1162+
maxInputTokens: 128000,
1163+
maxOutputTokens: 8192,
1164+
temperature: 0.7,
1165+
},
1166+
[ModelClass.MEDIUM]: {
1167+
name:
1168+
settings.MEDIUM_SECRET_AI_MODEL ||
1169+
"deepseek-r1:70b",
1170+
stop: [],
1171+
maxInputTokens: 128000,
1172+
maxOutputTokens: 8192,
1173+
temperature: 0.7,
1174+
},
1175+
[ModelClass.LARGE]: {
1176+
name:
1177+
settings.LARGE_SECRET_AI_MODEL ||
1178+
"deepseek-r1:70b",
1179+
stop: [],
1180+
maxInputTokens: 128000,
1181+
maxOutputTokens: 8192,
1182+
temperature: 0.7,
1183+
},
1184+
},
1185+
},
11541186
[ModelProviderName.NEARAI]: {
11551187
endpoint: settings.NEARAI_API_URL || "https://api.near.ai/v1",
11561188
model: {

packages/core/src/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ export type Models = {
233233
[ModelProviderName.INFERA]: Model;
234234
[ModelProviderName.BEDROCK]: Model;
235235
[ModelProviderName.ATOMA]: Model;
236+
[ModelProviderName.SECRETAI]: Model;
236237
[ModelProviderName.NEARAI]: Model;
237238
};
238239

@@ -273,6 +274,7 @@ export enum ModelProviderName {
273274
INFERA = "infera",
274275
BEDROCK = "bedrock",
275276
ATOMA = "atoma",
277+
SECRETAI = "secret_ai",
276278
NEARAI = "nearai",
277279
}
278280

0 commit comments

Comments
 (0)