The openai provider supports the OpenAI /chat endpoint, setting OpenAI-specific default configuration options.

For Azure, we recommend using azure-openai instead.

For all other OpenAI-compatible API providers, such as Groq, HuggingFace, Ollama, OpenRouter, Together AI, and others, we recommend using openai-generic instead.

Example:

BAML
1client<llm> MyClient {
2 provider "openai"
3 options {
4 api_key env.MY_OPENAI_KEY
5 model "gpt-3.5-turbo"
6 temperature 0.1
7 }
8}

BAML-specific request options

These unique parameters (aka options) are modify the API request sent to the provider.

You can use this to modify the headers and base_url for example.

api_key
stringDefaults to env.OPENAI_API_KEY

Will be used to build the Authorization header, like so: Authorization: Bearer $api_key

Default: env.OPENAI_API_KEY

base_url
string

The base URL for the API.

Default: https://api.openai.com/v1

headers
object

Additional headers to send with the request.

Example:

BAML
1client<llm> MyClient {
2 provider openai
3 options {
4 api_key env.MY_OPENAI_KEY
5 model "gpt-3.5-turbo"
6 headers {
7 "X-My-Header" "my-value"
8 }
9 }
10}
default_role
string

The role to use if the role is not in the allowed_roles. Default: "user" usually, but some models like OpenAI’s gpt-4o will use "system"

Picked the first role in allowed_roles if not “user”, otherwise “user”.

allowed_roles
string[]

Which roles should we forward to the API? Default: ["system", "user", "assistant"] usually, but some models like OpenAI’s o1-mini will use ["user", "assistant"]

When building prompts, any role not in this list will be set to the default_role.

allowed_role_metadata
string[]

Which role metadata should we forward to the API? Default: []

For example you can set this to ["foo", "bar"] to forward the cache policy to the API.

If you do not set allowed_role_metadata, we will not forward any role metadata to the API even if it is set in the prompt.

Then in your prompt you can use something like:

1client<llm> Foo {
2 provider openai
3 options {
4 allowed_role_metadata: ["foo", "bar"]
5 }
6}
7
8client<llm> FooWithout {
9 provider openai
10 options {
11 }
12}
13template_string Foo() #"
14 {{ _.role('user', foo={"type": "ephemeral"}, bar="1", cat=True) }}
15 This will be have foo and bar, but not cat metadata. But only for Foo, not FooWithout.
16 {{ _.role('user') }}
17 This will have none of the role metadata for Foo or FooWithout.
18"#

You can use the playground to see the raw curl request to see what is being sent to the API.

supports_streaming
boolean

Whether the internal LLM client should use the streaming API. Default: <auto>

ModelSupports Streaming
o1-previewfalse
o1-minifalse
o1-*false
gpt-4otrue
gpt-4o-minitrue
*true

Then in your prompt you can use something like:

1client<llm> MyClientWithoutStreaming {
2 provider openai
3 options {
4 model gpt-4o
5 api_key env.OPENAI_API_KEY
6 supports_streaming false
7 }
8}
9
10function MyFunction() -> string {
11 client MyClientWithoutStreaming
12 prompt #"Write a short story"#
13}
1# This will be streamed from your python code perspective,
2# but under the hood it will call the non-streaming HTTP API
3# and then return a streamable response with a single event
4b.stream.MyFunction()
5
6# This will work exactly the same as before
7b.MyFunction()
finish_reason_allow_list
string[]

Which finish reasons are allowed? Default: null

version 0.73.0 onwards: This is case insensitive.

Will raise a BamlClientFinishReasonError if the finish reason is not in the allow list. See Exceptions for more details.

Note, only one of finish_reason_allow_list or finish_reason_deny_list can be set.

For example you can set this to ["stop"] to only allow the stop finish reason, all other finish reasons (e.g. length) will treated as failures that PREVENT fallbacks and retries (similar to parsing errors).

Then in your code you can use something like:

1client<llm> MyClient {
2 provider "openai"
3 options {
4 model "gpt-4o-mini"
5 api_key env.OPENAI_API_KEY
6 // Finish reason allow list will only allow the stop finish reason
7 finish_reason_allow_list ["stop"]
8 }
9}
finish_reason_deny_list
string[]

Which finish reasons are denied? Default: null

version 0.73.0 onwards: This is case insensitive.

Will raise a BamlClientFinishReasonError if the finish reason is in the deny list. See Exceptions for more details.

Note, only one of finish_reason_allow_list or finish_reason_deny_list can be set.

For example you can set this to ["length"] to stop the function from continuing if the finish reason is length. (e.g. LLM was cut off because it was too long).

Then in your code you can use something like:

1client<llm> MyClient {
2 provider "openai"
3 options {
4 model "gpt-4o-mini"
5 api_key env.OPENAI_API_KEY
6 // Finish reason deny list will allow all finish reasons except length
7 finish_reason_deny_list ["length"]
8 }
9}

Provider request parameters

These are other parameters that are passed through to the provider, without modification by BAML. For example if the request has a temperature field, you can define it in the client here so every call has that set.

Consult the specific provider’s documentation for more information.

messages
DO NOT USE

BAML will auto construct this field for you from the prompt

stream
DO NOT USE

BAML will auto construct this field for you based on how you call the client in your code

model
string

The model to use.

ModelDescription
gpt-3.5-turboFastest
gpt-4oFast + text + image
gpt-4-turboSmartest + text + image + code
gpt-4o-miniCheapest + text + image

See openai docs for the list of openai models. You can pass any model name you wish, we will not check if it exists.

For all other options, see the official OpenAI API documentation.

Built with