mirror of
https://github.com/hwchase17/langchain.git
synced 2026-02-04 08:10:25 +00:00
Compare commits
463 Commits
langchain=
...
langchain-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
679e3a9970 | ||
|
|
23b433f683 | ||
|
|
387284c259 | ||
|
|
decd77c515 | ||
|
|
008efada2c | ||
|
|
fc8006121f | ||
|
|
288f204758 | ||
|
|
bd008baee0 | ||
|
|
337fed80a5 | ||
|
|
12111cb922 | ||
|
|
af2e0a7ede | ||
|
|
3107d78517 | ||
|
|
b909d54e70 | ||
|
|
9c55c75eb5 | ||
|
|
498f0249e2 | ||
|
|
f3fb5a9c68 | ||
|
|
67fd554512 | ||
|
|
258b3be5ec | ||
|
|
4802c31a53 | ||
|
|
ce90b25313 | ||
|
|
da28cf1f54 | ||
|
|
b0a298894d | ||
|
|
86b3c6e81c | ||
|
|
05ebe1e66b | ||
|
|
c855d434c5 | ||
|
|
fa06188834 | ||
|
|
94c22c3f48 | ||
|
|
48ab91b520 | ||
|
|
f60110107c | ||
|
|
28cb2cefc6 | ||
|
|
13c3c4a210 | ||
|
|
4149c0dd8d | ||
|
|
ca054ed1b1 | ||
|
|
d834c6b618 | ||
|
|
5a31792bf1 | ||
|
|
d1e0ec7b55 | ||
|
|
ba9b95cd23 | ||
|
|
0af5ad8262 | ||
|
|
a4713cab47 | ||
|
|
45f9c9ae88 | ||
|
|
ee640d6bd3 | ||
|
|
b20230c800 | ||
|
|
8780f7a2ad | ||
|
|
fa155a422f | ||
|
|
8c37808d47 | ||
|
|
a37afbe353 | ||
|
|
df5008fe55 | ||
|
|
b9dd4f2985 | ||
|
|
3048a9a26d | ||
|
|
d0e662e43b | ||
|
|
91227ad7fd | ||
|
|
1fbd86a155 | ||
|
|
e6a62d8422 | ||
|
|
bc4dc7f4b1 | ||
|
|
704059466a | ||
|
|
c1d348e95d | ||
|
|
0d20c314dd | ||
|
|
aba2711e7f | ||
|
|
5c6e2cbcda | ||
|
|
24292c4a31 | ||
|
|
e24f86e55f | ||
|
|
d0e95971f5 | ||
|
|
ef2f875dfb | ||
|
|
0f0df2df60 | ||
|
|
8c6eec5f25 | ||
|
|
9b7d49f7da | ||
|
|
5afeb8b46c | ||
|
|
4e743b5427 | ||
|
|
b78b2f7a28 | ||
|
|
34ca31e467 | ||
|
|
cf6d1c0ae7 | ||
|
|
2c49f587aa | ||
|
|
75bc6bb191 | ||
|
|
534b8f4364 | ||
|
|
6815981578 | ||
|
|
ce3b69aa05 | ||
|
|
242fee11be | ||
|
|
85114b4f3a | ||
|
|
9fcd203556 | ||
|
|
bdb4cf7cc0 | ||
|
|
b476fdb54a | ||
|
|
b64d846347 | ||
|
|
4c70ffff01 | ||
|
|
ffb5c1905a | ||
|
|
6e6061fe73 | ||
|
|
ec9b41431e | ||
|
|
cef21a0b49 | ||
|
|
90f162efb6 | ||
|
|
b53f07bfb9 | ||
|
|
eabe587787 | ||
|
|
481c4bfaba | ||
|
|
54fba7e520 | ||
|
|
079c7ea0fc | ||
|
|
e8508fb4c6 | ||
|
|
220b33df7f | ||
|
|
1fc4ac32f0 | ||
|
|
2354bb7bfa | ||
|
|
317a38b83e | ||
|
|
fbf0704e48 | ||
|
|
524ee6d9ac | ||
|
|
dd0085a9ff | ||
|
|
9b848491c8 | ||
|
|
5e8553c31a | ||
|
|
d801c6ffc7 | ||
|
|
a32035d17d | ||
|
|
07c2ac765a | ||
|
|
4a7dc6ec4c | ||
|
|
80a88f8f04 | ||
|
|
0eb7ab65f1 | ||
|
|
b7c2029e84 | ||
|
|
925ca75ca5 | ||
|
|
f943205ebf | ||
|
|
9e2abcd152 | ||
|
|
246c10a1cc | ||
|
|
1cedf401a7 | ||
|
|
791d7e965e | ||
|
|
4f99952129 | ||
|
|
221ab03fe4 | ||
|
|
e6663b69f3 | ||
|
|
c38b845d7e | ||
|
|
2c6bc74cb1 | ||
|
|
dda9f90047 | ||
|
|
15cbc36a23 | ||
|
|
f3dc142d3c | ||
|
|
5277a021c1 | ||
|
|
18386c16c7 | ||
|
|
bc636ccc60 | ||
|
|
7ecf38f4fa | ||
|
|
a197e0ba3d | ||
|
|
478def8dcc | ||
|
|
482e8a7855 | ||
|
|
28f8d436f6 | ||
|
|
7a96ce1320 | ||
|
|
5519a1c1d3 | ||
|
|
66f819c59e | ||
|
|
3d5493593b | ||
|
|
ecdfc98ef6 | ||
|
|
1581857e3d | ||
|
|
1e285cb5f3 | ||
|
|
b8e861a63b | ||
|
|
d26555c682 | ||
|
|
7d44316d92 | ||
|
|
8f9b3b7498 | ||
|
|
ecff9a01e4 | ||
|
|
d9e42a1517 | ||
|
|
0f539f0246 | ||
|
|
43c35d19d4 | ||
|
|
c5acedddc2 | ||
|
|
f459754470 | ||
|
|
2b360d6a2f | ||
|
|
8bc2c912b8 | ||
|
|
a0130148bc | ||
|
|
eec55c2550 | ||
|
|
12d74d5bef | ||
|
|
e6a08355a3 | ||
|
|
6151ea78d5 | ||
|
|
d34bf78f3b | ||
|
|
a009249369 | ||
|
|
bc5ec63d67 | ||
|
|
eff8a54756 | ||
|
|
15e7353168 | ||
|
|
6e607bb237 | ||
|
|
ef365543cb | ||
|
|
b0a83071df | ||
|
|
ab831ce05c | ||
|
|
50ddf13692 | ||
|
|
a220ee56cd | ||
|
|
c74f34cb41 | ||
|
|
926e452f44 | ||
|
|
7315360907 | ||
|
|
ff675c11f6 | ||
|
|
6b7e93d4c7 | ||
|
|
000be1f32c | ||
|
|
42d40d694b | ||
|
|
9f04416768 | ||
|
|
ecee41ab72 | ||
|
|
60021e54b5 | ||
|
|
28487597b2 | ||
|
|
88d6d02b59 | ||
|
|
c953f93c54 | ||
|
|
e5b4f9ad75 | ||
|
|
58d2bfe310 | ||
|
|
e294e7159a | ||
|
|
47433485e7 | ||
|
|
49914e959a | ||
|
|
c2f1d022a2 | ||
|
|
2813e86407 | ||
|
|
b7e10bb199 | ||
|
|
a8b21afc08 | ||
|
|
ee6fc3f3f6 | ||
|
|
83586661d6 | ||
|
|
733a6ad328 | ||
|
|
b9bf7fd797 | ||
|
|
5141f25a20 | ||
|
|
0901f11b0f | ||
|
|
c09000f20e | ||
|
|
607c60a594 | ||
|
|
bb83abd037 | ||
|
|
51e98a5548 | ||
|
|
42b8ad067d | ||
|
|
85b8cecb6f | ||
|
|
585da22752 | ||
|
|
ffe7bd4832 | ||
|
|
8adc4a5bcc | ||
|
|
ec205fcee0 | ||
|
|
06fafc6651 | ||
|
|
7d95a10ada | ||
|
|
a1c90794e1 | ||
|
|
74d9d2cba1 | ||
|
|
e9c16552fa | ||
|
|
e7dc26aefb | ||
|
|
42b18824c2 | ||
|
|
869c8f5879 | ||
|
|
7b9a0d9ed8 | ||
|
|
a97c53e7c2 | ||
|
|
c161f7d46f | ||
|
|
195ae7baa3 | ||
|
|
aa2c17b56c | ||
|
|
a5374952f8 | ||
|
|
5867f25ff3 | ||
|
|
c60695a1c7 | ||
|
|
6ed2d387bb | ||
|
|
a83357dc5a | ||
|
|
82bb0cdfff | ||
|
|
f5f1149257 | ||
|
|
7170a4e3e1 | ||
|
|
563587e14f | ||
|
|
a813d11c14 | ||
|
|
ed84d48eef | ||
|
|
a3296479a0 | ||
|
|
39fd0fd196 | ||
|
|
25a636c597 | ||
|
|
242e9fc865 | ||
|
|
203d20caa5 | ||
|
|
aa7fa80e1e | ||
|
|
7277794a59 | ||
|
|
2ee37a1c7b | ||
|
|
697dda5052 | ||
|
|
a433039a56 | ||
|
|
a5fcbe69eb | ||
|
|
65deeddd5d | ||
|
|
29f8a79ebe | ||
|
|
9a717c9b32 | ||
|
|
4ccb3e64c7 | ||
|
|
2917f8573f | ||
|
|
49254cde70 | ||
|
|
f173b72e35 | ||
|
|
45402d1a20 | ||
|
|
b3ee1f8713 | ||
|
|
5bc2df3060 | ||
|
|
ad4333ca03 | ||
|
|
69a706adff | ||
|
|
56499cf58b | ||
|
|
f5f53d1101 | ||
|
|
96c67230aa | ||
|
|
d1108607f4 | ||
|
|
4f76246cf2 | ||
|
|
4bdf1d7d1a | ||
|
|
60e572f591 | ||
|
|
35e6052df5 | ||
|
|
161ab736ce | ||
|
|
8738973267 | ||
|
|
2acc83f146 | ||
|
|
1a66175e38 | ||
|
|
dee72c46c1 | ||
|
|
2901fa20cc | ||
|
|
567dc1e422 | ||
|
|
abaea28417 | ||
|
|
cb32bab69d | ||
|
|
7c7ee07d30 | ||
|
|
923ef85105 | ||
|
|
218b4e073e | ||
|
|
4da35623af | ||
|
|
43e24cd4a1 | ||
|
|
4027da1b6e | ||
|
|
16918842bf | ||
|
|
6bda89f9a1 | ||
|
|
197b885911 | ||
|
|
5599a0a537 | ||
|
|
97f752c92d | ||
|
|
0a06732d3e | ||
|
|
0dbaf05bb7 | ||
|
|
24eea2e398 | ||
|
|
d9d689572a | ||
|
|
cbeb8601d6 | ||
|
|
018f4102f4 | ||
|
|
6dfea7e508 | ||
|
|
3a63055ce2 | ||
|
|
a1db744b20 | ||
|
|
c26b3575f8 | ||
|
|
093f24ba4d | ||
|
|
0c051e57e0 | ||
|
|
22a8652ecc | ||
|
|
76e210a349 | ||
|
|
0a57fc0016 | ||
|
|
e6fe8cc2fb | ||
|
|
0b2bea4c0e | ||
|
|
3b602d0453 | ||
|
|
2de59d0b3e | ||
|
|
709c418022 | ||
|
|
683644320b | ||
|
|
c48fdbba6a | ||
|
|
364fd5e17f | ||
|
|
6d2004ee7d | ||
|
|
409c7946ac | ||
|
|
39fcb476fd | ||
|
|
d3252b7417 | ||
|
|
585479e1ff | ||
|
|
39956a3ef0 | ||
|
|
d696728278 | ||
|
|
776e3271e3 | ||
|
|
ed4952e475 | ||
|
|
74438f3ae8 | ||
|
|
ef2dc9eae5 | ||
|
|
f1222739f8 | ||
|
|
cff70c2d67 | ||
|
|
4b641f87ae | ||
|
|
f6d34585f0 | ||
|
|
7bd9c8cba3 | ||
|
|
940e93e891 | ||
|
|
6ec688cf2b | ||
|
|
2ab5673eb1 | ||
|
|
3e972faf81 | ||
|
|
76e0127539 | ||
|
|
eadc2f6a90 | ||
|
|
c89e7ce8b5 | ||
|
|
965286db3e | ||
|
|
892694d735 | ||
|
|
beef4c4d62 | ||
|
|
2cec957274 | ||
|
|
da7c79b794 | ||
|
|
02de346f6d | ||
|
|
298ebeee4e | ||
|
|
8241c0df23 | ||
|
|
77c8a5c70c | ||
|
|
09e85c7c4b | ||
|
|
a646f1c383 | ||
|
|
00e7b2dada | ||
|
|
48ee322a78 | ||
|
|
2898b95ca7 | ||
|
|
5eaa0e8c45 | ||
|
|
15b7dd3ad7 | ||
|
|
5460096086 | ||
|
|
1538ee17f9 | ||
|
|
759b6ed17a | ||
|
|
ca7375ac20 | ||
|
|
e290736696 | ||
|
|
f9212c77e7 | ||
|
|
139881b108 | ||
|
|
9611f0b55d | ||
|
|
5c14e1f935 | ||
|
|
9ebd7ebed8 | ||
|
|
9484cc0962 | ||
|
|
0b85f9035b | ||
|
|
f695b96484 | ||
|
|
c0f3777657 | ||
|
|
44df79cf52 | ||
|
|
57fc62323a | ||
|
|
922b6b0e46 | ||
|
|
8e91c7ceec | ||
|
|
33dbfba08b | ||
|
|
503f2487a5 | ||
|
|
ff2152b115 | ||
|
|
c421997caa | ||
|
|
4c2392e55c | ||
|
|
85925e3164 | ||
|
|
138f360b25 | ||
|
|
b509747c7f | ||
|
|
be3b7f9bae | ||
|
|
733e43eed0 | ||
|
|
a073c4c498 | ||
|
|
8807e6986c | ||
|
|
6f368e9eab | ||
|
|
0588bab33e | ||
|
|
05fd6a16a9 | ||
|
|
8a5b9bf2ad | ||
|
|
1ad49957f5 | ||
|
|
a747dbd24b | ||
|
|
2cb39270ec | ||
|
|
7a9149f5dd | ||
|
|
53b0a99f37 | ||
|
|
cfff2a057e | ||
|
|
c2072d909a | ||
|
|
81f7daa458 | ||
|
|
2494deb2a4 | ||
|
|
90189f5639 | ||
|
|
482c168b3e | ||
|
|
0f85dea8c8 | ||
|
|
60123bef67 | ||
|
|
14f1827953 | ||
|
|
ea0ad917b0 | ||
|
|
75aa82fedc | ||
|
|
67ce05a0a7 | ||
|
|
b2da3115ed | ||
|
|
395674d503 | ||
|
|
41b7a5169d | ||
|
|
66966a6e72 | ||
|
|
a8c473e114 | ||
|
|
c3b75560dc | ||
|
|
b3c81356ca | ||
|
|
bff2a8b772 | ||
|
|
f6b2f82099 | ||
|
|
a3bbbe6a86 | ||
|
|
31f4fb790d | ||
|
|
ba5cba04ff | ||
|
|
6973f7214f | ||
|
|
4b8cd7a09a | ||
|
|
a54f390090 | ||
|
|
75f80c2910 | ||
|
|
d7c39e6dbb | ||
|
|
14a71a6e77 | ||
|
|
5745f3bf78 | ||
|
|
e02a5ee03e | ||
|
|
dd1711f3c2 | ||
|
|
aa1f46a03a | ||
|
|
8eb38622a6 | ||
|
|
eecf95df9b | ||
|
|
50563400fb | ||
|
|
dfa83531ad | ||
|
|
4e5cc84d40 | ||
|
|
f86a09f82c | ||
|
|
0c62684ce1 | ||
|
|
bcf499df16 | ||
|
|
a487ec47f4 | ||
|
|
f7ced5b211 | ||
|
|
b7d549ae88 | ||
|
|
3b0b7cfb74 | ||
|
|
830cad7bc0 | ||
|
|
9fedb04dd3 | ||
|
|
03a3670a5e | ||
|
|
002e1c9055 | ||
|
|
ee63d21915 | ||
|
|
c3c638cd7b | ||
|
|
33d445550e | ||
|
|
9a4a630e40 | ||
|
|
b0dfff4cd5 | ||
|
|
b4cb2089a2 | ||
|
|
2f6254605d | ||
|
|
e3ea365725 | ||
|
|
71f590de50 | ||
|
|
c572d663f9 | ||
|
|
8ef0df3539 | ||
|
|
2545fbe709 | ||
|
|
905f43377b | ||
|
|
389771ccc0 | ||
|
|
06420de2e7 | ||
|
|
54cb80c778 | ||
|
|
f94125a325 | ||
|
|
621f78babd | ||
|
|
25a1031871 | ||
|
|
e4e2aa0b78 | ||
|
|
181bcd0577 | ||
|
|
c1e742347f | ||
|
|
ad0387ac97 | ||
|
|
d9163e7afa | ||
|
|
0172d938b4 | ||
|
|
b631b0a596 | ||
|
|
8ad7adad87 | ||
|
|
3952ee31b8 | ||
|
|
a8a33b2dc6 | ||
|
|
8d8d85379f | ||
|
|
128b07208e | ||
|
|
6691202998 |
2
.github/CODEOWNERS
vendored
Normal file
2
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/.github/ @efriis @baskaryan @ccurme
|
||||
/libs/packages.yml @efriis
|
||||
2
.github/DISCUSSION_TEMPLATE/q-a.yml
vendored
2
.github/DISCUSSION_TEMPLATE/q-a.yml
vendored
@@ -22,7 +22,7 @@ body:
|
||||
if there's another way to solve your problem:
|
||||
|
||||
[LangChain documentation with the integrated search](https://python.langchain.com/docs/get_started/introduction),
|
||||
[API Reference](https://api.python.langchain.com/en/stable/),
|
||||
[API Reference](https://python.langchain.com/api_reference/),
|
||||
[GitHub search](https://github.com/langchain-ai/langchain),
|
||||
[LangChain Github Discussions](https://github.com/langchain-ai/langchain/discussions),
|
||||
[LangChain Github Issues](https://github.com/langchain-ai/langchain/issues?q=is%3Aissue),
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
@@ -16,7 +16,7 @@ body:
|
||||
if there's another way to solve your problem:
|
||||
|
||||
[LangChain documentation with the integrated search](https://python.langchain.com/docs/get_started/introduction),
|
||||
[API Reference](https://api.python.langchain.com/en/stable/),
|
||||
[API Reference](https://python.langchain.com/api_reference/),
|
||||
[GitHub search](https://github.com/langchain-ai/langchain),
|
||||
[LangChain Github Discussions](https://github.com/langchain-ai/langchain/discussions),
|
||||
[LangChain Github Issues](https://github.com/langchain-ai/langchain/issues?q=is%3Aissue),
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/documentation.yml
vendored
2
.github/ISSUE_TEMPLATE/documentation.yml
vendored
@@ -21,7 +21,7 @@ body:
|
||||
place to ask your question:
|
||||
|
||||
[LangChain documentation with the integrated search](https://python.langchain.com/docs/get_started/introduction),
|
||||
[API Reference](https://api.python.langchain.com/en/stable/),
|
||||
[API Reference](https://python.langchain.com/api_reference/),
|
||||
[GitHub search](https://github.com/langchain-ai/langchain),
|
||||
[LangChain Github Discussions](https://github.com/langchain-ai/langchain/discussions),
|
||||
[LangChain Github Issues](https://github.com/langchain-ai/langchain/issues?q=is%3Aissue),
|
||||
|
||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,7 +1,7 @@
|
||||
Thank you for contributing to LangChain!
|
||||
|
||||
- [ ] **PR title**: "package: description"
|
||||
- Where "package" is whichever of langchain, community, core, etc. is being modified. Use "docs: ..." for purely docs changes, "templates: ..." for template changes, "infra: ..." for CI changes.
|
||||
- Where "package" is whichever of langchain, community, core, etc. is being modified. Use "docs: ..." for purely docs changes, "infra: ..." for CI changes.
|
||||
- Example: "community: add foobar LLM"
|
||||
|
||||
|
||||
|
||||
34
.github/scripts/check_diff.py
vendored
34
.github/scripts/check_diff.py
vendored
@@ -32,19 +32,8 @@ IGNORED_PARTNERS = [
|
||||
"huggingface",
|
||||
]
|
||||
|
||||
# Cap python version at 3.12 for some packages with dependencies that are not yet
|
||||
# compatible with python 3.13 (mostly hf tokenizers).
|
||||
PY_312_MAX_PACKAGES = [
|
||||
f"libs/partners/{integration}"
|
||||
for integration in [
|
||||
"anthropic",
|
||||
"chroma",
|
||||
"couchbase",
|
||||
"huggingface",
|
||||
"mistralai",
|
||||
"nomic",
|
||||
"qdrant",
|
||||
]
|
||||
"libs/partners/huggingface", # https://github.com/pytorch/pytorch/issues/130249
|
||||
]
|
||||
|
||||
|
||||
@@ -135,10 +124,11 @@ def _get_configs_for_single_dir(job: str, dir_: str) -> List[Dict[str, str]]:
|
||||
elif dir_ in PY_312_MAX_PACKAGES:
|
||||
py_versions = ["3.9", "3.12"]
|
||||
|
||||
elif dir_ in ["libs/community", "libs/langchain"] and job == "extended-tests":
|
||||
# community extended test resolution in 3.12 is slow
|
||||
# even in uv
|
||||
py_versions = ["3.9", "3.11"]
|
||||
elif dir_ == "libs/langchain" and job == "extended-tests":
|
||||
py_versions = ["3.9", "3.13"]
|
||||
|
||||
elif dir_ == "libs/community" and job == "extended-tests":
|
||||
py_versions = ["3.9", "3.12"]
|
||||
|
||||
elif dir_ == "libs/community" and job == "compile-integration-tests":
|
||||
# community integration deps are slow in 3.12
|
||||
@@ -282,6 +272,9 @@ if __name__ == "__main__":
|
||||
# TODO: update to include all packages that rely on standard-tests (all partner packages)
|
||||
# note: won't run on external repo partners
|
||||
dirs_to_run["lint"].add("libs/standard-tests")
|
||||
dirs_to_run["test"].add("libs/standard-tests")
|
||||
dirs_to_run["lint"].add("libs/cli")
|
||||
dirs_to_run["test"].add("libs/cli")
|
||||
dirs_to_run["test"].add("libs/partners/mistralai")
|
||||
dirs_to_run["test"].add("libs/partners/openai")
|
||||
dirs_to_run["test"].add("libs/partners/anthropic")
|
||||
@@ -289,8 +282,9 @@ if __name__ == "__main__":
|
||||
dirs_to_run["test"].add("libs/partners/groq")
|
||||
|
||||
elif file.startswith("libs/cli"):
|
||||
# todo: add cli makefile
|
||||
pass
|
||||
dirs_to_run["lint"].add("libs/cli")
|
||||
dirs_to_run["test"].add("libs/cli")
|
||||
|
||||
elif file.startswith("libs/partners"):
|
||||
partner_dir = file.split("/")[2]
|
||||
if os.path.isdir(f"libs/partners/{partner_dir}") and [
|
||||
@@ -300,12 +294,14 @@ if __name__ == "__main__":
|
||||
] != ["README.md"]:
|
||||
dirs_to_run["test"].add(f"libs/partners/{partner_dir}")
|
||||
# Skip if the directory was deleted or is just a tombstone readme
|
||||
elif file == "libs/packages.yml":
|
||||
continue
|
||||
elif file.startswith("libs/"):
|
||||
raise ValueError(
|
||||
f"Unknown lib: {file}. check_diff.py likely needs "
|
||||
"an update for this new library!"
|
||||
)
|
||||
elif any(file.startswith(p) for p in ["docs/", "templates/", "cookbook/"]):
|
||||
elif any(file.startswith(p) for p in ["docs/", "cookbook/"]):
|
||||
if file.startswith("docs/"):
|
||||
docs_edited = True
|
||||
dirs_to_run["lint"].add(".")
|
||||
|
||||
96
.github/scripts/get_min_versions.py
vendored
96
.github/scripts/get_min_versions.py
vendored
@@ -7,17 +7,23 @@ else:
|
||||
# for python 3.10 and below, which doesnt have stdlib tomllib
|
||||
import tomli as tomllib
|
||||
|
||||
from packaging.version import parse as parse_version
|
||||
from packaging.specifiers import SpecifierSet
|
||||
from packaging.version import Version
|
||||
|
||||
|
||||
import requests
|
||||
from packaging.version import parse
|
||||
from typing import List
|
||||
|
||||
import re
|
||||
|
||||
|
||||
MIN_VERSION_LIBS = [
|
||||
"langchain-core",
|
||||
"langchain-community",
|
||||
"langchain",
|
||||
"langchain-text-splitters",
|
||||
"numpy",
|
||||
"SQLAlchemy",
|
||||
]
|
||||
|
||||
@@ -31,29 +37,61 @@ SKIP_IF_PULL_REQUEST = [
|
||||
]
|
||||
|
||||
|
||||
def get_min_version(version: str) -> str:
|
||||
# base regex for x.x.x with cases for rc/post/etc
|
||||
# valid strings: https://peps.python.org/pep-0440/#public-version-identifiers
|
||||
vstring = r"\d+(?:\.\d+){0,2}(?:(?:a|b|rc|\.post|\.dev)\d+)?"
|
||||
# case ^x.x.x
|
||||
_match = re.match(f"^\\^({vstring})$", version)
|
||||
if _match:
|
||||
return _match.group(1)
|
||||
def get_pypi_versions(package_name: str) -> List[str]:
|
||||
"""
|
||||
Fetch all available versions for a package from PyPI.
|
||||
|
||||
# case >=x.x.x,<y.y.y
|
||||
_match = re.match(f"^>=({vstring}),<({vstring})$", version)
|
||||
if _match:
|
||||
_min = _match.group(1)
|
||||
_max = _match.group(2)
|
||||
assert parse_version(_min) < parse_version(_max)
|
||||
return _min
|
||||
Args:
|
||||
package_name (str): Name of the package
|
||||
|
||||
# case x.x.x
|
||||
_match = re.match(f"^({vstring})$", version)
|
||||
if _match:
|
||||
return _match.group(1)
|
||||
Returns:
|
||||
List[str]: List of all available versions
|
||||
|
||||
raise ValueError(f"Unrecognized version format: {version}")
|
||||
Raises:
|
||||
requests.exceptions.RequestException: If PyPI API request fails
|
||||
KeyError: If package not found or response format unexpected
|
||||
"""
|
||||
pypi_url = f"https://pypi.org/pypi/{package_name}/json"
|
||||
response = requests.get(pypi_url)
|
||||
response.raise_for_status()
|
||||
return list(response.json()["releases"].keys())
|
||||
|
||||
|
||||
def get_minimum_version(package_name: str, spec_string: str) -> Optional[str]:
|
||||
"""
|
||||
Find the minimum published version that satisfies the given constraints.
|
||||
|
||||
Args:
|
||||
package_name (str): Name of the package
|
||||
spec_string (str): Version specification string (e.g., ">=0.2.43,<0.4.0,!=0.3.0")
|
||||
|
||||
Returns:
|
||||
Optional[str]: Minimum compatible version or None if no compatible version found
|
||||
"""
|
||||
# rewrite occurrences of ^0.0.z to 0.0.z (can be anywhere in constraint string)
|
||||
spec_string = re.sub(r"\^0\.0\.(\d+)", r"0.0.\1", spec_string)
|
||||
# rewrite occurrences of ^0.y.z to >=0.y.z,<0.y+1 (can be anywhere in constraint string)
|
||||
for y in range(1, 10):
|
||||
spec_string = re.sub(rf"\^0\.{y}\.(\d+)", rf">=0.{y}.\1,<0.{y+1}", spec_string)
|
||||
# rewrite occurrences of ^x.y.z to >=x.y.z,<x+1.0.0 (can be anywhere in constraint string)
|
||||
for x in range(1, 10):
|
||||
spec_string = re.sub(
|
||||
rf"\^{x}\.(\d+)\.(\d+)", rf">={x}.\1.\2,<{x+1}", spec_string
|
||||
)
|
||||
|
||||
spec_set = SpecifierSet(spec_string)
|
||||
all_versions = get_pypi_versions(package_name)
|
||||
|
||||
valid_versions = []
|
||||
for version_str in all_versions:
|
||||
try:
|
||||
version = parse(version_str)
|
||||
if spec_set.contains(version):
|
||||
valid_versions.append(version)
|
||||
except ValueError:
|
||||
continue
|
||||
|
||||
return str(min(valid_versions)) if valid_versions else None
|
||||
|
||||
|
||||
def get_min_version_from_toml(
|
||||
@@ -96,7 +134,7 @@ def get_min_version_from_toml(
|
||||
][0]["version"]
|
||||
|
||||
# Use parse_version to get the minimum supported version from version_string
|
||||
min_version = get_min_version(version_string)
|
||||
min_version = get_minimum_version(lib, version_string)
|
||||
|
||||
# Store the minimum version in the min_versions dictionary
|
||||
min_versions[lib] = min_version
|
||||
@@ -112,6 +150,20 @@ def check_python_version(version_string, constraint_string):
|
||||
:param constraint_string: A string representing the package's Python version constraints (e.g. ">=3.6, <4.0").
|
||||
:return: True if the version matches the constraints, False otherwise.
|
||||
"""
|
||||
|
||||
# rewrite occurrences of ^0.0.z to 0.0.z (can be anywhere in constraint string)
|
||||
constraint_string = re.sub(r"\^0\.0\.(\d+)", r"0.0.\1", constraint_string)
|
||||
# rewrite occurrences of ^0.y.z to >=0.y.z,<0.y+1.0 (can be anywhere in constraint string)
|
||||
for y in range(1, 10):
|
||||
constraint_string = re.sub(
|
||||
rf"\^0\.{y}\.(\d+)", rf">=0.{y}.\1,<0.{y+1}.0", constraint_string
|
||||
)
|
||||
# rewrite occurrences of ^x.y.z to >=x.y.z,<x+1.0.0 (can be anywhere in constraint string)
|
||||
for x in range(1, 10):
|
||||
constraint_string = re.sub(
|
||||
rf"\^{x}\.0\.(\d+)", rf">={x}.0.\1,<{x+1}.0.0", constraint_string
|
||||
)
|
||||
|
||||
try:
|
||||
version = Version(version_string)
|
||||
constraints = SpecifierSet(constraint_string)
|
||||
|
||||
89
.github/scripts/prep_api_docs_build.py
vendored
Normal file
89
.github/scripts/prep_api_docs_build.py
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env python
|
||||
"""Script to sync libraries from various repositories into the main langchain repository."""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import yaml
|
||||
from pathlib import Path
|
||||
from typing import Dict, Any
|
||||
|
||||
|
||||
def load_packages_yaml() -> Dict[str, Any]:
|
||||
"""Load and parse the packages.yml file."""
|
||||
with open("langchain/libs/packages.yml", "r") as f:
|
||||
return yaml.safe_load(f)
|
||||
|
||||
|
||||
def get_target_dir(package_name: str) -> Path:
|
||||
"""Get the target directory for a given package."""
|
||||
package_name_short = package_name.replace("langchain-", "")
|
||||
base_path = Path("langchain/libs")
|
||||
if package_name_short == "experimental":
|
||||
return base_path / "experimental"
|
||||
return base_path / "partners" / package_name_short
|
||||
|
||||
|
||||
def clean_target_directories(packages: list) -> None:
|
||||
"""Remove old directories that will be replaced."""
|
||||
for package in packages:
|
||||
|
||||
target_dir = get_target_dir(package["name"])
|
||||
if target_dir.exists():
|
||||
print(f"Removing {target_dir}")
|
||||
shutil.rmtree(target_dir)
|
||||
|
||||
|
||||
def move_libraries(packages: list) -> None:
|
||||
"""Move libraries from their source locations to the target directories."""
|
||||
for package in packages:
|
||||
|
||||
repo_name = package["repo"].split("/")[1]
|
||||
source_path = package["path"]
|
||||
target_dir = get_target_dir(package["name"])
|
||||
|
||||
# Handle root path case
|
||||
if source_path == ".":
|
||||
source_dir = repo_name
|
||||
else:
|
||||
source_dir = f"{repo_name}/{source_path}"
|
||||
|
||||
print(f"Moving {source_dir} to {target_dir}")
|
||||
|
||||
# Ensure target directory exists
|
||||
os.makedirs(os.path.dirname(target_dir), exist_ok=True)
|
||||
|
||||
try:
|
||||
# Move the directory
|
||||
shutil.move(source_dir, target_dir)
|
||||
except Exception as e:
|
||||
print(f"Error moving {source_dir} to {target_dir}: {e}")
|
||||
|
||||
|
||||
def main():
|
||||
"""Main function to orchestrate the library sync process."""
|
||||
try:
|
||||
# Load packages configuration
|
||||
package_yaml = load_packages_yaml()
|
||||
packages = [
|
||||
p
|
||||
for p in package_yaml["packages"]
|
||||
if not p.get("disabled", False)
|
||||
and p["repo"].startswith("langchain-ai/")
|
||||
and p["repo"] != "langchain-ai/langchain"
|
||||
]
|
||||
|
||||
# Clean target directories
|
||||
clean_target_directories(packages)
|
||||
|
||||
# Move libraries to their new locations
|
||||
move_libraries(packages)
|
||||
|
||||
print("Library sync completed successfully!")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error during library sync: {e}")
|
||||
raise
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -13,7 +13,7 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -21,6 +21,7 @@ jobs:
|
||||
run:
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
name: "poetry run pytest -m compile tests/integration_tests #${{ inputs.python-version }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
10
.github/workflows/_integration_test.yml
vendored
10
.github/workflows/_integration_test.yml
vendored
@@ -12,7 +12,7 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -41,12 +41,6 @@ jobs:
|
||||
shell: bash
|
||||
run: poetry run pip install "boto3<2" "google-cloud-aiplatform<2"
|
||||
|
||||
- name: 'Authenticate to Google Cloud'
|
||||
id: 'auth'
|
||||
uses: google-github-actions/auth@v2
|
||||
with:
|
||||
credentials_json: '${{ secrets.GOOGLE_CREDENTIALS }}'
|
||||
|
||||
- name: Run integration tests
|
||||
shell: bash
|
||||
env:
|
||||
@@ -81,11 +75,11 @@ jobs:
|
||||
ES_URL: ${{ secrets.ES_URL }}
|
||||
ES_CLOUD_ID: ${{ secrets.ES_CLOUD_ID }}
|
||||
ES_API_KEY: ${{ secrets.ES_API_KEY }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # for airbyte
|
||||
MONGODB_ATLAS_URI: ${{ secrets.MONGODB_ATLAS_URI }}
|
||||
VOYAGE_API_KEY: ${{ secrets.VOYAGE_API_KEY }}
|
||||
COHERE_API_KEY: ${{ secrets.COHERE_API_KEY }}
|
||||
UPSTAGE_API_KEY: ${{ secrets.UPSTAGE_API_KEY }}
|
||||
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
|
||||
run: |
|
||||
make integration_tests
|
||||
|
||||
|
||||
3
.github/workflows/_lint.yml
vendored
3
.github/workflows/_lint.yml
vendored
@@ -13,7 +13,7 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
WORKDIR: ${{ inputs.working-directory == '' && '.' || inputs.working-directory }}
|
||||
|
||||
# This env var allows us to get inline annotations when ruff has complaints.
|
||||
@@ -23,6 +23,7 @@ jobs:
|
||||
build:
|
||||
name: "make lint #${{ inputs.python-version }}"
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
|
||||
65
.github/workflows/_release.yml
vendored
65
.github/workflows/_release.yml
vendored
@@ -21,7 +21,7 @@ on:
|
||||
|
||||
env:
|
||||
PYTHON_VERSION: "3.11"
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -95,9 +95,30 @@ jobs:
|
||||
PKG_NAME: ${{ needs.build.outputs.pkg-name }}
|
||||
VERSION: ${{ needs.build.outputs.version }}
|
||||
run: |
|
||||
REGEX="^$PKG_NAME==\\d+\\.\\d+\\.\\d+\$"
|
||||
echo $REGEX
|
||||
PREV_TAG=$(git tag --sort=-creatordate | grep -P $REGEX || true | head -1)
|
||||
PREV_TAG="$PKG_NAME==${VERSION%.*}.$(( ${VERSION##*.} - 1 ))"; [[ "${VERSION##*.}" -eq 0 ]] && PREV_TAG=""
|
||||
|
||||
# backup case if releasing e.g. 0.3.0, looks up last release
|
||||
# note if last release (chronologically) was e.g. 0.1.47 it will get
|
||||
# that instead of the last 0.2 release
|
||||
if [ -z "$PREV_TAG" ]; then
|
||||
REGEX="^$PKG_NAME==\\d+\\.\\d+\\.\\d+\$"
|
||||
echo $REGEX
|
||||
PREV_TAG=$(git tag --sort=-creatordate | (grep -P $REGEX || true) | head -1)
|
||||
fi
|
||||
|
||||
# if PREV_TAG is empty, let it be empty
|
||||
if [ -z "$PREV_TAG" ]; then
|
||||
echo "No previous tag found - first release"
|
||||
else
|
||||
# confirm prev-tag actually exists in git repo with git tag
|
||||
GIT_TAG_RESULT=$(git tag -l "$PREV_TAG")
|
||||
if [ -z "$GIT_TAG_RESULT" ]; then
|
||||
echo "Previous tag $PREV_TAG not found in git repo"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
TAG="${PKG_NAME}==${VERSION}"
|
||||
if [ "$TAG" == "$PREV_TAG" ]; then
|
||||
echo "No new version to release"
|
||||
@@ -146,6 +167,7 @@ jobs:
|
||||
- release-notes
|
||||
- test-pypi-publish
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
@@ -170,7 +192,12 @@ jobs:
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
- name: Import published package
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: ${{ inputs.working-directory }}/dist/
|
||||
|
||||
- name: Import dist package
|
||||
shell: bash
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
env:
|
||||
@@ -186,15 +213,7 @@ jobs:
|
||||
# - attempt install again after 5 seconds if it fails because there is
|
||||
# sometimes a delay in availability on test pypi
|
||||
run: |
|
||||
poetry run pip install \
|
||||
--extra-index-url https://test.pypi.org/simple/ \
|
||||
"$PKG_NAME==$VERSION" || \
|
||||
( \
|
||||
sleep 15 && \
|
||||
poetry run pip install \
|
||||
--extra-index-url https://test.pypi.org/simple/ \
|
||||
"$PKG_NAME==$VERSION" \
|
||||
)
|
||||
poetry run pip install dist/*.whl
|
||||
|
||||
# Replace all dashes in the package name with underscores,
|
||||
# since that's how Python imports packages with dashes in the name.
|
||||
@@ -203,10 +222,10 @@ jobs:
|
||||
poetry run python -c "import $IMPORT_NAME; print(dir($IMPORT_NAME))"
|
||||
|
||||
- name: Import test dependencies
|
||||
run: poetry install --with test
|
||||
run: poetry install --with test --no-root
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
# Overwrite the local version of the package with the test PyPI version.
|
||||
# Overwrite the local version of the package with the built version
|
||||
- name: Import published package (again)
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
shell: bash
|
||||
@@ -214,9 +233,7 @@ jobs:
|
||||
PKG_NAME: ${{ needs.build.outputs.pkg-name }}
|
||||
VERSION: ${{ needs.build.outputs.version }}
|
||||
run: |
|
||||
poetry run pip install \
|
||||
--extra-index-url https://test.pypi.org/simple/ \
|
||||
"$PKG_NAME==$VERSION"
|
||||
poetry run pip install dist/*.whl
|
||||
|
||||
- name: Run unit tests
|
||||
run: make tests
|
||||
@@ -231,7 +248,7 @@ jobs:
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
id: min-version
|
||||
run: |
|
||||
poetry run pip install packaging
|
||||
poetry run pip install packaging requests
|
||||
python_version="$(poetry run python --version | awk '{print $2}')"
|
||||
min_versions="$(poetry run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml release $python_version)"
|
||||
echo "min-versions=$min_versions" >> "$GITHUB_OUTPUT"
|
||||
@@ -246,12 +263,6 @@ jobs:
|
||||
make tests
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
- name: 'Authenticate to Google Cloud'
|
||||
id: 'auth'
|
||||
uses: google-github-actions/auth@v2
|
||||
with:
|
||||
credentials_json: '${{ secrets.GOOGLE_CREDENTIALS }}'
|
||||
|
||||
- name: Import integration test dependencies
|
||||
run: poetry install --with test,test_integration
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
@@ -289,11 +300,11 @@ jobs:
|
||||
ES_URL: ${{ secrets.ES_URL }}
|
||||
ES_CLOUD_ID: ${{ secrets.ES_CLOUD_ID }}
|
||||
ES_API_KEY: ${{ secrets.ES_API_KEY }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # for airbyte
|
||||
MONGODB_ATLAS_URI: ${{ secrets.MONGODB_ATLAS_URI }}
|
||||
VOYAGE_API_KEY: ${{ secrets.VOYAGE_API_KEY }}
|
||||
UPSTAGE_API_KEY: ${{ secrets.UPSTAGE_API_KEY }}
|
||||
FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}
|
||||
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
|
||||
run: make integration_tests
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
|
||||
62
.github/workflows/_release_docker.yml
vendored
62
.github/workflows/_release_docker.yml
vendored
@@ -1,62 +0,0 @@
|
||||
name: release_docker
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
dockerfile:
|
||||
required: true
|
||||
type: string
|
||||
description: "Path to the Dockerfile to build"
|
||||
image:
|
||||
required: true
|
||||
type: string
|
||||
description: "Name of the image to build"
|
||||
|
||||
env:
|
||||
TEST_TAG: ${{ inputs.image }}:test
|
||||
LATEST_TAG: ${{ inputs.image }}:latest
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Get git tag
|
||||
uses: actions-ecosystem/action-get-latest-tag@v1
|
||||
id: get-latest-tag
|
||||
- name: Set docker tag
|
||||
env:
|
||||
VERSION: ${{ steps.get-latest-tag.outputs.tag }}
|
||||
run: |
|
||||
echo "VERSION_TAG=${{ inputs.image }}:${VERSION#v}" >> $GITHUB_ENV
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
- name: Build for Test
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ${{ inputs.dockerfile }}
|
||||
load: true
|
||||
tags: ${{ env.TEST_TAG }}
|
||||
- name: Test
|
||||
run: |
|
||||
docker run --rm ${{ env.TEST_TAG }} python -c "import langchain"
|
||||
- name: Build and Push to Docker Hub
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ${{ inputs.dockerfile }}
|
||||
# We can only build for the intersection of platforms supported by
|
||||
# QEMU and base python image, for now build only for
|
||||
# linux/amd64 and linux/arm64
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ${{ env.LATEST_TAG }},${{ env.VERSION_TAG }}
|
||||
push: true
|
||||
5
.github/workflows/_test.yml
vendored
5
.github/workflows/_test.yml
vendored
@@ -13,7 +13,7 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -21,6 +21,7 @@ jobs:
|
||||
run:
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
name: "make test #${{ inputs.python-version }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -47,7 +48,7 @@ jobs:
|
||||
id: min-version
|
||||
shell: bash
|
||||
run: |
|
||||
poetry run pip install packaging tomli
|
||||
poetry run pip install packaging tomli requests
|
||||
python_version="$(poetry run python --version | awk '{print $2}')"
|
||||
min_versions="$(poetry run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml pull_request $python_version)"
|
||||
echo "min-versions=$min_versions" >> "$GITHUB_OUTPUT"
|
||||
|
||||
3
.github/workflows/_test_doc_imports.yml
vendored
3
.github/workflows/_test_doc_imports.yml
vendored
@@ -9,11 +9,12 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
name: "check doc imports #${{ inputs.python-version }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
3
.github/workflows/_test_pydantic.yml
vendored
3
.github/workflows/_test_pydantic.yml
vendored
@@ -18,7 +18,7 @@ on:
|
||||
description: "Pydantic version to test."
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -26,6 +26,7 @@ jobs:
|
||||
run:
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
name: "make test # pydantic: ~=${{ inputs.pydantic-version }}, python: ${{ inputs.python-version }}, "
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
2
.github/workflows/_test_release.yml
vendored
2
.github/workflows/_test_release.yml
vendored
@@ -14,7 +14,7 @@ on:
|
||||
description: "Release from a non-master branch (danger!)"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
PYTHON_VERSION: "3.10"
|
||||
|
||||
jobs:
|
||||
|
||||
174
.github/workflows/api_doc_build.yml
vendored
174
.github/workflows/api_doc_build.yml
vendored
@@ -5,7 +5,7 @@ on:
|
||||
schedule:
|
||||
- cron: '0 13 * * *'
|
||||
env:
|
||||
POETRY_VERSION: "1.8.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
PYTHON_VERSION: "3.11"
|
||||
|
||||
jobs:
|
||||
@@ -22,133 +22,29 @@ jobs:
|
||||
repository: langchain-ai/langchain-api-docs-html
|
||||
path: langchain-api-docs-html
|
||||
token: ${{ secrets.TOKEN_GITHUB_API_DOCS_HTML }}
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-google
|
||||
path: langchain-google
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-datastax
|
||||
path: langchain-datastax
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-nvidia
|
||||
path: langchain-nvidia
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-cohere
|
||||
path: langchain-cohere
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-elastic
|
||||
path: langchain-elastic
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-postgres
|
||||
path: langchain-postgres
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-aws
|
||||
path: langchain-aws
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-weaviate
|
||||
path: langchain-weaviate
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-ai21
|
||||
path: langchain-ai21
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-together
|
||||
path: langchain-together
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-experimental
|
||||
path: langchain-experimental
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-milvus
|
||||
path: langchain-milvus
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-unstructured
|
||||
path: langchain-unstructured
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-databricks
|
||||
path: langchain-databricks
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-ibm
|
||||
path: langchain-ibm
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-azure
|
||||
path: langchain-azure
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-mongodb
|
||||
path: langchain-mongodb
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: langchain-ai/langchain-redis
|
||||
path: langchain-redis
|
||||
|
||||
- name: Get repos with yq
|
||||
id: get-unsorted-repos
|
||||
uses: mikefarah/yq@master
|
||||
with:
|
||||
cmd: yq '.packages[].repo' langchain/libs/packages.yml
|
||||
|
||||
|
||||
- name: Set Git config
|
||||
working-directory: langchain
|
||||
- name: Parse YAML and checkout repos
|
||||
env:
|
||||
REPOS_UNSORTED: ${{ steps.get-unsorted-repos.outputs.result }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
git config --local user.email "actions@github.com"
|
||||
git config --local user.name "Github Actions"
|
||||
# Get unique repositories
|
||||
REPOS=$(echo "$REPOS_UNSORTED" | sort -u)
|
||||
|
||||
- name: Move libs
|
||||
run: |
|
||||
rm -rf \
|
||||
langchain/libs/partners/google-genai \
|
||||
langchain/libs/partners/google-vertexai \
|
||||
langchain/libs/partners/astradb \
|
||||
langchain/libs/partners/nvidia-trt \
|
||||
langchain/libs/partners/nvidia-ai-endpoints \
|
||||
langchain/libs/partners/cohere \
|
||||
langchain/libs/partners/elasticsearch \
|
||||
langchain/libs/partners/upstage \
|
||||
langchain/libs/partners/ai21 \
|
||||
langchain/libs/partners/together \
|
||||
langchain/libs/standard-tests \
|
||||
langchain/libs/experimental \
|
||||
langchain/libs/partners/milvus \
|
||||
langchain/libs/partners/unstructured \
|
||||
langchain/libs/partners/databricks \
|
||||
langchain/libs/partners/ibm \
|
||||
langchain/libs/partners/azure-dynamic-sessions \
|
||||
langchain/libs/partners/mongodb \
|
||||
langchain/libs/partners/redis
|
||||
mv langchain-google/libs/genai langchain/libs/partners/google-genai
|
||||
mv langchain-google/libs/vertexai langchain/libs/partners/google-vertexai
|
||||
mv langchain-google/libs/community langchain/libs/partners/google-community
|
||||
mv langchain-datastax/libs/astradb langchain/libs/partners/astradb
|
||||
mv langchain-nvidia/libs/ai-endpoints langchain/libs/partners/nvidia-ai-endpoints
|
||||
mv langchain-cohere/libs/cohere langchain/libs/partners/cohere
|
||||
mv langchain-elastic/libs/elasticsearch langchain/libs/partners/elasticsearch
|
||||
mv langchain-postgres langchain/libs/partners/postgres
|
||||
mv langchain-aws/libs/aws langchain/libs/partners/aws
|
||||
mv langchain-weaviate/libs/weaviate langchain/libs/partners/weaviate
|
||||
mv langchain-ai21/libs/ai21 langchain/libs/partners/ai21
|
||||
mv langchain-together/libs/together langchain/libs/partners/together
|
||||
mv langchain-experimental/libs/experimental langchain/libs/experimental
|
||||
mv langchain-milvus/libs/milvus langchain/libs/partners/milvus
|
||||
mv langchain-unstructured/libs/unstructured langchain/libs/partners/unstructured
|
||||
mv langchain-databricks/libs/databricks langchain/libs/partners/databricks
|
||||
mv langchain-ibm/libs/ibm langchain/libs/partners/ibm
|
||||
mv langchain-azure/libs/azure-dynamic-sessions langchain/libs/partners/azure-dynamic-sessions
|
||||
mv langchain-mongodb/libs/mongodb langchain/libs/partners/mongodb
|
||||
mv langchain-redis/libs/redis langchain/libs/partners/redis
|
||||
|
||||
- name: Rm old html
|
||||
run:
|
||||
rm -rf langchain-api-docs-html/api_reference_build/html
|
||||
# Checkout each unique repository that is in langchain-ai org
|
||||
for repo in $REPOS; do
|
||||
if [[ "$repo" != "langchain-ai/langchain" && "$repo" == langchain-ai/* ]]; then
|
||||
REPO_NAME=$(echo $repo | cut -d'/' -f2)
|
||||
echo "Checking out $repo to $REPO_NAME"
|
||||
git clone --depth 1 https://github.com/$repo.git $REPO_NAME
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Set up Python ${{ env.PYTHON_VERSION }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./langchain/.github/actions/poetry_setup"
|
||||
@@ -158,16 +54,34 @@ jobs:
|
||||
cache-key: api-docs
|
||||
working-directory: langchain
|
||||
|
||||
- name: Install dependencies
|
||||
- name: Install initial py deps
|
||||
working-directory: langchain
|
||||
run: |
|
||||
python -m pip install -U uv
|
||||
python -m uv pip install --upgrade --no-cache-dir pip setuptools
|
||||
# skip airbyte due to pandas dependency issue
|
||||
python -m uv pip install $(ls ./libs/partners | grep -vE "airbyte" | xargs -I {} echo "./libs/partners/{}")
|
||||
python -m uv pip install libs/core libs/langchain libs/text-splitters libs/community libs/experimental
|
||||
python -m uv pip install --upgrade --no-cache-dir pip setuptools pyyaml
|
||||
|
||||
- name: Move libs with script
|
||||
run: python langchain/.github/scripts/prep_api_docs_build.py
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Rm old html
|
||||
run:
|
||||
rm -rf langchain-api-docs-html/api_reference_build/html
|
||||
|
||||
- name: Install dependencies
|
||||
working-directory: langchain
|
||||
run: |
|
||||
python -m uv pip install $(ls ./libs/partners | xargs -I {} echo "./libs/partners/{}")
|
||||
python -m uv pip install libs/core libs/langchain libs/text-splitters libs/community libs/experimental libs/standard-tests
|
||||
python -m uv pip install -r docs/api_reference/requirements.txt
|
||||
|
||||
- name: Set Git config
|
||||
working-directory: langchain
|
||||
run: |
|
||||
git config --local user.email "actions@github.com"
|
||||
git config --local user.name "Github Actions"
|
||||
|
||||
- name: Build docs
|
||||
working-directory: langchain
|
||||
run: |
|
||||
@@ -182,4 +96,4 @@ jobs:
|
||||
- uses: EndBug/add-and-commit@v9
|
||||
with:
|
||||
cwd: langchain-api-docs-html
|
||||
message: 'Update API docs build'
|
||||
message: 'Update API docs build'
|
||||
|
||||
6
.github/workflows/check_diffs.yml
vendored
6
.github/workflows/check_diffs.yml
vendored
@@ -5,6 +5,7 @@ on:
|
||||
push:
|
||||
branches: [master]
|
||||
pull_request:
|
||||
merge_group:
|
||||
|
||||
# If another push to the same PR or branch happens while this workflow is still running,
|
||||
# cancel the earlier run in favor of the next run.
|
||||
@@ -17,7 +18,7 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -31,7 +32,7 @@ jobs:
|
||||
uses: Ana06/get-changed-files@v2.2.0
|
||||
- id: set-matrix
|
||||
run: |
|
||||
python -m pip install packaging
|
||||
python -m pip install packaging requests
|
||||
python .github/scripts/check_diff.py ${{ steps.files.outputs.all }} >> $GITHUB_OUTPUT
|
||||
outputs:
|
||||
lint: ${{ steps.set-matrix.outputs.lint }}
|
||||
@@ -119,6 +120,7 @@ jobs:
|
||||
job-configs: ${{ fromJson(needs.build.outputs.extended-tests) }}
|
||||
fail-fast: false
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ${{ matrix.job-configs.working-directory }}
|
||||
|
||||
14
.github/workflows/langchain_release_docker.yml
vendored
14
.github/workflows/langchain_release_docker.yml
vendored
@@ -1,14 +0,0 @@
|
||||
---
|
||||
name: docker/langchain/langchain Release
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI
|
||||
workflow_call: # Allows triggering from another workflow
|
||||
|
||||
jobs:
|
||||
release:
|
||||
uses: ./.github/workflows/_release_docker.yml
|
||||
with:
|
||||
dockerfile: docker/Dockerfile.base
|
||||
image: langchain/langchain
|
||||
secrets: inherit
|
||||
2
.github/workflows/run_notebooks.yml
vendored
2
.github/workflows/run_notebooks.yml
vendored
@@ -15,7 +15,7 @@ on:
|
||||
- cron: '0 13 * * *'
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
54
.github/workflows/scheduled_test.yml
vendored
54
.github/workflows/scheduled_test.yml
vendored
@@ -2,32 +2,60 @@ name: Scheduled tests
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI
|
||||
inputs:
|
||||
working-directory-force:
|
||||
type: string
|
||||
description: "From which folder this pipeline executes - defaults to all in matrix - example value: libs/partners/anthropic"
|
||||
python-version-force:
|
||||
type: string
|
||||
description: "Python version to use - defaults to 3.9 and 3.11 in matrix - example value: 3.9"
|
||||
schedule:
|
||||
- cron: '0 13 * * *'
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.7.1"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
DEFAULT_LIBS: '["libs/partners/openai", "libs/partners/anthropic", "libs/partners/fireworks", "libs/partners/groq", "libs/partners/mistralai", "libs/partners/google-vertexai", "libs/partners/google-genai", "libs/partners/aws"]'
|
||||
|
||||
jobs:
|
||||
compute-matrix:
|
||||
if: github.repository_owner == 'langchain-ai' || github.event_name != 'schedule'
|
||||
runs-on: ubuntu-latest
|
||||
name: Compute matrix
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- name: Set matrix
|
||||
id: set-matrix
|
||||
env:
|
||||
DEFAULT_LIBS: ${{ env.DEFAULT_LIBS }}
|
||||
WORKING_DIRECTORY_FORCE: ${{ github.event.inputs.working-directory-force || '' }}
|
||||
PYTHON_VERSION_FORCE: ${{ github.event.inputs.python-version-force || '' }}
|
||||
run: |
|
||||
# echo "matrix=..." where matrix is a json formatted str with keys python-version and working-directory
|
||||
# python-version should default to 3.9 and 3.11, but is overridden to [PYTHON_VERSION_FORCE] if set
|
||||
# working-directory should default to DEFAULT_LIBS, but is overridden to [WORKING_DIRECTORY_FORCE] if set
|
||||
python_version='["3.9", "3.11"]'
|
||||
working_directory="$DEFAULT_LIBS"
|
||||
if [ -n "$PYTHON_VERSION_FORCE" ]; then
|
||||
python_version="[\"$PYTHON_VERSION_FORCE\"]"
|
||||
fi
|
||||
if [ -n "$WORKING_DIRECTORY_FORCE" ]; then
|
||||
working_directory="[\"$WORKING_DIRECTORY_FORCE\"]"
|
||||
fi
|
||||
matrix="{\"python-version\": $python_version, \"working-directory\": $working_directory}"
|
||||
echo $matrix
|
||||
echo "matrix=$matrix" >> $GITHUB_OUTPUT
|
||||
build:
|
||||
if: github.repository_owner == 'langchain-ai' || github.event_name != 'schedule'
|
||||
name: Python ${{ matrix.python-version }} - ${{ matrix.working-directory }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: [compute-matrix]
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version:
|
||||
- "3.9"
|
||||
- "3.11"
|
||||
working-directory:
|
||||
- "libs/partners/openai"
|
||||
- "libs/partners/anthropic"
|
||||
- "libs/partners/fireworks"
|
||||
- "libs/partners/groq"
|
||||
- "libs/partners/mistralai"
|
||||
- "libs/partners/google-vertexai"
|
||||
- "libs/partners/google-genai"
|
||||
- "libs/partners/aws"
|
||||
python-version: ${{ fromJSON(needs.compute-matrix.outputs.matrix).python-version }}
|
||||
working-directory: ${{ fromJSON(needs.compute-matrix.outputs.matrix).working-directory }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# Migrating
|
||||
|
||||
Please see the following guides for migratin LangChain code:
|
||||
Please see the following guides for migrating LangChain code:
|
||||
|
||||
* Migrate to [LangChain v0.3](https://python.langchain.com/docs/versions/v0_3/)
|
||||
* Migrate to [LangChain v0.2](https://python.langchain.com/docs/versions/v0_2/)
|
||||
* Migrating from [LangChain 0.0.x Chains](https://python.langchain.com/docs/versions/migrating_chains/)
|
||||
* Upgrate to [LangGraph Memory](https://python.langchain.com/docs/versions/migrating_memory/)
|
||||
* Upgrade to [LangGraph Memory](https://python.langchain.com/docs/versions/migrating_memory/)
|
||||
|
||||
The [LangChain CLI](https://python.langchain.com/docs/versions/v0_3/#migrate-using-langchain-cli) can help automatically upgrade your code to use non deprecated imports.
|
||||
The [LangChain CLI](https://python.langchain.com/docs/versions/v0_3/#migrate-using-langchain-cli) can help you automatically upgrade your code to use non-deprecated imports.
|
||||
This will be especially helpful if you're still on either version 0.0.x or 0.1.x of LangChain.
|
||||
|
||||
16
Makefile
16
Makefile
@@ -66,12 +66,16 @@ spell_fix:
|
||||
|
||||
## lint: Run linting on the project.
|
||||
lint lint_package lint_tests:
|
||||
poetry run ruff check docs templates cookbook
|
||||
poetry run ruff format docs templates cookbook --diff
|
||||
poetry run ruff check --select I docs templates cookbook
|
||||
git grep 'from langchain import' docs/docs templates cookbook | grep -vE 'from langchain import (hub)' && exit 1 || exit 0
|
||||
poetry run ruff check docs cookbook
|
||||
poetry run ruff format docs cookbook cookbook --diff
|
||||
poetry run ruff check --select I docs cookbook
|
||||
git --no-pager grep 'from langchain import' docs cookbook | grep -vE 'from langchain import (hub)' && echo "Error: no importing langchain from root in docs, except for hub" && exit 1 || exit 0
|
||||
|
||||
git --no-pager grep 'api.python.langchain.com' -- docs/docs ':!docs/docs/additional_resources/arxiv_references.mdx' ':!docs/docs/integrations/document_loaders/sitemap.ipynb' || exit 0 && \
|
||||
echo "Error: you should link python.langchain.com/api_reference, not api.python.langchain.com in the docs" && \
|
||||
exit 1
|
||||
|
||||
## format: Format the project files.
|
||||
format format_diff:
|
||||
poetry run ruff format docs templates cookbook
|
||||
poetry run ruff check --select I --fix docs templates cookbook
|
||||
poetry run ruff format docs cookbook
|
||||
poetry run ruff check --select I --fix docs cookbook
|
||||
|
||||
53
README.md
53
README.md
@@ -38,18 +38,21 @@ conda install langchain -c conda-forge
|
||||
|
||||
For these applications, LangChain simplifies the entire application lifecycle:
|
||||
|
||||
- **Open-source libraries**: Build your applications using LangChain's open-source [building blocks](https://python.langchain.com/docs/concepts/#langchain-expression-language-lcel), [components](https://python.langchain.com/docs/concepts/), and [third-party integrations](https://python.langchain.com/docs/integrations/providers/).
|
||||
|
||||
- **Open-source libraries**: Build your applications using LangChain's open-source
|
||||
[components](https://python.langchain.com/docs/concepts/) and
|
||||
[third-party integrations](https://python.langchain.com/docs/integrations/providers/).
|
||||
Use [LangGraph](https://langchain-ai.github.io/langgraph/) to build stateful agents with first-class streaming and human-in-the-loop support.
|
||||
- **Productionization**: Inspect, monitor, and evaluate your apps with [LangSmith](https://docs.smith.langchain.com/) so that you can constantly optimize and deploy with confidence.
|
||||
- **Deployment**: Turn your LangGraph applications into production-ready APIs and Assistants with [LangGraph Cloud](https://langchain-ai.github.io/langgraph/cloud/).
|
||||
- **Deployment**: Turn your LangGraph applications into production-ready APIs and Assistants with [LangGraph Platform](https://langchain-ai.github.io/langgraph/cloud/).
|
||||
|
||||
### Open-source libraries
|
||||
|
||||
- **`langchain-core`**: Base abstractions and LangChain Expression Language.
|
||||
- **`langchain-community`**: Third party integrations.
|
||||
- Some integrations have been further split into **partner packages** that only rely on **`langchain-core`**. Examples include **`langchain_openai`** and **`langchain_anthropic`**.
|
||||
- **`langchain-core`**: Base abstractions.
|
||||
- **Integration packages** (e.g. **`langchain-openai`**, **`langchain-anthropic`**, etc.): Important integrations have been split into lightweight packages that are co-maintained by the LangChain team and the integration developers.
|
||||
- **`langchain`**: Chains, agents, and retrieval strategies that make up an application's cognitive architecture.
|
||||
- **[`LangGraph`](https://langchain-ai.github.io/langgraph/)**: A library for building robust and stateful multi-actor applications with LLMs by modeling steps as edges and nodes in a graph. Integrates smoothly with LangChain, but can be used without it. To learn more about LangGraph, check out our first LangChain Academy course, *Introduction to LangGraph*, available [here](https://academy.langchain.com/courses/intro-to-langgraph).
|
||||
- **`langchain-community`**: Third-party integrations that are community maintained.
|
||||
- **[LangGraph](https://langchain-ai.github.io/langgraph)**: Build robust and stateful multi-actor applications with LLMs by modeling steps as edges and nodes in a graph. Integrates smoothly with LangChain, but can be used without it. To learn more about LangGraph, check out our first LangChain Academy course, *Introduction to LangGraph*, available [here](https://academy.langchain.com/courses/intro-to-langgraph).
|
||||
|
||||
### Productionization:
|
||||
|
||||
@@ -57,9 +60,10 @@ For these applications, LangChain simplifies the entire application lifecycle:
|
||||
|
||||
### Deployment:
|
||||
|
||||
- **[LangGraph Cloud](https://langchain-ai.github.io/langgraph/cloud/)**: Turn your LangGraph applications into production-ready APIs and Assistants.
|
||||
- **[LangGraph Platform](https://langchain-ai.github.io/langgraph/cloud/)**: Turn your LangGraph applications into production-ready APIs and Assistants.
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
## 🧱 What can you build with LangChain?
|
||||
|
||||
@@ -84,19 +88,12 @@ And much more! Head to the [Tutorials](https://python.langchain.com/docs/tutoria
|
||||
|
||||
The main value props of the LangChain libraries are:
|
||||
|
||||
1. **Components**: composable building blocks, tools and integrations for working with language models. Components are modular and easy-to-use, whether you are using the rest of the LangChain framework or not
|
||||
2. **Off-the-shelf chains**: built-in assemblages of components for accomplishing higher-level tasks
|
||||
|
||||
Off-the-shelf chains make it easy to get started. Components make it easy to customize existing chains and build new ones.
|
||||
|
||||
## LangChain Expression Language (LCEL)
|
||||
|
||||
LCEL is a key part of LangChain, allowing you to build and organize chains of processes in a straightforward, declarative manner. It was designed to support taking prototypes directly into production without needing to alter any code. This means you can use LCEL to set up everything from basic "prompt + LLM" setups to intricate, multi-step workflows.
|
||||
|
||||
- **[Overview](https://python.langchain.com/docs/concepts/#langchain-expression-language-lcel)**: LCEL and its benefits
|
||||
- **[Interface](https://python.langchain.com/docs/concepts/#runnable-interface)**: The standard Runnable interface for LCEL objects
|
||||
- **[Primitives](https://python.langchain.com/docs/how_to/#langchain-expression-language-lcel)**: More on the primitives LCEL includes
|
||||
- **[Cheatsheet](https://python.langchain.com/docs/how_to/lcel_cheatsheet/)**: Quick overview of the most common usage patterns
|
||||
1. **Components**: composable building blocks, tools and integrations for working with language models. Components are modular and easy-to-use, whether you are using the rest of the LangChain framework or not.
|
||||
2. **Easy orchestration with LangGraph**: [LangGraph](https://langchain-ai.github.io/langgraph/),
|
||||
built on top of `langchain-core`, has built-in support for [messages](https://python.langchain.com/docs/concepts/messages/), [tools](https://python.langchain.com/docs/concepts/tools/),
|
||||
and other LangChain abstractions. This makes it easy to combine components into
|
||||
production-ready applications with persistence, streaming, and other key features.
|
||||
Check out the LangChain [tutorials page](https://python.langchain.com/docs/tutorials/#orchestration) for examples.
|
||||
|
||||
## Components
|
||||
|
||||
@@ -104,15 +101,19 @@ Components fall into the following **modules**:
|
||||
|
||||
**📃 Model I/O**
|
||||
|
||||
This includes [prompt management](https://python.langchain.com/docs/concepts/#prompt-templates), [prompt optimization](https://python.langchain.com/docs/concepts/#example-selectors), a generic interface for [chat models](https://python.langchain.com/docs/concepts/#chat-models) and [LLMs](https://python.langchain.com/docs/concepts/#llms), and common utilities for working with [model outputs](https://python.langchain.com/docs/concepts/#output-parsers).
|
||||
This includes [prompt management](https://python.langchain.com/docs/concepts/prompt_templates/)
|
||||
and a generic interface for [chat models](https://python.langchain.com/docs/concepts/chat_models/), including a consistent interface for [tool-calling](https://python.langchain.com/docs/concepts/tool_calling/) and [structured output](https://python.langchain.com/docs/concepts/structured_outputs/) across model providers.
|
||||
|
||||
**📚 Retrieval**
|
||||
|
||||
Retrieval Augmented Generation involves [loading data](https://python.langchain.com/docs/concepts/#document-loaders) from a variety of sources, [preparing it](https://python.langchain.com/docs/concepts/#text-splitters), then [searching over (a.k.a. retrieving from)](https://python.langchain.com/docs/concepts/#retrievers) it for use in the generation step.
|
||||
Retrieval Augmented Generation involves [loading data](https://python.langchain.com/docs/concepts/document_loaders/) from a variety of sources, [preparing it](https://python.langchain.com/docs/concepts/text_splitters/), then [searching over (a.k.a. retrieving from)](https://python.langchain.com/docs/concepts/retrievers/) it for use in the generation step.
|
||||
|
||||
**🤖 Agents**
|
||||
|
||||
Agents allow an LLM autonomy over how a task is accomplished. Agents make decisions about which Actions to take, then take that Action, observe the result, and repeat until the task is complete. LangChain provides a [standard interface for agents](https://python.langchain.com/docs/concepts/#agents), along with [LangGraph](https://github.com/langchain-ai/langgraph) for building custom agents.
|
||||
Agents allow an LLM autonomy over how a task is accomplished. Agents make decisions about which Actions to take, then take that Action, observe the result, and repeat until the task is complete. [LangGraph](https://langchain-ai.github.io/langgraph/) makes it easy to use
|
||||
LangChain components to build both [custom](https://langchain-ai.github.io/langgraph/tutorials/)
|
||||
and [built-in](https://langchain-ai.github.io/langgraph/how-tos/create-react-agent/)
|
||||
LLM agents.
|
||||
|
||||
## 📖 Documentation
|
||||
|
||||
@@ -122,13 +123,13 @@ Please see [here](https://python.langchain.com) for full documentation, which in
|
||||
- [Tutorials](https://python.langchain.com/docs/tutorials/): If you're looking to build something specific or are more of a hands-on learner, check out our tutorials. This is the best place to get started.
|
||||
- [How-to guides](https://python.langchain.com/docs/how_to/): Answers to “How do I….?” type questions. These guides are goal-oriented and concrete; they're meant to help you complete a specific task.
|
||||
- [Conceptual guide](https://python.langchain.com/docs/concepts/): Conceptual explanations of the key parts of the framework.
|
||||
- [API Reference](https://api.python.langchain.com): Thorough documentation of every class and method.
|
||||
- [API Reference](https://python.langchain.com/api_reference/): Thorough documentation of every class and method.
|
||||
|
||||
## 🌐 Ecosystem
|
||||
|
||||
- [🦜🛠️ LangSmith](https://docs.smith.langchain.com/): Trace and evaluate your language model applications and intelligent agents to help you move from prototype to production.
|
||||
- [🦜🕸️ LangGraph](https://langchain-ai.github.io/langgraph/): Create stateful, multi-actor applications with LLMs. Integrates smoothly with LangChain, but can be used without it.
|
||||
- [🦜🏓 LangServe](https://python.langchain.com/docs/langserve): Deploy LangChain runnables and chains as REST APIs.
|
||||
- [🦜🕸️ LangGraph Platform](https://langchain-ai.github.io/langgraph/concepts/#langgraph-platform): Deploy LLM applications built with LangGraph into production.
|
||||
|
||||
## 💁 Contributing
|
||||
|
||||
|
||||
37
SECURITY.md
37
SECURITY.md
@@ -1,5 +1,30 @@
|
||||
# Security Policy
|
||||
|
||||
LangChain has a large ecosystem of integrations with various external resources like local and remote file systems, APIs and databases. These integrations allow developers to create versatile applications that combine the power of LLMs with the ability to access, interact with and manipulate external resources.
|
||||
|
||||
## Best practices
|
||||
|
||||
When building such applications developers should remember to follow good security practices:
|
||||
|
||||
* [**Limit Permissions**](https://en.wikipedia.org/wiki/Principle_of_least_privilege): Scope permissions specifically to the application's need. Granting broad or excessive permissions can introduce significant security vulnerabilities. To avoid such vulnerabilities, consider using read-only credentials, disallowing access to sensitive resources, using sandboxing techniques (such as running inside a container), specifying proxy configurations to control external requests, etc. as appropriate for your application.
|
||||
* **Anticipate Potential Misuse**: Just as humans can err, so can Large Language Models (LLMs). Always assume that any system access or credentials may be used in any way allowed by the permissions they are assigned. For example, if a pair of database credentials allows deleting data, it’s safest to assume that any LLM able to use those credentials may in fact delete data.
|
||||
* [**Defense in Depth**](https://en.wikipedia.org/wiki/Defense_in_depth_(computing)): No security technique is perfect. Fine-tuning and good chain design can reduce, but not eliminate, the odds that a Large Language Model (LLM) may make a mistake. It’s best to combine multiple layered security approaches rather than relying on any single layer of defense to ensure security. For example: use both read-only permissions and sandboxing to ensure that LLMs are only able to access data that is explicitly meant for them to use.
|
||||
|
||||
Risks of not doing so include, but are not limited to:
|
||||
* Data corruption or loss.
|
||||
* Unauthorized access to confidential information.
|
||||
* Compromised performance or availability of critical resources.
|
||||
|
||||
Example scenarios with mitigation strategies:
|
||||
|
||||
* A user may ask an agent with access to the file system to delete files that should not be deleted or read the content of files that contain sensitive information. To mitigate, limit the agent to only use a specific directory and only allow it to read or write files that are safe to read or write. Consider further sandboxing the agent by running it in a container.
|
||||
* A user may ask an agent with write access to an external API to write malicious data to the API, or delete data from that API. To mitigate, give the agent read-only API keys, or limit it to only use endpoints that are already resistant to such misuse.
|
||||
* A user may ask an agent with access to a database to drop a table or mutate the schema. To mitigate, scope the credentials to only the tables that the agent needs to access and consider issuing READ-ONLY credentials.
|
||||
|
||||
If you're building applications that access external resources like file systems, APIs
|
||||
or databases, consider speaking with your company's security team to determine how to best
|
||||
design and secure your applications.
|
||||
|
||||
## Reporting OSS Vulnerabilities
|
||||
|
||||
LangChain is partnered with [huntr by Protect AI](https://huntr.com/) to provide
|
||||
@@ -14,7 +39,7 @@ Before reporting a vulnerability, please review:
|
||||
|
||||
1) In-Scope Targets and Out-of-Scope Targets below.
|
||||
2) The [langchain-ai/langchain](https://python.langchain.com/docs/contributing/repo_structure) monorepo structure.
|
||||
3) LangChain [security guidelines](https://python.langchain.com/docs/security) to
|
||||
3) The [Best practicies](#best-practices) above to
|
||||
understand what we consider to be a security vulnerability vs. developer
|
||||
responsibility.
|
||||
|
||||
@@ -33,13 +58,13 @@ The following packages and repositories are eligible for bug bounties:
|
||||
All out of scope targets defined by huntr as well as:
|
||||
|
||||
- **langchain-experimental**: This repository is for experimental code and is not
|
||||
eligible for bug bounties, bug reports to it will be marked as interesting or waste of
|
||||
eligible for bug bounties (see [package warning](https://pypi.org/project/langchain-experimental/)), bug reports to it will be marked as interesting or waste of
|
||||
time and published with no bounty attached.
|
||||
- **tools**: Tools in either langchain or langchain-community are not eligible for bug
|
||||
bounties. This includes the following directories
|
||||
- langchain/tools
|
||||
- langchain-community/tools
|
||||
- Please review our [security guidelines](https://python.langchain.com/docs/security)
|
||||
- libs/langchain/langchain/tools
|
||||
- libs/community/langchain_community/tools
|
||||
- Please review the [best practices](#best-practices)
|
||||
for more details, but generally tools interact with the real world. Developers are
|
||||
expected to understand the security implications of their code and are responsible
|
||||
for the security of their tools.
|
||||
@@ -47,7 +72,7 @@ All out of scope targets defined by huntr as well as:
|
||||
case basis, but likely will not be eligible for a bounty as the code is already
|
||||
documented with guidelines for developers that should be followed for making their
|
||||
application secure.
|
||||
- Any LangSmith related repositories or APIs see below.
|
||||
- Any LangSmith related repositories or APIs (see [Reporting LangSmith Vulnerabilities](#reporting-langsmith-vulnerabilities)).
|
||||
|
||||
## Reporting LangSmith Vulnerabilities
|
||||
|
||||
|
||||
@@ -62,4 +62,6 @@ Notebook | Description
|
||||
[wikibase_agent.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/wikibase_agent.ipynb) | Create a simple wikibase agent that utilizes sparql generation, with testing done on http://wikidata.org.
|
||||
[oracleai_demo.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/oracleai_demo.ipynb) | This guide outlines how to utilize Oracle AI Vector Search alongside Langchain for an end-to-end RAG pipeline, providing step-by-step examples. The process includes loading documents from various sources using OracleDocLoader, summarizing them either within or outside the database with OracleSummary, and generating embeddings similarly through OracleEmbeddings. It also covers chunking documents according to specific requirements using Advanced Oracle Capabilities from OracleTextSplitter, and finally, storing and indexing these documents in a Vector Store for querying with OracleVS.
|
||||
[rag-locally-on-intel-cpu.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/rag-locally-on-intel-cpu.ipynb) | Perform Retrieval-Augmented-Generation (RAG) on locally downloaded open-source models using langchain and open source tools and execute it on Intel Xeon CPU. We showed an example of how to apply RAG on Llama 2 model and enable it to answer the queries related to Intel Q1 2024 earnings release.
|
||||
[visual_RAG_vdms.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/visual_RAG_vdms.ipynb) | Performs Visual Retrieval-Augmented-Generation (RAG) using videos and scene descriptions generated by open source models.
|
||||
[visual_RAG_vdms.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/visual_RAG_vdms.ipynb) | Performs Visual Retrieval-Augmented-Generation (RAG) using videos and scene descriptions generated by open source models.
|
||||
[contextual_rag.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/contextual_rag.ipynb) | Performs contextual retrieval-augmented generation (RAG) prepending chunk-specific explanatory context to each chunk before embedding.
|
||||
[rag-agents-locally-on-intel-cpu.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/local_rag_agents_intel_cpu.ipynb) | Build a RAG agent locally with open source models that routes questions through one of two paths to find answers. The agent generates answers based on documents retrieved from either the vector database or retrieved from web search. If the vector database lacks relevant information, the agent opts for web search. Open-source models for LLM and embeddings are used locally on an Intel Xeon CPU to execute this pipeline.
|
||||
1381
cookbook/contextual_rag.ipynb
Normal file
1381
cookbook/contextual_rag.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
655
cookbook/local_rag_agents_intel_cpu.ipynb
Normal file
655
cookbook/local_rag_agents_intel_cpu.ipynb
Normal file
File diff suppressed because one or more lines are too long
@@ -1,3 +0,0 @@
|
||||
FROM python:3.11
|
||||
|
||||
RUN pip install langchain
|
||||
@@ -1,12 +0,0 @@
|
||||
# Makefile
|
||||
|
||||
build_graphdb:
|
||||
docker build --tag graphdb ./graphdb
|
||||
|
||||
start_graphdb:
|
||||
docker-compose up -d graphdb
|
||||
|
||||
down:
|
||||
docker-compose down -v --remove-orphans
|
||||
|
||||
.PHONY: build_graphdb start_graphdb down
|
||||
@@ -1,84 +0,0 @@
|
||||
# docker-compose to make it easier to spin up integration tests.
|
||||
# Services should use NON standard ports to avoid collision with
|
||||
# any existing services that might be used for development.
|
||||
# ATTENTION: When adding a service below use a non-standard port
|
||||
# increment by one from the preceding port.
|
||||
# For credentials always use `langchain` and `langchain` for the
|
||||
# username and password.
|
||||
version: "3"
|
||||
name: langchain-tests
|
||||
|
||||
services:
|
||||
redis:
|
||||
image: redis/redis-stack-server:latest
|
||||
# We use non standard ports since
|
||||
# these instances are used for testing
|
||||
# and users may already have existing
|
||||
# redis instances set up locally
|
||||
# for other projects
|
||||
ports:
|
||||
- "6020:6379"
|
||||
volumes:
|
||||
- ./redis-volume:/data
|
||||
graphdb:
|
||||
image: graphdb
|
||||
ports:
|
||||
- "6021:7200"
|
||||
mongo:
|
||||
image: mongo:latest
|
||||
container_name: mongo_container
|
||||
ports:
|
||||
- "6022:27017"
|
||||
environment:
|
||||
MONGO_INITDB_ROOT_USERNAME: langchain
|
||||
MONGO_INITDB_ROOT_PASSWORD: langchain
|
||||
postgres:
|
||||
image: postgres:16
|
||||
environment:
|
||||
POSTGRES_DB: langchain
|
||||
POSTGRES_USER: langchain
|
||||
POSTGRES_PASSWORD: langchain
|
||||
ports:
|
||||
- "6023:5432"
|
||||
command: |
|
||||
postgres -c log_statement=all
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD-SHELL",
|
||||
"psql postgresql://langchain:langchain@localhost/langchain --command 'SELECT 1;' || exit 1",
|
||||
]
|
||||
interval: 5s
|
||||
retries: 60
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
pgvector:
|
||||
# postgres with the pgvector extension
|
||||
image: ankane/pgvector
|
||||
environment:
|
||||
POSTGRES_DB: langchain
|
||||
POSTGRES_USER: langchain
|
||||
POSTGRES_PASSWORD: langchain
|
||||
ports:
|
||||
- "6024:5432"
|
||||
command: |
|
||||
postgres -c log_statement=all
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD-SHELL",
|
||||
"psql postgresql://langchain:langchain@localhost/langchain --command 'SELECT 1;' || exit 1",
|
||||
]
|
||||
interval: 5s
|
||||
retries: 60
|
||||
volumes:
|
||||
- postgres_data_pgvector:/var/lib/postgresql/data
|
||||
vdms:
|
||||
image: intellabs/vdms:latest
|
||||
container_name: vdms_container
|
||||
ports:
|
||||
- "6025:55555"
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
postgres_data_pgvector:
|
||||
@@ -1,5 +0,0 @@
|
||||
FROM ontotext/graphdb:10.5.1
|
||||
RUN mkdir -p /opt/graphdb/dist/data/repositories/langchain
|
||||
COPY config.ttl /opt/graphdb/dist/data/repositories/langchain/
|
||||
COPY graphdb_create.sh /run.sh
|
||||
ENTRYPOINT bash /run.sh
|
||||
@@ -1,46 +0,0 @@
|
||||
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
|
||||
@prefix rep: <http://www.openrdf.org/config/repository#>.
|
||||
@prefix sr: <http://www.openrdf.org/config/repository/sail#>.
|
||||
@prefix sail: <http://www.openrdf.org/config/sail#>.
|
||||
@prefix graphdb: <http://www.ontotext.com/config/graphdb#>.
|
||||
|
||||
[] a rep:Repository ;
|
||||
rep:repositoryID "langchain" ;
|
||||
rdfs:label "" ;
|
||||
rep:repositoryImpl [
|
||||
rep:repositoryType "graphdb:SailRepository" ;
|
||||
sr:sailImpl [
|
||||
sail:sailType "graphdb:Sail" ;
|
||||
|
||||
graphdb:read-only "false" ;
|
||||
|
||||
# Inference and Validation
|
||||
graphdb:ruleset "empty" ;
|
||||
graphdb:disable-sameAs "true" ;
|
||||
graphdb:check-for-inconsistencies "false" ;
|
||||
|
||||
# Indexing
|
||||
graphdb:entity-id-size "32" ;
|
||||
graphdb:enable-context-index "false" ;
|
||||
graphdb:enablePredicateList "true" ;
|
||||
graphdb:enable-fts-index "false" ;
|
||||
graphdb:fts-indexes ("default" "iri") ;
|
||||
graphdb:fts-string-literals-index "default" ;
|
||||
graphdb:fts-iris-index "none" ;
|
||||
|
||||
# Queries and Updates
|
||||
graphdb:query-timeout "0" ;
|
||||
graphdb:throw-QueryEvaluationException-on-timeout "false" ;
|
||||
graphdb:query-limit-results "0" ;
|
||||
|
||||
# Settable in the file but otherwise hidden in the UI and in the RDF4J console
|
||||
graphdb:base-URL "http://example.org/owlim#" ;
|
||||
graphdb:defaultNS "" ;
|
||||
graphdb:imports "" ;
|
||||
graphdb:repository-type "file-repository" ;
|
||||
graphdb:storage-folder "storage" ;
|
||||
graphdb:entity-index-size "10000000" ;
|
||||
graphdb:in-memory-literal-properties "true" ;
|
||||
graphdb:enable-literal-index "true" ;
|
||||
]
|
||||
].
|
||||
@@ -1,28 +0,0 @@
|
||||
#! /bin/bash
|
||||
REPOSITORY_ID="langchain"
|
||||
GRAPHDB_URI="http://localhost:7200/"
|
||||
|
||||
echo -e "\nUsing GraphDB: ${GRAPHDB_URI}"
|
||||
|
||||
function startGraphDB {
|
||||
echo -e "\nStarting GraphDB..."
|
||||
exec /opt/graphdb/dist/bin/graphdb
|
||||
}
|
||||
|
||||
function waitGraphDBStart {
|
||||
echo -e "\nWaiting GraphDB to start..."
|
||||
for _ in $(seq 1 5); do
|
||||
CHECK_RES=$(curl --silent --write-out '%{http_code}' --output /dev/null ${GRAPHDB_URI}/rest/repositories)
|
||||
if [ "${CHECK_RES}" = '200' ]; then
|
||||
echo -e "\nUp and running"
|
||||
break
|
||||
fi
|
||||
sleep 30s
|
||||
echo "CHECK_RES: ${CHECK_RES}"
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
startGraphDB &
|
||||
waitGraphDBStart
|
||||
wait
|
||||
@@ -13,32 +13,25 @@ OUTPUT_NEW_DOCS_DIR = $(OUTPUT_NEW_DIR)/docs
|
||||
|
||||
PYTHON = .venv/bin/python
|
||||
|
||||
PARTNER_DEPS_LIST := $(shell find ../libs/partners -mindepth 1 -maxdepth 1 -type d -exec sh -c ' \
|
||||
for dir; do \
|
||||
if find "$$dir" -maxdepth 1 -type f \( -name "pyproject.toml" -o -name "setup.py" \) | grep -q .; then \
|
||||
echo "$$dir"; \
|
||||
fi \
|
||||
done' sh {} + | grep -vE "airbyte|ibm|databricks" | tr '\n' ' ')
|
||||
|
||||
PORT ?= 3001
|
||||
|
||||
clean:
|
||||
rm -rf build
|
||||
|
||||
install-vercel-deps:
|
||||
yum -y update
|
||||
yum install gcc bzip2-devel libffi-devel zlib-devel wget tar gzip rsync -y
|
||||
yum -y -q update
|
||||
yum -y -q install gcc bzip2-devel libffi-devel zlib-devel wget tar gzip rsync -y
|
||||
|
||||
install-py-deps:
|
||||
python3 -m venv .venv
|
||||
$(PYTHON) -m pip install --upgrade pip
|
||||
$(PYTHON) -m pip install --upgrade uv
|
||||
$(PYTHON) -m uv pip install --pre -r vercel_requirements.txt
|
||||
$(PYTHON) -m uv pip install --pre --editable $(PARTNER_DEPS_LIST)
|
||||
$(PYTHON) -m pip install -q --upgrade pip
|
||||
$(PYTHON) -m pip install -q --upgrade uv
|
||||
$(PYTHON) -m uv pip install -q --pre -r vercel_requirements.txt
|
||||
$(PYTHON) -m uv pip install -q --pre $$($(PYTHON) scripts/partner_deps_list.py)
|
||||
|
||||
generate-files:
|
||||
mkdir -p $(INTERMEDIATE_DIR)
|
||||
cp -r $(SOURCE_DIR)/* $(INTERMEDIATE_DIR)
|
||||
cp -rp $(SOURCE_DIR)/* $(INTERMEDIATE_DIR)
|
||||
|
||||
$(PYTHON) scripts/tool_feat_table.py $(INTERMEDIATE_DIR)
|
||||
|
||||
@@ -47,6 +40,7 @@ generate-files:
|
||||
$(PYTHON) scripts/partner_pkg_table.py $(INTERMEDIATE_DIR)
|
||||
|
||||
curl https://raw.githubusercontent.com/langchain-ai/langserve/main/README.md | sed 's/<=/\<=/g' > $(INTERMEDIATE_DIR)/langserve.md
|
||||
cp ../SECURITY.md $(INTERMEDIATE_DIR)/security.md
|
||||
$(PYTHON) scripts/resolve_local_links.py $(INTERMEDIATE_DIR)/langserve.md https://github.com/langchain-ai/langserve/tree/main/
|
||||
|
||||
copy-infra:
|
||||
@@ -59,6 +53,7 @@ copy-infra:
|
||||
cp package.json $(OUTPUT_NEW_DIR)
|
||||
cp sidebars.js $(OUTPUT_NEW_DIR)
|
||||
cp -r static $(OUTPUT_NEW_DIR)
|
||||
cp -r ../libs/cli/langchain_cli/integration_template $(OUTPUT_NEW_DIR)/src/theme
|
||||
cp yarn.lock $(OUTPUT_NEW_DIR)
|
||||
|
||||
render:
|
||||
@@ -80,6 +75,7 @@ build: install-py-deps generate-files copy-infra render md-sync append-related
|
||||
vercel-build: install-vercel-deps build generate-references
|
||||
rm -rf docs
|
||||
mv $(OUTPUT_NEW_DOCS_DIR) docs
|
||||
cp -r ../libs/cli/langchain_cli/integration_template src/theme
|
||||
rm -rf build
|
||||
mkdir static/api_reference
|
||||
git clone --depth=1 https://github.com/langchain-ai/langchain-api-docs-html.git
|
||||
|
||||
@@ -80,6 +80,8 @@
|
||||
html {
|
||||
--pst-font-family-base: 'Inter';
|
||||
--pst-font-family-heading: 'Inter Tight', sans-serif;
|
||||
|
||||
--pst-icon-versionmodified-deprecated: var(--pst-icon-exclamation-triangle);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@@ -92,7 +94,7 @@ html {
|
||||
* https://sass-lang.com/documentation/interpolation
|
||||
*/
|
||||
/* Defaults to light mode if data-theme is not set */
|
||||
html:not([data-theme]) {
|
||||
html:not([data-theme]), html[data-theme=light] {
|
||||
--pst-color-primary: #287977;
|
||||
--pst-color-primary-bg: #80D6D3;
|
||||
--pst-color-secondary: #6F3AED;
|
||||
@@ -122,58 +124,8 @@ html:not([data-theme]) {
|
||||
--pst-color-on-background: #F4F9F8;
|
||||
--pst-color-surface: #F4F9F8;
|
||||
--pst-color-on-surface: #222832;
|
||||
}
|
||||
html:not([data-theme]) {
|
||||
--pst-color-link: var(--pst-color-primary);
|
||||
--pst-color-link-hover: var(--pst-color-secondary);
|
||||
}
|
||||
html:not([data-theme]) .only-dark,
|
||||
html:not([data-theme]) .only-dark ~ figcaption {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* NOTE: @each {...} is like a for-loop
|
||||
* https://sass-lang.com/documentation/at-rules/control/each
|
||||
*/
|
||||
html[data-theme=light] {
|
||||
--pst-color-primary: #287977;
|
||||
--pst-color-primary-bg: #80D6D3;
|
||||
--pst-color-secondary: #6F3AED;
|
||||
--pst-color-secondary-bg: #DAD6FE;
|
||||
--pst-color-accent: #c132af;
|
||||
--pst-color-accent-bg: #f8dff5;
|
||||
--pst-color-info: #276be9;
|
||||
--pst-color-info-bg: #dce7fc;
|
||||
--pst-color-warning: #f66a0a;
|
||||
--pst-color-warning-bg: #f8e3d0;
|
||||
--pst-color-success: #00843f;
|
||||
--pst-color-success-bg: #d6ece1;
|
||||
--pst-color-attention: var(--pst-color-warning);
|
||||
--pst-color-attention-bg: var(--pst-color-warning-bg);
|
||||
--pst-color-danger: #d72d47;
|
||||
--pst-color-danger-bg: #f9e1e4;
|
||||
--pst-color-text-base: #222832;
|
||||
--pst-color-text-muted: #48566b;
|
||||
--pst-color-heading-color: #ffffff;
|
||||
--pst-color-shadow: rgba(0, 0, 0, 0.1);
|
||||
--pst-color-border: #d1d5da;
|
||||
--pst-color-border-muted: rgba(23, 23, 26, 0.2);
|
||||
--pst-color-inline-code: #912583;
|
||||
--pst-color-inline-code-links: #246161;
|
||||
--pst-color-target: #f3cf95;
|
||||
--pst-color-background: #ffffff;
|
||||
--pst-color-on-background: #F4F9F8;
|
||||
--pst-color-surface: #F4F9F8;
|
||||
--pst-color-on-surface: #222832;
|
||||
color-scheme: light;
|
||||
}
|
||||
html[data-theme=light] {
|
||||
--pst-color-link: var(--pst-color-primary);
|
||||
--pst-color-link-hover: var(--pst-color-secondary);
|
||||
}
|
||||
html[data-theme=light] .only-dark,
|
||||
html[data-theme=light] .only-dark ~ figcaption {
|
||||
display: none !important;
|
||||
--pst-color-deprecated: #f47d2e;
|
||||
--pst-color-deprecated-bg: #fff3e8;
|
||||
}
|
||||
|
||||
html[data-theme=dark] {
|
||||
@@ -206,6 +158,8 @@ html[data-theme=dark] {
|
||||
--pst-color-on-background: #222832;
|
||||
--pst-color-surface: #29313d;
|
||||
--pst-color-on-surface: #f3f4f5;
|
||||
--pst-color-deprecated: #b46f3e;
|
||||
--pst-color-deprecated-bg: #341906;
|
||||
/* Adjust images in dark mode (unless they have class .only-dark or
|
||||
* .dark-light, in which case assume they're already optimized for dark
|
||||
* mode).
|
||||
@@ -216,6 +170,30 @@ html[data-theme=dark] {
|
||||
*/
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
html:not([data-theme]) {
|
||||
--pst-color-link: var(--pst-color-primary);
|
||||
--pst-color-link-hover: var(--pst-color-secondary);
|
||||
}
|
||||
html:not([data-theme]) .only-dark,
|
||||
html:not([data-theme]) .only-dark ~ figcaption {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* NOTE: @each {...} is like a for-loop
|
||||
* https://sass-lang.com/documentation/at-rules/control/each
|
||||
*/
|
||||
html[data-theme=light] {
|
||||
color-scheme: light;
|
||||
}
|
||||
html[data-theme=light] {
|
||||
--pst-color-link: var(--pst-color-primary);
|
||||
--pst-color-link-hover: var(--pst-color-secondary);
|
||||
}
|
||||
html[data-theme=light] .only-dark,
|
||||
html[data-theme=light] .only-dark ~ figcaption {
|
||||
display: none !important;
|
||||
}
|
||||
html[data-theme=dark] {
|
||||
--pst-color-link: var(--pst-color-primary);
|
||||
--pst-color-link-hover: var(--pst-color-secondary);
|
||||
@@ -389,6 +367,13 @@ html[data-theme=dark] .MathJax_SVG * {
|
||||
div.deprecated {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 2em;
|
||||
|
||||
background-color: var(--pst-color-deprecated-bg);
|
||||
border-color: var(--pst-color-deprecated);
|
||||
}
|
||||
|
||||
span.versionmodified.deprecated:before {
|
||||
color: var(--pst-color-deprecated);
|
||||
}
|
||||
|
||||
.admonition-beta.admonition, div.admonition-beta.admonition {
|
||||
@@ -408,4 +393,4 @@ dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.
|
||||
p {
|
||||
font-size: 0.9rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,6 +87,18 @@ class Beta(BaseAdmonition):
|
||||
def setup(app):
|
||||
app.add_directive("example_links", ExampleLinksDirective)
|
||||
app.add_directive("beta", Beta)
|
||||
app.connect("autodoc-skip-member", skip_private_members)
|
||||
|
||||
|
||||
def skip_private_members(app, what, name, obj, skip, options):
|
||||
if skip:
|
||||
return True
|
||||
if hasattr(obj, "__doc__") and obj.__doc__ and ":private:" in obj.__doc__:
|
||||
return True
|
||||
if name == "__init__" and obj.__objclass__ is object:
|
||||
# dont document default init
|
||||
return True
|
||||
return None
|
||||
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
@@ -116,6 +128,7 @@ extensions = [
|
||||
"_extensions.gallery_directive",
|
||||
"sphinx_design",
|
||||
"sphinx_copybutton",
|
||||
"sphinxcontrib.googleanalytics",
|
||||
]
|
||||
source_suffix = [".rst", ".md"]
|
||||
|
||||
@@ -255,6 +268,8 @@ html_show_sourcelink = False
|
||||
# Set canonical URL from the Read the Docs Domain
|
||||
html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "")
|
||||
|
||||
googleanalytics_id = "G-9B66JQQH2F"
|
||||
|
||||
# Tell Jinja2 templates the build is running on Read the Docs
|
||||
if os.environ.get("READTHEDOCS", "") == "True":
|
||||
html_context["READTHEDOCS"] = True
|
||||
|
||||
@@ -72,14 +72,21 @@ def _load_module_members(module_path: str, namespace: str) -> ModuleMembers:
|
||||
Returns:
|
||||
list: A list of loaded module objects.
|
||||
"""
|
||||
|
||||
classes_: List[ClassInfo] = []
|
||||
functions: List[FunctionInfo] = []
|
||||
module = importlib.import_module(module_path)
|
||||
|
||||
if ":private:" in (module.__doc__ or ""):
|
||||
return ModuleMembers(classes_=[], functions=[])
|
||||
|
||||
for name, type_ in inspect.getmembers(module):
|
||||
if not hasattr(type_, "__module__"):
|
||||
continue
|
||||
if type_.__module__ != module_path:
|
||||
continue
|
||||
if ":private:" in (type_.__doc__ or ""):
|
||||
continue
|
||||
|
||||
if inspect.isclass(type_):
|
||||
# The type of the class is used to select a template
|
||||
@@ -479,11 +486,11 @@ def _package_namespace(package_name: str) -> str:
|
||||
Returns:
|
||||
modified package_name: Can be either "langchain" or "langchain_{package_name}"
|
||||
"""
|
||||
return (
|
||||
package_name
|
||||
if package_name == "langchain"
|
||||
else f"langchain_{package_name.replace('-', '_')}"
|
||||
)
|
||||
if package_name == "langchain":
|
||||
return "langchain"
|
||||
if package_name == "standard-tests":
|
||||
return "langchain_tests"
|
||||
return f"langchain_{package_name.replace('-', '_')}"
|
||||
|
||||
|
||||
def _package_dir(package_name: str = "langchain") -> Path:
|
||||
@@ -495,6 +502,7 @@ def _package_dir(package_name: str = "langchain") -> Path:
|
||||
"core",
|
||||
"cli",
|
||||
"text-splitters",
|
||||
"standard-tests",
|
||||
):
|
||||
return ROOT_DIR / "libs" / package_name / _package_namespace(package_name)
|
||||
else:
|
||||
@@ -530,7 +538,6 @@ def _out_file_path(package_name: str) -> Path:
|
||||
|
||||
def _build_index(dirs: List[str]) -> None:
|
||||
custom_names = {
|
||||
"airbyte": "Airbyte",
|
||||
"aws": "AWS",
|
||||
"ai21": "AI21",
|
||||
"ibm": "IBM",
|
||||
@@ -601,9 +608,11 @@ For the legacy API reference hosted on ReadTheDocs see [https://api.python.langc
|
||||
]
|
||||
for header_name, dir_ in sorted(
|
||||
zip(integration_headers, integrations),
|
||||
key=lambda h_d: integrations_to_show.index(h_d[1])
|
||||
if h_d[1] in integrations_to_show
|
||||
else len(integrations_to_show),
|
||||
key=lambda h_d: (
|
||||
integrations_to_show.index(h_d[1])
|
||||
if h_d[1] in integrations_to_show
|
||||
else len(integrations_to_show)
|
||||
),
|
||||
)[: len(integrations_to_show)]:
|
||||
integration_grid += f'\n- header: "**{header_name}**"\n content: {_package_namespace(dir_).replace("_", "-")} {_get_package_version(_package_dir(dir_))}\n link: {dir_.replace("-", "_")}/index.html'
|
||||
doc += f"""## Integrations
|
||||
@@ -648,7 +657,7 @@ def main(dirs: Optional[list] = None) -> None:
|
||||
dirs = [
|
||||
dir_
|
||||
for dir_ in os.listdir(ROOT_DIR / "libs")
|
||||
if dir_ not in ("cli", "partners", "standard-tests")
|
||||
if dir_ not in ("cli", "partners", "packages.yml")
|
||||
]
|
||||
dirs += [
|
||||
dir_
|
||||
|
||||
@@ -9,3 +9,4 @@ pyyaml
|
||||
sphinx-design
|
||||
sphinx-copybutton
|
||||
beautifulsoup4
|
||||
sphinxcontrib-googleanalytics
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
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
|
||||
@@ -1 +0,0 @@
|
||||
eNq1VWtsFFUUblMhkEJMCgaJRm4XDQnpbPfR3e1WUWopL4E2to2pBJq7M3d2L525M87cKV2gEFqjAXyNGo2ikUdtmwKlFNAIocQGrQkPf0ACFa1KxWCIRMFIVAiemX0IFPyl82P3zr3nfuc753znTGtnEzFMqrHcnZRxYmCRw4tpt3Ya5DmLmPz5DpXwhCa1V1fV1G63DDo0M8G5bpYVF2OdelVqcgMrXkyLm/zFYgLzYlFTdYW4MO0xTUp+lff9ao9KTBPHiekpQ0tXewxNIbDymEmTE9VThDyiBt4ZdzbrNQthgyDMEGnWicHhj6eJIazENYPyhOpFVUxJZo6QQRTShBlHlMmaoWLXWDY0FfEEQRzMvGiBjJKALWmIaRw1Mm2le9iEFYsgTXYcYs4NGrM4eDcbiYS4lvFQBC64ZTDELEVB4MO9m7WfYaZwvJ6WIvRPgJZJjNvCK1fAT40KMSBqojCSCeGIYwDFTEIJbKKYorkragDaMritahJRnLvpbAsKNuIEfjkUyIGHJEKiMPBzvPq8PmdP0xt0ePPD2sQyadAhG7pDQcaKSVwLTUkXhCd1l69sMTfPDmh2XQYBMay6BtWgltSxREzRoHrawrPgprzjmGZxhJHuGnsdax0bgAACM1044OJUlhLzZvTVHsySVfKtlCBiyuKptGb2nBqkUiMRGVuKE5WzN5pWLRTJQXfq6xQsRclB8zgJbhA1RTP+P9cu/K2+QSmOZ0RlV4JpLoTGE7yBsoabkvSfM5rvekEqwSYoRYJeQWl3LQ6JDKAWW0FEDnsuqKOSBjGhUdE9BFJOPYEIwWpGTC2dCYIlAHqxPaGZ3O65dTTsxqJIdC4QJmoS8Ld3xVdRvQgBX0fD3dAdjLhas7sbCdEFrNAm0u00jwBDg3F7r56EIcQEZ/Q0F/u8gYg3sDPdVILD2+7Fuq5Q0RVg8QrIc0fK6eiDnsw9hbA4T9jbo9Fgl0FMHQYWaeswOfSR2doOVMmxLzrTg2tb1VOZGIdz7mufA7TtQ3MNWoQCEVRDdBTwBUqQP1zmC5UFS9G8xbU7K9Juau9Ib0+tgZkpQ4SVmax0igmLwdTprrhjPj6BBicKhckRS5p0FREMomLK3Jv+aDgSLfHvv93EXdudAZ/77B+NYBJubwuUHLj9BGa/kRREp5gfBgO+UHTI0yzclYCgUgZDMMujf7Stu87apQkduqsd5C5h7/D7ss9Q4b/6d+27o9FoKFwaCYeCgExYk5YULD0lVQHE1AQaFjhVid0OBAIHHYWYpuDoAQY2ZFnRVgrweYlTZm+d+XGz0KgBdhbB0SoTk+7l4L70KUyy5mT2aKtvT3o//fkUqGQPIRyN+kojwUBAxjE55gsQMST7cTgcCIUlMRYI766YK1RgMUGEGld9duec+iXlixdUdNQAa2LY3aKiWRJ0i0E6wPbp8np7X6kYFWNiJBQSff4SyScKT1bV9GZElxVVu9Nq7nd4fUdqenyWu3DapnE57pO3yD7KBmZPqFw35htr4/xxhcd6rrcurHtm4sZjRwpPnsg7fv+GgvPf7qj+80z94/0f7Z41wKsvXDm3ZVP/d6ySvD2p7jxb2bVx+enNdcsuvVb44HB9/uTfZved+vT9ok3jH5rKpYJLWy6re4TIxTXLiL5VzB8Tf31O371vnbOnFY2f8U6owvfupFNnx4082j97V6B0yYZXJoQ8Y49Wb3lzUcHlyOJfBtYO5059+J6zK/p+Hx6RR+p6qk7nH/7y2pWSi3/tPX01tK4iNPDG5p+Cg1yc/Gp8cHnB5M9/fOGBrsq2eU+t/fXcSxMm9lW2rV+kWL2Fa6+0Tew/OD08WP7syNLBAX/LlB+OHui6OHZSB32CXHg5QhPTTz5Wf/2q/+fge+uufRDTZ9BH1vRWVVf2b56VP3S4tu545I/kEa3/6yUnp0DSbtzIyzmxXWk+k5uT8zfUHYmM
|
||||
@@ -0,0 +1 @@
|
||||
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
|
||||
@@ -0,0 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -0,0 +1 @@
|
||||
eNq1VmtwE8cdN+DSlKQtj4AnJMAhaBuITz6dHpZkNBNjMAiw5VgGbAjIq7s96ey728vdSpZMnbQ8GtoC4RgeYSCZBj9EjeNAAYdnWpJJ0gRIQqbjKVDaTjIDJU37oenwGELp3kkCeeBLO60+6O7++9/f7//eXZ1JQk0XkTKsT1Qw1ACHyYdurM5o8LkE1PHaHhniOOK76kLhhs6EJp6fGcdY1f1lZUAV7UiFChDtHJLLko4yLg5wGXlXJWjBdEURn75Q/PAqmwx1HcSgbvNTy1fZOES4FEw+bE0oQQENUkChYEqFGiYPnDODAlIMaSKOy3YqpEjp/BKlQQkmgYIpURGQJgNLWdCQTOE4pDBRs1NBgUoTbB5RCsJUq4LarMUkkBKQQoJJCDDWxGgCE3a9FfIURnmGUkKBE5pCKQlJogiHtfeu/g/0LI7dVkrZNCRB0xM9rWMo2zpKqSEOVkqEKSwTLyhRpzyUACGmMCCwQOGpONCpqISsN1EbgpfQoWbrWEEkMuKhZIpiKqZdiJZFRTQ1FSJzkKcKNIIHpQhGSIpw5N2MswAkHZJVHWsQyAUCYiUJNCD+mTyMvdyUWTvjSORM2SobTquWEUJCsVJh0t19NxUUIFsKdaR8iKijIweSy/B/up8s81DnNFHNadiCBakFUZTAFKBUS9mKkukzqUwisOBUDZnFI0K9EH2VDSjpkDDUJBIPUYll85SXmWnOxpqHAkhIZuZM2f1mNZA6MNHNEjJrQs35TzTNDEY4JCHt/0dtwQ/lJsVoMlOiYFV5zhYoxuI4IiqRgiD9zy2ab7FQMgQ6KSaetCOVo8vWQw4QRVsgh4msY0VHJg4BTzRe6oojHRv9Q4fIG4DjIClyqHCIJ4YZr8faRbWUIoZIAMNe0lcKtIrI6G2FUKWBJCZhT3aXsR+oqiRyVs2UtZDQ9OX6kDYtuX+512wxmowlBRuHQsSIymBZXZpMO4Vy2N2snd2fonUMREUi04smfRwzelRr/Xjhggq4VgJC5yap0ZPd3F+og3SjuwZwofAQSKBxcaMbaLLHdbBQriUULMrQyFTV3U+XW7xH57Q7HPbyA0OA9bTCGd1Wx785ZDPEWprmEMEwXmP68/GRoBLDcaPLwTjdezWoq2R4wzU9ZB9O6Ku7SDLgmd9mckN8T2hhPot/LCrpmkMSY5ys1sRSimWpWpSkWIZ1UQ6f3+nyuz3UvJqGvqocT8MD83CgQQOKLpBczM3nPcPFEwqZyb1VD8z4STPjxB3TfjIvaXJ0IB3SOauMvka6Pnt80cE5B7PlRSMtBhSx3aI1Tlqpb2tPtfFcgufjyTaZ8bW7nGIUJjjhUG4LmSomDTGIlnWj0+Vj+3Mr+eD3El8Z2sHQjONYiiZDFUoimfV09j93hupGl5thmCP3K2DUCslpm3Ex1u+tQg0NyiRrJvc9GJfP5zvxYKU8lJOo+Fj22FAtHRZa42Bl/cj9CjmIToes96Xy6rTIG+enk49IORuFrBd4ebfAQK+HdUR9vNPJeXivAASeBUfNYcIRGDObKtIwrUOO3Bhw2jhfKoOU2WkBp8Pt9BBXK8iw4KQED8OJ6BxkOqFXUCo52BHg36iqpqsAF4d02CpAIzOnqbayJljVGyZWViHUKsItF4aNiEQ4IRKVA97QnAWgdinjW1i7qLFWtHsSLtBSB9XQfL11tifC6PUAaDz0zmMR7Sh3sk7Gxfg8tMPO2B12B72oLhhkZovJpojgaKp2ykFmCeAXR9I681xq0TwGpbkqqSotCXGXI5oKh5bGPLosNPI8jsxlaiJ8q12ticTD4XRTcEEUtTCSR/Q2NT1DvAE4HiirMO81IglwINciNGkRmjQIy/iZfINUkHuKGYOAfeg8rKDmk8uWefepoMJmMCF5ktMnLGIYqEUKPL+VxCCRFPlAdX3IHmexUtPQUrukulpJRTysl61rTZS3tDtcYHZkgSsddyedTp+rIAhuJyndXBw8jMtrleE90/9LqwYa6cKOp0Nq9laZUZCuiILQE4Ya6SCjl5NQgiejXYM9JOf1lU3GIS/0RN0csdDHeM3ComeToZlHuzsfusxzIQMkUmNJzjgYdwZsfpfLaaugZBDwekg/WXfPH/dkD7h3h4+a8vOHiqzfiA3hiz+7yIzuuL50fXpTyZWB4O0Jx7a+vX3l/NPb+0umneaWL2+q/97O6Wu/XnVg9+FXLj36xTenXT7jiwku/8i1RR9P/f5vZn7R+PrcI+kbH4nJG9euLn0sMGtH35nt797e8VnyrUsvSM2fsg3XNpw5uV95uffw0+9v+7JZ2OyXFmf23ZQm03va3py8d/GmPd3bLqx7ePzgs/9QJ5ydAA6NyvzVebx+92vrXp41cu1o7Z93Bmp3fj45OrZmpc29bOHCtUdCtuINY+XivYf/4J85adHIzTOu1g10n65eP+bPW8fO6Jz9yHuX2p545UXwzNRPV6y5/sLAtSsv3mz/9a0DnW2P30ynr6/c9LX/6ppr3xi/kb+9uTo15aXIzjHDtwy+emv8xo53phfvnbFrYnfrvp9wn301bv243z8084OBy/0Lmrc8PfdocOfYD1OucQsuT/rRib5nP4TLOqu4wKyTTR+P855ad3HGkeTzE89+0nyuceZH7wTeD92Wv7W4pZO91XKjTv1A3jaxa/C7w/rCx75SOk6McJWUfPvC3mXHf/fLPz25/NRV7dzVU/s3jPDverUy88T4aYMtvqN7dlz+y5PXd31SNqWz7+0f/uI7C+fv2r1vzOgNx55fftb9t37dfvqOMaXovbqKM2GZufLlrz6ferb51pI72wZD50seudY8aVA8BX9a/fjfI6Me9W9cco59avCpCZXqqH8NLyq6c2dE0WPDiyvKi4uK/g0J6vAR
|
||||
@@ -0,0 +1 @@
|
||||
eNrtVstu20YUbRfdeNVN9wzRVaGRSImSSBleOJJfiW35GcsJAmE0HIpjkRyGM5QlB1407Q/wE5o4UmG4ToIEbfpI10XRH3AX/Yh+QS8lGZbhAN230cLSzNx77mPOmesnwy6NBOPBx2cskDTCRMJCJE+GEX0UUyG/HvhUutw+2ahv7zyLI3bxhStlKCq5HA5Zloc0wCxLuJ/r6jniYpmD36FHRzAnLW73L35/rPpUCNymQq0oDx6rhEOoQMJC3YlwIDwsqSJdqjjc8/ghC9qKE3FfWQjaHhOuAplxZUVij+FAzShqxD2aOou+kNRXjzPKNUyX3Zq2igWN1OOHsONzm3rpVjuUyODIZwFLLQPY0+FbyIhiHxYyiimsATyElsg4SoG0bPl46FJsQ8P++ujTE5cLmZxfb8ILTAgFcBoQbkMdyXftIxZmFJs6aZGnkGVARy1OTjuUhghq6tLB2Ct5icPQYwSn57kDwYOzSVVI9kN68/g0LQ1BXwOZvKlDEvMruY0+3Fag6NliPpt/2UNCYhZ40H7kYchnEI7Of54+CDHpAAiaMCEZjJ3Pp224SJ6vYVLfvgaJI+Imz3Hkl4zX0/tRHEjm02RY3bgZbnJ4Fa6Q1fVs+dU1YNEPSPLcwZ6gP1xzpjLqI8IBI/lGGxDOO4wmF383m8Rptvw5vbYQRs2A14OdbrvLGqLYs7T4Nlve0Ei7t+VtNsqP4uzmerB7iPRyIV/QjHzeRHpWy+pZHeVX94NmbHVX6z7u83vbe1WPhQe0VbuzqNVwffnOwm5hv3+7v9TAG7p7FFjiTq+zudW9n19aWt49snBjpd25x2Nu375r380Syzls1jdnFcgu7jJ7rmDr7p6ubYl1e7dobO6vLury4GBrXrsfF7Nr8Y7W2MLzLbm5Z4ip9AxdR9okw5JmmFr6Ob/khkeDtnSTZ3kt/21ERQi6o18NoGUyFk9OgIf0j9+GEwE+rd+9ovBnJzXgZPJuMWIZJZ9X1nlXARBD0a1KoVzRTGVpbeesOgmzk1LwQpG0J3O0m+6M5TKrgOojQeVcLB1kvhop2gFeLlxqYEjcOOhQ+7T6Xva/S9kPV5vWA5pFtBdyQdEkzeSsgbbGTxFaqb0eSw3xqI0DdjSSQvJuJIPDo96hTWLbdruHvmYdGQXWojFx3kxcwoinYSAh5IvkmW6Z55OTSyKeQvEa0jWk6T/1EOieesxn0ODR38l7KJKTInT/7U0DyTsUXs6hMboe7ddpi4j6wOA09hWMYVnWL+83uoQqgIlVsn66bgW9noLR8754e9NgAvFUE2e9S2vE7OTic1g0TVpsmXnTKplFxyyVWybFpZJRNHBB16hWLP8Id8sIoKSXGfIILpsSePxlP7nI+LiXPjpzBb1YKEGls/BAEy+26XbcqvG0BjGrhBH1OLZfVBdRFROXou0RIZNhbX99fm2l+n0DTTML1cPx4BkGXATMcQbbNIKLSU6Jx2MbXs+IDgBra34/eWPSUqvoFAs2aWHTsR10u749xB4k2SXJa7cwp1YMo6DOKj6eM0twH6M59OUgLSpo//nJuo0lrsDQYLZaUdOhRWBkofm9nQ7znfuL8SNSXu6vtXljla4c+EVj1WqpGZW3DoC9E4/s1ZjLjvgNBgT0IClgXkk3czl0pmcOSlWGtDLSTfAaT7GmA6nRKIQM0xBO2NTKWrHlmGWipdAuZySdnzA+WWDTnlrRMiogS6xWHk9mnYqB3yB8QMhcDUQVFhF1YoEhjSD2vOOM6vE26KElxhsZFYLDoG1C/jBWJlYPj2dm/nONuupKVf3Qh9SRYf6hEyPHW//nPvx76fDvMQ/VqeIf1OrrCw9nZv4BLV1b7w==
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +0,0 @@
|
||||
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
|
||||
@@ -1 +0,0 @@
|
||||
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
|
||||
@@ -0,0 +1 @@
|
||||
eNrNVstu20YUbZbNqv0DYtDHRpRE01ZsFUXhyInbxI6d2ECcxIEwIkfiRNQMMzNU5BpcNO0P8BPaKFIgOA+jAbJouy266A+4i35L75DUK5ZtZFEn2lAzcx9nzn3MfdxvEyEpZxcOKFNEYEfBQsaP+4I8DIlUP/VaRHnc7W5ubG0/CQU9+txTKpDlQgEHNI+Z8gQPqJN3eKvQtgotIiVuENmtcXfvnwvuPmrhTlXxJmESlQ2rODefM9BQCnbu7SPBfQL/UCiJQHDqcIDClN667WH1pTSUR4xHBMNHGJQZW5gZVwVmDpUOzxmV5W9QdF+b5S7xtZrj49Alpm0umB6mzdD0sYLLaONSCYJbIKRESGCtOPczHAy3EhwNoqqZN63hEukIGmhi9OkqUVN46oK3DGz43MFaJK9VKAtCVZWOR1oYdPZRACQRoWhy5X00FE4Wai9I3AIyyhooisCAZp8K4mpgY2l9x6E0rz0gjgLp+1HfI9iFMP770Sddj0sVHx4LzUvsOCRQJmEOd8FL/LzxPQ1yhkvqmpoBUM5IEvt40CQkMLFP26SXasWvcBD4NAVReCA5O8hCZGo0x48HOpImBJip+M3yEEdhcw8yiRnFvH0pb73qmFJhynxIBQgPQOoFyflvkwcBdppgx8yyNO6lyi8mZbiMn65jZ2NryiQWjhc/xaJVmv91cl+ETNEWifuVzePussOxOztvWflLh1OG5R5z4qd17EtyOCJ5pDKYK87ZZrFkFq03U6aJEnumw8FD/HPxxZBAn7CG8uIn9kLpmSAygOIjP/ZATYXycReCRf7+q5+Vyy8b18eh/rS7AoGL/7hN3Jxh2cYN3jbA9bxhlcrzdtkqGavr2weVzM22jtORoUhHFUhb76R18JXheFhIor4OVd1cPNyGqpJ1CN6VYaL0HS9kTeIOKjNT5HkFQ5ab2g+UcfyMcdPRO0doTI0AoD5tUWVmTQUCrpdxd75YLB59caqkgBKiTCPp2ktLS2fYBQqJil9rIkzLMi17e0jH3SNjlmbamTI8PY0HEH12iuQYTw/waGnjVOkT8Qwy0CZ149/hf7VoLSwuXN9hrte5Vlsv8dbK3eZa55L1pE1xPLDyltHgvOGTl5WrZsr6VpImcX/lzo3l9e8qBzvmLV7jQMM2BroYZ6S3RQRkZjxwfB66UOuC9ED91vKd+PUimSvai/PWXN2u2bXSknl5Yytp2z/00lb0z8d/JrlSNrIErEJeCnXRxQqPGxeaOkS54RqV9xF19blswN3stfblRbuy9+2NoL56J2ytidVH7RUQn7YCG+lzgLCUFEyyxGTa2I/3dU0svClzIDN6Ne7dz0Ev5UEVElzqHstC38+2pOacOWS4GY6QJh17+E7Z9kIO8VBN7llRZOhfdPFixkrmsVqDBt2czc0MEYBKmUs6qFzMTZ9rHJmeLlTNjf6UEYom3QYQmrf8GChIno4ToAF5Cp8OLRGZgpbuTEMaiWXA1ohCKSvZ79wRQGpCCyNOU7/Jk1jOH4kTCqETcIqQ9wFkNJlwAWDO3//b4xk8FACFUTyk5twh5dFZtcuDs0qXBxNuz4zuu3cD65RuADNqFWYqLexm61D31Ic327Ur69cJaW/aOzevhUs7lU4HpNJJdnqQTVscWI2i/yU7reOhSJuqnghHwgHcmWI/2cw62/vGsL87nrCjD4WYXWjquyipJJjx3y+WiVL+cAha3kXRqdnzrjVtndS2h/PNzItNHaKJi0xNIJMVPGMOiSYGkbemjtJSdAKcWfebPEPji/wHR26g7g==
|
||||
@@ -0,0 +1 @@
|
||||
eNqFVF1MHFUUXlJJ1RdLNLYxJk4X0VS5uzM7W2BRk9JdFPnpImxTadPiZeayM93Ze4eZO5uupFax9UVFrz7U1FgrLLt1RSiRpBK01bSNxoga00SwsY1GH0x9MJo+kCbiHdjlJyDO08z5/c73nTN9uRSybJ3gkmEdU2RBhfIPm/XlLNTjIJsezSYR1YiaaY22xwYdS5+p0Cg17Vq/H5q6D2KqWcTUFZ9Ckv6U5E8i24ZxZGe6iJqeMXq9SXiok5IEwra3VpDEQLBS8BaDuGVfr9ciBuJvXsdGlpd7FcKRYOqaGpBhEO/h/W4OUZHh2hQDOioCMtgONKgnHGBAyoF6D+c0BFU+zVXPpoxGbMrGViEchYqCTAoQVoiq4zj7MP6sblYKKup2q+R5a4zmKWD5BEImgIaeQtmFLHYGmqahK9D1+w/aBA8XoAKaNtFqd96dCPBBMWVn64o4/K1pTigWRJ9c7ZPOHAI2hTo2OCV8Eg4pa877J5c7TKgkeB1QEItlF5JHlscQmw21QCXavqIktBSNDUErWRX8aLndcjDVk4jlwq2r2xWcS+1knyT5qsdWFLbTWGFD3dCw0dgiyYsp+YAYkIFYBUTp7IrSiFppoBDegb0njhQJNBCOU40NSmLNaQvZJt9B9GKWp1HH7stwsdDXX+YKazMQbVqSuiwT4cKxT/cgtVKQZGEXSQm8dVCQqmqDcq0UEJ5oiQ2HC21ia+o0FrMgtru5VvXFvcgpmoMTSM2H19yIGe/SxBbvb+hJnYLCyXAd3U+WCYqiOPPAupEWSnJm3I4ZORQK/U9dzgyibNydD0gSkORYYUpp74ywVubC4RXwZF08HNH960Qu4SlGC+tG/weewN58ATTQVfYJf+8UpfagaWuhWFOgOdzaE8YojSO74cHBlA5ZXvJJQpyQuIFGw4+DMFQ0BNrn1We5SMeuupYnw8NPgzbSRTgNMcjpwgSjbDuy+MKxvGIQR+UnbKEsT2+r62DjNSggyjWBKlFVQ3JXVQjs5JdR3INFnTPu/c//q17g22Zx08Xf7nv5Vs/8s6G5f6rxonjXsc6Kk87tyezgG1N/0AM7yuobDd87YhLnJp5q+n2yaWPpno3n/r7QsenRypcub0c3/vzr8uyVWfbu9R+i5+c+lp1HXvnu9XQG1G+b6D8l9ZwvOd7W8MvADuWZ6GOVP15F0Usj05sf3PzNhDj0/gffb9HG7z028Nk5cOTtndf23Xzo7i9O/Rq586fT5Ue2VbMToYe/3ZpqnJ6cff7G/vLbXpuK+HqOltZfazjpfe7VyPHmsYrpt24eKO+MXind2t9xz8/ypVt6Rz/v+OfNr4av38HnmZvb4FFi2oWyEo/nX+5BZNA=
|
||||
@@ -0,0 +1 @@
|
||||
eNqFVF1sFFUUbosRHtQUUERCcboBUejsznS2he6D2G6haumP7dZSTK13Z253pjt77zBzd2FZ+9AqmlhNHIOiMajIsluW2lKokIiYINji7wMPmDahogKmivyYEEXFeme725+01n3Zufd855zvnO+c2x4PQd1QMMrsUhCBOhAJPRhme1yHW4LQIM/HApDIWIpWV9V69gZ1ZXCFTIhmuBwOoCl2gIisY00R7SIOOEK8IwANA/igEfViKTyU6YnYAmBbE8F+iAybi+G5fGceY0uj6M1TEZuOVUi/bEED6jZqFTGlgoh1VS8DstJgiAyZrRDQP51REFMLELNBB0hUDBHnMe7idbbWRisslqBquYkqCEqQFdgCVgaKP8iqgNBirOAEYzWVF4FAMq8PkqZUdAshQUPUFc1qhGUtg2RK/mYdBxjAqFgEFsRuuShIC5ImQ5RhAFCfiE2jTYE6UZIlRmxpcPJAwloyrUF0Bflsra00gNVtRYeSRWwCbdWURmNvCxQJRTe2xmUIJCrbcEZ2VMYGMXunSdEDRBFqhIVIxBLNYn7g265oeYwEm61WJGiLEUxqbSb8EGosUJUQjI15mQeBpqnKGAlHi4FRV0oS1mIz3ZywlGOpoIiYR4vTPBzVYTo5iOHswho7f3AbaxCgIJVKT+WglGJa0n5sskEDop/GYVNTacbGnLsnY7Bh7qsAYlXtlJBAF2VzH9ADhc7Dk+/1ICJKAJpxd/X0dCnjRDrBzvP2Nb1TAhthJJr7moFqwN7xJo+7JPK5fIHlClmOPzolNCR6mBUxzWDu4brTDVQh8hHZ3Cs4uU4dGhpdNvhcjLqRoNEepWLBr07HU+vxflX5hNTzo6VUOPN4PZTyGF5gKnGIoamdDF/ocgouelNW4elyp9J4ZtSp10OXxmimWq1Pz0VclIPID6WEe8aJGLRNVKzT/KoSUAibehuojtbRjDo5jht8YFakTjdDQVbGqFBUVPQ/cWlnIDH7rPpYnmd5wZOqMn/zIDOT59gDk+ITs/hQRstnQU7wSaOZWdH/wUfYnEiRZhXJ/Jh+N3F8qZOv31pe1rJJqwv6/BvDdZXrt/iMvSEFmAnezjM+jH0q7HFvYN2APhlsbVJ9M17aUFlc8Zi7axNbg72YtsEDaLsQRjBWC3U6cGZCVHFQoiuswxh1ryluMPvWwnxOWJtfVOAtbBa8hUVsCd2M9ByM6xy19j/5KLfFxh6ezzKL7u+Yl5H8zZGqz5Wf5LJH6z89/sdrj69b6h2+FN14os11KremJNQHlTMFuwKNI6P2/S+1Vw2cu/XJlds7jzLvbYHzVx6oONx04cuL/+T2PP3tW8sjw0u3n3+ktSNzxzefL2hz+4KLH/2ppexMtiZfXlQwr3rzn+yGBmfHqoarz+7sH6lbEH9Iqz6bvSTr+sN/ywveyYqsyrri6Gu+5+c3bpwV6vYM8YlXc56o2ZFz4M6I+cLF3c5E6Av9yJuHu+2rvb89+Ff54ps9hz786Jr91G50x3HHDxdixxrXvb1w2XeXtt78foTPDT+5+vwz0sJtK2qu/3pvZ+zGbd6MwOvRoSXZ1xxZL/84d27ZEda1E2Xd6n130V2/L3ulJLvf//WJqp67T+5yF4de7G87fei+ub+MXL3syhmooj0aHZ2T0edPDOzPzMj4F2C/3M4=
|
||||
@@ -0,0 +1 @@
|
||||
eNqFVGtsFFUU3spDSNDwsuoP43SpbQid3ZlOKWyXCHVpa2laSrvKy7Lenbm7M3T23unM3UK7VEMp/IAYO6gYkSDIdpesLXSVhBhAQ7CJCDEGiKYlxQSEVBvwUWIgUfHOdrelAXH/7Nx7vnPOd853zm2PN0PdUDDK6lYQgToQCT0YZntch01haJCOWAgSGUvR2pX13kNhXel/QSZEM0qcTqApDoCIrGNNER0iDjmbeWcIGgYIQiPqx1LLQJY3Yg+BzT6CGyEy7CUMzxUWFTD2DIrerI/YdaxC+mUPG1C3U6uIKRVErKvVMiD5BkNkyGyCgP7pjIKYeoCYch0gUTFEXMB4Spfa2xqssFiCquUmqiAsQVZgF7IyUBrDrAoILcYKTjBW03kRCKXyBiHxpaNbCAkaoq5oViMsawUkE/IHdBxiAKNiEVgQh+WiIC1MfIYowxCgPhG7RpsCdaKkSozYM+DUgbRoqbQG0RUUtLe10QBWtxUdShaxcbRVUwaN/RuhSCi6oS0uQyBR2a7YZkZlbBAz+YAUR4EoQo2wEIlYolnMnmCrohUwEgxYrUjQFiOY0tpMNEKosUBVmmFs1MvsBZqmKqMknBsNjLrTkrAWmwfNCUs5lgqKiHm8NMPDWdtCJwcxnENY5OB7N7MGAQpSqfRUDkoppqXsJ+43aEBspHHY9FSasVHnI/djsGF2VQNxZf2EkEAXZbML6KHios/uv9fDiCghaMY9tQ+mSxvH0wkOnncsSk4IbLQg0ewKANWAybEmj7kkCrlCgeWKWY4/PiE0JHoLK2KawTzIHck0UIUoSGTzkFDEHdahodFlg9ti1I2EjfYoFQue/zqeXo+PV1aNSz0rupwKZ55aDaUChheYGtzM0NRFDF9cUiSU8AuZimpvtyedxvtQnZJeujRGgGpVlpmLuCiHUSOUEp6HTkS/fbxineZXlZBC2PTbQHW0jma0iOO4/rxHInW6GQqyMkYFl8v1P3FpZyAxj1n1sTzP8oI3XaWwrp95mOfoA5PmE7P4UEa5j0CO88mgmUei/4PPwnWJNGlWkcyT9NvH8aVevM6vlVVt3FwceKW+pnCVJq0Q6g41K8BM8A6eCWIcVOFRTznrAfTJYOtT6pvx5WtrSqsrPd1r2Drsx7QNXkDbhTCCsXqo04EzE6KKwxJdYR3GqHtd6Vrz2GJYyAmLBaEY+BcL/mIX+xLdjMwcjOkctfY/9ShvjY0+PH1ZG57fNc2W+k16bdWqqjPLZvyzoGLDls/fCg/W/loN24c6klsPv3x2oPvUzdbjg9f3Gbe/rPrk6m/zc+9+scW3e97QY3MvHTw/9azq+iD/h5+vX8xhv41/dKLvalPrvemz7/R2ZZflvF7JnHZfzOYmP/cMu61j4ClpWSnisi9VRa5t2N46J3LmtPbujB2ezk73OenZS8O/b8q7WHHuVnv7CUFcXhZY8KRj5+41Wpn97SvvwGT+TztPrnE5b8h9PRUfDne656Pvht4beVX0LZm5a29H/p97r1Rq2wuONbh88xqD7jfcPw5/6t8aWXL7oPnmnn3C2hk39w82DSwJbJPqdlyfFh/uG7nw/fD7W27kud1Tp2cP71k9O7g0e31isHxqePK1P2qy5/61qG1K9UheTu/lwH6OHJhz98gs+emzNyZ/Uy7mfnXr8V/u9HQmL3c+ceACKThd9mJPQ271yBSb7d69SbYVd/6Wr2bZbP8COXvwZg==
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
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
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
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
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
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
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
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
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
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
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user