From 7265f74c24f0556032f114a4d4a5487ca555478b Mon Sep 17 00:00:00 2001
From: Peter Goldstein <peter.goldstein@hearst.com>
Date: Fri, 7 Feb 2025 00:01:48 -0500
Subject: [PATCH] Add reasoning_effort for o1 and o3 (#1628)

---
 .changeset/itchy-dots-warn.md        |  5 +++++
 packages/providers/openai/src/llm.ts | 12 ++++++++++++
 2 files changed, 17 insertions(+)
 create mode 100644 .changeset/itchy-dots-warn.md

diff --git a/.changeset/itchy-dots-warn.md b/.changeset/itchy-dots-warn.md
new file mode 100644
index 000000000..3dfab5b74
--- /dev/null
+++ b/.changeset/itchy-dots-warn.md
@@ -0,0 +1,5 @@
+---
+"@llamaindex/openai": patch
+---
+
+Add reasoning_effort for o1 and o3 models
diff --git a/packages/providers/openai/src/llm.ts b/packages/providers/openai/src/llm.ts
index 926d478d1..081edde96 100644
--- a/packages/providers/openai/src/llm.ts
+++ b/packages/providers/openai/src/llm.ts
@@ -140,6 +140,12 @@ export function isFunctionCallingModel(llm: LLM): llm is OpenAI {
   return isChatModel && !isOld && !isO1;
 }
 
+export function isReasoningModel(model: ChatModel | string): boolean {
+  const isO1 = model.startsWith("o1");
+  const isO3 = model.startsWith("o3");
+  return isO1 || isO3;
+}
+
 export function isTemperatureSupported(model: ChatModel | string): boolean {
   return !model.startsWith("o3");
 }
@@ -152,6 +158,7 @@ export type OpenAIAdditionalChatOptions = Omit<
   | "messages"
   | "model"
   | "temperature"
+  | "reasoning_effort"
   | "top_p"
   | "stream"
   | "tools"
@@ -166,6 +173,7 @@ export class OpenAI extends ToolCallLLM<OpenAIAdditionalChatOptions> {
     // string & {} is a hack to allow any string, but still give autocomplete
     | (string & {});
   temperature: number;
+  reasoningEffort?: "low" | "medium" | "high" | undefined;
   topP: number;
   maxTokens?: number | undefined;
   additionalChatOptions?: OpenAIAdditionalChatOptions | undefined;
@@ -197,6 +205,9 @@ export class OpenAI extends ToolCallLLM<OpenAIAdditionalChatOptions> {
     super();
     this.model = init?.model ?? "gpt-4o";
     this.temperature = init?.temperature ?? 0.1;
+    this.reasoningEffort = isReasoningModel(this.model)
+      ? init?.reasoningEffort
+      : undefined;
     this.topP = init?.topP ?? 1;
     this.maxTokens = init?.maxTokens ?? undefined;
 
@@ -354,6 +365,7 @@ export class OpenAI extends ToolCallLLM<OpenAIAdditionalChatOptions> {
     const baseRequestParams = <OpenAILLM.Chat.ChatCompletionCreateParams>{
       model: this.model,
       temperature: isTemperatureSupported(this.model) ? this.temperature : null,
+      reasoning_effort: this.reasoningEffort,
       max_tokens: this.maxTokens,
       tools: tools?.map(OpenAI.toTool),
       messages: OpenAI.toOpenAIMessage(messages),
-- 
GitLab