@@ -37,7 +37,7 @@ async function getRemoteEmbedding(
37
37
: { } ) ,
38
38
} ,
39
39
body : JSON . stringify ( {
40
- input,
40
+ input : trimTokens ( input , 8191 , "gpt-4o-mini" ) ,
41
41
model : options . model ,
42
42
length : options . length || 384 ,
43
43
} ) ,
@@ -70,25 +70,39 @@ async function getRemoteEmbedding(
70
70
* @param input The input to be embedded.
71
71
* @returns The embedding of the input.
72
72
*/
73
+ /**
74
+ * Generate embeddings for input text using configured model provider
75
+ * @param runtime The agent runtime containing model configuration
76
+ * @param input The text to generate embeddings for
77
+ * @returns Array of embedding numbers
78
+ */
73
79
export async function embed ( runtime : IAgentRuntime , input : string ) {
80
+ // Get model provider configuration
74
81
const modelProvider = models [ runtime . character . modelProvider ] ;
75
- //need to have env override for this to select what to use for embedding if provider doesnt provide or using openai
82
+
83
+ // Determine which embedding model to use:
84
+ // 1. OpenAI if USE_OPENAI_EMBEDDING is true
85
+ // 2. Provider's own embedding model if available
86
+ // 3. Fallback to OpenAI embedding model
76
87
const embeddingModel = settings . USE_OPENAI_EMBEDDING
77
- ? "text-embedding-3-small" // Use OpenAI if specified
78
- : modelProvider . model ?. [ ModelClass . EMBEDDING ] || // Use provider's embedding model if available
79
- models [ ModelProviderName . OPENAI ] . model [ ModelClass . EMBEDDING ] ; // Fallback to OpenAI
88
+ ? "text-embedding-3-small"
89
+ : modelProvider . model ?. [ ModelClass . EMBEDDING ] ||
90
+ models [ ModelProviderName . OPENAI ] . model [ ModelClass . EMBEDDING ] ;
80
91
81
92
if ( ! embeddingModel ) {
82
93
throw new Error ( "No embedding model configured" ) ;
83
94
}
84
95
85
- // // Try local embedding first
86
- // Check if we're in Node.js environment
96
+ // Check if running in Node.js environment
87
97
const isNode =
88
98
typeof process !== "undefined" &&
89
99
process . versions != null &&
90
100
process . versions . node != null ;
91
101
102
+ // Use local embedding if:
103
+ // - Running in Node.js
104
+ // - Not using OpenAI provider
105
+ // - Not forcing OpenAI embeddings
92
106
if (
93
107
isNode &&
94
108
runtime . character . modelProvider !== ModelProviderName . OPENAI &&
@@ -97,28 +111,30 @@ export async function embed(runtime: IAgentRuntime, input: string) {
97
111
return await getLocalEmbedding ( input ) ;
98
112
}
99
113
100
- // Check cache
114
+ // Try to get cached embedding first
101
115
const cachedEmbedding = await retrieveCachedEmbedding ( runtime , input ) ;
102
116
if ( cachedEmbedding ) {
103
117
return cachedEmbedding ;
104
118
}
105
119
106
- // Get remote embedding
120
+ // Generate new embedding remotely
107
121
return await getRemoteEmbedding ( input , {
108
122
model : embeddingModel ,
123
+ // Use OpenAI endpoint if specified, otherwise use provider endpoint
109
124
endpoint : settings . USE_OPENAI_EMBEDDING
110
- ? "https://api.openai.com/v1" // Always use OpenAI endpoint when USE_OPENAI_EMBEDDING is true
125
+ ? "https://api.openai.com/v1"
111
126
: runtime . character . modelEndpointOverride || modelProvider . endpoint ,
127
+ // Use OpenAI API key if specified, otherwise use runtime token
112
128
apiKey : settings . USE_OPENAI_EMBEDDING
113
- ? settings . OPENAI_API_KEY // Use OpenAI key from settings when USE_OPENAI_EMBEDDING is true
114
- : runtime . token , // Use runtime token for other providers
129
+ ? settings . OPENAI_API_KEY
130
+ : runtime . token ,
131
+ // Special handling for Ollama provider
115
132
isOllama :
116
133
runtime . character . modelProvider === ModelProviderName . OLLAMA &&
117
134
! settings . USE_OPENAI_EMBEDDING ,
118
135
} ) ;
119
136
}
120
137
121
- // TODO: Add back in when it can work in browser and locally
122
138
async function getLocalEmbedding ( input : string ) : Promise < number [ ] > {
123
139
// Check if we're in Node.js environment
124
140
const isNode =
@@ -153,7 +169,7 @@ async function getLocalEmbedding(input: string): Promise<number[]> {
153
169
cacheDir : cacheDir ,
154
170
} ) ;
155
171
156
- const trimmedInput = trimTokens ( input , 8000 , "gpt-4o-mini" ) ;
172
+ const trimmedInput = trimTokens ( input , 8191 , "gpt-4o-mini" ) ;
157
173
const embedding = await embeddingModel . queryEmbed ( trimmedInput ) ;
158
174
return embedding ;
159
175
} else {
0 commit comments