Files that are both large and changed often are where bugs tend to cluster and where refactoring pays off first. Each file in the current tree is placed by its size and by the number of commits that changed it; its hotspot score is changes × √lines. Files without counted lines, such as binary files, are left out.
Each dot is a file; a bigger dot is a higher score. The dashed lines mark the median file size and the median number of changes, so the large files that change often are in the top right. Both axes are logarithmic. Showing the 2,000 highest-scoring of 2,766 files.
The files ranked by hotspot score: the larger a file is and the more often it changes, the higher it ranks. Authors is how many people have changed the file, bots aside, as on the Code Ownership page: a hotspot only one person has changed is also a bus-factor risk.
| File | Lines | Changes | Authors | Score | |
|---|---|---|---|---|---|
| libs/partners/openai/langchain_openai/chat_models/base.py | 5,683 | 299 | 77 | 22,540.3 | |
| libs/langchain_v1/uv.lock | 6,303 | 219 | 14 | 17,386.7 | |
| libs/core/langchain_core/runnables/base.py | 6,729 | 207 | 36 | 16,980.3 | |
| libs/langchain/uv.lock | 6,805 | 182 | 13 | 15,013.6 | |
| libs/partners/anthropic/langchain_anthropic/chat_models.py | 3,383 | 233 | 41 | 13,552.1 | |
| libs/core/uv.lock | 3,647 | 220 | 17 | 13,285.9 | |
| libs/partners/openrouter/langchain_openrouter/data/_profiles.py | 8,547 | 139 | 1 | 12,850.5 | |
| libs/partners/openai/uv.lock | 3,692 | 181 | 19 | 10,997.9 | |
| libs/core/tests/unit_tests/runnables/test_runnable.py | 6,066 | 130 | 23 | 10,125.0 | |
| libs/partners/openai/tests/unit_tests/chat_models/test_base.py | 5,827 | 129 | 39 | 9,847.2 |
| File | Lines | Changes | Authors | Score | |
|---|---|---|---|---|---|
| libs/partners/openai/langchain_openai/chat_models/base.py | 5,683 | 299 | 77 | 22,540.3 | |
| libs/langchain_v1/uv.lock | 6,303 | 219 | 14 | 17,386.7 | |
| libs/core/langchain_core/runnables/base.py | 6,729 | 207 | 36 | 16,980.3 | |
| libs/langchain/uv.lock | 6,805 | 182 | 13 | 15,013.6 | |
| libs/partners/anthropic/langchain_anthropic/chat_models.py | 3,383 | 233 | 41 | 13,552.1 | |
| libs/core/uv.lock | 3,647 | 220 | 17 | 13,285.9 | |
| libs/partners/openrouter/langchain_openrouter/data/_profiles.py | 8,547 | 139 | 1 | 12,850.5 | |
| libs/partners/openai/uv.lock | 3,692 | 181 | 19 | 10,997.9 | |
| libs/core/tests/unit_tests/runnables/test_runnable.py | 6,066 | 130 | 23 | 10,125.0 | |
| libs/partners/openai/tests/unit_tests/chat_models/test_base.py | 5,827 | 129 | 39 | 9,847.2 | |
| libs/partners/anthropic/tests/unit_tests/test_chat_models.py | 6,314 | 121 | 28 | 9,614.7 | |
| libs/core/tests/unit_tests/test_tools.py | 4,879 | 132 | 29 | 9,220.2 | |
| libs/core/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr | 13,963 | 77 | 13 | 9,098.7 | |
| libs/core/langchain_core/language_models/chat_models.py | 2,748 | 171 | 28 | 8,964.1 | |
| libs/text-splitters/uv.lock | 4,674 | 121 | 11 | 8,272.4 | |
| libs/partners/anthropic/uv.lock | 2,458 | 148 | 13 | 7,337.6 | |
| libs/langchain/pyproject.toml | 228 | 482 | 82 | 7,278.0 | |
| libs/partners/huggingface/uv.lock | 4,301 | 103 | 11 | 6,754.9 | |
| .github/workflows/_release.yml | 920 | 209 | 21 | 6,339.3 | |
| libs/core/langchain_core/messages/utils.py | 2,442 | 122 | 33 | 6,028.8 | |
| libs/standard-tests/langchain_tests/integration_tests/chat_models.py | 3,593 | 96 | 9 | 5,754.4 | |
| libs/partners/fireworks/uv.lock | 2,934 | 102 | 9 | 5,525.0 | |
| libs/core/pyproject.toml | 151 | 446 | 22 | 5,480.5 | |
| libs/partners/anthropic/tests/integration_tests/test_chat_models.py | 2,867 | 96 | 18 | 5,140.3 | |
| libs/core/langchain_core/tools/base.py | 1,948 | 113 | 25 | 4,987.4 | |
| libs/standard-tests/uv.lock | 1,879 | 105 | 10 | 4,551.5 | |
| libs/core/langchain_core/callbacks/manager.py | 2,826 | 85 | 22 | 4,518.6 | |
| libs/partners/xai/uv.lock | 2,932 | 80 | 9 | 4,331.8 | |
| libs/partners/chroma/uv.lock | 3,460 | 73 | 9 | 4,294.0 | |
| libs/langchain_v1/langchain/agents/factory.py | 2,164 | 92 | 17 | 4,279.7 | |
| libs/model-profiles/uv.lock | 2,268 | 87 | 5 | 4,143.2 | |
| libs/partners/groq/langchain_groq/chat_models.py | 1,655 | 96 | 25 | 3,905.4 | |
| libs/partners/fireworks/langchain_fireworks/chat_models.py | 1,999 | 87 | 16 | 3,889.8 | |
| libs/core/langchain_core/prompts/chat.py | 1,495 | 97 | 26 | 3,750.5 | |
| libs/core/langchain_core/language_models/llms.py | 1,565 | 90 | 24 | 3,560.4 | |
| libs/partners/mistralai/langchain_mistralai/chat_models.py | 1,388 | 95 | 24 | 3,539.3 | |
| libs/partners/openai/tests/integration_tests/chat_models/test_base.py | 1,407 | 89 | 18 | 3,338.4 | |
| libs/text-splitters/tests/unit_tests/test_text_splitters.py | 4,434 | 50 | 37 | 3,329.4 | |
| libs/partners/ollama/langchain_ollama/chat_models.py | 1,794 | 77 | 25 | 3,261.4 | |
| libs/core/langchain_core/utils/function_calling.py | 869 | 110 | 36 | 3,242.7 | |
| libs/partners/openai/pyproject.toml | 176 | 243 | 15 | 3,223.8 | |
| libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py | 2,918 | 58 | 11 | 3,133.1 | |
| libs/core/tests/unit_tests/messages/test_utils.py | 3,172 | 54 | 24 | 3,041.3 | |
| libs/partners/perplexity/uv.lock | 2,242 | 61 | 10 | 2,888.3 | |
| libs/langchain_v1/langchain/agents/middleware/types.py | 2,201 | 61 | 9 | 2,861.8 | |
| libs/partners/groq/uv.lock | 1,946 | 64 | 9 | 2,823.3 | |
| libs/partners/mistralai/uv.lock | 2,000 | 62 | 9 | 2,772.7 | |
| libs/partners/openai/langchain_openai/chat_models/azure.py | 1,230 | 79 | 20 | 2,770.6 | |
| libs/partners/deepseek/uv.lock | 2,324 | 56 | 9 | 2,699.6 | |
| libs/partners/qdrant/uv.lock | 2,692 | 51 | 8 | 2,646.1 | |
| libs/core/tests/unit_tests/prompts/test_chat.py | 2,006 | 59 | 18 | 2,642.5 | |
| libs/partners/ollama/uv.lock | 1,722 | 62 | 11 | 2,572.8 | |
| libs/partners/nomic/uv.lock | 2,453 | 49 | 7 | 2,426.9 | |
| libs/core/tests/unit_tests/language_models/chat_models/test_base.py | 1,938 | 54 | 15 | 2,377.2 | |
| libs/partners/anthropic/pyproject.toml | 149 | 194 | 16 | 2,368.1 | |
| libs/langchain_v1/pyproject.toml | 192 | 168 | 11 | 2,327.9 | |
| libs/partners/openai/tests/integration_tests/chat_models/test_responses_api.py | 1,994 | 51 | 12 | 2,277.4 | |
| libs/standard-tests/langchain_tests/unit_tests/chat_models.py | 1,174 | 66 | 7 | 2,261.4 | |
| libs/core/langchain_core/messages/ai.py | 853 | 75 | 13 | 2,190.5 | |
| libs/core/tests/unit_tests/test_messages.py | 1,457 | 55 | 18 | 2,099.4 | |
| libs/core/tests/unit_tests/utils/test_function_calling.py | 1,504 | 54 | 24 | 2,094.2 | |
| libs/core/tests/unit_tests/runnables/__snapshots__/test_graph.ambr | 2,156 | 45 | 12 | 2,089.5 | |
| libs/partners/openrouter/uv.lock | 1,993 | 45 | 5 | 2,008.9 | |
| libs/core/langchain_core/runnables/utils.py | 799 | 68 | 13 | 1,922.1 | |
| libs/partners/chroma/langchain_chroma/vectorstores.py | 1,459 | 50 | 26 | 1,909.8 | |
| libs/core/langchain_core/runnables/graph.py | 741 | 68 | 15 | 1,851.0 | |
| libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py | 2,164 | 39 | 8 | 1,814.2 | |
| libs/langchain/tests/unit_tests/indexes/test_indexing.py | 1,547 | 46 | 20 | 1,809.3 | |
| .github/scripts/check_diff.py | 398 | 87 | 9 | 1,735.6 | |
| libs/partners/exa/uv.lock | 2,072 | 38 | 8 | 1,729.7 | |
| libs/core/tests/unit_tests/prompts/__snapshots__/test_chat.ambr | 3,312 | 30 | 8 | 1,726.5 | |
| libs/core/langchain_core/runnables/history.py | 631 | 68 | 15 | 1,708.1 | |
| libs/langchain_v1/langchain/chat_models/base.py | 1,079 | 51 | 12 | 1,675.3 | |
| libs/core/langchain_core/callbacks/base.py | 1,229 | 46 | 15 | 1,612.6 | |
| libs/core/langchain_core/runnables/passthrough.py | 849 | 55 | 15 | 1,602.6 | |
| libs/partners/openrouter/tests/unit_tests/test_chat_models.py | 3,781 | 26 | 4 | 1,598.7 | |
| libs/core/langchain_core/runnables/config.py | 712 | 59 | 12 | 1,574.3 | |
| libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_summarization.py | 2,741 | 30 | 6 | 1,570.6 | |
| libs/core/langchain_core/tracers/event_stream.py | 1,101 | 47 | 8 | 1,559.5 | |
| libs/partners/openai/langchain_openai/data/_profiles.py | 1,812 | 36 | 6 | 1,532.4 | |
| libs/core/langchain_core/tracers/log_stream.py | 765 | 55 | 12 | 1,521.2 | |
| libs/partners/perplexity/langchain_perplexity/chat_models.py | 1,726 | 36 | 12 | 1,495.6 | |
| libs/text-splitters/langchain_text_splitters/html.py | 1,099 | 45 | 18 | 1,491.8 | |
| libs/partners/openai/langchain_openai/embeddings/base.py | 820 | 52 | 22 | 1,489.1 | |
| libs/langchain_v1/langchain/agents/middleware/summarization.py | 1,046 | 46 | 7 | 1,487.7 | |
| libs/partners/openai/langchain_openai/llms/base.py | 919 | 49 | 18 | 1,485.4 | |
| libs/core/langchain_core/load/load.py | 828 | 51 | 17 | 1,467.5 | |
| libs/core/langchain_core/_api/deprecation.py | 636 | 58 | 14 | 1,462.7 | |
| libs/core/langchain_core/messages/base.py | 518 | 64 | 14 | 1,456.6 | |
| libs/core/langchain_core/indexing/api.py | 954 | 47 | 15 | 1,451.7 | |
| libs/core/langchain_core/vectorstores/base.py | 1,111 | 43 | 8 | 1,433.3 | |
| libs/langchain/tests/unit_tests/agents/test_agent.py | 1,329 | 39 | 13 | 1,421.8 | |
| libs/core/langchain_core/prompts/base.py | 508 | 63 | 14 | 1,419.9 | |
| libs/core/tests/unit_tests/indexing/test_indexing.py | 2,963 | 26 | 10 | 1,415.3 | |
| libs/core/langchain_core/language_models/base.py | 500 | 63 | 13 | 1,408.7 | |
| libs/core/tests/unit_tests/runnables/test_tracing_interops.py | 1,303 | 39 | 7 | 1,407.8 | |
| libs/partners/huggingface/langchain_huggingface/data/_profiles.py | 1,768 | 33 | 2 | 1,387.6 | |
| libs/core/langchain_core/runnables/configurable.py | 710 | 52 | 11 | 1,385.6 | |
| libs/partners/huggingface/langchain_huggingface/chat_models/huggingface.py | 1,252 | 38 | 19 | 1,344.6 | |
| libs/partners/xai/langchain_xai/chat_models.py | 799 | 47 | 11 | 1,328.5 |