FEATURE: support OpenAI-Organization header (#245)

Per: https://platform.openai.com/docs/api-reference/authentication

There is an organization option which is useful for large orgs

> For users who belong to multiple organizations, you can pass a header to specify which organization is used for an API request. Usage from these API requests will count against the specified organization's subscription quota.
This commit is contained in:
Sam 2023-10-06 10:23:18 +11:00 committed by GitHub
parent d87adcebea
commit 9242da545e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 35 additions and 0 deletions

View File

@ -41,6 +41,7 @@ en:
ai_openai_gpt35_16k_url: "Custom URL used for GPT 3.5 16k chat completions. (for Azure support)"
ai_openai_gpt4_url: "Custom URL used for GPT 4 chat completions. (for Azure support)"
ai_openai_gpt4_32k_url: "Custom URL used for GPT 4 32k chat completions. (for Azure support)"
ai_openai_organization: "(Optional, leave empty to omit) Organization id used for the OpenAI API. Passed in using the OpenAI-Organization header."
ai_openai_embeddings_url: "Custom URL used for the OpenAI embeddings API. (in the case of Azure it can be: https://COMPANY.openai.azure.com/openai/deployments/DEPLOYMENT/embeddings?api-version=2023-05-15)"
ai_openai_api_key: "API key for OpenAI API"
ai_anthropic_api_key: "API key for Anthropic API"

View File

@ -93,6 +93,7 @@ discourse_ai:
ai_openai_gpt4_url: "https://api.openai.com/v1/chat/completions"
ai_openai_gpt4_32k_url: "https://api.openai.com/v1/chat/completions"
ai_openai_embeddings_url: "https://api.openai.com/v1/embeddings"
ai_openai_organization: ""
ai_openai_api_key:
default: ""
secret: true

View File

@ -48,6 +48,10 @@ module ::DiscourseAi
headers["Authorization"] = "Bearer #{SiteSetting.ai_openai_api_key}"
end
if SiteSetting.ai_openai_organization.present?
headers["OpenAI-Organization"] = SiteSetting.ai_openai_organization
end
payload = { model: model, messages: messages }
payload[:temperature] = temperature if temperature

View File

@ -6,6 +6,35 @@ require_relative "../../support/openai_completions_inference_stubs"
describe DiscourseAi::Inference::OpenAiCompletions do
before { SiteSetting.ai_openai_api_key = "abc-123" }
it "supports sending an organization id" do
SiteSetting.ai_openai_organization = "org_123"
stub_request(:post, "https://api.openai.com/v1/chat/completions").with(
body:
"{\"model\":\"gpt-3.5-turbo-0613\",\"messages\":[{\"role\":\"system\",\"content\":\"hello\"}]}",
headers: {
"Authorization" => "Bearer abc-123",
"Content-Type" => "application/json",
"Host" => "api.openai.com",
"User-Agent" => "Ruby",
"OpenAI-Organization" => "org_123",
},
).to_return(
status: 200,
body: { choices: [message: { content: "world" }] }.to_json,
headers: {
},
)
result =
DiscourseAi::Inference::OpenAiCompletions.perform!(
[{ role: "system", content: "hello" }],
"gpt-3.5-turbo-0613",
)
expect(result.dig(:choices, 0, :message, :content)).to eq("world")
end
context "when configured using Azure" do
it "Supports custom Azure endpoints for completions" do
gpt_url_base =