Skip to content

Conversation

@deeleeramone
Copy link
Contributor

This Tags on to #6250, #6248, #6240.

When parameter.kind == Parameter.VAR_KEYWORD, it correctly cannot be assigned a default state because **kwargs cannot have one.

However, Fast API does not see it the same way and will make it a required field. In both, the body, and URL parameters.

To get around this, we can set:

parameter.kind == Parameter.POSITIONAL_OR_KEYWORD, then assign it as Optional[Dict[str, Any]], and give it a default state of None.

The end result is that **kwargs can be a valid parameter for the API that gets assigned to the body of the request.

Note that **kwargs could be anything - **extra_params.

@deeleeramone deeleeramone added bug Bugs and bug fixes platform OpenBB Platform v4 PRs for v4 labels Mar 23, 2024
@deeleeramone deeleeramone changed the base branch from develop to bugfix/endpoint_kwargs March 23, 2024 02:09
@deeleeramone deeleeramone changed the base branch from bugfix/endpoint_kwargs to develop March 25, 2024 20:29
Copy link
Contributor

@hjoaquim hjoaquim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need to change FastAPI behavior? I believe it will cause some unexpected results in the future.

There are some references on this matter, namely: fastapi/fastapi#251 and https://stackoverflow.com/questions/59929028/python-fastapi-error-422-with-post-request-when-sending-json-data/70636163#70636163.

Why not go for the simplest approach and have something like this:
(example signature):
def correlation_matrix(data: List[Data], payload: Dict[Any, Any] = None) -> OBBject[List[Data]]:

Which could then be used as follows on a POST request:

{
  "data": [
    {
      "additionalProp1": {}
    }
  ],
  "payload": {"chart_arg_1":"value1","chart_arg_2":"value2"}
}

Which results in having the following values inside the function during execution:

image

Note taht this approach would avoid touching the commands.py file.

@deeleeramone
Copy link
Contributor Author

deeleeramone commented Apr 5, 2024

Why do we need to change FastAPI behavior? I believe it will cause some unexpected results in the future.

We aren't. We simply applying the correct Type and default state to **kwargs, which FastAPI does not recognize, but without having to manipulate the function signature in PackageBuilder, like what currently happens via changing "extra_params" to **kwargs. This does not require manipulating the function signature.

The reason to use **kwargs is to eliminate "unexpected keyword argument", and the added benefit is ANYONE can use **kwargs as a way to extend functionality without having to touch the router. This makes it work like the GET/provider functions where you can already do that.

If you just declare a Field, you then have to touch the router. This accomplishes exactly the same thing as your outcome and allows **extra_params to exist in POST functions where they could not be used before.

Why not go for the simplest approach and have something like this: (example signature): def correlation_matrix(data: List[Data], payload: Dict[Any, Any] = None) -> OBBject[List[Data]]:

Which could then be used as follows on a POST request:

{
  "data": [
    {
      "additionalProp1": {}
    }
  ],
  "payload": {"chart_arg_1":"value1","chart_arg_2":"value2"}
}

Which results in having the following values inside the function during execution:

Note taht this approach would avoid touching the commands.py file.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Bugs and bug fixes platform OpenBB Platform v4 PRs for v4

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants