Skip to content

Commit

Permalink
success!!! with direct message!
Browse files Browse the repository at this point in the history
  • Loading branch information
wtfsayo committed Feb 6, 2025
1 parent 7db2a10 commit c69a105
Show file tree
Hide file tree
Showing 8 changed files with 225 additions and 116 deletions.
6 changes: 3 additions & 3 deletions packages/client-direct/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ import {
type IAgentRuntime,
} from "@elizaos/core";
import { createApiRouter } from "./api.ts";
import * as fs from "fs";
import * as path from "path";
import * as fs from "node:fs";
import * as path from "node:path";
import { createVerifiableLogApiRouter } from "./verifiable-log-api.ts";
import OpenAI from "openai";

Expand Down Expand Up @@ -74,7 +74,7 @@ Note that {{agentName}} is capable of reading/seeing/hearing various forms of me
{{actions}}
# Instructions: Write the next message for {{agentName}}.
` + messageCompletionFooter;
${messageCompletionFooter}`;

export const hyperfiHandlerTemplate = `{{actionExamples}}
(Action examples are for reference only. Do not use the information from them in your response.)
Expand Down
4 changes: 2 additions & 2 deletions packages/core/__tests__/runtime.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ const mockImageSettings: ImageModelSettings = {
};

const mockEmbeddingSettings: EmbeddingModelSettings = {
name: "test-embedding-model",
name: "text-embedding-ada-002",
dimensions: 1536,
};

Expand Down Expand Up @@ -331,7 +331,7 @@ describe("Model Provider Configuration", () => {
repetition_penalty: 1.0,
},
[ModelClass.EMBEDDING]: {
name: "test-embedding-model",
name: "text-embedding-ada-002",
dimensions: 1536,
},
[ModelClass.IMAGE]: {
Expand Down
98 changes: 54 additions & 44 deletions packages/core/src/embedding.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@

// TODO: Maybe create these functions to read from character settings or env
// import { getEmbeddingModelSettings, getEndpoint } from "./models.ts";
import { type IAgentRuntime, ModelProviderName } from "./types.ts";
import { type IAgentRuntime, ModelProviderName, ModelClass } from "./types.ts";
import settings from "./settings.ts";
import elizaLogger from "./logger.ts";
import LocalEmbeddingModelManager from "./localembeddingManager.ts";
Expand Down Expand Up @@ -30,15 +29,27 @@ export type EmbeddingConfig = {
readonly provider: string;
};

export const getEmbeddingConfig = (): EmbeddingConfig => ({
dimensions:
// TODO: get from env or character settings
384,
model:
// TODO: get from env or character settings
"BGE-small-en-v1.5",
provider: "BGE",
});
export const getEmbeddingConfig = (runtime?: IAgentRuntime): EmbeddingConfig => {
if (runtime) {
const modelProvider = runtime.getModelProvider();
const embeddingModel = modelProvider?.models?.[ModelClass.EMBEDDING];

if (embeddingModel?.name) {
return {
dimensions: embeddingModel.dimensions || 1536,
model: embeddingModel.name,
provider: modelProvider?.provider || EmbeddingProvider.OpenAI,
};
}
}

// Fallback to default config
return {
dimensions: 1536, // OpenAI's text-embedding-ada-002 dimension
model: "text-embedding-3-small", // Default to OpenAI's latest embedding model
provider: EmbeddingProvider.OpenAI
};
};

async function getRemoteEmbedding(
input: string,
Expand All @@ -52,6 +63,26 @@ async function getRemoteEmbedding(
// Construct full URL
const fullUrl = `${baseEndpoint}/embeddings`;

elizaLogger.info("Embedding request:", {
modelProvider: options.provider,
useOpenAI: options.provider === EmbeddingProvider.OpenAI,
input: `${input?.slice(0, 50)}...`,
inputType: typeof input,
inputLength: input?.length,
isString: typeof input === "string",
isEmpty: !input,
});

const requestBody: any = {
input,
model: options.model,
};

// Only include dimensions for non-OpenAI providers
if (options.provider !== EmbeddingProvider.OpenAI) {
requestBody.dimensions = options.dimensions || options.length || getEmbeddingConfig().dimensions;
}

const requestOptions = {
method: "POST",
headers: {
Expand All @@ -62,19 +93,14 @@ async function getRemoteEmbedding(
}
: {}),
},
body: JSON.stringify({
input,
model: options.model,
dimensions:
options.dimensions ||
options.length ||
getEmbeddingConfig().dimensions, // Prefer dimensions, fallback to length
}),
body: JSON.stringify(requestBody),
};

try {
const response = await fetch(fullUrl, requestOptions);

elizaLogger.info("Embedding response:", requestOptions);

if (!response.ok) {
elizaLogger.error("API Response:", await response.text()); // Debug log
throw new Error(
Expand Down Expand Up @@ -158,28 +184,13 @@ export async function embed(runtime: IAgentRuntime, input: string) {
const cachedEmbedding = await retrieveCachedEmbedding(runtime, input);
if (cachedEmbedding) return cachedEmbedding;

const config = getEmbeddingConfig();
const isNode = typeof process !== "undefined" && process.versions?.node;

// use endpoint from model provider
const endpoint = runtime.getSetting("PROVIDER_ENDPOINT");
const apiKey = runtime.getSetting("PROVIDER_API_KEY");


// Determine which embedding settings to use
// TODO: enhance + verify logic to get from character settings or env
if (config.provider) {
return await getRemoteEmbedding(input, {
model: config.model,
endpoint: settings.PROVIDER_ENDPOINT || "https://api.openai.com/v1",
apiKey: settings.PROVIDER_API_KEY,
dimensions: config.dimensions,
});
}

// Get embedding configuration from runtime
const embeddingConfig = getEmbeddingConfig(runtime);

// BGE - try local first if in Node
if (isNode) {
// BGE - try local first if in Node and not using OpenAI
if (isNode && embeddingConfig.provider !== EmbeddingProvider.OpenAI) {
try {
return await getLocalEmbedding(input);
} catch (error) {
Expand All @@ -190,14 +201,13 @@ export async function embed(runtime: IAgentRuntime, input: string) {
}
}

// Fallback to remote override
// Use remote embedding
return await getRemoteEmbedding(input, {
model: config.model,
endpoint:
runtime.character.modelEndpointOverride ||
runtime.getSetting("PROVIDER_ENDPOINT"),
model: embeddingConfig.model,
endpoint: runtime.character.modelEndpointOverride || runtime.getSetting("PROVIDER_ENDPOINT") || "https://api.openai.com/v1",
apiKey: runtime.getSetting("PROVIDER_API_KEY") || runtime.token,
dimensions: config.dimensions,
dimensions: embeddingConfig.dimensions,
provider: embeddingConfig.provider
});

async function getLocalEmbedding(input: string): Promise<number[]> {
Expand Down
6 changes: 3 additions & 3 deletions packages/core/src/environment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,11 +169,11 @@ export function validateCharacterConfig(json: unknown): CharacterConfig {
{} as Record<string, string[]>
);

Object.entries(groupedErrors).forEach(([field, messages]) => {
for (const field in groupedErrors) {
elizaLogger.error(
`Validation errors in ${field}: ${messages.join(" - ")}`
`Validation errors in ${field}: ${groupedErrors[field].join(" - ")}`
);
});
}

throw new Error(
"Character configuration validation failed. Check logs for details."
Expand Down
Loading

0 comments on commit c69a105

Please sign in to comment.