diff --git a/src/Custom/OpenAIClient.cs b/src/Custom/OpenAIClient.cs
index e7ffd76e..a9718090 100644
--- a/src/Custom/OpenAIClient.cs
+++ b/src/Custom/OpenAIClient.cs
@@ -6,17 +6,13 @@
using OpenAI.Files;
using OpenAI.FineTuning;
using OpenAI.Images;
-using OpenAI.LegacyCompletions;
using OpenAI.Models;
using OpenAI.Moderations;
using OpenAI.VectorStores;
using System;
using System.ClientModel;
using System.ClientModel.Primitives;
-using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
-using System.Reflection;
-using System.Runtime.Versioning;
namespace OpenAI;
@@ -220,12 +216,13 @@ internal static ClientPipeline CreatePipeline(ApiKeyCredential credential, OpenA
{
return ClientPipeline.Create(
options ?? new(),
- perCallPolicies: [],
+ perCallPolicies: [
+ CreateAddBetaFeatureHeaderPolicy(),
+ CreateAddCustomHeadersPolicy(options),
+ ],
perTryPolicies:
[
- ApiKeyAuthenticationPolicy.CreateHeaderApiKeyPolicy(credential, AuthorizationHeader, AuthorizationApiKeyPrefix),
- CreateAddBetaFeatureHeaderPolicy(),
- CreateAddUserAgentHeaderPolicy(options),
+ ApiKeyAuthenticationPolicy.CreateHeaderApiKeyPolicy(credential, AuthorizationHeader, AuthorizationApiKeyPrefix)
],
beforeTransportPolicies: []);
}
@@ -263,29 +260,40 @@ private static PipelinePolicy CreateAddBetaFeatureHeaderPolicy()
{
return new GenericActionPipelinePolicy((message) =>
{
- if (message?.Request?.Headers?.TryGetValue(OpenAIBetaFeatureHeaderKey, out string _) == false)
+ if (message?.Request?.Headers?.TryGetValue(OpenAIBetaFeatureHeaderName, out string _) == false)
{
- message.Request.Headers.Set(OpenAIBetaFeatureHeaderKey, OpenAIBetaAssistantsV1HeaderValue);
+ message.Request.Headers.Set(OpenAIBetaFeatureHeaderName, OpenAIBetaAssistantsV1HeaderValue);
}
});
}
- private static PipelinePolicy CreateAddUserAgentHeaderPolicy(OpenAIClientOptions options = null)
+ private static PipelinePolicy CreateAddCustomHeadersPolicy(OpenAIClientOptions options = null)
{
TelemetryDetails telemetryDetails = new(typeof(OpenAIClientOptions).Assembly, options?.ApplicationId);
return new GenericActionPipelinePolicy((message) =>
{
- if (message?.Request?.Headers?.TryGetValue(UserAgentHeaderKey, out string _) == false)
+ if (message?.Request?.Headers?.TryGetValue(UserAgentHeaderName, out string _) == false)
{
- message.Request.Headers.Set(UserAgentHeaderKey, telemetryDetails.ToString());
+ message.Request.Headers.Set(UserAgentHeaderName, telemetryDetails.ToString());
+ }
+
+ if (!string.IsNullOrEmpty(options.OrganizationId))
+ {
+ message.Request.Headers.Set(OpenAIOrganizationHeaderName, options.OrganizationId);
+ }
+ if (!string.IsNullOrEmpty(options.ProjectId))
+ {
+ message.Request.Headers.Set(OpenAIProjectHeaderName, options.ProjectId);
}
});
}
- private const string OpenAIBetaFeatureHeaderKey = "OpenAI-Beta";
+ private const string OpenAIBetaFeatureHeaderName = "OpenAI-Beta";
+ private const string OpenAIOrganizationHeaderName = "OpenAI-Organization";
+ private const string OpenAIProjectHeaderName = "OpenAI-Project";
private const string OpenAIBetaAssistantsV1HeaderValue = "assistants=v2";
private const string OpenAIEndpointEnvironmentVariable = "OPENAI_ENDPOINT";
private const string OpenAIApiKeyEnvironmentVariable = "OPENAI_API_KEY";
private const string OpenAIV1Endpoint = "https://api.openai.com/v1";
- private const string UserAgentHeaderKey = "User-Agent";
+ private const string UserAgentHeaderName = "User-Agent";
}
diff --git a/src/Custom/OpenAIClientOptions.cs b/src/Custom/OpenAIClientOptions.cs
index b5da9a71..5835d0fd 100644
--- a/src/Custom/OpenAIClientOptions.cs
+++ b/src/Custom/OpenAIClientOptions.cs
@@ -18,4 +18,14 @@ public partial class OpenAIClientOptions : ClientPipelineOptions
/// An optional application ID to use as part of the request User-Agent header.
///
public string ApplicationId { get; init; }
+
+ ///
+ /// An optional ID added to OpenAI-Organization header
+ ///
+ public string OrganizationId { get; init; }
+
+ ///
+ /// An optional ID added to OpenAI-Project header
+ ///
+ public string ProjectId { get; init; }
}