kensho-kfinance 3.2.3__tar.gz → 3.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of kensho-kfinance might be problematic. Click here for more details.

Files changed (148) hide show
  1. {kensho_kfinance-3.2.3/kensho_kfinance.egg-info → kensho_kfinance-3.2.5}/PKG-INFO +1 -1
  2. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5/kensho_kfinance.egg-info}/PKG-INFO +1 -1
  3. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/CHANGELOG.md +6 -0
  4. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/conftest.py +12 -1
  5. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/line_items/line_item_models.py +121 -0
  6. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/mergers_and_acquisitions/merger_and_acquisition_models.py +7 -1
  7. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/mergers_and_acquisitions/merger_and_acquisition_tools.py +43 -23
  8. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/mergers_and_acquisitions/tests/test_merger_and_acquisition_tools.py +28 -14
  9. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/all_tools.py +9 -0
  10. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/version.py +3 -3
  11. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/.coveragerc +0 -0
  12. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/.github/workflows/ci-lint.yml +0 -0
  13. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/.github/workflows/ci-test.yml +0 -0
  14. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/.github/workflows/python-publish.yml +0 -0
  15. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/.gitignore +0 -0
  16. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/.readthedocs.yaml +0 -0
  17. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/AUTHORS.md +0 -0
  18. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/CODE_OF_CONDUCT.md +0 -0
  19. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/CONTRIBUTING.md +0 -0
  20. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/LICENSE +0 -0
  21. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/README.md +0 -0
  22. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/docs/build_tool_calling_documentation.py +0 -0
  23. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/docs/conf.py +0 -0
  24. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/docs/index.rst +0 -0
  25. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/docs/kfinance.rst +0 -0
  26. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/docs/requirements.txt +0 -0
  27. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/docs/templates/apidoc/package.rst_t +0 -0
  28. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/docs/templates/apidoc/toc.rst_t +0 -0
  29. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/docs/tool_calling.rst +0 -0
  30. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/example_notebooks/basic_usage.ipynb +0 -0
  31. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/example_notebooks/tool_calling/langchain/anthropic_langchain_tool_calling.ipynb +0 -0
  32. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/example_notebooks/tool_calling/langchain/google_gemini_langchain_tool_calling.ipynb +0 -0
  33. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/example_notebooks/tool_calling/langchain/openai_langchain_tool_calling.ipynb +0 -0
  34. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/example_notebooks/tool_calling/non-langchain/anthropic_tool_calling.ipynb +0 -0
  35. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/example_notebooks/tool_calling/non-langchain/google_gemini_tool_calling.ipynb +0 -0
  36. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/example_notebooks/tool_calling/non-langchain/openai_langchain_tool_calling.ipynb +0 -0
  37. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/images/colab_logo_32px.png +0 -0
  38. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/justfile +0 -0
  39. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kensho_kfinance.egg-info/SOURCES.txt +0 -0
  40. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kensho_kfinance.egg-info/dependency_links.txt +0 -0
  41. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kensho_kfinance.egg-info/requires.txt +0 -0
  42. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kensho_kfinance.egg-info/top_level.txt +0 -0
  43. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/__init__.py +0 -0
  44. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/README.md +0 -0
  45. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/__init__.py +0 -0
  46. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/batch_request_handling.py +0 -0
  47. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/fetch.py +0 -0
  48. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/industry_models.py +0 -0
  49. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/kfinance.py +0 -0
  50. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/meta_classes.py +0 -0
  51. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/models/__init__.py +0 -0
  52. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/models/currency_models.py +0 -0
  53. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/models/date_and_period_models.py +0 -0
  54. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/models/decimal_with_unit.py +0 -0
  55. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/models/tests/__init__.py +0 -0
  56. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/models/tests/test_decimal_with_unit.py +0 -0
  57. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/permission_models.py +0 -0
  58. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/server_thread.py +0 -0
  59. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/tests/__init__.py +0 -0
  60. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/tests/test_batch_requests.py +0 -0
  61. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/tests/test_client.py +0 -0
  62. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/tests/test_fetch.py +0 -0
  63. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/tests/test_group_objects.py +0 -0
  64. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/client/tests/test_objects.py +0 -0
  65. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/README.md +0 -0
  66. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/__init__.py +0 -0
  67. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/business_relationships/__init__.py +0 -0
  68. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/business_relationships/business_relationship_models.py +0 -0
  69. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/business_relationships/business_relationship_tools.py +0 -0
  70. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/business_relationships/tests/__init__.py +0 -0
  71. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/business_relationships/tests/test_business_relationship_tools.py +0 -0
  72. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/capitalizations/__init__.py +0 -0
  73. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/capitalizations/capitalization_models.py +0 -0
  74. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/capitalizations/capitalization_tools.py +0 -0
  75. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/capitalizations/tests/__init__.py +0 -0
  76. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/capitalizations/tests/test_capitalization_models.py +0 -0
  77. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/capitalizations/tests/test_capitalization_tools.py +0 -0
  78. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/companies/__init__.py +0 -0
  79. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/companies/company_identifiers.py +0 -0
  80. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/companies/company_models.py +0 -0
  81. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/companies/company_tools.py +0 -0
  82. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/companies/tests/__init__.py +0 -0
  83. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/companies/tests/test_company_tools.py +0 -0
  84. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/competitors/__init__.py +0 -0
  85. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/competitors/competitor_models.py +0 -0
  86. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/competitors/competitor_tools.py +0 -0
  87. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/competitors/tests/__init__.py +0 -0
  88. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/competitors/tests/test_competitor_tools.py +0 -0
  89. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/cusip_and_isin/__init__.py +0 -0
  90. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/cusip_and_isin/cusip_and_isin_tools.py +0 -0
  91. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/cusip_and_isin/tests/__init__.py +0 -0
  92. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/cusip_and_isin/tests/test_cusip_and_isin_tools.py +0 -0
  93. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/earnings/__init__.py +0 -0
  94. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/earnings/earning_models.py +0 -0
  95. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/earnings/earning_tools.py +0 -0
  96. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/earnings/tests/__init__.py +0 -0
  97. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/earnings/tests/test_earnings_tools.py +0 -0
  98. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/line_items/__init__.py +0 -0
  99. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/line_items/line_item_tools.py +0 -0
  100. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/line_items/tests/__init__.py +0 -0
  101. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/line_items/tests/test_line_item_tools.py +0 -0
  102. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/mergers_and_acquisitions/__init__.py +0 -0
  103. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/mergers_and_acquisitions/tests/__init__.py +0 -0
  104. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/prices/__init__.py +0 -0
  105. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/prices/price_models.py +0 -0
  106. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/prices/price_tools.py +0 -0
  107. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/prices/tests/__init__.py +0 -0
  108. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/prices/tests/test_price_models.py +0 -0
  109. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/prices/tests/test_price_tools.py +0 -0
  110. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/segments/__init__.py +0 -0
  111. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/segments/segment_models.py +0 -0
  112. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/segments/segment_tools.py +0 -0
  113. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/segments/tests/__init__.py +0 -0
  114. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/segments/tests/test_segment_tools.py +0 -0
  115. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/statements/__init__.py +0 -0
  116. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/statements/statement_models.py +0 -0
  117. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/statements/statement_tools.py +0 -0
  118. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/statements/tests/__init__.py +0 -0
  119. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/domains/statements/tests/test_statement_tools.py +0 -0
  120. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/README.md +0 -0
  121. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/__init__.py +0 -0
  122. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/local_mcp/__init__.py +0 -0
  123. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/local_mcp/kfinance_mcp.py +0 -0
  124. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/local_mcp/local_mcp.py +0 -0
  125. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tests/__init__.py +0 -0
  126. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tests/test_example_notebook.py +0 -0
  127. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/README.md +0 -0
  128. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/__init__.py +0 -0
  129. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/prompts.py +0 -0
  130. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/static_tools/README.md +0 -0
  131. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/static_tools/__init__.py +0 -0
  132. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/static_tools/get_latest.py +0 -0
  133. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/static_tools/get_n_quarters_ago.py +0 -0
  134. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/static_tools/tests/__init__.py +0 -0
  135. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/static_tools/tests/test_get_lastest.py +0 -0
  136. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/static_tools/tests/test_get_n_quarters_ago.py +0 -0
  137. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/tests/__init__.py +0 -0
  138. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/tests/test_tool_calling_models.py +0 -0
  139. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/integrations/tool_calling/tool_calling_models.py +0 -0
  140. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/mcp.py +0 -0
  141. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/models/permission_models.py +0 -0
  142. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/kfinance/py.typed +0 -0
  143. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/pyproject.toml +0 -0
  144. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/scripts/copyright_line_check.sh +0 -0
  145. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/scripts/lint.sh +0 -0
  146. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/scripts/test.sh +0 -0
  147. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/setup.cfg +0 -0
  148. {kensho_kfinance-3.2.3 → kensho_kfinance-3.2.5}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kensho-kfinance
3
- Version: 3.2.3
3
+ Version: 3.2.5
4
4
  Summary: Python CLI for kFinance
5
5
  Author-email: Luke Brown <luke.brown@kensho.com>, Michelle Keoy <michelle.keoy@kensho.com>, Keith Page <keith.page@kensho.com>, Matthew Rosen <matthew.rosen@kensho.com>, Nick Roshdieh <nick.roshdieh@kensho.com>
6
6
  Project-URL: source, https://github.com/kensho-technologies/kfinance
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kensho-kfinance
3
- Version: 3.2.3
3
+ Version: 3.2.5
4
4
  Summary: Python CLI for kFinance
5
5
  Author-email: Luke Brown <luke.brown@kensho.com>, Michelle Keoy <michelle.keoy@kensho.com>, Keith Page <keith.page@kensho.com>, Matthew Rosen <matthew.rosen@kensho.com>, Nick Roshdieh <nick.roshdieh@kensho.com>
6
6
  Project-URL: source, https://github.com/kensho-technologies/kfinance
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## v3.2.5
4
+ - Add requested EV ratio line items
5
+
6
+ ## v3.2.4
7
+ - Add Mergers & Acquisitions tools to ALL_TOOLS
8
+
3
9
  ## v3.2.3
4
10
  - Disable low level MCP SDK input validation
5
11
 
@@ -52,7 +52,18 @@ def mock_client(requests_mock: Mocker) -> Client:
52
52
  additional_matcher=lambda req: req.json().get("identifiers") == ["SPGI"],
53
53
  json={"data": {"SPGI": spgi_id_triple}},
54
54
  )
55
-
55
+ # Fetch a non-existent company (which will include an error)
56
+ requests_mock.post(
57
+ url="https://kfinance.kensho.com/api/v1/ids",
58
+ additional_matcher=lambda req: req.json().get("identifiers") == ["non-existent"],
59
+ json={
60
+ "data": {
61
+ "non-existent": {
62
+ "error": "No identification triple found for the provided identifier: NON-EXISTENT of type: ticker"
63
+ },
64
+ }
65
+ },
66
+ )
56
67
  # Fetch SPGI and a non-existent company (which will include an error)
57
68
  requests_mock.post(
58
69
  url="https://kfinance.kensho.com/api/v1/ids",
@@ -1599,6 +1599,127 @@ LINE_ITEMS: list[LineItemType] = [
1599
1599
  "dataitemid": 4034,
1600
1600
  "spgi_name": "Total Debt/Equity",
1601
1601
  },
1602
+ {
1603
+ "name": "last_close_tev_to_ebit",
1604
+ "aliases": {
1605
+ "ev_to_ebit",
1606
+ "enterprise_value_to_ebit",
1607
+ "enterprise_value_to_earnings_before_interest_and_taxes",
1608
+ "tev_to_ebit",
1609
+ "total_ev_to_ebit",
1610
+ "total_enterprise_value_to_ebit",
1611
+ "total_enterprise_value_to_earnings_before_interest_and_taxes",
1612
+ "last_tev_to_ebit",
1613
+ "last_total_ev_to_ebit",
1614
+ "last_enterprise_value_to_ebit",
1615
+ "last_enterprise_value_to_earnings_before_interest_and_taxes",
1616
+ "last_total_enterprise_value_to_ebit",
1617
+ "last_total_enterprise_value_to_earnings_before_interest_and_taxes",
1618
+ "last_close_ev_to_ebit",
1619
+ "last_close_enterprise_value_to_ebit",
1620
+ "last_close_total_ev_to_ebit",
1621
+ "last_close_enterprise_value_to_ebit",
1622
+ "last_close_enterprise_value_to_earnings_before_interest_and_taxes",
1623
+ "last_close_total_enterprise_value_to_ebit",
1624
+ "last_close_total_enterprise_value_to_earnings_before_interest_and_taxes",
1625
+ },
1626
+ "dataitemid": 100062,
1627
+ "spgi_name": "Last Close TEV / EBIT",
1628
+ },
1629
+ {
1630
+ "name": "last_close_tev_to_ebitda",
1631
+ "aliases": {
1632
+ "ev_to_ebitda",
1633
+ "enterprise_value_to_ebitda",
1634
+ "enterprise_value_to_earnings_before_interest_taxes_depreciation_and_amortization",
1635
+ "tev_to_ebitda",
1636
+ "total_ev_to_ebitda",
1637
+ "total_enterprise_value_to_ebitda",
1638
+ "total_enterprise_value_to_earnings_before_interest_taxes_depreciation_and_amortization",
1639
+ "last_tev_to_ebitda",
1640
+ "last_total_ev_to_ebitda",
1641
+ "last_enterprise_value_to_ebitda",
1642
+ "last_enterprise_value_to_earnings_before_interest_taxes_depreciation_and_amortization",
1643
+ "last_total_enterprise_value_to_ebitda",
1644
+ "last_total_enterprise_value_to_earnings_before_interest_taxes_depreciation_and_amortization",
1645
+ "last_close_total_ev_to_ebitda",
1646
+ "last_close_enterprise_value_to_ebitda",
1647
+ "last_close_enterprise_value_to_earnings_before_interest_taxes_depreciation_and_amortization",
1648
+ "last_close_total_enterprise_value_to_ebitda",
1649
+ "last_close_total_enterprise_value_to_earnings_before_interest_taxes_depreciation_and_amortization",
1650
+ },
1651
+ "dataitemid": 100063,
1652
+ "spgi_name": "Last Close TEV / EBITDA",
1653
+ },
1654
+ {
1655
+ "name": "ev_to_employees",
1656
+ "aliases": {
1657
+ "ev_to_employee_count",
1658
+ "ev_to_headcount",
1659
+ "enterprise_value_to_employees",
1660
+ "enterprise_value_to_employee_count",
1661
+ "enterprise_value_to_headcount",
1662
+ "tev_to_employees",
1663
+ "tev_to_employee_count",
1664
+ "tev_to_headcount",
1665
+ "total_ev_to_employees",
1666
+ "total_ev_to_employee_count",
1667
+ "total_ev_to_headcount",
1668
+ "total_enterprise_value_to_employees",
1669
+ "total_enterprise_value_to_employee_count",
1670
+ "total_enterprise_value_to_headcount",
1671
+ "last_ev_to_employees",
1672
+ "last_ev_to_employee_count",
1673
+ "last_ev_to_headcount",
1674
+ "last_tev_to_employees",
1675
+ "last_tev_to_employee_count",
1676
+ "last_tev_to_headcount",
1677
+ "last_total_ev_to_employees",
1678
+ "last_total_ev_to_employee_count",
1679
+ "last_total_ev_to_headcount",
1680
+ "last_enterprise_value_to_employees",
1681
+ "last_enterprise_value_to_employee_count",
1682
+ "last_enterprise_value_to_headcount",
1683
+ "last_total_enterprise_value_to_employees",
1684
+ "last_total_enterprise_value_to_employee_count",
1685
+ "last_total_enterprise_value_to_headcount",
1686
+ "last_close_ev_to_employees",
1687
+ "last_close_ev_to_employee_count",
1688
+ "last_close_ev_to_headcount",
1689
+ "last_close_tev_to_employees",
1690
+ "last_close_tev_to_employee_count",
1691
+ "last_close_tev_to_headcount",
1692
+ "last_close_total_ev_to_employees",
1693
+ "last_close_total_ev_to_employee_count",
1694
+ "last_close_total_ev_to_headcount",
1695
+ "last_close_enterprise_value_to_employees",
1696
+ "last_close_enterprise_value_to_employee_count",
1697
+ "last_close_enterprise_value_to_headcount",
1698
+ "last_close_total_enterprise_value_to_employees",
1699
+ "last_close_total_enterprise_value_to_employee_count",
1700
+ "last_close_total_enterprise_value_to_headcount",
1701
+ },
1702
+ "dataitemid": 100070,
1703
+ "spgi_name": "Last Close TEV / Employees",
1704
+ },
1705
+ {
1706
+ "name": "ev_to_total_revenue",
1707
+ "aliases": {
1708
+ "tev_to_total_revenue",
1709
+ "enterprise_value_to_total_revenue",
1710
+ "total_enterprise_value_to_total_revenue",
1711
+ "last_ev_to_total_revenue",
1712
+ "last_tev_to_total_revenue",
1713
+ "last_enterprise_value_to_total_revenue",
1714
+ "last_enterprise_value_to_total_revenue",
1715
+ "last_close_ev_to_total_revenue",
1716
+ "last_close_tev_to_total_revenue",
1717
+ "last_close_enterprise_value_to_total_revenue",
1718
+ "last_close_enterprise_value_to_total_revenue",
1719
+ },
1720
+ "dataitemid": 100061,
1721
+ "spgi_name": "Last Close TEV / Total Revenue",
1722
+ },
1602
1723
  ]
1603
1724
  LINE_ITEM_NAMES_AND_ALIASES: list[str] = list(
1604
1725
  chain(*[[line_item["name"]] + list(line_item["aliases"]) for line_item in LINE_ITEMS])
@@ -6,10 +6,16 @@ from pydantic import BaseModel
6
6
  class MergerSummary(BaseModel):
7
7
  transaction_id: int
8
8
  merger_title: str
9
- closed_date: date
9
+ closed_date: date | None
10
10
 
11
11
 
12
12
  class MergersResp(BaseModel):
13
13
  target: list[MergerSummary]
14
14
  buyer: list[MergerSummary]
15
15
  seller: list[MergerSummary]
16
+
17
+
18
+ class AdvisorResp(BaseModel):
19
+ advisor_company_id: str
20
+ advisor_company_name: str
21
+ advisor_type_name: str | None
@@ -7,7 +7,10 @@ from kfinance.client.batch_request_handling import Task, process_tasks_in_thread
7
7
  from kfinance.client.kfinance import Company, MergerOrAcquisition, ParticipantInMerger
8
8
  from kfinance.client.permission_models import Permission
9
9
  from kfinance.domains.companies.company_models import prefix_company_id
10
- from kfinance.domains.mergers_and_acquisitions.merger_and_acquisition_models import MergersResp
10
+ from kfinance.domains.mergers_and_acquisitions.merger_and_acquisition_models import (
11
+ AdvisorResp,
12
+ MergersResp,
13
+ )
11
14
  from kfinance.integrations.tool_calling.tool_calling_models import (
12
15
  KfinanceTool,
13
16
  ToolArgsWithIdentifier,
@@ -23,9 +26,7 @@ class GetMergersFromIdentifiersResp(ToolRespWithErrors):
23
26
  class GetMergersFromIdentifiers(KfinanceTool):
24
27
  name: str = "get_mergers_from_identifiers"
25
28
  description: str = dedent("""
26
- Get the transaction IDs that involve the given identifiers.
27
-
28
- For example, "Which companies did Microsoft purchase?" or "Which company bought Ben & Jerrys?"
29
+ "Retrieves all merger and acquisition transactions involving the specified company identifier for each specified company identifier. The results are categorized by the company's role in each transaction: target, buyer, or seller. Provides the transaction_id, merger_title, and transaction closed_date (finalization) . Use this tool to answer questions like 'Which companies did Microsoft purchase?', 'Which company acquired Ben & Jerry's?', and 'Who did Pfizer acquire?'"
29
30
  """).strip()
30
31
  args_schema: Type[BaseModel] = ToolArgsWithIdentifiers
31
32
  accepted_permissions: set[Permission] | None = {Permission.MergersPermission}
@@ -91,9 +92,7 @@ class GetMergerInfoFromTransactionIdArgs(BaseModel):
91
92
  class GetMergerInfoFromTransactionId(KfinanceTool):
92
93
  name: str = "get_merger_info_from_transaction_id"
93
94
  description: str = dedent("""
94
- Get the timeline, the participants, and the consideration of the merger or acquisition from the given transaction ID.
95
-
96
- For example, "How much was Ben & Jerrys purchased for?" or "What was the price per share for LinkedIn?" or "When did S&P purchase Kensho?"
95
+ "Provides comprehensive information about a specific merger or acquisition transaction, including its timeline (announced date, closed date), participants' company_name and company_id (target, buyers, sellers), and financial consideration details (including monetary values). Use this tool to answer questions like 'When was the acquisition Ben & Jerry's announced?', 'What was the transaction size of Vodafone's acquisition of Mannesmann?', 'How much did S&P purchase Kensho for?'. Always call this for announcement related questions"
97
96
  """).strip()
98
97
  args_schema: Type[BaseModel] = GetMergerInfoFromTransactionIdArgs
99
98
  accepted_permissions: set[Permission] | None = {Permission.MergersPermission}
@@ -162,32 +161,53 @@ class GetAdvisorsForCompanyInTransactionFromIdentifierArgs(ToolArgsWithIdentifie
162
161
  transaction_id: int | None = Field(description="The ID of the merger.", default=None)
163
162
 
164
163
 
164
+ class GetAdvisorsForCompanyInTransactionFromIdentifierResp(ToolRespWithErrors):
165
+ results: list[AdvisorResp]
166
+
167
+
165
168
  class GetAdvisorsForCompanyInTransactionFromIdentifier(KfinanceTool):
166
169
  name: str = "get_advisors_for_company_in_transaction_from_identifier"
167
- description: str = 'Get the companies advising a company in a given transaction. For example, "Who advised S&P Global during their purchase of Kensho?"'
170
+ description: str = dedent("""
171
+ "Returns a list of advisor companies that provided advisory services to the specified company during a particular merger or acquisition transaction. Use this tool to answer questions like 'Who advised S&P Global during their purchase of Kensho?', 'Which firms advised Ben & Jerry's in their acquisition?'."
172
+ """).strip()
168
173
  args_schema: Type[BaseModel] = GetAdvisorsForCompanyInTransactionFromIdentifierArgs
169
174
  accepted_permissions: set[Permission] | None = {Permission.MergersPermission}
170
175
 
171
- def _run(self, identifier: str, transaction_id: int) -> list:
172
- ticker = self.kfinance_client.ticker(identifier)
176
+ def _run(self, identifier: str, transaction_id: int) -> dict:
177
+ api_client = self.kfinance_client.kfinance_api_client
178
+ id_triple_resp = api_client.unified_fetch_id_triples(identifiers=[identifier])
179
+ # If the identifier cannot be resolved, return the associated error.
180
+ if id_triple_resp.errors:
181
+ output_model = GetAdvisorsForCompanyInTransactionFromIdentifierResp(
182
+ results=[], errors=list(id_triple_resp.errors.values())
183
+ )
184
+ return output_model.model_dump(mode="json")
185
+
186
+ id_triple = id_triple_resp.identifiers_to_id_triples[identifier]
187
+
173
188
  participant_in_merger = ParticipantInMerger(
174
- kfinance_api_client=ticker.kfinance_api_client,
189
+ kfinance_api_client=api_client,
175
190
  transaction_id=transaction_id,
176
191
  company=Company(
177
- kfinance_api_client=ticker.kfinance_api_client,
178
- company_id=ticker.company.company_id,
192
+ kfinance_api_client=api_client,
193
+ company_id=id_triple.company_id,
179
194
  ),
180
195
  )
196
+
181
197
  advisors = participant_in_merger.advisors
182
198
 
199
+ advisors_response: list[AdvisorResp] = []
183
200
  if advisors:
184
- return [
185
- {
186
- "advisor_company_id": prefix_company_id(advisor.company.company_id),
187
- "advisor_company_name": advisor.company.name,
188
- "advisor_type_name": advisor.advisor_type_name,
189
- }
190
- for advisor in advisors
191
- ]
192
- else:
193
- return []
201
+ for advisor in advisors:
202
+ advisors_response.append(
203
+ AdvisorResp(
204
+ advisor_company_id=prefix_company_id(advisor.company.company_id),
205
+ advisor_company_name=advisor.company.name,
206
+ advisor_type_name=advisor.advisor_type_name,
207
+ )
208
+ )
209
+
210
+ output_model = GetAdvisorsForCompanyInTransactionFromIdentifierResp(
211
+ results=advisors_response, errors=list(id_triple_resp.errors.values())
212
+ )
213
+ return output_model.model_dump(mode="json")
@@ -46,28 +46,42 @@ class TestGetCompaniesAdvisingCompanyInTransactionFromIdentifier:
46
46
  def test_get_companies_advising_company_in_transaction_from_identifier(
47
47
  self, requests_mock: Mocker, mock_client: Client
48
48
  ):
49
- api_response = {
50
- "advisors": [
51
- {
52
- "advisor_company_id": 251994106,
53
- "advisor_company_name": "Kensho Technologies, Inc.",
54
- "advisor_type_name": "Professional Mongo Enjoyer",
55
- }
56
- ]
49
+ advisor_data = {
50
+ "advisor_company_id": 251994106,
51
+ "advisor_company_name": "Kensho Technologies, Inc.",
52
+ "advisor_type_name": "Professional Mongo Enjoyer",
57
53
  }
58
- expected_response = deepcopy(api_response)
59
- expected_response["advisors"][0]["advisor_company_id"] = f"{COMPANY_ID_PREFIX}251994106"
60
- transaction_id = 517414
54
+ api_response = {"advisors": [deepcopy(advisor_data)]}
55
+ expected_response = {"results": [deepcopy(advisor_data)]}
56
+ expected_response["results"][0]["advisor_company_id"] = f"{COMPANY_ID_PREFIX}251994106"
57
+ transaction_id = 554979212
61
58
  requests_mock.get(
62
- url=f"https://kfinance.kensho.com/api/v1/merger/info/{transaction_id}/advisors/21835",
59
+ url=f"https://kfinance.kensho.com/api/v1/merger/info/{transaction_id}/advisors/{SPGI_COMPANY_ID}",
63
60
  json=api_response,
64
61
  )
65
62
  tool = GetAdvisorsForCompanyInTransactionFromIdentifier(kfinance_client=mock_client)
66
63
  args = GetAdvisorsForCompanyInTransactionFromIdentifierArgs(
67
- identifier="MSFT", transaction_id=transaction_id
64
+ identifier="SPGI", transaction_id=transaction_id
65
+ )
66
+ response = tool.run(args.model_dump(mode="json"))
67
+ assert response == expected_response
68
+
69
+ def test_get_companies_advising_company_in_transaction_from_bad_identifier(
70
+ self, requests_mock: Mocker, mock_client: Client
71
+ ):
72
+ expected_response = {
73
+ "results": [],
74
+ "errors": [
75
+ "No identification triple found for the provided identifier: NON-EXISTENT of type: ticker"
76
+ ],
77
+ }
78
+ transaction_id = 554979212
79
+ tool = GetAdvisorsForCompanyInTransactionFromIdentifier(kfinance_client=mock_client)
80
+ args = GetAdvisorsForCompanyInTransactionFromIdentifierArgs(
81
+ identifier="non-existent", transaction_id=transaction_id
68
82
  )
69
83
  response = tool.run(args.model_dump(mode="json"))
70
- assert response == expected_response["advisors"]
84
+ assert response == expected_response
71
85
 
72
86
 
73
87
  class TestGetMergerInfoFromTransactionId:
@@ -20,6 +20,11 @@ from kfinance.domains.earnings.earning_tools import (
20
20
  GetTranscriptFromKeyDevId,
21
21
  )
22
22
  from kfinance.domains.line_items.line_item_tools import GetFinancialLineItemFromIdentifiers
23
+ from kfinance.domains.mergers_and_acquisitions.merger_and_acquisition_tools import (
24
+ GetAdvisorsForCompanyInTransactionFromIdentifier,
25
+ GetMergerInfoFromTransactionId,
26
+ GetMergersFromIdentifiers,
27
+ )
23
28
  from kfinance.domains.prices.price_tools import GetPricesFromIdentifiers
24
29
  from kfinance.domains.segments.segment_tools import GetSegmentsFromIdentifiers
25
30
  from kfinance.domains.statements.statement_tools import GetFinancialStatementFromIdentifiers
@@ -60,4 +65,8 @@ ALL_TOOLS: list[type[KfinanceTool]] = [
60
65
  GetSegmentsFromIdentifiers,
61
66
  # Statements
62
67
  GetFinancialStatementFromIdentifiers,
68
+ # Mergers & Acquisitions
69
+ GetAdvisorsForCompanyInTransactionFromIdentifier,
70
+ GetMergerInfoFromTransactionId,
71
+ GetMergersFromIdentifiers,
63
72
  ]
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '3.2.3'
32
- __version_tuple__ = version_tuple = (3, 2, 3)
31
+ __version__ = version = '3.2.5'
32
+ __version_tuple__ = version_tuple = (3, 2, 5)
33
33
 
34
- __commit_id__ = commit_id = 'gd434cf519'
34
+ __commit_id__ = commit_id = 'g0c68de0ce'
File without changes