Skip to content

Add native provider request support for non-chat plugin model calls #758

Description

@andreatnvidia

Priority Level

Medium

Task Summary

Enable DataDesigner column-generator plugins to call non-chat model endpoints, such as native NER/token-classification endpoints, through DataDesigner's model/provider infrastructure without requiring those models to expose a chat-completions-compatible head.

Technical Details & Implementation Plan

Anonymizer is moving custom workflow columns into DataDesigner plugins. The next desired step is to make its GLiNER detector a plugin column as well, so nvidia/gliner-pii can be served through its native NER API instead of being wrapped behind /chat/completions.

Current blockers in DataDesigner:

  • ModelConfig generation types are currently chat-completion, embedding, and image.
  • ModelFacade exposes chat generation, embeddings, and image generation, but no public raw provider request or native NER method.
  • ColumnGeneratorWithModelRegistry can access get_model_config() and get_model_provider(), but a plugin cannot cleanly reuse API key resolution, retries, request admission, provider error mapping, or HTTP client lifecycle for a custom route.
  • If a plugin declares the detector model alias while the model remains chat-completion, DataDesigner health checks call chat generation, which still requires the extra chat head.
  • If the plugin avoids declaring the alias, it loses startup validation and scheduling metadata.

Possible implementation paths:

  1. Add a public provider request hook to ModelFacade, for example a JSON request method that reuses provider endpoint, resolved API key, extra headers/body, timeout, retries, request admission, and error mapping.
  2. Or add a native NER generation type, e.g. GenerationType.NER, with NerInferenceParams, client/facade methods, scheduling metadata, and an appropriate health check.
  3. The hook should be usable by plugin column generators without accessing private fields like _secret_resolver or _client.

Investigation / Context

This came up while implementing Anonymizer workflow-column plugins: NVIDIA-NeMo/Anonymizer#192

That PR removes CustomColumnConfig from the detection post-processing path, but the detector itself remains an LLMTextColumnConfig, so it still routes through chat completion generation.

A native detector plugin in Anonymizer would be straightforward if DataDesigner exposed a clean non-chat model-call boundary. It would call the NER endpoint and emit the existing raw detector shape:

{
  "entities": [
    {
      "text": "Alice",
      "label": "first_name",
      "start": 0,
      "end": 5,
      "score": 0.98
    }
  ]
}

Agent Plan / Findings

Acceptance criteria:

  • A plugin column generator can call a non-chat model endpoint through public DataDesigner APIs.
  • The call reuses provider config, resolved API keys, extra headers/body, timeout, retry behavior, and request admission.
  • Health checks do not require /chat/completions for native NER models.
  • Scheduling metadata can distinguish non-chat request domains, or at least avoid misclassifying them as chat.
  • Anonymizer can replace its detector LLMTextColumnConfig with a plugin column without requiring a chat-completions-compatible NER server.

Dependencies

Related downstream work: Anonymizer native detector workflow column after this DataDesigner support exists.

Metadata

Metadata

Assignees

No one assigned

    Labels

    taskInternal development task

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions