zebflow 0.11.14

Reactive web automation platform — pipelines, templates, and real-time collaboration in a single binary.
Documentation
{
  "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"
              ]
            }
          ]
        }
      }
    ]
  }
}