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.
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/CHANGELOG.md +14 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/Makefile +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/PKG-INFO +108 -156
- langchain_openapi_tools-1.1.3/README.md +218 -0
- langchain_openapi_tools-1.1.3/docs/api/executor.md +5 -0
- langchain_openapi_tools-1.1.3/docs/api/loader.md +3 -0
- langchain_openapi_tools-1.1.3/docs/api/middleware.md +8 -0
- langchain_openapi_tools-1.1.3/docs/api/parser.md +4 -0
- langchain_openapi_tools-1.1.3/docs/api/toolkit.md +4 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/authentication.md +5 -5
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/examples/crossref.md +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/examples/petstore.md +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/index.md +1 -1
- langchain_openapi_tools-1.1.3/docs/installation.md +65 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/middleware.md +9 -5
- langchain_openapi_tools-1.1.3/docs/prompt_optimization.md +140 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/quickstart.md +2 -2
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/toolkit.md +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/crossref/main.py +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/petstore/main.py +1 -1
- langchain_openapi_tools-1.1.3/langchain_openapi/__init__.py +19 -0
- langchain_openapi_tools-1.1.3/langchain_openapi/py.typed +1 -0
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/__init__.py +15 -13
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/executor.py +14 -9
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/loader.py +4 -4
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/middleware.py +1 -1
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/models.py +1 -1
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/parser.py +5 -5
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/providers.py +1 -1
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/schema_converter.py +2 -2
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/swagger.py +21 -14
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/toolkit.py +205 -24
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/utils.py +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/mkdocs.yml +1 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/pyproject.toml +8 -3
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/404.html +35 -8
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/executor/index.html +270 -235
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/loader/index.html +69 -42
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/middleware/index.html +70 -43
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/parser/index.html +54 -27
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/api/toolkit/index.html +583 -464
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/architecture/index.html +36 -9
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/authentication/index.html +40 -13
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/contributing/index.html +35 -8
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/examples/crossref/index.html +36 -9
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/examples/petstore/index.html +36 -9
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/index.html +36 -9
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/installation/index.html +150 -16
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/middleware/index.html +55 -24
- langchain_openapi_tools-1.1.3/site/objects.inv +0 -0
- langchain_openapi_tools-1.1.3/site/prompt_optimization/index.html +1364 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/quickstart/index.html +38 -11
- langchain_openapi_tools-1.1.3/site/search/search_index.json +1 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/sitemap.xml +4 -0
- langchain_openapi_tools-1.1.3/site/sitemap.xml.gz +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/toolkit/index.html +36 -9
- langchain_openapi_tools-1.1.3/tests/test_compatibility.py +35 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_e2e.py +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_executor.py +1 -1
- langchain_openapi_tools-1.1.3/tests/test_import.py +6 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_loader.py +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_middleware.py +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_parser.py +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_providers.py +2 -2
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_resolver.py +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_schema_converter.py +1 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_swagger.py +33 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/tests/test_toolkit.py +137 -1
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/uv.lock +167 -1
- langchain_openapi_tools-1.0.2/README.md +0 -266
- langchain_openapi_tools-1.0.2/docs/api/executor.md +0 -5
- langchain_openapi_tools-1.0.2/docs/api/loader.md +0 -3
- langchain_openapi_tools-1.0.2/docs/api/middleware.md +0 -8
- langchain_openapi_tools-1.0.2/docs/api/parser.md +0 -4
- langchain_openapi_tools-1.0.2/docs/api/toolkit.md +0 -4
- langchain_openapi_tools-1.0.2/docs/installation.md +0 -40
- langchain_openapi_tools-1.0.2/site/objects.inv +0 -0
- langchain_openapi_tools-1.0.2/site/search/search_index.json +0 -1
- langchain_openapi_tools-1.0.2/site/sitemap.xml.gz +0 -0
- langchain_openapi_tools-1.0.2/tests/test_import.py +0 -6
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/dependabot.yml +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/workflows/ci.yml +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/workflows/pages.yml +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/workflows/publish.yml +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.github/workflows/release.yml +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.gitignore +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/.pre-commit-config.yaml +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/ARCHITECTURE.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/CODE_OF_CONDUCT.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/CONTRIBUTING.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/LICENSE +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/benchmarks/benchmark.py +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/architecture.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/docs/contributing.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/README.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/crossref/README.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/crossref/crossref.json +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/crossref/requirements.txt +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/petstore/README.md +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/petstore/petstore.json +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/examples/petstore/requirements.txt +0 -0
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/enums.py +0 -0
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/exceptions.py +0 -0
- {langchain_openapi_tools-1.0.2/langchain_openapi → langchain_openapi_tools-1.1.3/langchain_openapi_tools}/py.typed +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/_mkdocstrings.css +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/images/favicon.png +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/bundle.d7400e89.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/bundle.d7400e89.min.js.map +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ar.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.da.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.de.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.du.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.el.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.es.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.fi.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.fr.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.he.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.hi.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.hu.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.hy.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.it.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ja.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.jp.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.kn.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ko.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.multi.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.nl.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.no.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.pt.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ro.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ru.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.sa.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.sv.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.ta.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.te.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.th.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.tr.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.vi.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/min/lunr.zh.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/tinyseg.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/lunr/wordcut.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/workers/search.2c215733.min.js +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/javascripts/workers/search.2c215733.min.js.map +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/stylesheets/main.ec1eaa64.min.css +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/stylesheets/main.ec1eaa64.min.css.map +0 -0
- {langchain_openapi_tools-1.0.2 → langchain_openapi_tools-1.1.3}/site/assets/stylesheets/palette.ab4e12ef.min.css +0 -0
- {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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: langchain-openapi-tools
|
|
3
|
-
Version: 1.
|
|
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
|
|
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
|
|
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
|
|
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("
|
|
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
|
-
##
|
|
156
|
+
## Prompt Optimization & Tool Customization
|
|
164
157
|
|
|
165
|
-
|
|
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
|
-
|
|
160
|
+
### Configuration Object (`OpenAPIToolkitConfig`)
|
|
198
161
|
|
|
199
162
|
```python
|
|
200
|
-
from
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
209
|
-
|
|
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
|
-
|
|
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
|
-
|
|
221
|
-
|
|
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
|
-
|
|
229
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
199
|
+
Override descriptions for specific tools:
|
|
267
200
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
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
|
-
|
|
217
|
+
### Operation Filtering
|
|
291
218
|
|
|
292
|
-
|
|
219
|
+
Filter tools before they are created to reduce context window overhead:
|
|
293
220
|
|
|
294
|
-
```
|
|
295
|
-
#
|
|
296
|
-
|
|
221
|
+
```python
|
|
222
|
+
# Filter by Tags
|
|
223
|
+
toolkit = OpenAPIToolkit.from_url(url, include_tags=["Works"], exclude_tags=["Admin"])
|
|
297
224
|
|
|
298
|
-
#
|
|
299
|
-
|
|
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
|
-
##
|
|
233
|
+
## Architecture Pipeline
|
|
305
234
|
|
|
306
|
-
|
|
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,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
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
Injects an `Authorization: Bearer <TOKEN>` header.
|
|
12
12
|
|
|
13
13
|
```python
|
|
14
|
-
from
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
11
|
+
from langchain_openapi_tools import OpenAPIToolkit, RetryMiddleware, LoggingMiddleware
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
async def main():
|