diff --git a/docs/examples/embeddings/nomic.ipynb b/docs/examples/embeddings/nomic.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..a89101b6d2e13109742bc343861e9c080505fdc7
--- /dev/null
+++ b/docs/examples/embeddings/nomic.ipynb
@@ -0,0 +1,229 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "79a901c1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "\n",
+    "os.environ[\"OPENAI_API_KEY\"] = \"<OPENAI_API_KEY>\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d641bc4b-1d0f-4597-a2f3-68c95bd3c233",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from llama_index.embeddings import NomicEmbedding"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1436a10d-d462-473f-822f-331fe6141742",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import logging\n",
+    "import sys\n",
+    "\n",
+    "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n",
+    "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n",
+    "\n",
+    "from llama_index import (\n",
+    "    VectorStoreIndex,\n",
+    "    SimpleDirectoryReader,\n",
+    "    ServiceContext,\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f05e3c9f-ba59-4046-a8a4-75bff12babf2",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!mkdir -p 'data/paul_graham/'\n",
+    "!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "04b236ab-79fa-40c1-8956-145d1523fae1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "documents = SimpleDirectoryReader(\"./data/paul_graham/\").load_data()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fd6e90b8-7246-4959-ac7f-5f2f6afd46c1",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "3944c255ffc64b9d843c139f4092606a",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "Parsing nodes:   0%|          | 0/1 [00:00<?, ?it/s]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "9d6348a8853e400a9ebd284edac4dde9",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "Generating embeddings:   0%|          | 0/22 [00:00<?, ?it/s]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "nomic_api_key = \"<NOMIC_API_KEY>\"\n",
+    "embed_model = NomicEmbedding(\n",
+    "    api_key=nomic_api_key,\n",
+    "    model_name=\"nomic-embed-text-v1\",\n",
+    "    query_task_type=\"search_query\",\n",
+    "    document_task_type=\"search_document\",\n",
+    ")\n",
+    "service_context = ServiceContext.from_defaults(\n",
+    "    embed_model=embed_model,\n",
+    "    chunk_size=1024,\n",
+    ")\n",
+    "index = VectorStoreIndex.from_documents(\n",
+    "    documents=documents, service_context=service_context, show_progress=True\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "55a59021",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "search_query_retriever = index.as_retriever(\n",
+    "    service_context=service_context, similarity_top_k=2\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "97ece31b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from llama_index.response.notebook_utils import display_source_node\n",
+    "\n",
+    "retriever_nomic = search_query_retriever"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3318ac06",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "retrieved_nodes_nomic = retriever_nomic.retrieve(\n",
+    "    \"What software did Paul write?\"\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f7bf2583",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/markdown": [
+       "**Node ID:** 9058e2a4-6a56-4896-898d-eebd7166ca1b<br>**Similarity:** 0.6107600427118974<br>**Text:** Meanwhile I'd been hearing more and more about this new thing called the World Wide Web. Robert Morris showed it to me when I visited him in Cambridge, where he was now in grad school at Harvard. It seemed to me that the web would be a big deal. I'd seen what graphical user interfaces had done for the popularity of microcomputers. It seemed like the web would do the same for the internet.\n",
+       "\n",
+       "If I wanted to get rich, here was the next train leaving the station. I was right about that part. What I got wrong was the idea. I decided we should start a company to put art galleries online. I can't honestly say, after reading so many Y Combinator applications, that this was the worst startup idea ever, but it was up there. Art galleries didn't want to be online, and still don't, not the fancy ones. That's not how they sell. I wrote some software to generate web sites for galleries, and Robert wrote some to resize images and set up an http server to serve the pages. Then we tried to sign up galleries. To call this a difficult sale would be an understatement. It was difficult to give away. A few galleries let us make sites for them for free, but none paid us.\n",
+       "\n",
+       "Then some online stores started to appear, and I realized that except for the order buttons they were identical to the sites we'd been generating for galleries. This impressive-sounding thing called an \"internet storefront\" was something we already knew how to build.\n",
+       "\n",
+       "So in the summer of 1995, after I submitted the camera-ready copy of ANSI Common Lisp to the publishers, we started trying to write software to build online stores. At first this was going to be normal desktop software, which in those days meant Windows software. That was an alarming prospect, because neither of us knew how to write Windows software or wanted to learn. We lived in the Unix world. But we decided we'd at least try writing a prototype store builder on Unix. Robert wrote a shopping cart, and I wrote a new site generator for stores — in Lisp, ...<br>"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Markdown object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/markdown": [
+       "**Node ID:** cc1c29ab-07da-4848-b6a2-1923cfdc7b75<br>**Similarity:** 0.6032412533629631<br>**Text:** What I Worked On\n",
+       "\n",
+       "February 2021\n",
+       "\n",
+       "Before college the two main things I worked on, outside of school, were writing and programming. I didn't write essays. I wrote what beginning writers were supposed to write then, and probably still are: short stories. My stories were awful. They had hardly any plot, just characters with strong feelings, which I imagined made them deep.\n",
+       "\n",
+       "The first programs I tried writing were on the IBM 1401 that our school district used for what was then called \"data processing.\" This was in 9th grade, so I was 13 or 14. The school district's 1401 happened to be in the basement of our junior high school, and my friend Rich Draves and I got permission to use it. It was like a mini Bond villain's lair down there, with all these alien-looking machines — CPU, disk drives, printer, card reader — sitting up on a raised floor under bright fluorescent lights.\n",
+       "\n",
+       "The language we used was an early version of Fortran. You had to type programs on punch cards, then stack them in the card reader and press a button to load the program into memory and run it. The result would ordinarily be to print something on the spectacularly loud printer.\n",
+       "\n",
+       "I was puzzled by the 1401. I couldn't figure out what to do with it. And in retrospect there's not much I could have done with it. The only form of input to programs was data stored on punched cards, and I didn't have any data stored on punched cards. The only other option was to do things that didn't rely on any input, like calculate approximations of pi, but I didn't know enough math to do anything interesting of that type. So I'm not surprised I can't remember any programs I wrote, because they can't have done much. My clearest memory is of the moment I learned it was possible for programs not to terminate, when one of mine didn't. On a machine without time-sharing, this was a social as well as a technical error, as the data center manager's expression made clear.\n",
+       "\n",
+       "With microcomputers, everything changed. Now you could h...<br>"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Markdown object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "for n in retrieved_nodes_nomic:\n",
+    "    display_source_node(n, source_length=2000)"
+   ]
+  }
+ ],
+ "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"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/module_guides/models/embeddings.md b/docs/module_guides/models/embeddings.md
index 85a522df7137583c30c672ee1678c866e62f39f4..1935291ef6d95e76a384f3f976eab19442b8fc06 100644
--- a/docs/module_guides/models/embeddings.md
+++ b/docs/module_guides/models/embeddings.md
@@ -213,6 +213,7 @@ maxdepth: 1
 /examples/embeddings/Langchain.ipynb
 /examples/embeddings/llm_rails.ipynb
 /examples/embeddings/mistralai.ipynb
+/examples/embeddings/nomic.ipynb
 /examples/embeddings/OpenAI.ipynb
 /examples/embeddings/sagemaker_embedding_endpoint.ipynb
 /examples/embeddings/text_embedding_inference.ipynb
diff --git a/llama_index/embeddings/__init__.py b/llama_index/embeddings/__init__.py
index 2853b7aecd3a081be1a18d5aa9cc57a91d199431..c46d6a2ec632cd7630a150cbe298aff787eb09a6 100644
--- a/llama_index/embeddings/__init__.py
+++ b/llama_index/embeddings/__init__.py
@@ -38,6 +38,7 @@ from llama_index.embeddings.instructor import InstructorEmbedding
 from llama_index.embeddings.langchain import LangchainEmbedding
 from llama_index.embeddings.llm_rails import LLMRailsEmbedding, LLMRailsEmbeddings
 from llama_index.embeddings.mistralai import MistralAIEmbedding
+from llama_index.embeddings.nomic import NomicEmbedding
 from llama_index.embeddings.ollama_embedding import OllamaEmbedding
 from llama_index.embeddings.openai import OpenAIEmbedding
 from llama_index.embeddings.pooling import Pooling
@@ -79,6 +80,7 @@ __all__ = [
     "TextEmbeddingsInference",
     "TogetherEmbedding",
     "resolve_embed_model",
+    "NomicEmbedding",
     # Deprecated, kept for backwards compatibility
     "LLMRailsEmbeddings",
     "ElasticsearchEmbeddings",
diff --git a/llama_index/embeddings/nomic.py b/llama_index/embeddings/nomic.py
new file mode 100644
index 0000000000000000000000000000000000000000..f76876b05339dbb6e687b797bb209d14b041b61b
--- /dev/null
+++ b/llama_index/embeddings/nomic.py
@@ -0,0 +1,101 @@
+from enum import Enum
+from typing import Any, List, Optional
+
+from llama_index.bridge.pydantic import Field, PrivateAttr
+from llama_index.callbacks import CallbackManager
+from llama_index.core.embeddings.base import BaseEmbedding
+
+
+class NomicAITaskType(str, Enum):
+    SEARCH_QUERY = "search_query"
+    SEARCH_DOCUMENT = "search_document"
+    CLUSTERING = "clustering"
+    CLASSIFICATION = "classification"
+
+
+TASK_TYPES = [
+    NomicAITaskType.SEARCH_QUERY,
+    NomicAITaskType.SEARCH_DOCUMENT,
+    NomicAITaskType.CLUSTERING,
+    NomicAITaskType.CLASSIFICATION,
+]
+
+
+class NomicEmbedding(BaseEmbedding):
+    """NomicEmbedding uses the Nomic API to generate embeddings."""
+
+    # Instance variables initialized via Pydantic's mechanism
+    query_task_type: Optional[str] = Field(description="Query Embedding prefix")
+    document_task_type: Optional[str] = Field(description="Document Embedding prefix")
+    model_name: str = Field(description="Embedding model name")
+    _model: Any = PrivateAttr()
+
+    def __init__(
+        self,
+        model_name: str = "nomic-text-embed-v1",
+        embed_batch_size: int = 32,
+        api_key: Optional[str] = None,
+        callback_manager: Optional[CallbackManager] = None,
+        query_task_type: Optional[str] = "search_query",
+        document_task_type: Optional[str] = "search_document",
+        **kwargs: Any,
+    ) -> None:
+        if query_task_type not in TASK_TYPES or document_task_type not in TASK_TYPES:
+            raise ValueError(
+                f"Invalid task type {query_task_type}, {document_task_type}. Must be one of {TASK_TYPES}"
+            )
+
+        try:
+            import nomic
+            from nomic import embed
+        except ImportError:
+            raise ImportError(
+                "NomicEmbedding requires the 'nomic' package to be installed.\n"
+                "Please install it with `pip install nomic`."
+            )
+
+        if api_key is not None:
+            nomic.cli.login(api_key)
+        super().__init__(
+            embed_batch_size=embed_batch_size,
+            callback_manager=callback_manager,
+            _model=embed,
+            query_task_type=query_task_type,
+            document_task_type=document_task_type,
+            **kwargs,
+        )
+        self._model = embed
+        self.model_name = model_name
+        self.query_task_type = query_task_type
+        self.document_task_type = document_task_type
+
+    @classmethod
+    def class_name(cls) -> str:
+        return "NomicEmbedding"
+
+    def _embed(
+        self, texts: List[str], task_type: Optional[str] = None
+    ) -> List[List[float]]:
+        """Embed sentences using NomicAI."""
+        result = self._model.text(texts, model=self.model_name, task_type=task_type)
+        return result["embeddings"]
+
+    def _get_query_embedding(self, query: str) -> List[float]:
+        """Get query embedding."""
+        return self._embed([query], task_type=self.query_task_type)[0]
+
+    async def _aget_query_embedding(self, query: str) -> List[float]:
+        """Get query embedding async."""
+        return self._get_query_embedding(query)
+
+    def _get_text_embedding(self, text: str) -> List[float]:
+        """Get text embedding."""
+        return self._embed([text], task_type=self.document_task_type)[0]
+
+    async def _aget_text_embedding(self, text: str) -> List[float]:
+        """Get text embedding async."""
+        return self._get_text_embedding(text)
+
+    def _get_text_embeddings(self, texts: List[str]) -> List[List[float]]:
+        """Get text embeddings."""
+        return self._embed(texts, task_type=self.document_task_type)