fix(sec): handle unexpected SEC API responses in cik_map (#7441)

* fix(sec): handle unexpected SEC API responses in cik_map and get_all_companies

Fixes #7097

The cik_map command throws 'ValueError: If using all scalar values,
you must pass an index' when the SEC API returns an unexpected response
format (e.g., flat dict instead of nested dict of dicts).

Changes:
- get_all_companies: validate response before DataFrame creation,
  use from_dict(orient='index') instead of DataFrame().transpose(),
  check column count matches expected fields
- cik_map fetcher: raise proper OpenBBError when symbol not found
  instead of returning empty dict that passes truthiness checks

* run black

---------

Co-authored-by: JasonOA888 <JasonOA888@users.noreply.github.com>
Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com>
This commit is contained in:
Jason
2026-04-01 13:11:25 +08:00
committed by GitHub
parent 5d0898b189
commit 4a594d0258
2 changed files with 15 additions and 5 deletions

View File

@@ -5,6 +5,7 @@
from typing import Any
from openbb_core.provider.abstract.fetcher import Fetcher
from openbb_core.app.model.abstract.error import OpenBBError
from openbb_core.provider.standard_models.cik_map import CikMapData, CikMapQueryParams
from pydantic import Field
@@ -48,10 +49,10 @@ class SecCikMapFetcher(
# pylint: disable=import-outside-toplevel
from openbb_sec.utils.helpers import symbol_map
results = {"cik": await symbol_map(query.symbol, query.use_cache)}
if not results:
return {"Error": "Symbol not found."}
return results
cik = await symbol_map(query.symbol, query.use_cache)
if not cik:
raise OpenBBError(f"Symbol '{query.symbol}' not found in SEC database.")
return {"cik": cik}
@staticmethod
def transform_data(

View File

@@ -49,8 +49,17 @@ async def get_all_companies(use_cache: bool = True) -> DataFrame:
else:
response = await amake_request(url, headers=SEC_HEADERS) # type: ignore
df = DataFrame(response).transpose()
if not response or not isinstance(response, dict):
raise OpenBBError(
"Empty or invalid response from SEC company tickers endpoint."
)
df = DataFrame.from_dict(response, orient="index")
cols = ["cik", "symbol", "name"]
if len(df.columns) != len(cols):
raise OpenBBError(
f"Unexpected SEC response format. Expected {len(cols)} fields, got {len(df.columns)}: {df.columns.tolist()}"
)
df.columns = cols
return df.astype(str)