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: + +
+ +
+ {options.map((option) => ( +
  • + { + e.preventDefault(); + onSelect(option.value); + setIsOpen(false); + }} + > + {option.label} + +
  • + ))} +
    +
    +
    + ); +}; + + /** * @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