Commit Graph

14 Commits

Author SHA1 Message Date
Muhammad Junaid 0b9a622b56
Fix: Auto-Convert Pydantic and Dataclass Arguments in AutoGen Tool Calls (#5737)
AutoGen was passing raw dictionaries to functions instead of
constructing Pydantic model or dataclass instances. If a tool function’s
parameter was a Pydantic BaseModel or a dataclass, the function would
receive a dict and likely throw an error or behave incorrectly (since it
expected an object of that type).

This PR addresses problem in AutoGen where tool functions expecting
structured inputs (Pydantic models or dataclasses) were receiving raw
dictionaries. It ensures that structured inputs are automatically
validated and instantiated before function calls. Complete details are
in Issue #5736

[Reproducible Example Code - Failing
Case](https://colab.research.google.com/drive/1hgoP-cGdSZ1-OqQLpwYmlmcExgftDqlO?usp=sharing)
 
<!-- Please give a short summary of the change and the problem this
solves. -->
## Changes Made:
- Inspect function signatures for Pydantic BaseModel and dataclass
annotations.
- Convert input dictionaries into properly instantiated objects using
BaseModel.model_validate() for Pydantic models or standard instantiation
for dataclasses.
  - Raise descriptive errors when validation or instantiation fails.
  - Unit tests have been added to cover all scenarios

Now structured inputs are automatically validated and instantiated
before function calls.

- **Updated Conversion Logic:**  
In the `run()` method, we now inspect the function’s signature and
convert input dictionaries to structured objects. For parameters
annotated with a Pydantic model, we use `model_validate()` to create an
instance; for those annotated with a dataclass, we instantiate the
object using the dataclass constructor. For example:

  ```python
  # Get the function signature.
  sig = inspect.signature(self._func)
  raw_kwargs = args.model_dump()
  kwargs = {}

  # Iterate over the parameters expected by the function.
  for name, param in sig.parameters.items():
      if name in raw_kwargs:
          expected_type = param.annotation
          value = raw_kwargs[name]
# If expected type is a subclass of BaseModel, perform conversion.
if inspect.isclass(expected_type) and issubclass(expected_type,
BaseModel):
              try:
                  kwargs[name] = expected_type.model_validate(value)
              except ValidationError as e:
                  raise ValueError(
f"Error validating parameter '{name}' for function
'{self._func.__name__}': {e}"
                  ) from e
          # If it's a dataclass, instantiate it.
          elif is_dataclass(expected_type):
              try:
cls = expected_type if isinstance(expected_type, type) else
type(expected_type)
                  kwargs[name] = cls(**value)
              except Exception as e:
                  raise ValueError(
f"Error instantiating dataclass parameter '{name}' for function
'{self._func.__name__}': {e}"
                  ) from e
          else:
              kwargs[name] = value
  ```

- **Error Handling Improvements:**  
Conversion steps are wrapped in try/except blocks to raise descriptive
errors when instantiation fails, aiding in debugging invalid inputs.

- **Testing:**  
Unit tests have been added to simulate tool calls (e.g., an `add` tool)
to ensure that with input like:
  ```json
  {"input": {"x": 2, "y": 3}}
  ```
The tool function receives an instance of the expected type and returns
the correct result.


## Related issue number
Closes #5736
 
## Checks
- [x] I've included any doc changes needed for
<https://microsoft.github.io/autogen/>. See
<https://github.com/microsoft/autogen/blob/main/CONTRIBUTING.md> to
build and test documentation locally.
- [x] I've added tests (if relevant) corresponding to the changes
introduced in this PR.
- [x] I've made sure all auto checks have passed.
2025-03-03 16:35:27 -08:00
Eric Zhu ec314c586c
feat: Add strict mode support to BaseTool, ToolSchema and FunctionTool (#5507)
Resolves #4447

For `openai` client's structured output support is through its beta
client, which requires the function JSON schema to be strict when in
structured output mode.

Reference:
https://platform.openai.com/docs/guides/function-calling#strict-mode
2025-02-13 19:44:55 +00:00
Nour Bouzid 02e968a531
FunctionTool partial support (#5183)
<!-- Thank you for your contribution! Please review
https://microsoft.github.io/autogen/docs/Contribute before opening a
pull request. -->

<!-- Please add a reviewer to the assignee section when you create a PR.
If you don't have the access to it, we will shortly find a reviewer and
assign them to your PR. -->

## Why are these changes needed?

FunctionTool supports passing in a partial

## Related issue number

Closes #5151 

## Checks

- [x] I've included any doc changes needed for
https://microsoft.github.io/autogen/. See
https://microsoft.github.io/autogen/docs/Contribute#documentation to
build and test documentation locally.
- [x] I've added tests (if relevant) corresponding to the changes
introduced in this PR.
- [x] I've made sure all auto checks have passed.
2025-01-29 18:02:18 +00:00
Jack Gerrits 0040016bec
Remove usage of internal pydantic functionality for forward ref eval (#4816)
* Remove usage of internal pydantic func

* Update python/packages/autogen-core/tests/test_tools.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update python/packages/autogen-core/tests/test_tools.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove unused import NoneType from test_tools.py

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2024-12-26 12:15:54 -08:00
Jack Gerrits 218e84fd8e
Migrate remaining components (#4626) 2024-12-09 18:39:07 -08:00
Jack Gerrits 3022369eeb
Flatten core base and components (#4513)
* Flatten core base and components

* remove extra files

* dont export from deprecated locations

* format

* fmt
2024-12-03 17:00:44 -08:00
Jack Gerrits 8347881776
Fix intervention handler none check (#4351)
* Fix none check

* fix func

* fmt, lint

---------

Co-authored-by: Eric Zhu <ekzhu@users.noreply.github.com>
2024-11-25 15:50:52 -05:00
Jack Gerrits 9b967fc79a
Update pyright and mypy (#4348)
* Update pyright and mypy

* fmt
2024-11-25 15:08:36 -05:00
Leonardo Pinheiro ac53961bc8
Delete autogen-ext refactor deprecations (#4305)
* delete files and update dependencies

* add explicit config exports

* ignore mypy error on nb

---------

Co-authored-by: Leonardo Pinheiro <lpinheiro@microsoft.com>
Co-authored-by: Jack Gerrits <jackgerrits@users.noreply.github.com>
2024-11-22 11:29:39 -05:00
Eric Zhu 4aec53c36f
Improve agentchat tutorial (#4233) 2024-11-16 09:01:38 -08:00
Jean-Marc Le Roux cac411b56a
Fix broken $ref instances in tool JSON schemas (#4201)
When the tool expects complex inputs that require nested models, pydantic will generate a JSON Schema that will include references to other schemas using the `$ref` keyword (cf https://json-schema.org/understanding-json-schema/structuring#dollarref).

But the `$ref` keyword is not supported by OpenAI.

This fix:

1. Resolves the references and inlines the corresponding schemas.
2. Removes the then useless root `$defs` field of the JSON schema to save tokens.

Co-authored-by: Jean-Marc Le Roux <contact@jmlx.io>
Co-authored-by: Jack Gerrits <jackgerrits@users.noreply.github.com>
2024-11-15 13:40:46 -05:00
Gerardo Moreno eca8a95c61
Remove isinstance check from FunctionTool (#3987) (#4056)
* Remove isinstance check from FunctionTool (#3987)

* Move __init__ Args to class docstring

---------

Co-authored-by: Eric Zhu <ekzhu@users.noreply.github.com>
2024-11-04 16:48:57 -08:00
Jack Gerrits 306541e247 Fixup ruff config and inclusions (#495)
* add tests to ruff for core

* fmt

* lint

* lint fixes

* fixup more dirs

* dont include non python

* lint fixes

* lint fixes

* fix dir name

* dont relative include
2024-09-13 10:41:15 -04:00
Jack Gerrits 5e8840d13c Python: organize packages in package directory (#420)
* Move packages to packages directory

* remove screenshot

* update some paths
2024-08-28 13:35:21 -04:00