Skip to content

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

@andreatgretel

Description

@andreatgretel

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions