NVIDIA-NeMo / NVIDIA-NeMo/DataDesigner

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

Open
#758 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

task
Dominant language
Python
Stars
2.2k
Forks
211
Avg merge
2d 6h
Merged PRs (30d)
40

Description

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: https://github.com/NVIDIA-NeMo/Anonymizer/pull/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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by tracing ModelFacade, ModelConfig, and ColumnGeneratorWithModelRegistry to understand the existing provider, health-check, retry, and scheduling paths. Compare the public request-hook and native-NER options, then verify that a plugin can call a non-chat endpoint without private fields and that Anonymizer can use it without requiring chat-completions support.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
ai, backend-api-design
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.