55"""
66
77import json
8- from typing import Union
8+ from typing import Optional , Union
99
1010import openai
1111from openai .types .chat import (
1919)
2020
2121from app import settings
22- from app .const import MISSING
22+ from app .const import MISSING , ToolChoice
2323from app .logging_config import get_logger , setup_logging
24+ from app .settings import TOOL_CHOICE
2425from app .stackademy import stackademy_app
26+ from app .utils import dump_json_colored
2527
2628
2729setup_logging ()
@@ -120,12 +122,13 @@ def process_tool_calls(message: ChatCompletionMessage) -> list[str]:
120122 messages .append (tool_message )
121123
122124 logger .debug (
123- "Updated messages: %s" , [msg .model_dump () if not isinstance (msg , dict ) else msg for msg in messages ]
125+ "Updated messages: %s" ,
126+ [dump_json_colored (msg .model_dump (), "blue" ) if not isinstance (msg , dict ) else msg for msg in messages ],
124127 )
125128 return functions_called
126129
127130
128- def completion (prompt : str ) -> tuple [ChatCompletion , list [str ]]:
131+ def completion (prompt : str ) -> tuple [Optional [ ChatCompletion ] , list [str ]]:
129132 """LLM text completion"""
130133
131134 def handle_completion (tools , tool_choice ) -> ChatCompletion :
@@ -134,6 +137,11 @@ def handle_completion(tools, tool_choice) -> ChatCompletion:
134137 model = settings .OPENAI_API_MODEL
135138
136139 try :
140+ logger .debug (
141+ "Sending messages to OpenAI: %s %s" ,
142+ dump_json_colored (messages , "blue" ),
143+ dump_json_colored (tools , "blue" ),
144+ )
137145 response = openai .chat .completions .create (
138146 model = model ,
139147 messages = messages ,
@@ -142,7 +150,7 @@ def handle_completion(tools, tool_choice) -> ChatCompletion:
142150 temperature = settings .OPENAI_API_TEMPERATURE ,
143151 max_tokens = settings .OPENAI_API_MAX_TOKENS ,
144152 )
145- logger .debug ("OpenAI response: %s" , response .model_dump ())
153+ logger .debug ("OpenAI response: %s" , dump_json_colored ( response .model_dump (), "green" ))
146154 return response
147155 except openai .RateLimitError as e :
148156 logger .error ("OpenAI rate limit exceeded: %s" , e )
@@ -164,15 +172,19 @@ def handle_completion(tools, tool_choice) -> ChatCompletion:
164172 logger .error ("Unexpected error during OpenAI completion: %s" , e )
165173 raise
166174
175+ if not prompt .strip ():
176+ logger .warning ("Received empty prompt." )
177+ return None , []
178+
167179 messages .append (ChatCompletionUserMessageParam (role = "user" , content = prompt ))
168180 functions_called = []
169181
170182 response = handle_completion (
171183 # tool_choice={"type": "function", "function": {"name": "get_courses"}},
172- tool_choice = "required" ,
184+ tool_choice = TOOL_CHOICE ,
173185 tools = [stackademy_app .tool_factory_get_courses ()],
174186 )
175- logger .debug ("Initial response: %s" , response .model_dump ())
187+ logger .debug ("Initial response: %s" , dump_json_colored ( response .model_dump (), "green" ))
176188
177189 message = response .choices [0 ].message
178190 while message .tool_calls :
@@ -182,9 +194,9 @@ def handle_completion(tools, tool_choice) -> ChatCompletion:
182194
183195 response = handle_completion (
184196 tools = [stackademy_app .tool_factory_get_courses (), stackademy_app .tool_factory_register ()],
185- tool_choice = "auto" ,
197+ tool_choice = ToolChoice . AUTO ,
186198 )
187199 message = response .choices [0 ].message
188- logger .debug ("Updated response: %s" , response .model_dump ())
200+ logger .debug ("Updated response: %s" , dump_json_colored ( response .model_dump (), "green" ))
189201
190202 return response , functions_called
0 commit comments