Skip to content

Commit 9c70a0f

Browse files
committed
Support recently released Openai reasoning models
- Rely on deepthought flag to control reasoning effort - Generalize Openai reasoning model check for all o- series models
1 parent 2f82839 commit 9c70a0f

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

src/khoj/processor/conversation/openai/utils.py

+15-6
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,10 @@ def completion_with_backoff(
6464
formatted_messages = [{"role": message.role, "content": message.content} for message in messages]
6565

6666
# Tune reasoning models arguments
67-
if model_name.startswith("o1") or model_name.startswith("o3"):
67+
if is_openai_reasoning_model(model_name, api_base_url):
6868
temperature = 1
69-
model_kwargs["reasoning_effort"] = "medium"
69+
reasoning_effort = "medium" if deepthought else "low"
70+
model_kwargs["reasoning_effort"] = reasoning_effort
7071

7172
model_kwargs["stream_options"] = {"include_usage": True}
7273
if os.getenv("KHOJ_LLM_SEED"):
@@ -162,12 +163,13 @@ def llm_thread(
162163

163164
formatted_messages = [{"role": message.role, "content": message.content} for message in messages]
164165

165-
# Tune reasoning models arguments
166-
if model_name.startswith("o1") or model_name.startswith("o3"):
166+
# Configure thinking for openai reasoning models
167+
if is_openai_reasoning_model(model_name, api_base_url):
167168
temperature = 1
168-
model_kwargs["reasoning_effort"] = "medium"
169+
reasoning_effort = "medium" if deepthought else "low"
170+
model_kwargs["reasoning_effort"] = reasoning_effort
171+
model_kwargs.pop("stop", None) # Remove unsupported stop param for reasoning models
169172

170-
if model_name.startswith("o3"):
171173
# Get the first system message and add the string `Formatting re-enabled` to it.
172174
# See https://platform.openai.com/docs/guides/reasoning-best-practices
173175
if len(formatted_messages) > 0:
@@ -257,3 +259,10 @@ def get_openai_api_json_support(model_name: str, api_base_url: str = None) -> Js
257259
if host == "api.deepinfra.com":
258260
return JsonSupport.OBJECT
259261
return JsonSupport.SCHEMA
262+
263+
264+
def is_openai_reasoning_model(model_name: str, api_base_url: str = None) -> bool:
265+
"""
266+
Check if the model is an OpenAI reasoning model
267+
"""
268+
return model_name.startswith("o") and (api_base_url is None or api_base_url.startswith("https://api.openai.com/v1"))

src/khoj/utils/constants.py

+2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@
3939
"gpt-4o": {"input": 2.50, "output": 10.00},
4040
"gpt-4o-mini": {"input": 0.15, "output": 0.60},
4141
"o1": {"input": 15.0, "output": 60.00},
42+
"o3": {"input": 10.0, "output": 40.00},
4243
"o1-mini": {"input": 3.0, "output": 12.0},
4344
"o3-mini": {"input": 1.10, "output": 4.40},
45+
"o4-mini": {"input": 1.10, "output": 4.40},
4446
# Gemini Pricing: https://ai.google.dev/pricing
4547
"gemini-1.5-flash": {"input": 0.075, "output": 0.30},
4648
"gemini-1.5-flash-002": {"input": 0.075, "output": 0.30},

0 commit comments

Comments
 (0)