langchain-openapi-tools 1.0.2__tar.gz → 1.1.3__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.
Files changed (152) hide show
  1. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/CHANGELOG.md +14 -0
  2. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/Makefile +1 -1
  3. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/PKG-INFO +108 -156
  4. langchain_openapi_tools-1.1.3/README.md +218 -0
  5. langchain_openapi_tools-1.1.3/docs/api/executor.md +5 -0
  6. langchain_openapi_tools-1.1.3/docs/api/loader.md +3 -0
  7. langchain_openapi_tools-1.1.3/docs/api/middleware.md +8 -0
  8. langchain_openapi_tools-1.1.3/docs/api/parser.md +4 -0
  9. langchain_openapi_tools-1.1.3/docs/api/toolkit.md +4 -0
  10. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/authentication.md +5 -5
  11. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/examples/crossref.md +1 -1
  12. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/examples/petstore.md +1 -1
  13. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/index.md +1 -1
  14. langchain_openapi_tools-1.1.3/docs/installation.md +65 -0
  15. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/middleware.md +9 -5
  16. langchain_openapi_tools-1.1.3/docs/prompt_optimization.md +140 -0
  17. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/quickstart.md +2 -2
  18. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/toolkit.md +1 -1
  19. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/crossref/main.py +1 -1
  20. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/petstore/main.py +1 -1
  21. langchain_openapi_tools-1.1.3/langchain_openapi/__init__.py +19 -0
  22. langchain_openapi_tools-1.1.3/langchain_openapi/py.typed +1 -0
  23. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/__init__.py +15 -13
  24. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/executor.py +14 -9
  25. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/loader.py +4 -4
  26. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/middleware.py +1 -1
  27. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/models.py +1 -1
  28. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/parser.py +5 -5
  29. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/providers.py +1 -1
  30. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/schema_converter.py +2 -2
  31. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/swagger.py +21 -14
  32. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/toolkit.py +205 -24
  33. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/utils.py +1 -1
  34. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/mkdocs.yml +1 -0
  35. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/pyproject.toml +8 -3
  36. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/404.html +35 -8
  37. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/executor/index.html +270 -235
  38. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/loader/index.html +69 -42
  39. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/middleware/index.html +70 -43
  40. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/parser/index.html +54 -27
  41. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/toolkit/index.html +583 -464
  42. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/architecture/index.html +36 -9
  43. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/authentication/index.html +40 -13
  44. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/contributing/index.html +35 -8
  45. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/examples/crossref/index.html +36 -9
  46. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/examples/petstore/index.html +36 -9
  47. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/index.html +36 -9
  48. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/installation/index.html +150 -16
  49. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/middleware/index.html +55 -24
  50. langchain_openapi_tools-1.1.3/site/objects.inv +0 -0
  51. langchain_openapi_tools-1.1.3/site/prompt_optimization/index.html +1364 -0
  52. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/quickstart/index.html +38 -11
  53. langchain_openapi_tools-1.1.3/site/search/search_index.json +1 -0
  54. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/sitemap.xml +4 -0
  55. langchain_openapi_tools-1.1.3/site/sitemap.xml.gz +0 -0
  56. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/toolkit/index.html +36 -9
  57. langchain_openapi_tools-1.1.3/tests/test_compatibility.py +35 -0
  58. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_e2e.py +1 -1
  59. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_executor.py +1 -1
  60. langchain_openapi_tools-1.1.3/tests/test_import.py +6 -0
  61. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_loader.py +1 -1
  62. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_middleware.py +1 -1
  63. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_parser.py +1 -1
  64. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_providers.py +2 -2
  65. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_resolver.py +1 -1
  66. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_schema_converter.py +1 -1
  67. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_swagger.py +33 -1
  68. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_toolkit.py +137 -1
  69. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/uv.lock +167 -1
  70. langchain_openapi_tools-1.0.2/README.md +0 -266
  71. langchain_openapi_tools-1.0.2/docs/api/executor.md +0 -5
  72. langchain_openapi_tools-1.0.2/docs/api/loader.md +0 -3
  73. langchain_openapi_tools-1.0.2/docs/api/middleware.md +0 -8
  74. langchain_openapi_tools-1.0.2/docs/api/parser.md +0 -4
  75. langchain_openapi_tools-1.0.2/docs/api/toolkit.md +0 -4
  76. langchain_openapi_tools-1.0.2/docs/installation.md +0 -40
  77. langchain_openapi_tools-1.0.2/site/objects.inv +0 -0
  78. langchain_openapi_tools-1.0.2/site/search/search_index.json +0 -1
  79. langchain_openapi_tools-1.0.2/site/sitemap.xml.gz +0 -0
  80. langchain_openapi_tools-1.0.2/tests/test_import.py +0 -6
  81. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  82. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  83. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  84. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  85. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/dependabot.yml +0 -0
  86. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/workflows/ci.yml +0 -0
  87. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/workflows/pages.yml +0 -0
  88. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/workflows/publish.yml +0 -0
  89. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/workflows/release.yml +0 -0
  90. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.gitignore +0 -0
  91. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.pre-commit-config.yaml +0 -0
  92. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/ARCHITECTURE.md +0 -0
  93. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/CODE_OF_CONDUCT.md +0 -0
  94. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/CONTRIBUTING.md +0 -0
  95. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/LICENSE +0 -0
  96. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/benchmarks/benchmark.py +0 -0
  97. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/architecture.md +0 -0
  98. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/contributing.md +0 -0
  99. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/README.md +0 -0
  100. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/crossref/README.md +0 -0
  101. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/crossref/crossref.json +0 -0
  102. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/crossref/requirements.txt +0 -0
  103. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/petstore/README.md +0 -0
  104. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/petstore/petstore.json +0 -0
  105. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/petstore/requirements.txt +0 -0
  106. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/enums.py +0 -0
  107. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/exceptions.py +0 -0
  108. {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/py.typed +0 -0
  109. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/_mkdocstrings.css +0 -0
  110. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/images/favicon.png +0 -0
  111. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/bundle.d7400e89.min.js +0 -0
  112. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/bundle.d7400e89.min.js.map +0 -0
  113. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ar.min.js +0 -0
  114. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.da.min.js +0 -0
  115. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.de.min.js +0 -0
  116. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.du.min.js +0 -0
  117. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.el.min.js +0 -0
  118. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.es.min.js +0 -0
  119. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.fi.min.js +0 -0
  120. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.fr.min.js +0 -0
  121. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.he.min.js +0 -0
  122. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.hi.min.js +0 -0
  123. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.hu.min.js +0 -0
  124. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.hy.min.js +0 -0
  125. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.it.min.js +0 -0
  126. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ja.min.js +0 -0
  127. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.jp.min.js +0 -0
  128. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.kn.min.js +0 -0
  129. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ko.min.js +0 -0
  130. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.multi.min.js +0 -0
  131. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.nl.min.js +0 -0
  132. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.no.min.js +0 -0
  133. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.pt.min.js +0 -0
  134. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ro.min.js +0 -0
  135. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ru.min.js +0 -0
  136. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.sa.min.js +0 -0
  137. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +0 -0
  138. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.sv.min.js +0 -0
  139. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ta.min.js +0 -0
  140. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.te.min.js +0 -0
  141. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.th.min.js +0 -0
  142. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.tr.min.js +0 -0
  143. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.vi.min.js +0 -0
  144. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.zh.min.js +0 -0
  145. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/tinyseg.js +0 -0
  146. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/wordcut.js +0 -0
  147. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/workers/search.2c215733.min.js +0 -0
  148. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/workers/search.2c215733.min.js.map +0 -0
  149. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/stylesheets/main.ec1eaa64.min.css +0 -0
  150. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/stylesheets/main.ec1eaa64.min.css.map +0 -0
  151. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/stylesheets/palette.ab4e12ef.min.css +0 -0
  152. {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/stylesheets/palette.ab4e12ef.min.css.map +0 -0
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ---
9
9
 
10
+ ## [1.0.2] - 2026-08-01
11
+
12
+ ### Fixed
13
+ - **Base URL Generation**: Fixed Swagger 2.0 base URL generation (e.g. Crossref host/basePath/schemes resolution) to prevent relative URL execution errors.
14
+ - **URL Resolution**: Updated `RequestBuilder` to use `urllib.parse.urljoin` for safe URL concatenation.
15
+
16
+ ### Added
17
+ - **Package Naming Clarification**: Clarified PyPI package name (`langchain-openapi-tools`) vs import module name (`langchain_openapi`) across documentation.
18
+ - **Prompt Optimization & Config**: Introduced `OpenAPIToolkitConfig` for user-controlled description modes (`full`, `compact`, `minimal`) and description prompt compression (`compress_descriptions=True`).
19
+ - **Tool Description Customization**: Added `tool_description_overrides` dict and custom `description_builder` callback functions.
20
+ - **Operation & Tag Filtering**: Added tag filtering (`include_tags`, `exclude_tags`) and operation filtering (`include_operations`, `exclude_operations`) at initial toolkit construction level.
21
+
22
+ ---
23
+
10
24
  ## [1.0.0] - 2026-08-01
11
25
 
12
26
  ### Added
@@ -10,7 +10,7 @@ lint:
10
10
  uv run ruff check .
11
11
 
12
12
  typecheck:
13
- uv run mypy langchain_openapi tests examples
13
+ uv run mypy langchain_openapi_tools langchain_openapi tests examples
14
14
 
15
15
  format:
16
16
  uv run ruff format .
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langchain-openapi-tools
3
- Version: 1.0.2
3
+ Version: 1.1.3
4
4
  Summary: Convert OpenAPI specifications into native, production-grade LangChain tools.
5
5
  Project-URL: Homepage, https://github.com/abhaywani114/langchain-openapi
6
6
  Project-URL: Documentation, https://abhaywani114.github.io/langchain-openapi/
@@ -46,7 +46,7 @@ Description-Content-Type: text/markdown
46
46
  </p>
47
47
 
48
48
  <p align="center">
49
- <em>Convert OpenAPI v3.0 & v3.1 specifications into native, production-grade LangChain tools.</em>
49
+ <em>Convert OpenAPI v3.0 & v3.1 and Swagger 2.0 specifications into native, production-grade LangChain tools.</em>
50
50
  </p>
51
51
 
52
52
  <p align="center">
@@ -61,15 +61,45 @@ Description-Content-Type: text/markdown
61
61
 
62
62
  ---
63
63
 
64
- `langchain_openapi` is a modern Python library designed to seamlessly convert OpenAPI v3.0 and v3.1 specifications into native, type-safe [LangChain](https://github.com/langchain-ai/langchain) tools for AI agents and LLM applications.
64
+ `langchain_openapi` is a modern Python library designed to seamlessly convert OpenAPI v3.0, v3.1, and Swagger 2.0 specifications into native, type-safe [LangChain](https://github.com/langchain-ai/langchain) tools for AI agents and LLM applications.
65
65
 
66
- No python code generation is required—tools are generated dynamically at runtime with strict Pydantic input schemas and production-ready middleware.
66
+ No python code generation is required—tools are generated dynamically at runtime with strict Pydantic input schemas, prompt optimization options, and production-ready middleware.
67
+
68
+ ---
69
+
70
+ ## Installation & Importing
71
+
72
+ Install the PyPI package:
73
+
74
+ ```bash
75
+ pip install langchain-openapi-tools
76
+ # or using uv
77
+ uv add langchain-openapi-tools
78
+ ```
79
+
80
+ Import in Python:
81
+
82
+ ```python
83
+ from langchain_openapi_tools import OpenAPIToolkit, OpenAPIToolkitConfig
84
+ ```
85
+
86
+ ### Migration Note
87
+
88
+ ```python
89
+ # Old (deprecated, but still works for backward compatibility):
90
+ from langchain_openapi import OpenAPIToolkit
91
+
92
+ # New (recommended):
93
+ from langchain_openapi_tools import OpenAPIToolkit
94
+ ```
67
95
 
68
96
  ---
69
97
 
70
98
  ## Features
71
99
 
72
100
  - ⚡ **Zero-Code Tool Generation**: Runtime conversion of OpenAPI specs (YAML/JSON) into LangChain `StructuredTool`s.
101
+ - 🚀 **Swagger 2.0 & OpenAPI 3.x**: Native normalization of legacy Swagger 2.0 and modern OpenAPI 3.0/3.1 specs.
102
+ - 🗜️ **Prompt Optimization & Filtering**: Description modes (`full`, `compact`, `minimal`), description compression, overrides, callbacks, and operation/tag filtering to drastically reduce context window usage.
73
103
  - 🔒 **Pluggable Authentication**: Built-in support for Bearer Tokens, API Key Headers, Query Parameters, Basic Auth, and custom request providers.
74
104
  - 🛡️ **Production Middleware**: Composable middleware architecture for Retries (exponential backoff), Rate Limiting (token-bucket), Caching (TTL), Pagination aggregation, and Sanitized Logging.
75
105
  - 🎯 **Type-Safe Validation**: Dynamically generated Pydantic input schemas ensure LLM arguments adhere strictly to specification types before network transport.
@@ -85,47 +115,10 @@ No python code generation is required—tools are generated dynamically at runti
85
115
 
86
116
  ---
87
117
 
88
- ## Architecture Pipeline
89
-
90
- ```text
91
- Swagger 2.0 / OpenAPI 3.x
92
-
93
-
94
- Swagger Normalizer
95
-
96
-
97
- Normalized OpenAPI Model
98
-
99
-
100
- Existing Parser
101
-
102
-
103
- Internal Operation Models
104
-
105
-
106
- Schema Converter
107
-
108
-
109
- HTTP Executor
110
-
111
-
112
- LangChain StructuredTools
113
- ```
114
-
115
118
  ## Quick Start
116
119
 
117
- ### Installation
118
-
119
- ```bash
120
- uv add langchain-openapi-tools
121
- # or
122
- pip install langchain-openapi-tools
123
- ```
124
-
125
- ### Basic Usage
126
-
127
120
  ```python
128
- from langchain_openapi import OpenAPIToolkit
121
+ from langchain_openapi_tools import OpenAPIToolkit
129
122
 
130
123
  # Load spec from remote URL or local file
131
124
  toolkit = OpenAPIToolkit.from_url("https://api.crossref.org/swagger-docs")
@@ -142,12 +135,12 @@ for tool in tools[:3]:
142
135
 
143
136
  ```python
144
137
  import asyncio
145
- from langchain_openapi import OpenAPIToolkit
138
+ from langchain_openapi_tools import OpenAPIToolkit
146
139
 
147
140
 
148
141
  async def main():
149
142
  toolkit = OpenAPIToolkit.from_url("https://api.crossref.org/swagger-docs")
150
- search_tool = toolkit.get_tool("search_works")
143
+ search_tool = toolkit.get_tool("get_works")
151
144
 
152
145
  if search_tool:
153
146
  result = await search_tool.ainvoke({"query": "LangGraph"})
@@ -160,147 +153,106 @@ if __name__ == "__main__":
160
153
 
161
154
  ---
162
155
 
163
- ## Architecture
156
+ ## Prompt Optimization & Tool Customization
164
157
 
165
- ```text
166
- OpenAPI Specification (JSON / YAML)
167
-
168
-
169
- OpenAPILoader
170
-
171
-
172
- OpenAPIParser ───► ReferenceResolver ($ref)
173
-
174
-
175
- SchemaConverter ───► Dynamic Pydantic Input Models
176
-
177
-
178
- LangChainToolFactory ───► LangChain StructuredTool
179
-
180
-
181
- AsyncHTTPExecutor
182
-
183
-
184
- Middleware Pipeline (Retry, RateLimit, Cache, Pagination, Logging)
185
-
186
-
187
- Request Providers (Authentication & Custom Headers)
188
-
189
-
190
- httpx.AsyncClient (HTTP Target API)
191
- ```
192
-
193
- ---
194
-
195
- ## Authentication Methods
158
+ Large OpenAPI specifications can generate extensive tool descriptions that exceed model context windows. `langchain_openapi_tools` provides full control over description generation and context footprint.
196
159
 
197
- `langchain_openapi` supports pluggable authentication via `RequestProvider` classes:
160
+ ### Configuration Object (`OpenAPIToolkitConfig`)
198
161
 
199
162
  ```python
200
- from langchain_openapi import (
201
- APIKeyHeaderProvider,
202
- BasicAuthProvider,
203
- BearerAuthProvider,
204
- CompositeProvider,
205
- OpenAPIToolkit,
163
+ from langchain_openapi_tools import OpenAPIToolkit, OpenAPIToolkitConfig
164
+
165
+ config = OpenAPIToolkitConfig(
166
+ description_mode="compact",
167
+ compress_descriptions=True,
168
+ include_tags=["Works"],
169
+ tool_description_overrides={
170
+ "get_works": "Search scholarly papers registered with Crossref."
171
+ },
206
172
  )
207
173
 
208
- # 1. Bearer Token Auth
209
- toolkit_bearer = OpenAPIToolkit.from_url(
210
- "https://api.github.com/openapi",
211
- provider=BearerAuthProvider(token="secret_token"),
174
+ toolkit = OpenAPIToolkit.from_url(
175
+ "https://api.crossref.org/swagger-docs", config=config
212
176
  )
177
+ ```
213
178
 
214
- # 2. API Key Header Auth
215
- toolkit_apikey = OpenAPIToolkit.from_url(
216
- "https://api.example.com/spec.json",
217
- provider=APIKeyHeaderProvider(key="secret_key", header="X-API-Key"),
218
- )
179
+ ### Description Modes (`description_mode`)
219
180
 
220
- # 3. Composite Provider (Multiple authentication schemes)
221
- composite = CompositeProvider(
222
- [
223
- BearerAuthProvider(token="secret_jwt"),
224
- APIKeyHeaderProvider(key="secret_key", header="X-API-Key"),
225
- ]
226
- )
181
+ - `full` *(default)*: Complete summary, description, HTTP method, path, and schema parameter details.
182
+ - `compact`: Summary and short parameter list without response schemas or redundant examples.
183
+ - `minimal`: A single-sentence summary ideal for large specifications with dozens of tools.
227
184
 
228
- toolkit_composite = OpenAPIToolkit.from_url(
229
- "https://api.example.com/spec.json",
230
- provider=composite,
231
- )
185
+ ```python
186
+ toolkit = OpenAPIToolkit.from_url(url, description_mode="minimal")
232
187
  ```
233
188
 
234
- ---
189
+ ### Description Compression (`compress_descriptions=True`)
235
190
 
236
- ## Production Middleware & Resilience
237
-
238
- Intercept requests and responses to apply cross-cutting resilience concerns:
191
+ Removes duplicate text, redundant whitespace, and empty sections without altering tool semantics:
239
192
 
240
193
  ```python
241
- from langchain_openapi import (
242
- CacheMiddleware,
243
- LoggingMiddleware,
244
- OpenAPIToolkit,
245
- PaginationMiddleware,
246
- RateLimitMiddleware,
247
- RetryMiddleware,
248
- )
249
-
250
- toolkit = OpenAPIToolkit.from_url(
251
- "https://api.example.com/openapi.json",
252
- middleware=[
253
- LoggingMiddleware(),
254
- RetryMiddleware(retries=3, backoff="exponential"),
255
- RateLimitMiddleware(requests_per_second=10.0),
256
- CacheMiddleware(ttl=300.0),
257
- PaginationMiddleware(max_pages=10),
258
- ],
259
- )
194
+ toolkit = OpenAPIToolkit.from_url(url, compress_descriptions=True)
260
195
  ```
261
196
 
262
- ---
263
-
264
- ## Example Applications
197
+ ### Custom Overrides & Callbacks
265
198
 
266
- Runnable example projects are located in `examples/`:
199
+ Override descriptions for specific tools:
267
200
 
268
- - 📚 [`examples/crossref`](examples/crossref/): Academic works search via Crossref API.
269
- - 🐙 [`examples/github`](examples/github/): Repository search via GitHub REST API with Bearer Token.
270
- - 🐶 [`examples/petstore`](examples/petstore/): Pet store management using Swagger Petstore.
271
- - 📝 [`examples/jsonplaceholder`](examples/jsonplaceholder/): REST resource querying with caching.
201
+ ```python
202
+ toolkit = OpenAPIToolkit.from_url(
203
+ url, tool_description_overrides={"get_works": "Search scholarly papers."}
204
+ )
205
+ ```
272
206
 
273
- ---
207
+ Or pass a custom builder callback:
274
208
 
275
- ## Roadmap
209
+ ```python
210
+ def my_builder(operation):
211
+ return f"Execute {operation.name} on path {operation.path}."
276
212
 
277
- - ✅ **Milestone 1**: Project Foundation & Tooling
278
- - ✅ **Milestone 2**: OpenAPI Specification Loader
279
- - ✅ **Milestone 3**: OpenAPI Parser & Data Models
280
- - ✅ **Milestone 4**: Dynamic Pydantic Schema Converter
281
- - ✅ **Milestone 5**: Async HTTP Executor Engine
282
- - ✅ **Milestone 6**: LangChain Tool Factory & Toolkit
283
- - ✅ **Milestone 7**: Authentication & Request Providers
284
- - ✅ **Milestone 8**: Production Middleware & Resilience Pipeline
285
- - ✅ **Milestone 9**: Open Source Readiness & Documentation
286
- - ⏳ **Milestone 10**: v1.0 Release Candidate & PyPI Publish
287
213
 
288
- ---
214
+ toolkit = OpenAPIToolkit.from_url(url, description_builder=my_builder)
215
+ ```
289
216
 
290
- ## Development & Contributing
217
+ ### Operation Filtering
291
218
 
292
- Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on code style, testing, and pull request procedures.
219
+ Filter tools before they are created to reduce context window overhead:
293
220
 
294
- ```bash
295
- # Sync virtual environment
296
- uv sync --extra dev
221
+ ```python
222
+ # Filter by Tags
223
+ toolkit = OpenAPIToolkit.from_url(url, include_tags=["Works"], exclude_tags=["Admin"])
297
224
 
298
- # Run all checks (format, lint, mypy, pytest, docs build, benchmark)
299
- make all
225
+ # Filter by Operations
226
+ toolkit = OpenAPIToolkit.from_url(
227
+ url, include_operations=["get_works"], exclude_operations=["delete_work"]
228
+ )
300
229
  ```
301
230
 
302
231
  ---
303
232
 
304
- ## License
233
+ ## Architecture Pipeline
305
234
 
306
- This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
235
+ ```text
236
+ Swagger 2.0 / OpenAPI 3.x
237
+
238
+
239
+ Swagger Normalizer
240
+
241
+
242
+ Normalized OpenAPI Model
243
+
244
+
245
+ Existing Parser
246
+
247
+
248
+ Internal Operation Models
249
+
250
+
251
+ Schema Converter
252
+
253
+
254
+ HTTP Executor
255
+
256
+
257
+ LangChain StructuredTools
258
+ ```
@@ -0,0 +1,218 @@
1
+ # langchain-openapi
2
+
3
+ <p align="center">
4
+ <!-- Logo Placeholder -->
5
+ <img src="docs/assets/logo.png" alt="langchain-openapi logo" width="200" onerror="this.style.display='none'"/>
6
+ </p>
7
+
8
+ <p align="center">
9
+ <em>Convert OpenAPI v3.0 & v3.1 and Swagger 2.0 specifications into native, production-grade LangChain tools.</em>
10
+ </p>
11
+
12
+ <p align="center">
13
+ <a href="https://github.com/abhaywani114/langchain-openapi/actions/workflows/ci.yml"><img src="https://github.com/abhaywani114/langchain-openapi/actions/workflows/ci.yml/badge.svg" alt="CI Status"/></a>
14
+ <a href="https://pypi.org/project/langchain-openapi-tools/"><img src="https://img.shields.io/pypi/v/langchain-openapi-tools.svg" alt="PyPI Version"/></a>
15
+ <a href="https://abhaywani114.github.io/langchain-openapi/"><img src="https://img.shields.io/badge/docs-mkdocs-blue.svg" alt="Documentation"/></a>
16
+ <a href="https://python.org"><img src="https://img.shields.io/badge/python-3.11%2B-blue.svg" alt="Python 3.11+"/></a>
17
+ <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/badge/code%20style-ruff-000000.svg" alt="Code Style: Ruff"/></a>
18
+ <a href="http://mypy-lang.org/"><img src="https://img.shields.io/badge/mypy-checked-blue.svg" alt="Checked with MyPy"/></a>
19
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License: MIT"/></a>
20
+ </p>
21
+
22
+ ---
23
+
24
+ `langchain_openapi` is a modern Python library designed to seamlessly convert OpenAPI v3.0, v3.1, and Swagger 2.0 specifications into native, type-safe [LangChain](https://github.com/langchain-ai/langchain) tools for AI agents and LLM applications.
25
+
26
+ No python code generation is required—tools are generated dynamically at runtime with strict Pydantic input schemas, prompt optimization options, and production-ready middleware.
27
+
28
+ ---
29
+
30
+ ## Installation & Importing
31
+
32
+ Install the PyPI package:
33
+
34
+ ```bash
35
+ pip install langchain-openapi-tools
36
+ # or using uv
37
+ uv add langchain-openapi-tools
38
+ ```
39
+
40
+ Import in Python:
41
+
42
+ ```python
43
+ from langchain_openapi_tools import OpenAPIToolkit, OpenAPIToolkitConfig
44
+ ```
45
+
46
+ ### Migration Note
47
+
48
+ ```python
49
+ # Old (deprecated, but still works for backward compatibility):
50
+ from langchain_openapi import OpenAPIToolkit
51
+
52
+ # New (recommended):
53
+ from langchain_openapi_tools import OpenAPIToolkit
54
+ ```
55
+
56
+ ---
57
+
58
+ ## Features
59
+
60
+ - ⚡ **Zero-Code Tool Generation**: Runtime conversion of OpenAPI specs (YAML/JSON) into LangChain `StructuredTool`s.
61
+ - 🚀 **Swagger 2.0 & OpenAPI 3.x**: Native normalization of legacy Swagger 2.0 and modern OpenAPI 3.0/3.1 specs.
62
+ - 🗜️ **Prompt Optimization & Filtering**: Description modes (`full`, `compact`, `minimal`), description compression, overrides, callbacks, and operation/tag filtering to drastically reduce context window usage.
63
+ - 🔒 **Pluggable Authentication**: Built-in support for Bearer Tokens, API Key Headers, Query Parameters, Basic Auth, and custom request providers.
64
+ - 🛡️ **Production Middleware**: Composable middleware architecture for Retries (exponential backoff), Rate Limiting (token-bucket), Caching (TTL), Pagination aggregation, and Sanitized Logging.
65
+ - 🎯 **Type-Safe Validation**: Dynamically generated Pydantic input schemas ensure LLM arguments adhere strictly to specification types before network transport.
66
+ - 🌐 **Async Engine**: Non-blocking asynchronous network transport powered by `httpx.AsyncClient`.
67
+
68
+ ---
69
+
70
+ ## Supported Specifications
71
+
72
+ - ✅ **Swagger 2.0** (Automatically normalized to OpenAPI 3.0)
73
+ - ✅ **OpenAPI 3.0.x** (JSON and YAML)
74
+ - ✅ **OpenAPI 3.1.x** (JSON and YAML)
75
+
76
+ ---
77
+
78
+ ## Quick Start
79
+
80
+ ```python
81
+ from langchain_openapi_tools import OpenAPIToolkit
82
+
83
+ # Load spec from remote URL or local file
84
+ toolkit = OpenAPIToolkit.from_url("https://api.crossref.org/swagger-docs")
85
+
86
+ # Extract generated tools
87
+ tools = toolkit.get_tools()
88
+
89
+ print(f"Generated {len(tools)} tools:")
90
+ for tool in tools[:3]:
91
+ print(f"- {tool.name}: {tool.description}")
92
+ ```
93
+
94
+ ### Agent Integration
95
+
96
+ ```python
97
+ import asyncio
98
+ from langchain_openapi_tools import OpenAPIToolkit
99
+
100
+
101
+ async def main():
102
+ toolkit = OpenAPIToolkit.from_url("https://api.crossref.org/swagger-docs")
103
+ search_tool = toolkit.get_tool("get_works")
104
+
105
+ if search_tool:
106
+ result = await search_tool.ainvoke({"query": "LangGraph"})
107
+ print("Search Result:", result)
108
+
109
+
110
+ if __name__ == "__main__":
111
+ asyncio.run(main())
112
+ ```
113
+
114
+ ---
115
+
116
+ ## Prompt Optimization & Tool Customization
117
+
118
+ Large OpenAPI specifications can generate extensive tool descriptions that exceed model context windows. `langchain_openapi_tools` provides full control over description generation and context footprint.
119
+
120
+ ### Configuration Object (`OpenAPIToolkitConfig`)
121
+
122
+ ```python
123
+ from langchain_openapi_tools import OpenAPIToolkit, OpenAPIToolkitConfig
124
+
125
+ config = OpenAPIToolkitConfig(
126
+ description_mode="compact",
127
+ compress_descriptions=True,
128
+ include_tags=["Works"],
129
+ tool_description_overrides={
130
+ "get_works": "Search scholarly papers registered with Crossref."
131
+ },
132
+ )
133
+
134
+ toolkit = OpenAPIToolkit.from_url(
135
+ "https://api.crossref.org/swagger-docs", config=config
136
+ )
137
+ ```
138
+
139
+ ### Description Modes (`description_mode`)
140
+
141
+ - `full` *(default)*: Complete summary, description, HTTP method, path, and schema parameter details.
142
+ - `compact`: Summary and short parameter list without response schemas or redundant examples.
143
+ - `minimal`: A single-sentence summary ideal for large specifications with dozens of tools.
144
+
145
+ ```python
146
+ toolkit = OpenAPIToolkit.from_url(url, description_mode="minimal")
147
+ ```
148
+
149
+ ### Description Compression (`compress_descriptions=True`)
150
+
151
+ Removes duplicate text, redundant whitespace, and empty sections without altering tool semantics:
152
+
153
+ ```python
154
+ toolkit = OpenAPIToolkit.from_url(url, compress_descriptions=True)
155
+ ```
156
+
157
+ ### Custom Overrides & Callbacks
158
+
159
+ Override descriptions for specific tools:
160
+
161
+ ```python
162
+ toolkit = OpenAPIToolkit.from_url(
163
+ url, tool_description_overrides={"get_works": "Search scholarly papers."}
164
+ )
165
+ ```
166
+
167
+ Or pass a custom builder callback:
168
+
169
+ ```python
170
+ def my_builder(operation):
171
+ return f"Execute {operation.name} on path {operation.path}."
172
+
173
+
174
+ toolkit = OpenAPIToolkit.from_url(url, description_builder=my_builder)
175
+ ```
176
+
177
+ ### Operation Filtering
178
+
179
+ Filter tools before they are created to reduce context window overhead:
180
+
181
+ ```python
182
+ # Filter by Tags
183
+ toolkit = OpenAPIToolkit.from_url(url, include_tags=["Works"], exclude_tags=["Admin"])
184
+
185
+ # Filter by Operations
186
+ toolkit = OpenAPIToolkit.from_url(
187
+ url, include_operations=["get_works"], exclude_operations=["delete_work"]
188
+ )
189
+ ```
190
+
191
+ ---
192
+
193
+ ## Architecture Pipeline
194
+
195
+ ```text
196
+ Swagger 2.0 / OpenAPI 3.x
197
+
198
+
199
+ Swagger Normalizer
200
+
201
+
202
+ Normalized OpenAPI Model
203
+
204
+
205
+ Existing Parser
206
+
207
+
208
+ Internal Operation Models
209
+
210
+
211
+ Schema Converter
212
+
213
+
214
+ HTTP Executor
215
+
216
+
217
+ LangChain StructuredTools
218
+ ```
@@ -0,0 +1,5 @@
1
+ # AsyncHTTPExecutor API Reference
2
+
3
+ ::: langchain_openapi_tools.executor.AsyncHTTPExecutor
4
+ ::: langchain_openapi_tools.executor.RequestBuilder
5
+ ::: langchain_openapi_tools.executor.ResponseParser
@@ -0,0 +1,3 @@
1
+ # OpenAPILoader API Reference
2
+
3
+ ::: langchain_openapi_tools.loader.OpenAPILoader
@@ -0,0 +1,8 @@
1
+ # Middleware API Reference
2
+
3
+ ::: langchain_openapi_tools.middleware.MiddlewarePipeline
4
+ ::: langchain_openapi_tools.middleware.RetryMiddleware
5
+ ::: langchain_openapi_tools.middleware.RateLimitMiddleware
6
+ ::: langchain_openapi_tools.middleware.CacheMiddleware
7
+ ::: langchain_openapi_tools.middleware.PaginationMiddleware
8
+ ::: langchain_openapi_tools.middleware.LoggingMiddleware
@@ -0,0 +1,4 @@
1
+ # OpenAPIParser API Reference
2
+
3
+ ::: langchain_openapi_tools.parser.OpenAPIParser
4
+ ::: langchain_openapi_tools.parser.ReferenceResolver
@@ -0,0 +1,4 @@
1
+ # OpenAPIToolkit API Reference
2
+
3
+ ::: langchain_openapi_tools.toolkit.OpenAPIToolkit
4
+ ::: langchain_openapi_tools.toolkit.LangChainToolFactory
@@ -11,7 +11,7 @@
11
11
  Injects an `Authorization: Bearer <TOKEN>` header.
12
12
 
13
13
  ```python
14
- from langchain_openapi import BearerAuthProvider, OpenAPIToolkit
14
+ from langchain_openapi_tools import BearerAuthProvider, OpenAPIToolkit
15
15
 
16
16
  toolkit = OpenAPIToolkit.from_url(
17
17
  "https://api.github.com/openapi",
@@ -24,7 +24,7 @@ toolkit = OpenAPIToolkit.from_url(
24
24
  Injects an API key in a designated request header.
25
25
 
26
26
  ```python
27
- from langchain_openapi import APIKeyHeaderProvider, OpenAPIToolkit
27
+ from langchain_openapi_tools import APIKeyHeaderProvider, OpenAPIToolkit
28
28
 
29
29
  toolkit = OpenAPIToolkit.from_url(
30
30
  "https://api.example.com/spec.json",
@@ -37,7 +37,7 @@ toolkit = OpenAPIToolkit.from_url(
37
37
  Appends an API key as a query parameter.
38
38
 
39
39
  ```python
40
- from langchain_openapi import APIKeyQueryProvider, OpenAPIToolkit
40
+ from langchain_openapi_tools import APIKeyQueryProvider, OpenAPIToolkit
41
41
 
42
42
  toolkit = OpenAPIToolkit.from_url(
43
43
  "https://api.example.com/spec.json",
@@ -50,7 +50,7 @@ toolkit = OpenAPIToolkit.from_url(
50
50
  Injects HTTP Basic Authentication credentials.
51
51
 
52
52
  ```python
53
- from langchain_openapi import BasicAuthProvider, OpenAPIToolkit
53
+ from langchain_openapi_tools import BasicAuthProvider, OpenAPIToolkit
54
54
 
55
55
  toolkit = OpenAPIToolkit.from_url(
56
56
  "https://api.example.com/spec.json",
@@ -65,7 +65,7 @@ toolkit = OpenAPIToolkit.from_url(
65
65
  Chain multiple request providers sequentially using `CompositeProvider`:
66
66
 
67
67
  ```python
68
- from langchain_openapi import (
68
+ from langchain_openapi_tools import (
69
69
  BearerAuthProvider,
70
70
  CompositeProvider,
71
71
  CookiesProvider,
@@ -8,7 +8,7 @@ This example demonstrates using `langchain-openapi` with the public [Crossref RE
8
8
 
9
9
  ```python
10
10
  import asyncio
11
- from langchain_openapi import OpenAPIToolkit, RetryMiddleware, LoggingMiddleware
11
+ from langchain_openapi_tools import OpenAPIToolkit, RetryMiddleware, LoggingMiddleware
12
12
 
13
13
 
14
14
  async def main():