From 1f8744be76537051d874b6d554190e2aaa4d0727 Mon Sep 17 00:00:00 2001 From: James Briggs <james.briggs@hotmail.com> Date: Thu, 1 Aug 2024 13:09:33 +0400 Subject: [PATCH] fix: testing --- docs/build/doctrees/environment.pickle | Bin 13063 -> 14854 bytes docs/build/doctrees/index.doctree | Bin 4500 -> 10271 bytes docs/build/doctrees/quickstart.doctree | Bin 0 -> 12488 bytes docs/build/html/.buildinfo | 2 +- docs/build/html/_sources/index.rst.txt | 11 +- docs/build/html/_sources/quickstart.rst.txt | 98 ++++++++++ docs/build/html/genindex.html | 4 + docs/build/html/index.html | 17 +- docs/build/html/objects.inv | Bin 255 -> 271 bytes docs/build/html/quickstart.html | 187 ++++++++++++++++++++ docs/build/html/search.html | 4 + docs/build/html/searchindex.js | 2 +- 12 files changed, 317 insertions(+), 8 deletions(-) create mode 100644 docs/build/doctrees/quickstart.doctree create mode 100644 docs/build/html/_sources/quickstart.rst.txt create mode 100644 docs/build/html/quickstart.html diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index 3f6cbcf2da3368dbcb9f61567b26789cf90aac75..c366757386dc6f23238e705abd8b4c34da298789 100644 GIT binary patch delta 6149 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 delta 4348 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 JeAU8`5da1Lb3y<B diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree index 384c04db99c12c799ed45c98736d367b61b50035..12ffe681303949e996a75f9c261cf0cee90f06e7 100644 GIT binary patch literal 10271 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 a@j3bFpj5_{0xFWhfi=Ys)b1!v(gOhfwh{dR delta 908 zcmbOqFh!ZQfpu!9;6_#^minH}jwvY$mHDMb3d#9-C8>EO3Z=!FdFcuX2}P;FB}Jvl zC8b5FDIuv9B?$=%#g%y_i4}SZ!KtYVB^jw)7-|%3GD=DcimmkZ%gf94iVHF_^D1;x z@{{%Qi_-N|^Yn8Qi%U|A^h=8q(^K_}Qj5djHk71Rl;~&XrKDEqWt8OR*d@esrQ|1< z=BDPAB$j06=P9J+7b&EqmLz886zfgNV2_=mks;V4j@|W>8QEl<*mE*VQi~FErc9oq z**K+kibe)&j|etzflbR0>=8is@nj!12O&WWUr%1hCOLT>w?usm#s0_ReVneE(mDm= z9cHnN_{oI=dbt=5pVGrtl$usrlsToxjkE~C<)A608LAnv8DbfZlRxrE)O(T|(YVaD zgLqRM6g`r$Q$TT0jG}f*Vup0=lnhxEIrgH|6i|YhJdsz#ssQA)!XB=o)U?#1)V$=> zlquefAeWXVWeE02<4H!77qUrA=9EyIoWagB`Lt}hU=L4bUUE)pN@`kWPHOR#*eR2v z<Z6X87J+P-kfENTk)i3$mm!wXJNdJm5mQF@W-a*_OiUS1Hj69WXV%Hsp0OpPCZn>n ohchoRH?^d)Ahj5r?zVSk)O3_)NP;}MB||5pGNX9&8MR<W0MB|@aR2}S diff --git a/docs/build/doctrees/quickstart.doctree b/docs/build/doctrees/quickstart.doctree new file mode 100644 index 0000000000000000000000000000000000000000..237d6b52bf65676c3a4070c43b3efda329e1d1d3 GIT binary patch literal 12488 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
r+=@xmk8am(%Pj6~i6~mJYTsg%3pxBpYLLF$v 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 literal 0 HcmV?d00001 diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo index 761199b2..5fb6279d 100644 --- a/docs/build/html/.buildinfo +++ b/docs/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: b045aa0ea82ed36b5de0726e6cfa8149 +config: 6d2df66aa6f93c86aae075c298bca014 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt index 1fb0f6bc..0d07a3ef 100644 --- a/docs/build/html/_sources/index.rst.txt +++ b/docs/build/html/_sources/index.rst.txt @@ -6,12 +6,17 @@ Semantic Router documentation ============================= -Add your content using ``reStructuredText`` syntax. See the -`reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html>`_ -documentation for details. +Semantic Router is a superfast decision-making layer for your LLMs and agents. Rather than waiting for slow LLM generations to make tool-use decisions, we use the magic of semantic vector space to make those decisions — *routing* our requests using *semantic* meaning. +## Integrations + +The *encoders* of semantic router include easy-to-use integrations with `Cohere <https://github.com/aurelio-labs/semantic-router/blob/main/semantic_router/encoders/cohere.py>`_, `OpenAI <https://github.com/aurelio-labs/semantic-router/blob/main/docs/encoders/openai-embed-3.ipynb>`_, `Hugging Face <https://github.com/aurelio-labs/semantic-router/blob/main/docs/encoders/huggingface.ipynb>`_, `FastEmbed <https://github.com/aurelio-labs/semantic-router/blob/main/docs/encoders/fastembed.ipynb>`_, and `more <https://github.com/aurelio-labs/semantic-router/tree/main/semantic_router/encoders>`_ — we even support `multi-modality <https://github.com/aurelio-labs/semantic-router/blob/main/docs/07-multi-modal.ipynb>`_!. + +Our utterance vector space also integrates with `Pinecone <https://github.com/aurelio-labs/semantic-router/blob/main/docs/indexes/pinecone.ipynb>`_ and `Qdrant <https://github.com/aurelio-labs/semantic-router/blob/main/docs/indexes/qdrant.ipynb>`_! .. toctree:: :maxdepth: 2 :caption: Contents: + quickstart + diff --git a/docs/build/html/_sources/quickstart.rst.txt b/docs/build/html/_sources/quickstart.rst.txt new file mode 100644 index 00000000..b3765547 --- /dev/null +++ b/docs/build/html/_sources/quickstart.rst.txt @@ -0,0 +1,98 @@ +Quickstart +========== + +To get started with *semantic-router* we install it like so:: + + pip install -qU semantic-router + +.. warning:: + If wanting to use a fully local version of semantic router you can use ``HuggingFaceEncoder`` and ``LlamaCppLLM`` (``pip install -qU "semantic-router[local]"``, see `here <https://github.com/aurelio-labs/semantic-router/blob/main/docs/05-local-execution.ipynb>`_). To use the ``HybridRouteLayer`` you must ``pip install -qU "semantic-router[hybrid]"``. + +We begin by defining a set of ``Route`` objects. These are the decision paths that the semantic router can decide to use, let's try two simple routes for now — one for talk on *politics* and another for *chitchat*: + +.. code-block:: python + + from semantic_router import Route + + # we could use this as a guide for our chatbot to avoid political conversations + politics = Route( + name="politics", + utterances=[ + "isn't politics the best thing ever", + "why don't you tell me about your political opinions", + "don't you just love the president", + "they're going to destroy this country!", + "they will save the country!", + ], + ) + + # this could be used as an indicator to our chatbot to switch to a more + # conversational prompt + chitchat = Route( + name="chitchat", + utterances=[ + "how's the weather today?", + "how are things going?", + "lovely weather today", + "the weather is horrendous", + "let's go to the chippy", + ], + ) + + # we place both of our decisions together into single list + routes = [politics, chitchat] + +We have our routes ready, now we initialize an embedding / encoder model. We currently support a ``CohereEncoder`` and ``OpenAIEncoder`` — more encoders will be added soon. To initialize them we do: + +.. code-block:: python + + import os + from semantic_router.encoders import CohereEncoder, OpenAIEncoder + + # for Cohere + os.environ["COHERE_API_KEY"] = "<YOUR_API_KEY>" + encoder = CohereEncoder() + + # or for OpenAI + os.environ["OPENAI_API_KEY"] = "<YOUR_API_KEY>" + encoder = OpenAIEncoder() + +With our ``routes`` and ``encoder`` defined we now create a ``RouteLayer``. The route layer handles our semantic decision making. + +.. code-block:: python + + from semantic_router.layer import RouteLayer + + rl = RouteLayer(encoder=encoder, routes=routes) + +We can now use our route layer to make super fast decisions based on user queries. Let's try with two queries that should trigger our route decisions: + +.. code-block:: python + + rl("don't you love politics?").name + +.. code-block:: + + [Out]: 'politics' + +Correct decision, let's try another: + +.. code-block:: python + + rl("how's the weather today?").name + +.. code-block:: + + [Out]: 'chitchat' + +We get both decisions correct! Now lets try sending an unrelated query: + +.. code-block:: python + + rl("I'm interested in learning about llama 2").name + +.. code-block:: + + [Out]: + +In this case, no decision could be made as we had no matches — so our route layer returned ``None``! \ No newline at end of file diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index 329c75f2..9d5cb1a1 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -53,6 +53,10 @@ <h3>Navigation</h3> +<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quickstart</a></li> +</ul> <div class="relations"> <h3>Related Topics</h3> diff --git a/docs/build/html/index.html b/docs/build/html/index.html index ed99b194..5d5caccb 100644 --- a/docs/build/html/index.html +++ b/docs/build/html/index.html @@ -13,6 +13,7 @@ <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> + <link rel="next" title="Quickstart" href="quickstart.html" /> <link rel="stylesheet" href="_static/custom.css" type="text/css" /> @@ -32,10 +33,15 @@ <section id="semantic-router-documentation"> <h1>Semantic Router documentation<a class="headerlink" href="#semantic-router-documentation" title="Link to this heading">¶</a></h1> -<p>Add your content using <code class="docutils literal notranslate"><span class="pre">reStructuredText</span></code> syntax. See the -<a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html">reStructuredText</a> -documentation for details.</p> +<p>Semantic Router is a superfast decision-making layer for your LLMs and agents. Rather than waiting for slow LLM generations to make tool-use decisions, we use the magic of semantic vector space to make those decisions — <em>routing</em> our requests using <em>semantic</em> meaning.</p> +<p>## Integrations</p> +<p>The <em>encoders</em> of semantic router include easy-to-use integrations with <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/blob/main/semantic_router/encoders/cohere.py">Cohere</a>, <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/blob/main/docs/encoders/openai-embed-3.ipynb">OpenAI</a>, <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/blob/main/docs/encoders/huggingface.ipynb">Hugging Face</a>, <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/blob/main/docs/encoders/fastembed.ipynb">FastEmbed</a>, and <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/tree/main/semantic_router/encoders">more</a> — we even support <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/blob/main/docs/07-multi-modal.ipynb">multi-modality</a>!.</p> +<p>Our utterance vector space also integrates with <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/blob/main/docs/indexes/pinecone.ipynb">Pinecone</a> and <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/blob/main/docs/indexes/qdrant.ipynb">Qdrant</a>!</p> <div class="toctree-wrapper compound"> +<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quickstart</a></li> +</ul> </div> </section> @@ -56,11 +62,16 @@ documentation for details.</p> <h3>Navigation</h3> +<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quickstart</a></li> +</ul> <div class="relations"> <h3>Related Topics</h3> <ul> <li><a href="#">Documentation overview</a><ul> + <li>Next: <a href="quickstart.html" title="next chapter">Quickstart</a></li> </ul></li> </ul> </div> diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv index 0db59178f18b0761f032469c90f768ca2a8057b2..798dd58fe0ce62d7106f395bb896e6563936a5bb 100644 GIT binary patch delta 154 zcmey**v~Yfw!XFBk?)X#fa~`;P25+GtTiu44EoBV?9;%}b7;br?bp4sGm{?W{rLa) zXY;`qi;g*_U1R4r|FY?}xAAK0(+5vKHt7<*yhLq<;yMY1O~Id>S`AN{2Qs;_m5I12 z{9XLmu&g_9`Wz4O{^IDz|2n@aM|a)+ve}~aJWuEC=J2g*=kIS9KEdI6GdK9^H2%6j May(t)D;V-J0RI0=LjV8( delta 138 zcmeBY`p-C_w%*(S?CCS!o@)a%^gK77^7QdK8+gGq#G}3IRqB){&onBUX2fu$YW_T_ z;Oe2(6kII)*~@6MXwxTe@1Smx1}(4R;Llz{-bSB4?<o2lyx~S*z)J4P4HA!L&kve4 vnQJSr=d^}x4W}mc{ILnSdvs-|>q*HKQi@3i-<zH?3tbN0$?%I=JVp@!M#4XQ diff --git a/docs/build/html/quickstart.html b/docs/build/html/quickstart.html new file mode 100644 index 00000000..d2ab1b51 --- /dev/null +++ b/docs/build/html/quickstart.html @@ -0,0 +1,187 @@ +<!DOCTYPE html> + +<html lang="en" data-content_root="./"> + <head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> + + <title>Quickstart — Semantic Router 0.0.55 documentation</title> + <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d1102ebc" /> + <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=12dfc556" /> + <script src="_static/documentation_options.js?v=b87b3bc5"></script> + <script src="_static/doctools.js?v=9a2dae69"></script> + <script src="_static/sphinx_highlight.js?v=dc90522c"></script> + <link rel="index" title="Index" href="genindex.html" /> + <link rel="search" title="Search" href="search.html" /> + <link rel="prev" title="Semantic Router documentation" href="index.html" /> + + <link rel="stylesheet" href="_static/custom.css" type="text/css" /> + + + + + + </head><body> + + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + + + <div class="body" role="main"> + + <section id="quickstart"> +<h1>Quickstart<a class="headerlink" href="#quickstart" title="Link to this heading">¶</a></h1> +<p>To get started with <em>semantic-router</em> we install it like so:</p> +<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">qU</span> <span class="n">semantic</span><span class="o">-</span><span class="n">router</span> +</pre></div> +</div> +<div class="admonition warning"> +<p class="admonition-title">Warning</p> +<p>If wanting to use a fully local version of semantic router you can use <code class="docutils literal notranslate"><span class="pre">HuggingFaceEncoder</span></code> and <code class="docutils literal notranslate"><span class="pre">LlamaCppLLM</span></code> (<code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">-qU</span> <span class="pre">"semantic-router[local]"</span></code>, see <a class="reference external" href="https://github.com/aurelio-labs/semantic-router/blob/main/docs/05-local-execution.ipynb">here</a>). To use the <code class="docutils literal notranslate"><span class="pre">HybridRouteLayer</span></code> you must <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">-qU</span> <span class="pre">"semantic-router[hybrid]"</span></code>.</p> +</div> +<p>We begin by defining a set of <code class="docutils literal notranslate"><span class="pre">Route</span></code> objects. These are the decision paths that the semantic router can decide to use, let’s try two simple routes for now — one for talk on <em>politics</em> and another for <em>chitchat</em>:</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">semantic_router</span> <span class="kn">import</span> <span class="n">Route</span> + +<span class="c1"># we could use this as a guide for our chatbot to avoid political conversations</span> +<span class="n">politics</span> <span class="o">=</span> <span class="n">Route</span><span class="p">(</span> + <span class="n">name</span><span class="o">=</span><span class="s2">"politics"</span><span class="p">,</span> + <span class="n">utterances</span><span class="o">=</span><span class="p">[</span> + <span class="s2">"isn't politics the best thing ever"</span><span class="p">,</span> + <span class="s2">"why don't you tell me about your political opinions"</span><span class="p">,</span> + <span class="s2">"don't you just love the president"</span><span class="p">,</span> + <span class="s2">"they're going to destroy this country!"</span><span class="p">,</span> + <span class="s2">"they will save the country!"</span><span class="p">,</span> + <span class="p">],</span> +<span class="p">)</span> + +<span class="c1"># this could be used as an indicator to our chatbot to switch to a more</span> +<span class="c1"># conversational prompt</span> +<span class="n">chitchat</span> <span class="o">=</span> <span class="n">Route</span><span class="p">(</span> + <span class="n">name</span><span class="o">=</span><span class="s2">"chitchat"</span><span class="p">,</span> + <span class="n">utterances</span><span class="o">=</span><span class="p">[</span> + <span class="s2">"how's the weather today?"</span><span class="p">,</span> + <span class="s2">"how are things going?"</span><span class="p">,</span> + <span class="s2">"lovely weather today"</span><span class="p">,</span> + <span class="s2">"the weather is horrendous"</span><span class="p">,</span> + <span class="s2">"let's go to the chippy"</span><span class="p">,</span> + <span class="p">],</span> +<span class="p">)</span> + +<span class="c1"># we place both of our decisions together into single list</span> +<span class="n">routes</span> <span class="o">=</span> <span class="p">[</span><span class="n">politics</span><span class="p">,</span> <span class="n">chitchat</span><span class="p">]</span> +</pre></div> +</div> +<p>We have our routes ready, now we initialize an embedding / encoder model. We currently support a <code class="docutils literal notranslate"><span class="pre">CohereEncoder</span></code> and <code class="docutils literal notranslate"><span class="pre">OpenAIEncoder</span></code> — more encoders will be added soon. To initialize them we do:</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span> +<span class="kn">from</span> <span class="nn">semantic_router.encoders</span> <span class="kn">import</span> <span class="n">CohereEncoder</span><span class="p">,</span> <span class="n">OpenAIEncoder</span> + +<span class="c1"># for Cohere</span> +<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"COHERE_API_KEY"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"<YOUR_API_KEY>"</span> +<span class="n">encoder</span> <span class="o">=</span> <span class="n">CohereEncoder</span><span class="p">()</span> + +<span class="c1"># or for OpenAI</span> +<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"OPENAI_API_KEY"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"<YOUR_API_KEY>"</span> +<span class="n">encoder</span> <span class="o">=</span> <span class="n">OpenAIEncoder</span><span class="p">()</span> +</pre></div> +</div> +<p>With our <code class="docutils literal notranslate"><span class="pre">routes</span></code> and <code class="docutils literal notranslate"><span class="pre">encoder</span></code> defined we now create a <code class="docutils literal notranslate"><span class="pre">RouteLayer</span></code>. The route layer handles our semantic decision making.</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">semantic_router.layer</span> <span class="kn">import</span> <span class="n">RouteLayer</span> + +<span class="n">rl</span> <span class="o">=</span> <span class="n">RouteLayer</span><span class="p">(</span><span class="n">encoder</span><span class="o">=</span><span class="n">encoder</span><span class="p">,</span> <span class="n">routes</span><span class="o">=</span><span class="n">routes</span><span class="p">)</span> +</pre></div> +</div> +<p>We can now use our route layer to make super fast decisions based on user queries. Let’s try with two queries that should trigger our route decisions:</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">rl</span><span class="p">(</span><span class="s2">"don't you love politics?"</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> +</pre></div> +</div> +<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">Out</span><span class="p">]:</span> <span class="s1">'politics'</span> +</pre></div> +</div> +<p>Correct decision, let’s try another:</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">rl</span><span class="p">(</span><span class="s2">"how's the weather today?"</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> +</pre></div> +</div> +<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">Out</span><span class="p">]:</span> <span class="s1">'chitchat'</span> +</pre></div> +</div> +<p>We get both decisions correct! Now lets try sending an unrelated query:</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">rl</span><span class="p">(</span><span class="s2">"I'm interested in learning about llama 2"</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> +</pre></div> +</div> +<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">Out</span><span class="p">]:</span> +</pre></div> +</div> +<p>In this case, no decision could be made as we had no matches — so our route layer returned <code class="docutils literal notranslate"><span class="pre">None</span></code>!</p> +</section> + + + </div> + + </div> + </div> + <div class="sphinxsidebar" role="navigation" aria-label="Main"> + <div class="sphinxsidebarwrapper"> +<h1 class="logo"><a href="index.html">Semantic Router</a></h1> + + + + + + + + +<h3>Navigation</h3> +<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> +<ul class="current"> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Quickstart</a></li> +</ul> + +<div class="relations"> +<h3>Related Topics</h3> +<ul> + <li><a href="index.html">Documentation overview</a><ul> + <li>Previous: <a href="index.html" title="previous chapter">Semantic Router documentation</a></li> + </ul></li> +</ul> +</div> +<search id="searchbox" style="display: none" role="search"> + <h3 id="searchlabel">Quick search</h3> + <div class="searchformwrapper"> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/> + <input type="submit" value="Go" /> + </form> + </div> +</search> +<script>document.getElementById('searchbox').style.display = "block"</script> + + + + + + + + + </div> + </div> + <div class="clearer"></div> + </div> + <div class="footer"> + ©2024, Aurelio AI. + + | + Powered by <a href="https://www.sphinx-doc.org/">Sphinx 7.4.7</a> + & <a href="https://alabaster.readthedocs.io">Alabaster 0.7.16</a> + + | + <a href="_sources/quickstart.rst.txt" + rel="nofollow">Page source</a> + </div> + + + + + </body> +</html> \ No newline at end of file diff --git a/docs/build/html/search.html b/docs/build/html/search.html index 723964c2..19511ba7 100644 --- a/docs/build/html/search.html +++ b/docs/build/html/search.html @@ -80,6 +80,10 @@ <h3>Navigation</h3> +<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quickstart</a></li> +</ul> <div class="relations"> <h3>Related Topics</h3> diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index d37a819c..e81afba0 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"Semantic Router documentation": [[0, null]]}, "docnames": ["index"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["index.rst"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"add": 0, "content": 0, "detail": 0, "restructuredtext": 0, "see": 0, "syntax": 0, "us": 0, "your": 0}, "titles": ["Semantic Router documentation"], "titleterms": {"document": 0, "router": 0, "semant": 0}}) \ No newline at end of file +Search.setIndex({"alltitles": {"Contents:": [[0, null]], "Quickstart": [[1, null]], "Semantic Router documentation": [[0, null]]}, "docnames": ["index", "quickstart"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["index.rst", "quickstart.rst"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": 1, "2": 1, "If": 1, "In": 1, "The": [0, 1], "These": 1, "To": 1, "With": 1, "about": 1, "ad": 1, "add": [], "agent": 0, "also": 0, "an": 1, "anoth": 1, "ar": 1, "avoid": 1, "base": 1, "begin": 1, "best": 1, "both": 1, "can": 1, "case": 1, "chatbot": 1, "chippi": 1, "chitchat": 1, "coher": [0, 1], "cohere_api_kei": 1, "cohereencod": 1, "content": [], "convers": 1, "correct": 1, "could": 1, "countri": 1, "creat": 1, "current": 1, "decid": 1, "decis": [0, 1], "defin": 1, "destroi": 1, "detail": [], "do": 1, "don": 1, "easi": 0, "embed": 1, "encod": [0, 1], "environ": 1, "even": 0, "ever": 1, "face": 0, "fast": 1, "fastemb": 0, "from": 1, "fulli": 1, "gener": 0, "get": 1, "go": 1, "guid": 1, "had": 1, "handl": 1, "have": 1, "here": 1, "horrend": 1, "how": 1, "hug": 0, "huggingfaceencod": 1, "hybrid": 1, "hybridroutelay": 1, "i": [0, 1], "import": 1, "includ": 0, "indic": 1, "initi": 1, "instal": 1, "integr": 0, "interest": 1, "isn": 1, "just": 1, "layer": [0, 1], "learn": 1, "let": 1, "like": 1, "list": 1, "llama": 1, "llamacppllm": 1, "llm": 0, "local": 1, "love": 1, "m": 1, "made": 1, "magic": 0, "make": [0, 1], "match": 1, "me": 1, "mean": 0, "modal": 0, "model": 1, "more": [0, 1], "multi": 0, "must": 1, "name": 1, "none": 1, "now": 1, "o": 1, "object": 1, "one": 1, "openai": [0, 1], "openai_api_kei": 1, "openaiencod": 1, "opinion": 1, "our": [0, 1], "out": 1, "path": 1, "pinecon": 0, "pip": 1, "place": 1, "polit": 1, "presid": 1, "prompt": 1, "qdrant": 0, "qu": 1, "queri": 1, "quickstart": 0, "rather": 0, "re": 1, "readi": 1, "request": 0, "restructuredtext": [], "return": 1, "rl": 1, "rout": [0, 1], "routelay": 1, "router": 1, "save": 1, "see": 1, "semant": 1, "semantic_rout": 1, "send": 1, "set": 1, "should": 1, "simpl": 1, "singl": 1, "slow": 0, "so": 1, "soon": 1, "space": 0, "start": 1, "super": 1, "superfast": 0, "support": [0, 1], "switch": 1, "syntax": [], "t": 1, "talk": 1, "tell": 1, "than": 0, "thei": 1, "them": 1, "thi": 1, "thing": 1, "those": 0, "todai": 1, "togeth": 1, "tool": 0, "trigger": 1, "try": 1, "two": 1, "unrel": 1, "us": [0, 1], "user": 1, "utter": [0, 1], "vector": 0, "version": 1, "wait": 0, "want": 1, "we": [0, 1], "weather": 1, "why": 1, "you": 1, "your": [0, 1], "your_api_kei": 1}, "titles": ["Semantic Router documentation", "Quickstart"], "titleterms": {"content": 0, "document": 0, "quickstart": 1, "router": 0, "semant": 0}}) \ No newline at end of file -- GitLab