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.
- langchain_dev_utils-1.4.4/AGENTS.md +285 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/PKG-INFO +1 -1
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/pyproject.toml +1 -1
- langchain_dev_utils-1.4.4/src/langchain_dev_utils/__init__.py +1 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/handoffs.py +23 -22
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_handoffs_middleware.py +0 -4
- langchain_dev_utils-1.4.3/.cache/.gitignore +0 -1
- langchain_dev_utils-1.4.3/.cache/10132167963676728850 +0 -4
- langchain_dev_utils-1.4.3/.cache/10149277315986816452 +0 -119
- langchain_dev_utils-1.4.3/.cache/10212306112077623172 +0 -89
- langchain_dev_utils-1.4.3/.cache/10378751321322438463 +0 -4
- langchain_dev_utils-1.4.3/.cache/1040099908288978801 +0 -135
- langchain_dev_utils-1.4.3/.cache/104857451859860363 +0 -105
- langchain_dev_utils-1.4.3/.cache/10632936651036843898 +0 -105
- langchain_dev_utils-1.4.3/.cache/10750405311029893673 +0 -4
- langchain_dev_utils-1.4.3/.cache/11073118652123077588 +0 -27
- langchain_dev_utils-1.4.3/.cache/11097895064266833842 +0 -4
- langchain_dev_utils-1.4.3/.cache/1151792845744300718 +0 -4
- langchain_dev_utils-1.4.3/.cache/1189978746543437471 +0 -165
- langchain_dev_utils-1.4.3/.cache/12115012717975431373 +0 -4
- langchain_dev_utils-1.4.3/.cache/12206186549754547764 +0 -88
- langchain_dev_utils-1.4.3/.cache/12360634119973346056 +0 -89
- langchain_dev_utils-1.4.3/.cache/1269862585078162109 +0 -165
- langchain_dev_utils-1.4.3/.cache/12821160338097409528 +0 -4
- langchain_dev_utils-1.4.3/.cache/13062886706927887844 +0 -4
- langchain_dev_utils-1.4.3/.cache/13301246796564074464 +0 -27
- langchain_dev_utils-1.4.3/.cache/13301993342006977616 +0 -58
- langchain_dev_utils-1.4.3/.cache/1330248056645643292 +0 -104
- langchain_dev_utils-1.4.3/.cache/13348122375379064923 +0 -58
- langchain_dev_utils-1.4.3/.cache/1359679513868266359 +0 -4
- langchain_dev_utils-1.4.3/.cache/13625925199296545024 +0 -4
- langchain_dev_utils-1.4.3/.cache/13632211840061000323 +0 -4
- langchain_dev_utils-1.4.3/.cache/13746006243306193541 +0 -4
- langchain_dev_utils-1.4.3/.cache/13971100319460407517 +0 -88
- langchain_dev_utils-1.4.3/.cache/14028237667454951821 +0 -243
- langchain_dev_utils-1.4.3/.cache/14033072851579767670 +0 -119
- langchain_dev_utils-1.4.3/.cache/14250498158008610928 +0 -4
- langchain_dev_utils-1.4.3/.cache/14259959605703426807 +0 -349
- langchain_dev_utils-1.4.3/.cache/14293610541601779362 +0 -74
- langchain_dev_utils-1.4.3/.cache/14361141486053015390 +0 -89
- langchain_dev_utils-1.4.3/.cache/14815454888612538140 +0 -4
- langchain_dev_utils-1.4.3/.cache/14904030555725953776 +0 -4
- langchain_dev_utils-1.4.3/.cache/15025271566505243950 +0 -4
- langchain_dev_utils-1.4.3/.cache/15054227793547352075 +0 -990
- langchain_dev_utils-1.4.3/.cache/15065779533269950614 +0 -4
- langchain_dev_utils-1.4.3/.cache/15446496809880657661 +0 -27
- langchain_dev_utils-1.4.3/.cache/15617362476885904629 +0 -4
- langchain_dev_utils-1.4.3/.cache/15639173995710368854 +0 -349
- langchain_dev_utils-1.4.3/.cache/15762191716031596491 +0 -4
- langchain_dev_utils-1.4.3/.cache/1577969368081973692 +0 -243
- langchain_dev_utils-1.4.3/.cache/1628387613061272132 +0 -4
- langchain_dev_utils-1.4.3/.cache/16491517296573712344 +0 -990
- langchain_dev_utils-1.4.3/.cache/16493373299299360945 +0 -4
- langchain_dev_utils-1.4.3/.cache/16528442351413743144 +0 -135
- langchain_dev_utils-1.4.3/.cache/16541658010600719633 +0 -104
- langchain_dev_utils-1.4.3/.cache/16646829519153034812 +0 -4
- langchain_dev_utils-1.4.3/.cache/16655965899250654016 +0 -89
- langchain_dev_utils-1.4.3/.cache/16832445802116848894 +0 -4
- langchain_dev_utils-1.4.3/.cache/16946221993949941809 +0 -4
- langchain_dev_utils-1.4.3/.cache/17203959758206958699 +0 -4
- langchain_dev_utils-1.4.3/.cache/17290735391753493732 +0 -4
- langchain_dev_utils-1.4.3/.cache/17319573296851837531 +0 -4
- langchain_dev_utils-1.4.3/.cache/17688261241712087494 +0 -4
- langchain_dev_utils-1.4.3/.cache/17698060842036528324 +0 -194
- langchain_dev_utils-1.4.3/.cache/17787738391657669186 +0 -4
- langchain_dev_utils-1.4.3/.cache/18227580402014540144 +0 -379
- langchain_dev_utils-1.4.3/.cache/18303185967813561173 +0 -242
- langchain_dev_utils-1.4.3/.cache/1926719474267919111 +0 -4
- langchain_dev_utils-1.4.3/.cache/2076114625129041541 +0 -333
- langchain_dev_utils-1.4.3/.cache/2120755445008564656 +0 -4
- langchain_dev_utils-1.4.3/.cache/2172871625297495691 +0 -136
- langchain_dev_utils-1.4.3/.cache/229194999405881755 +0 -4
- langchain_dev_utils-1.4.3/.cache/2591743801418891565 +0 -4
- langchain_dev_utils-1.4.3/.cache/2633179503659950686 +0 -150
- langchain_dev_utils-1.4.3/.cache/2638619333707832110 +0 -243
- langchain_dev_utils-1.4.3/.cache/311072482334109094 +0 -4
- langchain_dev_utils-1.4.3/.cache/3114295214797897303 +0 -333
- langchain_dev_utils-1.4.3/.cache/3464700389800366053 +0 -502
- langchain_dev_utils-1.4.3/.cache/4043361625843815558 +0 -88
- langchain_dev_utils-1.4.3/.cache/4131672489284763215 +0 -379
- langchain_dev_utils-1.4.3/.cache/4227978977025071655 +0 -58
- langchain_dev_utils-1.4.3/.cache/4303146078529032033 +0 -4
- langchain_dev_utils-1.4.3/.cache/4556346579349859049 +0 -4
- langchain_dev_utils-1.4.3/.cache/4595382501822052434 +0 -4
- langchain_dev_utils-1.4.3/.cache/4643267776105670084 +0 -4
- langchain_dev_utils-1.4.3/.cache/4645903213388384790 +0 -150
- langchain_dev_utils-1.4.3/.cache/4772296789029058803 +0 -58
- langchain_dev_utils-1.4.3/.cache/4856685402689964555 +0 -4
- langchain_dev_utils-1.4.3/.cache/4911455497220962699 +0 -502
- langchain_dev_utils-1.4.3/.cache/4960916194268796790 +0 -242
- langchain_dev_utils-1.4.3/.cache/5004460099290458770 +0 -4
- langchain_dev_utils-1.4.3/.cache/5043685154627706733 +0 -4
- langchain_dev_utils-1.4.3/.cache/5058845702148423459 +0 -4
- langchain_dev_utils-1.4.3/.cache/5114803401124200986 +0 -4
- langchain_dev_utils-1.4.3/.cache/5240837403663904545 +0 -74
- langchain_dev_utils-1.4.3/.cache/5309181156679912115 +0 -4
- langchain_dev_utils-1.4.3/.cache/5573910617214598357 +0 -135
- langchain_dev_utils-1.4.3/.cache/5914983732650719802 +0 -4
- langchain_dev_utils-1.4.3/.cache/5936839346169779924 +0 -244
- langchain_dev_utils-1.4.3/.cache/6051440962903797706 +0 -135
- langchain_dev_utils-1.4.3/.cache/6070063779327491346 +0 -4
- langchain_dev_utils-1.4.3/.cache/6150574529172679001 +0 -4
- langchain_dev_utils-1.4.3/.cache/6185295689099300560 +0 -4
- langchain_dev_utils-1.4.3/.cache/6416288532933398693 +0 -4
- langchain_dev_utils-1.4.3/.cache/6576531235250061605 +0 -194
- langchain_dev_utils-1.4.3/.cache/6745059141823250635 +0 -136
- langchain_dev_utils-1.4.3/.cache/693530668503540423 +0 -244
- langchain_dev_utils-1.4.3/.cache/7021182865222058936 +0 -4
- langchain_dev_utils-1.4.3/.cache/7424125075635962609 +0 -88
- langchain_dev_utils-1.4.3/.cache/7426947316238206265 +0 -4
- langchain_dev_utils-1.4.3/.cache/7696708707823268237 +0 -4
- langchain_dev_utils-1.4.3/.cache/8031990660020224106 +0 -27
- langchain_dev_utils-1.4.3/.cache/8083270160335022657 +0 -4
- langchain_dev_utils-1.4.3/.cache/8185803444397491430 +0 -27
- langchain_dev_utils-1.4.3/.cache/9245913271089240062 +0 -4
- langchain_dev_utils-1.4.3/.cache/937151433542130939 +0 -4
- langchain_dev_utils-1.4.3/.cache/9638021948029599062 +0 -4
- langchain_dev_utils-1.4.3/.cache/9817124278980503833 +0 -27
- langchain_dev_utils-1.4.3/.cache/9974721629853791342 +0 -243
- langchain_dev_utils-1.4.3/AGENTS.md +0 -173
- langchain_dev_utils-1.4.3/src/langchain_dev_utils/__init__.py +0 -1
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/.gitignore +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/.python-version +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/.vscode/settings.json +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/LICENSE +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/README.md +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/README_cn.md +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/_utils.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/factory.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/format_prompt.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/model_fallback.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/model_router.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/plan.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/summarization.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/tool_call_repair.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/tool_emulator.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/middleware/tool_selection.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/agents/wrap.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/adapters/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/adapters/create_utils.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/adapters/openai_compatible.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/adapters/register_profiles.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/base.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/chat_models/types.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/adapters/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/adapters/create_utils.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/adapters/openai_compatible.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/embeddings/base.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/graph/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/graph/parallel.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/graph/sequential.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/graph/types.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/message_convert/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/message_convert/content.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/message_convert/format.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/pipeline/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/pipeline/parallel.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/pipeline/sequential.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/pipeline/types.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/py.typed +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/tool_calling/__init__.py +0 -0
- {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
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/src/langchain_dev_utils/tool_calling/utils.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_agent.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_chat_models.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_embedding.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_graph.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_human_in_the_loop.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_load_embbeding.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_load_model.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_messages.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_model_tool_emulator.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_plan_middleware.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_router_model.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_tool_call_repair.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_tool_calling.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/test_wrap_agent.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/utils/__init__.py +0 -0
- {langchain_dev_utils-1.4.3 → langchain_dev_utils-1.4.4}/tests/utils/register.py +0 -0
- {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
|
+
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
|
|
@@ -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(
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
100
|
-
if
|
|
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
|
|
111
|
-
if
|
|
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
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
172
|
-
|
|
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
|
-
|
|
179
|
+
handoffs_tool_map,
|
|
179
180
|
)
|
|
180
181
|
|
|
181
182
|
all_tools = [
|
|
182
|
-
*
|
|
183
|
+
*handoffs_tool_map.values(),
|
|
183
184
|
]
|
|
184
185
|
|
|
185
186
|
for agent_name in agents_config:
|
|
@@ -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\">"vllm"</span><span class=\"p\">,</span>\n</span><span class=\"hll\"> <span class=\"n\">base_url</span><span class=\"o\">=</span><span class=\"s2\">"http://localhost:8000/v1"</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\">"VLLMEmbeddings"</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\">"qwen3-embedding-4b"</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\">"Hello"</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\">"http://localhost:8000/v1"</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\">"vllm"</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\">"VLLMEmbeddings"</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\">"qwen3-embedding-4b"</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\">"Hello"</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\">"qwen3-embedding-4b"</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\">"Hello"</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\">"qwen3-embedding-4b"</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\">"Hello"</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\">"Hello"</span><span class=\"p\">,</span> <span class=\"s2\">"Hello, I am Zhang San"</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\">"qwen3-embedding-4b"</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\">"Hello"</span><span class=\"p\">,</span> <span class=\"s2\">"Hello, I am Zhang San"</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\">"qwen3-embedding-4b"</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
|
-
}
|