> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pinecone.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Model Gallery

> Pinecone integrations enable you to build and deploy AI applications faster and more efficiently. Integrate Pinecone with your favorite frameworks, data sources, and infrastructure providers.

export const ModelCard = ({logoSrc, company, modelName, description, task, modality, maxInputTokens, price, buttonLabel, buttonHref, buttonTarget, inferenceAPI, isPreviewCard, logoInvert}) => {
  const handleButtonClick = () => {
    if (inferenceAPI) {
      if (buttonTarget === "_blank") {
        window.open(buttonHref, buttonTarget);
      } else {
        window.location.href = buttonHref;
      }
    } else {}
  };
  return <div className="model-card" style={{
    width: "100%",
    height: 400,
    minWidth: 280,
    maxWidth: 640,
    minHeight: 430,
    padding: "20px",
    background: "var(--paper)",
    borderRadius: 4,
    overflow: "hidden",
    border: "1px solid var(--border)",
    flexDirection: "column",
    justifyContent: "flex-start",
    alignItems: "flex-start",
    display: "inline-flex",
    transition: "box-shadow 0.3s ease-in-out"
  }}>
  <div style={{
    display: "flex",
    alignItems: "center",
    marginBottom: 16,
    paddingBlock: 7.6
  }}>
    <img noZoom src={logoSrc} alt={`${company} Logo`} style={{
    width: 45,
    height: 45,
    marginRight: 10,
    marginTop: 0,
    marginBottom: 0
  }} className={logoInvert ? "dark-inverted" : ""} />
    <div>
      <h2 style={{
    margin: 0,
    fontSize: 16,
    fontWeight: "bold"
  }}>
        {modelName}
      </h2>
      <p style={{
    margin: 0,
    fontSize: 12,
    color: "var(--text-secondary)"
  }}>
        {company.toUpperCase()}
      </p>
    </div>
  </div>

  <p style={{
    fontSize: 14,
    margin: 0,
    marginBottom: 20,
    height: 36
  }}>
    {description}
  </p>
  <div style={{
    marginBottom: 0,
    width: "100%",
    maxHeight: 220,
    flexGrow: 1
  }}>

    <div className="border-b py-2 text-sm grid grid-cols-2 gap-2">
      <p>
        <strong style={{
    color: task === "NA" ? "var(--secondary)" : "var(--text-primary)"
  }}>
          Task
        </strong>
      </p>

        <p style={{
    color: task === "NA" ? "var(--secondary)" : "var(--text-primary)"
  }}>
          {task}
        </p>
    </div>


    <div className="border-b py-2 text-sm grid grid-cols-2 gap-2">
      <p>
        <strong style={{
    color: modality === "NA" ? "var(--secondary)" : "var(--text-primary)"
  }}>
            Modality
          </strong>
      </p>

      <p style={{
    color: modality === "NA" ? "var(--secondary)" : "var(--text-primary)"
  }}>
          {modality}
        </p>
    </div>


    <div className="border-b py-2 text-sm grid grid-cols-2 gap-2">
      <p>
        <strong style={{
    color: maxInputTokens === "NA" ? "var(--secondary)" : "var(--text-primary)"
  }}>
          Max Input Tokens
        </strong>
      </p>

      <p style={{
    color: maxInputTokens === "NA" ? "var(--secondary)" : "var(--text-primary)"
  }}>
        {maxInputTokens}
      </p>
    </div>


    <div className="py-2 text-sm grid grid-cols-2 gap-2">
      <p>
        <strong style={{
    color: price === "NA" ? "var(--secondary)" : "var(--text-primary)"
  }}>
          Price
        </strong>
      </p>

      <p style={{
    color: price === "NA" ? "var(--secondary)" : "var(--text-primary)"
  }}>
        {price}
      </p>
    </div>

  </div>
  
  <button id={`${modelName}-button`} style={{
    alignSelf: "stretch",
    height: 36,
    background: inferenceAPI ? "var(--brand-blue)" : "var(--secondary)",
    borderRadius: 4,
    overflow: "hidden",
    flexDirection: "column",
    justifyContent: "center",
    alignItems: "center",
    display: "flex",
    cursor: inferenceAPI ? "pointer" : "not-allowed",
    border: "none",
    transition: "background 0.2s ease"
  }} onMouseOver={e => inferenceAPI && (e.currentTarget.style.background = "var(--primary-dark)")} onMouseOut={e => inferenceAPI && (e.currentTarget.style.background = "var(--brand-blue)")} onClick={handleButtonClick}>
    <div style={{
    paddingLeft: 16,
    paddingRight: 16,
    paddingTop: 6,
    paddingBottom: 6,
    justifyContent: "center",
    alignItems: "center",
    gap: 8,
    display: "inline-flex"
  }}>
      <div style={{
    height: 20,
    flexDirection: "column",
    justifyContent: "center",
    alignItems: "center",
    display: "inline-flex"
  }}>
        {inferenceAPI && <svg width="16.63" height="16.63" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
            <path d="M10.5003 1.68292C5.90859 1.68292 2.18359 5.40792 2.18359 9.99959C2.18359 14.5913 5.90859 18.3163 10.5003 18.3163C15.0919 18.3163 18.8169 14.5913 18.8169 9.99959C18.8169 5.40792 15.0919 1.68292 10.5003 1.68292ZM10.5003 16.6496C6.83359 16.6496 3.85026 13.6663 3.85026 9.99959C3.85026 6.33292 6.83359 3.34959 10.5003 3.34959C14.1669 3.34959 17.1503 6.33292 17.1503 9.99959C17.1503 13.6663 14.1669 16.6496 10.5003 16.6496ZM11.1253 4.16626L7.37526 11.2496H9.99193V15.8329L13.6253 8.74959H11.1253V4.16626Z" fill="white" />
          </svg>}
      </div>
      <div id={`${modelName}-button-label`} style={{
    color: inferenceAPI ? "white" : "#2D3D4D42",
    fontSize: 14,
    fontWeight: "500",
    letterSpacing: 0.4,
    wordWrap: "break-word"
  }}>
        {inferenceAPI ? buttonLabel : "Coming soon"}
      </div>
    </div>
  </button>
  {isPreviewCard && <div>Preview</div>}
</div>;
};

<div className="not-prose">
  <span
    style={{
      fontSize: "34px",
      fontWeight: "600",
      margin: "0px",
      display: "inline-flex",
      alignItems: "center",
      gap: "10px",
  }}
  >
    <span>
      <svg width="34" height="33" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M10.5003 1.68292C5.90859 1.68292 2.18359 5.40792 2.18359 9.99959C2.18359 14.5913 5.90859 18.3163 10.5003 18.3163C15.0919 18.3163 18.8169 14.5913 18.8169 9.99959C18.8169 5.40792 15.0919 1.68292 10.5003 1.68292ZM10.5003 16.6496C6.83359 16.6496 3.85026 13.6663 3.85026 9.99959C3.85026 6.33292 6.83359 3.34959 10.5003 3.34959C14.1669 3.34959 17.1503 6.33292 17.1503 9.99959C17.1503 13.6663 14.1669 16.6496 10.5003 16.6496ZM11.1253 4.16626L7.37526 11.2496H9.99193V15.8329L13.6253 8.74959H11.1253V4.16626Z" style={{fill: "var(--text-primary)"}} fill="white" />
      </svg>
    </span>

    <span className="inline-flex items-baseline gap-2 !m-0">
      <span style={{margin: 0, color: "var(--text-primary)"}}>Inference</span>
    </span>
  </span>

  <div
    className="flex flex-col md:flex-row justify-between items-start md:items-center gap-5"
    style={{
        display: "flex",
        justifyContent: "space-between",
        marginBottom: "32px",
    }}
  >
    <p>
      Build end-to-end faster with models hosted by Pinecone.
    </p>

    <a href="https://www.pinecone.io/request-a-model/" target="_blank" className="outlined-button">
      Request a model
    </a>
  </div>
</div>

<div className="featured-card-container relative">
  <div
    className="featured-model-cards  overflow-x-auto"
    id="modelCarousel"
    style={{ 
        WebkitOverflowScrolling: 'touch',  // Enable smooth scrolling on iOS
        scrollSnapType: 'x mandatory'       // Enable snap points
    }}
    onScroll={(e) => {
        const carousel = e.target;
        const prevButton = document.getElementById('prevButton');
        const nextButton = document.getElementById('nextButton');
        
        if (!prevButton || !nextButton) return; // Guard against null elements
        
        // Check if we're at the start or end
        const isAtStart = carousel.scrollLeft === 0;
        const isAtEnd = Math.abs(carousel.scrollLeft + carousel.offsetWidth - carousel.scrollWidth) < 1;
        
        // Update button visibility
        prevButton.style.visibility = isAtStart ? 'hidden' : 'visible';
        nextButton.style.visibility = isAtEnd ? 'hidden' : 'visible';
    }}
  >
    <ModelCard logoSrc="https://cdn.sanity.io/images/vr8gru94/production/cc3f1c395c8bcb50e042549b0faa595f5eab7d62-249x165.svg" company="NVIDIA" modelName="llama-text-embed-v2" description="State of the art text embedding model" task="Embedding" modality="Text" maxInputTokens="2048" price="$0.16 / million tokens" buttonLabel="Try this model" buttonHref="/models/llama-text-embed-v2" inferenceAPI={true} />

    <ModelCard logoSrc="https://cdn.sanity.io/images/vr8gru94/production/5b170117926ae5a5e451aa24676b5a124c2fa122-23x23.svg?w=2000&fit=max&auto=format&dpr=2" company="Microsoft" modelName="multilingual-e5-large" description="Top performing text embedding model from Microsoft research." task="Embedding" modality="Text" maxInputTokens="507" price="$0.08 / million tokens" buttonLabel="Try this model" buttonHref="/models/multilingual-e5-large" inferenceAPI={true} />

    <ModelCard logoSrc={"https://cdn.sanity.io/images/vr8gru94/production/33b1cb253308f74fc83248746b7370a89b3c2c05-250x250.svg"} company="Cohere" modelName="cohere-rerank-3.5" description="Cohere's latest reranker with multilingual capabilities." task="Rerank" modality="Text" maxInputTokens="4096" price="$2.00 / 1k requests" buttonLabel="Try this model" buttonHref="/models/cohere-rerank-3.5" inferenceAPI={true} />

    <ModelCard logoSrc={"https://cdn.sanity.io/images/vr8gru94/production/f995ec77f7d3ccf3ed269fb6076ea3efdf22a8a6-724x785.png"} company="Pinecone" modelName="pinecone-sparse-english-v0" description="Sparse-vector encoder for custom lexical retrieval. For general keyword search, use full-text search." task="Embedding" modality="Text" maxInputTokens="512" price="$0.08 / million tokens" buttonLabel="Try this model" buttonHref="/models/pinecone-sparse-english-v0" inferenceAPI={true} logoInvert={true} />

    <ModelCard logoSrc={"https://cdn.sanity.io/images/vr8gru94/production/40b1d05ee1325e6d9e4886af4e76ff06d844faff-188x188.jpg"} company="BAAI" modelName="bge-reranker-v2-m3" description="High performance multi-lingual reranker model." task="Rerank" modality="Text" maxInputTokens="1024" price="$2.00 / 1k requests" buttonLabel="Try this model" buttonHref="/models/bge-reranker-v2-m3" inferenceAPI={true} />
  </div>

  <button
    className="carousel-button prev"
    id="prevButton"
    aria-label="Previous slide"
    style={{ visibility: 'hidden' }}
    onClick={() => {
        const carousel = document.getElementById('modelCarousel');
        const scrollAmount = carousel.offsetWidth / 4;
        carousel.scrollBy({
            left: -scrollAmount,
            behavior: 'smooth'
        });
    }}
  >
    <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
      <path d="M15 19l-7-7 7-7" stroke="var(--text-primary)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
    </svg>
  </button>

  <button
    className="carousel-button next"
    id="nextButton"
    aria-label="Next slide"
    onClick={() => {
        const carousel = document.getElementById('modelCarousel');
        const scrollAmount = carousel.offsetWidth / 4;
        carousel.scrollBy({
            left: scrollAmount,
            behavior: 'smooth'
        });
    }}
  >
    <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
      <path d="M9 5l7 7-7 7" stroke="var(--text-primary)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
    </svg>
  </button>
</div>

<script>
  {`
      const updateButtonVisibility = () => {
          const carousel = document.getElementById('modelCarousel');
          const prevButton = document.getElementById('prevButton');
          const nextButton = document.getElementById('nextButton');
          
          if (!carousel || !prevButton || !nextButton) return;
          
          const isAtStart = carousel.scrollLeft === 0;
          const isAtEnd = carousel.scrollLeft + carousel.offsetWidth >= carousel.scrollWidth;
          
          prevButton.style.opacity = isAtStart ? '0.5' : '1';
          nextButton.style.opacity = isAtEnd ? '0.5' : '1';
      };

      // Initialize button states
      updateButtonVisibility();
      
      // Update button states on scroll and resize
      const carousel = document.getElementById('modelCarousel');
      if (carousel) {
          carousel.addEventListener('scroll', updateButtonVisibility);
          window.addEventListener('resize', updateButtonVisibility);
      }
    `}
</script>

{" "}

<div className="model-search-container">
  <iframe id="model-search-iframe" src="https://www.pinecone.io/tools/model-search/" width="100%" height="100%" target="_parent" loading="eager" />
</div>
