[[BugFix] Fix Depends Type Change in Lastest FastAPI Version (#7258)

* fix for Depends type change in lastest FastAPI version

* lint

* fix differences in docstrings between methods

* use {'arbitrary_types_allowed': True} instead of dict

* fix missing new line before examples section in model endpoints
This commit is contained in:
Danglewood
2025-11-01 11:48:44 -07:00
committed by GitHub
parent 7fd88e2caa
commit 92fa4c85f6
8 changed files with 156 additions and 90 deletions

View File

@@ -1,9 +1,9 @@
{
"openbb": "1.5.3core",
"openbb": "1.5.5core",
"info": {
"title": "OpenBB Platform (Python)",
"description": "Investment research for everyone, anywhere.",
"core": "1.5.3",
"core": "1.5.5",
"extensions": {
"openbb_core_extension": [],
"openbb_provider_extension": [],

View File

@@ -1 +1,3 @@
"""Autogenerated OpenBB module."""
### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###

View File

@@ -253,7 +253,8 @@ class PackageBuilder:
def _save_package(self):
"""Save the package."""
self.console.log("\nWriting package __init__...")
code = "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###"
code = '""" Autogenerated OpenBB module."""\n'
code += "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###"
self._write(code=code, name="__init__")
def _save_reference_file(self, ext_map: dict[str, list[str]] | None = None):
@@ -358,7 +359,8 @@ class ModuleBuilder:
@staticmethod
def build(path: str, ext_map: dict[str, list[str]] | None = None) -> str:
"""Build the module."""
code = "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###\n\n# pylint: disable=R0917\n\n"
code = f'"""Autogenerated OpenBB {path} Module."""\n\n'
code += "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###\n\n# pylint: disable=R0917,C0103\n\n"
code += ImportDefinition.build(path)
code += ClassDefinition.build(path, ext_map)
@@ -376,7 +378,37 @@ class ImportDefinition:
for hint_type in hint_type_list:
# Skip primitive types and empty types
if hint_type == _empty or hint_type in primitive_types:
# Check for _empty first (doesn't require hashing)
if hint_type == _empty:
continue
# Skip Depends objects (they're not types we need to import)
if (
hasattr(hint_type, "__class__")
and "Depends" in hint_type.__class__.__name__
):
continue
# Skip Annotated types that contain Depends in their metadata
if isinstance(hint_type, _AnnotatedAlias):
has_depends = False
if hasattr(hint_type, "__metadata__"):
for meta in hint_type.__metadata__:
if (
hasattr(meta, "__class__")
and "Depends" in meta.__class__.__name__
):
has_depends = True
break
if has_depends:
continue
# Now safe to check against primitive_types set
try:
if hint_type in primitive_types:
continue
except TypeError:
# If somehow we still get an unhashable type, skip it
continue
# Only include types that have a module and are not builtins
@@ -385,8 +417,25 @@ class ImportDefinition:
) or (isinstance(hint_type, str)):
new_hint_type_list.append(hint_type)
new_hint_type_list = list(set(new_hint_type_list))
return new_hint_type_list
# Deduplicate without using set() to handle unhashable types
deduplicated: list = []
for hint_type in new_hint_type_list:
is_duplicate = False
for existing in deduplicated:
try:
if hint_type == existing:
is_duplicate = True
break
except TypeError:
# If comparison fails, compare by identity
if id(hint_type) == id(existing):
is_duplicate = True
break
if not is_duplicate:
deduplicated.append(hint_type)
return deduplicated
@classmethod
def get_function_hint_type_list(cls, route) -> list[type]:
@@ -1155,8 +1204,8 @@ class MethodDefinition:
parts = textwrap.wrap(desc, width=max_width)
# For function signature context, don't add extra indentation
# The parameter will be properly indented by the calling context
joined = "\n".join(f"{repr(p)}" for p in parts)
desc_repr = f"(\n{joined}\n)"
joined = "\n ".join(f"{repr(p)}" for p in parts)
desc_repr = f"(\n {joined}" + "\n )"
default_part = ""
if param.default is not Parameter.empty:
@@ -1165,10 +1214,17 @@ class MethodDefinition:
default_repr = "None"
default_part = f" = {default_repr}"
return f"{param.name}: Annotated[{type_repr}, OpenBBField(description={desc_repr})]{default_part}"
final_param = f"""{param.name.strip()}: Annotated[
{type_repr},
OpenBBField(
description={desc_repr}
)
]{default_part}"""
return final_param
params_list = [stringify_param(p) for p in formatted_params.values()]
func_params = ",\n".join(params_list)
func_params = ",\n ".join(params_list)
func_params = func_params.replace("NoneType", "None")
func_params = func_params.replace(
@@ -1216,7 +1272,7 @@ class MethodDefinition:
func_returns = MethodDefinition.build_func_returns(return_type)
args = (
"(config=dict(arbitrary_types_allowed=True))"
'(config={"arbitrary_types_allowed": True})'
if "DataFrame" in func_params
or "Series" in func_params
or "ndarray" in func_params
@@ -1592,7 +1648,9 @@ class DocstringGenerator:
_type = (
f"Optional[{_type}]"
if is_optional and "Optional" not in str(_type)
if is_optional
and "Optional" not in str(_type)
and " | " not in str(_type)
else _type
)
@@ -1620,11 +1678,11 @@ class DocstringGenerator:
f"{create_indent(indent + 2)}Serializable results.\n"
f"{create_indent(indent + 1)}provider : {available_providers}\n"
f"{create_indent(indent + 2)}Provider name.\n"
f"{create_indent(indent + 1)}warnings : Optional[List[Warning_]]\n"
f"{create_indent(indent + 1)}warnings : Optional[list[Warning_]]\n"
f"{create_indent(indent + 2)}List of warnings.\n"
f"{create_indent(indent + 1)}chart : Optional[Chart]\n"
f"{create_indent(indent + 2)}Chart object.\n"
f"{create_indent(indent + 1)}extra : Dict[str, Any]\n"
f"{create_indent(indent + 1)}extra : dict[str, Any]\n"
f"{create_indent(indent + 2)}Extra info.\n"
)
@@ -1648,7 +1706,7 @@ class DocstringGenerator:
prompt = "\n```python\n"
indent = create_indent(0)
doc = f"\n{indent}Examples\n"
doc = f"{indent}Examples\n"
doc += f"{indent}--------\n"
doc += f"{indent}{prompt}from openbb import obb\n"
@@ -1714,10 +1772,11 @@ class DocstringGenerator:
# Use the base types instead of the complex Union[Literal[...]]
if base_types:
if len(base_types) == 1:
type_str = next(iter(base_types))
else:
type_str = f"Union[{', '.join(sorted(base_types))}]"
type_str = (
next(iter(base_types))
if len(base_types) == 1
else f"{' | '.join(sorted(base_types))}"
)
# Apply the standard formatting
type_str = (
@@ -1728,6 +1787,7 @@ class DocstringGenerator:
.replace("NoneType", "None")
.replace("datetime.date", "date")
.replace("datetime.datetime", "datetime")
.replace("Union[date, None, str]", "date | str | None")
)
if char_limit:
@@ -1879,7 +1939,7 @@ class DocstringGenerator:
)
type_ = format_type(type_)
if "NoneType" in str(type_):
type_ = f"Optional[{type_}]".replace(", NoneType", "")
type_ = type_.replace(", NoneType", "")
default = getattr(param, "default", "")
description = getattr(default, "description", "")
@@ -1972,7 +2032,7 @@ class DocstringGenerator:
# Format choices with word wrapping for readability
formatted_choices = []
line_length = 0
line_limit = 100 # Max line length
line_limit = 80 # Max line length
for i, choice in enumerate(choices):
choice_str = f"'{choice}'"
@@ -2029,7 +2089,7 @@ class DocstringGenerator:
return docstring
@classmethod
def generate( # pylint: disable=too-many-positional-arguments
def generate( # pylint: disable=too-many-positional-arguments # noqa: PLR0912
cls,
path: str,
func: Callable,
@@ -2081,6 +2141,7 @@ class DocstringGenerator:
results_type=results_type,
sections=sections,
)
doc += "\n"
if "examples" in sections:
doc += cls.build_examples(
@@ -2088,6 +2149,7 @@ class DocstringGenerator:
param_types,
examples,
)
doc += "\n"
else:
doc_parts = []
if doc:
@@ -2103,7 +2165,7 @@ class DocstringGenerator:
summary = ""
# Format the summary with proper indentation detection and replacement
def fix_indentation(text: str, target_indent: int = 2) -> str:
def fix_indentation(text: str) -> str:
"""Fix indentation in docstring text by detecting current level and standardizing."""
lines = text.split("\n")
fixed_lines = []
@@ -2111,7 +2173,6 @@ class DocstringGenerator:
for line in lines:
stripped = line.lstrip()
if not stripped: # Empty line
fixed_lines.append("")
continue
# Count current indentation (spaces or tabs)
@@ -2133,17 +2194,13 @@ class DocstringGenerator:
elif current_indent > 0:
# Detect if it's using spaces or tabs
if "\t" in line[:current_indent]:
fixed_lines.append(
f"{create_indent(target_indent)}{stripped}"
)
fixed_lines.append(f"{stripped}")
else:
# Space-based indentation - normalize to target
fixed_lines.append(
f"{create_indent(target_indent)}{stripped}"
)
fixed_lines.append(f"{stripped}")
# No indentation - add target indentation for non-empty lines
elif stripped:
fixed_lines.append(f"{create_indent(target_indent)}{stripped}")
fixed_lines.append(f"{stripped}")
else:
fixed_lines.append("")
@@ -2162,9 +2219,7 @@ class DocstringGenerator:
and "Parameters" not in doc
and [p for p_name, p in formatted_params.items() if p_name != "kwargs"]
):
param_section = (
f"\n\n{create_indent(2)}Parameters\n{create_indent(2)}----------\n"
)
param_section = "\n\nParameters\n----------\n"
# Process each parameter
for param_name, param in formatted_params.items():
@@ -2190,17 +2245,16 @@ class DocstringGenerator:
)
# Add parameter to docstring
param_section += f"{create_indent(2)}{param_name} : {type_str}\n"
param_section += f"{create_indent(3)}{description}\n"
param_section += f"{create_indent(0)}{param_name} : {type_str}\n"
if description.strip() and description.strip() != '""':
param_section += f"{create_indent(1)}{description}\n"
result_doc += param_section
result_doc += param_section + "\n"
# Add returns section if needed and not already in docstring
if "returns" in sections and "Returns" not in doc:
# Returns
returns_section = (
f"\n\n{create_indent(2)}Returns\n{create_indent(2)}-------\n"
)
returns_section = "Returns\n-------\n"
# Extract return annotation directly from function signature
sig = inspect.signature(func)
@@ -2227,7 +2281,7 @@ class DocstringGenerator:
)
# Add return type to docstring
returns_section += f"{create_indent(2)}{type_name}\n"
returns_section += f"{type_name}\n"
# Check if this is a custom class (not a primitive type)
primitive_types = {
@@ -2255,25 +2309,32 @@ class DocstringGenerator:
field_type = cls.get_field_type(
field.annotation, field.is_required
)
# Get field description
description = (
getattr(field, "description", "") or ""
)
# Add field to docstring with proper indentation
returns_section += f"{create_indent(3)}{field_name} : {field_type}\n"
if type_name.startswith("OBBject"):
if field_name != "id":
returns_section += "\n"
returns_section += f"{create_indent(2)}{field_name.strip()} : {field_type}"
else:
returns_section += (
f"{field_name} : {field_type}\n"
)
if description:
returns_section += (
f"{create_indent(4)}{description}\n"
f"\n{create_indent(3)}{description}"
)
except (AttributeError, TypeError):
pass
else:
# Default case when no return annotation is available
returns_section += f"{create_indent(2)}Any\n"
returns_section += "Any\n"
result_doc += returns_section
result_doc += returns_section + "\n"
result_doc = result_doc.replace("\n ", f"\n{create_indent(2)}")
doc = result_doc + "\n"
@@ -2284,6 +2345,7 @@ class DocstringGenerator:
param_types,
examples,
)
doc += "\n"
if ( # pylint: disable=chained-comparison
max_length and len(doc) > max_length and max_length > 3

14
openbb_platform/core/poetry.lock generated vendored
View File

@@ -425,14 +425,14 @@ test = ["pytest (>=6)"]
[[package]]
name = "fastapi"
version = "0.120.2"
version = "0.120.4"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "fastapi-0.120.2-py3-none-any.whl", hash = "sha256:bedcf2c14240e43d56cb9a339b32bcf15104fe6b5897c0222603cb7ec416c8eb"},
{file = "fastapi-0.120.2.tar.gz", hash = "sha256:4c5ab43e2a90335bbd8326d1b659eac0f3dbcc015e2af573c4f5de406232c4ac"},
{file = "fastapi-0.120.4-py3-none-any.whl", hash = "sha256:9bdf192308676480d3593e10fd05094e56d6fdc7d9283db26053d8104d5f82a0"},
{file = "fastapi-0.120.4.tar.gz", hash = "sha256:2d856bc847893ca4d77896d4504ffdec0fb04312b705065fca9104428eca3868"},
]
[package.dependencies]
@@ -1502,14 +1502,14 @@ files = [
[[package]]
name = "starlette"
version = "0.49.1"
version = "0.49.3"
description = "The little ASGI library that shines."
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "starlette-0.49.1-py3-none-any.whl", hash = "sha256:d92ce9f07e4a3caa3ac13a79523bd18e3bc0042bb8ff2d759a8e7dd0e1859875"},
{file = "starlette-0.49.1.tar.gz", hash = "sha256:481a43b71e24ed8c43b11ea02f5353d77840e01480881b8cb5a26b8cae64a8cb"},
{file = "starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"},
{file = "starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284"},
]
[package.dependencies]
@@ -1867,4 +1867,4 @@ type = ["pytest-mypy"]
[metadata]
lock-version = "2.1"
python-versions = ">=3.10,<3.14"
content-hash = "ea739fddecd9f00a3c2c1ce44aa1d5e37bd864d4ffa7977529bf37b0d536c8a5"
content-hash = "bd53eb167e66f079a99820a036fac14be6293ac638dcf541331f01758c2bc1a6"

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "openbb-core"
version = "1.5.3"
version = "1.5.5"
description = "OpenBB package with core functionality."
authors = ["OpenBB Team <hello@openbb.co>"]
license = "AGPL-3.0-only"
@@ -16,7 +16,7 @@ uvicorn = "^0.35.0"
websockets = "^15.0"
pandas = ">=1.5.3"
html5lib = "^1.1"
fastapi = "^0.120.1"
fastapi = "^0.120.3"
uuid7 = "^0.1.0"
python-multipart = "^0.0.20"
pydantic = "^2.12.3"

View File

@@ -279,9 +279,7 @@ def test_build_func_params(method_definition):
),
}
expected_output = (
"param1: None,\nparam2: int,\nparam3: dict[str, Any] | pandas.DataFrame"
)
expected_output = "param1: None,\n param2: int,\n param3: dict[str, Any] | pandas.DataFrame"
output = method_definition.build_func_params(param_map)
assert output == expected_output

64
openbb_platform/poetry.lock generated vendored
View File

@@ -399,23 +399,23 @@ testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-ch
[[package]]
name = "beartype"
version = "0.22.4"
version = "0.22.5"
description = "Unbearably fast near-real-time pure-Python runtime-static type-checker."
optional = true
python-versions = ">=3.10"
groups = ["main"]
markers = "extra == \"mcp-server\" or extra == \"all\""
files = [
{file = "beartype-0.22.4-py3-none-any.whl", hash = "sha256:7967a1cee01fee42e47da69c58c92da10ba5bcfb8072686e48487be5201e3d10"},
{file = "beartype-0.22.4.tar.gz", hash = "sha256:68284c7803efd190b1b4639a0ab1a17677af9571b8a2ef5a169d10cb8955b01f"},
{file = "beartype-0.22.5-py3-none-any.whl", hash = "sha256:d9743dd7cd6d193696eaa1e025f8a70fb09761c154675679ff236e61952dfba0"},
{file = "beartype-0.22.5.tar.gz", hash = "sha256:516a9096cc77103c96153474fa35c3ebcd9d36bd2ec8d0e3a43307ced0fa6341"},
]
[package.extras]
dev = ["autoapi (>=0.9.0)", "celery", "click", "coverage (>=5.5)", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pydata-sphinx-theme (<=0.7.2)", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "redis", "rich-click", "setuptools", "sphinx", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "tox (>=3.20.1)", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""]
dev = ["autoapi (>=0.9.0)", "celery", "click", "coverage (>=5.5)", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pydata-sphinx-theme (<=0.7.2)", "pygments", "pyright (>=1.1.370)", "pytest (>=6.2.0)", "redis", "rich-click", "setuptools", "sphinx", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "tox (>=3.20.1)", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""]
doc-ghp = ["mkdocs-material[imaging] (>=9.6.0)", "mkdocstrings-python (>=1.16.0)", "mkdocstrings-python-xref (>=1.16.0)"]
doc-rtd = ["autoapi (>=0.9.0)", "pydata-sphinx-theme (<=0.7.2)", "setuptools", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)"]
test = ["celery", "click", "coverage (>=5.5)", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "redis", "rich-click", "sphinx", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "tox (>=3.20.1)", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""]
test-tox = ["celery", "click", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "redis", "rich-click", "sphinx", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""]
test = ["celery", "click", "coverage (>=5.5)", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pygments", "pyright (>=1.1.370)", "pytest (>=6.2.0)", "redis", "rich-click", "sphinx", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "tox (>=3.20.1)", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""]
test-tox = ["celery", "click", "equinox ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "fastmcp ; python_version > \"3.9.0\" and python_version < \"3.14.0\"", "jax[cpu] ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "jaxtyping ; sys_platform == \"linux\"", "langchain ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "nuitka (>=1.2.6) ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "numba ; python_version < \"3.14.0\"", "numpy ; python_version < \"3.14.0\" and sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera (>=0.26.0) ; python_version < \"3.14.0\"", "poetry", "polars ; python_version < \"3.14.0\"", "pygments", "pyright (>=1.1.370)", "pytest (>=6.2.0)", "redis", "rich-click", "sphinx", "sqlalchemy", "torch ; sys_platform == \"linux\" and python_version < \"3.14.0\"", "typer", "typing-extensions (>=3.10.0.0)", "xarray ; python_version < \"3.14.0\""]
test-tox-coverage = ["coverage (>=5.5)"]
[[package]]
@@ -1028,15 +1028,15 @@ test = ["charset_normalizer (>=3.3.2,<4.0)", "cryptography (>=42.0.5,<43.0)", "f
[[package]]
name = "cyclopts"
version = "4.1.0"
version = "4.2.1"
description = "Intuitive, easy CLIs based on type hints."
optional = true
python-versions = ">=3.10"
groups = ["main"]
markers = "extra == \"mcp-server\" or extra == \"all\""
files = [
{file = "cyclopts-4.1.0-py3-none-any.whl", hash = "sha256:6468e7e7467af4b6378bf17d0aaf204b713ddc5df383d9ffa7cae6e285da1329"},
{file = "cyclopts-4.1.0.tar.gz", hash = "sha256:18d3e4647729c88fda3a3192d7fab905e6770769465476658f173f02c28ef1ec"},
{file = "cyclopts-4.2.1-py3-none-any.whl", hash = "sha256:17a801faa814988b0307385ef8aaeb6b14b4d64473015a2d66bde9ea13f14d9c"},
{file = "cyclopts-4.2.1.tar.gz", hash = "sha256:49bb4c35644e7a9658f706ade4cf1a9958834b2dca4425e2fafecf8a0537fac7"},
]
[package.dependencies]
@@ -1334,14 +1334,14 @@ tzdata = ">=2025.2"
[[package]]
name = "fastapi"
version = "0.120.2"
version = "0.120.4"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "fastapi-0.120.2-py3-none-any.whl", hash = "sha256:bedcf2c14240e43d56cb9a339b32bcf15104fe6b5897c0222603cb7ec416c8eb"},
{file = "fastapi-0.120.2.tar.gz", hash = "sha256:4c5ab43e2a90335bbd8326d1b659eac0f3dbcc015e2af573c4f5de406232c4ac"},
{file = "fastapi-0.120.4-py3-none-any.whl", hash = "sha256:9bdf192308676480d3593e10fd05094e56d6fdc7d9283db26053d8104d5f82a0"},
{file = "fastapi-0.120.4.tar.gz", hash = "sha256:2d856bc847893ca4d77896d4504ffdec0fb04312b705065fca9104428eca3868"},
]
[package.dependencies]
@@ -2396,15 +2396,15 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"]
[[package]]
name = "mcp"
version = "1.19.0"
version = "1.20.0"
description = "Model Context Protocol SDK"
optional = true
python-versions = ">=3.10"
groups = ["main"]
markers = "extra == \"mcp-server\" or extra == \"all\""
files = [
{file = "mcp-1.19.0-py3-none-any.whl", hash = "sha256:f5907fe1c0167255f916718f376d05f09a830a215327a3ccdd5ec8a519f2e572"},
{file = "mcp-1.19.0.tar.gz", hash = "sha256:213de0d3cd63f71bc08ffe9cc8d4409cc87acffd383f6195d2ce0457c021b5c1"},
{file = "mcp-1.20.0-py3-none-any.whl", hash = "sha256:d0dc06f93653f7432ff89f694721c87f79876b6f93741bf628ad1e48f7ac5e5d"},
{file = "mcp-1.20.0.tar.gz", hash = "sha256:9ccc09eaadbfbcbbdab1c9723cfe2e0d1d9e324d7d3ce7e332ef90b09ed35177"},
]
[package.dependencies]
@@ -2414,6 +2414,7 @@ httpx-sse = ">=0.4"
jsonschema = ">=4.20.0"
pydantic = ">=2.11.0,<3.0.0"
pydantic-settings = ">=2.5.2"
pyjwt = {version = ">=2.10.1", extras = ["crypto"]}
python-multipart = ">=0.0.9"
pywin32 = {version = ">=310", markers = "sys_platform == \"win32\""}
sse-starlette = ">=1.6.1"
@@ -2636,15 +2637,15 @@ files = [
[[package]]
name = "narwhals"
version = "2.10.0"
version = "2.10.1"
description = "Extremely lightweight compatibility layer between dataframe libraries"
optional = true
python-versions = ">=3.9"
groups = ["main"]
markers = "extra == \"charting\" or extra == \"all\" or extra == \"econometrics\""
files = [
{file = "narwhals-2.10.0-py3-none-any.whl", hash = "sha256:baed44e8fc38e800e3a585e3fa9843a7079a6fad5fbffbecee4348d6ac52298c"},
{file = "narwhals-2.10.0.tar.gz", hash = "sha256:1c05bbef2048a4045263de7d98c3d06140583eb13d796dd733b2157f05d24485"},
{file = "narwhals-2.10.1-py3-none-any.whl", hash = "sha256:eed3d9ec8f821963456fef306c1ad11017995982169fca1f38f71c97d6a97b9b"},
{file = "narwhals-2.10.1.tar.gz", hash = "sha256:d6e3a9b1c0904a82984dec58a3d12b3bc08e9d61bbee639e7bb05349e663d036"},
]
[package.extras]
@@ -3057,19 +3058,19 @@ openbb-core = ">=1.5.1,<2.0.0"
[[package]]
name = "openbb-core"
version = "1.5.3"
version = "1.5.5"
description = "OpenBB package with core functionality."
optional = false
python-versions = "<3.14,>=3.10"
groups = ["main"]
files = [
{file = "openbb_core-1.5.3-py3-none-any.whl", hash = "sha256:217ba30ac8015aae497812e317ad2865d1a727e65183282da6d81167cb432260"},
{file = "openbb_core-1.5.3.tar.gz", hash = "sha256:4235baa3dd1f0769f0b0b7d90d72a152c90462c79a17d2d5816639d041c501ed"},
{file = "openbb_core-1.5.5-py3-none-any.whl", hash = "sha256:f722b11bf3ec6873ac3254095b6cda09f4243957034b68ad115462dc7190b93d"},
{file = "openbb_core-1.5.5.tar.gz", hash = "sha256:22448f322c543ec74d93c93e1fc066d31103eb35b2397dc528142b88008c282c"},
]
[package.dependencies]
aiohttp = ">=3.13.2,<4.0.0"
fastapi = ">=0.120.1,<0.121.0"
fastapi = ">=0.120.3,<0.121.0"
html5lib = ">=1.1,<2.0"
importlib-metadata = ">=6.8.0"
pandas = ">=1.5.3"
@@ -4521,6 +4522,9 @@ files = [
{file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"},
]
[package.dependencies]
cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""}
[package.extras]
crypto = ["cryptography (>=3.4.0)"]
dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"]
@@ -5407,15 +5411,15 @@ files = [
[[package]]
name = "sse-starlette"
version = "3.0.2"
version = "3.0.3"
description = "SSE plugin for Starlette"
optional = true
python-versions = ">=3.9"
groups = ["main"]
markers = "extra == \"mcp-server\" or extra == \"all\""
files = [
{file = "sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a"},
{file = "sse_starlette-3.0.2.tar.gz", hash = "sha256:ccd60b5765ebb3584d0de2d7a6e4f745672581de4f5005ab31c3a25d10b52b3a"},
{file = "sse_starlette-3.0.3-py3-none-any.whl", hash = "sha256:af5bf5a6f3933df1d9c7f8539633dc8444ca6a97ab2e2a7cd3b6e431ac03a431"},
{file = "sse_starlette-3.0.3.tar.gz", hash = "sha256:88cfb08747e16200ea990c8ca876b03910a23b547ab3bd764c0d8eb81019b971"},
]
[package.dependencies]
@@ -5423,20 +5427,20 @@ anyio = ">=4.7.0"
[package.extras]
daphne = ["daphne (>=4.2.0)"]
examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "starlette (>=0.41.3)", "uvicorn (>=0.34.0)"]
examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "starlette (>=0.49.1)", "uvicorn (>=0.34.0)"]
granian = ["granian (>=2.3.1)"]
uvicorn = ["uvicorn (>=0.34.0)"]
[[package]]
name = "starlette"
version = "0.49.1"
version = "0.49.3"
description = "The little ASGI library that shines."
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "starlette-0.49.1-py3-none-any.whl", hash = "sha256:d92ce9f07e4a3caa3ac13a79523bd18e3bc0042bb8ff2d759a8e7dd0e1859875"},
{file = "starlette-0.49.1.tar.gz", hash = "sha256:481a43b71e24ed8c43b11ea02f5353d77840e01480881b8cb5a26b8cae64a8cb"},
{file = "starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"},
{file = "starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284"},
]
[package.dependencies]
@@ -6215,4 +6219,4 @@ wsj = ["openbb-wsj"]
[metadata]
lock-version = "2.1"
python-versions = ">=3.10,<3.14"
content-hash = "f87bafc5ce723f3ed326bdacf1dea7471209dc421db0b8684ff27f80a3035e6b"
content-hash = "315e4926c0c713f38e9e3bc96a5a145765bb1ecf85bac950eae1df98c567943a"

View File

@@ -10,7 +10,7 @@ packages = [{ include = "openbb", from = "core" }]
[tool.poetry.dependencies]
python = ">=3.10,<3.14"
openbb-core = "^1.5.3"
openbb-core = "^1.5.5"
openbb-platform-api = "^1.2.1"
openbb-benzinga = "^1.5.0"