{
"apiVersion": "zebflow.com/v1",
"kind": "NodeBundle",
"metadata": {
"name": "openai-embedding",
"version": "1.0.0"
},
"spec": {
"package": "openai-embedding",
"version": "1.0.0",
"title": "OpenAI Embedding",
"description": "Generate text embeddings using any OpenAI-compatible API (/v1/embeddings).",
"icon": "icon.svg",
"credentials": [
{
"kind": "openai",
"title": "OpenAI",
"description": "OpenAI provider credential.",
"fields": [],
"placeholders": {
"API_KEY": "api_key",
"BASE_URL": "base_url",
"MODEL": "model",
"EMBEDDING_PATH": "embedding_path"
},
"config_key": "credential_id"
},
{
"kind": "openrouter",
"title": "OpenRouter",
"description": "OpenRouter provider credential.",
"fields": [],
"placeholders": {
"API_KEY": "api_key",
"BASE_URL": "base_url",
"MODEL": "model",
"EMBEDDING_PATH": "embedding_path"
},
"config_key": "credential_id"
}
],
"hosts": [
"api.openai.com",
"openrouter.ai"
],
"functions": {
"embed": "functions/embed.zf.json"
},
"modules": {},
"nodes": [
{
"kind": "ai.embedding.generate",
"title": "AI Embedding",
"description": "Turns text into embedding vectors through the provider's /embeddings endpoint. It takes `--provider openai` (OpenAI, its embedding models) or `--provider openrouter`, each with a credential of its own kind (the credential's base URL, when set, replaces the provider's). Answers `embedding: { vectors, model, dims, usage }` — one vector per `--text`, in order — and keeps the payload; a provider refusal delivers `error`.",
"icon": "icons/embedding.svg",
"ui_category": "logic.ai",
"ui_category_label": "AI",
"uses_credentials": [
"openai",
"openrouter"
],
"run": {
"function": "embed"
},
"definition": {
"input_pins": [
"in"
],
"output_pins": [
"out",
"error"
],
"config_schema": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"openai",
"openrouter"
]
},
"credential_id": {
"type": "string"
},
"model": {
"type": "string"
},
"text": {
"type": [
"array",
"string"
]
},
"option": {
"type": "object"
}
}
},
"dsl_flags": [
{
"flag": "--provider",
"config_key": "provider",
"kind": "scalar",
"required": true,
"value": "text",
"choices": [
"openai",
"openrouter"
],
"description": "Who embeds: openai or openrouter. Literal, never {{ }}."
},
{
"flag": "--credential",
"config_key": "credential_id",
"kind": "scalar",
"required": true,
"value": "text",
"description": "The provider's credential: kind openai for openai, openrouter for openrouter."
},
{
"flag": "--model",
"config_key": "model",
"kind": "scalar",
"required": false,
"value": "text",
"description": "The embedding model. openai takes text-embedding-3-small, text-embedding-3-large or text-embedding-ada-002. Omitted: the credential's model, else text-embedding-3-small (openai/text-embedding-3-small on openrouter)."
},
{
"flag": "--text",
"config_key": "text",
"kind": "repeated_list",
"required": true,
"value": "text",
"max_repeat": 2048,
"description": "A text to embed — repeat for several, or one {{ [list] }}; each gets its own vector."
},
{
"flag": "--option",
"config_key": "option",
"kind": "key_value_pairs",
"required": false,
"value": "text",
"description": "A setting of the chosen provider, key=value, repeated. The keys and their types are the provider's profile; an unknown key is refused."
}
],
"fields": [
{
"name": "provider",
"label": "Provider",
"type": "select",
"options": [
{
"value": "openai",
"label": "OpenAI"
},
{
"value": "openrouter",
"label": "OpenRouter"
}
],
"help": "Who embeds. The credential must be of this provider's kind."
},
{
"name": "credential_id",
"label": "Credential",
"type": "select",
"data_source": "credentials_open_ai",
"help": "A credential of the provider's kind: openai or openrouter."
},
{
"name": "model",
"label": "Model",
"type": "text",
"help": "Embedding model id. Empty: the credential's model, else text-embedding-3-small."
},
{
"name": "text",
"label": "Text",
"type": "textarea",
"rows": 3,
"help": "The text to embed: a literal or {{ expr }}, or {{ [list] }} for several."
},
{
"name": "option",
"label": "Provider options",
"type": "key_value_pairs",
"help": "Settings of the chosen provider, key=value; only the keys its profile names."
}
],
"layout": [
"provider",
"credential_id",
"model",
"text",
"option"
],
"output_schema": {
"type": "object",
"properties": {
"embedding": {
"type": "object",
"properties": {
"vectors": {
"type": "array",
"description": "One vector per text, in the order given."
},
"model": {
"type": "string"
},
"dims": {
"type": "integer",
"description": "The length of each vector."
},
"usage": {
"type": [
"object",
"null"
],
"description": "Token usage as the provider reported it."
}
}
}
}
},
"profiles": [
{
"provider": "openai",
"credential_kinds": [
"openai"
],
"models": [
"text-embedding-3-small",
"text-embedding-3-large",
"text-embedding-ada-002"
]
},
{
"provider": "openrouter",
"credential_kinds": [
"openrouter"
]
}
]
}
}
]
}
}