diff --git a/docs/src/theme/ChatModelTabs.js b/docs/src/theme/ChatModelTabs.js
index f9efa57e97c..c6aee814856 100644
--- a/docs/src/theme/ChatModelTabs.js
+++ b/docs/src/theme/ChatModelTabs.js
@@ -1,9 +1,78 @@
/* eslint-disable react/jsx-props-no-spreading, react/destructuring-assignment */
-import React from "react";
-import Tabs from "@theme/Tabs";
-import TabItem from "@theme/TabItem";
+import React, { useState } from "react";
import CodeBlock from "@theme-original/CodeBlock";
+// Create a custom dropdown since Docusaurus's dropdown component isn't easily accessible
+const CustomDropdown = ({ selectedOption, options, onSelect }) => {
+ const [isOpen, setIsOpen] = React.useState(false);
+
+ // Close dropdown when clicking outside
+ React.useEffect(() => {
+ const handleClickOutside = (event) => {
+ if (isOpen && !event.target.closest('.dropdown')) {
+ setIsOpen(false);
+ }
+ };
+
+ document.addEventListener('click', handleClickOutside);
+ return () => document.removeEventListener('click', handleClickOutside);
+ }, [isOpen]);
+
+ return (
+
+
+ Select chat model:
+
+
+
+
+
+
+ );
+};
+
+
/**
* @typedef {Object} ChatModelTabsProps - Component props.
* @property {string} [openaiParams] - Parameters for OpenAI chat model. Defaults to `model="gpt-3.5-turbo-0125"`
@@ -36,6 +105,7 @@ import CodeBlock from "@theme-original/CodeBlock";
* @param {ChatModelTabsProps} props - Component props.
*/
export default function ChatModelTabs(props) {
+ const [selectedModel, setSelectedModel] = useState("OpenAI");
const {
openaiParams,
anthropicParams,
@@ -153,7 +223,7 @@ export default function ChatModelTabs(props) {
},
{
value: "FireworksAI",
- label: "FireworksAI",
+ label: "Fireworks AI",
text: `from langchain_fireworks import ChatFireworks\n\n${llmVarName} = ChatFireworks(${fireworksParamsOrDefault})`,
apiKeyName: "FIREWORKS_API_KEY",
packageName: "langchain-fireworks",
@@ -171,7 +241,7 @@ export default function ChatModelTabs(props) {
},
{
value: "MistralAI",
- label: "MistralAI",
+ label: "Mistral AI",
text: `from langchain_mistralai import ChatMistralAI\n\n${llmVarName} = ChatMistralAI(${mistralParamsOrDefault})`,
apiKeyName: "MISTRAL_API_KEY",
packageName: "langchain-mistralai",
@@ -180,7 +250,7 @@ export default function ChatModelTabs(props) {
},
{
value: "TogetherAI",
- label: "TogetherAI",
+ label: "Together AI",
text: `from langchain_openai import ChatOpenAI\n\n${llmVarName} = ChatOpenAI(${togetherParamsOrDefault})`,
apiKeyName: "TOGETHER_API_KEY",
packageName: "langchain-openai",
@@ -198,38 +268,46 @@ export default function ChatModelTabs(props) {
},
];
- return (
-
- {tabItems
- .filter((tabItem) => !tabItem.shouldHide)
- .map((tabItem) => {
- let apiKeyText = "";
- if (tabItem.apiKeyName) {
- apiKeyText = `import getpass
+ const modelOptions = tabItems
+ .filter((item) => !item.shouldHide)
+ .map((item) => ({
+ value: item.value,
+ label: item.label,
+ text: item.text,
+ apiKeyName: item.apiKeyName,
+ apiKeyText: item.apiKeyText,
+ packageName: item.packageName,
+ }));
+
+const selectedOption = modelOptions.find(
+ (option) => option.value === selectedModel
+);
+
+let apiKeyText = "";
+if (selectedOption.apiKeyName) {
+ apiKeyText = `import getpass
import os
-os.environ["${tabItem.apiKeyName}"] = getpass.getpass()`;
- } else if (tabItem.apiKeyText) {
- apiKeyText = tabItem.apiKeyText;
- }
+if not os.environ.get("${selectedOption.apiKeyName}"):
+ os.environ["${selectedOption.apiKeyName}"] = getpass.getpass("Enter API key for ${selectedOption.label}: ")`;
+ } else if (selectedOption.apiKeyText) {
+ apiKeyText = selectedOption.apiKeyText;
+ }
- return (
-
-
- {`pip install -qU ${tabItem.packageName}`}
-
-
- {apiKeyText ? apiKeyText + "\n\n" + tabItem.text : tabItem.text}
-
-
- );
- })
- }
-
- );
-}
+return (
+
+
+
+
+ {`pip install -qU ${selectedOption.packageName}`}
+
+
+ {apiKeyText ? apiKeyText + "\n\n" + selectedOption.text : selectedOption.text}
+
+
+);
+}
\ No newline at end of file