Skip to content

Commit c0c3332

Browse files
update
1 parent 8515e13 commit c0c3332

File tree

4 files changed

+48
-176
lines changed

4 files changed

+48
-176
lines changed

camel/models/azure_openai_model.py

Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
# See the License for the specific language governing permissions and
1212
# limitations under the License.
1313
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
14-
import copy
1514
import os
1615
import warnings
1716
from typing import Any, Callable, Dict, List, Optional, Type, Union
@@ -345,14 +344,7 @@ def _request_chat_completion(
345344
messages: List[OpenAIMessage],
346345
tools: Optional[List[Dict[str, Any]]] = None,
347346
) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
348-
request_config = self.model_config_dict.copy()
349-
350-
if tools:
351-
request_config["tools"] = tools
352-
else:
353-
# Remove parallel_tool_calls if no tools are specified
354-
# as OpenAI API only allows it when tools are present
355-
request_config.pop("parallel_tool_calls", None)
347+
request_config = self._prepare_request_config(tools)
356348

357349
return self._client.chat.completions.create(
358350
messages=messages,
@@ -365,14 +357,7 @@ async def _arequest_chat_completion(
365357
messages: List[OpenAIMessage],
366358
tools: Optional[List[Dict[str, Any]]] = None,
367359
) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
368-
request_config = self.model_config_dict.copy()
369-
370-
if tools:
371-
request_config["tools"] = tools
372-
else:
373-
# Remove parallel_tool_calls if no tools are specified
374-
# as OpenAI API only allows it when tools are present
375-
request_config.pop("parallel_tool_calls", None)
360+
request_config = self._prepare_request_config(tools)
376361

377362
return await self._async_client.chat.completions.create(
378363
messages=messages,
@@ -386,18 +371,11 @@ def _request_parse(
386371
response_format: Type[BaseModel],
387372
tools: Optional[List[Dict[str, Any]]] = None,
388373
) -> ChatCompletion:
389-
request_config = copy.deepcopy(self.model_config_dict)
390-
374+
request_config = self._prepare_request_config(tools)
391375
request_config["response_format"] = response_format
392376
# Remove stream from request config since OpenAI does not support it
393377
# with structured response
394378
request_config.pop("stream", None)
395-
if tools:
396-
request_config["tools"] = tools
397-
else:
398-
# Remove parallel_tool_calls if no tools are specified
399-
# as OpenAI API only allows it when tools are present
400-
request_config.pop("parallel_tool_calls", None)
401379

402380
return self._client.beta.chat.completions.parse(
403381
messages=messages,
@@ -411,18 +389,11 @@ async def _arequest_parse(
411389
response_format: Type[BaseModel],
412390
tools: Optional[List[Dict[str, Any]]] = None,
413391
) -> ChatCompletion:
414-
request_config = copy.deepcopy(self.model_config_dict)
415-
392+
request_config = self._prepare_request_config(tools)
416393
request_config["response_format"] = response_format
417394
# Remove stream from request config since OpenAI does not support it
418395
# with structured response
419396
request_config.pop("stream", None)
420-
if tools:
421-
request_config["tools"] = tools
422-
else:
423-
# Remove parallel_tool_calls if no tools are specified
424-
# as OpenAI API only allows it when tools are present
425-
request_config.pop("parallel_tool_calls", None)
426397

427398
return await self._async_client.beta.chat.completions.parse(
428399
messages=messages,
@@ -440,19 +411,10 @@ def _request_stream_parse(
440411
441412
Note: This uses OpenAI's beta streaming API for structured outputs.
442413
"""
443-
444-
request_config = copy.deepcopy(self.model_config_dict)
445-
414+
request_config = self._prepare_request_config(tools)
446415
# Remove stream from config as it's handled by the stream method
447416
request_config.pop("stream", None)
448417

449-
if tools:
450-
request_config["tools"] = tools
451-
else:
452-
# Remove parallel_tool_calls if no tools are specified
453-
# as OpenAI API only allows it when tools are present
454-
request_config.pop("parallel_tool_calls", None)
455-
456418
# Use the beta streaming API for structured outputs
457419
return self._client.beta.chat.completions.stream(
458420
messages=messages,
@@ -471,19 +433,10 @@ async def _arequest_stream_parse(
471433
472434
Note: This uses OpenAI's beta streaming API for structured outputs.
473435
"""
474-
475-
request_config = copy.deepcopy(self.model_config_dict)
476-
436+
request_config = self._prepare_request_config(tools)
477437
# Remove stream from config as it's handled by the stream method
478438
request_config.pop("stream", None)
479439

480-
if tools:
481-
request_config["tools"] = tools
482-
else:
483-
# Remove parallel_tool_calls if no tools are specified
484-
# as OpenAI API only allows it when tools are present
485-
request_config.pop("parallel_tool_calls", None)
486-
487440
# Use the beta streaming API for structured outputs
488441
return self._async_client.beta.chat.completions.stream(
489442
messages=messages,

camel/models/base_model.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,36 @@ def token_counter(self) -> BaseTokenCounter:
274274
"""
275275
pass
276276

277+
def _prepare_request_config(
278+
self,
279+
tools: Optional[List[Dict[str, Any]]] = None,
280+
) -> Dict[str, Any]:
281+
r"""Prepare the request configuration dictionary.
282+
283+
Creates a deep copy of the model config and handles tool-related
284+
parameters. If no tools are specified, removes parallel_tool_calls
285+
as OpenAI API only allows it when tools are present.
286+
287+
Args:
288+
tools (Optional[List[Dict[str, Any]]]): The tools to include
289+
in the request. (default: :obj:`None`)
290+
291+
Returns:
292+
Dict[str, Any]: The prepared request configuration.
293+
"""
294+
import copy
295+
296+
request_config = copy.deepcopy(self.model_config_dict)
297+
298+
if tools:
299+
request_config["tools"] = tools
300+
else:
301+
# Remove parallel_tool_calls if no tools are specified
302+
# as OpenAI API only allows it when tools are present
303+
request_config.pop("parallel_tool_calls", None)
304+
305+
return request_config
306+
277307
def preprocess_messages(
278308
self, messages: List[OpenAIMessage]
279309
) -> List[OpenAIMessage]:

camel/models/openai_compatible_model.py

Lines changed: 6 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -279,14 +279,7 @@ def _request_chat_completion(
279279
messages: List[OpenAIMessage],
280280
tools: Optional[List[Dict[str, Any]]] = None,
281281
) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
282-
request_config = self.model_config_dict.copy()
283-
284-
if tools:
285-
request_config["tools"] = tools
286-
else:
287-
# Remove parallel_tool_calls if no tools are specified
288-
# as OpenAI API only allows it when tools are present
289-
request_config.pop("parallel_tool_calls", None)
282+
request_config = self._prepare_request_config(tools)
290283

291284
return self._client.chat.completions.create(
292285
messages=messages,
@@ -299,14 +292,7 @@ async def _arequest_chat_completion(
299292
messages: List[OpenAIMessage],
300293
tools: Optional[List[Dict[str, Any]]] = None,
301294
) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
302-
request_config = self.model_config_dict.copy()
303-
304-
if tools:
305-
request_config["tools"] = tools
306-
else:
307-
# Remove parallel_tool_calls if no tools are specified
308-
# as OpenAI API only allows it when tools are present
309-
request_config.pop("parallel_tool_calls", None)
295+
request_config = self._prepare_request_config(tools)
310296

311297
return await self._async_client.chat.completions.create(
312298
messages=messages,
@@ -320,19 +306,11 @@ def _request_parse(
320306
response_format: Type[BaseModel],
321307
tools: Optional[List[Dict[str, Any]]] = None,
322308
) -> ChatCompletion:
323-
import copy
324-
325-
request_config = copy.deepcopy(self.model_config_dict)
309+
request_config = self._prepare_request_config(tools)
326310
# Remove stream from request_config since OpenAI does not support it
327311
# when structured response is used
328312
request_config["response_format"] = response_format
329313
request_config.pop("stream", None)
330-
if tools:
331-
request_config["tools"] = tools
332-
else:
333-
# Remove parallel_tool_calls if no tools are specified
334-
# as OpenAI API only allows it when tools are present
335-
request_config.pop("parallel_tool_calls", None)
336314

337315
try:
338316
return self._client.beta.chat.completions.parse(
@@ -363,19 +341,11 @@ async def _arequest_parse(
363341
response_format: Type[BaseModel],
364342
tools: Optional[List[Dict[str, Any]]] = None,
365343
) -> ChatCompletion:
366-
import copy
367-
368-
request_config = copy.deepcopy(self.model_config_dict)
344+
request_config = self._prepare_request_config(tools)
369345
# Remove stream from request_config since OpenAI does not support it
370346
# when structured response is used
371347
request_config["response_format"] = response_format
372348
request_config.pop("stream", None)
373-
if tools:
374-
request_config["tools"] = tools
375-
else:
376-
# Remove parallel_tool_calls if no tools are specified
377-
# as OpenAI API only allows it when tools are present
378-
request_config.pop("parallel_tool_calls", None)
379349

380350
try:
381351
return await self._async_client.beta.chat.completions.parse(
@@ -410,20 +380,10 @@ def _request_stream_parse(
410380
411381
Note: This uses OpenAI's beta streaming API for structured outputs.
412382
"""
413-
import copy
414-
415-
request_config = copy.deepcopy(self.model_config_dict)
416-
383+
request_config = self._prepare_request_config(tools)
417384
# Remove stream from config as it's handled by the stream method
418385
request_config.pop("stream", None)
419386

420-
if tools:
421-
request_config["tools"] = tools
422-
else:
423-
# Remove parallel_tool_calls if no tools are specified
424-
# as OpenAI API only allows it when tools are present
425-
request_config.pop("parallel_tool_calls", None)
426-
427387
# Use the beta streaming API for structured outputs
428388
return self._client.beta.chat.completions.stream(
429389
messages=messages,
@@ -442,20 +402,10 @@ async def _arequest_stream_parse(
442402
443403
Note: This uses OpenAI's beta streaming API for structured outputs.
444404
"""
445-
import copy
446-
447-
request_config = copy.deepcopy(self.model_config_dict)
448-
405+
request_config = self._prepare_request_config(tools)
449406
# Remove stream from config as it's handled by the stream method
450407
request_config.pop("stream", None)
451408

452-
if tools:
453-
request_config["tools"] = tools
454-
else:
455-
# Remove parallel_tool_calls if no tools are specified
456-
# as OpenAI API only allows it when tools are present
457-
request_config.pop("parallel_tool_calls", None)
458-
459409
# Use the beta streaming API for structured outputs
460410
return self._async_client.beta.chat.completions.stream(
461411
messages=messages,

0 commit comments

Comments
 (0)