{
"apiVersion": "zebflow.com/v1",
"kind": "Pipeline",
"metadata": {
"name": "openai-embed"
},
"spec": {
"id": "openai-embed",
"nodes": [
{
"id": "trigger",
"kind": "n.trigger.function",
"config": {},
"input_pins": [],
"output_pins": [
"out"
]
},
{
"id": "prepare",
"kind": "n.script",
"config": {
"source": "function getPath(obj,path){var parts=path.split('.');var cur=obj;for(var i=0;i<parts.length;i++){if(cur==null)return undefined;cur=cur[parts[i].trim()];}return cur;} var p=ctx.placeholder||{}; var expr=(p.CONFIG_INPUT_EXPR||'').trim(); var text; if(expr&&expr!=='$placeholder.CONFIG_INPUT_EXPR'){if(expr.charAt(0)==='['&&expr.charAt(expr.length-1)===']'){var items=expr.slice(1,-1).split(',');text=items.map(function(item){return getPath({input:input},item.trim());});}else if(expr.indexOf('||')!==-1){var alts=expr.split('||');for(var i=0;i<alts.length;i++){var val=getPath({input:input},alts[i].trim());if(val){text=val;break;}}if(!text)text='';}else{text=getPath({input:input},expr);}if(text===undefined)text=input.text||input.input||'';}else{text=input.text||input.input||'';} if(Array.isArray(text)){text=text.map(function(t){return String(t);});}else{text=String(text);} var model=p.CONFIG_MODEL||p.MODEL||'text-embedding-3-small'; if(!model||model.indexOf('$placeholder.')===0)model='text-embedding-3-small'; return {model:model,input:text};"
},
"input_pins": [
"in"
],
"output_pins": [
"out"
]
},
{
"id": "call",
"kind": "n.http.request",
"config": {
"method": "POST",
"url": "{{ ($placeholder.BASE_URL || 'https://api.openai.com/v1').replace(/\\/$/, '') }}{{ $placeholder.EMBEDDING_PATH || '/embeddings' }}",
"headers": {
"Authorization": "Bearer {{ $placeholder.API_KEY }}",
"Content-Type": "application/json"
},
"body": "{{ input }}",
"timeout_ms": 120000,
"response_type": "json"
},
"input_pins": [
"in"
],
"output_pins": [
"out"
]
},
{
"id": "extract",
"kind": "n.script",
"config": {
"source": "var body = (input && input.response && input.response.body) ? input.response.body : input; if (!body || !body.data) return { error: body && body.error ? body.error : 'no embedding data', raw: input }; var embeddings = body.data.map(function(d) { return d.embedding; }); return { embeddings: embeddings, model: body.model, usage: body.usage };"
},
"input_pins": [
"in"
],
"output_pins": [
"out"
]
}
],
"edges": [
{
"from_node": "trigger",
"from_pin": "out",
"to_node": "prepare",
"to_pin": "in"
},
{
"from_node": "prepare",
"from_pin": "out",
"to_node": "call",
"to_pin": "in"
},
{
"from_node": "call",
"from_pin": "out",
"to_node": "extract",
"to_pin": "in"
}
]
}
}