{ "cells": [ { "cell_type": "raw", "id": "53fbf15f", "metadata": {}, "source": [ "---\n", "sidebar_label: MistralAI\n", "---" ] }, { "cell_type": "markdown", "id": "bf733a38-db84-4363-89e2-de6735c37230", "metadata": {}, "source": [ "# MistralAI\n", "\n", "This notebook covers how to get started with MistralAI chat models, via their [API](https://docs.mistral.ai/api/).\n", "\n", "A valid [API key](https://console.mistral.ai/users/api-keys/) is needed to communicate with the API.\n", "\n", "Head to the [API reference](https://api.python.langchain.com/en/latest/chat_models/langchain_mistralai.chat_models.ChatMistralAI.html) for detailed documentation of all attributes and methods." ] }, { "cell_type": "markdown", "id": "cc686b8f", "metadata": {}, "source": [ "## Setup\n", "\n", "You will need the `langchain-core` and `langchain-mistralai` package to use the API. You can install these with:\n", "\n", "```bash\n", "pip install -U langchain-core langchain-mistralai\n", "\n", "We'll also need to get a [Mistral API key](https://console.mistral.ai/users/api-keys/)" ] }, { "cell_type": "code", "execution_count": 7, "id": "c3fd4184", "metadata": {}, "outputs": [], "source": [ "import getpass\n", "\n", "api_key = getpass.getpass()" ] }, { "cell_type": "markdown", "id": "502127fd", "metadata": {}, "source": [ "## Usage" ] }, { "cell_type": "code", "execution_count": 3, "id": "d4a7c55d-b235-4ca4-a579-c90cc9570da9", "metadata": { "tags": [] }, "outputs": [], "source": [ "from langchain_core.messages import HumanMessage\n", "from langchain_mistralai.chat_models import ChatMistralAI" ] }, { "cell_type": "code", "execution_count": 8, "id": "70cf04e8-423a-4ff6-8b09-f11fb711c817", "metadata": { "tags": [] }, "outputs": [], "source": [ "# If api_key is not passed, default behavior is to use the `MISTRAL_API_KEY` environment variable.\n", "chat = ChatMistralAI(api_key=api_key)" ] }, { "cell_type": "code", "execution_count": 9, "id": "8199ef8f-eb8b-4253-9ea0-6c24a013ca4c", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "AIMessage(content=\"Who's there? I was just about to ask the same thing! How can I assist you today?\")" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "messages = [HumanMessage(content=\"knock knock\")]\n", "chat.invoke(messages)" ] }, { "cell_type": "markdown", "id": "c361ab1e-8c0c-4206-9e3c-9d1424a12b9c", "metadata": {}, "source": [ "### Async" ] }, { "cell_type": "code", "execution_count": 10, "id": "c5fac0e9-05a4-4fc1-a3b3-e5bbb24b971b", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "AIMessage(content='Who\\'s there?\\n\\n(You can then continue the \"knock knock\" joke by saying the name of the person or character who should be responding. For example, if I say \"Banana,\" you could respond with \"Banana who?\" and I would say \"Banana bunch! Get it? Because a group of bananas is called a \\'bunch\\'!\" and then we would both laugh and have a great time. But really, you can put anything you want in the spot where I put \"Banana\" and it will still technically be a \"knock knock\" joke. The possibilities are endless!)')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "await chat.ainvoke(messages)" ] }, { "cell_type": "markdown", "id": "86ccef97", "metadata": {}, "source": [ "### Streaming\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "025be980-e50d-4a68-93dc-c9c7b500ce34", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Who's there?\n", "\n", "(After this, the conversation can continue as a call and response \"who's there\" joke. Here is an example of how it could go:\n", "\n", "You say: Orange.\n", "I say: Orange who?\n", "You say: Orange you glad I didn't say banana!?)\n", "\n", "But since you asked for a knock knock joke specifically, here's one for you:\n", "\n", "Knock knock.\n", "\n", "Me: Who's there?\n", "\n", "You: Lettuce.\n", "\n", "Me: Lettuce who?\n", "\n", "You: Lettuce in, it's too cold out here!\n", "\n", "I hope this brings a smile to your face! Do you have a favorite knock knock joke you'd like to share? I'd love to hear it." ] } ], "source": [ "for chunk in chat.stream(messages):\n", " print(chunk.content, end=\"\")" ] }, { "cell_type": "markdown", "id": "f6189577", "metadata": {}, "source": [ "### Batch" ] }, { "cell_type": "code", "execution_count": 12, "id": "e63aebcb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[AIMessage(content=\"Who's there? I was just about to ask the same thing! Go ahead and tell me who's there. I love a good knock-knock joke.\")]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chat.batch([messages])" ] }, { "cell_type": "markdown", "id": "38e39e71", "metadata": {}, "source": [ "## Chaining\n", "\n", "You can also easily combine with a prompt template for easy structuring of user input. We can do this using [LCEL](/docs/expression_language)" ] }, { "cell_type": "code", "execution_count": 13, "id": "ee43a1ae", "metadata": {}, "outputs": [], "source": [ "from langchain_core.prompts import ChatPromptTemplate\n", "\n", "prompt = ChatPromptTemplate.from_template(\"Tell me a joke about {topic}\")\n", "chain = prompt | chat" ] }, { "cell_type": "code", "execution_count": 14, "id": "0dc49212", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "AIMessage(content='Why do bears hate shoes so much? They like to run around in their bear feet.')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chain.invoke({\"topic\": \"bears\"})" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }