agent_chain_core/load/
mapping.rs

1//! Serialization mapping.
2//!
3//! This module contains a mapping between the lc_namespace path for a given
4//! type that implements Serializable to the namespace where that type is
5//! actually located.
6//!
7//! This mapping helps maintain the ability to serialize and deserialize
8//! well-known LangChain objects even if they are moved around in the codebase
9//! across different LangChain versions.
10
11use std::collections::HashMap;
12use std::sync::LazyLock;
13
14/// Type alias for namespace mapping: (serialized_as) -> (import_from)
15pub type NamespaceMapping = HashMap<Vec<String>, Vec<String>>;
16
17/// Main serializable mapping.
18///
19/// Maps the lc_namespace path to the actual import path.
20/// First value is what it's serialized as, second is where to load it from.
21pub static SERIALIZABLE_MAPPING: LazyLock<NamespaceMapping> = LazyLock::new(|| {
22    let mut map = HashMap::new();
23
24    // Message types
25    map.insert(
26        vec![
27            "langchain".into(),
28            "schema".into(),
29            "messages".into(),
30            "AIMessage".into(),
31        ],
32        vec![
33            "langchain_core".into(),
34            "messages".into(),
35            "ai".into(),
36            "AIMessage".into(),
37        ],
38    );
39    map.insert(
40        vec![
41            "langchain".into(),
42            "schema".into(),
43            "messages".into(),
44            "AIMessageChunk".into(),
45        ],
46        vec![
47            "langchain_core".into(),
48            "messages".into(),
49            "ai".into(),
50            "AIMessageChunk".into(),
51        ],
52    );
53    map.insert(
54        vec![
55            "langchain".into(),
56            "schema".into(),
57            "messages".into(),
58            "BaseMessage".into(),
59        ],
60        vec![
61            "langchain_core".into(),
62            "messages".into(),
63            "base".into(),
64            "BaseMessage".into(),
65        ],
66    );
67    map.insert(
68        vec![
69            "langchain".into(),
70            "schema".into(),
71            "messages".into(),
72            "BaseMessageChunk".into(),
73        ],
74        vec![
75            "langchain_core".into(),
76            "messages".into(),
77            "base".into(),
78            "BaseMessageChunk".into(),
79        ],
80    );
81    map.insert(
82        vec![
83            "langchain".into(),
84            "schema".into(),
85            "messages".into(),
86            "ChatMessage".into(),
87        ],
88        vec![
89            "langchain_core".into(),
90            "messages".into(),
91            "chat".into(),
92            "ChatMessage".into(),
93        ],
94    );
95    map.insert(
96        vec![
97            "langchain".into(),
98            "schema".into(),
99            "messages".into(),
100            "FunctionMessage".into(),
101        ],
102        vec![
103            "langchain_core".into(),
104            "messages".into(),
105            "function".into(),
106            "FunctionMessage".into(),
107        ],
108    );
109    map.insert(
110        vec![
111            "langchain".into(),
112            "schema".into(),
113            "messages".into(),
114            "HumanMessage".into(),
115        ],
116        vec![
117            "langchain_core".into(),
118            "messages".into(),
119            "human".into(),
120            "HumanMessage".into(),
121        ],
122    );
123    map.insert(
124        vec![
125            "langchain".into(),
126            "schema".into(),
127            "messages".into(),
128            "SystemMessage".into(),
129        ],
130        vec![
131            "langchain_core".into(),
132            "messages".into(),
133            "system".into(),
134            "SystemMessage".into(),
135        ],
136    );
137    map.insert(
138        vec![
139            "langchain".into(),
140            "schema".into(),
141            "messages".into(),
142            "ToolMessage".into(),
143        ],
144        vec![
145            "langchain_core".into(),
146            "messages".into(),
147            "tool".into(),
148            "ToolMessage".into(),
149        ],
150    );
151    map.insert(
152        vec![
153            "langchain".into(),
154            "schema".into(),
155            "messages".into(),
156            "RemoveMessage".into(),
157        ],
158        vec![
159            "langchain_core".into(),
160            "messages".into(),
161            "modifier".into(),
162            "RemoveMessage".into(),
163        ],
164    );
165
166    // Agent types
167    map.insert(
168        vec![
169            "langchain".into(),
170            "schema".into(),
171            "agent".into(),
172            "AgentAction".into(),
173        ],
174        vec![
175            "langchain_core".into(),
176            "agents".into(),
177            "AgentAction".into(),
178        ],
179    );
180    map.insert(
181        vec![
182            "langchain".into(),
183            "schema".into(),
184            "agent".into(),
185            "AgentFinish".into(),
186        ],
187        vec![
188            "langchain_core".into(),
189            "agents".into(),
190            "AgentFinish".into(),
191        ],
192    );
193
194    // Prompt types
195    map.insert(
196        vec![
197            "langchain".into(),
198            "schema".into(),
199            "prompt_template".into(),
200            "BasePromptTemplate".into(),
201        ],
202        vec![
203            "langchain_core".into(),
204            "prompts".into(),
205            "base".into(),
206            "BasePromptTemplate".into(),
207        ],
208    );
209    map.insert(
210        vec![
211            "langchain".into(),
212            "prompts".into(),
213            "prompt".into(),
214            "PromptTemplate".into(),
215        ],
216        vec![
217            "langchain_core".into(),
218            "prompts".into(),
219            "prompt".into(),
220            "PromptTemplate".into(),
221        ],
222    );
223    map.insert(
224        vec![
225            "langchain".into(),
226            "prompts".into(),
227            "chat".into(),
228            "MessagesPlaceholder".into(),
229        ],
230        vec![
231            "langchain_core".into(),
232            "prompts".into(),
233            "chat".into(),
234            "MessagesPlaceholder".into(),
235        ],
236    );
237    map.insert(
238        vec![
239            "langchain".into(),
240            "prompts".into(),
241            "chat".into(),
242            "ChatPromptTemplate".into(),
243        ],
244        vec![
245            "langchain_core".into(),
246            "prompts".into(),
247            "chat".into(),
248            "ChatPromptTemplate".into(),
249        ],
250    );
251    map.insert(
252        vec![
253            "langchain".into(),
254            "prompts".into(),
255            "chat".into(),
256            "HumanMessagePromptTemplate".into(),
257        ],
258        vec![
259            "langchain_core".into(),
260            "prompts".into(),
261            "chat".into(),
262            "HumanMessagePromptTemplate".into(),
263        ],
264    );
265    map.insert(
266        vec![
267            "langchain".into(),
268            "prompts".into(),
269            "chat".into(),
270            "SystemMessagePromptTemplate".into(),
271        ],
272        vec![
273            "langchain_core".into(),
274            "prompts".into(),
275            "chat".into(),
276            "SystemMessagePromptTemplate".into(),
277        ],
278    );
279    map.insert(
280        vec![
281            "langchain".into(),
282            "prompts".into(),
283            "image".into(),
284            "ImagePromptTemplate".into(),
285        ],
286        vec![
287            "langchain_core".into(),
288            "prompts".into(),
289            "image".into(),
290            "ImagePromptTemplate".into(),
291        ],
292    );
293    map.insert(
294        vec![
295            "langchain".into(),
296            "prompts".into(),
297            "chat".into(),
298            "AIMessagePromptTemplate".into(),
299        ],
300        vec![
301            "langchain_core".into(),
302            "prompts".into(),
303            "chat".into(),
304            "AIMessagePromptTemplate".into(),
305        ],
306    );
307    map.insert(
308        vec![
309            "langchain".into(),
310            "prompts".into(),
311            "chat".into(),
312            "BaseMessagePromptTemplate".into(),
313        ],
314        vec![
315            "langchain_core".into(),
316            "prompts".into(),
317            "chat".into(),
318            "BaseMessagePromptTemplate".into(),
319        ],
320    );
321    map.insert(
322        vec![
323            "langchain".into(),
324            "schema".into(),
325            "agent".into(),
326            "AgentActionMessageLog".into(),
327        ],
328        vec![
329            "langchain_core".into(),
330            "agents".into(),
331            "AgentActionMessageLog".into(),
332        ],
333    );
334
335    // Output types
336    map.insert(
337        vec![
338            "langchain".into(),
339            "schema".into(),
340            "output".into(),
341            "ChatGeneration".into(),
342        ],
343        vec![
344            "langchain_core".into(),
345            "outputs".into(),
346            "chat_generation".into(),
347            "ChatGeneration".into(),
348        ],
349    );
350    map.insert(
351        vec![
352            "langchain".into(),
353            "schema".into(),
354            "output".into(),
355            "Generation".into(),
356        ],
357        vec![
358            "langchain_core".into(),
359            "outputs".into(),
360            "generation".into(),
361            "Generation".into(),
362        ],
363    );
364    map.insert(
365        vec![
366            "langchain".into(),
367            "schema".into(),
368            "output".into(),
369            "ChatGenerationChunk".into(),
370        ],
371        vec![
372            "langchain_core".into(),
373            "outputs".into(),
374            "chat_generation".into(),
375            "ChatGenerationChunk".into(),
376        ],
377    );
378    map.insert(
379        vec![
380            "langchain".into(),
381            "schema".into(),
382            "output".into(),
383            "GenerationChunk".into(),
384        ],
385        vec![
386            "langchain_core".into(),
387            "outputs".into(),
388            "generation".into(),
389            "GenerationChunk".into(),
390        ],
391    );
392
393    // Document types
394    map.insert(
395        vec![
396            "langchain".into(),
397            "schema".into(),
398            "document".into(),
399            "Document".into(),
400        ],
401        vec![
402            "langchain_core".into(),
403            "documents".into(),
404            "base".into(),
405            "Document".into(),
406        ],
407    );
408
409    // Runnable types
410    map.insert(
411        vec![
412            "langchain".into(),
413            "schema".into(),
414            "runnable".into(),
415            "DynamicRunnable".into(),
416        ],
417        vec![
418            "langchain_core".into(),
419            "runnables".into(),
420            "configurable".into(),
421            "DynamicRunnable".into(),
422        ],
423    );
424    map.insert(
425        vec![
426            "langchain".into(),
427            "schema".into(),
428            "prompt".into(),
429            "PromptValue".into(),
430        ],
431        vec![
432            "langchain_core".into(),
433            "prompt_values".into(),
434            "PromptValue".into(),
435        ],
436    );
437    map.insert(
438        vec![
439            "langchain".into(),
440            "schema".into(),
441            "runnable".into(),
442            "RunnableBinding".into(),
443        ],
444        vec![
445            "langchain_core".into(),
446            "runnables".into(),
447            "base".into(),
448            "RunnableBinding".into(),
449        ],
450    );
451    map.insert(
452        vec![
453            "langchain".into(),
454            "schema".into(),
455            "runnable".into(),
456            "RunnableBranch".into(),
457        ],
458        vec![
459            "langchain_core".into(),
460            "runnables".into(),
461            "branch".into(),
462            "RunnableBranch".into(),
463        ],
464    );
465    map.insert(
466        vec![
467            "langchain".into(),
468            "schema".into(),
469            "runnable".into(),
470            "RunnableWithFallbacks".into(),
471        ],
472        vec![
473            "langchain_core".into(),
474            "runnables".into(),
475            "fallbacks".into(),
476            "RunnableWithFallbacks".into(),
477        ],
478    );
479    map.insert(
480        vec![
481            "langchain".into(),
482            "schema".into(),
483            "runnable".into(),
484            "RunnableParallel".into(),
485        ],
486        vec![
487            "langchain_core".into(),
488            "runnables".into(),
489            "base".into(),
490            "RunnableParallel".into(),
491        ],
492    );
493    map.insert(
494        vec![
495            "langchain".into(),
496            "schema".into(),
497            "runnable".into(),
498            "RunnableSequence".into(),
499        ],
500        vec![
501            "langchain_core".into(),
502            "runnables".into(),
503            "base".into(),
504            "RunnableSequence".into(),
505        ],
506    );
507    map.insert(
508        vec![
509            "langchain".into(),
510            "schema".into(),
511            "runnable".into(),
512            "RunnablePassthrough".into(),
513        ],
514        vec![
515            "langchain_core".into(),
516            "runnables".into(),
517            "passthrough".into(),
518            "RunnablePassthrough".into(),
519        ],
520    );
521    map.insert(
522        vec![
523            "langchain".into(),
524            "schema".into(),
525            "runnable".into(),
526            "RunnableAssign".into(),
527        ],
528        vec![
529            "langchain_core".into(),
530            "runnables".into(),
531            "passthrough".into(),
532            "RunnableAssign".into(),
533        ],
534    );
535    map.insert(
536        vec![
537            "langchain".into(),
538            "schema".into(),
539            "runnable".into(),
540            "RunnableEach".into(),
541        ],
542        vec![
543            "langchain_core".into(),
544            "runnables".into(),
545            "base".into(),
546            "RunnableEach".into(),
547        ],
548    );
549    map.insert(
550        vec![
551            "langchain".into(),
552            "schema".into(),
553            "runnable".into(),
554            "RunnableRetry".into(),
555        ],
556        vec![
557            "langchain_core".into(),
558            "runnables".into(),
559            "retry".into(),
560            "RunnableRetry".into(),
561        ],
562    );
563    map.insert(
564        vec![
565            "langchain".into(),
566            "schema".into(),
567            "runnable".into(),
568            "RouterRunnable".into(),
569        ],
570        vec![
571            "langchain_core".into(),
572            "runnables".into(),
573            "router".into(),
574            "RouterRunnable".into(),
575        ],
576    );
577
578    // Output parser types
579    map.insert(
580        vec![
581            "langchain".into(),
582            "schema".into(),
583            "output_parser".into(),
584            "StrOutputParser".into(),
585        ],
586        vec![
587            "langchain_core".into(),
588            "output_parsers".into(),
589            "string".into(),
590            "StrOutputParser".into(),
591        ],
592    );
593    map.insert(
594        vec![
595            "langchain".into(),
596            "output_parsers".into(),
597            "list".into(),
598            "CommaSeparatedListOutputParser".into(),
599        ],
600        vec![
601            "langchain_core".into(),
602            "output_parsers".into(),
603            "list".into(),
604            "CommaSeparatedListOutputParser".into(),
605        ],
606    );
607
608    // Message chunk types
609    map.insert(
610        vec![
611            "langchain".into(),
612            "schema".into(),
613            "messages".into(),
614            "ChatMessageChunk".into(),
615        ],
616        vec![
617            "langchain_core".into(),
618            "messages".into(),
619            "chat".into(),
620            "ChatMessageChunk".into(),
621        ],
622    );
623    map.insert(
624        vec![
625            "langchain".into(),
626            "schema".into(),
627            "messages".into(),
628            "HumanMessageChunk".into(),
629        ],
630        vec![
631            "langchain_core".into(),
632            "messages".into(),
633            "human".into(),
634            "HumanMessageChunk".into(),
635        ],
636    );
637    map.insert(
638        vec![
639            "langchain".into(),
640            "schema".into(),
641            "messages".into(),
642            "FunctionMessageChunk".into(),
643        ],
644        vec![
645            "langchain_core".into(),
646            "messages".into(),
647            "function".into(),
648            "FunctionMessageChunk".into(),
649        ],
650    );
651    map.insert(
652        vec![
653            "langchain".into(),
654            "schema".into(),
655            "messages".into(),
656            "SystemMessageChunk".into(),
657        ],
658        vec![
659            "langchain_core".into(),
660            "messages".into(),
661            "system".into(),
662            "SystemMessageChunk".into(),
663        ],
664    );
665    map.insert(
666        vec![
667            "langchain".into(),
668            "schema".into(),
669            "messages".into(),
670            "ToolMessageChunk".into(),
671        ],
672        vec![
673            "langchain_core".into(),
674            "messages".into(),
675            "tool".into(),
676            "ToolMessageChunk".into(),
677        ],
678    );
679
680    // Prompt value types
681    map.insert(
682        vec![
683            "langchain".into(),
684            "prompts".into(),
685            "base".into(),
686            "StringPromptTemplate".into(),
687        ],
688        vec![
689            "langchain_core".into(),
690            "prompts".into(),
691            "string".into(),
692            "StringPromptTemplate".into(),
693        ],
694    );
695    map.insert(
696        vec![
697            "langchain".into(),
698            "prompts".into(),
699            "base".into(),
700            "StringPromptValue".into(),
701        ],
702        vec![
703            "langchain_core".into(),
704            "prompt_values".into(),
705            "StringPromptValue".into(),
706        ],
707    );
708    map.insert(
709        vec![
710            "langchain".into(),
711            "prompts".into(),
712            "chat".into(),
713            "ChatPromptValue".into(),
714        ],
715        vec![
716            "langchain_core".into(),
717            "prompt_values".into(),
718            "ChatPromptValue".into(),
719        ],
720    );
721    map.insert(
722        vec![
723            "langchain".into(),
724            "prompts".into(),
725            "chat".into(),
726            "ChatPromptValueConcrete".into(),
727        ],
728        vec![
729            "langchain_core".into(),
730            "prompt_values".into(),
731            "ChatPromptValueConcrete".into(),
732        ],
733    );
734
735    // Chat prompt types
736    map.insert(
737        vec![
738            "langchain".into(),
739            "schema".into(),
740            "prompt_template".into(),
741            "BaseChatPromptTemplate".into(),
742        ],
743        vec![
744            "langchain_core".into(),
745            "prompts".into(),
746            "chat".into(),
747            "BaseChatPromptTemplate".into(),
748        ],
749    );
750    map.insert(
751        vec![
752            "langchain".into(),
753            "prompts".into(),
754            "chat".into(),
755            "ChatMessagePromptTemplate".into(),
756        ],
757        vec![
758            "langchain_core".into(),
759            "prompts".into(),
760            "chat".into(),
761            "ChatMessagePromptTemplate".into(),
762        ],
763    );
764    map.insert(
765        vec![
766            "langchain".into(),
767            "prompts".into(),
768            "chat".into(),
769            "BaseStringMessagePromptTemplate".into(),
770        ],
771        vec![
772            "langchain_core".into(),
773            "prompts".into(),
774            "chat".into(),
775            "BaseStringMessagePromptTemplate".into(),
776        ],
777    );
778    map.insert(
779        vec![
780            "langchain".into(),
781            "prompts".into(),
782            "few_shot_with_templates".into(),
783            "FewShotPromptWithTemplates".into(),
784        ],
785        vec![
786            "langchain_core".into(),
787            "prompts".into(),
788            "few_shot_with_templates".into(),
789            "FewShotPromptWithTemplates".into(),
790        ],
791    );
792
793    // Structured prompt
794    map.insert(
795        vec![
796            "langchain_core".into(),
797            "prompts".into(),
798            "structured".into(),
799            "StructuredPrompt".into(),
800        ],
801        vec![
802            "langchain_core".into(),
803            "prompts".into(),
804            "structured".into(),
805            "StructuredPrompt".into(),
806        ],
807    );
808
809    // Dict prompt template
810    map.insert(
811        vec![
812            "langchain_core".into(),
813            "prompts".into(),
814            "message".into(),
815            "_DictMessagePromptTemplate".into(),
816        ],
817        vec![
818            "langchain_core".into(),
819            "prompts".into(),
820            "dict".into(),
821            "DictPromptTemplate".into(),
822        ],
823    );
824
825    map
826});
827
828/// Mapping for old LangChain versions where things were in different places.
829pub static OG_SERIALIZABLE_MAPPING: LazyLock<NamespaceMapping> = LazyLock::new(|| {
830    let mut map = HashMap::new();
831
832    map.insert(
833        vec!["langchain".into(), "schema".into(), "AIMessage".into()],
834        vec![
835            "langchain_core".into(),
836            "messages".into(),
837            "ai".into(),
838            "AIMessage".into(),
839        ],
840    );
841    map.insert(
842        vec!["langchain".into(), "schema".into(), "ChatMessage".into()],
843        vec![
844            "langchain_core".into(),
845            "messages".into(),
846            "chat".into(),
847            "ChatMessage".into(),
848        ],
849    );
850    map.insert(
851        vec![
852            "langchain".into(),
853            "schema".into(),
854            "FunctionMessage".into(),
855        ],
856        vec![
857            "langchain_core".into(),
858            "messages".into(),
859            "function".into(),
860            "FunctionMessage".into(),
861        ],
862    );
863    map.insert(
864        vec!["langchain".into(), "schema".into(), "HumanMessage".into()],
865        vec![
866            "langchain_core".into(),
867            "messages".into(),
868            "human".into(),
869            "HumanMessage".into(),
870        ],
871    );
872    map.insert(
873        vec!["langchain".into(), "schema".into(), "SystemMessage".into()],
874        vec![
875            "langchain_core".into(),
876            "messages".into(),
877            "system".into(),
878            "SystemMessage".into(),
879        ],
880    );
881    map.insert(
882        vec![
883            "langchain".into(),
884            "schema".into(),
885            "prompt_template".into(),
886            "ImagePromptTemplate".into(),
887        ],
888        vec![
889            "langchain_core".into(),
890            "prompts".into(),
891            "image".into(),
892            "ImagePromptTemplate".into(),
893        ],
894    );
895
896    map
897});
898
899/// Mapping for old core namespaces for backwards compatibility.
900pub static OLD_CORE_NAMESPACES_MAPPING: LazyLock<NamespaceMapping> = LazyLock::new(|| {
901    let mut map = HashMap::new();
902
903    // Message types with langchain_core prefix
904    map.insert(
905        vec![
906            "langchain_core".into(),
907            "messages".into(),
908            "ai".into(),
909            "AIMessage".into(),
910        ],
911        vec![
912            "langchain_core".into(),
913            "messages".into(),
914            "ai".into(),
915            "AIMessage".into(),
916        ],
917    );
918    map.insert(
919        vec![
920            "langchain_core".into(),
921            "messages".into(),
922            "ai".into(),
923            "AIMessageChunk".into(),
924        ],
925        vec![
926            "langchain_core".into(),
927            "messages".into(),
928            "ai".into(),
929            "AIMessageChunk".into(),
930        ],
931    );
932    map.insert(
933        vec![
934            "langchain_core".into(),
935            "messages".into(),
936            "base".into(),
937            "BaseMessage".into(),
938        ],
939        vec![
940            "langchain_core".into(),
941            "messages".into(),
942            "base".into(),
943            "BaseMessage".into(),
944        ],
945    );
946    map.insert(
947        vec![
948            "langchain_core".into(),
949            "messages".into(),
950            "base".into(),
951            "BaseMessageChunk".into(),
952        ],
953        vec![
954            "langchain_core".into(),
955            "messages".into(),
956            "base".into(),
957            "BaseMessageChunk".into(),
958        ],
959    );
960    map.insert(
961        vec![
962            "langchain_core".into(),
963            "messages".into(),
964            "chat".into(),
965            "ChatMessage".into(),
966        ],
967        vec![
968            "langchain_core".into(),
969            "messages".into(),
970            "chat".into(),
971            "ChatMessage".into(),
972        ],
973    );
974    map.insert(
975        vec![
976            "langchain_core".into(),
977            "messages".into(),
978            "function".into(),
979            "FunctionMessage".into(),
980        ],
981        vec![
982            "langchain_core".into(),
983            "messages".into(),
984            "function".into(),
985            "FunctionMessage".into(),
986        ],
987    );
988    map.insert(
989        vec![
990            "langchain_core".into(),
991            "messages".into(),
992            "human".into(),
993            "HumanMessage".into(),
994        ],
995        vec![
996            "langchain_core".into(),
997            "messages".into(),
998            "human".into(),
999            "HumanMessage".into(),
1000        ],
1001    );
1002    map.insert(
1003        vec![
1004            "langchain_core".into(),
1005            "messages".into(),
1006            "system".into(),
1007            "SystemMessage".into(),
1008        ],
1009        vec![
1010            "langchain_core".into(),
1011            "messages".into(),
1012            "system".into(),
1013            "SystemMessage".into(),
1014        ],
1015    );
1016    map.insert(
1017        vec![
1018            "langchain_core".into(),
1019            "messages".into(),
1020            "tool".into(),
1021            "ToolMessage".into(),
1022        ],
1023        vec![
1024            "langchain_core".into(),
1025            "messages".into(),
1026            "tool".into(),
1027            "ToolMessage".into(),
1028        ],
1029    );
1030
1031    // Agent types
1032    map.insert(
1033        vec![
1034            "langchain_core".into(),
1035            "agents".into(),
1036            "AgentAction".into(),
1037        ],
1038        vec![
1039            "langchain_core".into(),
1040            "agents".into(),
1041            "AgentAction".into(),
1042        ],
1043    );
1044    map.insert(
1045        vec![
1046            "langchain_core".into(),
1047            "agents".into(),
1048            "AgentFinish".into(),
1049        ],
1050        vec![
1051            "langchain_core".into(),
1052            "agents".into(),
1053            "AgentFinish".into(),
1054        ],
1055    );
1056    map.insert(
1057        vec![
1058            "langchain_core".into(),
1059            "agents".into(),
1060            "AgentActionMessageLog".into(),
1061        ],
1062        vec![
1063            "langchain_core".into(),
1064            "agents".into(),
1065            "AgentActionMessageLog".into(),
1066        ],
1067    );
1068
1069    // Prompt types
1070    map.insert(
1071        vec![
1072            "langchain_core".into(),
1073            "prompts".into(),
1074            "base".into(),
1075            "BasePromptTemplate".into(),
1076        ],
1077        vec![
1078            "langchain_core".into(),
1079            "prompts".into(),
1080            "base".into(),
1081            "BasePromptTemplate".into(),
1082        ],
1083    );
1084    map.insert(
1085        vec![
1086            "langchain_core".into(),
1087            "prompts".into(),
1088            "prompt".into(),
1089            "PromptTemplate".into(),
1090        ],
1091        vec![
1092            "langchain_core".into(),
1093            "prompts".into(),
1094            "prompt".into(),
1095            "PromptTemplate".into(),
1096        ],
1097    );
1098    map.insert(
1099        vec![
1100            "langchain_core".into(),
1101            "prompts".into(),
1102            "chat".into(),
1103            "MessagesPlaceholder".into(),
1104        ],
1105        vec![
1106            "langchain_core".into(),
1107            "prompts".into(),
1108            "chat".into(),
1109            "MessagesPlaceholder".into(),
1110        ],
1111    );
1112    map.insert(
1113        vec![
1114            "langchain_core".into(),
1115            "prompts".into(),
1116            "chat".into(),
1117            "ChatPromptTemplate".into(),
1118        ],
1119        vec![
1120            "langchain_core".into(),
1121            "prompts".into(),
1122            "chat".into(),
1123            "ChatPromptTemplate".into(),
1124        ],
1125    );
1126    map.insert(
1127        vec![
1128            "langchain_core".into(),
1129            "prompts".into(),
1130            "chat".into(),
1131            "HumanMessagePromptTemplate".into(),
1132        ],
1133        vec![
1134            "langchain_core".into(),
1135            "prompts".into(),
1136            "chat".into(),
1137            "HumanMessagePromptTemplate".into(),
1138        ],
1139    );
1140    map.insert(
1141        vec![
1142            "langchain_core".into(),
1143            "prompts".into(),
1144            "chat".into(),
1145            "SystemMessagePromptTemplate".into(),
1146        ],
1147        vec![
1148            "langchain_core".into(),
1149            "prompts".into(),
1150            "chat".into(),
1151            "SystemMessagePromptTemplate".into(),
1152        ],
1153    );
1154    map.insert(
1155        vec![
1156            "langchain_core".into(),
1157            "prompts".into(),
1158            "chat".into(),
1159            "AIMessagePromptTemplate".into(),
1160        ],
1161        vec![
1162            "langchain_core".into(),
1163            "prompts".into(),
1164            "chat".into(),
1165            "AIMessagePromptTemplate".into(),
1166        ],
1167    );
1168    map.insert(
1169        vec![
1170            "langchain_core".into(),
1171            "prompts".into(),
1172            "chat".into(),
1173            "BaseMessagePromptTemplate".into(),
1174        ],
1175        vec![
1176            "langchain_core".into(),
1177            "prompts".into(),
1178            "chat".into(),
1179            "BaseMessagePromptTemplate".into(),
1180        ],
1181    );
1182    map.insert(
1183        vec![
1184            "langchain_core".into(),
1185            "prompts".into(),
1186            "chat".into(),
1187            "BaseChatPromptTemplate".into(),
1188        ],
1189        vec![
1190            "langchain_core".into(),
1191            "prompts".into(),
1192            "chat".into(),
1193            "BaseChatPromptTemplate".into(),
1194        ],
1195    );
1196    map.insert(
1197        vec![
1198            "langchain_core".into(),
1199            "prompts".into(),
1200            "chat".into(),
1201            "ChatMessagePromptTemplate".into(),
1202        ],
1203        vec![
1204            "langchain_core".into(),
1205            "prompts".into(),
1206            "chat".into(),
1207            "ChatMessagePromptTemplate".into(),
1208        ],
1209    );
1210    map.insert(
1211        vec![
1212            "langchain_core".into(),
1213            "prompts".into(),
1214            "chat".into(),
1215            "BaseStringMessagePromptTemplate".into(),
1216        ],
1217        vec![
1218            "langchain_core".into(),
1219            "prompts".into(),
1220            "chat".into(),
1221            "BaseStringMessagePromptTemplate".into(),
1222        ],
1223    );
1224    map.insert(
1225        vec![
1226            "langchain_core".into(),
1227            "prompts".into(),
1228            "string".into(),
1229            "StringPromptTemplate".into(),
1230        ],
1231        vec![
1232            "langchain_core".into(),
1233            "prompts".into(),
1234            "string".into(),
1235            "StringPromptTemplate".into(),
1236        ],
1237    );
1238    map.insert(
1239        vec![
1240            "langchain_core".into(),
1241            "prompts".into(),
1242            "few_shot_with_templates".into(),
1243            "FewShotPromptWithTemplates".into(),
1244        ],
1245        vec![
1246            "langchain_core".into(),
1247            "prompts".into(),
1248            "few_shot_with_templates".into(),
1249            "FewShotPromptWithTemplates".into(),
1250        ],
1251    );
1252
1253    // Output types
1254    map.insert(
1255        vec![
1256            "langchain_core".into(),
1257            "outputs".into(),
1258            "chat_generation".into(),
1259            "ChatGeneration".into(),
1260        ],
1261        vec![
1262            "langchain_core".into(),
1263            "outputs".into(),
1264            "chat_generation".into(),
1265            "ChatGeneration".into(),
1266        ],
1267    );
1268    map.insert(
1269        vec![
1270            "langchain_core".into(),
1271            "outputs".into(),
1272            "generation".into(),
1273            "Generation".into(),
1274        ],
1275        vec![
1276            "langchain_core".into(),
1277            "outputs".into(),
1278            "generation".into(),
1279            "Generation".into(),
1280        ],
1281    );
1282    map.insert(
1283        vec![
1284            "langchain_core".into(),
1285            "outputs".into(),
1286            "chat_generation".into(),
1287            "ChatGenerationChunk".into(),
1288        ],
1289        vec![
1290            "langchain_core".into(),
1291            "outputs".into(),
1292            "chat_generation".into(),
1293            "ChatGenerationChunk".into(),
1294        ],
1295    );
1296    map.insert(
1297        vec![
1298            "langchain_core".into(),
1299            "outputs".into(),
1300            "generation".into(),
1301            "GenerationChunk".into(),
1302        ],
1303        vec![
1304            "langchain_core".into(),
1305            "outputs".into(),
1306            "generation".into(),
1307            "GenerationChunk".into(),
1308        ],
1309    );
1310
1311    // Document types
1312    map.insert(
1313        vec![
1314            "langchain_core".into(),
1315            "documents".into(),
1316            "base".into(),
1317            "Document".into(),
1318        ],
1319        vec![
1320            "langchain_core".into(),
1321            "documents".into(),
1322            "base".into(),
1323            "Document".into(),
1324        ],
1325    );
1326
1327    // Prompt value types
1328    map.insert(
1329        vec![
1330            "langchain_core".into(),
1331            "prompt_values".into(),
1332            "PromptValue".into(),
1333        ],
1334        vec![
1335            "langchain_core".into(),
1336            "prompt_values".into(),
1337            "PromptValue".into(),
1338        ],
1339    );
1340    map.insert(
1341        vec![
1342            "langchain_core".into(),
1343            "prompt_values".into(),
1344            "StringPromptValue".into(),
1345        ],
1346        vec![
1347            "langchain_core".into(),
1348            "prompt_values".into(),
1349            "StringPromptValue".into(),
1350        ],
1351    );
1352    map.insert(
1353        vec![
1354            "langchain_core".into(),
1355            "prompt_values".into(),
1356            "ChatPromptValue".into(),
1357        ],
1358        vec![
1359            "langchain_core".into(),
1360            "prompt_values".into(),
1361            "ChatPromptValue".into(),
1362        ],
1363    );
1364    map.insert(
1365        vec![
1366            "langchain_core".into(),
1367            "prompt_values".into(),
1368            "ChatPromptValueConcrete".into(),
1369        ],
1370        vec![
1371            "langchain_core".into(),
1372            "prompt_values".into(),
1373            "ChatPromptValueConcrete".into(),
1374        ],
1375    );
1376
1377    // Runnable types
1378    map.insert(
1379        vec![
1380            "langchain_core".into(),
1381            "runnables".into(),
1382            "configurable".into(),
1383            "DynamicRunnable".into(),
1384        ],
1385        vec![
1386            "langchain_core".into(),
1387            "runnables".into(),
1388            "configurable".into(),
1389            "DynamicRunnable".into(),
1390        ],
1391    );
1392    map.insert(
1393        vec![
1394            "langchain_core".into(),
1395            "runnables".into(),
1396            "base".into(),
1397            "RunnableBinding".into(),
1398        ],
1399        vec![
1400            "langchain_core".into(),
1401            "runnables".into(),
1402            "base".into(),
1403            "RunnableBinding".into(),
1404        ],
1405    );
1406    map.insert(
1407        vec![
1408            "langchain_core".into(),
1409            "runnables".into(),
1410            "branch".into(),
1411            "RunnableBranch".into(),
1412        ],
1413        vec![
1414            "langchain_core".into(),
1415            "runnables".into(),
1416            "branch".into(),
1417            "RunnableBranch".into(),
1418        ],
1419    );
1420    map.insert(
1421        vec![
1422            "langchain_core".into(),
1423            "runnables".into(),
1424            "fallbacks".into(),
1425            "RunnableWithFallbacks".into(),
1426        ],
1427        vec![
1428            "langchain_core".into(),
1429            "runnables".into(),
1430            "fallbacks".into(),
1431            "RunnableWithFallbacks".into(),
1432        ],
1433    );
1434    map.insert(
1435        vec![
1436            "langchain_core".into(),
1437            "runnables".into(),
1438            "base".into(),
1439            "RunnableParallel".into(),
1440        ],
1441        vec![
1442            "langchain_core".into(),
1443            "runnables".into(),
1444            "base".into(),
1445            "RunnableParallel".into(),
1446        ],
1447    );
1448    map.insert(
1449        vec![
1450            "langchain_core".into(),
1451            "runnables".into(),
1452            "base".into(),
1453            "RunnableSequence".into(),
1454        ],
1455        vec![
1456            "langchain_core".into(),
1457            "runnables".into(),
1458            "base".into(),
1459            "RunnableSequence".into(),
1460        ],
1461    );
1462    map.insert(
1463        vec![
1464            "langchain_core".into(),
1465            "runnables".into(),
1466            "base".into(),
1467            "RunnableBindingBase".into(),
1468        ],
1469        vec![
1470            "langchain_core".into(),
1471            "runnables".into(),
1472            "base".into(),
1473            "RunnableBindingBase".into(),
1474        ],
1475    );
1476    map.insert(
1477        vec![
1478            "langchain_core".into(),
1479            "runnables".into(),
1480            "base".into(),
1481            "RunnableEach".into(),
1482        ],
1483        vec![
1484            "langchain_core".into(),
1485            "runnables".into(),
1486            "base".into(),
1487            "RunnableEach".into(),
1488        ],
1489    );
1490    map.insert(
1491        vec![
1492            "langchain_core".into(),
1493            "runnables".into(),
1494            "base".into(),
1495            "RunnableEachBase".into(),
1496        ],
1497        vec![
1498            "langchain_core".into(),
1499            "runnables".into(),
1500            "base".into(),
1501            "RunnableEachBase".into(),
1502        ],
1503    );
1504    map.insert(
1505        vec![
1506            "langchain_core".into(),
1507            "runnables".into(),
1508            "passthrough".into(),
1509            "RunnablePassthrough".into(),
1510        ],
1511        vec![
1512            "langchain_core".into(),
1513            "runnables".into(),
1514            "passthrough".into(),
1515            "RunnablePassthrough".into(),
1516        ],
1517    );
1518    map.insert(
1519        vec![
1520            "langchain_core".into(),
1521            "runnables".into(),
1522            "passthrough".into(),
1523            "RunnableAssign".into(),
1524        ],
1525        vec![
1526            "langchain_core".into(),
1527            "runnables".into(),
1528            "passthrough".into(),
1529            "RunnableAssign".into(),
1530        ],
1531    );
1532    map.insert(
1533        vec![
1534            "langchain_core".into(),
1535            "runnables".into(),
1536            "router".into(),
1537            "RouterRunnable".into(),
1538        ],
1539        vec![
1540            "langchain_core".into(),
1541            "runnables".into(),
1542            "router".into(),
1543            "RouterRunnable".into(),
1544        ],
1545    );
1546    map.insert(
1547        vec![
1548            "langchain_core".into(),
1549            "runnables".into(),
1550            "retry".into(),
1551            "RunnableRetry".into(),
1552        ],
1553        vec![
1554            "langchain_core".into(),
1555            "runnables".into(),
1556            "retry".into(),
1557            "RunnableRetry".into(),
1558        ],
1559    );
1560    map.insert(
1561        vec![
1562            "langchain_core".into(),
1563            "runnables".into(),
1564            "configurable".into(),
1565            "RunnableConfigurableAlternatives".into(),
1566        ],
1567        vec![
1568            "langchain_core".into(),
1569            "runnables".into(),
1570            "configurable".into(),
1571            "RunnableConfigurableAlternatives".into(),
1572        ],
1573    );
1574    map.insert(
1575        vec![
1576            "langchain_core".into(),
1577            "runnables".into(),
1578            "configurable".into(),
1579            "RunnableConfigurableFields".into(),
1580        ],
1581        vec![
1582            "langchain_core".into(),
1583            "runnables".into(),
1584            "configurable".into(),
1585            "RunnableConfigurableFields".into(),
1586        ],
1587    );
1588    map.insert(
1589        vec![
1590            "langchain_core".into(),
1591            "runnables".into(),
1592            "history".into(),
1593            "RunnableWithMessageHistory".into(),
1594        ],
1595        vec![
1596            "langchain_core".into(),
1597            "runnables".into(),
1598            "history".into(),
1599            "RunnableWithMessageHistory".into(),
1600        ],
1601    );
1602
1603    // Output parser types
1604    map.insert(
1605        vec![
1606            "langchain_core".into(),
1607            "output_parsers".into(),
1608            "string".into(),
1609            "StrOutputParser".into(),
1610        ],
1611        vec![
1612            "langchain_core".into(),
1613            "output_parsers".into(),
1614            "string".into(),
1615            "StrOutputParser".into(),
1616        ],
1617    );
1618    map.insert(
1619        vec![
1620            "langchain_core".into(),
1621            "output_parsers".into(),
1622            "list".into(),
1623            "CommaSeparatedListOutputParser".into(),
1624        ],
1625        vec![
1626            "langchain_core".into(),
1627            "output_parsers".into(),
1628            "list".into(),
1629            "CommaSeparatedListOutputParser".into(),
1630        ],
1631    );
1632
1633    // Message chunk types
1634    map.insert(
1635        vec![
1636            "langchain_core".into(),
1637            "messages".into(),
1638            "chat".into(),
1639            "ChatMessageChunk".into(),
1640        ],
1641        vec![
1642            "langchain_core".into(),
1643            "messages".into(),
1644            "chat".into(),
1645            "ChatMessageChunk".into(),
1646        ],
1647    );
1648    map.insert(
1649        vec![
1650            "langchain_core".into(),
1651            "messages".into(),
1652            "human".into(),
1653            "HumanMessageChunk".into(),
1654        ],
1655        vec![
1656            "langchain_core".into(),
1657            "messages".into(),
1658            "human".into(),
1659            "HumanMessageChunk".into(),
1660        ],
1661    );
1662    map.insert(
1663        vec![
1664            "langchain_core".into(),
1665            "messages".into(),
1666            "function".into(),
1667            "FunctionMessageChunk".into(),
1668        ],
1669        vec![
1670            "langchain_core".into(),
1671            "messages".into(),
1672            "function".into(),
1673            "FunctionMessageChunk".into(),
1674        ],
1675    );
1676    map.insert(
1677        vec![
1678            "langchain_core".into(),
1679            "messages".into(),
1680            "system".into(),
1681            "SystemMessageChunk".into(),
1682        ],
1683        vec![
1684            "langchain_core".into(),
1685            "messages".into(),
1686            "system".into(),
1687            "SystemMessageChunk".into(),
1688        ],
1689    );
1690    map.insert(
1691        vec![
1692            "langchain_core".into(),
1693            "messages".into(),
1694            "tool".into(),
1695            "ToolMessageChunk".into(),
1696        ],
1697        vec![
1698            "langchain_core".into(),
1699            "messages".into(),
1700            "tool".into(),
1701            "ToolMessageChunk".into(),
1702        ],
1703    );
1704
1705    map
1706});
1707
1708/// Mapping for JavaScript serialization compatibility.
1709pub static JS_SERIALIZABLE_MAPPING: LazyLock<NamespaceMapping> = LazyLock::new(|| {
1710    let mut map = HashMap::new();
1711
1712    // Message types (JS often serializes without the submodule)
1713    map.insert(
1714        vec![
1715            "langchain_core".into(),
1716            "messages".into(),
1717            "AIMessage".into(),
1718        ],
1719        vec![
1720            "langchain_core".into(),
1721            "messages".into(),
1722            "ai".into(),
1723            "AIMessage".into(),
1724        ],
1725    );
1726    map.insert(
1727        vec![
1728            "langchain_core".into(),
1729            "messages".into(),
1730            "AIMessageChunk".into(),
1731        ],
1732        vec![
1733            "langchain_core".into(),
1734            "messages".into(),
1735            "ai".into(),
1736            "AIMessageChunk".into(),
1737        ],
1738    );
1739    map.insert(
1740        vec![
1741            "langchain_core".into(),
1742            "messages".into(),
1743            "BaseMessage".into(),
1744        ],
1745        vec![
1746            "langchain_core".into(),
1747            "messages".into(),
1748            "base".into(),
1749            "BaseMessage".into(),
1750        ],
1751    );
1752    map.insert(
1753        vec![
1754            "langchain_core".into(),
1755            "messages".into(),
1756            "BaseMessageChunk".into(),
1757        ],
1758        vec![
1759            "langchain_core".into(),
1760            "messages".into(),
1761            "base".into(),
1762            "BaseMessageChunk".into(),
1763        ],
1764    );
1765    map.insert(
1766        vec![
1767            "langchain_core".into(),
1768            "messages".into(),
1769            "ChatMessage".into(),
1770        ],
1771        vec![
1772            "langchain_core".into(),
1773            "messages".into(),
1774            "chat".into(),
1775            "ChatMessage".into(),
1776        ],
1777    );
1778    map.insert(
1779        vec![
1780            "langchain_core".into(),
1781            "messages".into(),
1782            "ChatMessageChunk".into(),
1783        ],
1784        vec![
1785            "langchain_core".into(),
1786            "messages".into(),
1787            "chat".into(),
1788            "ChatMessageChunk".into(),
1789        ],
1790    );
1791    map.insert(
1792        vec![
1793            "langchain_core".into(),
1794            "messages".into(),
1795            "FunctionMessage".into(),
1796        ],
1797        vec![
1798            "langchain_core".into(),
1799            "messages".into(),
1800            "function".into(),
1801            "FunctionMessage".into(),
1802        ],
1803    );
1804    map.insert(
1805        vec![
1806            "langchain_core".into(),
1807            "messages".into(),
1808            "FunctionMessageChunk".into(),
1809        ],
1810        vec![
1811            "langchain_core".into(),
1812            "messages".into(),
1813            "function".into(),
1814            "FunctionMessageChunk".into(),
1815        ],
1816    );
1817    map.insert(
1818        vec![
1819            "langchain_core".into(),
1820            "messages".into(),
1821            "HumanMessage".into(),
1822        ],
1823        vec![
1824            "langchain_core".into(),
1825            "messages".into(),
1826            "human".into(),
1827            "HumanMessage".into(),
1828        ],
1829    );
1830    map.insert(
1831        vec![
1832            "langchain_core".into(),
1833            "messages".into(),
1834            "HumanMessageChunk".into(),
1835        ],
1836        vec![
1837            "langchain_core".into(),
1838            "messages".into(),
1839            "human".into(),
1840            "HumanMessageChunk".into(),
1841        ],
1842    );
1843    map.insert(
1844        vec![
1845            "langchain_core".into(),
1846            "messages".into(),
1847            "SystemMessage".into(),
1848        ],
1849        vec![
1850            "langchain_core".into(),
1851            "messages".into(),
1852            "system".into(),
1853            "SystemMessage".into(),
1854        ],
1855    );
1856    map.insert(
1857        vec![
1858            "langchain_core".into(),
1859            "messages".into(),
1860            "SystemMessageChunk".into(),
1861        ],
1862        vec![
1863            "langchain_core".into(),
1864            "messages".into(),
1865            "system".into(),
1866            "SystemMessageChunk".into(),
1867        ],
1868    );
1869    map.insert(
1870        vec![
1871            "langchain_core".into(),
1872            "messages".into(),
1873            "ToolMessage".into(),
1874        ],
1875        vec![
1876            "langchain_core".into(),
1877            "messages".into(),
1878            "tool".into(),
1879            "ToolMessage".into(),
1880        ],
1881    );
1882    map.insert(
1883        vec![
1884            "langchain_core".into(),
1885            "messages".into(),
1886            "ToolMessageChunk".into(),
1887        ],
1888        vec![
1889            "langchain_core".into(),
1890            "messages".into(),
1891            "tool".into(),
1892            "ToolMessageChunk".into(),
1893        ],
1894    );
1895    map.insert(
1896        vec![
1897            "langchain_core".into(),
1898            "prompts".into(),
1899            "image".into(),
1900            "ImagePromptTemplate".into(),
1901        ],
1902        vec![
1903            "langchain_core".into(),
1904            "prompts".into(),
1905            "image".into(),
1906            "ImagePromptTemplate".into(),
1907        ],
1908    );
1909
1910    map
1911});
1912
1913/// Get all serializable mappings combined.
1914pub fn get_all_serializable_mappings() -> NamespaceMapping {
1915    let mut combined = HashMap::new();
1916    combined.extend(SERIALIZABLE_MAPPING.clone());
1917    combined.extend(OLD_CORE_NAMESPACES_MAPPING.clone());
1918    combined.extend(OG_SERIALIZABLE_MAPPING.clone());
1919    combined.extend(JS_SERIALIZABLE_MAPPING.clone());
1920    combined
1921}
1922
1923/// Default namespaces that are allowed for deserialization.
1924pub const DEFAULT_NAMESPACES: &[&str] = &[
1925    "langchain",
1926    "langchain_core",
1927    "langchain_community",
1928    "langchain_anthropic",
1929    "langchain_groq",
1930    "langchain_google_genai",
1931    "langchain_aws",
1932    "langchain_openai",
1933    "langchain_google_vertexai",
1934    "langchain_mistralai",
1935    "langchain_fireworks",
1936    "langchain_xai",
1937    "langchain_sambanova",
1938    "langchain_perplexity",
1939];
1940
1941/// Namespaces for which only deserializing via the SERIALIZABLE_MAPPING is allowed.
1942/// Load by path is not allowed.
1943pub const DISALLOW_LOAD_FROM_PATH: &[&str] = &["langchain_community", "langchain"];
1944
1945#[cfg(test)]
1946mod tests {
1947    use super::*;
1948
1949    #[test]
1950    fn test_serializable_mapping_exists() {
1951        assert!(!SERIALIZABLE_MAPPING.is_empty());
1952    }
1953
1954    #[test]
1955    fn test_ai_message_mapping() {
1956        let key = vec![
1957            "langchain".to_string(),
1958            "schema".to_string(),
1959            "messages".to_string(),
1960            "AIMessage".to_string(),
1961        ];
1962        let expected = vec![
1963            "langchain_core".to_string(),
1964            "messages".to_string(),
1965            "ai".to_string(),
1966            "AIMessage".to_string(),
1967        ];
1968        assert_eq!(SERIALIZABLE_MAPPING.get(&key), Some(&expected));
1969    }
1970
1971    #[test]
1972    fn test_default_namespaces() {
1973        assert!(DEFAULT_NAMESPACES.contains(&"langchain_core"));
1974        assert!(DEFAULT_NAMESPACES.contains(&"langchain_openai"));
1975    }
1976
1977    #[test]
1978    fn test_disallow_load_from_path() {
1979        assert!(DISALLOW_LOAD_FROM_PATH.contains(&"langchain_community"));
1980        assert!(DISALLOW_LOAD_FROM_PATH.contains(&"langchain"));
1981    }
1982
1983    #[test]
1984    fn test_combined_mappings() {
1985        let combined = get_all_serializable_mappings();
1986        assert!(!combined.is_empty());
1987        assert!(combined.len() >= SERIALIZABLE_MAPPING.len());
1988    }
1989}