[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"navigation":3,"url-settings":80,"blog-\u002Fblog\u002Fhow-to-build-a-copilot-using-local-llms-with-pieces-client":589,"blog-author-\u002Fblog\u002Fhow-to-build-a-copilot-using-local-llms-with-pieces-client":1167},{"id":4,"extension":5,"footer":6,"header":66,"meta":77,"stem":78,"__hash__":79},"navigation\u002Fdata\u002Fshared\u002Fnavigation.yml","yml",{"brand":7,"columns":10,"legal":56},{"name":8,"tagline":9},"Pieces","The memory layer for modern work.",[11,26,41],{"title":12,"links":13},"Product",[14,17,21,24],{"label":15,"href":16},"Pieces Desktop","\u002Fdownloads",{"label":18,"href":19,"external":20},"Pieces MCP","url:docs.mcp.overview",true,{"label":22,"href":23,"external":20},"Pieces APIs","url:docs.api",{"label":25,"href":16},"Downloads",{"title":27,"links":28},"Resources",[29,32,35,38],{"label":30,"href":31,"external":20},"Documentation","url:docs.home",{"label":33,"href":34},"Blog","\u002Fblog",{"label":36,"href":37},"Changelog","\u002Fchangelog",{"label":39,"href":40,"external":20},"GitHub","url:github.org",{"title":42,"links":43},"Company",[44,47,50,53],{"label":45,"href":46},"About","\u002Fabout",{"label":48,"href":49},"Enterprise","\u002Fenterprise",{"label":51,"href":52,"external":20},"Discord","url:social.discord",{"label":54,"href":55,"external":20},"X \u002F Twitter","url:social.x",[57,60,63],{"label":58,"href":59,"external":20},"Privacy Policy","url:legal.privacyPolicy",{"label":61,"href":62,"external":20},"Refund Policy","url:legal.refundPolicy",{"label":64,"href":65,"external":20},"Terms of Service","url:legal.terms",{"links":67,"signIn":68,"contact":71,"cta":74},[],{"label":69,"href":70},"Sign in","url:portal.home",{"label":72,"href":73},"Contact sales","url:site.contact",{"label":75,"href":76},"Download","url:routes.downloads",{},"data\u002Fshared\u002Fnavigation","Ia8tCWWqcGvuaIro8jwZ3HH-MwI66yqJpWshASJdYQ0",{"id":81,"extension":5,"links":82,"meta":586,"stem":587,"__hash__":588},"urlSettings\u002Fdata\u002Fshared\u002Furls.yml",[83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,238,242,246,249,253,257,261,265,269,273,277,281,285,289,293,297,301,305,309,313,317,321,325,329,333,337,341,345,349,353,357,361,365,369,373,377,381,385,389,393,396,400,404,408,412,416,420,423,426,429,432,436,440,444,448,452,456,460,464,468,472,476,480,484,488,492,495,499,503,507,511,515,519,523,527,531,534,538,542,546,550,553,557,561,565,568,571,575,579,582],{"key":84,"label":85,"href":86},"downloads.desktop","Desktop download page","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdownload",{"key":88,"label":89,"href":90},"downloads.macOS.dmgArm64","macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg-arm64\u002Fdownload",{"key":92,"label":93,"href":94},"downloads.macOS.dmgIntel","macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg\u002Fdownload",{"key":96,"label":97,"href":98},"downloads.macOS.pkg","macOS PKG","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg\u002Fdownload",{"key":100,"label":101,"href":102},"downloads.windows.appinstaller","Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fpieces_for_x.appinstaller",{"key":104,"label":105,"href":106},"downloads.windows.exe","Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-exe\u002Fdownload",{"key":108,"label":109,"href":110},"downloads.windows.suiteManager","Windows Suite Manager","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_suite_windows\u002Fappinstaller\u002Fdownload",{"key":112,"label":113,"href":114},"downloads.linux.flatpakRepo","Linux Flatpak repository","https:\u002F\u002Fbuilds.pieces.app\u002Fpieces-flatpak-repo\u002Fpieces-flatpak.flatpakrepo",{"key":116,"label":117,"href":118},"downloads.linux.snapDesktop","Linux Snap Desktop","https:\u002F\u002Fsnapcraft.io\u002Fpieces-for-developers",{"key":120,"label":121,"href":122},"downloads.linux.snapPiecesOS","Linux Snap PiecesOS","https:\u002F\u002Fsnapcraft.io\u002Fpieces-os",{"key":124,"label":125,"href":126},"downloads.piecesOS.macOS.dmgArm64","PiecesOS macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg-arm64\u002Fdownload",{"key":128,"label":129,"href":130},"downloads.piecesOS.macOS.dmgIntel","PiecesOS macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg\u002Fdownload",{"key":132,"label":133,"href":134},"downloads.piecesOS.windows.appinstaller","PiecesOS Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fos_server.appinstaller",{"key":136,"label":137,"href":138},"downloads.piecesOS.windows.exe","PiecesOS Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-exe\u002Fdownload",{"key":140,"label":141,"href":142},"downloads.guides.macOS","macOS installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fmacos-installation-guide",{"key":144,"label":145,"href":146},"downloads.guides.windows","Windows installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fwindows-installation-guide",{"key":148,"label":149,"href":150},"downloads.guides.linux","Linux installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide",{"key":152,"label":153,"href":154},"downloads.guides.piecesOS","PiecesOS manual installation","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fmanual-installation",{"key":156,"label":157,"href":158},"extensions.chrome","Chrome extension","https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Fpieces-save-code-snippets\u002Figbgibhbfonhmjlechmeefimncpekepm",{"key":160,"label":161,"href":162},"extensions.firefox","Firefox add-on","https:\u002F\u002Faddons.mozilla.org\u002Fen-US\u002Ffirefox\u002Faddon\u002Fpieces-save-code-from-the-web\u002F",{"key":164,"label":165,"href":166},"extensions.edge","Edge add-on","https:\u002F\u002Fmicrosoftedge.microsoft.com\u002Faddons\u002Fdetail\u002Fpieces-save-code-snippet\u002Fhglfimcdgonaeeobjckfdabcldfidmim",{"key":168,"label":169,"href":170},"extensions.vscode","VS Code extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.pieces-vscode",{"key":172,"label":173,"href":174},"extensions.visualStudio","Visual Studio extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.PiecesVisualStudio",{"key":176,"label":177,"href":178},"extensions.jetbrains","JetBrains plugin","https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F17328-pieces--save-search-share--reuse-code-snippets",{"key":180,"label":181,"href":182},"extensions.obsidian","Obsidian plugin","https:\u002F\u002Fobsidian.md\u002Fplugins?id=pieces-for-developers",{"key":184,"label":185,"href":186},"extensions.sublime","Sublime package","https:\u002F\u002Fpackagecontrol.io\u002Fpackages\u002FPieces",{"key":188,"label":189,"href":190},"extensions.neovim","Neovim plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neo_vim",{"key":192,"label":193,"href":194},"extensions.jupyterlab","JupyterLab plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fjupyterlab-pieces",{"key":196,"label":197,"href":198},"extensions.cli","Pieces CLI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fpieces-cli\u002F",{"key":200,"label":201,"href":202},"docs.home","Documentation home","https:\u002F\u002Fdocs.pieces.app",{"key":204,"label":205,"href":206},"docs.getStarted","Get started docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces",{"key":208,"label":209,"href":210},"docs.api","API docs","https:\u002F\u002Fdocs.pieces.app\u002Fapi",{"key":212,"label":213,"href":214},"docs.desktop.overview","Desktop overview","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop",{"key":216,"label":217,"href":218},"docs.desktop.onboarding","Desktop onboarding","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fonboarding",{"key":220,"label":221,"href":222},"docs.desktop.timeline","Desktop timeline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Ftimeline",{"key":224,"label":225,"href":226},"docs.desktop.summaries","Desktop summaries docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fsingle-click-summaries",{"key":228,"label":229,"href":230},"docs.desktop.search","Desktop conversational search docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconversational-search",{"key":232,"label":233,"href":234},"docs.desktop.drive","Desktop drive docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdrive",{"key":236,"label":237,"href":86},"docs.desktop.download","Desktop download docs",{"key":239,"label":240,"href":241},"docs.piecesOS.overview","PiecesOS overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies",{"key":243,"label":244,"href":245},"docs.piecesOS.details","PiecesOS details docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os",{"key":247,"label":248,"href":154},"docs.piecesOS.install","PiecesOS install docs",{"key":250,"label":251,"href":252},"docs.piecesOS.quickMenu","PiecesOS quick menu docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fquick-menu",{"key":254,"label":255,"href":256},"docs.piecesOS.storage","On-device storage docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fon-device-storage",{"key":258,"label":259,"href":260},"docs.piecesOS.troubleshooting","PiecesOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Ftroubleshooting",{"key":262,"label":263,"href":264},"docs.mcp.overview","MCP overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp",{"key":266,"label":267,"href":268},"docs.mcp.cursor","MCP Cursor docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcursor",{"key":270,"label":271,"href":272},"docs.mcp.vscode","MCP VS Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fvs-code",{"key":274,"label":275,"href":276},"docs.mcp.claudeDesktop","MCP Claude Desktop docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-desktop",{"key":278,"label":279,"href":280},"docs.mcp.claudeCode","MCP Claude Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-code",{"key":282,"label":283,"href":284},"docs.mcp.claudeCowork","MCP Claude Cowork docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-cowork",{"key":286,"label":287,"href":288},"docs.mcp.githubCopilot","MCP GitHub Copilot docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgithub-copilot",{"key":290,"label":291,"href":292},"docs.mcp.goose","MCP Goose docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoose",{"key":294,"label":295,"href":296},"docs.mcp.windsurf","MCP Windsurf docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fwindsurf",{"key":298,"label":299,"href":300},"docs.mcp.zed","MCP Zed docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fzed",{"key":302,"label":303,"href":304},"docs.mcp.jetbrains","MCP JetBrains docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fjetbrains-ides",{"key":306,"label":307,"href":308},"docs.mcp.continueDev","MCP Continue docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcontinue-dev",{"key":310,"label":311,"href":312},"docs.mcp.cline","MCP Cline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcline",{"key":314,"label":315,"href":316},"docs.mcp.raycast","MCP Raycast docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fraycast",{"key":318,"label":319,"href":320},"docs.mcp.rovoDevCli","MCP Rovo Dev CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Frovo-dev-cli",{"key":322,"label":323,"href":324},"docs.mcp.openaiCodexCli","MCP OpenAI Codex CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenai-codex-cli",{"key":326,"label":327,"href":328},"docs.mcp.googleGeminiCli","MCP Google Gemini CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoogle-gemini-cli",{"key":330,"label":331,"href":332},"docs.mcp.amazonQ","MCP Amazon Q docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Famazon-q-developer",{"key":334,"label":335,"href":336},"docs.mcp.chatgptDev","MCP ChatGPT Developer Mode docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fchatgpt-developer-mode",{"key":338,"label":339,"href":340},"docs.mcp.openclaw","MCP OpenClaw docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenclaw",{"key":342,"label":343,"href":344},"docs.mcp.mcpRemote","MCP Remote docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fmcp-remote",{"key":346,"label":347,"href":348},"docs.mcp.ngrok","MCP ngrok docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fngrok-setup",{"key":350,"label":351,"href":352},"docs.troubleshooting.macOS","macOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fmacos",{"key":354,"label":355,"href":356},"docs.troubleshooting.windows","Windows troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fwindows",{"key":358,"label":359,"href":360},"docs.troubleshooting.linux","Linux troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Flinux",{"key":362,"label":363,"href":364},"docs.privacy","Privacy and security docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fprivacy-security-your-data",{"key":366,"label":367,"href":368},"docs.support","Support docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fsupport",{"key":370,"label":371,"href":372},"portal.home","Pieces portal","https:\u002F\u002Fportal.pieces.app",{"key":374,"label":375,"href":376},"site.home","Website home","https:\u002F\u002Fpieces.app",{"key":378,"label":379,"href":380},"site.about","About page","https:\u002F\u002Fpieces.app\u002Fabout",{"key":382,"label":383,"href":384},"site.features","Features page","https:\u002F\u002Fpieces.app\u002Ffeatures",{"key":386,"label":387,"href":388},"site.plugins","Plugins page","https:\u002F\u002Fpieces.app\u002Fplugins",{"key":390,"label":391,"href":392},"site.contact","Contact page","https:\u002F\u002Fpieces.app\u002Fcontact",{"key":394,"label":36,"href":395},"site.changelog","https:\u002F\u002Fpieces.app\u002Fchangelog",{"key":397,"label":398,"href":399},"site.news","News","https:\u002F\u002Fpieces.app\u002Fnews",{"key":401,"label":402,"href":403},"site.events","Community events","https:\u002F\u002Fpieces.app\u002Fcommunity\u002Fevents",{"key":405,"label":406,"href":407},"site.userStories","User stories","https:\u002F\u002Fpieces.app\u002Fuser-stories",{"key":409,"label":410,"href":411},"site.academy","Academy","https:\u002F\u002Fpieces.app\u002Flearn\u002Facademy",{"key":413,"label":414,"href":415},"site.support","Website support","https:\u002F\u002Fpieces.app\u002Fsupport",{"key":417,"label":418,"href":419},"site.standup","Standup","https:\u002F\u002Fpieces.app\u002Fstandup",{"key":421,"label":33,"href":422},"site.blog","https:\u002F\u002Fcode.pieces.app\u002Fblog",{"key":424,"label":51,"href":425},"social.discord","https:\u002F\u002Fdiscord.gg\u002Fgetpieces",{"key":427,"label":54,"href":428},"social.x","https:\u002F\u002Fx.com\u002Fgetpieces",{"key":430,"label":431,"href":428},"social.twitter","Twitter",{"key":433,"label":434,"href":435},"social.instagram","Instagram","https:\u002F\u002Fwww.instagram.com\u002Fgetpieces\u002F",{"key":437,"label":438,"href":439},"social.tiktok","TikTok","https:\u002F\u002Fwww.tiktok.com\u002F@getpieces",{"key":441,"label":442,"href":443},"social.linkedin","LinkedIn","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fgetpieces\u002F",{"key":445,"label":446,"href":447},"social.youtube","YouTube","https:\u002F\u002Fyoutube.com\u002F@getpieces",{"key":449,"label":450,"href":451},"github.org","GitHub organization","https:\u002F\u002Fgithub.com\u002Fpieces-app",{"key":453,"label":454,"href":455},"github.support","GitHub support","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport",{"key":457,"label":458,"href":459},"github.issues","GitHub issues","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fissues",{"key":461,"label":462,"href":463},"github.discussions","GitHub discussions","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fdiscussions",{"key":465,"label":466,"href":467},"github.documentation","GitHub documentation","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fdocumentation",{"key":469,"label":470,"href":471},"github.opensource","GitHub open source","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fopensource",{"key":473,"label":474,"href":475},"github.sdks.python","Python SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-python",{"key":477,"label":478,"href":479},"github.sdks.typescript","TypeScript SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-typescript",{"key":481,"label":482,"href":483},"github.sdks.dart","Dart SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-dart",{"key":485,"label":486,"href":487},"github.sdks.kotlin","Kotlin SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-kotlin",{"key":489,"label":490,"href":491},"github.plugins.obsidian","Obsidian plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fobsidian-pieces",{"key":493,"label":494,"href":194},"github.plugins.jupyterlab","JupyterLab plugin repository",{"key":496,"label":497,"href":498},"github.plugins.sublime","Sublime plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_sublime",{"key":500,"label":501,"href":502},"github.plugins.neovim","Neovim plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neovim",{"key":504,"label":505,"href":506},"github.cliAgent","CLI agent repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fcli-agent",{"key":508,"label":509,"href":510},"github.mcpDart","MCP Dart repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fmcp_dart",{"key":512,"label":513,"href":514},"github.awesomePieces","Awesome Pieces repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fawesome-pieces",{"key":516,"label":517,"href":518},"legal.privacyPolicy","Privacy policy","https:\u002F\u002Fpieces.app\u002Flegal\u002Fprivacy-policy",{"key":520,"label":521,"href":522},"legal.refundPolicy","Refund policy","https:\u002F\u002Fpieces.app\u002Flegal\u002Frefund-policy",{"key":524,"label":525,"href":526},"legal.terms","Terms","https:\u002F\u002Fpieces.app\u002Flegal\u002Fterms",{"key":528,"label":529,"href":530},"legal.security","Legal security","https:\u002F\u002Fpieces.app\u002Flegal\u002Fsecurity",{"key":532,"label":533,"href":447},"videos.youtubeChannel","YouTube channel",{"key":535,"label":536,"href":537},"videos.gettingStartedDesktop","Getting started desktop video","https:\u002F\u002Fyoutu.be\u002FdUr1lRM_TYk",{"key":539,"label":540,"href":541},"videos.snippetDiscovery","Snippet discovery video","https:\u002F\u002Fyoutu.be\u002FG6vb1USw-30",{"key":543,"label":544,"href":545},"sales.bookACall","Book a sales call","https:\u002F\u002Fcalendar.app.google\u002FWVUDtUfNy5Vst3sH7",{"key":547,"label":548,"href":549},"sales.enterprise","Enterprise form","https:\u002F\u002Fgetpieces.typeform.com\u002Fto\u002FaVQFTvpE",{"key":551,"label":552,"href":463},"sales.feedback","Feedback discussions",{"key":554,"label":555,"href":556},"sales.earlyAccess","Early access form","https:\u002F\u002Fgetpieces.typeform.com\u002Fearlyaccess",{"key":558,"label":559,"href":560},"sales.supportEmail","Support email","mailto:support@pieces.app",{"key":562,"label":563,"href":564},"routes.home","Home route","\u002F",{"key":566,"label":567,"href":46},"routes.about","About route",{"key":569,"label":570,"href":16},"routes.downloads","Downloads route",{"key":572,"label":573,"href":574},"routes.pricing","Pricing route","\u002Fpricing",{"key":576,"label":577,"href":578},"routes.security","Security route","\u002Fsecurity",{"key":580,"label":581,"href":49},"routes.enterprise","Enterprise route",{"key":583,"label":584,"href":585},"routes.thankYou","Thank you \u002F download route","\u002Fthank-you",{},"data\u002Fshared\u002Furls","P27xKEauu8D-8sfyr0wR4giF0teFSaCuAQ8kgcICQdI",{"id":590,"title":591,"author":592,"authorPhoto":593,"authorPhotoAlt":594,"authorSlug":595,"body":596,"buttonText":1154,"buttonUrl":1154,"category":1155,"date":1156,"description":1157,"draft":1158,"editorsPick":1158,"extension":1159,"featured":1158,"image":1160,"imageAlt":1161,"meta":1162,"navigation":20,"ogImage":1154,"ogImageAlt":1154,"path":1163,"seo":1164,"stem":1165,"tags":1154,"__hash__":1166},"blog\u002Fblog\u002Fhow-to-build-a-copilot-using-local-llms-with-pieces-client.md","How to Build a Copilot Using Local Large Language Models with Pieces Client","The Pieces Team","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fannouncing-the-pieces-visual-studio-extension\u002Fauthor.png","Pieces logo.","the-pieces-team",{"type":597,"value":598,"toc":1140},"minimark",[599,621,630,635,650,654,669,672,676,679,701,704,707,718,725,728,735,738,742,753,759,765,787,798,804,810,817,823,829,844,850,856,863,866,873,877,880,887,893,899,913,919,925,930,940,946,952,969,984,987,993,999,1003,1013,1024,1041,1047,1053,1056,1062,1066,1077,1087,1093,1099,1106,1109,1113,1116,1124,1127],[600,601,602,603,607,608,607,617,620],"p",{},"In this article, we’ll walk you through how to change between different Large Language Models (LLMs) such as GPT 3.5\u002F4 that are in the cloud and how to properly ",[604,605,606],"strong",{},"download"," ",[609,610,614],"a",{"href":611,"rel":612},"https:\u002F\u002Fpieces.app\u002Fblog\u002Flocal-large-language-models-lllms-and-copilot-integrations",[613],"nofollow",[604,615,616],{},"Local Large Language Models",[604,618,619],{},"like Mistral and Llama2 7B and use them entirely on-device,"," all through the Pieces OS Client. At the end of this series, you’ll learn how to build a copilot using Open Source by Pieces.",[600,622,623,624,629],{},"You can download the ",[609,625,628],{"href":626,"rel":627},"https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-copilot-vanilla-typescript-example",[613],"Pieces Vanilla Typescript Project"," repo to take a look at the example code.",[631,632,634],"h2",{"id":633},"prerequisites","Prerequisites",[600,636,637,638,643,644,649],{},"We suggest reading ",[609,639,642],{"href":640,"rel":641},"https:\u002F\u002Fpieces.app\u002Fblog\u002Fbuild-your-own-copilot-in-less-than-10-minutes-with-pieces-os-client",[613],"the first article in this series"," if you haven’t already, and you will need to install ",[609,645,648],{"href":646,"rel":647},"https:\u002F\u002Fdocs.pieces.app\u002Finstallation-getting-started\u002Fpieces-os",[613],"Pieces OS",".",[631,651,653],{"id":652},"understanding-the-models","Understanding the Models",[600,655,656,657,662,663,668],{},"When chatting with generative AI tools like ",[609,658,661],{"href":659,"rel":660},"https:\u002F\u002Fpieces.app\u002Fblog\u002Fpieces-developers-chatgpt",[613],"ChatGPT or Pieces Copilot",", these tools run on a specific large language model (LLM)— it could be Mistral, Llama2, GPT-4, or any of the other models that are introduced to the market nearly daily. Each model brings a new perspective to the LLM environment. With Pieces OS Client, you gain access to many of these models and can switch between them as you want or need to as you move between tasks in your day. If you're wondering ",[609,664,667],{"href":665,"rel":666},"https:\u002F\u002Fpieces.app\u002Fblog\u002Fhow-to-run-an-llm-locally-with-pieces",[613],"how to run an LLM locally",", Pieces is definitely the first place you should look.",[600,670,671],{},"NOTE: If you plan on cloning the Typescript Project, we recommend you starting with a clean slate and deleting any Local LLMs (LLLM) you may have downloaded in your Pieces Suite. If you do not, you will notice that some of the radio buttons on the Example Copilot page are inactive, and will provide buttons where you can delete each of the models as soon as you enter the application. We currently support local instances of the Mistral 2.5 7B and Llama2 7B parameter models, and plan to add support for other models soon.",[631,673,675],{"id":674},"adding-radio-buttons-for-model-selection","Adding Radio Buttons for Model Selection",[600,677,678],{},"If we pick up from the previous article in this series, we have our copilot chats added and can get an entire copilot conversation back in the chat. Next, we will start to add visual radio buttons so you can simply select each model. Here are the models that we will be working with:",[680,681,682,686,689,692,695,698],"ul",{},[683,684,685],"li",{},"Mistral CPU (local)",[683,687,688],{},"Mistral GPU (local)",[683,690,691],{},"Llama2 7B CPU (local)",[683,693,694],{},"Llama2 7B GPU (local)",[683,696,697],{},"GPT 3.5 (cloud)",[683,699,700],{},"GPT 4 (cloud)",[600,702,703],{},"You'll notice that these models are either hosted in the cloud or hosted locally on your machine. We can use each of these models in the same location, all by pressing one button. There is one additional step to download the model itself, but we will get to that further in this article.",[600,705,706],{},"First, we will add in the radio buttons. You can take the below code snippet and use to add radio buttons into the html of your project if needed, and it is also used as the controls for changing between LLLMs and the Cloud models provided:",[708,709,714],"pre",{"className":710,"code":712,"language":713},[711],"language-text","llama2-7b-cpu        gpt-4        gpt-35        llama2-7b-gpu        Mistral CPU        Mistral CPU\n","text",[715,716,712],"code",{"__ignoreMap":717},"",[600,719,720],{},[609,721,724],{"href":722,"rel":723},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=c94f48af99",[613],"Save this Snippet",[600,726,727],{},"You can see that the form above contains all of the radios, followed by the models’ downloads containers, which hold each of the buttons that are connected to downloadable chat models.",[600,729,730,731,734],{},"Each of these buttons will represent a single selectable model. As you adjust these values, each model that is selected is set to the active model, EXCEPT for when we first load the page. On first load, we default to the GPT 3.5 model and use it to perform our first request. When you add in these inputs, they are each connected to model download logic that lives in the new ",[715,732,733],{},"ModelProgressController.ts"," file.",[600,736,737],{},"This is where all of the magic lives! The Pieces endpoints handle the heavy lifting with our LLLMs and Cloud LLMs, which will allow us to build and functionally switch between them quickly. Why build your own copilot if it’s only powered by a single LLM?",[631,739,741],{"id":740},"setting-up-the-models-for-selection","Setting up the Models for Selection",[600,743,744,745,748,749,752],{},"In the ",[715,746,747],{},"modelsProgressController.ts",", we first set a public variable to store our list of models. We can iterate through this list later, as we get the proper enum and value for each model that is returned from the ",[715,750,751],{},"Pieces.ModelsApi",":",[708,754,757],{"className":755,"code":756,"language":713},[711],"\u002F\u002F first intialize the value here: public models: Promise;\n\u002F\u002F then get its value inside of the constructor.\nprivate constructor() {\n    \u002F\u002F can access the model snapshot here and set it to the variable that was just created \n    this.models = new Pieces.ModelsApi().modelsSnapshot();\n    this.models.then((models) => {\n      this.initSockets(\n      \u002F\u002F then you can use filter to set the initial value for the models download.\n        models.iterable.filter(\n          (el) =>\n            (el.foundation === Pieces.ModelFoundationEnum.Llama27B || el.foundation === Pieces.ModelFoundationEnum.Mistral7B) &&\n            el.unique !== 'llama-2-7b-chat.ggmlv3.q4_K_M'\n        )\n      );\n    });\n  }\n",[715,758,756],{"__ignoreMap":717},[600,760,761],{},[609,762,724],{"href":763,"rel":764},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=61f344a5cb",[613],[600,766,767,768,771,772,775,776,779,780,783,784,649],{},"Using the ",[715,769,770],{},"Pieces.ModelsApi().modelsSnapshot()",", you can get a list of all the available models. Then, the ",[715,773,774],{},"el.foundation === Pieces.ModelFoundationEnum.Llaama27B"," in combination with a ",[604,777,778],{},"el.unique"," is used to filter on the iterable list down to the default model. This is the first time that this enum has been used thus far, but it certainly won’t be the last. Use that in combination with a few variables to start and create our ",[715,781,782],{},"onClick()"," functions in ",[715,785,786],{},"src\u002Findex.ts",[600,788,789,790,793,794,797],{},"Moving over to the ",[715,791,792],{},"main()"," function, we can use ",[715,795,796],{},".getInstance()"," to retrieve and set our modelsProgressController and our list of models, then create variables to store each model's value. We also set the initial value of the model that is selected to GPT 3.5:",[708,799,802],{"className":800,"code":801,"language":713},[711],"async function main() {\n    \u002F\u002F copilot stream controller.\n    CopilotStreamController.getInstance();\n    \u002F\u002F get the values we have stored on the controller.\n    const modelProgressController = ModelProgressController.getInstance();\n    const models = await modelProgressController.models;\n    \u002F\u002F set all model values that we are going to use in this example.\n    const gpt35 = models.iterable.find((model) => model.foundation === ModelFoundationEnum.Gpt35 && !model.name.includes('16k'))!;\n    const gpt4 = models.iterable.find((model) => model.foundation === ModelFoundationEnum.Gpt4)!;\n    const llama27bcpu = models.iterable.find((model) => model.foundation === ModelFoundationEnum.Llama27B && model.cpu)!;\n    const llama27bgpu = models.iterable.find((model) => model.foundation === ModelFoundationEnum.Llama27B && !model.cpu)!;\n    \u002F\u002F setting and finding the mistral models.\n    \u002F\u002F CPU model\n    const mistralcpu = models.iterable.find((model) =>  model.foundation === ModelFoundationEnum.Mistral7B && model.cpu);\n    \u002F\u002F GPU model\n    const mistralgpu = models.iterable.find((model) =>  model.foundation === ModelFoundationEnum.Mistral7B && !model.cpu);\n    \u002F\u002F set your default selected model id here for gpt-3.5\n    CopilotStreamController.selectedModelId = gpt35.id;\n...\n",[715,803,801],{"__ignoreMap":717},[600,805,806],{},[609,807,724],{"href":808,"rel":809},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=25c84cab9f",[613],[600,811,812,813,816],{},"Then we can start to create each button using a similar pattern. First, we create the button element, setting its onClick function to set the appropriate ",[715,814,815],{},"CopilotStreamController.selectedModelId"," as each dial is selected. Here we use the Mistral button as an example:",[708,818,821],{"className":819,"code":820,"language":713},[711],"...\n\u002F\u002F then we set the download mistralCpuButton to pass in  the model specific id that is needed to start the\n\u002F\u002F download of the model.\ndownloadMistralCpuButton.onclick = (e) => {\n    new ModelApi().modelSpecificModelDownload({model: mistralcpu!.id})\n}\n...\n",[715,822,820],{"__ignoreMap":717},[600,824,825],{},[609,826,724],{"href":827,"rel":828},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=294e4787b6",[613],[600,830,831,832,835,836,839,840,843],{},"The ",[715,833,834],{},"selectedModelId"," is used when any message is sent from the input of the copilot chat and passed in as the ",[715,837,838],{},"model"," parameter on ",[715,841,842],{},"Pieces.QGPTStreamInput.question.model"," where the id from the Mistral model has been stored:",[708,845,848],{"className":846,"code":847,"language":713},[711],"\u002F\u002F in askQGPT in CopilotStreamController.ts \nconst input: Pieces.QGPTStreamInput = {\n      question: {\n        query,\n        relevant: {iterable: []},\n        \u002F\u002F the updated parameter here:\n        model: CopilotStreamController.selectedModelId\n      },\n    };\n",[715,849,847],{"__ignoreMap":717},[600,851,852],{},[609,853,724],{"href":854,"rel":855},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=c2fe4d967b",[613],[600,857,858,859,862],{},"Then we need to repeat this for each of the radio dials that we are creating - or rather the models that we are attempting to download. We’ll ensure that each button is present and throw an error if it is not found with ",[715,860,861],{},"if (!downloadMistralCpuButton) throw new Error('expected id mistral-cpu-button)",". This gets more interesting inside of the Mistral CPU and Mistral GPU models since we will download those files locally. Remember since you have Pieces OS downloaded and it is being used as the database and storage location for the models, it is handling storing and providing access to the model via these endpoints.",[600,864,865],{},"Once each of the radio buttons is created, the end result will show 6 radio dials that are set up for swapping between each of the models and setting the proper value each time it is selected:",[600,867,868],{},[869,870],"img",{"alt":871,"src":872},"Selecting a cloud or local large language model.","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fhow-to-build-a-copilot-using-local-llms-with-pieces-client\u002Fimg-001.png",[631,874,876],{"id":875},"downloading-the-mistral-cpu-model","Downloading the Mistral CPU Model",[600,878,879],{},"Now we can create the logic for downloading the CPU model when we click a button below the radio dials. This will detect if the model is already downloaded and give the appropriate option to delete it if it has already been downloaded.",[600,881,882,883,886],{},"Below where the ",[715,884,885],{},"mistralCpuButton"," is created, we can add a check to see if the CPU model is present in the Client. Because we create the buttons with JavaScript, we can conditionally add the 'Download Mistral CPU' text to the button only when the model is not downloaded. When it is downloaded, we can provide the option to delete.",[708,888,891],{"className":889,"code":890,"language":713},[711],"...\n\u002F\u002F this checks the model value on the models.itereable to check if downloaded.\nif (!mistralCpu?.downloaded) {\n        \u002F\u002F if the model is not downloaded, then we cannot select the radio button.\n        mistralCpuButton.setAttribute('disabled', 'true');\n    \u002F\u002F create the container for the download button.\n        const downloadMistralCpuContainer = document.createElement('div');\n        modelDownloadsContainer.appendChild(downloadMistralCpuContainer);\n    \u002F\u002F create the button and set the appropriate text.\n        const downloadMistralCpuButton = document.createElement('button');\n        downloadMistralCpuButton.innerText = 'Download Mistral CPU'\n        downloadMistralCpuContainer.appendChild(downloadMistralCpuButton);\n...\n",[715,892,890],{"__ignoreMap":717},[600,894,895],{},[609,896,724],{"href":897,"rel":898},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=0dc0479daa",[613],[600,900,901,902,905,906,909,910,752],{},"After we create the buttons, we can set the specific model that we want to download when we click that button. We can then use the ",[715,903,904],{},"ModelApi().modelSpecificModelDownload()"," and pass in the corresponding ",[715,907,908],{},".id"," value on the Pieces.Model value stored on ",[715,911,912],{},"mistralCpu",[708,914,917],{"className":915,"code":916,"language":713},[711],"...\ndownloadMistralCpuButton.onclick = (e) => {\n    new ModelApi().modelSpecificModelDownload({model: mistralCpu.id}).then(console.log).catch(console.error)\n        }\n...\n",[715,918,916],{"__ignoreMap":717},[600,920,921],{},[609,922,724],{"href":923,"rel":924},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=a99648beec",[613],[926,927,929],"h3",{"id":928},"showing-download-progress","Showing Download Progress",[600,931,932,933,935,936,939],{},"We also want to show our download progress. Let’s create a unique ",[604,934,908],{}," value for the ",[715,937,938],{},"const mistralCpuDownloadProgress"," that we created:",[708,941,944],{"className":942,"code":943,"language":713},[711],"...\nconst \nmistralCpuDownloadProgress\n = document.createElement('div');\ndownloadMistralCpuContainer.appendChild(mistralCpuDownloadProgress);\n\u002F\u002F creates the ID we need here using the unique value.\nmistralCpuDownloadProgress.id = `download-progress-${mistralCpu.id}`\n...\n",[715,945,943],{"__ignoreMap":717},[600,947,948],{},[609,949,724],{"href":950,"rel":951},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=92f949822f",[613],[600,953,954,955,958,959,962,963,965,966,649],{},"Over in the WebSocket found in ",[715,956,957],{},"ModelProgressController",", you can see how we use the ",[715,960,961],{},"model.id"," to connect and set up the appropriate WebSocket the corresponding model locations as the download emits values. The event data comes back, the download progress is selected based on the progress ID that we created above, and we can use the values found on the ",[715,964,838],{}," based on ",[715,967,968],{},"Pieces.Model.name",[600,970,971,972,975,976,979,980,983],{},"Then, using the event data that is emitted—which will either be the ",[715,973,974],{},"event.percentage"," or ",[715,977,978],{},"event.status"," depending on if the model download has\u002Fhas not started—we will share the percentage numbers. You will get a number back for each percentage value here. We use all that to set the ",[715,981,982],{},"downloadProgressElements.innerText"," value.",[600,985,986],{},"Here is all of that together:",[708,988,991],{"className":989,"code":990,"language":713},[711],"private connect(model: Model) {\n    \u002F\u002F setup the appropriate web socket.\n    const ws: WebSocket = new WebSocket(\n      `ws:\u002F\u002Flocalhost:${1000}\u002Fmodel\u002F${model.id}\u002Fdownload\u002Fprogress`\n    );\n    this.sockets[model.id] = ws;\n    ws.onmessage = (evt) => {\n      const event = Pieces.ModelDownloadProgressFromJSON(JSON.parse(evt.data));\n      const downloadProgressElement = document.getElementById(`download-progress-${model.id}`)\n      if (!downloadProgressElement) return;\n      \u002F\u002F setting the inner text of the element.\n      downloadProgressElement.innerText = `${model.name} download progress: ${event.percentage ?? event.status}` + (event.percentage ? '%' : '');\n...\n",[715,992,990],{"__ignoreMap":717},[600,994,995],{},[609,996,724],{"href":997,"rel":998},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=5ff6478048",[613],[926,1000,1002],{"id":1001},"showing-individual-modeldownload-progress-or-status","Showing Individual ModelDownload Progress or Status",[600,1004,1005,1006,1008,1009,1012],{},"Now we can set the appropriate status message based on the ",[715,1007,978],{}," that is returned. We can compare it to the ",[715,1010,1011],{},"ModelsDownloadProgressStatusEnum.Initialized"," value, which would indicate if the button has been pressed on the page but the download has not officially begun yet.",[600,1014,1015,1016,1019,1020,1023],{},"The model download itself can be canceled once it has begun, so once the status is ",[715,1017,1018],{},"initialized",", we will create and append the cancel download button. This button uses the ",[715,1021,1022],{},"ModelApi().modelSpecificDownloadCancel({ model: model.id })"," inside of its onClick function.",[600,1025,1026,1027,1029,1030,975,1033,1036,1037,1040],{},"If ",[715,1028,978],{}," is either ",[715,1031,1032],{},"ModelsDownloadProgressStatusEnum.Failed",[715,1034,1035],{},"ModelsDownloadProgressStatusEnum.Unknown",", we want to remove the button that allows for the model to be canceled. If the event status is ",[715,1038,1039],{},"ModelDownloadProgressStatusEnum.Completed",", then we can refresh the page to ensure that the new download is added and the radio dials are in sync:",[708,1042,1045],{"className":1043,"code":1044,"language":713},[711],"...\nif (event.status === ModelDownloadProgressStatusEnum.Initialized) {\n    \u002F\u002F creates the cancel button and sets its ID.\n    const cancelDownloadButton = document.createElement('button');\n    cancelDownloadButton.id = `cancel-download-button-${model.id}`\n    downloadProgressElement.insertAdjacentElement('afterend', cancelDownloadButton);\n    cancelDownloadButton.innerText = `Cancel ${model.name} download`;\n    \u002F\u002F ModelApi().modelSpecificModelDownloadCancel() \u003C-- how to canel a models download\n    cancelDownloadButton.onclick = () => {\n          new ModelApi().modelSpecificModelDownloadCancel({model: model.id});\n   }\n} else if (event.status === ModelDownloadProgressStatusEnum.Failed || event.status === ModelDownloadProgressStatusEnum.Unknown || event.status === ModelDownloadProgressStatusEnum.Completed) {\n        document.getElementById(`cancel-download-button-${model.id}`)?.remove();\n    }\nif (event.status === ModelDownloadProgressStatusEnum.Completed) \n    window.location.reload();\n}\n...\n",[715,1046,1044],{"__ignoreMap":717},[600,1048,1049],{},[609,1050,724],{"href":1051,"rel":1052},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=27b545a43b",[613],[600,1054,1055],{},"The result is something like this:",[600,1057,1058],{},[869,1059],{"alt":1060,"src":1061},"Interface of building a copilot using local LLMs.","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fhow-to-build-a-copilot-using-local-llms-with-pieces-client\u002Fimg-002.png",[926,1063,1065],{"id":1064},"deleting-a-downloaded-model","Deleting a Downloaded Model",[600,1067,1068,1069,1072,1073,1076],{},"Now, if a model is already downloaded, we want to make it easy to remove the model. This is useful if we don’t need the model anymore, or if we want to re-download the entire thing. We’ll set up the delete function using the ",[715,1070,1071],{},"ModelsApi().modelsDeleteSpecificModelCache()"," with the model ID for each corresponding model back in ",[715,1074,1075],{},"index.ts"," to remove it from its downloaded location.",[600,1078,1079,1080,1082,1083],{},"Remember that we are using the ",[715,1081,912],{}," model as an example and that examples for each CPU and GPU model are included in the ",[609,1084,1086],{"href":626,"rel":1085},[613],"full repo.",[708,1088,1091],{"className":1089,"code":1090,"language":713},[711],"...\nelse {\n    const deleteMistralCpuButton = document.createElement('button');\n    modelDownloadsContainer.appendChild(deleteMistralCputButton);\n    deleteMistralCpuButton.innerText = 'Delete Mistral Cpu';\n    \u002F\u002F onclick we call modelsDeleteSpecificModelsCache()\n    deleteMistralCpuButton.onclick = () => {\n       new ModelsApi().modelsDeleteSpecificModelCache({model: mistralCpu.id, modelDeleteCacheInput: {}}).then(() => {window.location.reload()});\n        }\n    }\n",[715,1092,1090],{"__ignoreMap":717},[600,1094,1095],{},[609,1096,724],{"href":1097,"rel":1098},"https:\u002F\u002Fjwaf.pieces.cloud\u002F?p=558b46b28f",[613],[600,1100,1101,1102,1105],{},"The model should then be deleted, and the buttons and radio dials will return to normal upon page refresh. This function is built into the ",[715,1103,1104],{},"deleteMistralCpuButton.onclick"," function above.",[600,1107,1108],{},"Upon pressing delete, the Llama2 Model should be deleted and the buttons will return to their original state, allowing you to download the models again!",[631,1110,1112],{"id":1111},"ready-to-build-your-own-copilot","Ready to Build Your Own Copilot?",[600,1114,1115],{},"This guide is a great way to introduce yourself to downloading LLLMs and an easy-to-use environment to get them set up on your machine, observe how they work, and understand how simple it is to observe their status with Pieces OS Client. This way you can build your own copilot for your application, project, or other solutions you need throughout your workflow.",[600,1117,1118,1119,1123],{},"To get the entire project, you can ",[609,1120,1122],{"href":626,"rel":1121},[613],"visit the repo"," and clone it to get started. All of the above code can be found there and used as copy-and-paste examples for whatever use case you may have.",[600,1125,1126],{},"The next article in this series on how to build a copilot will cover setting up context in each conversation to show the different ways you can combine specific models with particular contexts to get more pointed and useful responses.",[600,1128,1129,1130,1133,1134,1139],{},"If you are interested in contributing to Open Source by Pieces, join our community on ",[609,1131,51],{"href":425,"rel":1132},[613]," or check out our OpenSource repository on GitHub for projects and other open-source initiatives. If you haven't checked out the ",[609,1135,1138],{"href":1136,"rel":1137},"https:\u002F\u002Fdocs.pieces.app\u002Finstallation-getting-started\u002Fwhat-am-i-installing",[613],"Pieces for Developers Desktop App and Pieces OS"," before now, go learn about all of the functionality that is available to help you power your workflow and enhance your work as a developer!",{"title":717,"searchDepth":1141,"depth":1141,"links":1142},2,[1143,1144,1145,1146,1147,1153],{"id":633,"depth":1141,"text":634},{"id":652,"depth":1141,"text":653},{"id":674,"depth":1141,"text":675},{"id":740,"depth":1141,"text":741},{"id":875,"depth":1141,"text":876,"children":1148},[1149,1151,1152],{"id":928,"depth":1150,"text":929},3,{"id":1001,"depth":1150,"text":1002},{"id":1064,"depth":1150,"text":1065},{"id":1111,"depth":1141,"text":1112},null,"AI & LLM","2024-01-26T00:00:00.000Z","Learn how Pieces Copilot uses LLLMs and switches between them effortlessly— and how to build a copilot with Pieces Client.",false,"md","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fhow-to-build-a-copilot-using-local-llms-with-pieces-client\u002Fhero.jpeg","Open Source by Pieces.",{},"\u002Fblog\u002Fhow-to-build-a-copilot-using-local-llms-with-pieces-client",{"title":591,"description":1157},"blog\u002Fhow-to-build-a-copilot-using-local-llms-with-pieces-client","uQL5RRh6me9EqDmz9zmqt9FYxv0Xj4LRzgJRNxt9iRA",{"id":1168,"title":592,"body":1169,"description":717,"draft":1158,"extension":1159,"meta":1173,"navigation":20,"path":1174,"photo":1175,"photoAlt":1154,"seo":1176,"stem":1177,"__hash__":1178},"authors\u002Fauthors\u002Fthe-pieces-team.md",{"type":597,"value":1170,"toc":1171},[],{"title":717,"searchDepth":1141,"depth":1141,"links":1172},[],{},"\u002Fauthors\u002Fthe-pieces-team","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fauthors\u002Fthe-pieces-team.png",{"title":592,"description":717},"authors\u002Fthe-pieces-team","_2O_QA8d8RjXlBp0ck4PWDG6iA74zW1kN0R0gkn2Lls"]