mstar.api_server.openai.adapters#

Per-model translation between OpenAI-shaped requests and mstar’s request path.

The OpenAI endpoints are model-agnostic; everything model-specific lives here. An adapter translates an OpenAI request into SubmitArgs (the arguments APIServer.submit_request expects) and declares which OpenAI surfaces the model supports. Output chunks are translated back to OpenAI shapes by the serving handlers, which are generic across models.

model_kwargs is non-standardized across models, so each adapter maps the standard OpenAI fields (temperature, top_p, max_tokens, seed, voice, modalities …) onto the keys its model actually honors (see _apply_sampling()). Knobs that aren’t OpenAI-standard (top_k, repetition_penalty, or model-namespaced keys like talker_top_p) are not first-class fields — pass them via the OpenAI client’s extra_body and they flow through verbatim as model_kwargs (see _passthrough()).

Models whose outputs have no OpenAI-standard representation (robot actions from Pi0.5, world-model latents from V-JEPA 2) intentionally have no adapter: they are served only through the native /generate endpoint and the Python SDK, and /v1/* returns 404 for them (they do not fall back to chat). New OpenAI-capable models opt in by adding an adapter and registering it in ADAPTER_REGISTRY.

Functions

flatten_messages(messages, upload_dir[, ...])

Flatten OpenAI chat messages into (text, file_paths, input_modalities).

get_adapter(model_name)

Classes

BagelAdapter()

BAGEL: text chat (text out) + text-to-image / image editing.

OpenAIAdapter()

Base adapter.

OrpheusAdapter()

Orpheus: text-to-speech (audio out only).

Qwen3OmniAdapter()

Qwen3-Omni: multimodal chat (text, optionally + speech) and TTS.

SubmitArgs(text, file_paths, ...)

class mstar.api_server.openai.adapters.BagelAdapter[source]#

Bases: OpenAIAdapter

BAGEL: text chat (text out) + text-to-image / image editing.

BAGEL’s get_sampling_config reads the model config, so per-request temperature / top_p are not honored; max_output_tokens and seed are.

chat_to_request(req, upload_dir)[source]#
Parameters:
Return type:

SubmitArgs

image_edit_to_request(prompt, image_path, extra_kwargs)[source]#
Parameters:
  • prompt (str)

  • image_path (str)

  • extra_kwargs (dict)

Return type:

SubmitArgs

image_to_request(req, upload_dir)[source]#
Parameters:
Return type:

SubmitArgs

supports_chat: bool = True#
supports_images: bool = True#
class mstar.api_server.openai.adapters.OpenAIAdapter[source]#

Bases: object

Base adapter. A model subclasses this and implements the surfaces it supports; an unimplemented surface raises and the endpoint returns 404. Models with no OpenAI-standard output have no adapter (see the module docstring) and are reached only via /generate / the SDK.

chat_to_request(req, upload_dir)[source]#
Parameters:
Return type:

SubmitArgs

image_edit_to_request(prompt, image_path, extra_kwargs)[source]#
Parameters:
  • prompt (str)

  • image_path (str)

  • extra_kwargs (dict)

Return type:

SubmitArgs

image_to_request(req, upload_dir)[source]#
Parameters:
Return type:

SubmitArgs

speech_to_request(req, upload_dir)[source]#
Parameters:
Return type:

SubmitArgs

supports_chat: bool = False#
supports_images: bool = False#
supports_speech: bool = False#
class mstar.api_server.openai.adapters.OrpheusAdapter[source]#

Bases: OpenAIAdapter

Orpheus: text-to-speech (audio out only). Honors temperature/top_p/seed (its get_sampling_config reads model_kwargs).

speech_to_request(req, upload_dir)[source]#
Parameters:
Return type:

SubmitArgs

supports_speech: bool = True#
class mstar.api_server.openai.adapters.Qwen3OmniAdapter[source]#

Bases: OpenAIAdapter

Qwen3-Omni: multimodal chat (text, optionally + speech) and TTS.

Sampling is split across two stages: the Thinker (text) takes thinker_* keys, the Talker (speech) talker_*. The other Talker knobs (talker_top_k, talker_repetition_penalty) aren’t OpenAI fields — pass them via extra_body.

chat_to_request(req, upload_dir)[source]#
Parameters:
Return type:

SubmitArgs

speech_to_request(req, upload_dir)[source]#
Parameters:
Return type:

SubmitArgs

supports_chat: bool = True#
supports_speech: bool = True#
class mstar.api_server.openai.adapters.SubmitArgs(text: 'str | None' = None, file_paths: 'dict[str, list[str]] | None'=None, input_modalities: 'list[str]' = <factory>, output_modalities: 'list[str]' = <factory>, model_kwargs: 'dict' = <factory>)[source]#

Bases: object

Parameters:
file_paths: dict[str, list[str]] | None = None#
input_modalities: list[str]#
model_kwargs: dict#
output_modalities: list[str]#
text: str | None = None#
mstar.api_server.openai.adapters.flatten_messages(messages, upload_dir, allow_remote=True)[source]#

Flatten OpenAI chat messages into (text, file_paths, input_modalities).

Text parts across all messages are concatenated (newline-joined). Image / audio / video content parts are persisted under upload_dir and grouped by modality. (Multi-turn role structure is flattened — a v1 simplification; the models here apply their own prompt formatting in process_prompt.)

Parameters:
Return type:

tuple[str | None, dict[str, list[str]], list[str]]

mstar.api_server.openai.adapters.get_adapter(model_name)[source]#
Parameters:

model_name (str)

Return type:

OpenAIAdapter | None