<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Langfuse on Producthunt daily</title>
        <link>https://producthunt.programnotes.cn/en/tags/langfuse/</link>
        <description>Recent content in Langfuse on Producthunt daily</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Mon, 02 Jun 2025 15:31:52 +0800</lastBuildDate><atom:link href="https://producthunt.programnotes.cn/en/tags/langfuse/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>local-ai-packaged</title>
        <link>https://producthunt.programnotes.cn/en/p/local-ai-packaged/</link>
        <pubDate>Mon, 02 Jun 2025 15:31:52 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/local-ai-packaged/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1691520673295-9626f624869b?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NDg4NDk0MTN8&amp;ixlib=rb-4.1.0" alt="Featured image of post local-ai-packaged" /&gt;&lt;h1 id=&#34;coleam00local-ai-packaged&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/coleam00/local-ai-packaged&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;coleam00/local-ai-packaged&lt;/a&gt;
&lt;/h1&gt;&lt;h1 id=&#34;self-hosted-ai-package&#34;&gt;Self-hosted AI Package
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Self-hosted AI Package&lt;/strong&gt; is an open, docker compose template that
quickly bootstraps a fully featured Local AI and Low Code development
environment including Ollama for your local LLMs, Open WebUI for an interface to chat with your N8N agents, and Supabase for your database, vector store, and authentication.&lt;/p&gt;
&lt;p&gt;This is Cole&amp;rsquo;s version with a couple of improvements and the addition of Supabase, Open WebUI, Flowise, Neo4j, Langfuse, SearXNG, and Caddy!
Also, the local RAG AI Agent workflows from the video will be automatically in your
n8n instance if you use this setup instead of the base one provided by n8n!&lt;/p&gt;
&lt;h2 id=&#34;important-links&#34;&gt;Important Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://thinktank.ottomator.ai/c/local-ai/18&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Local AI community&lt;/a&gt; forum over in the oTTomator Think Tank&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/users/coleam00/projects/2/views/1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub Kanban board&lt;/a&gt; for feature implementation and bug squashing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/n8n-io/self-hosted-ai-starter-kit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Original Local AI Starter Kit&lt;/a&gt; by the n8n team&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download my N8N + OpenWebUI integration &lt;a class=&#34;link&#34; href=&#34;https://openwebui.com/f/coleam/n8n_pipe/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;directly on the Open WebUI site.&lt;/a&gt; (more instructions below)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/n8n-io/self-hosted-ai-starter-kit/main/assets/n8n-demo.gif&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;n8n.io - Screenshot&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Curated by &lt;a class=&#34;link&#34; href=&#34;https://github.com/n8n-io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/n8n-io&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/coleam00&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/coleam00&lt;/a&gt;, it combines the self-hosted n8n
platform with a curated list of compatible AI products and components to
quickly get started with building self-hosted AI workflows.&lt;/p&gt;
&lt;h3 id=&#34;whats-included&#34;&gt;What’s included
&lt;/h3&gt;&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://n8n.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Self-hosted n8n&lt;/strong&gt;&lt;/a&gt; - Low-code platform with over 400
integrations and advanced AI components&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://supabase.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Supabase&lt;/strong&gt;&lt;/a&gt; - Open source database as a service -
most widely used database for AI agents&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://ollama.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/a&gt; - Cross-platform LLM platform to install
and run the latest local LLMs&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://openwebui.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Open WebUI&lt;/strong&gt;&lt;/a&gt; - ChatGPT-like interface to
privately interact with your local models and N8N agents&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://flowiseai.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Flowise&lt;/strong&gt;&lt;/a&gt; - No/low code AI agent
builder that pairs very well with n8n&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://qdrant.tech/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Qdrant&lt;/strong&gt;&lt;/a&gt; - Open source, high performance vector
store with an comprehensive API. Even though you can use Supabase for RAG, this was
kept unlike Postgres since it&amp;rsquo;s faster than Supabase so sometimes is the better option.&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://neo4j.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Neo4j&lt;/strong&gt;&lt;/a&gt; - Knowledge graph engine that powers tools like GraphRAG, LightRAG, and Graphiti&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://searxng.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;SearXNG&lt;/strong&gt;&lt;/a&gt; - Open source, free internet metasearch engine which aggregates
results from up to 229 search services. Users are neither tracked nor profiled, hence the fit with the local AI package.&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://caddyserver.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Caddy&lt;/strong&gt;&lt;/a&gt; - Managed HTTPS/TLS for custom domains&lt;/p&gt;
&lt;p&gt;✅ &lt;a class=&#34;link&#34; href=&#34;https://langfuse.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Langfuse&lt;/strong&gt;&lt;/a&gt; - Open source LLM engineering platform for agent observability&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites
&lt;/h2&gt;&lt;p&gt;Before you begin, make sure you have the following software installed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.python.org/downloads/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Python&lt;/a&gt; - Required to run the setup script&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://desktop.github.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Git/GitHub Desktop&lt;/a&gt; - For easy repository management&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.docker.com/products/docker-desktop/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker/Docker Desktop&lt;/a&gt; - Required to run all services&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;Clone the repository and navigate to the project directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone -b stable https://github.com/coleam00/local-ai-packaged.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; local-ai-packaged
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Before running the services, you need to set up your environment variables for Supabase following their &lt;a class=&#34;link&#34; href=&#34;https://supabase.com/docs/guides/self-hosting/docker#securing-your-services&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;self-hosting guide&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make a copy of &lt;code&gt;.env.example&lt;/code&gt; and rename it to &lt;code&gt;.env&lt;/code&gt; in the root directory of the project&lt;/li&gt;
&lt;li&gt;Set the following required environment variables:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# N8N Configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;N8N_ENCRYPTION_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;N8N_USER_MANAGEMENT_JWT_SECRET&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Supabase Secrets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;JWT_SECRET&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ANON_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SERVICE_ROLE_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DASHBOARD_USERNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DASHBOARD_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;POOLER_TENANT_ID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Neo4j Secrets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############   &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;NEO4J_AUTH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Langfuse credentials&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CLICKHOUSE_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MINIO_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LANGFUSE_SALT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;NEXTAUTH_SECRET&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ENCRYPTION_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
Make sure to generate secure random values for all secrets. Never use the example values in production.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Set the following environment variables if deploying to production, otherwise leave commented:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Caddy Config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;############&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;N8N_HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;n8n.yourdomain.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WEBUI_HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;:openwebui.yourdomain.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;FLOWISE_HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;:flowise.yourdomain.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SUPABASE_HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;:supabase.yourdomain.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OLLAMA_HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;:ollama.yourdomain.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SEARXNG_HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;searxng.yourdomain.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;NEO4J_HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;neo4j.yourdomain.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LETSENCRYPT_EMAIL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;your-email-address
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;The project includes a &lt;code&gt;start_services.py&lt;/code&gt; script that handles starting both the Supabase and local AI services. The script accepts a &lt;code&gt;--profile&lt;/code&gt; flag to specify which GPU configuration to use.&lt;/p&gt;
&lt;h3 id=&#34;for-nvidia-gpu-users&#34;&gt;For Nvidia GPU users
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python start_services.py --profile gpu-nvidia
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
If you have not used your Nvidia GPU with Docker before, please follow the
&lt;a class=&#34;link&#34; href=&#34;https://github.com/ollama/ollama/blob/main/docs/docker.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ollama Docker instructions&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;for-amd-gpu-users-on-linux&#34;&gt;For AMD GPU users on Linux
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python start_services.py --profile gpu-amd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;for-mac--apple-silicon-users&#34;&gt;For Mac / Apple Silicon users
&lt;/h3&gt;&lt;p&gt;If you&amp;rsquo;re using a Mac with an M1 or newer processor, you can&amp;rsquo;t expose your GPU to the Docker instance, unfortunately. There are two options in this case:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Run the starter kit fully on CPU:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python start_services.py --profile cpu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run Ollama on your Mac for faster inference, and connect to that from the n8n instance:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python start_services.py --profile none
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you want to run Ollama on your mac, check the &lt;a class=&#34;link&#34; href=&#34;https://ollama.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ollama homepage&lt;/a&gt; for installation instructions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;for-mac-users-running-ollama-locally&#34;&gt;For Mac users running OLLAMA locally
&lt;/h4&gt;&lt;p&gt;If you&amp;rsquo;re running OLLAMA locally on your Mac (not in Docker), you need to modify the OLLAMA_HOST environment variable in the n8n service configuration. Update the x-n8n section in your Docker Compose file as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;x-n8n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;amp;service-n8n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# ... other configurations ...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# ... other environment variables ...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;OLLAMA_HOST=host.docker.internal:11434&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Additionally, after you see &amp;ldquo;Editor is now accessible via: http://localhost:5678/&amp;rdquo;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Head to http://localhost:5678/home/credentials&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Local Ollama service&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Change the base URL to &amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://host.docker.internal:11434/%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://host.docker.internal:11434/&#34;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;for-everyone-else&#34;&gt;For everyone else
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python start_services.py --profile cpu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;the-environment-argument&#34;&gt;The environment argument
&lt;/h3&gt;&lt;p&gt;The &lt;strong&gt;start-services.py&lt;/strong&gt; script offers the possibility to pass one of two options for the environment argument, &lt;strong&gt;private&lt;/strong&gt; (default environment) and &lt;strong&gt;public&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;private:&lt;/strong&gt; you are deploying the stack in a safe environment, hence a lot of ports can be made accessible without having to worry about security&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;public:&lt;/strong&gt; the stack is deployed in a public environment, which means the attack surface should be made as small as possible. All ports except for 80 and 443 are closed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The stack initialized with&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   python start_services.py --profile gpu-nvidia --environment private
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;equals the one initialized with&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   python start_services.py --profile gpu-nvidia
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;deploying-to-the-cloud&#34;&gt;Deploying to the Cloud
&lt;/h2&gt;&lt;h3 id=&#34;prerequisites-for-the-below-steps&#34;&gt;Prerequisites for the below steps
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Linux machine (preferably Unbuntu) with Nano, Git, and Docker installed&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;extra-steps&#34;&gt;Extra steps
&lt;/h3&gt;&lt;p&gt;Before running the above commands to pull the repo and install everything:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Run the commands as root to open up the necessary ports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ufw enable&lt;/li&gt;
&lt;li&gt;ufw allow 80 &amp;amp;&amp;amp; ufw allow 443&lt;/li&gt;
&lt;li&gt;ufw reload&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;WARNING&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ufw does not shield ports published by docker, because the iptables rules configured by docker are analyzed before those configured by ufw. There is a solution to change this behavior, but that is out of scope for this project. Just make sure that all traffic runs through the caddy service via port 443. Port 80 should only be used to redirect to port 443.&lt;/p&gt;
&lt;hr&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the &lt;strong&gt;start-services.py&lt;/strong&gt; script with the environment argument &lt;strong&gt;public&lt;/strong&gt; to indicate you are going to run the package in a public environment. The script will make sure that all ports, except for 80 and 443, are closed down, e.g.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   python start_services.py --profile gpu-nvidia --environment public
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;Set up A records for your DNS provider to point your subdomains you&amp;rsquo;ll set up in the .env file for Caddy
to the IP address of your cloud instance.&lt;/p&gt;
&lt;p&gt;For example, A record to point n8n to [cloud instance IP] for n8n.yourdomain.com&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;-quick-start-and-usage&#34;&gt;⚡️ Quick start and usage
&lt;/h2&gt;&lt;p&gt;The main component of the self-hosted AI starter kit is a docker compose file
pre-configured with network and disk so there isn’t much else you need to
install. After completing the installation steps above, follow the steps below
to get started.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open &lt;a class=&#34;link&#34; href=&#34;http://localhost:5678/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://localhost:5678/&lt;/a&gt; in your browser to set up n8n. You’ll only
have to do this once. You are NOT creating an account with n8n in the setup here,
it is only a local account for your instance!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the included workflow:
&lt;a class=&#34;link&#34; href=&#34;http://localhost:5678/workflow/vTN9y2dLXqTiDfPT&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://localhost:5678/workflow/vTN9y2dLXqTiDfPT&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create credentials for every service:&lt;/p&gt;
&lt;p&gt;Ollama URL: http://ollama:11434&lt;/p&gt;
&lt;p&gt;Postgres (through Supabase): use DB, username, and password from .env. IMPORTANT: Host is &amp;lsquo;db&amp;rsquo;
Since that is the name of the service running Supabase&lt;/p&gt;
&lt;p&gt;Qdrant URL: http://qdrant:6333 (API key can be whatever since this is running locally)&lt;/p&gt;
&lt;p&gt;Google Drive: Follow &lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/integrations/builtin/credentials/google/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this guide from n8n&lt;/a&gt;.
Don&amp;rsquo;t use localhost for the redirect URI, just use another domain you have, it will still work!
Alternatively, you can set up &lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.localfiletrigger/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;local file triggers&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Test workflow&lt;/strong&gt; to start running the workflow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If this is the first time you’re running the workflow, you may need to wait
until Ollama finishes downloading Llama3.1. You can inspect the docker
console logs to check on the progress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure to toggle the workflow as active and copy the &amp;ldquo;Production&amp;rdquo; webhook URL!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open &lt;a class=&#34;link&#34; href=&#34;http://localhost:3000/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://localhost:3000/&lt;/a&gt; in your browser to set up Open WebUI.
You’ll only have to do this once. You are NOT creating an account with Open WebUI in the
setup here, it is only a local account for your instance!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to Workspace -&amp;gt; Functions -&amp;gt; Add Function -&amp;gt; Give name + description then paste in
the code from &lt;code&gt;n8n_pipe.py&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The function is also &lt;a class=&#34;link&#34; href=&#34;https://openwebui.com/f/coleam/n8n_pipe/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;published here on Open WebUI&amp;rsquo;s site&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on the gear icon and set the n8n_url to the production URL for the webhook
you copied in a previous step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Toggle the function on and now it will be available in your model dropdown in the top left!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To open n8n at any time, visit &lt;a class=&#34;link&#34; href=&#34;http://localhost:5678/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://localhost:5678/&lt;/a&gt; in your browser.
To open Open WebUI at any time, visit &lt;a class=&#34;link&#34; href=&#34;http://localhost:3000/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://localhost:3000/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With your n8n instance, you’ll have access to over 400 integrations and a
suite of basic and advanced AI nodes such as
&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AI Agent&lt;/a&gt;,
&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.text-classifier/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Text classifier&lt;/a&gt;,
and &lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.information-extractor/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Information Extractor&lt;/a&gt;
nodes. To keep everything local, just remember to use the Ollama node for your
language model and Qdrant as your vector store.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
This starter kit is designed to help you get started with self-hosted AI
workflows. While it’s not fully optimized for production environments, it
combines robust components that work well together for proof-of-concept
projects. You can customize it to meet your specific needs&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;upgrading&#34;&gt;Upgrading
&lt;/h2&gt;&lt;p&gt;To update all containers to their latest versions (n8n, Open WebUI, etc.), run these commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Stop all services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose -p localai -f docker-compose.yml --profile &amp;lt;your-profile&amp;gt; down
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Pull latest versions of all containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose -p localai -f docker-compose.yml --profile &amp;lt;your-profile&amp;gt; pull
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Start services again with your desired profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python start_services.py --profile &amp;lt;your-profile&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;&amp;lt;your-profile&amp;gt;&lt;/code&gt; with one of: &lt;code&gt;cpu&lt;/code&gt;, &lt;code&gt;gpu-nvidia&lt;/code&gt;, &lt;code&gt;gpu-amd&lt;/code&gt;, or &lt;code&gt;none&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note: The &lt;code&gt;start_services.py&lt;/code&gt; script itself does not update containers - it only restarts them or pulls them if you are downloading these containers for the first time. To get the latest versions, you must explicitly run the commands above.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting
&lt;/h2&gt;&lt;p&gt;Here are solutions to common issues you might encounter:&lt;/p&gt;
&lt;h3 id=&#34;supabase-issues&#34;&gt;Supabase Issues
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Supabase Pooler Restarting&lt;/strong&gt;: If the supabase-pooler container keeps restarting itself, follow the instructions in &lt;a class=&#34;link&#34; href=&#34;https://github.com/supabase/supabase/issues/30210#issuecomment-2456955578&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this GitHub issue&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Supabase Analytics Startup Failure&lt;/strong&gt;: If the supabase-analytics container fails to start after changing your Postgres password, delete the folder &lt;code&gt;supabase/docker/volumes/db/data&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;If using Docker Desktop&lt;/strong&gt;: Go into the Docker settings and make sure &amp;ldquo;Expose daemon on tcp://localhost:2375 without TLS&amp;rdquo; is turned on&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Supabase Service Unavailable&lt;/strong&gt; - Make sure you don&amp;rsquo;t have an &amp;ldquo;@&amp;rdquo; character in your Postgres password! If the connection to the kong container is working (the container logs say it is receiving requests from n8n) but n8n says it cannot connect, this is generally the problem from what the community has shared. Other characters might not be allowed too, the @ symbol is just the one I know for sure!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;gpu-support-issues&#34;&gt;GPU Support Issues
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows GPU Support&lt;/strong&gt;: If you&amp;rsquo;re having trouble running Ollama with GPU support on Windows with Docker Desktop:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Docker Desktop settings&lt;/li&gt;
&lt;li&gt;Enable WSL 2 backend&lt;/li&gt;
&lt;li&gt;See the &lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/desktop/features/gpu/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker GPU documentation&lt;/a&gt; for more details&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Linux GPU Support&lt;/strong&gt;: If you&amp;rsquo;re having trouble running Ollama with GPU support on Linux, follow the &lt;a class=&#34;link&#34; href=&#34;https://github.com/ollama/ollama/blob/main/docs/docker.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ollama Docker instructions&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;-recommended-reading&#34;&gt;👓 Recommended reading
&lt;/h2&gt;&lt;p&gt;n8n is full of useful content for getting started quickly with its AI concepts
and nodes. If you run into an issue, go to &lt;a class=&#34;link&#34; href=&#34;#support&#34; &gt;support&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.n8n.io/ai-agents/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AI agents for developers: from theory to practice with n8n&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/advanced-ai/intro-tutorial/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tutorial: Build an AI workflow in n8n&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/advanced-ai/langchain/langchain-n8n/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Langchain Concepts in n8n&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/advanced-ai/examples/agent-chain-comparison/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Demonstration of key differences between agents and chains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/advanced-ai/examples/understand-vector-databases/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;What are vector databases?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;-video-walkthrough&#34;&gt;🎥 Video walkthrough
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://youtu.be/pOsO40HSbOo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cole&amp;rsquo;s Guide to the Local AI Starter Kit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;-more-ai-templates&#34;&gt;🛍️ More AI templates
&lt;/h2&gt;&lt;p&gt;For more AI workflow ideas, visit the &lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/?categories=AI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;official n8n AI template
gallery&lt;/strong&gt;&lt;/a&gt;. From each workflow,
select the &lt;strong&gt;Use workflow&lt;/strong&gt; button to automatically import the workflow into
your local n8n instance.&lt;/p&gt;
&lt;h3 id=&#34;learn-ai-key-concepts&#34;&gt;Learn AI key concepts
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/1954-ai-agent-chat/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AI Agent Chat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/2026-ai-chat-with-any-data-source-using-the-n8n-workflow-tool/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AI chat with any data source (using the n8n workflow too)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/2098-chat-with-openai-assistant-by-adding-a-memory/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chat with OpenAI Assistant (by adding a memory)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/1980-use-an-open-source-llm-via-huggingface/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Use an open-source LLM (via HuggingFace)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/2165-chat-with-pdf-docs-using-ai-quoting-sources/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chat with PDF docs using AI (quoting sources)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/2006-ai-agent-that-can-scrape-webpages/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AI agent that can scrape webpages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;local-ai-templates&#34;&gt;Local AI templates
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/2341-build-a-tax-code-assistant-with-qdrant-mistralai-and-openai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tax Code Assistant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/2339-breakdown-documents-into-study-notes-using-templating-mistralai-and-qdrant/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Breakdown Documents into Study Notes with MistralAI and Qdrant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/2335-build-a-financial-documents-assistant-using-qdrant-and-mistralai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Financial Documents Assistant using Qdrant and&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://mistral.ai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt; Mistral.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://n8n.io/workflows/2333-recipe-recommendations-with-qdrant-and-mistral/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Recipe Recommendations with Qdrant and Mistral&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tips--tricks&#34;&gt;Tips &amp;amp; tricks
&lt;/h2&gt;&lt;h3 id=&#34;accessing-local-files&#34;&gt;Accessing local files
&lt;/h3&gt;&lt;p&gt;The self-hosted AI starter kit will create a shared folder (by default,
located in the same directory) which is mounted to the n8n container and
allows n8n to access files on disk. This folder within the n8n container is
located at &lt;code&gt;/data/shared&lt;/code&gt; &amp;ndash; this is the path you’ll need to use in nodes that
interact with the local filesystem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nodes that interact with the local filesystem&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filesreadwrite/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Read/Write Files from Disk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.localfiletrigger/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Local File Trigger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executecommand/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Execute Command&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;license&#34;&gt;📜 License
&lt;/h2&gt;&lt;p&gt;This project (originally created by the n8n team, link at the top of the README) is licensed under the Apache License 2.0 - see the
&lt;a class=&#34;link&#34; href=&#34;LICENSE&#34; &gt;LICENSE&lt;/a&gt; file for details.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>3rd-devs</title>
        <link>https://producthunt.programnotes.cn/en/p/3rd-devs/</link>
        <pubDate>Thu, 15 May 2025 15:30:07 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/3rd-devs/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1666548004110-c1afb19c1582?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NDcyOTQxMjN8&amp;ixlib=rb-4.1.0" alt="Featured image of post 3rd-devs" /&gt;&lt;h1 id=&#34;i-am-alice3rd-devs&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/i-am-alice/3rd-devs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;i-am-alice/3rd-devs&lt;/a&gt;
&lt;/h1&gt;&lt;h1 id=&#34;ai_devs-3&#34;&gt;AI_devs 3
&lt;/h1&gt;&lt;p&gt;Repozytorium zawiera przykłady z lekcji kursu AI_devs 3.
Więcej informacji znajdziesz na &lt;a class=&#34;link&#34; href=&#34;https://aidevs.pl&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;aidevs.pl&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;wymagania&#34;&gt;Wymagania
&lt;/h2&gt;&lt;p&gt;Wszystkie przykłady zostały napisane w JavaScript / TypeScript i większość z nich zawiera kod backendowy do którego uruchomienia potrzebny jest Node.js oraz Bun.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://nodejs.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bun.sh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bun&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Upewnij się, że posiadasz najnowsze wersje Node.js oraz Bun zainstalowane na swoim komputerze.&lt;/p&gt;
&lt;h2 id=&#34;instalacja&#34;&gt;Instalacja
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Pobierz repozytorium:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone git@github.com:i-am-alice/3rd-devs.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; 3rd-devs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zainstaluj zależności:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Skopiuj plik &lt;code&gt;.env.example&lt;/code&gt; do &lt;code&gt;.env&lt;/code&gt; i wypełnij go kluczami API (na początek wystarczy klucz OpenAI).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uruchom dostępne przykłady z pliku &lt;code&gt;package.json&lt;/code&gt;, według poniższej instrukcji.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;instalacja--docker&#34;&gt;Instalacja — DOCKER
&lt;/h2&gt;&lt;p&gt;Jeśli posiadasz w swoim systemie możliwość uruchamiania kontenerów Dockera (na Windows użyj np. WSL/WSL2), możesz wykorzystać skrypt, który zbuduje i uruchomi dla Ciebie kontener ze środowiskiem gotowym do pracy.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Wejdź do katalogu, w którym chcesz przetrzymywać pliki środowiska i wydaj następujące polecenia:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://env.ag3nts.org -o setup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash setup.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Powyższy skrypt NIE zmienia niczego w systemie. Wykonuje on następujące czynności:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;klonowanie repozytorium do katalogu &amp;ldquo;3rd-devs&amp;rdquo; (poza kontenerem, w aktualnym katalogu)&lt;/li&gt;
&lt;li&gt;przygotowanie pliku Dockerfile&lt;/li&gt;
&lt;li&gt;usunięcie starego obrazu Dockera o nazwie &amp;ldquo;aidevs&amp;rdquo; (jeśli istnieje)&lt;/li&gt;
&lt;li&gt;uruchomienie procesu budowy obrazu Dockera&lt;/li&gt;
&lt;li&gt;instalacja wymaganych paczek wewnątrz zdokeryzowanego środowiska&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Po pomyślnym zbudowaniu obrazu możesz uruchomić go poleceniem (jeśli port 3000 masz zajęty, wybierz inny):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm -it -p 3000:3000 --name aidevs -v &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PWD&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;/3rd-devs:/app aidevs3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pliki w katalogu &amp;ldquo;3rd-devs&amp;rdquo; możesz modyfikować w dowolnym IDE. Będą one bezpośrednio widoczne wewnątrz kontenera&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Będąc już wewnątrz kontenera, skopiuj plik &lt;code&gt;.env.example&lt;/code&gt; do &lt;code&gt;.env&lt;/code&gt; i wypełnij go wymaganymi kluczami API (na początek wystarczy klucz OpenAI).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Twoje środowisko jest gotowe do pracy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;s01e01&#34;&gt;S01E01
&lt;/h2&gt;&lt;h3 id=&#34;thread&#34;&gt;Thread
&lt;/h3&gt;&lt;p&gt;Przykład przedstawia konwersację między użytkownikiem i asystentem, w której działa mechanizm podsumowania konwersacji.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun run thread&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja demo: &lt;code&gt;curl -X POST http://localhost:3000/api/demo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja chat: &lt;code&gt;curl -X POST http://localhost:3000/api/chat -H &amp;quot;Content-Type: application/json&amp;quot; -d &#39;{&amp;quot;message&amp;quot;: { &amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Hi&amp;quot;}}&#39;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wywołanie powyższego endpointu uruchomi trzy niezależne zapytania do OpenAI, jednak w wiadomości systemowej zostanie przekazane podsumowanie poprzedniej interakcji, dzięki czemu model będzie miał możliwość odwołać się do ich treści.&lt;/p&gt;
&lt;p&gt;W przykładzie uwzględniony jest także endpoint &lt;code&gt;/api/chat&lt;/code&gt; na który można przesłać obiekt { &amp;ldquo;message&amp;rdquo;: &amp;ldquo;&amp;hellip;&amp;rdquo; } zawierający treść wiadomości do modelu. Wątek zostanie zresetowany &lt;strong&gt;dopiero po ponownym uruchomieniu serwera&lt;/strong&gt; (wciśnij CMD + C / Control + C i ponownie &lt;code&gt;bun run thread&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&#34;use-search&#34;&gt;Use Search
&lt;/h3&gt;&lt;p&gt;UWAGA: przykład wymaga zainstalowania &lt;code&gt;promptfoo&lt;/code&gt; w przypadku którego prawdopodobnie musisz to zrobić poleceniem &lt;code&gt;npm install promptfoo&lt;/code&gt; ponieważ &lt;code&gt;bun install promptfoo&lt;/code&gt; nie działa poprawnie w każdej sytuacji.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie skryptu: &lt;code&gt;bun use_search&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rezultatem działania skryptu jest tablica zawierająca kilkanaście przykładowych testów dla promptu decydującego o tym, czy skorzystanie z wyszukiwarki jest potrzebne.&lt;/p&gt;
&lt;h3 id=&#34;pick-domains&#34;&gt;Pick domains
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie skryptu: &lt;code&gt;bun pick_domains&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rezultatem działania skryptu jest tablica zawierająca kilkanaście przykładowych testów dla promptu generującego zapytania do wyszukiwarki Internetowej, wskazując także odpowiednie domeny.&lt;/p&gt;
&lt;h3 id=&#34;rate&#34;&gt;Rate
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie skryptu: &lt;code&gt;bun rate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rezultatem działania skryptu jest tablica zawierająca kilkanaście przykładowych testów dla promptu oceniającego, czy odpowiedź modelu zawiera odpowiednie informacje.&lt;/p&gt;
&lt;h3 id=&#34;websearch&#34;&gt;Websearch
&lt;/h3&gt;&lt;p&gt;Przykład ten korzysta z &lt;a class=&#34;link&#34; href=&#34;https://www.firecrawl.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Firecrawl&lt;/a&gt; do przeszukiwania Internetu oraz pobierania treści stron www. Konieczne jest więc uzupełnienie pliku &lt;code&gt;.env&lt;/code&gt; wartości FIRECRAWL_API_KEY ustawionej na klucz API.
(Firecrawl oferuje bezpłatny plan).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun websearch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Search wiki for &amp;#39;&lt;/span&gt;John Wick&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ważne: w pliku &lt;code&gt;websearch/app.ts&lt;/code&gt; można zmienić listę domen, które są dopuszczalne do przeszukiwania i pobierania treści.&lt;/p&gt;
&lt;h2 id=&#34;s01e02&#34;&gt;S01E02
&lt;/h2&gt;&lt;h3 id=&#34;linear&#34;&gt;Linear
&lt;/h3&gt;&lt;p&gt;Uruchomienie tego przykładu wymaga uzupełnienia pliku &lt;code&gt;.env&lt;/code&gt; i wartości &lt;code&gt;LINEAR_API_KEY&lt;/code&gt; oraz &lt;code&gt;LINEAR_WEBHOOK_SECRET&lt;/code&gt;.
Obie wartości można znaleźć w &lt;a class=&#34;link&#34; href=&#34;https://linear.app/overment/settings/api&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ustawieniach API&lt;/a&gt;. Dodatkowo Twój localhost musi być dostępny z poza Twojej sieci lokalnej, np. za pomocą &lt;a class=&#34;link&#34; href=&#34;https://ngrok.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ngrok&lt;/a&gt;. Publiczny adres URL należy także wskazać w panelu Linear w sekcji Webhooks, np.: &lt;code&gt;https://&amp;lt;ngrok-url&amp;gt;/api/linear/watch-issue&lt;/code&gt; (pamiętaj o dodaniu właściwego endpointu do adresu).&lt;/p&gt;
&lt;p&gt;WAŻNE: w pliku &lt;code&gt;linear/prompts.ts&lt;/code&gt; znajduje się prompt w którym zostały opisane &lt;strong&gt;moje projekty&lt;/strong&gt; w Linear.
Aby skrypt działał poprawnie, musisz zmodyfikować ten prompt, tak aby zawierał identyfikatory oraz opisy Twoich projektów.&lt;/p&gt;
&lt;p&gt;Listę projektów i ich identyfikatory możesz pobrać korzystając z endpointu &lt;code&gt;/api/linear/projects&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun linear&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pobranie listy projektów: &lt;code&gt;curl http://localhost:3000/api/linear/projects&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Po dodaniu nowego wpisu w Twoim linearze, zostanie on automatycznie przypisany do projektu zgodnie z zasadami w promptach, o ile nie został przypisany przez Ciebie ręcznie.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;files&#34;&gt;Files
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun files&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hey there, what\&amp;#39;&lt;/span&gt;s up?&lt;span class=&#34;s2&#34;&gt;&amp;#34;}], &amp;#34;&lt;/span&gt;conversation_id&lt;span class=&#34;s2&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt;d7582176-bc52-4ef3-980a-047b868f9f49&lt;span class=&#34;s2&#34;&gt;&amp;#34;}&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Przykład ten pokazuje mechanizm podejmowania decyzji o zapamiętywaniu informacji na podstawie kontekstu rozmowy.
Dodatkowo w przypadku podania &lt;code&gt;conversation_id&lt;/code&gt; w obiekcie żądania, do rozmowy zostaną wczytane wszystkie wiadomości dotyczące konkretnej rozmowy.&lt;/p&gt;
&lt;p&gt;Wszystkie pliki zapisywane są w folderze &lt;code&gt;files/context&lt;/code&gt;, a sam katalog można otworzyć w aplikacji &lt;a class=&#34;link&#34; href=&#34;https://obsidian.md/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Obsidian&lt;/a&gt; aby zobaczyć powiązania pomiędzy wspomnieniami.&lt;/p&gt;
&lt;h2 id=&#34;s01e03&#34;&gt;S01E03
&lt;/h2&gt;&lt;h3 id=&#34;langfuse&#34;&gt;Langfuse
&lt;/h3&gt;&lt;p&gt;Ten przykład wymaga uzupełnienia pliku &lt;code&gt;.env&lt;/code&gt; o wartości &lt;code&gt;LANGFUSE_PUBLIC_KEY&lt;/code&gt;, &lt;code&gt;LANGFUSE_SECRET_KEY&lt;/code&gt; oraz &lt;code&gt;LANGFUSE_HOST&lt;/code&gt;. Można je uzyskać zakładając bezpłatne konto na &lt;a class=&#34;link&#34; href=&#34;https://langfuse.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Langfuse&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;UWAGA: Aby uruchomić ten przykład, musisz w panelu Langfuse utworzyć nowy prompt o nazwie &lt;code&gt;Answer&lt;/code&gt;, którego wartość możesz ustawić na np. &amp;lsquo;Odpowiadaj pisząc wyłącznie wielkimi literami&amp;rsquo;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun langfuse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hey there, what\&amp;#39;&lt;/span&gt;s up?&lt;span class=&#34;s2&#34;&gt;&amp;#34;}]}&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Po wykonaniu zapytania, zostanie ono automatycznie zalogowane do Langfuse, a wynik wyświetlony w panelu.&lt;/p&gt;
&lt;h3 id=&#34;tiktokenizer&#34;&gt;Tiktokenizer
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun tiktokenizer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hey there, what\&amp;#39;&lt;/span&gt;s up?&lt;span class=&#34;s2&#34;&gt;&amp;#34;}], &amp;#34;&lt;/span&gt;model&lt;span class=&#34;s2&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt;gpt-4o&lt;span class=&#34;s2&#34;&gt;&amp;#34;}&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Przykład ten pokazuje mechanizm liczenia tokenów w zapytaniach do modeli OpenAI (np. gpt-4o).&lt;/p&gt;
&lt;h3 id=&#34;max-tokens&#34;&gt;Max tokens
&lt;/h3&gt;&lt;p&gt;Przykład ten pokazuje jeden mechanizm pozwalający na kontynuowanie wypowiedzi modelu, pomimo osiągnięcia maksymalnej liczby tokenów wyjściowych (output tokens).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun max_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Write ten sentences about apples and put them in order.&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;constitution&#34;&gt;Constitution
&lt;/h3&gt;&lt;p&gt;Przykład ten przedstawia mechanizm blokowania zapytań, które nie spełniają warunków określonych w prompcie &lt;code&gt;/constitution/prompts.ts&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun constitution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hello!&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s01e04&#34;&gt;S01E04
&lt;/h2&gt;&lt;h3 id=&#34;memory&#34;&gt;Memory
&lt;/h3&gt;&lt;p&gt;Ten przykład po uruchomieniu tworzy katalog memories w którym zapisywane są pliki markdown, pełniące rolę pamięci modelu.
Nie jest to przykład nadający się na produkcję, lecz przedstawia ogólne mechaniki pamięci długoterminowej, które będziemy rozwijać w dalszych lekcjach.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun memory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hello!&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;s01e05&#34;&gt;S01E05
&lt;/h2&gt;&lt;h3 id=&#34;external&#34;&gt;External
&lt;/h3&gt;&lt;p&gt;Ten przykład zawiera standardową logikę interakcji z modelem, ale wymaga podania klucza API w nagłówku &lt;code&gt;Authorization&lt;/code&gt; w formacie &lt;code&gt;Bearer &amp;lt;klucz&amp;gt;&lt;/code&gt;. Wartość klucza zostaje wczytana z pliku &lt;code&gt;.env&lt;/code&gt; jako &lt;code&gt;PERSONAL_API_KEY&lt;/code&gt;. Dodatkowo zostały dodane mechanizmy ograniczania liczby zapytań, więc po kilku próbach ponowne wywołanie zapytania zwróci błąd 429.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun external&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hello!&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;prompts&#34;&gt;Prompts
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;UWAGA&lt;/strong&gt;: Aby uruchomić ten przykład konieczne jest nawiązanie połączenie z Langfuse poprzez uzupełnienie pliku &lt;code&gt;.env&lt;/code&gt; o wartości &lt;code&gt;LANGFUSE_PUBLIC_KEY&lt;/code&gt;, &lt;code&gt;LANGFUSE_SECRET_KEY&lt;/code&gt; oraz &lt;code&gt;LANGFUSE_HOST&lt;/code&gt;. Dodatkowo na Twoim koncie musisz utworzyć nowy prompt o nazwie &lt;code&gt;Answer&lt;/code&gt;, którego wartość możesz ustawić na np. &amp;lsquo;Odpowiadaj pisząc wyłącznie wielkimi literami&amp;rsquo;, aby tylko sprawdzić działanie mechanizmu. Dodatkowo prompt &amp;ldquo;Answer&amp;rdquo; należy dodać w ustawieniu &amp;ldquo;Chat&amp;rdquo;, a nie &amp;ldquo;Text&amp;rdquo; (tryb można zmienić z pomocą zakładek w Langfuse)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun prompts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hello!&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;database&#34;&gt;Database
&lt;/h3&gt;&lt;p&gt;Ten przykład nie dotyczy bezpośrednio działania LLM, lecz przedstawia sposób organizacji informacji w bazie danych, takich jak konwersacje czy historia wiadomości.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun database&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hello!&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;qdrant&#34;&gt;Qdrant
&lt;/h3&gt;&lt;p&gt;Przykład ten przedstawia &lt;strong&gt;absolutnie podstawowe&lt;/strong&gt; połączenie z bazą wektorową Qdrant. Jego zadaniem jest zapisywanie historii wiadomości, a następnie wyszukiwanie i wczytywanie do kontekstu rozmowy najbardziej podobnych wiadomości. Przykład ten będziemy rozbudowywać w dalszych lekcjach, łącząc się z Qdrant w bardziej złożonych konfiguracjach.&lt;/p&gt;
&lt;p&gt;UWAGA: Aby uruchomić ten przykład, musisz w panelu Langfuse utworzyć nowy prompt o nazwie &lt;code&gt;Answer&lt;/code&gt;, którego wartość możesz ustawić na np. &amp;lsquo;Odpowiadaj pisząc wyłącznie wielkimi literami&amp;rsquo;. Powodem jest fakt, że w ten przykład został powiązany z przykładem &lt;code&gt;langfuse&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie serwera: &lt;code&gt;bun qdrant&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST http://localhost:3000/api/chat &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;Hello!&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s02e01&#34;&gt;S02E01
&lt;/h2&gt;&lt;h3 id=&#34;audio&#34;&gt;Audio
&lt;/h3&gt;&lt;p&gt;UWAGA: Ten przykład wymaga uruchomienia frontendu w folderze &lt;code&gt;audio-frontend&lt;/code&gt; oraz backendu w folderze &lt;code&gt;audio-backend&lt;/code&gt;. W związku z tym przykład &lt;strong&gt;trzeba&lt;/strong&gt; uruchomić na własnym komputerze.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie frontendu: &lt;code&gt;bun audio:dev&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Uruchomienie backendu: &lt;code&gt;bun audio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: Otwórz w przeglądarce stronę http://localhost:5173&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WAŻNE: Jakość działania tego przykładu zależy głównie od jakości mikrofonu oraz dźwięków otoczenia. Upewnij się więc, że jakość nagrania jest dobra i że nie ma zakłóceń uniemożliwiających wykrywanie końca wypowiedzi.&lt;/p&gt;
&lt;h2 id=&#34;s02e02&#34;&gt;S02E02
&lt;/h2&gt;&lt;h3 id=&#34;vision&#34;&gt;Vision
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun vision&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;recognize&#34;&gt;Recognize
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun recognize&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;recognize-pixtral&#34;&gt;Recognize-Pixtral
&lt;/h3&gt;&lt;p&gt;Do uruchomienia tego przykładu należy uzupełnić plik &lt;code&gt;.env&lt;/code&gt; o wartość &lt;code&gt;MISTRAL_API_KEY&lt;/code&gt;. Można go pobrać tutaj na &lt;a class=&#34;link&#34; href=&#34;https://auth.mistral.ai/ui/login?flow=d2707d87-5325-4ff5-a7cd-25a2e21323d5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Mistral.ai&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun recognize_pixtral&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s02e02-1&#34;&gt;S02E02
&lt;/h2&gt;&lt;h3 id=&#34;vision-1&#34;&gt;Vision
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun vision&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na pliku &lt;code&gt;vision/lessons.png&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;recognize-1&#34;&gt;Recognize
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun recognize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na plikach z katalogu &lt;code&gt;recognize/avatars&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;recognize-pixtral-1&#34;&gt;Recognize-Pixtral
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun recognize_pixtral&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na plikach z katalogu &lt;code&gt;recognize_pixtral/avatars&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s02e03&#34;&gt;S02E03
&lt;/h2&gt;&lt;p&gt;&amp;mdash; brak przykładów &amp;mdash;&lt;/p&gt;
&lt;h2 id=&#34;s02e04&#34;&gt;S02E04
&lt;/h2&gt;&lt;h3 id=&#34;captions&#34;&gt;Captions
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun captions&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na pliku &lt;code&gt;captions/article.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;summary&#34;&gt;Summary
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun summary&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: skrypt wykonuje się automatycznie na pliku &lt;code&gt;summary/article.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;video&#34;&gt;Video
&lt;/h3&gt;&lt;p&gt;Do uruchomienia tego przykładu należy uzupełnić plik &lt;code&gt;.env&lt;/code&gt; o wartość &lt;code&gt;GOOGLE_AI_STUDIO_API_KEY&lt;/code&gt;, który można pobrać z &lt;a class=&#34;link&#34; href=&#34;https://aistudio.google.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google AI Studio&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun video&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na pliku &lt;code&gt;video/test.mp3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;narration&#34;&gt;Narration
&lt;/h3&gt;&lt;p&gt;UWAGA: Ten przykład może zużywać duże ilości kredytów na ElevenLabs, więc jeśli chcesz zobaczyć rezultat jego działania, to w katalogu &lt;code&gt;narration&lt;/code&gt; znajdują się dwa przykładowe pliki audio, które możesz odtworzyć bez uruchamiania kodu.&lt;/p&gt;
&lt;p&gt;Do uruchomienia tego przykładu należy uzupełnić plik &lt;code&gt;.env&lt;/code&gt; o wartość &lt;code&gt;GOOGLE_AI_STUDIO_API_KEY&lt;/code&gt;, który można pobrać z &lt;a class=&#34;link&#34; href=&#34;https://aistudio.google.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google AI Studio&lt;/a&gt; oraz &lt;code&gt;ELEVEN_LABS_API_KEY&lt;/code&gt;, który można pobrać z &lt;a class=&#34;link&#34; href=&#34;https://elevenlabs.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ElevenLabs&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun narration&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na treści wiadomości użytkownika przekazanej w funkcji &lt;code&gt;generateNarration&lt;/code&gt; w pliku &lt;code&gt;narration/app.ts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s02e05&#34;&gt;S02E05
&lt;/h2&gt;&lt;h3 id=&#34;read&#34;&gt;Read
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na pliku &lt;code&gt;read/article.md&lt;/code&gt; i generuje plik audio w folderze read/summary.wav&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;mindmap&#34;&gt;Mindmap
&lt;/h3&gt;&lt;p&gt;Ten przykład wymaga uruchomienia frontendu w folderze &lt;code&gt;audio-map-frontend&lt;/code&gt; oraz backendu w folderze &lt;code&gt;audio-map&lt;/code&gt;. W związku z tym przykład &lt;strong&gt;trzeba&lt;/strong&gt; uruchomić na własnym komputerze.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie frontendu: &lt;code&gt;bun map:dev&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Uruchomienie backendu: &lt;code&gt;bun audio-map&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: Otwórz w przeglądarce stronę http://localhost:5173&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;notes&#34;&gt;Notes
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun notes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na wiadomości wpisanej w treść pliku &lt;code&gt;notes/app.ts&lt;/code&gt; (jest tam kilka przykładów innych wiadomości, które można podmienić).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s03e01&#34;&gt;S03E01
&lt;/h2&gt;&lt;h3 id=&#34;text-splitter&#34;&gt;Text Splitter
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun text-splitter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na plikach markdown z katalogu &amp;ldquo;text-splitter&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;unstructured&#34;&gt;Unstructured
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun unstructured&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na pliku source.md z katalogu &amp;ldquo;unstructured&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s03e02&#34;&gt;S03E02
&lt;/h2&gt;&lt;h3 id=&#34;embedding&#34;&gt;Embedding
&lt;/h3&gt;&lt;p&gt;Uruchomienie tego przykładu wymaga uzupełnienia pliku &lt;code&gt;.env&lt;/code&gt; o wartości &amp;ldquo;QDRANT_URL&amp;rdquo; oraz &amp;ldquo;QDRANT_API_KEY&amp;rdquo;.
Wartości te można znaleźć w panelu Qdrant po zalogowaniu na bezpłatne konto na stronie &lt;a class=&#34;link&#34; href=&#34;https://cloud.qdrant.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Qdrant Cloud&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloud.overment.com/aidevs3_cluster-1732010353.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Qdrant Cloud&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Natomiast klucz API można pobrać w zakładce &amp;ldquo;Data Access Control&amp;rdquo;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun embedding&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku embedding/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rerank&#34;&gt;Rerank
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun rerank&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku rerank/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;naive-rag&#34;&gt;Naive RAG
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun naive-rag&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku naive-rag/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;better-rag&#34;&gt;Better RAG
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun better-rag&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku better-rag/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;semantic&#34;&gt;Semantic
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun semantic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku semantic/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s03e03&#34;&gt;S03E03
&lt;/h2&gt;&lt;h3 id=&#34;algolia&#34;&gt;Algolia
&lt;/h3&gt;&lt;p&gt;Do uruchomienia tego przykładu konieczne jest uzupełnienie &lt;code&gt;ALGOLIA_APP_ID&lt;/code&gt; oraz &lt;code&gt;ALGOLIA_API_KEY&lt;/code&gt; w pliku &lt;code&gt;.env&lt;/code&gt;.
&lt;strong&gt;UWAGA&lt;/strong&gt;: przy pierwszym uruchomieniu przykładu pojawi się błąd ale spowoduje to utworzenie indeksu w Algolia. Wówczas należy przejść do panelu Algolia i w zakładce &amp;ldquo;Facets&amp;rdquo; dodać nowy facet o nazwie &lt;code&gt;author&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloud.overment.com/2024-11-20/aidevs3_algolia-09eeb970-2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun algolia&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku algolia/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;sync&#34;&gt;Sync
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;UWAGA&lt;/strong&gt;: Do uruchomienia tego przykładu konieczne jest uzupełnienie &lt;code&gt;ALGOLIA_APP_ID&lt;/code&gt; oraz &lt;code&gt;ALGOLIA_API_KEY&lt;/code&gt; w pliku &lt;code&gt;.env&lt;/code&gt;.
Wymagane jest bezpłatne konto na &lt;a class=&#34;link&#34; href=&#34;https://www.algolia.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Algolia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dodatkowo jeśli wyniki wyszukiwania nie są poprawnie zwracane, należy sprawdzić czy pole &lt;code&gt;text&lt;/code&gt; zostało poprawnie ustawione w panelu Algolia jako &lt;code&gt;searchableAttributes&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloud.overment.com/2024-11-19/aidevs3_cleanshot-3e7fd444-c.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Algolia&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun sync&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku sync/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;hybrid&#34;&gt;Hybrid
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;UWAGA&lt;/strong&gt;: Do uruchomienia tego przykładu konieczne jest uzupełnienie &lt;code&gt;QDRANT_URL&lt;/code&gt; oraz &lt;code&gt;QDRANT_API_KEY&lt;/code&gt; w pliku &lt;code&gt;.env&lt;/code&gt;.
Konieczne jest także połączenie z Algolia podobnie jak w przypadku przykładu &lt;code&gt;sync&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun hybrid&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku hybrid/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s03e05&#34;&gt;S03E05
&lt;/h2&gt;&lt;p&gt;Do uruchomienia tego przykładu konieczne jest połączenie z bazą Neo4j. Można ją zainstalować lokalnie, a następnie uzupełnić plik &lt;code&gt;.env&lt;/code&gt; o wartości &lt;code&gt;NEO4J_URI&lt;/code&gt;, &lt;code&gt;NEO4J_USER&lt;/code&gt; oraz &lt;code&gt;NEO4J_PASSWORD&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;neo4j-101&#34;&gt;Neo4j-101
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun neo4j-101&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku neo4j-101/app.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;neo4j&#34;&gt;Neo4j
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uruchomienie kodu: &lt;code&gt;bun neo4j&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interakcja: przykład wykonuje się automatycznie na danych osadzonych w pliku neo4j/app.ts&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
