2024-04-15 04:56:44 -07:00
/* eslint-disable n8n-nodes-base/node-dirname-against-convention */
import {
NodeConnectionType ,
type IExecuteFunctions ,
type INodeType ,
type INodeTypeDescription ,
type SupplyData ,
} from 'n8n-workflow' ;
import { GoogleGenerativeAIEmbeddings } from '@langchain/google-genai' ;
import { logWrapper } from '../../../utils/logWrapper' ;
import { getConnectionHintNoticeField } from '../../../utils/sharedFields' ;
export class EmbeddingsGoogleGemini implements INodeType {
description : INodeTypeDescription = {
displayName : 'Embeddings Google Gemini' ,
name : 'embeddingsGoogleGemini' ,
icon : 'file:google.svg' ,
group : [ 'transform' ] ,
version : 1 ,
description : 'Use Google Gemini Embeddings' ,
defaults : {
name : 'Embeddings Google Gemini' ,
} ,
requestDefaults : {
ignoreHttpStatusErrors : true ,
baseURL : '={{ $credentials.host }}' ,
} ,
credentials : [
{
name : 'googlePalmApi' ,
required : true ,
} ,
] ,
codex : {
categories : [ 'AI' ] ,
subcategories : {
AI : [ 'Embeddings' ] ,
} ,
resources : {
primaryDocumentation : [
{
url : 'https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.embeddingsgooglegemini/' ,
} ,
] ,
} ,
} ,
// eslint-disable-next-line n8n-nodes-base/node-class-description-inputs-wrong-regular-node
inputs : [ ] ,
// eslint-disable-next-line n8n-nodes-base/node-class-description-outputs-wrong
outputs : [ NodeConnectionType . AiEmbedding ] ,
outputNames : [ 'Embeddings' ] ,
properties : [
getConnectionHintNoticeField ( [ NodeConnectionType . AiVectorStore ] ) ,
{
displayName :
'Each model is using different dimensional density for embeddings. Please make sure to use the same dimensionality for your vector store. The default model is using 768-dimensional embeddings.' ,
name : 'notice' ,
type : 'notice' ,
default : '' ,
} ,
{
displayName : 'Model' ,
name : 'modelName' ,
type : 'options' ,
description :
'The model which will generate the embeddings. <a href="https://developers.generativeai.google/api/rest/generativelanguage/models/list">Learn more</a>.' ,
typeOptions : {
loadOptions : {
routing : {
request : {
method : 'GET' ,
url : '/v1beta/models' ,
} ,
output : {
postReceive : [
{
type : 'rootProperty' ,
properties : {
property : 'models' ,
} ,
} ,
{
type : 'filter' ,
properties : {
pass : "={{ $responseItem.name.includes('embedding') }}" ,
} ,
} ,
{
type : 'setKeyValue' ,
properties : {
name : '={{$responseItem.name}}' ,
value : '={{$responseItem.name}}' ,
description : '={{$responseItem.description}}' ,
} ,
} ,
{
type : 'sort' ,
properties : {
key : 'name' ,
} ,
} ,
] ,
} ,
} ,
} ,
} ,
routing : {
send : {
type : 'body' ,
property : 'model' ,
} ,
} ,
default : 'textembedding-gecko-multilingual@latest' ,
} ,
] ,
} ;
async supplyData ( this : IExecuteFunctions , itemIndex : number ) : Promise < SupplyData > {
2024-08-28 00:32:53 -07:00
this . logger . debug ( 'Supply data for embeddings Google Gemini' ) ;
2024-04-15 04:56:44 -07:00
const modelName = this . getNodeParameter (
'modelName' ,
itemIndex ,
'textembedding-gecko-multilingual@latest' ,
) as string ;
const credentials = await this . getCredentials ( 'googlePalmApi' ) ;
const embeddings = new GoogleGenerativeAIEmbeddings ( {
apiKey : credentials.apiKey as string ,
modelName ,
} ) ;
return {
response : logWrapper ( embeddings , this ) ,
} ;
}
}