Skip to content

Commit 3d39fb0

Browse files
Shulyakafrenck
authored andcommitted
Add GPT-5 support (home-assistant#150281)
1 parent a1731cd commit 3d39fb0

File tree

6 files changed

+77
-19
lines changed

6 files changed

+77
-19
lines changed

homeassistant/components/openai_conversation/config_flow.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
CONF_RECOMMENDED,
5050
CONF_TEMPERATURE,
5151
CONF_TOP_P,
52+
CONF_VERBOSITY,
5253
CONF_WEB_SEARCH,
5354
CONF_WEB_SEARCH_CITY,
5455
CONF_WEB_SEARCH_CONTEXT_SIZE,
@@ -67,6 +68,7 @@
6768
RECOMMENDED_REASONING_EFFORT,
6869
RECOMMENDED_TEMPERATURE,
6970
RECOMMENDED_TOP_P,
71+
RECOMMENDED_VERBOSITY,
7072
RECOMMENDED_WEB_SEARCH,
7173
RECOMMENDED_WEB_SEARCH_CONTEXT_SIZE,
7274
RECOMMENDED_WEB_SEARCH_USER_LOCATION,
@@ -323,15 +325,17 @@ async def async_step_model(
323325

324326
model = options[CONF_CHAT_MODEL]
325327

326-
if model.startswith("o"):
328+
if model.startswith(("o", "gpt-5")):
327329
step_schema.update(
328330
{
329331
vol.Optional(
330332
CONF_REASONING_EFFORT,
331333
default=RECOMMENDED_REASONING_EFFORT,
332334
): SelectSelector(
333335
SelectSelectorConfig(
334-
options=["low", "medium", "high"],
336+
options=["low", "medium", "high"]
337+
if model.startswith("o")
338+
else ["minimal", "low", "medium", "high"],
335339
translation_key=CONF_REASONING_EFFORT,
336340
mode=SelectSelectorMode.DROPDOWN,
337341
)
@@ -341,6 +345,24 @@ async def async_step_model(
341345
elif CONF_REASONING_EFFORT in options:
342346
options.pop(CONF_REASONING_EFFORT)
343347

348+
if model.startswith("gpt-5"):
349+
step_schema.update(
350+
{
351+
vol.Optional(
352+
CONF_VERBOSITY,
353+
default=RECOMMENDED_VERBOSITY,
354+
): SelectSelector(
355+
SelectSelectorConfig(
356+
options=["low", "medium", "high"],
357+
translation_key=CONF_VERBOSITY,
358+
mode=SelectSelectorMode.DROPDOWN,
359+
)
360+
),
361+
}
362+
)
363+
elif CONF_VERBOSITY in options:
364+
options.pop(CONF_VERBOSITY)
365+
344366
if self._subentry_type == "conversation" and not model.startswith(
345367
tuple(UNSUPPORTED_WEB_SEARCH_MODELS)
346368
):

homeassistant/components/openai_conversation/const.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
CONF_RECOMMENDED = "recommended"
2222
CONF_TEMPERATURE = "temperature"
2323
CONF_TOP_P = "top_p"
24+
CONF_VERBOSITY = "verbosity"
2425
CONF_WEB_SEARCH = "web_search"
2526
CONF_WEB_SEARCH_USER_LOCATION = "user_location"
2627
CONF_WEB_SEARCH_CONTEXT_SIZE = "search_context_size"
@@ -34,6 +35,7 @@
3435
RECOMMENDED_REASONING_EFFORT = "low"
3536
RECOMMENDED_TEMPERATURE = 1.0
3637
RECOMMENDED_TOP_P = 1.0
38+
RECOMMENDED_VERBOSITY = "medium"
3739
RECOMMENDED_WEB_SEARCH = False
3840
RECOMMENDED_WEB_SEARCH_CONTEXT_SIZE = "medium"
3941
RECOMMENDED_WEB_SEARCH_USER_LOCATION = False

homeassistant/components/openai_conversation/entity.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
CONF_REASONING_EFFORT,
6262
CONF_TEMPERATURE,
6363
CONF_TOP_P,
64+
CONF_VERBOSITY,
6465
CONF_WEB_SEARCH,
6566
CONF_WEB_SEARCH_CITY,
6667
CONF_WEB_SEARCH_CONTEXT_SIZE,
@@ -75,6 +76,7 @@
7576
RECOMMENDED_REASONING_EFFORT,
7677
RECOMMENDED_TEMPERATURE,
7778
RECOMMENDED_TOP_P,
79+
RECOMMENDED_VERBOSITY,
7880
RECOMMENDED_WEB_SEARCH_CONTEXT_SIZE,
7981
)
8082

@@ -346,14 +348,18 @@ async def _async_handle_chat_log(
346348
if tools:
347349
model_args["tools"] = tools
348350

349-
if model_args["model"].startswith("o"):
351+
if model_args["model"].startswith(("o", "gpt-5")):
350352
model_args["reasoning"] = {
351353
"effort": options.get(
352354
CONF_REASONING_EFFORT, RECOMMENDED_REASONING_EFFORT
353355
)
354356
}
355-
else:
356-
model_args["store"] = False
357+
model_args["include"] = ["reasoning.encrypted_content"]
358+
359+
if model_args["model"].startswith("gpt-5"):
360+
model_args["text"] = {
361+
"verbosity": options.get(CONF_VERBOSITY, RECOMMENDED_VERBOSITY)
362+
}
357363

358364
messages = [
359365
m

homeassistant/components/openai_conversation/strings.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
"selector": {
122122
"reasoning_effort": {
123123
"options": {
124+
"minimal": "Minimal",
124125
"low": "[%key:common::state::low%]",
125126
"medium": "[%key:common::state::medium%]",
126127
"high": "[%key:common::state::high%]"
@@ -132,6 +133,13 @@
132133
"medium": "[%key:common::state::medium%]",
133134
"high": "[%key:common::state::high%]"
134135
}
136+
},
137+
"verbosity": {
138+
"options": {
139+
"low": "[%key:common::state::low%]",
140+
"medium": "[%key:common::state::medium%]",
141+
"high": "[%key:common::state::high%]"
142+
}
135143
}
136144
},
137145
"services": {

tests/components/openai_conversation/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def mock_config_entry_with_reasoning_model(
9494
hass.config_entries.async_update_subentry(
9595
mock_config_entry,
9696
next(iter(mock_config_entry.subentries.values())),
97-
data={CONF_LLM_HASS_API: llm.LLM_API_ASSIST, CONF_CHAT_MODEL: "o4-mini"},
97+
data={CONF_LLM_HASS_API: llm.LLM_API_ASSIST, CONF_CHAT_MODEL: "gpt-5-mini"},
9898
)
9999
return mock_config_entry
100100

tests/components/openai_conversation/test_config_flow.py

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
CONF_RECOMMENDED,
2121
CONF_TEMPERATURE,
2222
CONF_TOP_P,
23+
CONF_VERBOSITY,
2324
CONF_WEB_SEARCH,
2425
CONF_WEB_SEARCH_CITY,
2526
CONF_WEB_SEARCH_CONTEXT_SIZE,
@@ -302,7 +303,7 @@ async def test_form_invalid_auth(hass: HomeAssistant, side_effect, error) -> Non
302303
(
303304
{
304305
CONF_RECOMMENDED: False,
305-
CONF_PROMPT: "Speak like a pirate",
306+
CONF_PROMPT: "Speak like a pro",
306307
},
307308
{
308309
CONF_TEMPERATURE: 1.0,
@@ -317,7 +318,7 @@ async def test_form_invalid_auth(hass: HomeAssistant, side_effect, error) -> Non
317318
),
318319
{
319320
CONF_RECOMMENDED: False,
320-
CONF_PROMPT: "Speak like a pirate",
321+
CONF_PROMPT: "Speak like a pro",
321322
CONF_TEMPERATURE: 1.0,
322323
CONF_CHAT_MODEL: "o1-pro",
323324
CONF_TOP_P: RECOMMENDED_TOP_P,
@@ -414,35 +415,51 @@ async def test_form_invalid_auth(hass: HomeAssistant, side_effect, error) -> Non
414415
( # Case 2: reasoning model
415416
{
416417
CONF_RECOMMENDED: False,
417-
CONF_PROMPT: "Speak like a pro",
418+
CONF_PROMPT: "Speak like a pirate",
418419
CONF_TEMPERATURE: 0.8,
419-
CONF_CHAT_MODEL: "o1-pro",
420+
CONF_CHAT_MODEL: "gpt-5",
420421
CONF_TOP_P: 0.9,
421422
CONF_MAX_TOKENS: 1000,
422-
CONF_REASONING_EFFORT: "high",
423+
CONF_REASONING_EFFORT: "low",
424+
CONF_VERBOSITY: "high",
425+
CONF_CODE_INTERPRETER: False,
426+
CONF_WEB_SEARCH: False,
427+
CONF_WEB_SEARCH_CONTEXT_SIZE: "low",
428+
CONF_WEB_SEARCH_USER_LOCATION: False,
423429
},
424430
(
425431
{
426432
CONF_RECOMMENDED: False,
427-
CONF_PROMPT: "Speak like a pro",
433+
CONF_PROMPT: "Speak like a pirate",
428434
},
429435
{
430436
CONF_TEMPERATURE: 0.8,
431-
CONF_CHAT_MODEL: "o1-pro",
437+
CONF_CHAT_MODEL: "gpt-5",
432438
CONF_TOP_P: 0.9,
433439
CONF_MAX_TOKENS: 1000,
434440
},
435-
{CONF_REASONING_EFFORT: "high", CONF_CODE_INTERPRETER: False},
441+
{
442+
CONF_REASONING_EFFORT: "minimal",
443+
CONF_CODE_INTERPRETER: False,
444+
CONF_VERBOSITY: "high",
445+
CONF_WEB_SEARCH: False,
446+
CONF_WEB_SEARCH_CONTEXT_SIZE: "low",
447+
CONF_WEB_SEARCH_USER_LOCATION: False,
448+
},
436449
),
437450
{
438451
CONF_RECOMMENDED: False,
439-
CONF_PROMPT: "Speak like a pro",
452+
CONF_PROMPT: "Speak like a pirate",
440453
CONF_TEMPERATURE: 0.8,
441-
CONF_CHAT_MODEL: "o1-pro",
454+
CONF_CHAT_MODEL: "gpt-5",
442455
CONF_TOP_P: 0.9,
443456
CONF_MAX_TOKENS: 1000,
444-
CONF_REASONING_EFFORT: "high",
457+
CONF_REASONING_EFFORT: "minimal",
445458
CONF_CODE_INTERPRETER: False,
459+
CONF_VERBOSITY: "high",
460+
CONF_WEB_SEARCH: False,
461+
CONF_WEB_SEARCH_CONTEXT_SIZE: "low",
462+
CONF_WEB_SEARCH_USER_LOCATION: False,
446463
},
447464
),
448465
# Test that old options are removed after reconfiguration
@@ -482,11 +499,13 @@ async def test_form_invalid_auth(hass: HomeAssistant, side_effect, error) -> Non
482499
CONF_PROMPT: "Speak like a pirate",
483500
CONF_LLM_HASS_API: ["assist"],
484501
CONF_TEMPERATURE: 0.8,
485-
CONF_CHAT_MODEL: "gpt-4o",
502+
CONF_CHAT_MODEL: "gpt-5",
486503
CONF_TOP_P: 0.9,
487504
CONF_MAX_TOKENS: 1000,
488505
CONF_REASONING_EFFORT: "high",
489506
CONF_CODE_INTERPRETER: True,
507+
CONF_VERBOSITY: "low",
508+
CONF_WEB_SEARCH: False,
490509
},
491510
(
492511
{
@@ -550,11 +569,12 @@ async def test_form_invalid_auth(hass: HomeAssistant, side_effect, error) -> Non
550569
CONF_PROMPT: "Speak like a pirate",
551570
CONF_LLM_HASS_API: ["assist"],
552571
CONF_TEMPERATURE: 0.8,
553-
CONF_CHAT_MODEL: "o3-mini",
572+
CONF_CHAT_MODEL: "o5",
554573
CONF_TOP_P: 0.9,
555574
CONF_MAX_TOKENS: 1000,
556575
CONF_REASONING_EFFORT: "low",
557576
CONF_CODE_INTERPRETER: True,
577+
CONF_VERBOSITY: "medium",
558578
},
559579
(
560580
{

0 commit comments

Comments
 (0)