langchain-dev-utils 1.4.3__tar.gz → 1.4.4__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 (185) hide show
  1. langchain_dev_utils-1.4.4/AGENTS.md +285 -0
  2. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/PKG-INFO +1 -1
  3. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/pyproject.toml +1 -1
  4. langchain_dev_utils-1.4.4/src/langchain_dev_utils/__init__.py +1 -0
  5. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/handoffs.py +23 -22
  6. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_handoffs_middleware.py +0 -4
  7. langchain_dev_utils-1.4.3/.cache/.gitignore +0 -1
  8. langchain_dev_utils-1.4.3/.cache/10132167963676728850 +0 -4
  9. langchain_dev_utils-1.4.3/.cache/10149277315986816452 +0 -119
  10. langchain_dev_utils-1.4.3/.cache/10212306112077623172 +0 -89
  11. langchain_dev_utils-1.4.3/.cache/10378751321322438463 +0 -4
  12. langchain_dev_utils-1.4.3/.cache/1040099908288978801 +0 -135
  13. langchain_dev_utils-1.4.3/.cache/104857451859860363 +0 -105
  14. langchain_dev_utils-1.4.3/.cache/10632936651036843898 +0 -105
  15. langchain_dev_utils-1.4.3/.cache/10750405311029893673 +0 -4
  16. langchain_dev_utils-1.4.3/.cache/11073118652123077588 +0 -27
  17. langchain_dev_utils-1.4.3/.cache/11097895064266833842 +0 -4
  18. langchain_dev_utils-1.4.3/.cache/1151792845744300718 +0 -4
  19. langchain_dev_utils-1.4.3/.cache/1189978746543437471 +0 -165
  20. langchain_dev_utils-1.4.3/.cache/12115012717975431373 +0 -4
  21. langchain_dev_utils-1.4.3/.cache/12206186549754547764 +0 -88
  22. langchain_dev_utils-1.4.3/.cache/12360634119973346056 +0 -89
  23. langchain_dev_utils-1.4.3/.cache/1269862585078162109 +0 -165
  24. langchain_dev_utils-1.4.3/.cache/12821160338097409528 +0 -4
  25. langchain_dev_utils-1.4.3/.cache/13062886706927887844 +0 -4
  26. langchain_dev_utils-1.4.3/.cache/13301246796564074464 +0 -27
  27. langchain_dev_utils-1.4.3/.cache/13301993342006977616 +0 -58
  28. langchain_dev_utils-1.4.3/.cache/1330248056645643292 +0 -104
  29. langchain_dev_utils-1.4.3/.cache/13348122375379064923 +0 -58
  30. langchain_dev_utils-1.4.3/.cache/1359679513868266359 +0 -4
  31. langchain_dev_utils-1.4.3/.cache/13625925199296545024 +0 -4
  32. langchain_dev_utils-1.4.3/.cache/13632211840061000323 +0 -4
  33. langchain_dev_utils-1.4.3/.cache/13746006243306193541 +0 -4
  34. langchain_dev_utils-1.4.3/.cache/13971100319460407517 +0 -88
  35. langchain_dev_utils-1.4.3/.cache/14028237667454951821 +0 -243
  36. langchain_dev_utils-1.4.3/.cache/14033072851579767670 +0 -119
  37. langchain_dev_utils-1.4.3/.cache/14250498158008610928 +0 -4
  38. langchain_dev_utils-1.4.3/.cache/14259959605703426807 +0 -349
  39. langchain_dev_utils-1.4.3/.cache/14293610541601779362 +0 -74
  40. langchain_dev_utils-1.4.3/.cache/14361141486053015390 +0 -89
  41. langchain_dev_utils-1.4.3/.cache/14815454888612538140 +0 -4
  42. langchain_dev_utils-1.4.3/.cache/14904030555725953776 +0 -4
  43. langchain_dev_utils-1.4.3/.cache/15025271566505243950 +0 -4
  44. langchain_dev_utils-1.4.3/.cache/15054227793547352075 +0 -990
  45. langchain_dev_utils-1.4.3/.cache/15065779533269950614 +0 -4
  46. langchain_dev_utils-1.4.3/.cache/15446496809880657661 +0 -27
  47. langchain_dev_utils-1.4.3/.cache/15617362476885904629 +0 -4
  48. langchain_dev_utils-1.4.3/.cache/15639173995710368854 +0 -349
  49. langchain_dev_utils-1.4.3/.cache/15762191716031596491 +0 -4
  50. langchain_dev_utils-1.4.3/.cache/1577969368081973692 +0 -243
  51. langchain_dev_utils-1.4.3/.cache/1628387613061272132 +0 -4
  52. langchain_dev_utils-1.4.3/.cache/16491517296573712344 +0 -990
  53. langchain_dev_utils-1.4.3/.cache/16493373299299360945 +0 -4
  54. langchain_dev_utils-1.4.3/.cache/16528442351413743144 +0 -135
  55. langchain_dev_utils-1.4.3/.cache/16541658010600719633 +0 -104
  56. langchain_dev_utils-1.4.3/.cache/16646829519153034812 +0 -4
  57. langchain_dev_utils-1.4.3/.cache/16655965899250654016 +0 -89
  58. langchain_dev_utils-1.4.3/.cache/16832445802116848894 +0 -4
  59. langchain_dev_utils-1.4.3/.cache/16946221993949941809 +0 -4
  60. langchain_dev_utils-1.4.3/.cache/17203959758206958699 +0 -4
  61. langchain_dev_utils-1.4.3/.cache/17290735391753493732 +0 -4
  62. langchain_dev_utils-1.4.3/.cache/17319573296851837531 +0 -4
  63. langchain_dev_utils-1.4.3/.cache/17688261241712087494 +0 -4
  64. langchain_dev_utils-1.4.3/.cache/17698060842036528324 +0 -194
  65. langchain_dev_utils-1.4.3/.cache/17787738391657669186 +0 -4
  66. langchain_dev_utils-1.4.3/.cache/18227580402014540144 +0 -379
  67. langchain_dev_utils-1.4.3/.cache/18303185967813561173 +0 -242
  68. langchain_dev_utils-1.4.3/.cache/1926719474267919111 +0 -4
  69. langchain_dev_utils-1.4.3/.cache/2076114625129041541 +0 -333
  70. langchain_dev_utils-1.4.3/.cache/2120755445008564656 +0 -4
  71. langchain_dev_utils-1.4.3/.cache/2172871625297495691 +0 -136
  72. langchain_dev_utils-1.4.3/.cache/229194999405881755 +0 -4
  73. langchain_dev_utils-1.4.3/.cache/2591743801418891565 +0 -4
  74. langchain_dev_utils-1.4.3/.cache/2633179503659950686 +0 -150
  75. langchain_dev_utils-1.4.3/.cache/2638619333707832110 +0 -243
  76. langchain_dev_utils-1.4.3/.cache/311072482334109094 +0 -4
  77. langchain_dev_utils-1.4.3/.cache/3114295214797897303 +0 -333
  78. langchain_dev_utils-1.4.3/.cache/3464700389800366053 +0 -502
  79. langchain_dev_utils-1.4.3/.cache/4043361625843815558 +0 -88
  80. langchain_dev_utils-1.4.3/.cache/4131672489284763215 +0 -379
  81. langchain_dev_utils-1.4.3/.cache/4227978977025071655 +0 -58
  82. langchain_dev_utils-1.4.3/.cache/4303146078529032033 +0 -4
  83. langchain_dev_utils-1.4.3/.cache/4556346579349859049 +0 -4
  84. langchain_dev_utils-1.4.3/.cache/4595382501822052434 +0 -4
  85. langchain_dev_utils-1.4.3/.cache/4643267776105670084 +0 -4
  86. langchain_dev_utils-1.4.3/.cache/4645903213388384790 +0 -150
  87. langchain_dev_utils-1.4.3/.cache/4772296789029058803 +0 -58
  88. langchain_dev_utils-1.4.3/.cache/4856685402689964555 +0 -4
  89. langchain_dev_utils-1.4.3/.cache/4911455497220962699 +0 -502
  90. langchain_dev_utils-1.4.3/.cache/4960916194268796790 +0 -242
  91. langchain_dev_utils-1.4.3/.cache/5004460099290458770 +0 -4
  92. langchain_dev_utils-1.4.3/.cache/5043685154627706733 +0 -4
  93. langchain_dev_utils-1.4.3/.cache/5058845702148423459 +0 -4
  94. langchain_dev_utils-1.4.3/.cache/5114803401124200986 +0 -4
  95. langchain_dev_utils-1.4.3/.cache/5240837403663904545 +0 -74
  96. langchain_dev_utils-1.4.3/.cache/5309181156679912115 +0 -4
  97. langchain_dev_utils-1.4.3/.cache/5573910617214598357 +0 -135
  98. langchain_dev_utils-1.4.3/.cache/5914983732650719802 +0 -4
  99. langchain_dev_utils-1.4.3/.cache/5936839346169779924 +0 -244
  100. langchain_dev_utils-1.4.3/.cache/6051440962903797706 +0 -135
  101. langchain_dev_utils-1.4.3/.cache/6070063779327491346 +0 -4
  102. langchain_dev_utils-1.4.3/.cache/6150574529172679001 +0 -4
  103. langchain_dev_utils-1.4.3/.cache/6185295689099300560 +0 -4
  104. langchain_dev_utils-1.4.3/.cache/6416288532933398693 +0 -4
  105. langchain_dev_utils-1.4.3/.cache/6576531235250061605 +0 -194
  106. langchain_dev_utils-1.4.3/.cache/6745059141823250635 +0 -136
  107. langchain_dev_utils-1.4.3/.cache/693530668503540423 +0 -244
  108. langchain_dev_utils-1.4.3/.cache/7021182865222058936 +0 -4
  109. langchain_dev_utils-1.4.3/.cache/7424125075635962609 +0 -88
  110. langchain_dev_utils-1.4.3/.cache/7426947316238206265 +0 -4
  111. langchain_dev_utils-1.4.3/.cache/7696708707823268237 +0 -4
  112. langchain_dev_utils-1.4.3/.cache/8031990660020224106 +0 -27
  113. langchain_dev_utils-1.4.3/.cache/8083270160335022657 +0 -4
  114. langchain_dev_utils-1.4.3/.cache/8185803444397491430 +0 -27
  115. langchain_dev_utils-1.4.3/.cache/9245913271089240062 +0 -4
  116. langchain_dev_utils-1.4.3/.cache/937151433542130939 +0 -4
  117. langchain_dev_utils-1.4.3/.cache/9638021948029599062 +0 -4
  118. langchain_dev_utils-1.4.3/.cache/9817124278980503833 +0 -27
  119. langchain_dev_utils-1.4.3/.cache/9974721629853791342 +0 -243
  120. langchain_dev_utils-1.4.3/AGENTS.md +0 -173
  121. langchain_dev_utils-1.4.3/src/langchain_dev_utils/__init__.py +0 -1
  122. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/.gitignore +0 -0
  123. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/.python-version +0 -0
  124. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/.vscode/settings.json +0 -0
  125. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/LICENSE +0 -0
  126. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/README.md +0 -0
  127. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/README_cn.md +0 -0
  128. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/_utils.py +0 -0
  129. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/__init__.py +0 -0
  130. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/factory.py +0 -0
  131. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/__init__.py +0 -0
  132. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/format_prompt.py +0 -0
  133. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/model_fallback.py +0 -0
  134. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/model_router.py +0 -0
  135. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/plan.py +0 -0
  136. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/summarization.py +0 -0
  137. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/tool_call_repair.py +0 -0
  138. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/tool_emulator.py +0 -0
  139. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/tool_selection.py +0 -0
  140. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/wrap.py +0 -0
  141. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/__init__.py +0 -0
  142. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/adapters/__init__.py +0 -0
  143. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/adapters/create_utils.py +0 -0
  144. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/adapters/openai_compatible.py +0 -0
  145. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/adapters/register_profiles.py +0 -0
  146. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/base.py +0 -0
  147. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/types.py +0 -0
  148. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/__init__.py +0 -0
  149. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/adapters/__init__.py +0 -0
  150. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/adapters/create_utils.py +0 -0
  151. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/adapters/openai_compatible.py +0 -0
  152. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/base.py +0 -0
  153. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/graph/__init__.py +0 -0
  154. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/graph/parallel.py +0 -0
  155. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/graph/sequential.py +0 -0
  156. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/graph/types.py +0 -0
  157. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/message_convert/__init__.py +0 -0
  158. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/message_convert/content.py +0 -0
  159. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/message_convert/format.py +0 -0
  160. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/pipeline/__init__.py +0 -0
  161. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/pipeline/parallel.py +0 -0
  162. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/pipeline/sequential.py +0 -0
  163. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/pipeline/types.py +0 -0
  164. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/py.typed +0 -0
  165. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/tool_calling/__init__.py +0 -0
  166. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/tool_calling/human_in_the_loop.py +0 -0
  167. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/tool_calling/utils.py +0 -0
  168. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/__init__.py +0 -0
  169. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_agent.py +0 -0
  170. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_chat_models.py +0 -0
  171. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_embedding.py +0 -0
  172. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_graph.py +0 -0
  173. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_human_in_the_loop.py +0 -0
  174. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_load_embbeding.py +0 -0
  175. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_load_model.py +0 -0
  176. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_messages.py +0 -0
  177. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_model_tool_emulator.py +0 -0
  178. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_plan_middleware.py +0 -0
  179. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_router_model.py +0 -0
  180. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_tool_call_repair.py +0 -0
  181. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_tool_calling.py +0 -0
  182. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_wrap_agent.py +0 -0
  183. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/utils/__init__.py +0 -0
  184. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/utils/register.py +0 -0
  185. {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/uv.lock +0 -0
@@ -0,0 +1,285 @@
1
+ # Agentic Coding Guidelines for langchain-dev-utils
2
+
3
+ This file provides guidelines for AI agents working in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ A Python utility library for LangChain and LangGraph development. Uses hatchling build system, uv for package management, ruff for linting, and pytest for testing.
8
+
9
+ **Current Version:** 1.4.4
10
+
11
+ ---
12
+
13
+ ## Build/Lint/Test Commands
14
+
15
+ ### Package Management (uv)
16
+ ```bash
17
+ # Install dependencies
18
+ uv sync
19
+
20
+ # Install with optional dependencies
21
+ uv sync --extra standard
22
+
23
+ # Install dev dependencies
24
+ uv sync --group dev
25
+
26
+ # Install test dependencies
27
+ uv sync --group tests
28
+
29
+ # Install docs dependencies
30
+ uv sync --group docs
31
+ ```
32
+
33
+ ### Linting & Formatting (ruff)
34
+ ```bash
35
+ # Check linting
36
+ uv run ruff check .
37
+
38
+ # Check specific file
39
+ uv run ruff check src/langchain_dev_utils/path/to/file.py
40
+
41
+ # Fix auto-fixable issues
42
+ uv run ruff check --fix .
43
+
44
+ # Format code
45
+ uv run ruff format .
46
+
47
+ # Format specific file
48
+ uv run ruff format src/langchain_dev_utils/path/to/file.py
49
+ ```
50
+
51
+ ### Testing (pytest)
52
+ ```bash
53
+ # Run all tests
54
+ uv run pytest
55
+
56
+ # Run with verbose output
57
+ uv run pytest -v
58
+
59
+ # Run specific test file
60
+ uv run pytest tests/test_agent.py
61
+
62
+ # Run specific test function
63
+ uv run pytest tests/test_agent.py::test_prebuilt_agent
64
+
65
+ # Run specific test class
66
+ uv run pytest tests/test_chat_models.py::TestImageProcessing
67
+
68
+ # Run with asyncio support (automatically configured)
69
+ uv run pytest -s
70
+
71
+ # Run tests matching pattern
72
+ uv run pytest -k "test_load"
73
+ ```
74
+
75
+ ### Build
76
+ ```bash
77
+ # Build package
78
+ uv build
79
+
80
+ # Build wheel only
81
+ uv build --wheel
82
+ ```
83
+
84
+ ### Documentation
85
+ ```bash
86
+ # Serve docs locally
87
+ mkdocs serve
88
+
89
+ # Build docs
90
+ mkdocs build
91
+
92
+ # Deploy docs
93
+ mkdocs gh-deploy
94
+ ```
95
+
96
+ ---
97
+
98
+ ## Code Style Guidelines
99
+
100
+ ### Imports
101
+ - Use absolute imports for external packages
102
+ - Use relative imports within the package (e.g., `from ..chat_models import ...`)
103
+ - Group imports: stdlib → third-party → local
104
+ - Ruff handles import sorting automatically
105
+
106
+ ### Type Hints
107
+ - Use type hints for all function parameters and return types
108
+ - Use `Optional[Type]` or `Type | None` for nullable types (both acceptable)
109
+ - Use `Any` sparingly and only when necessary
110
+ - Use `Sequence`, `Mapping` for generic collections
111
+ - Use generics with TypeVars where appropriate
112
+
113
+ ### Naming Conventions
114
+ - `snake_case` for functions, methods, variables
115
+ - `PascalCase` for classes
116
+ - `UPPER_CASE` for constants
117
+ - `_leading_underscore` for private/internal functions
118
+ - Leading double underscore for name mangling when needed
119
+
120
+ ### Docstrings
121
+ - Use Google-style docstrings
122
+ - Include Args, Returns, Raises sections for public functions
123
+ - Include Examples section for complex functions
124
+ - Keep docstrings under 100 characters per line when possible
125
+
126
+ ### Code Structure
127
+ - Maximum line length: 88 characters (ruff enforces, E501 ignored)
128
+ - Use trailing commas in multi-line structures
129
+ - Two blank lines between top-level functions/classes
130
+ - One blank line between methods
131
+
132
+ ### Error Handling
133
+ - Use specific exception types, not bare `except:`
134
+ - Provide descriptive error messages with f-strings
135
+ - Use `raise ValueError(msg)` pattern with descriptive messages
136
+ - Avoid bare `raise` statements
137
+
138
+ ### Async Code
139
+ - Use `pytest.mark.asyncio` for async test functions
140
+ - Use `async`/`await` consistently
141
+ - Prefer `asyncio` primitives from standard library
142
+
143
+ ### Ruff Configuration
144
+ - Enabled rules: E, F, I, PGH003, T201
145
+ - Import sorting (I) is enforced
146
+ - No print statements in production code (T201)
147
+
148
+ ---
149
+
150
+ ## Testing Guidelines
151
+
152
+ - Tests live in `tests/` directory
153
+ - Test files named `test_*.py`
154
+ - Test functions named `test_*`
155
+ - Use pytest fixtures for setup/teardown
156
+ - Use `pytest.mark.asyncio` for async tests
157
+ - Mock external API calls in unit tests
158
+ - Integration tests use actual APIs (marked implicitly by test names)
159
+ - Tests use `langchain-tests` for standard integration test suites
160
+
161
+ ---
162
+
163
+ ## Project Structure
164
+
165
+ ```
166
+ langchain-dev-utils/
167
+ ├── src/langchain_dev_utils/ # Source code
168
+ │ ├── agents/ # Agent utilities
169
+ │ │ ├── factory.py # Agent creation functions
170
+ │ │ ├── wrap.py # Agent wrapping utilities
171
+ │ │ └── middleware/ # Agent middleware components
172
+ │ │ ├── format_prompt.py # Format prompt middleware
173
+ │ │ ├── handoffs.py # Multi-agent handoff middleware
174
+ │ │ ├── model_fallback.py # Model fallback middleware
175
+ │ │ ├── model_router.py # Model routing middleware
176
+ │ │ ├── plan.py # Planning middleware
177
+ │ │ ├── summarization.py # Message summarization middleware
178
+ │ │ ├── tool_call_repair.py # Tool call repair middleware
179
+ │ │ ├── tool_emulator.py # LLM tool emulator middleware
180
+ │ │ └── tool_selection.py # LLM tool selector middleware
181
+ │ ├── chat_models/ # Chat model utilities
182
+ │ │ ├── base.py # Base chat model classes
183
+ │ │ ├── types.py # Type definitions
184
+ │ │ └── adapters/ # Model provider adapters
185
+ │ ├── embeddings/ # Embedding utilities
186
+ │ │ ├── base.py # Base embedding classes
187
+ │ │ └── adapters/ # Embedding provider adapters
188
+ │ ├── graph/ # Graph utilities
189
+ │ │ ├── parallel.py # Parallel graph construction
190
+ │ │ ├── sequential.py # Sequential graph construction
191
+ │ │ └── types.py # Graph type definitions
192
+ │ ├── message_convert/ # Message conversion utilities
193
+ │ │ ├── content.py # Content conversion
194
+ │ │ └── format.py # Message formatting
195
+ │ ├── pipeline/ # Pipeline utilities (deprecated since v1.4.0, will be removed in v1.5.0)
196
+ │ │ ├── parallel.py
197
+ │ │ ├── sequential.py
198
+ │ │ └── types.py
199
+ │ └── tool_calling/ # Tool calling utilities
200
+ │ ├── human_in_the_loop.py # Human review functionality
201
+ │ └── utils.py # Tool calling utilities
202
+ ├── tests/ # Test files
203
+ ├── docs/ # Documentation (MkDocs)
204
+ │ ├── en/ # English documentation
205
+ │ └── zh/ # Chinese documentation
206
+ ├── pyproject.toml # Project configuration
207
+ ├── uv.lock # Dependency lock file
208
+ └── mkdocs.yml # MkDocs configuration
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Middleware Components
214
+
215
+ The `agents.middleware` module provides reusable middleware components for agent enhancement:
216
+
217
+ | Middleware | Purpose |
218
+ |------------|---------|
219
+ | `SummarizationMiddleware` | Summarizes long message histories |
220
+ | `LLMToolSelectorMiddleware` | Uses LLM to select appropriate tools |
221
+ | `PlanMiddleware` | Adds planning capabilities to agents |
222
+ | `ModelFallbackMiddleware` | Provides fallback to alternative models |
223
+ | `LLMToolEmulator` | Emulates tool calling for models without native support |
224
+ | `ModelRouterMiddleware` | Routes requests to different models based on criteria |
225
+ | `ToolCallRepairMiddleware` | Repairs malformed tool calls |
226
+ | `FormatPromptMiddleware` | Formats prompts with templates |
227
+ | `HandoffAgentMiddleware` | Enables multi-agent handoff workflows |
228
+
229
+ ---
230
+
231
+ ## Dependencies
232
+
233
+ ### Core Dependencies
234
+ - `langchain>=1.2.0` - LangChain framework
235
+ - `langchain-core>=1.2.5` - Core LangChain components
236
+ - `langgraph>=1.0.0` - LangGraph for graph-based workflows
237
+
238
+ ### Optional Dependencies (standard)
239
+ - `jinja2>=3.1.6` - Template engine for prompt formatting
240
+ - `json-repair>=0.53.1` - JSON repair utilities
241
+ - `langchain-openai` - OpenAI integration
242
+
243
+ ### Dev Dependencies
244
+ - `langchain-model-profiles>=0.0.5` - Model profile management
245
+ - `ruff>=0.14.5` - Linting and formatting
246
+
247
+ ### Docs Dependencies
248
+ - `jupyter>=1.1.1` - Jupyter notebook support
249
+ - `mkdocs-material>=9.7.0` - Material theme for MkDocs
250
+ - `mkdocs-static-i18n>=1.3.0` - Internationalization support
251
+
252
+ ### Test Dependencies
253
+ - `python-dotenv>=1.1.1` - Environment variable management
254
+ - `langchain-tests>=1.0.0` - Standard LangChain test suite
255
+ - `langchain-deepseek>=1.0.0` - DeepSeek model integration
256
+ - `langchain-qwq>=0.3.0` - QwQ model integration
257
+ - `langchain-ollama>=1.0.0` - Ollama integration
258
+ - `langchain-community>=0.4.1` - Community model integrations
259
+ - `dashscope>=1.25.12` - Alibaba DashScope integration
260
+
261
+ **Python version:** >=3.11
262
+
263
+ ---
264
+
265
+ ## Documentation
266
+
267
+ - Documentation is built with MkDocs using the Material theme
268
+ - Supports internationalization (English and Chinese)
269
+ - Hosted at: https://tbice123123.github.io/langchain-dev-utils/
270
+ - Source files located in `docs/en/` and `docs/zh/`
271
+
272
+ ---
273
+
274
+ ## Release Checklist
275
+
276
+ When preparing a new release:
277
+
278
+ 1. Update version in `src/langchain_dev_utils/__init__.py`
279
+ 2. Update version in `pyproject.toml` if needed
280
+ 3. Run full test suite: `uv run pytest`
281
+ 4. Run linting: `uv run ruff check .`
282
+ 5. Run formatting: `uv run ruff format .`
283
+ 6. Build package: `uv build`
284
+ 7. Update documentation if needed
285
+ 8. Tag release in git
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langchain-dev-utils
3
- Version: 1.4.3
3
+ Version: 1.4.4
4
4
  Summary: A practical utility library for LangChain and LangGraph development
5
5
  Project-URL: Source Code, https://github.com/TBice123123/langchain-dev-utils
6
6
  Project-URL: repository, https://github.com/TBice123123/langchain-dev-utils
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langchain-dev-utils"
3
- version = "1.4.3"
3
+ version = "1.4.4"
4
4
  description = "A practical utility library for LangChain and LangGraph development"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "tiebingice", email = "tiebingice123@outlook.com" }]
@@ -0,0 +1 @@
1
+ __version__ = "1.4.4"
@@ -25,14 +25,16 @@ class AgentConfig(TypedDict):
25
25
  handoffs: list[str] | Literal["all"]
26
26
 
27
27
 
28
- def _create_handoffs_tool(agent_name: str, tool_description: Optional[str] = None):
28
+ def _create_handoffs_tool(
29
+ agent_name: str, tool_description: Optional[str] = None
30
+ ) -> BaseTool:
29
31
  """Create a tool for handoffs to a specified agent.
30
32
 
31
33
  Args:
32
34
  agent_name (str): The name of the agent to transfer to.
33
35
 
34
36
  Returns:
35
- BaseTool: A tool instance for handoffs to the specified agent.
37
+ BaseTool: The tool instance for handoffs to the specified agent.
36
38
  """
37
39
 
38
40
  tool_name = f"transfer_to_{agent_name}"
@@ -67,13 +69,13 @@ def _get_default_active_agent(state: dict[str, AgentConfig]) -> Optional[str]:
67
69
 
68
70
  def _transform_agent_config(
69
71
  config: dict[str, AgentConfig],
70
- handoffs_tools: list[BaseTool],
72
+ handoffs_tool_map: dict[str, BaseTool],
71
73
  ) -> dict[str, AgentConfig]:
72
74
  """Transform the agent config to add handoffs tools.
73
75
 
74
76
  Args:
75
77
  config (dict[str, AgentConfig]): The agent config.
76
- handoffs_tools (list[BaseTool]): The list of handoffs tools.
78
+ handoffs_tool_map (dict[str, BaseTool]): The dict of {agent name: handoffs tool}.
77
79
 
78
80
  Returns:
79
81
  dict[str, AgentConfig]: The transformed agent config.
@@ -96,8 +98,8 @@ def _transform_agent_config(
96
98
  if handoffs == "all":
97
99
  handoff_tools = [
98
100
  handoff_tool
99
- for handoff_tool in handoffs_tools
100
- if handoff_tool.name != f"transfer_to_{agent_name}"
101
+ for transfer_to_agent, handoff_tool in handoffs_tool_map.items()
102
+ if transfer_to_agent != agent_name
101
103
  ]
102
104
  else:
103
105
  if not isinstance(handoffs, list):
@@ -105,14 +107,13 @@ def _transform_agent_config(
105
107
  f"handoffs for agent {agent_name} must be a list of agent names or 'all'"
106
108
  )
107
109
 
110
+ if agent_name in handoffs:
111
+ raise ValueError(f"agent {agent_name} cannot handoff to itself")
112
+
108
113
  handoff_tools = [
109
114
  handoff_tool
110
- for handoff_tool in handoffs_tools
111
- if handoff_tool.name
112
- in [
113
- f"transfer_to_{_handoff_agent_name}"
114
- for _handoff_agent_name in handoffs
115
- ]
115
+ for transfer_to_agent, handoff_tool in handoffs_tool_map.items()
116
+ if transfer_to_agent in handoffs
116
117
  ]
117
118
 
118
119
  new_config[agent_name]["tools"] = [
@@ -158,28 +159,28 @@ class HandoffAgentMiddleware(AgentMiddleware):
158
159
  if handoffs_tool_overrides is None:
159
160
  handoffs_tool_overrides = {}
160
161
 
161
- handoffs_tools = []
162
+ handoffs_tool_map = {}
163
+
162
164
  for agent_name in agents_config.keys():
163
165
  if not handoffs_tool_overrides.get(agent_name):
164
- handoffs_tools.append(
165
- _create_handoffs_tool(
166
- agent_name,
167
- custom_handoffs_tool_descriptions.get(agent_name),
168
- )
166
+ handoffs_tool_map[agent_name] = _create_handoffs_tool(
167
+ agent_name,
168
+ custom_handoffs_tool_descriptions.get(agent_name),
169
169
  )
170
+
170
171
  else:
171
- handoffs_tools.append(
172
- cast(BaseTool, handoffs_tool_overrides.get(agent_name))
172
+ handoffs_tool_map[agent_name] = cast(
173
+ BaseTool, handoffs_tool_overrides.get(agent_name)
173
174
  )
174
175
 
175
176
  self.default_agent_name = default_agent_name
176
177
  self.agents_config = _transform_agent_config(
177
178
  agents_config,
178
- handoffs_tools,
179
+ handoffs_tool_map,
179
180
  )
180
181
 
181
182
  all_tools = [
182
- *handoffs_tools,
183
+ *handoffs_tool_map.values(),
183
184
  ]
184
185
 
185
186
  for agent_name in agents_config:
@@ -136,10 +136,6 @@ async def test_handoffs_middleware_async():
136
136
  handoffs_tool_overrides=handoffs_tool_map,
137
137
  )
138
138
  ],
139
- tools=[
140
- get_current_time,
141
- run_code,
142
- ],
143
139
  checkpointer=InMemorySaver(),
144
140
  )
145
141
 
@@ -1 +0,0 @@
1
- *
@@ -1,4 +0,0 @@
1
- {
2
- "data": "\r\n<!doctype html>\r\n<html lang=\"zh\" class=\"no-js\">\r\n <head>\r\n \r\n <meta charset=\"utf-8\">\r\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\r\n \r\n \r\n \r\n <link rel=\"canonical\" href=\"https://tbice123123.github.io/langchain-dev-utils/en/adavance-guide/openai-compatible/embedding/\">\r\n \r\n \r\n \r\n \r\n \r\n <link rel=\"alternate\" href=\"/en/\" hreflang=\"en\">\r\n \r\n <link rel=\"alternate\" href=\"/zh/\" hreflang=\"zh\">\r\n \r\n \r\n \r\n <link rel=\"icon\" href=\"../../../../assets/images/favicon.png\">\r\n <meta name=\"generator\" content=\"zensical-0.0.21\">\r\n \r\n \r\n \r\n <title>Creation and Usage of Embedding Models - Langchain Dev Utils</title>\r\n \r\n \r\n \r\n \r\n \r\n \r\n <link rel=\"stylesheet\" href=\"../../../../assets/stylesheets/modern/main.f28b7ce3.min.css\">\r\n \r\n \r\n \r\n \r\n <link rel=\"stylesheet\" href=\"../../../../assets/stylesheets/modern/palette.dfe2e883.min.css\">\r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\r\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback\">\r\n <style>:root{--md-text-font:\"Inter\";--md-code-font:\"JetBrains Mono\"}</style>\r\n \r\n \r\n \r\n <script>__md_scope=new URL(\"../../../..\",location),__md_hash=e=>[...e].reduce(((e,t)=>(e<<5)-e+t.charCodeAt(0)),0),__md_get=(e,t=localStorage,a=__md_scope)=>JSON.parse(t.getItem(a.pathname+\".\"+e)),__md_set=(e,t,a=localStorage,_=__md_scope)=>{try{a.setItem(_.pathname+\".\"+e,JSON.stringify(t))}catch(e){}},document.documentElement.setAttribute(\"data-platform\",navigator.platform)</script>\r\n \r\n \r\n\r\n \r\n \r\n </head>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"light-blue\" data-md-color-accent=\"light-blue\">\r\n \r\n \r\n <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\r\n <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\r\n <label class=\"md-overlay\" for=\"__drawer\"></label>\r\n <div data-md-component=\"skip\">\r\n \r\n \r\n <a href=\"#creation-and-usage-of-embedding-models\" class=\"md-skip\">\r\n 跳转至\r\n </a>\r\n \r\n </div>\r\n <div data-md-component=\"announce\">\r\n \r\n </div>\r\n \r\n \r\n \r\n\r\n<header class=\"md-header\" data-md-component=\"header\">\r\n <nav class=\"md-header__inner md-grid\" aria-label=\"页眉\">\r\n <a href=\"../../../../index.md\" title=\"Langchain Dev Utils\" class=\"md-header__button md-logo\" aria-label=\"Langchain Dev Utils\" data-md-component=\"logo\">\r\n \r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-book-open\" viewBox=\"0 0 24 24\"><path d=\"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>\r\n\r\n </a>\r\n <label class=\"md-header__button md-icon\" for=\"__drawer\">\r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-menu\" viewBox=\"0 0 24 24\"><path d=\"M4 5h16M4 12h16M4 19h16\"/></svg>\r\n </label>\r\n <div class=\"md-header__title\" data-md-component=\"header-title\">\r\n <div class=\"md-header__ellipsis\">\r\n <div class=\"md-header__topic\">\r\n <span class=\"md-ellipsis\">\r\n Langchain Dev Utils\r\n </span>\r\n </div>\r\n <div class=\"md-header__topic\" data-md-component=\"header-topic\">\r\n <span class=\"md-ellipsis\">\r\n \r\n Creation and Usage of Embedding Models\r\n \r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n <form class=\"md-header__option\" data-md-component=\"palette\">\r\n \r\n \r\n \r\n \r\n <input class=\"md-option\" data-md-color-media=\"none\" data-md-color-scheme=\"default\" data-md-color-primary=\"light-blue\" data-md-color-accent=\"light-blue\" aria-label=\"切换到深色模式\" type=\"radio\" name=\"__palette\" id=\"__palette_0\">\r\n \r\n <label class=\"md-header__button md-icon\" title=\"切换到深色模式\" for=\"__palette_1\" hidden>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z\"/></svg>\r\n </label>\r\n \r\n \r\n \r\n \r\n \r\n <input class=\"md-option\" data-md-color-media=\"none\" data-md-color-scheme=\"slate\" data-md-color-primary=\"light-blue\" data-md-color-accent=\"light-blue\" aria-label=\"切换到浅色模式\" type=\"radio\" name=\"__palette\" id=\"__palette_1\">\r\n \r\n <label class=\"md-header__button md-icon\" title=\"切换到浅色模式\" for=\"__palette_0\" hidden>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z\"/></svg>\r\n </label>\r\n \r\n \r\n</form>\r\n \r\n \r\n \r\n <script>var palette=__md_get(\"__palette\");if(palette&&palette.color){if(\"(prefers-color-scheme)\"===palette.color.media){var media=matchMedia(\"(prefers-color-scheme: light)\"),input=document.querySelector(media.matches?\"[data-md-color-media='(prefers-color-scheme: light)']\":\"[data-md-color-media='(prefers-color-scheme: dark)']\");palette.color.media=input.getAttribute(\"data-md-color-media\"),palette.color.scheme=input.getAttribute(\"data-md-color-scheme\"),palette.color.primary=input.getAttribute(\"data-md-color-primary\"),palette.color.accent=input.getAttribute(\"data-md-color-accent\")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute(\"data-md-color-\"+key,value)}</script>\r\n \r\n \r\n <div class=\"md-header__option\">\r\n <div class=\"md-select\">\r\n \r\n <button class=\"md-header__button md-icon\" aria-label=\"选择当前语言\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-languages\" viewBox=\"0 0 24 24\"><path d=\"m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6\"/></svg>\r\n </button>\r\n <div class=\"md-select__inner\">\r\n <ul class=\"md-select__list\">\r\n \r\n <li class=\"md-select__item\">\r\n <a href=\"/en/\" hreflang=\"en\" class=\"md-select__link\">\r\n English\r\n </a>\r\n </li>\r\n \r\n <li class=\"md-select__item\">\r\n <a href=\"/zh/\" hreflang=\"zh\" class=\"md-select__link\">\r\n 简体中文\r\n </a>\r\n </li>\r\n \r\n </ul>\r\n </div>\r\n </div>\r\n</div>\r\n \r\n \r\n \r\n \r\n <label class=\"md-header__button md-icon\" for=\"__search\">\r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-search\" viewBox=\"0 0 24 24\"><path d=\"m21 21-4.34-4.34\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/></svg>\r\n </label>\r\n <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\" aria-label=\"查找\">\r\n <button type=\"button\" class=\"md-search__button\">\r\n 查找\r\n </button>\r\n</div>\r\n \r\n \r\n <div class=\"md-header__source\">\r\n \r\n <a href=\"https://github.com/tbice123123/langchain-dev-utils\" title=\"前往仓库\" class=\"md-source\" data-md-component=\"source\">\r\n <div class=\"md-source__icon md-icon\">\r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill=\"currentColor\" d=\"M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4\"/></svg>\r\n </div>\r\n <div class=\"md-source__repository\">\r\n tbice123123/langchain-dev-utils\r\n </div>\r\n</a>\r\n \r\n </div>\r\n </nav>\r\n \r\n</header>\r\n \r\n <div class=\"md-container\" data-md-component=\"container\">\r\n \r\n \r\n \r\n \r\n \r\n<nav class=\"md-tabs\" aria-label=\"标签\" data-md-component=\"tabs\">\r\n <div class=\"md-grid\">\r\n <ul class=\"md-tabs__list\">\r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-tabs__item\">\r\n <a href=\"../../../../index.md\" class=\"md-tabs__link\">\r\n \r\n \r\n Overview\r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-tabs__item\">\r\n <a href=\"../../../../getting-started-guide/installation.md\" class=\"md-tabs__link\">\r\n \r\n \r\n Getting Started\r\n\r\n </a>\r\n </li>\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-tabs__item\">\r\n <a href=\"../../../../adavance-guide/openai-compatible/overview.md\" class=\"md-tabs__link\">\r\n \r\n \r\n Advanced Guides\r\n\r\n </a>\r\n </li>\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-tabs__item\">\r\n <a href=\"../../../../api-reference/overview.md\" class=\"md-tabs__link\">\r\n \r\n \r\n API Reference\r\n\r\n </a>\r\n </li>\r\n \r\n \r\n\r\n \r\n </ul>\r\n </div>\r\n</nav>\r\n \r\n \r\n \r\n <main class=\"md-main\" data-md-component=\"main\">\r\n <div class=\"md-main__inner md-grid\">\r\n \r\n \r\n \r\n <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\r\n <div class=\"md-sidebar__scrollwrap\">\r\n <div class=\"md-sidebar__inner\">\r\n \r\n\r\n\r\n \r\n\r\n\r\n<nav class=\"md-nav md-nav--primary md-nav--lifted\" aria-label=\"导航栏\" data-md-level=\"0\">\r\n <label class=\"md-nav__title\" for=\"__drawer\">\r\n <a href=\"../../../../index.md\" title=\"Langchain Dev Utils\" class=\"md-nav__button md-logo\" aria-label=\"Langchain Dev Utils\" data-md-component=\"logo\">\r\n \r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-book-open\" viewBox=\"0 0 24 24\"><path d=\"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>\r\n\r\n </a>\r\n Langchain Dev Utils\r\n </label>\r\n \r\n <div class=\"md-nav__source\">\r\n <a href=\"https://github.com/tbice123123/langchain-dev-utils\" title=\"前往仓库\" class=\"md-source\" data-md-component=\"source\">\r\n <div class=\"md-source__icon md-icon\">\r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill=\"currentColor\" d=\"M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4\"/></svg>\r\n </div>\r\n <div class=\"md-source__repository\">\r\n tbice123123/langchain-dev-utils\r\n </div>\r\n</a>\r\n </div>\r\n \r\n <ul class=\"md-nav__list\" data-md-scrollfix>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../index.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Overview\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item md-nav__item--nested\">\r\n \r\n \r\n \r\n \r\n \r\n <input class=\"md-nav__toggle md-toggle md-toggle--indeterminate\" type=\"checkbox\" id=\"__nav_2\" >\r\n \r\n \r\n <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Getting Started\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n </label>\r\n \r\n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\r\n <label class=\"md-nav__title\" for=\"__nav_2\">\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n \r\n \r\n Getting Started\r\n \r\n\r\n </label>\r\n <ul class=\"md-nav__list\" data-md-scrollfix>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../getting-started-guide/installation.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Installation\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../getting-started-guide/chat.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Chat Model Management\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../getting-started-guide/embedding.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Embedding Model Management\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../getting-started-guide/format.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Formatting Sequences\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../getting-started-guide/message.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Message Processing\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../getting-started-guide/tool.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Tool Calling Processing\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../getting-started-guide/human-in-the-loop.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Add Human-in-the-Loop Support in Tool Calling\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n </ul>\r\n </nav>\r\n \r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item md-nav__item--nested\">\r\n \r\n \r\n \r\n \r\n \r\n <input class=\"md-nav__toggle md-toggle md-toggle--indeterminate\" type=\"checkbox\" id=\"__nav_3\" >\r\n \r\n \r\n <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Advanced Guides\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n </label>\r\n \r\n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\r\n <label class=\"md-nav__title\" for=\"__nav_3\">\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n \r\n \r\n Advanced Guides\r\n \r\n\r\n </label>\r\n <ul class=\"md-nav__list\" data-md-scrollfix>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item md-nav__item--nested\">\r\n \r\n \r\n \r\n \r\n \r\n <input class=\"md-nav__toggle md-toggle md-toggle--indeterminate\" type=\"checkbox\" id=\"__nav_3_1\" >\r\n \r\n \r\n <label class=\"md-nav__link\" for=\"__nav_3_1\" id=\"__nav_3_1_label\" tabindex=\"0\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n OpenAI Compatible API Integration\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n </label>\r\n \r\n <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_1_label\" aria-expanded=\"false\">\r\n <label class=\"md-nav__title\" for=\"__nav_3_1\">\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n \r\n \r\n OpenAI Compatible API Integration\r\n \r\n\r\n </label>\r\n <ul class=\"md-nav__list\" data-md-scrollfix>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/openai-compatible/overview.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Overview\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/openai-compatible/chat.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Creating and Using Chat Models\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/openai-compatible/embedding.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Creating and Using Embedding Models\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/openai-compatible/register.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Integration with Model Management\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n </ul>\r\n </nav>\r\n \r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item md-nav__item--nested\">\r\n \r\n \r\n \r\n \r\n \r\n <input class=\"md-nav__toggle md-toggle md-toggle--indeterminate\" type=\"checkbox\" id=\"__nav_3_2\" >\r\n \r\n \r\n <label class=\"md-nav__link\" for=\"__nav_3_2\" id=\"__nav_3_2_label\" tabindex=\"0\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Middleware\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n </label>\r\n \r\n <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_2_label\" aria-expanded=\"false\">\r\n <label class=\"md-nav__title\" for=\"__nav_3_2\">\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n \r\n \r\n Middleware\r\n \r\n\r\n </label>\r\n <ul class=\"md-nav__list\" data-md-scrollfix>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/middleware/overview.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Overview\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/middleware/plan.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Task Planning\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/middleware/router.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Model Routing\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/middleware/handoffs.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Agent Handoff\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/middleware/tool-call-repair.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Tool Call Repair\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/middleware/format.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Format System Prompts\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/middleware/official.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n LangChain Built-in Middleware Extensions\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n </ul>\r\n </nav>\r\n \r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/multi-agent.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Subagent Tools (Agent as Tool)\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../adavance-guide/graph.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Prebuilt State-Graph Building Functions\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n </ul>\r\n </nav>\r\n \r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item md-nav__item--nested\">\r\n \r\n \r\n \r\n \r\n \r\n <input class=\"md-nav__toggle md-toggle md-toggle--indeterminate\" type=\"checkbox\" id=\"__nav_4\" >\r\n \r\n \r\n <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n API Reference\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n </label>\r\n \r\n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\r\n <label class=\"md-nav__title\" for=\"__nav_4\">\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n \r\n \r\n API Reference\r\n \r\n\r\n </label>\r\n <ul class=\"md-nav__list\" data-md-scrollfix>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../api-reference/overview.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Overview\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../api-reference/chat.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Chat Model Management\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../api-reference/embedding.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Embedding Model Management\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../api-reference/format.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Formatting Sequences\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../api-reference/message.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Message Processing\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../api-reference/tool.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Tool Calling Processing\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"../../../../api-reference/human-in-the-loop.md\" class=\"md-nav__link\">\r\n \r\n \r\n \r\n <span class=\"md-ellipsis\">\r\n \r\n \r\n Add Human-in-the-Loop Support in Tool Calling\r\n \r\n\r\n \r\n </span>\r\n \r\n \r\n\r\n </a>\r\n </li>\r\n \r\n\r\n \r\n \r\n </ul>\r\n </nav>\r\n \r\n </li>\r\n \r\n\r\n \r\n </ul>\r\n</nav>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\r\n <div class=\"md-sidebar__scrollwrap\">\r\n <div class=\"md-sidebar__inner\">\r\n \r\n\r\n\r\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"目录\">\r\n \r\n \r\n \r\n \r\n \r\n \r\n <label class=\"md-nav__title\" for=\"__toc\">\r\n <span class=\"md-nav__icon md-icon\"></span>\r\n 目录\r\n </label>\r\n <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"#creating-embedding-model-classes\" class=\"md-nav__link\">\r\n <span class=\"md-ellipsis\">\r\n \r\n Creating Embedding Model Classes\r\n \r\n </span>\r\n </a>\r\n \r\n</li>\r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"#using-the-embedding-model-class\" class=\"md-nav__link\">\r\n <span class=\"md-ellipsis\">\r\n \r\n Using the Embedding Model Class\r\n \r\n </span>\r\n </a>\r\n \r\n <nav class=\"md-nav\" aria-label=\"Using the Embedding Model Class\">\r\n <ul class=\"md-nav__list\">\r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"#vectorizing-queries\" class=\"md-nav__link\">\r\n <span class=\"md-ellipsis\">\r\n \r\n Vectorizing Queries\r\n \r\n </span>\r\n </a>\r\n \r\n</li>\r\n \r\n <li class=\"md-nav__item\">\r\n <a href=\"#vectorizing-a-list-of-strings\" class=\"md-nav__link\">\r\n <span class=\"md-ellipsis\">\r\n \r\n Vectorizing a List of Strings\r\n \r\n </span>\r\n </a>\r\n \r\n</li>\r\n \r\n </ul>\r\n </nav>\r\n \r\n</li>\r\n \r\n </ul>\r\n \r\n</nav>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n <div class=\"md-content\" data-md-component=\"content\">\r\n \r\n <article class=\"md-content__inner md-typeset\">\r\n \r\n \r\n \r\n \r\n\r\n\r\n<h1 id=\"creation-and-usage-of-embedding-models\">Creation and Usage of Embedding Models</h1>\n<h2 id=\"creating-embedding-model-classes\">Creating Embedding Model Classes</h2>\n<p>Similar to chat model classes, you can use <code>create_openai_compatible_embedding</code> to create an integrated embedding model class. This function accepts the following parameters:</p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>embedding_provider</code></td>\n<td>Embedding model provider name, e.g., <code>vllm</code>. Must start with a letter or number, can only contain letters, numbers, and underscores, with a maximum length of 20 characters.<br><br><strong>Type</strong>: <code>str</code><br><strong>Required</strong>: Yes</td>\n</tr>\n<tr>\n<td><code>base_url</code></td>\n<td>Default API endpoint for the model provider.<br><br><strong>Type</strong>: <code>str</code><br><strong>Required</strong>: No</td>\n</tr>\n<tr>\n<td><code>embedding_model_cls_name</code></td>\n<td>Embedding model class name (must comply with Python class naming conventions). Default value is <code>{Provider}Embeddings</code> (where <code>{Provider}</code> is the capitalized provider name).<br><br><strong>Type</strong>: <code>str</code><br><strong>Required</strong>: No</td>\n</tr>\n</tbody>\n</table>\n<p>Similarly, we use <code>create_openai_compatible_embedding</code> to integrate vLLM's embedding model.</p>\n<div class=\"highlight\"><pre><span></span><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">langchain_dev_utils.embeddings.adapters</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">create_openai_compatible_embedding</span>\n\n<span class=\"n\">VLLMEmbeddings</span> <span class=\"o\">=</span> <span class=\"n\">create_openai_compatible_embedding</span><span class=\"p\">(</span>\n<span class=\"hll\"> <span class=\"n\">embedding_provider</span><span class=\"o\">=</span><span class=\"s2\">&quot;vllm&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\"> <span class=\"n\">base_url</span><span class=\"o\">=</span><span class=\"s2\">&quot;http://localhost:8000/v1&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\"> <span class=\"n\">embedding_model_cls_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;VLLMEmbeddings&quot;</span><span class=\"p\">,</span>\n</span><span class=\"p\">)</span>\n\n<span class=\"n\">embedding</span> <span class=\"o\">=</span> <span class=\"n\">VLLMEmbeddings</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"o\">=</span><span class=\"s2\">&quot;qwen3-embedding-4b&quot;</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">embedding</span><span class=\"o\">.</span><span class=\"n\">embed_query</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p><code>base_url</code> can also be omitted. If not provided, the library will read the environment variable <code>VLLM_API_BASE</code> by default:</p>\n<div class=\"highlight\"><pre><span></span><code><span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">VLLM_API_BASE</span><span class=\"o\">=</span><span class=\"s2\">&quot;http://localhost:8000/v1&quot;</span>\n</code></pre></div>\n<p>At this point, the code can omit <code>base_url</code>:</p>\n<div class=\"highlight\"><pre><span></span><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">langchain_dev_utils.embeddings.adapters</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">create_openai_compatible_embedding</span>\n\n<span class=\"n\">VLLMEmbeddings</span> <span class=\"o\">=</span> <span class=\"n\">create_openai_compatible_embedding</span><span class=\"p\">(</span>\n<span class=\"hll\"> <span class=\"n\">embedding_provider</span><span class=\"o\">=</span><span class=\"s2\">&quot;vllm&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\"> <span class=\"n\">embedding_model_cls_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;VLLMEmbeddings&quot;</span><span class=\"p\">,</span>\n</span><span class=\"p\">)</span>\n\n<span class=\"n\">embedding</span> <span class=\"o\">=</span> <span class=\"n\">VLLMEmbeddings</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"o\">=</span><span class=\"s2\">&quot;qwen3-embedding-4b&quot;</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">embedding</span><span class=\"o\">.</span><span class=\"n\">embed_query</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p><strong>Note</strong>: The above code successfully runs assuming the environment variable <code>VLLM_API_KEY</code> is configured. Although vLLM itself does not require an API Key, the embedding model class initialization requires one. Therefore, please set this variable first, for example:</p>\n<div class=\"highlight\"><pre><span></span><code><span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">VLLM_API_KEY</span><span class=\"o\">=</span>vllm_api_key\n</code></pre></div>\n<h2 id=\"using-the-embedding-model-class\">Using the Embedding Model Class</h2>\n<p>Here, we use the previously created <code>VLLMEmbeddings</code> class to initialize an embedding model instance.</p>\n<h3 id=\"vectorizing-queries\">Vectorizing Queries</h3>\n<div class=\"highlight\"><pre><span></span><code><span class=\"n\">embedding</span> <span class=\"o\">=</span> <span class=\"n\">VLLMEmbeddings</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"o\">=</span><span class=\"s2\">&quot;qwen3-embedding-4b&quot;</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">embedding</span><span class=\"o\">.</span><span class=\"n\">embed_query</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Similarly, asynchronous invocation is also supported:</p>\n<div class=\"highlight\"><pre><span></span><code><span class=\"n\">embedding</span> <span class=\"o\">=</span> <span class=\"n\">VLLMEmbeddings</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"o\">=</span><span class=\"s2\">&quot;qwen3-embedding-4b&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">res</span> <span class=\"o\">=</span> <span class=\"k\">await</span> <span class=\"n\">embedding</span><span class=\"o\">.</span><span class=\"n\">aembed_query</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">res</span><span class=\"p\">)</span>\n</code></pre></div>\n<h3 id=\"vectorizing-a-list-of-strings\">Vectorizing a List of Strings</h3>\n<p><div class=\"highlight\"><pre><span></span><code><span class=\"n\">documents</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Hello, I am Zhang San&quot;</span><span class=\"p\">]</span>\n<span class=\"n\">embedding</span> <span class=\"o\">=</span> <span class=\"n\">VLLMEmbeddings</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"o\">=</span><span class=\"s2\">&quot;qwen3-embedding-4b&quot;</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">embedding</span><span class=\"o\">.</span><span class=\"n\">embed_documents</span><span class=\"p\">(</span><span class=\"n\">documents</span><span class=\"p\">))</span>\n</code></pre></div>\nSimilarly, asynchronous invocation is also supported:</p>\n<div class=\"highlight\"><pre><span></span><code><span class=\"n\">documents</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Hello, I am Zhang San&quot;</span><span class=\"p\">]</span>\n<span class=\"n\">embedding</span> <span class=\"o\">=</span> <span class=\"n\">VLLMEmbeddings</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"o\">=</span><span class=\"s2\">&quot;qwen3-embedding-4b&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">res</span> <span class=\"o\">=</span> <span class=\"k\">await</span> <span class=\"n\">embedding</span><span class=\"o\">.</span><span class=\"n\">aembed_documents</span><span class=\"p\">(</span><span class=\"n\">documents</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">res</span><span class=\"p\">)</span>\n</code></pre></div>\n<div class=\"admonition warning\">\n<p class=\"admonition-title\">Embedding Model Compatibility Notes</p>\n<p>OpenAI-compatible embedding APIs generally exhibit good compatibility, but the following differences should be noted:</p>\n<ol>\n<li>\n<p><code>check_embedding_ctx_length</code>: Set to <code>True</code> only when using the official OpenAI embedding service; for all other embedding models, set it to <code>False</code>.</p>\n</li>\n<li>\n<p><code>dimensions</code>: If the model supports custom vector dimensions (e.g., 1024, 4096), you can directly pass this parameter.</p>\n</li>\n<li>\n<p><code>chunk_size</code>: The maximum number of texts that can be processed in a single API call. For example, a <code>chunk_size</code> of 10 means a single request can vectorize up to 10 texts.</p>\n</li>\n<li>\n<p>Single-text token limit: Cannot be controlled via parameters; must be ensured during preprocessing and chunking stages.</p>\n</li>\n</ol>\n</div>\n<div class=\"admonition warning\">\n<p class=\"admonition-title\">Note</p>\n<p>Similarly, this function uses <code>pydantic.create_model</code> under the hood to create embedding model classes, which incurs some performance overhead. It is recommended to create integration classes during project startup and avoid dynamic creation afterward.</p>\n</div>\n<div class=\"admonition success\">\n<p class=\"admonition-title\">Best Practice</p>\n<p>When connecting to an OpenAI-compatible API embedding model provider, you can directly use <code>langchain-openai</code>'s <code>OpenAIEmbeddings</code> and point <code>base_url</code> and <code>api_key</code> to your provider's service. Embedding model API compatibility is usually better: in most cases, you can directly use <code>OpenAIEmbeddings</code> with <code>check_embedding_ctx_length=False</code>.</p>\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n \r\n </article>\r\n </div>\r\n \r\n \r\n <script>var tabs=__md_get(\"__tabs\");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(\".tabbed-set\")){var labels=set.querySelector(\".tabbed-labels\");for(var tab of tabs)for(var label of labels.getElementsByTagName(\"label\"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>\r\n\r\n<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith(\"__tabbed_\"))</script>\r\n </div>\r\n \r\n <button type=\"button\" class=\"md-top md-icon\" data-md-component=\"top\" hidden>\r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-circle-arrow-up\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m16 12-4-4-4 4M12 16V8\"/></svg>\r\n 回到页面顶部\r\n</button>\r\n \r\n </main>\r\n \r\n <footer class=\"md-footer\">\r\n \r\n <div class=\"md-footer-meta md-typeset\">\r\n <div class=\"md-footer-meta__inner md-grid\">\r\n <div class=\"md-copyright\">\r\n \r\n \r\n Made with\r\n <a href=\"https://zensical.org/\" target=\"_blank\" rel=\"noopener\">\r\n Zensical\r\n </a>\r\n \r\n</div>\r\n \r\n </div>\r\n </div>\r\n</footer>\r\n \r\n </div>\r\n <div class=\"md-dialog\" data-md-component=\"dialog\">\r\n <div class=\"md-dialog__inner md-typeset\"></div>\r\n </div>\r\n \r\n \r\n \r\n \r\n \r\n \r\n <script id=\"__config\" type=\"application/json\">{\"annotate\":null,\"base\":\"../../../..\",\"features\":[\"navigation.tabs\",\"navigation.sections\",\"navigation.expand\",\"navigation.instant\",\"navigation.tracking\",\"navigation.top\",\"search.suggest\",\"search.highlight\",\"search.share\",\"content.code.copy\",\"content.code.annotate\",\"content.tabs.link\",\"content.tooltips\",\"content.footnote.tooltips\"],\"search\":\"../../../../assets/javascripts/workers/search.e2d2d235.min.js\",\"tags\":null,\"translations\":{\"clipboard.copied\":\"已复制\",\"clipboard.copy\":\"复制\",\"search.result.more.one\":\"在该页上还有 1 个符合条件的结果\",\"search.result.more.other\":\"在该页上还有 # 个符合条件的结果\",\"search.result.none\":\"没有找到符合条件的结果\",\"search.result.one\":\"找到 1 个符合条件的结果\",\"search.result.other\":\"# 个符合条件的结果\",\"search.result.placeholder\":\"键入以开始搜索\",\"search.result.term.missing\":\"缺少\",\"select.version\":\"选择当前版本\"},\"version\":null}</script>\r\n \r\n \r\n <script src=\"../../../../assets/javascripts/bundle.36a64b72.min.js\"></script>\r\n \r\n \r\n </body>\r\n</html>",
3
- "hash": 617130092991168079
4
- }