Skip to content

openai_like

The OpenAI-Like integration module provides support for third-party services compatible with the OpenAI API.

This package is a thin wrapper for the OpenAI API, designed to meet the needs for calling third-party model services compatible with the OpenAI API.

Note that this integration does not adapt to specific model providers, but provides general-purpose interfaces. Therefore, it is not fully comprehensive in functionality and only supports basic chat/stream operations and their corresponding async interfaces.

You can install the OpenAI-Like integration package for Bridgic by running:

pip install bridgic-llms-openai-like

OpenAILikeConfiguration

Bases: BaseModel

Default configuration for OpenAI-compatible chat completions.

Source code in bridgic/llms/openai_like/_openai_like_llm.py
class OpenAILikeConfiguration(BaseModel):
    """
    Default configuration for OpenAI-compatible chat completions.
    """
    model: Optional[str] = None
    """Default model to use when a call-time `model` is not provided."""
    temperature: Optional[float] = None
    """Sampling temperature in [0, 2]. Higher is more random, lower is more deterministic."""
    top_p: Optional[float] = None
    """Nucleus sampling probability mass in (0, 1]. Alternative to temperature."""
    presence_penalty: Optional[float] = None
    """Penalize new tokens based on whether they appear so far. [-2.0, 2.0]."""
    frequency_penalty: Optional[float] = None
    """Penalize new tokens based on their frequency so far. [-2.0, 2.0]."""
    max_tokens: Optional[int] = None
    """Maximum number of tokens to generate for the completion."""
    stop: Optional[List[str]] = None
    """Up to 4 sequences where generation will stop."""

model class-attribute instance-attribute

model: Optional[str] = None

Default model to use when a call-time model is not provided.

temperature class-attribute instance-attribute

temperature: Optional[float] = None

Sampling temperature in [0, 2]. Higher is more random, lower is more deterministic.

top_p class-attribute instance-attribute

top_p: Optional[float] = None

Nucleus sampling probability mass in (0, 1]. Alternative to temperature.

presence_penalty class-attribute instance-attribute

presence_penalty: Optional[float] = None

Penalize new tokens based on whether they appear so far. [-2.0, 2.0].

frequency_penalty class-attribute instance-attribute

frequency_penalty: Optional[float] = None

Penalize new tokens based on their frequency so far. [-2.0, 2.0].

max_tokens class-attribute instance-attribute

max_tokens: Optional[int] = None

Maximum number of tokens to generate for the completion.

stop class-attribute instance-attribute

stop: Optional[List[str]] = None

Up to 4 sequences where generation will stop.

OpenAILikeLlm

Bases: BaseLlm

OpenAILikeLlm is a thin wrapper around the LLM providers that makes it compatible with the services that provide OpenAI compatible API. To support the widest range of model providers, this wrapper only supports text-modal usage.

Parameters:

Name Type Description Default
api_base str

The base URL of the LLM provider.

required
api_key str

The API key of the LLM provider.

required
configuration Optional[OpenAILikeConfiguration]

The configuration for the OpenAI-compatible API. If None, uses the default configuration.

OpenAILikeConfiguration()
timeout Optional[float]

The timeout in seconds. If None, no timeout is applied.

None
http_client Optional[Client]

Custom synchronous HTTP client for requests. If None, creates a default client.

None
http_async_client Optional[AsyncClient]

Custom asynchronous HTTP client for requests. If None, creates a default client.

None
Source code in bridgic/llms/openai_like/_openai_like_llm.py
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
class OpenAILikeLlm(BaseLlm):
    """
    OpenAILikeLlm is a thin wrapper around the LLM providers that makes it compatible with the 
    services that provide OpenAI compatible API. To support the widest range of model providers, 
    this wrapper only supports text-modal usage.

    Parameters
    ----------
    api_base: str
        The base URL of the LLM provider.
    api_key: str
        The API key of the LLM provider.
    configuration: Optional[OpenAILikeConfiguration]
        The configuration for the OpenAI-compatible API. If None, uses the default configuration.
    timeout: Optional[float]
        The timeout in seconds. If None, no timeout is applied.
    http_client : Optional[httpx.Client]
        Custom synchronous HTTP client for requests. If None, creates a default client.
    http_async_client : Optional[httpx.AsyncClient]
        Custom asynchronous HTTP client for requests. If None, creates a default client.
    """

    api_base: str
    api_key: str
    configuration: OpenAILikeConfiguration
    timeout: float
    http_client: httpx.Client
    http_async_client: httpx.AsyncClient

    client: OpenAI
    async_client: AsyncOpenAI

    def __init__(
        self,
        api_base: str,
        api_key: str,
        configuration: Optional[OpenAILikeConfiguration] = OpenAILikeConfiguration(),
        timeout: Optional[float] = None,
        http_client: Optional[httpx.Client] = None,
        http_async_client: Optional[httpx.AsyncClient] = None,
    ):
        # Record for serialization / deserialization.
        self.api_base = api_base
        self.api_key = api_key
        self.configuration = configuration
        self.timeout = timeout
        self.http_client = http_client
        self.http_async_client = http_async_client

        # Initialize clients.
        self.client = OpenAI(base_url=api_base, api_key=api_key, timeout=timeout, http_client=http_client)
        self.async_client = AsyncOpenAI(base_url=api_base, api_key=api_key, timeout=timeout, http_client=http_async_client)

    def chat(
        self,
        messages: List[Message],
        model: Optional[str] = None,
        temperature: Optional[float] = None,
        top_p: Optional[float] = None,
        presence_penalty: Optional[float] = None,
        frequency_penalty: Optional[float] = None,
        max_tokens: Optional[int] = None,
        stop: Optional[List[str]] = None,
        extra_body: Optional[Dict[str, Any]] = None,
        **kwargs,
    ) -> Response:
        """
        Send a synchronous chat completion request to an OpenAI-compatible provider.

        Parameters
        ----------
        messages : list[Message]
            Conversation messages.
        model : str, optional
            Model ID to use. Required unless provided in `configuration.model`.
        temperature : float, optional
            Sampling temperature in [0, 2]. Higher is more random, lower is more deterministic.
        top_p : float, optional
            Nucleus sampling probability mass in (0, 1]. Alternative to temperature.
        presence_penalty : float, optional
            Penalize new tokens based on whether they appear so far. [-2.0, 2.0].
        frequency_penalty : float, optional
            Penalize new tokens based on their frequency so far. [-2.0, 2.0].
        max_tokens : int, optional
            Maximum tokens to generate for completion.
        stop : list[str], optional
            Up to 4 sequences where generation will stop.
        extra_body : dict, optional
            Extra JSON payload sent to the provider.
        **kwargs
            Additional provider-specific arguments.

        Returns
        -------
        Response
            Bridgic response containing the generated message and raw API response.

        Notes
        -----
        - Required parameter validation ensures `messages` and final `model` are present
          (from either the call or `configuration`).
        """
        params = self._build_parameters(
            messages=messages,
            model=model,
            temperature=temperature,
            top_p=top_p,
            presence_penalty=presence_penalty,
            frequency_penalty=frequency_penalty,
            max_tokens=max_tokens,
            stop=stop,
            extra_body=extra_body,
            **kwargs,
        )
        validate_required_params(params, ["messages", "model"])
        response = self.client.chat.completions.create(**params)
        openai_message: ChatCompletionMessage = response.choices[0].message
        text: str = openai_message.content if openai_message.content else ""

        if openai_message.refusal:
            warnings.warn(openai_message.refusal, RuntimeWarning)

        return Response(
            message=Message.from_text(text, role=Role.AI),
            raw=response,
        )

    def stream(
        self,
        messages: List[Message],
        model: Optional[str] = None,
        temperature: Optional[float] = None,
        top_p: Optional[float] = None,
        presence_penalty: Optional[float] = None,
        frequency_penalty: Optional[float] = None,
        max_tokens: Optional[int] = None,
        stop: Optional[List[str]] = None,
        extra_body: Optional[Dict[str, Any]] = None,
        **kwargs,
    ) -> StreamResponse:
        """
        Stream a chat completion response incrementally.

        Parameters
        ----------
        messages : list[Message]
            Conversation messages.
        model : str, optional
            Model ID to use. Required unless provided in `configuration.model`.
        temperature, top_p, presence_penalty, frequency_penalty, max_tokens, stop, extra_body
            See `chat` for details.
        **kwargs
            Additional provider-specific arguments.

        Yields
        ------
        MessageChunk
            Delta chunks as they arrive from the provider.

        Notes
        -----
        - Validates `messages`, final `model`, and `stream=True`.
        """
        params = self._build_parameters(
            messages=messages,
            model=model,
            temperature=temperature,
            top_p=top_p,
            presence_penalty=presence_penalty,
            frequency_penalty=frequency_penalty,
            max_tokens=max_tokens,
            stop=stop,
            extra_body=extra_body,
            stream=True,
            **kwargs,
        )
        validate_required_params(params, ["messages", "model", "stream"])
        response = self.client.chat.completions.create(**params)
        for chunk in response:
            delta_content = chunk.choices[0].delta.content
            delta_content = delta_content if delta_content else ""
            yield MessageChunk(delta=delta_content, raw=chunk)

    async def achat(
        self,
        messages: List[Message],
        model: Optional[str] = None,
        temperature: Optional[float] = None,
        top_p: Optional[float] = None,
        presence_penalty: Optional[float] = None,
        frequency_penalty: Optional[float] = None,
        max_tokens: Optional[int] = None,
        stop: Optional[List[str]] = None,
        extra_body: Optional[Dict[str, Any]] = None,
        **kwargs,
    ) -> Response:
        """
        Asynchronously send a chat completion request to an OpenAI-compatible provider.

        Parameters
        ----------
        messages : list[Message]
            Conversation messages.
        model : str, optional
            Model ID to use. Required unless provided in `configuration.model`.
        temperature, top_p, presence_penalty, frequency_penalty, max_tokens, stop, extra_body
            See `chat` for details.
        **kwargs
            Additional provider-specific arguments.

        Returns
        -------
        Response
            Bridgic response containing the generated message and raw API response.
        """
        params = self._build_parameters(
            messages=messages,
            model=model,
            temperature=temperature,
            top_p=top_p,
            presence_penalty=presence_penalty,
            frequency_penalty=frequency_penalty,
            max_tokens=max_tokens,
            stop=stop,
            extra_body=extra_body,
            **kwargs,
        )
        validate_required_params(params, ["messages", "model"])
        response = await self.async_client.chat.completions.create(**params)
        openai_message: ChatCompletionMessage = response.choices[0].message
        text: str = openai_message.content if openai_message.content else ""

        if openai_message.refusal:
            warnings.warn(openai_message.refusal, RuntimeWarning)

        return Response(
            message=Message.from_text(text, role=Role.AI),
            raw=response,
        )

    async def astream(
        self,
        messages: List[Message],
        model: Optional[str] = None,
        temperature: Optional[float] = None,
        top_p: Optional[float] = None,
        presence_penalty: Optional[float] = None,
        frequency_penalty: Optional[float] = None,
        max_tokens: Optional[int] = None,
        stop: Optional[List[str]] = None,
        extra_body: Optional[Dict[str, Any]] = None,
        **kwargs,
    ) -> AsyncStreamResponse:
        """
        Asynchronously stream a chat completion response incrementally.

        Parameters
        ----------
        messages : list[Message]
            Conversation messages.
        model : str, optional
            Model ID to use. Required unless provided in `configuration.model`.
        temperature, top_p, presence_penalty, frequency_penalty, max_tokens, stop, extra_body
            See `chat` for details.
        **kwargs
            Additional provider-specific arguments.

        Yields
        ------
        MessageChunk
            Delta chunks as they arrive from the provider.

        Notes
        -----
        - Validates `messages`, final `model`, and `stream=True`.
        """
        params = self._build_parameters(
            messages=messages,
            model=model,
            temperature=temperature,
            top_p=top_p,
            presence_penalty=presence_penalty,
            frequency_penalty=frequency_penalty,
            max_tokens=max_tokens,
            stop=stop,
            extra_body=extra_body,
            stream=True,
            **kwargs,
        )
        validate_required_params(params, ["messages", "model", "stream"])
        response = await self.async_client.chat.completions.create(**params)
        async for chunk in response:
            delta_content = chunk.choices[0].delta.content
            delta_content = delta_content if delta_content else ""
            yield MessageChunk(delta=delta_content, raw=chunk)

    def _build_parameters(
        self,
        messages: List[Message],
        model: Optional[str] = None,
        temperature: Optional[float] = None,
        top_p: Optional[float] = None,
        presence_penalty: Optional[float] = None,
        frequency_penalty: Optional[float] = None,
        max_tokens: Optional[int] = None,
        stop: Optional[List[str]] = None,
        extra_body: Optional[Dict[str, Any]] = None,
        stream: Optional[bool] = None,
        **kwargs,
    ) -> Dict[str, Any]:
        """
        Merge configuration defaults with per-call parameters and remove None values.

        Parameters
        ----------
        messages : list[Message]
            Conversation messages to send.
        model : str, optional
            Model identifier. May be omitted if `configuration.model` is set.
        temperature, top_p, presence_penalty, frequency_penalty, max_tokens, stop, extra_body, stream
            Standard OpenAI chat parameters.
        **kwargs
            Additional provider-specific parameters.

        Returns
        -------
        dict
            Final parameter dictionary for the OpenAI-compatible API.
        """
        msgs: List[ChatCompletionMessageParam] = [self._convert_message(msg) for msg in messages]
        merge_params = merge_dict(self.configuration.model_dump(), {
            "messages": msgs,
            "model": model,
            "temperature": temperature,
            "top_p": top_p,
            "presence_penalty": presence_penalty,
            "frequency_penalty": frequency_penalty,
            "max_tokens": max_tokens,
            "stop": stop,
            "extra_body": extra_body,
            "stream": stream,
            **kwargs,
        })
        return filter_dict(merge_params, exclude_none=True)

    def _convert_message(self, message: Message, strict: bool = False) -> ChatCompletionMessageParam:
        if strict:
            return self._convert_message_strict(message)
        else:
            return self._convert_message_normal(message)

    def _convert_message_normal(self, message: Message) -> ChatCompletionMessageParam:
        content_list = []
        for block in message.blocks:
            if isinstance(block, TextBlock):
                content_list.append(block.text)
            if isinstance(block, ToolCallBlock):
                content_list.append(
                    f"Tool call:\n"
                    f"- id: {block.id}\n"
                    f"- name: {block.name}\n"
                    f"- arguments: {block.arguments}"
                )
            if isinstance(block, ToolResultBlock):
                content_list.append(f"Tool result: {block.content}")
        content_txt = "\n\n".join(content_list)

        if message.role == Role.SYSTEM:
            return ChatCompletionSystemMessageParam(content=content_txt, role="system")
        elif message.role == Role.USER:
            return ChatCompletionUserMessageParam(content=content_txt, role="user")
        elif message.role == Role.AI:
            return ChatCompletionAssistantMessageParam(content=content_txt, role="assistant")
        elif message.role == Role.TOOL:
            return ChatCompletionToolMessageParam(content=content_txt, role="tool")
        else:
            raise ValueError(f"Invalid role: {message.role}")

    def _convert_message_strict(self, message: Message) -> ChatCompletionMessageParam:
        content_list = []
        tool_call_list = []
        tool_result = ""
        tool_result_call_id = None

        for block in message.blocks:
            if isinstance(block, TextBlock):
                content_list.append(block.text)
            if isinstance(block, ToolCallBlock):
                tool_call: ChatCompletionMessageFunctionToolCallParam = {
                    "type": "function",
                    "id": block.id,
                    "function": {
                        "name": block.name,
                        "arguments": json.dumps(block.arguments),
                    },
                }
                tool_call_list.append(tool_call)
            if isinstance(block, ToolResultBlock):
                tool_result = block.content
                tool_result_call_id = block.id

        content_txt = "\n\n".join(content_list)

        if message.role == Role.SYSTEM:
            return ChatCompletionSystemMessageParam(content=content_txt, role="system")
        elif message.role == Role.USER:
            return ChatCompletionUserMessageParam(content=content_txt, role="user")
        elif message.role == Role.AI:
            return ChatCompletionAssistantMessageParam(content=content_txt, tool_calls=tool_call_list, role="assistant")
        elif message.role == Role.TOOL:
            content_txt = "\n\n".join([content_txt, tool_result])
            return ChatCompletionToolMessageParam(content=content_txt, tool_call_id=tool_result_call_id, role="tool")
        else:
            raise ValueError(f"Invalid role: {message.role}")

    @override
    def dump_to_dict(self) -> Dict[str, Any]:
        state_dict = {
            "api_base": self.api_base,
            "api_key": self.api_key,
            "timeout": self.timeout,
            "configuration": self.configuration.model_dump(),
        }
        if self.http_client:
            warnings.warn(
                "httpx.Client is not serializable, so it will be set to None in the deserialization.",
                RuntimeWarning,
            )
        if self.http_async_client:
            warnings.warn(
                "httpx.AsyncClient is not serializable, so it will be set to None in the deserialization.",
                RuntimeWarning,
            )
        return state_dict

    @override
    def load_from_dict(self, state_dict: Dict[str, Any]) -> None:
        self.api_base = state_dict["api_base"]
        self.api_key = state_dict["api_key"]
        self.timeout = state_dict["timeout"]
        self.configuration = OpenAILikeConfiguration(**state_dict.get("configuration", {}))

        self.http_client = None
        self.http_async_client = None

        self.client = OpenAI(
            base_url=self.api_base,
            api_key=self.api_key,
            timeout=self.timeout,
            http_client=self.http_client,
        )
        self.async_client = AsyncOpenAI(
            base_url=self.api_base,
            api_key=self.api_key,
            timeout=self.timeout,
            http_client=self.http_async_client,
        )

chat

chat(
    messages: List[Message],
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    top_p: Optional[float] = None,
    presence_penalty: Optional[float] = None,
    frequency_penalty: Optional[float] = None,
    max_tokens: Optional[int] = None,
    stop: Optional[List[str]] = None,
    extra_body: Optional[Dict[str, Any]] = None,
    **kwargs
) -> Response

Send a synchronous chat completion request to an OpenAI-compatible provider.

Parameters:

Name Type Description Default
messages list[Message]

Conversation messages.

required
model str

Model ID to use. Required unless provided in configuration.model.

None
temperature float

Sampling temperature in [0, 2]. Higher is more random, lower is more deterministic.

None
top_p float

Nucleus sampling probability mass in (0, 1]. Alternative to temperature.

None
presence_penalty float

Penalize new tokens based on whether they appear so far. [-2.0, 2.0].

None
frequency_penalty float

Penalize new tokens based on their frequency so far. [-2.0, 2.0].

None
max_tokens int

Maximum tokens to generate for completion.

None
stop list[str]

Up to 4 sequences where generation will stop.

None
extra_body dict

Extra JSON payload sent to the provider.

None
**kwargs

Additional provider-specific arguments.

{}

Returns:

Type Description
Response

Bridgic response containing the generated message and raw API response.

Notes
  • Required parameter validation ensures messages and final model are present (from either the call or configuration).
Source code in bridgic/llms/openai_like/_openai_like_llm.py
def chat(
    self,
    messages: List[Message],
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    top_p: Optional[float] = None,
    presence_penalty: Optional[float] = None,
    frequency_penalty: Optional[float] = None,
    max_tokens: Optional[int] = None,
    stop: Optional[List[str]] = None,
    extra_body: Optional[Dict[str, Any]] = None,
    **kwargs,
) -> Response:
    """
    Send a synchronous chat completion request to an OpenAI-compatible provider.

    Parameters
    ----------
    messages : list[Message]
        Conversation messages.
    model : str, optional
        Model ID to use. Required unless provided in `configuration.model`.
    temperature : float, optional
        Sampling temperature in [0, 2]. Higher is more random, lower is more deterministic.
    top_p : float, optional
        Nucleus sampling probability mass in (0, 1]. Alternative to temperature.
    presence_penalty : float, optional
        Penalize new tokens based on whether they appear so far. [-2.0, 2.0].
    frequency_penalty : float, optional
        Penalize new tokens based on their frequency so far. [-2.0, 2.0].
    max_tokens : int, optional
        Maximum tokens to generate for completion.
    stop : list[str], optional
        Up to 4 sequences where generation will stop.
    extra_body : dict, optional
        Extra JSON payload sent to the provider.
    **kwargs
        Additional provider-specific arguments.

    Returns
    -------
    Response
        Bridgic response containing the generated message and raw API response.

    Notes
    -----
    - Required parameter validation ensures `messages` and final `model` are present
      (from either the call or `configuration`).
    """
    params = self._build_parameters(
        messages=messages,
        model=model,
        temperature=temperature,
        top_p=top_p,
        presence_penalty=presence_penalty,
        frequency_penalty=frequency_penalty,
        max_tokens=max_tokens,
        stop=stop,
        extra_body=extra_body,
        **kwargs,
    )
    validate_required_params(params, ["messages", "model"])
    response = self.client.chat.completions.create(**params)
    openai_message: ChatCompletionMessage = response.choices[0].message
    text: str = openai_message.content if openai_message.content else ""

    if openai_message.refusal:
        warnings.warn(openai_message.refusal, RuntimeWarning)

    return Response(
        message=Message.from_text(text, role=Role.AI),
        raw=response,
    )

stream

stream(
    messages: List[Message],
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    top_p: Optional[float] = None,
    presence_penalty: Optional[float] = None,
    frequency_penalty: Optional[float] = None,
    max_tokens: Optional[int] = None,
    stop: Optional[List[str]] = None,
    extra_body: Optional[Dict[str, Any]] = None,
    **kwargs
) -> StreamResponse

Stream a chat completion response incrementally.

Parameters:

Name Type Description Default
messages list[Message]

Conversation messages.

required
model str

Model ID to use. Required unless provided in configuration.model.

None
temperature Optional[float]

See chat for details.

None
top_p Optional[float]

See chat for details.

None
presence_penalty Optional[float]

See chat for details.

None
frequency_penalty Optional[float]

See chat for details.

None
max_tokens Optional[float]

See chat for details.

None
stop Optional[float]

See chat for details.

None
extra_body Optional[float]

See chat for details.

None
**kwargs

Additional provider-specific arguments.

{}

Yields:

Type Description
MessageChunk

Delta chunks as they arrive from the provider.

Notes
  • Validates messages, final model, and stream=True.
Source code in bridgic/llms/openai_like/_openai_like_llm.py
def stream(
    self,
    messages: List[Message],
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    top_p: Optional[float] = None,
    presence_penalty: Optional[float] = None,
    frequency_penalty: Optional[float] = None,
    max_tokens: Optional[int] = None,
    stop: Optional[List[str]] = None,
    extra_body: Optional[Dict[str, Any]] = None,
    **kwargs,
) -> StreamResponse:
    """
    Stream a chat completion response incrementally.

    Parameters
    ----------
    messages : list[Message]
        Conversation messages.
    model : str, optional
        Model ID to use. Required unless provided in `configuration.model`.
    temperature, top_p, presence_penalty, frequency_penalty, max_tokens, stop, extra_body
        See `chat` for details.
    **kwargs
        Additional provider-specific arguments.

    Yields
    ------
    MessageChunk
        Delta chunks as they arrive from the provider.

    Notes
    -----
    - Validates `messages`, final `model`, and `stream=True`.
    """
    params = self._build_parameters(
        messages=messages,
        model=model,
        temperature=temperature,
        top_p=top_p,
        presence_penalty=presence_penalty,
        frequency_penalty=frequency_penalty,
        max_tokens=max_tokens,
        stop=stop,
        extra_body=extra_body,
        stream=True,
        **kwargs,
    )
    validate_required_params(params, ["messages", "model", "stream"])
    response = self.client.chat.completions.create(**params)
    for chunk in response:
        delta_content = chunk.choices[0].delta.content
        delta_content = delta_content if delta_content else ""
        yield MessageChunk(delta=delta_content, raw=chunk)

achat

async
achat(
    messages: List[Message],
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    top_p: Optional[float] = None,
    presence_penalty: Optional[float] = None,
    frequency_penalty: Optional[float] = None,
    max_tokens: Optional[int] = None,
    stop: Optional[List[str]] = None,
    extra_body: Optional[Dict[str, Any]] = None,
    **kwargs
) -> Response

Asynchronously send a chat completion request to an OpenAI-compatible provider.

Parameters:

Name Type Description Default
messages list[Message]

Conversation messages.

required
model str

Model ID to use. Required unless provided in configuration.model.

None
temperature Optional[float]

See chat for details.

None
top_p Optional[float]

See chat for details.

None
presence_penalty Optional[float]

See chat for details.

None
frequency_penalty Optional[float]

See chat for details.

None
max_tokens Optional[float]

See chat for details.

None
stop Optional[float]

See chat for details.

None
extra_body Optional[float]

See chat for details.

None
**kwargs

Additional provider-specific arguments.

{}

Returns:

Type Description
Response

Bridgic response containing the generated message and raw API response.

Source code in bridgic/llms/openai_like/_openai_like_llm.py
async def achat(
    self,
    messages: List[Message],
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    top_p: Optional[float] = None,
    presence_penalty: Optional[float] = None,
    frequency_penalty: Optional[float] = None,
    max_tokens: Optional[int] = None,
    stop: Optional[List[str]] = None,
    extra_body: Optional[Dict[str, Any]] = None,
    **kwargs,
) -> Response:
    """
    Asynchronously send a chat completion request to an OpenAI-compatible provider.

    Parameters
    ----------
    messages : list[Message]
        Conversation messages.
    model : str, optional
        Model ID to use. Required unless provided in `configuration.model`.
    temperature, top_p, presence_penalty, frequency_penalty, max_tokens, stop, extra_body
        See `chat` for details.
    **kwargs
        Additional provider-specific arguments.

    Returns
    -------
    Response
        Bridgic response containing the generated message and raw API response.
    """
    params = self._build_parameters(
        messages=messages,
        model=model,
        temperature=temperature,
        top_p=top_p,
        presence_penalty=presence_penalty,
        frequency_penalty=frequency_penalty,
        max_tokens=max_tokens,
        stop=stop,
        extra_body=extra_body,
        **kwargs,
    )
    validate_required_params(params, ["messages", "model"])
    response = await self.async_client.chat.completions.create(**params)
    openai_message: ChatCompletionMessage = response.choices[0].message
    text: str = openai_message.content if openai_message.content else ""

    if openai_message.refusal:
        warnings.warn(openai_message.refusal, RuntimeWarning)

    return Response(
        message=Message.from_text(text, role=Role.AI),
        raw=response,
    )

astream

async
astream(
    messages: List[Message],
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    top_p: Optional[float] = None,
    presence_penalty: Optional[float] = None,
    frequency_penalty: Optional[float] = None,
    max_tokens: Optional[int] = None,
    stop: Optional[List[str]] = None,
    extra_body: Optional[Dict[str, Any]] = None,
    **kwargs
) -> AsyncStreamResponse

Asynchronously stream a chat completion response incrementally.

Parameters:

Name Type Description Default
messages list[Message]

Conversation messages.

required
model str

Model ID to use. Required unless provided in configuration.model.

None
temperature Optional[float]

See chat for details.

None
top_p Optional[float]

See chat for details.

None
presence_penalty Optional[float]

See chat for details.

None
frequency_penalty Optional[float]

See chat for details.

None
max_tokens Optional[float]

See chat for details.

None
stop Optional[float]

See chat for details.

None
extra_body Optional[float]

See chat for details.

None
**kwargs

Additional provider-specific arguments.

{}

Yields:

Type Description
MessageChunk

Delta chunks as they arrive from the provider.

Notes
  • Validates messages, final model, and stream=True.
Source code in bridgic/llms/openai_like/_openai_like_llm.py
async def astream(
    self,
    messages: List[Message],
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    top_p: Optional[float] = None,
    presence_penalty: Optional[float] = None,
    frequency_penalty: Optional[float] = None,
    max_tokens: Optional[int] = None,
    stop: Optional[List[str]] = None,
    extra_body: Optional[Dict[str, Any]] = None,
    **kwargs,
) -> AsyncStreamResponse:
    """
    Asynchronously stream a chat completion response incrementally.

    Parameters
    ----------
    messages : list[Message]
        Conversation messages.
    model : str, optional
        Model ID to use. Required unless provided in `configuration.model`.
    temperature, top_p, presence_penalty, frequency_penalty, max_tokens, stop, extra_body
        See `chat` for details.
    **kwargs
        Additional provider-specific arguments.

    Yields
    ------
    MessageChunk
        Delta chunks as they arrive from the provider.

    Notes
    -----
    - Validates `messages`, final `model`, and `stream=True`.
    """
    params = self._build_parameters(
        messages=messages,
        model=model,
        temperature=temperature,
        top_p=top_p,
        presence_penalty=presence_penalty,
        frequency_penalty=frequency_penalty,
        max_tokens=max_tokens,
        stop=stop,
        extra_body=extra_body,
        stream=True,
        **kwargs,
    )
    validate_required_params(params, ["messages", "model", "stream"])
    response = await self.async_client.chat.completions.create(**params)
    async for chunk in response:
        delta_content = chunk.choices[0].delta.content
        delta_content = delta_content if delta_content else ""
        yield MessageChunk(delta=delta_content, raw=chunk)