Skip to content

Python: Add extra_body attribute to OpenAI Chat settings - #11852

Merged
eavanvalkenburg merged 1 commit into
microsoft:mainfrom
moonbox3:open-ai-extra-body
May 6, 2025
Merged

Python: Add extra_body attribute to OpenAI Chat settings#11852
eavanvalkenburg merged 1 commit into
microsoft:mainfrom
moonbox3:open-ai-extra-body

Conversation

@moonbox3

@moonbox3 moonbox3 commented May 2, 2025

Copy link
Copy Markdown
Collaborator

Motivation and Context

SK'S OpenAIChatPromptExecutions do not allow one to configure the extra_body input to a chat completions create. This is something specified on the Azure OpenAI connector but not on OpenAI. Because there are also custom attributes as part of AOAI, we're providing a base class attribute, and we will keep the child class attribute as-is.

Description

Introduce the extra_body attribute on OpenAI Chat Prompt Execution Settings.

Contribution Checklist

@moonbox3
moonbox3 requested a review from a team as a code owner May 2, 2025 07:04
@moonbox3 moonbox3 self-assigned this May 2, 2025
@markwallace-microsoft markwallace-microsoft added the python Pull requests for the Python Semantic Kernel label May 2, 2025
@markwallace-microsoft

Copy link
Copy Markdown
Contributor

Python Unit Test Overview

Tests Skipped Failures Errors Time
3472 5 💤 0 ❌ 0 🔥 1m 29s ⏱️

@moonbox3
moonbox3 enabled auto-merge May 2, 2025 07:30
@moonbox3
moonbox3 added this pull request to the merge queue May 2, 2025
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks May 2, 2025
@eavanvalkenburg
eavanvalkenburg added this pull request to the merge queue May 6, 2025
Merged via the queue into microsoft:main with commit bc71548 May 6, 2025
@github-project-automation github-project-automation Bot moved this to Sprint: Done in Semantic Kernel May 6, 2025
glorious-beard pushed a commit to glorious-beard/semantic-kernel that referenced this pull request May 6, 2025
…1852)

### Motivation and Context

SK'S `OpenAIChatPromptExecutions` do not allow one to configure the
`extra_body` input to a chat completions create. This is something
specified on the Azure OpenAI connector but not on OpenAI. Because there
are also custom attributes as part of AOAI, we're providing a base class
attribute, and we will keep the child class attribute as-is.

<!-- Thank you for your contribution to the semantic-kernel repo!
Please help reviewers and future users, providing the following
information:
  1. Why is this change required?
  2. What problem does it solve?
  3. What scenario does it contribute to?
  4. If it fixes an open issue, please link to the issue here.
-->

### Description

Introduce the `extra_body` attribute on OpenAI Chat Prompt Execution
Settings.
- Closes microsoft#11813

<!-- Describe your changes, the overall approach, the underlying design.
These notes will help understanding how your code works. Thanks! -->

### Contribution Checklist

<!-- Before submitting this PR, please make sure: -->

- [X] The code builds clean without any errors or warnings
- [X] The PR follows the [SK Contribution
Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md)
and the [pre-submission formatting
script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts)
raises no violations
- [X] All unit tests pass, and I have added new tests where possible
- [X] I didn't break anyone 😄
@SherlockBULABULA

Copy link
Copy Markdown

dotnet need Add extra_body attribute to OpenAI Chat settings too

jcruzmot-te pushed a commit to thousandeyes/aia-semantic-kernel that referenced this pull request Sep 15, 2025
…1852)

### Motivation and Context

SK'S `OpenAIChatPromptExecutions` do not allow one to configure the
`extra_body` input to a chat completions create. This is something
specified on the Azure OpenAI connector but not on OpenAI. Because there
are also custom attributes as part of AOAI, we're providing a base class
attribute, and we will keep the child class attribute as-is.

<!-- Thank you for your contribution to the semantic-kernel repo!
Please help reviewers and future users, providing the following
information:
  1. Why is this change required?
  2. What problem does it solve?
  3. What scenario does it contribute to?
  4. If it fixes an open issue, please link to the issue here.
-->

### Description

Introduce the `extra_body` attribute on OpenAI Chat Prompt Execution
Settings.
- Closes microsoft#11813

<!-- Describe your changes, the overall approach, the underlying design.
These notes will help understanding how your code works. Thanks! -->

### Contribution Checklist

<!-- Before submitting this PR, please make sure: -->

- [X] The code builds clean without any errors or warnings
- [X] The PR follows the [SK Contribution
Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md)
and the [pre-submission formatting
script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts)
raises no violations
- [X] All unit tests pass, and I have added new tests where possible
- [X] I didn't break anyone 😄
daric93 pushed a commit to daric93/microsoft-semantic-kernel that referenced this pull request Apr 30, 2026
microsoft#13934)

### Motivation and Context

Closes microsoft#12307. Provides .NET parity with the Python fix in microsoft#11852 by
adding an escape-hatch `ExtraBody` property to
`OpenAIPromptExecutionSettings`. This allows callers to inject
vendor-specific or preview parameters into the request body without
waiting for SDK modeling. Use cases from the issue include:

- Qwen3 open-source models requiring `enable_thinking: false` for
non-streaming calls
- ChatGLM thinking-mode flags
- Any OpenAI-compatible endpoint exposing fields not modeled by the SDK

### Description

Adds `IDictionary<string, object?>? ExtraBody` to
`OpenAIPromptExecutionSettings` (inherited automatically by
`AzureOpenAIPromptExecutionSettings`), marked
`[Experimental("SKEXP0010")]`.

#### Hybrid key syntax (diverges intentionally from Python to leverage
the OpenAI .NET SDK's `JsonPatch`)

- A plain key is treated as a literal top-level field name. Keys with
dots, brackets, or other special characters are bracket-quoted
automatically and remain literal.
- `ExtraBody["enable_thinking"] = false` → `{ "enable_thinking": false
}`
  - `ExtraBody["weird.key"] = "x"` → `{ "weird.key": "x" }`
- A key starting with `$.` is interpreted as a JSONPath expression and
applied as a deep patch onto the request body.
- `ExtraBody["$.thinking.enabled"] = false` → `{ "thinking": {
"enabled": false } }`
- `ExtraBody["$.tools[0].function.name"] = "x"` → patches into array
elements
- Nested dictionaries are also supported via plain keys:
`ExtraBody["thinking"] = new Dictionary<string,object?> { ["enabled"] =
false }`.

#### Behavior

- **Last-write-wins on collisions** with strongly-typed properties (e.g.
`Temperature`). Documented.
- **`null` values emit JSON `null`**. Field removal is not supported.
- **No input validation, no telemetry emission** of `ExtraBody` contents
(Python parity).
- **Shallow `Clone()`**, `ReadOnlyDictionary` on `Freeze()`.

#### Wiring

- Classic path: `ClientCore.ChatCompletion.cs` and
`AzureClientCore.ChatCompletion.cs` apply patches at the end of
`CreateChatCompletionOptions`.
- `IChatClient` path: new `protected virtual
PrepareChatOptionsForRequest(ChatOptions)` hook on
`PromptExecutionSettings` (mirrors the existing
`PrepareChatHistoryForRequest` pattern). The OpenAI override sets
`ChatOptions.RawRepresentationFactory` and removes the redundant
`AdditionalProperties["extra_body"]` entry produced by `ToChatOptions`'s
round-trip.

#### Files changed

- `SemanticKernel.Abstractions/AI/PromptExecutionSettings.cs` — new hook
+ internal bridge
- `SemanticKernel.Abstractions/AI/PromptExecutionSettingsExtensions.cs`
— invokes the hook on the original derived instance
- `Connectors.OpenAI/Settings/OpenAIPromptExecutionSettings.cs` —
property, Freeze, Clone, `PrepareChatOptionsForRequest` override,
`ApplyExtraBody`/`ApplyExtraBodyEntry` helpers
- `Connectors.OpenAI/Core/ClientCore.ChatCompletion.cs` — apply in
classic path
- `Connectors.AzureOpenAI/Core/AzureClientCore.ChatCompletion.cs` —
apply in Azure classic path
- `samples/Concepts/ChatCompletion/OpenAI_ChatCompletionExtraBody.cs` —
concept sample (flat field + deep patch)

#### Tests (14 new, all passing)

`Connectors.OpenAI.UnitTests` (11): non-streaming flat key, streaming
flat key, collision (last-write-wins), nested dict, `$.` deep patch,
literal dotted key, `null` value, `FromExecutionSettings` round-trip,
Clone shallow, Freeze read-only, `ToChatOptions`
`RawRepresentationFactory` + `AdditionalProperties` cleanup.

`Connectors.AzureOpenAI.UnitTests` (3): flat key, collision, `$.` deep
patch.

#### Regression

- `Connectors.OpenAI.UnitTests`: 485 passed
- `Connectors.AzureOpenAI.UnitTests`: 493 passed
- `SemanticKernel.UnitTests`: 1606 passed (verifies the new hook in
Abstractions has no side effects)

### Contribution Checklist

- [x] The code builds clean without any errors or warnings
- [x] The PR follows the SK Contribution Guidelines and the
pre-submission formatting script raises no violations
- [x] All unit tests pass, and I have added new tests where possible
- [x] I didn't break anyone 😄
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

python Pull requests for the Python Semantic Kernel

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Python: New Feature: Can set extra_body for OpenAIChatPromptExecutionSettings

5 participants