{"componentChunkName":"component---src-components-post-post-tsx","path":"/articles/ai-integration","result":{"data":{"site":{"siteMetadata":{"url":"https://www.01binary.us"}},"post":{"slug":"ai-integration","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"AI integration\",\n  \"description\": \"Train your own AI model this weekend, then wire it into the software you built!\",\n  \"image\": \"./images/ai-integration.png\",\n  \"author\": \"Valeriy Novytskyy\",\n  \"date\": \"2026-07-29T00:00:00.000Z\",\n  \"location\": \"^H Hackerspace\",\n  \"tags\": [\"engineering-software\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", null, \"overview\"), mdx(\"p\", null, \"Modern chat bots are powered by \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"large language models\"), \" (LLMs). These models can understand and generate human language, making them ideal for conversational tasks.\"), mdx(\"p\", null, \"Instead of training an LLM from scratch (a costly and time-intensive process), we start with an existing \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"pre-trained\"), \" model and adapt it to our needs. This process is known as \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"fine-tuning\"), \".\"), mdx(\"h3\", null, \"pre-training\"), mdx(\"p\", null, \"Pre-trained models have already learned general language patterns by analyzing vast amounts of text. This is done with \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"unsupervised training\"), \", where a model iteratively learns to generate the next word in a sequence.\"), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167\"\n  }, \"Build a Large Language Model (From Scratch)\"), \" book by Sebastian Raschka is a great resource for understanding how pre-training works in detail:\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"920px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/8e678374d421a3fc88dca91828444484/187fa/ai-integration-llm-book.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"122.17391304347827%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAAACXBIWXMAABYlAAAWJQFJUiTwAAAE2UlEQVQ4y42VeVCUZRzHX+UQWnYXRBYETF1FJlKIYb3wWJRD8AIJNVQoEQcdI8QjRAnl8BqsNcyOP1KHQxlt8kibScmZckrTNBUNXQpXU1HBBlBB4/j0vLsuKGr5zDzzvO877/OZ7++WenVX0XVrbJ1xkLoTEzoJebW1tdHe3m7e8mqX38X56Pp1qgP8qbS3o0qvx+jlieTaTfnSQDPs8WldLbW1mGJjMU6eTJUuCEkGyFC15Iiz9AoukuJ/Fcqrvr6hE1pXhyk6mkpJsipU4+uhZZDmVfqq3PHo4UIPAZwWOtF8obX1HwFrE+AW8/utmmpSkmeRkbGyA9ra0IApRI/UU1Li6eiMXheMf38dWlcfVJKL2N2YEjKVrkvWeK3iNFmpiUhCUeWlSx3f25qbkVSSimG+TgT7OaAPcCRUp2CMv5qwoTYsSAgWqk7R2HCMpgdnuH/vJ5qaTnCj+mtOHtvL5sJCbt64aXFLa6v5NAODBihZmabkwzwnPl6vYPF8FdEhDny51Zu7tSu4dmUeN64u5C9TElf+mIlhQxj5S5OpOHX0KZjsY+FDFR72Kga5iejaCfhAJSP91GhdbImbECJ+u0tDfTnNTVfNl44fK8bP04uMmBEUfZRtNlX2rzVoIspKXIVKZ+FL2Z9q8bz+AwUFOfbkrRzI37Vp1N3Of6yknTmz38FLoyFp4ijKSoosUW5peVqhDHWzseSjxk6JPlDFFL0duSuCqDJ+yvmKrdTcNlJctBUPjRuL46PImhfLji+2cK+xoSO1zD58XmKrJWcRQVsigiPYd6AIw5Z09h40kJObiUqhYkFsBLkp09mUGsdnOenUNzR2KrQmdk/JSZhuOTW2KhSSHVFjRvFrRQnLM6PY/20Bqe8mouihIDhgCIkRo3k/PpKlkYEc2l36OF9bLQrlyujt4Iq7vYv59FZocJRsmD4hhst/XmDthky+O7qT+NhJRAwNJPXNcBLCRpIwdigpIQHkL5hFU/NDi8myIhkQoPXDz9tHJPdr6HwD6GWjYkbkNEwmE+nL3mP3gVLCRgQRMzyQ4qwklsRFsDBsGJlxISwKD+TCudMWoNXkJ7ebjRp7UQXxk+KoqDhLyc4iysuP4K/tz5KpY1mXHEPWrCg2J01g9VvjmT98AIfKip4NivXZ2hymhU7uKLmNefloFE6smhlG9uxwlsaGU7JiDmmROlJG+7CvZMeLo9y128grKSGRwZperIkbT96MUOIGa1kSHkTCG/2If92T3du3dZr8IuDUcVHmn4yXL+PT2xt/d3cSAgawXvhtrm4Qa+bGUF66ibXpiRjW5r4EMMQCzF21ionD/Clct5wdhizKCrMp3pLNicPbaKo5yYGyTXy157kmy0GxAM1BmTJdVIpRpMoQftz/OXeuHKfu6mmuVf3M8e9LObzHwG8/lGLITeHcmV/+w4d2coOVzGlzp7aOnEVvs70gg13bN/PNrk/Ys62AjauXCcUZGPLTOHJwJ9ZmbjZZzkV5BMjtXx4D8jfZ5Ohxlo798OEjfr9YycWK8xgvnuW6qZoH9x+IMdDIrVs1nc1XLj0Z4Oven+Q5c0W37oOPW1+0Pb2Fwm4dUe46mJ7p4k/MG8lVqJPLzc/Lhz5KD/o5e4m50lso7ATKNSp3kye3FdJ1Iv4LHaWC589lmiAAAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Build a Large Language Model From Scratch Book\",\n    \"title\": \"Build a Large Language Model From Scratch Book\",\n    \"src\": \"/static/8e678374d421a3fc88dca91828444484/c0255/ai-integration-llm-book.png\",\n    \"srcSet\": [\"/static/8e678374d421a3fc88dca91828444484/81c8e/ai-integration-llm-book.png 230w\", \"/static/8e678374d421a3fc88dca91828444484/08a84/ai-integration-llm-book.png 460w\", \"/static/8e678374d421a3fc88dca91828444484/c0255/ai-integration-llm-book.png 920w\", \"/static/8e678374d421a3fc88dca91828444484/187fa/ai-integration-llm-book.png 1194w\"],\n    \"sizes\": \"(max-width: 920px) 100vw, 920px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"This tutorial is designed to help you integrate an LLM chat bot into your application as quickly as possible.\"), mdx(\"h3\", null, \"fine-tuning\"), mdx(\"p\", null, \"Fine-tuning is the process of teaching a pre-trained model to perform specialized tasks, which could be anything from updating database records to executing commands and accessing APIs.\"), mdx(\"p\", null, \"Some examples of fine-tuned models across different industries:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Medical:\"), \" \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://huggingface.co/collections/google/medgemma-release-680aade845f90bec6a3f60c4\"\n  }, \"Medical Gemma\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Finance:\"), \" \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://huggingface.co/AdaptLLM/finance-LLM\"\n  }, \"AdaptLLM Finance-LLM\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Legal:\"), \" \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://huggingface.co/AdaptLLM/law-LLM\"\n  }, \"AdaptLLM Law-LLM\"))), mdx(\"p\", null, \"In this tutorial, we\\u2019ll walk through the complete steps for selecting an LLM, integrating it with your application, locking in the desired behavior by fine-tuning, and deploying it to production.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"920px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/84901a32a56eba8e37ebaa4eed472d18/a88f6/ai-integration-timeline.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"32.173913043478265%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"timeline\",\n    \"title\": \"timeline\",\n    \"src\": \"/static/84901a32a56eba8e37ebaa4eed472d18/c0255/ai-integration-timeline.png\",\n    \"srcSet\": [\"/static/84901a32a56eba8e37ebaa4eed472d18/81c8e/ai-integration-timeline.png 230w\", \"/static/84901a32a56eba8e37ebaa4eed472d18/08a84/ai-integration-timeline.png 460w\", \"/static/84901a32a56eba8e37ebaa4eed472d18/c0255/ai-integration-timeline.png 920w\", \"/static/84901a32a56eba8e37ebaa4eed472d18/b1001/ai-integration-timeline.png 1380w\", \"/static/84901a32a56eba8e37ebaa4eed472d18/161ec/ai-integration-timeline.png 1840w\", \"/static/84901a32a56eba8e37ebaa4eed472d18/a88f6/ai-integration-timeline.png 1900w\"],\n    \"sizes\": \"(max-width: 920px) 100vw, 920px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Evaluate\"), \" LLMs with \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"system prompts\"), \" and \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"few-shot prompts\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Integrate\"), \" an LLM with your application by using \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Tool Calling\"), \", \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Structured Output\"), \", or \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Model Context Protocol\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Fine-tune\"), \" the selected model on your use case\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Deploy\"), \" the model to inference endpoints\")), mdx(\"p\", null, \"Before we jump into integration and training, we\\u2019ll use prompts to evaluate models, learn how they are packaged on the Hugging Face Hub, and preview the Chat API we\\u2019ll use later for integration.\"), mdx(\"h2\", null, \"evaluating models\"), mdx(\"p\", null, \"Few-shot prompting lets you quickly evaluate an LLM\\u2019s behavior and capabilities before investing time in integration and training.\"), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.ibm.com/think/topics/few-shot-prompting\"\n  }, \"Few-shot prompting\"), \" is providing an AI model with a few examples of a task to guide its performance. The examples you use in few-shot prompts can later be used as the foundation for a training dataset.\"), mdx(\"h3\", null, \"exploring models\"), mdx(\"p\", null, \"There are a few popular tools that let you easily download and chat with LLM\\u2019s:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Tool\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"User Interface\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Command Line\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"REST API\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://lmstudio.ai/\"\n  }, \"LM Studio\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/nomic-ai/gpt4all\"\n  }, \"GPT4All\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://anythingllm.com/\"\n  }, \"AnythingLLM\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://ollama.com/\"\n  }, \"Ollama\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  })), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://vllm.ai/\"\n  }, \"vLLM\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/ggml-org/llama.cpp\"\n  }, \"Llama.cpp\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"\\u2713\")))), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"LM Studio is used in this tutorial because of its rich user interface and ability to download models directly from \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/models\"\n  }, \"Huggingface\"), \", the most popular model repository.\")), mdx(\"p\", null, \"LM Studio uses \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/ggml-org/llama.cpp\"\n  }, \"Llama.cpp\"), \" and \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/ml-explore/mlx\"\n  }, \"MLX\"), \" hardware-accelerated engines under the hood to run LLMs locally.\"), mdx(\"p\", null, \"The Llama.cpp engine includes a command line utility called \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/ggml-org/llama.cpp/tree/master/tools/server\"\n  }, \"Llama.cpp Server\"), \", which starts a local web server with a given port number. This functionality makes talking to an LLM programmatically as simple as sending REST API requests, and it\\u2019s exposed through the LM Studio user interface.\"), mdx(\"p\", null, \"When it comes to selecting an LLM to chat with, the following table provides a rough starting point for correlating model sizes with your available system resources:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Model Size\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Memory Required\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"3 - 8 billion parameters\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"16 GB\"), \" RAM\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"13 billion parameters\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"32 GB\"), \" RAM\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"30 - 34 billion parameters\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"64 GB\"), \" RAM\")))), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"MacOS ARM computers have a unified memory architecture (video card and CPU share the same memory). Windows and Linux have separate system and video card memory, so on those platforms the memory requirement refers to \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"video memory\"), \".\")), mdx(\"p\", null, \"When first launching LM Studio, you\\u2019ll be asked to choose a UI complexity level and download the first model. Select \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Power User\"), \" and skip downloading a model for now - we\\u2019ll look at model selection next.\"), mdx(\"p\", null, \"The \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Discover\"), \" tab in LM Studio is a simple browsing interface for exploring models hosted on the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/models\"\n  }, \"Hugging Face Hub\"), \", which is like GitHub for machine learning models.\"), mdx(\"p\", null, \"Each model is stored as a Git repository, typically containing a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"README\"), \" and a set of model files. Hugging Face uses Git Large File Storage (LFS) under the hood to manage large assets such as model weights.\"), mdx(\"p\", null, \"The most common formats you\\u2019ll encounter for model weights are \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/docs/text-generation-inference/en/conceptual/safetensors\"\n  }, \"Safetensors\"), \", \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/docs/hub/en/gguf\"\n  }, \"GGUF\"), \", and \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/docs/hub/en/mlx\"\n  }, \"MLX\"), \":\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Safetensors (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".safetensors\"), \")\", mdx(\"br\", {\n    parentName: \"li\"\n  }), \"This format is commonly used for training and fine-tuning. Models available in this format can typically be adapted for specific tasks.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"GGUF (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".gguf\"), \")\", mdx(\"br\", {\n    parentName: \"li\"\n  }), \"This format is optimized for inference. GGUF models are designed to run efficiently in tools like LM Studio and llama.cpp, but cannot be further trained.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"MLX (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".mlx\"), \")\", mdx(\"br\", {\n    parentName: \"li\"\n  }), \"This format is optimized for inference like GGUF, but \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://contracollective.com/blog/mlx-vs-llama-cpp-apple-silicon-local-ai\"\n  }, \"designed specifically for Apple GPUs\"), \", running efficiently in tools like LM Studio and Ollama.\")), mdx(\"h3\", null, \"model capabilities\"), mdx(\"p\", null, \"LM Studio lists models from Huggingface in its model browser and uses the same badges to communicate model capabilities:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Badge\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Capability\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\uD83D\\uDEE0\\uFE0F Tool Calling\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The model can call external tools by emitting structured JSON\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\uD83E\\uDDE0 Reasoning\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The model is optimized for multi-step reasoning and problem solving\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\uD83D\\uDC41\\uFE0F Vision\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The model can process and reason about images\")))), mdx(\"p\", null, \"Select a model for experimentation and click \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Download\"), \" at the bottom of the LM Studio browser. Once a model is downloaded, it can be selected at the top of the LM Studio window. The \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Chat\"), \" tab can then be used to talk to the model.\"), mdx(\"h3\", null, \"prompts\"), mdx(\"p\", null, \"Instructing an LLM is fundamentally the process of communicating requirements:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"System Prompt\"), \" defines the model\\u2019s role, behavior, and constraints (see \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://huggingface.co/datasets/danielrosehill/System-Prompt-Library\"\n  }, \"examples of system prompts\"), \")\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"User Prompt\"), \" represents a user question\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Assistant Response\"), \" demonstrates the ideal reply the model should produce\")), mdx(\"p\", null, \"Taken together, these three messages describe a \\u201Cteachable moment\\u201D: a single row of a training dataset, or a single conversation in a few-shot chat.\"), mdx(\"p\", null, \"In LM Studio, a System Prompt can be entered by clicking \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Configuration\"), \" in the sidebar of the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Chat\"), \" tab, which could be opened by clicking on \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Show Sidebar\"), \" button at the top right corner of the screen.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"920px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/47b60c5ea302ada40e70246e453cc2fe/3b2f8/ai-integration-system-prompt.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"57.826086956521735%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABxUlEQVQoz42S346TQBSH5zk0y38oMFBKaKVNWS2gbcEoppL2wqv1afTWd3DjhYmP+NtzpmJgjRsvvsxQDt+cnt8IGUcIfB+2bcNxPEJDnn/C2/YX8QPdu3t07+/V2hy+Ez9RV1+RJHO4jgPPD+FGa0SrEkm2gVgul/QyUURRhDRNIWVAzBCGHnT9OW5unkHTrti2RhhIFgvkL5ZI81eQH75A9t/gby8QeZ6jKAolms/nSuy6Ln2sk8yAaVoTDMOEZdnYbDaKMKDDAxdZGiOOQojD4YCu68DrbrdDXddKrOv6b4k54Sq0VO1+v0dx+5L2JX1/RL5eQ0gpMRCGoVq5Q8Mw/pJdhYYSFtstjscjmqZFVVWqW/53wqdAHuPQsJ8W2ljQDFerFTUQqfqhGRHQDB7ztFCH5QYoqxpt22JXVijLEqfTSWWhhOPu/kdoOj5OH3t8vrvD+XzG5XJB3/fY0hj+KeRQWDqFhLpGHYao6tdqhm8oGA6naZqpcLxyKHzReWU5w88KCsR2fZph+ueqZVkGvs+8F2PZwGw2U4lxQRzHCh76ANew5BqKnDQjPM9TgjHcGRfynt8PNePg+JBBygfzb3zYA4h0ci8k/y97AAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"system prompt\",\n    \"title\": \"system prompt\",\n    \"src\": \"/static/47b60c5ea302ada40e70246e453cc2fe/c0255/ai-integration-system-prompt.png\",\n    \"srcSet\": [\"/static/47b60c5ea302ada40e70246e453cc2fe/81c8e/ai-integration-system-prompt.png 230w\", \"/static/47b60c5ea302ada40e70246e453cc2fe/08a84/ai-integration-system-prompt.png 460w\", \"/static/47b60c5ea302ada40e70246e453cc2fe/c0255/ai-integration-system-prompt.png 920w\", \"/static/47b60c5ea302ada40e70246e453cc2fe/b1001/ai-integration-system-prompt.png 1380w\", \"/static/47b60c5ea302ada40e70246e453cc2fe/161ec/ai-integration-system-prompt.png 1840w\", \"/static/47b60c5ea302ada40e70246e453cc2fe/3b2f8/ai-integration-system-prompt.png 2790w\"],\n    \"sizes\": \"(max-width: 920px) 100vw, 920px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"h3\", null, \"tool calling\"), mdx(\"p\", null, \"Large Language Models (especially the ones meant for following instructions, with \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Instruct\"), \" in their name) know how emit Python or JSON data structures in response to natural language prompts.\"), mdx(\"p\", null, \"This is known as \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"tool calling\"), \" or \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"function calling\"), \", and it\\u2019s documented in guides for all major models:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://llama.developer.meta.com/docs/features/tool-calling/\"\n  }, \"LLama Tool Calling\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://ai.google.dev/gemma/docs/capabilities/function-calling\"\n  }, \"Gemma Function Calling\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://qwen.readthedocs.io/en/latest/framework/function_call.html\"\n  }, \"Qwen Function Calling\"))), mdx(\"p\", null, \"Tool Calling is a key capability that allows LLMs to be integrated with web applications, cloud services, command line utilities, smart home and industrial automation systems, and robots.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"This capability is not a part of LM Studio: it\\u2019s supported partially by training the LLM to emit data structures (done as part of pre-training by the model vendor) and partially by the inference engine that\\u2019s running the model, like Llama.cpp or vLLM.\")), mdx(\"p\", null, \"You can quickly evaluate a model\\u2019s performance with tool calling by including the instructions in its system prompt, for example:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"You are a helpful assistant.\\n\\nAnswer the user's question by making use of the following functions if needed. If none of the function can be used, please say so.\\n\\nHere is a list of functions in JSON format:\\n\\n{\\n  \\\"type\\\": \\\"function\\\",\\n  \\\"function\\\": {\\n    \\\"name\\\": \\\"trending_songs\\\",\\n    \\\"description\\\": \\\"Returns the trending songs on a Music site\\\",\\n    \\\"parameters\\\": [\\n      {\\n        \\\"type\\\": \\\"object\\\",\\n        \\\"properties\\\": [\\n          {\\n            \\\"n\\\": {\\n              \\\"type\\\": \\\"object\\\",\\n              \\\"description\\\": \\\"The number of songs to return\\\"\\n            }\\n          },\\n          {\\n            \\\"genre\\\": {\\n              \\\"type\\\": \\\"object\\\",\\n              \\\"description\\\": \\\"The genre of the songs to return\\\"\\n            }\\n          }\\n        ],\\n        \\\"required\\\": [\\\"n\\\"]\\n      }\\n    ]\\n  }\\n}\\n\\nReturn function calls in JSON format.\\n\")), mdx(\"p\", null, \"When a relevant question is asked, the model will respond with a data structure:\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"920px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/0b28cc1a63eac922c6c247afb7093f87/79daf/ai-integration-tool-call.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"57.826086956521735%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAACE0lEQVQoz3VS227aQBT0V6QKNGDAN3zhEqjNNbig2FzaOCAKbUqJlH5M+95faNWHSv3F6ZmlrlCkPozO2rs7c+bMal4QwHEc1Go1mIYFwyghij5itfgt+Im7tz+Q3QmkLtLvmKe/MJt+RbPZlPMGLMeFGfThv5qi2elD63a7apPwfR/tdhueVxfYcF0LpVIRl5cXKBReoFi8QKXyUkR1tFptRGEX7XACL/sCf/sNzvA9tCiKMBqNFFGj0Tgpm6YQlXF1VRJiH6vVGyyXK6TpHOPxjZC10Ov10O/3RVTE6yY67QCB70Kbz+fIskwOp4jjGLPZTBHrui7dVOSCp/aI29sE0+lU7U8mEyRJipEIxPFrpMJDEc3zPORwXVdVQ2bDufKbqFarYrcotguq0gFdsePFYqlE2C3dabx4jnq9rgKiGg8Oh0OFTqejOrNtG4YQXl9fIwxDmXsAy7LU/NmMRoLnICEvkyj4+wpyB5WKDtPxMRGbSZJgfBNjOBio9UCqInzeIS2zE1pgWFTnPwqVyyWYto/7+w0eH484Hj/hcDhgu92qMfyXkOCsSHwiKqugdCE0bA/vdnt8fnrCbrfDfr9XhHT0j/C8kogkeVe5ANc1CciQDrNsjYeHD9hsNgrr9fpkOSfJwe/cLueYI0+ccNwAYXR6hwyGlSHyfWpMiATnYIcMIV/nZ86FOVcmzfS5zp/ZH6dLfWdd+L3UAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Basic Tool Call Example\",\n    \"title\": \"Basic Tool Call Example\",\n    \"src\": \"/static/0b28cc1a63eac922c6c247afb7093f87/c0255/ai-integration-tool-call.png\",\n    \"srcSet\": [\"/static/0b28cc1a63eac922c6c247afb7093f87/81c8e/ai-integration-tool-call.png 230w\", \"/static/0b28cc1a63eac922c6c247afb7093f87/08a84/ai-integration-tool-call.png 460w\", \"/static/0b28cc1a63eac922c6c247afb7093f87/c0255/ai-integration-tool-call.png 920w\", \"/static/0b28cc1a63eac922c6c247afb7093f87/b1001/ai-integration-tool-call.png 1380w\", \"/static/0b28cc1a63eac922c6c247afb7093f87/161ec/ai-integration-tool-call.png 1840w\", \"/static/0b28cc1a63eac922c6c247afb7093f87/79daf/ai-integration-tool-call.png 2792w\"],\n    \"sizes\": \"(max-width: 920px) 100vw, 920px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"This data structure matches the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://json-schema.org/\"\n  }, \"JSON Schema\"), \" specified for each parameter in the function call definition.\"), mdx(\"h2\", null, \"integration\"), mdx(\"p\", null, \"Next we\\u2019ll look at how to interact with LLMs by sending REST API requests to a locally running LLM server by using the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Chat API\"), \".\"), mdx(\"h3\", null, \"chat API\"), mdx(\"p\", null, \"When models are deployed in production, they are typically accessed through a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"chat-style API\"), \".\"), mdx(\"p\", null, \"You send a list of messages with roles such as \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"system\"), \" (system prompt), \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"user\"), \" (user question), and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"assistant\"), \" (agent response) and the LLM server runs \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://research.ibm.com/blog/AI-inference-explained\"\n  }, \"inference\"), \" on the model to predict the next agent response.\"), mdx(\"p\", null, \"The most common chat APIs are:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/docs/text-generation-inference/en/index\"\n  }, \"Hugging Face Chat API\"), mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"Hugging Face provides a chat-oriented API used by \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Hugging Face Inference Endpoints\"), \" and other services that deploy models directly using Hugging Face Text Generation Interface.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://developers.openai.com/api/reference/overview\"\n  }, \"OpenAI-compatible Chat API\"), mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"Many cloud providers expose deployed models through APIs that follow the same request and response structure as OpenAI\\u2019s Chat Completions API. Even when the underlying model is hosted on Hugging Face or uses a different inference engine, the API surface is often kept OpenAI-compatible for portability.\"))), mdx(\"p\", null, \"Both of these APIs describe a list of \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"messages\"), \" between the user and the agent and support system prompts, tool calls, and structured output.\"), mdx(\"p\", null, \"Here\\u2019s an example of an OpenAI-compatible Chat API request:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"model\\\": \\\"llama-3.2-3b-instruct\\\",\\n  \\\"messages\\\": [\\n    {\\n      \\\"role\\\": \\\"system\\\",\\n      \\\"content\\\": \\\"You are a helpful assistant.\\\"\\n    },\\n    {\\n      \\\"role\\\": \\\"user\\\",\\n      \\\"content\\\": \\\"What is 2 + 2?\\\"\\n    }\\n  ]\\n}\\n\")), mdx(\"p\", null, \"This payload is typically sent to a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"chat completion\"), \" endpoint of the running LLM server:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"POST /v1/chat/completions\\n\")), mdx(\"p\", null, \"The easiest way to experiment with Chat API is by using the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Server\"), \" functionality in LM Studio, available on \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Developer\"), \" tab:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Click \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Status\"), \" switch to run the server.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Server \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"address\"), \" and \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"port\"), \" will be displayed in the same box, \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"http://127.0.0.1:1234\"), \" by default.\")), mdx(\"p\", null, \"Try using \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.postman.com/\"\n  }, \"Postman\"), \" or \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.usebruno.com/\"\n  }, \"Bruno\"), \" to send an \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"application/json\"), \" payload to \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"http://127.0.0.1:1234/v1/chat/completions\"\n  }, \"http://127.0.0.1:1234/v1/chat/completions\"), \" (LM Studio\\u2019s OpenAI-compatible endpoint):\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"920px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/68462a623388dbc3f100af1db91ee0fe/b75f8/ai-integration-postman.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"83.04347826086956%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAABzUlEQVQ4y52TXXLbMAyEdQy/NBJJ8AckLctuM33vAdqL5Ao9XE+GLOCxLTvRuO3DDiWO+BHAroaSSZzz0lq7qvcuDXLOmbxX+Y8KUcKXnYw/f8vu7Y/sfrzJwMwGqbUapO27LIcZ72zgUorEzJJzkRDC9RIToG4aZeKTuO+/ZORvZ2DO+SwcZi4G55yE8a5AHxkVPcDWml4kULKqh9qqHF+/yjJXOeyLzF2hEUqmWpM0VVPlTXWolCSDUnl/EEZVNUWJFCSiNV2DtrRV1YYMGLPOKUsChIK/A07TdJUemB413Z5vwII5QiWSQXRvXEEMtAJ/1GjmGDCiTSJCBLy5SNDtQ7eKDi6OiIleiu9thTw68bGIo2KuD8dlEXW6Ijo2x9okpiRJRxDpWp2ukRSIUShER0JnoKMMH44oiGToyB3hZgagAFQRk6bRgXSOz9uFxhfJ6FSjN+iBejjB9ianucnS2MwJ3t2Z8UzjON5MUSBry1ljQ/euPjx/BlvvD2rGBHriJqXPQqhMo7N14Cnw8n/qHPvpFbPDP1yyzU/Bqn8G6kaGu3U+2r97gWy1/hSo9hMcppQti2rI/7Ssq5mSuKLCbtBLxX8Lu8spxvYOjZPiuEWjNnsAAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"postman\",\n    \"title\": \"postman\",\n    \"src\": \"/static/68462a623388dbc3f100af1db91ee0fe/c0255/ai-integration-postman.png\",\n    \"srcSet\": [\"/static/68462a623388dbc3f100af1db91ee0fe/81c8e/ai-integration-postman.png 230w\", \"/static/68462a623388dbc3f100af1db91ee0fe/08a84/ai-integration-postman.png 460w\", \"/static/68462a623388dbc3f100af1db91ee0fe/c0255/ai-integration-postman.png 920w\", \"/static/68462a623388dbc3f100af1db91ee0fe/b1001/ai-integration-postman.png 1380w\", \"/static/68462a623388dbc3f100af1db91ee0fe/161ec/ai-integration-postman.png 1840w\", \"/static/68462a623388dbc3f100af1db91ee0fe/b75f8/ai-integration-postman.png 2124w\"],\n    \"sizes\": \"(max-width: 920px) 100vw, 920px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"Multi-modal LLMs that support Vision (like \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://deepmind.google/models/gemma/\"\n  }, \"Gemma\"), \") allow you include base-64 encoded images directly in the conversation:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"base64 -w 0 your_image.jpg > image.b64\\n\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"model\\\": \\\"gemma\\\",\\n  \\\"messages\\\": [\\n    {\\n      \\\"role\\\": \\\"system\\\",\\n      \\\"content\\\": \\\"You are a helpful assistant that analyzes images.\\\"\\n    },\\n    {\\n      \\\"role\\\": \\\"user\\\",\\n      \\\"content\\\": [\\n        {\\n          \\\"type\\\": \\\"text\\\",\\n          \\\"text\\\": \\\"What do you see in this image?\\\"\\n        },\\n        {\\n          \\\"type\\\": \\\"image_url\\\",\\n          \\\"image_url\\\": {\\n            \\\"url\\\": \\\"data:image/jpeg;base64,PASTE_YOUR_BASE64_STRING_HERE\\\"\\n          }\\n        }\\n      ]\\n    }\\n  ],\\n  \\\"temperature\\\": 0.2,\\n  \\\"max_tokens\\\": 300\\n}\\n\")), mdx(\"p\", null, \"Newer versions of Llama Server (the engine behind LM Studio used in this tutorial) also support file URLs:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"model\\\": \\\"gemma\\\",\\n  \\\"messages\\\": [\\n    {\\n      \\\"role\\\": \\\"system\\\",\\n      \\\"content\\\": \\\"You are a helpful assistant that analyzes images.\\\"\\n    },\\n    {\\n      \\\"role\\\": \\\"user\\\",\\n      \\\"content\\\": [\\n        {\\n          \\\"type\\\": \\\"text\\\",\\n          \\\"text\\\": \\\"What do you see in this image?\\\"\\n        },\\n        {\\n          \\\"type\\\": \\\"image_url\\\",\\n          \\\"image_url\\\": {\\n            \\\"url\\\": \\\"file:///home/ubuntu/Desktop/pinout.png\\\"\\n          }\\n        }\\n      ]\\n    }\\n  ],\\n  \\\"temperature\\\": 0.2,\\n  \\\"max_tokens\\\": 300\\n}\\n\")), mdx(\"h3\", null, \"tool calls\"), mdx(\"p\", null, \"The Chat API supports a strongly-typed schema for advertising and making tool calls, as well as returning tool call results.\"), mdx(\"p\", null, \"In the following request, tool calls are advertised to the agent by including them in the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"tools\"), \" array, using exactly the same format we\\u2019ve used earlier to describe them in the system prompt:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"model\\\": \\\"Llama-3.2-3B-Instruct\\\",\\n  \\\"messages\\\": [\\n    {\\n      \\\"role\\\": \\\"user\\\",\\n      \\\"content\\\": \\\"What is the weather in Menlo Park?\\\"\\n    }\\n  ],\\n  \\\"tools\\\": [\\n    {\\n      \\\"type\\\": \\\"function\\\",\\n      \\\"function\\\": {\\n        \\\"name\\\": \\\"get_weather\\\",\\n        \\\"description\\\": \\\"Retrieve the current temperature for a specified location\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"location\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"The city, state, or country for which to fetch the temperature\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\\"location\\\"],\\n          \\\"additionalProperties\\\": false\\n        },\\n        \\\"strict\\\": true\\n      }\\n    }\\n  ]\\n}\\n\")), mdx(\"p\", null, \"The agent responds with empty message \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"content\"), \" and tool calls listed in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"tool_calls\"), \" array:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"model\\\": \\\"llama-3.2-3b-instruct\\\",\\n  \\\"choices\\\": [\\n    {\\n      \\\"index\\\": 0,\\n      \\\"message\\\": {\\n        \\\"role\\\": \\\"assistant\\\",\\n        \\\"content\\\": \\\"\\\",\\n        \\\"reasoning_content\\\": \\\"\\\",\\n        \\\"tool_calls\\\": [\\n          {\\n            \\\"type\\\": \\\"function\\\",\\n            \\\"id\\\": \\\"311592109\\\",\\n            \\\"function\\\": {\\n              \\\"name\\\": \\\"get_weather\\\",\\n              \\\"arguments\\\": \\\"{\\\\\\\"location\\\\\\\":\\\\\\\"Menlo Park\\\\\\\"}\\\"\\n            }\\n          }\\n        ]\\n      },\\n      \\\"finish_reason\\\": \\\"tool_calls\\\"\\n    }\\n  ]\\n}\\n\")), mdx(\"p\", null, \"This makes tool calls simple to extract from the JSON structure and execute for the program controlling the LLM.\"), mdx(\"h3\", null, \"structured output\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Structured Output\"), \" is a way to reliably constrain the output of an LLM to a data structure.\"), mdx(\"p\", null, \"This feature is similar to tool calls in that it allows LLMs to return JSON or Python data structures in response to natural language prompts, and it\\u2019s suppored by all major models:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://llama.developer.meta.com/docs/features/structured-output/\"\n  }, \"Llama Structured Output\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://ai.google.dev/gemini-api/docs/structured-output?example=recipe\"\n  }, \"Gemma Structured Output\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.alibabacloud.com/help/en/model-studio/qwen-structured-output\"\n  }, \"Qwen Structured Output\"))), mdx(\"p\", null, \"To enable Structured Output, include the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://json-schema.org/\"\n  }, \"JSON Schema\"), \" for validating the response in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"json_schema\"), \" under \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"response_format\"), \":\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"model\\\": \\\"local\\\",\\n  \\\"messages\\\": [\\n    {\\n      \\\"role\\\": \\\"system\\\",\\n      \\\"content\\\": \\\"You are a helpful jokester.\\\"\\n    },\\n    {\\n      \\\"role\\\": \\\"user\\\",\\n      \\\"content\\\": \\\"Tell me a joke.\\\"\\n    }\\n  ],\\n  \\\"response_format\\\": {\\n    \\\"type\\\": \\\"json_schema\\\",\\n    \\\"json_schema\\\": {\\n      \\\"name\\\": \\\"joke_response\\\",\\n      \\\"strict\\\": \\\"true\\\",\\n      \\\"schema\\\": {\\n        \\\"type\\\": \\\"object\\\",\\n        \\\"properties\\\": {\\n          \\\"joke\\\": {\\n            \\\"type\\\": \\\"string\\\"\\n          }\\n        },\\n        \\\"required\\\": [\\\"joke\\\"]\\n      }\\n    }\\n  }\\n}\\n\")), mdx(\"p\", null, \"The model response will include the data structure inside the message \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"content\"), \" rather than in the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"tool_calls\"), \" array:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"model\\\": \\\"llama-3.2-3b-instruct\\\",\\n  \\\"choices\\\": [\\n    {\\n      \\\"index\\\": 0,\\n      \\\"message\\\": {\\n        \\\"role\\\": \\\"assistant\\\",\\n        \\\"content\\\": \\\"{\\\\n  \\\\\\\"joke\\\\\\\": \\\\\\\"A man walked into a library and asked the librarian, 'Do you have any books on Pavlov's dogs and Schr\\xF6dinger's cat?' The librarian replied, 'It rings a bell, but I'm not sure if it's here or not.'\\\\\\\"\\\\n}\\\",\\n        \\\"reasoning_content\\\": \\\"\\\",\\n        \\\"tool_calls\\\": []\\n      },\\n      \\\"finish_reason\\\": \\\"stop\\\"\\n    }\\n  ]\\n}\\n\")), mdx(\"h3\", null, \"mcp\"), mdx(\"p\", null, \"Model Context Protocol (MCP) is a \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.anthropic.com/news/model-context-protocol\"\n  }, \"standard developed by Anthropic\"), \" to simplify integrating AI into applications.\"), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://modelcontextprotocol.io/docs/getting-started/intro\"\n  }, \"MCP specification\"), \" reduces the integration surface between AI agents and other layers of the software stack down to a simple class with methods which the agents can call to perform actions and retrieve information.\"), mdx(\"p\", null, \"MCP addresses the shortcomings of \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Tool Calling\"), \" and \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Structured Output\"), \":\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Structured Output\"), \" can only describe a single data structure with JSON Schema. The instructions for filling out this data structure must be included in the system prompt.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Tool Calling\"), \" expands on this by providing AI agents with multiple data structures they can output. The system prompt explains how to work with these tools.\")), mdx(\"p\", null, \"The system prompt is a part of the agent\\u2019s \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"context\"), \". Model Context Protocol lets you switch an AI agent\\u2019s context \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"on the fly\"), \", giving it a system prompt and tool calls for working on a specific task only when needed:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Without MCP, we would have to create our own system that can detect the task the user is working on and load the appropriate \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"system prompt\"), \" and \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"tools\"), \" to enable the AI agent to help with that task.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"With MCP, AI agents can query a server to determine which tools are available to use, and how to use them. This lets you build a large \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"directory\"), \" of tools the agent can use, and even include prompts - all without any custom coding on your part.\")), mdx(\"p\", null, \"MCP servers are simple to setup for \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://modelcontextprotocol.io/docs/sdk\"\n  }, \"many languages and frameworks\"), \":\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"A good starting point is using the \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/modelcontextprotocol/csharp-sdk\"\n  }, \"C# SDK\"), \" to standup a \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://modelcontextprotocol.io/docs/develop/build-server#c%23\"\n  }, \"server that lets AI agents query the National Weather Service\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Microsoft also published tutorials on \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://learn.microsoft.com/en-us/azure/app-service/tutorial-ai-model-context-protocol-server-dotnet\"\n  }, \"integrating an AI agent with a TODO list app\"), \" connected to a database, and an \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://devblogs.microsoft.com/dotnet/build-a-model-context-protocol-mcp-server-in-csharp/\"\n  }, \"echo server\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The companion example created as part of this article \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/01binary/inventory-llm\"\n  }, \"integrates an AI agent with an inventory tracking web application\"), \" which includes a React frontend, a .NET backend, and a SQLite database.\")), mdx(\"h2\", null, \"fine-tuning\"), mdx(\"p\", null, \"Now that we\\u2019ve explored all the major methods for integrating AI into applications and understand how to use the Chat API, it\\u2019s time to explore \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"fine-tuning\"), \": a way to lock-in the behavior defined by a general system prompt and few-shot example conversations that steer the AI agent toward desired outcomes for reliable production performance.\"), mdx(\"h3\", null, \"environment setup\"), mdx(\"p\", null, \"Data scientists use \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Scientific computing notebooks\"), \" to fine-tune Large Language Models. These notebooks are divided into cells, with some cells containing text and graphics formatted with Markdown, and others containing Python code.\"), mdx(\"p\", null, \"Rather than configuring a scientific computing environment on your own machine, we\\u2019ll use the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.kaggle.com/\"\n  }, \"Kaggle\"), \" cloud environment. This avoids many common hardware and software setup issues and lets you start training models immediately:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Hardware\"), \": Data-center GPUs such as the NVIDIA \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.newegg.com/p/1FT-000P-005F0\"\n  }, \"T4\"), \" or \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.newegg.com/nvidia-900-2h400-0000-000-tesla-p100-16gb-graphics-card/p/2VV-000H-000J6\"\n  }, \"P100\"), \" are expensive and typically require a custom PC or server. Both are supported in Kaggle out-of-the-box.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Software\"), \": Local Python and ML setups often run into dependency and version conflicts. Using a cloud Python notebook is essentially like spinning up a VM: everything is setup from scratch every time, exactly the right way.\")), mdx(\"p\", null, \"Create a Kaggle account to get started. Kaggle provides free compute credits each month, with the option to add a credit card for additional usage.\"), mdx(\"h3\", null, \"loading a model\"), mdx(\"p\", null, \"In this section we\\u2019ll pull a pre-trained AI model from Hugging Face Hub, and load it in our Python notebook.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Llama 3.2\"), \" is a family of large language models chosen for this tutorial because it strikes a good balance between capability, accessibility, and ecosystem support:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Well documented, with extensive examples (see the \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/meta-llama/llama-cookbook\"\n  }, \"Llama Cookbook\"), \")\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Available in both base (\", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"pre-trained\"), \") and \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"instruction-tuned\"), \" variants\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Available in \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.newline.co/@zaoyang/4-bit-vs-8-bit-quantization-key-differences--842272c7\"\n  }, \"quantized\"), \" form to reduce memory requirements\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Supported by Kaggle\\u2019s cloud environment, with no local hardware setup required\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Fully supported by the \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://unsloth.ai/\"\n  }, \"Unsloth\"), \" library for fast fine-tuning\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Deployable to common cloud platforms such as \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/meta%E2%80%99s-new-llama-3-2-slms-and-image-reasoning-models-now-available-on-azure-ai-m/4255167\"\n  }, \"Microsoft Foundry\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Supports external tool calling when using the \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Instruct\"), \" variant\")), mdx(\"p\", null, \"We use the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Unsloth\"), \" library to load and fine-tune the model. Unsloth provides a ready-to-use \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.kaggle.com/notebooks/welcome?src=https://github.com/unslothai/notebooks/blob/main/nb/Kaggle-Llama3.2_(1B_and_3B)-Conversational.ipynb&accelerator=nvidiaTeslaT4\"\n  }, \"Python notebook template for Kaggle\"), \" that includes all required setup code.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"For a deeper introduction to Unsloth, see the official \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.unsloth.ai/get-started/fine-tuning-llms-guide\"\n  }, \"fine-tuning with Unsloth\"), \" guide.\")), mdx(\"p\", null, \"This notebook template from the Unsloth team was used as the basis for the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"./fine-tune.py\"\n  }, \"fine-tuning\"), \" and \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"./inference.py\"\n  }, \"inference\"), \" scripts in this repository.\"), mdx(\"p\", null, \"The fine-tuning script in this repository uses:\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"unsloth/Llama-3.2-3B-Instruct-bnb-4bit\"))), mdx(\"p\", null, \"This model is:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"3 billion parameters\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Pre-trained on large-scale text data\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Instruction-tuned for conversational behavior and tool calling\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Quantized to 4-bit using \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://huggingface.co/docs/transformers/en/quantization/bitsandbytes\"\n  }, \"BnB (Bits and Bytes) format\"), \" to reduce GPU memory usage\")), mdx(\"h3\", null, \"preparing a dataset\"), mdx(\"p\", null, \"In this section we look inside a typical dataset used to train AI models and discuss strategies for generating one. After generating the dataset we upload it to Kaggle registry so that we can use it for training in the next step.\"), mdx(\"h3\", null, \"dataset formats\"), mdx(\"p\", null, \"Several compact dataset formats are commonly used for instruction fine-tuning. Fortunately, these formats closely resemble Chat API request payloads, so if you experimented with the Chat API earlier, the dataset structure will already feel familiar.\"), mdx(\"p\", null, \"In this tutorial, we focus on \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"ShareGPT format\"), \", but the closely related \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Hugging Face Generic format\"), \" is also shown for reference. Many libraries can convert between these formats if needed.\"), mdx(\"h4\", null, \"shareGPT\"), mdx(\"p\", null, \"In ShareGPT format, the dataset is stored as a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".jsonl\"), \" (\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"JSON Lines\"), \") file. Each line represents one conversation and contains a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"conversations\"), \" array.\"), mdx(\"p\", null, \"Each entry in the array specifies the message source (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"from\"), \") and the message content (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"value\"), \"):\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"th\"\n  }, \"from\"), \" value\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"system\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"System prompt\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"human\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"User question\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"gpt\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Chat bot response\")))), mdx(\"p\", null, \"Example of a single dataset row (shown as formatted JSON):\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"conversations\\\": [\\n    { \\\"from\\\": \\\"system\\\", \\\"value\\\": \\\"You are an assistant\\\" },\\n    { \\\"from\\\": \\\"human\\\", \\\"value\\\": \\\"What is 2+2?\\\" },\\n    { \\\"from\\\": \\\"gpt\\\", \\\"value\\\": \\\"It's 4.\\\" }\\n  ]\\n}\\n\")), mdx(\"p\", null, \"An example of a published dataset in ShareGPT format can be found here:\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/datasets/mlabonne/FineTome-100k\"\n  }, \"mlabonne/FineTome-100k\"), \".\"), mdx(\"h4\", null, \"hugging face\"), mdx(\"p\", null, \"The Hugging Face Generic format uses the same structure (a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".jsonl\"), \" file with one conversation per line) but with slightly different field names - \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"role\"), \" instead of \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"from\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"content\"), \" instead of \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"value\"), \":\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"th\"\n  }, \"role\"), \" value\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"system\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"System prompt\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"user\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"User question\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"assistant\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Chat bot response\")))), mdx(\"p\", null, \"An example dataset in this format is available at: \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/datasets/allenai/tulu-3-sft-mixture/viewer/default/train\"\n  }, \"allenai/tulu-3-sft-mixture\"), \".\"), mdx(\"h3\", null, \"uploading dataset\"), mdx(\"p\", null, \"In order to use an instruction prompt dataset during training, it has to be uploaded to a repository like \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/datasets\"\n  }, \"Huggingface\"), \" or \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.kaggle.com/datasets\"\n  }, \"Kaggle\"), \". Both function like \\u201CGitHub for data science\\u201D and support pushing and pulling AI models and datasets.\"), mdx(\"p\", null, \"Datasets are stored either directly as \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"JSONL\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"CSV\"), \", or in a sharded format called \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.snowflake.com/en/fundamentals/parquet/\"\n  }, \"Parquet\"), \". Using shards lets repositories split large datasets into many pieces for efficient storage.\"), mdx(\"p\", null, \"Install Kaggle CLI:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"pip install --break-system-packages kaggle\\n\")), mdx(\"p\", null, \"Go to \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.kaggle.com/settings\"\n  }, \"Kaggle Settings\"), \", scroll down to \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Legacy API Credentials\"), \" and click \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Create Legacy API Key\"), \", which will download \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"kaggle.json\"), \" with your credentials.\"), mdx(\"p\", null, \"Move \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"kaggle.json\"), \" to the Kaggle configuration directory and set permissions:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"mv ~/Downloads/kaggle.json ~/.kaggle\\nchmod 600 ~/.kaggle/kaggle.json\\n\")), mdx(\"p\", null, \"Finally, upload the dataset:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"kaggle datasets create -p upload\\n\")), mdx(\"p\", null, \"The following can be used to update the dataset later without having to re-create it:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"kaggle datasets version -p upload -m \\\"Update message\\\"\\n\")), mdx(\"p\", null, \"For more information, see the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.kaggle.com/docs/api#getting-started-installation-&-authentication\"\n  }, \"Kaggle API documentation\"), \".\"), mdx(\"p\", null, \"Once the dataset is uploaded, it can be added to the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Inputs\"), \" section displayed in a side-bar of a Kaggle notebook. When the notebook is executed, this will cause the dataset to be automatically downloaded to the working directory of the virtual machine spun up by Kaggle to run the notebook.\"), mdx(\"h2\", null, \"training\"), mdx(\"p\", null, \"This section covers how the model is fine-tuned using supervised learning, parameter-efficient techniques, and configurable training settings.\"), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.kaggle.com/notebooks/welcome?src=https://github.com/unslothai/notebooks/blob/main/nb/Kaggle-Llama3.2_(1B_and_3B)-Conversational.ipynb&accelerator=nvidiaTeslaT4\"\n  }, \"Unsloth Kaggle template\"), \" used in this tutorial relies on the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/docs/trl/en/sft_trainer\"\n  }, \"Hugging Face Supervised Fine-Tuning (SFT) Trainer\"), \".\"), mdx(\"p\", null, \"Supervised fine-tuning trains the model using labeled examples, where each input prompt is paired with an expected response. This allows the model to learn how to map questions to appropriate answers.\"), mdx(\"p\", null, \"This differs from pre-training, where the model is trained on large volumes of unlabeled text and learns by predicting the next token without explicit guidance.\"), mdx(\"h3\", null, \"low-rank adaptation\"), mdx(\"p\", null, \"The Unsloth template also uses \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.unsloth.ai/get-started/fine-tuning-llms-guide/lora-hyperparameters-guide\"\n  }, \"Low-Rank Adaptation (LoRA)\"), \", a parameter-efficient fine-tuning technique.\"), mdx(\"p\", null, \"LoRA works by freezing the original pre-trained model weights and introducing a small number of additional trainable matrices. Only these new weights are updated during training, which significantly reduces memory usage and training cost.\"), mdx(\"p\", null, \"As described by the Unsloth team:\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"In LLMs, we have model weights. Llama 70B has 70 billion numbers. Instead of changing all 70B numbers, we add thin matrices A and B to each weight and optimize those instead. This typically means training around 1% of the total parameters.\")), mdx(\"h3\", null, \"hyperparameters\"), mdx(\"p\", null, \"Model weights are commonly referred to as \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"parameters\"), \". To avoid confusion, the configuration values that control \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"how\"), \" those parameters are trained are called \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"hyperparameters\"), \".\"), mdx(\"p\", null, \"In this tutorial, hyperparameters fall into two main categories:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"LoRA hyperparameters\"), \", which control \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"what parts of the model are trainable\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Training hyperparameters\"), \", which control \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"how training proceeds\"))), mdx(\"p\", null, \"Together, these settings determine training stability, speed, memory usage, and the quality of the final model.\"), mdx(\"h4\", null, \"adaptation\"), mdx(\"p\", null, \"Low-Rank Adaptation (LoRA) introduces a small number of trainable weights on top of a frozen pre-trained model. The following hyperparameters control how those additional weights are configured:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Hyperparameter\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Practical Impact\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"r\"), \" (Rank)\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Number of trainable dimensions added per adapted layer\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Higher values increase learning capacity and memory usage; common values are 8\\u201364\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"lora_alpha\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Scaling factor applied to LoRA updates\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Higher values increase the influence of LoRA weights during training\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"lora_dropout\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Dropout applied to LoRA layers\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Adds regularization; often set to 0 for instruction fine-tuning\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"target_modules\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Model submodules to apply LoRA to (e.g., attention and MLP projections)\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Controls \", mdx(\"em\", {\n    parentName: \"td\"\n  }, \"where\"), \" the model can learn; more modules = higher capacity and cost\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"bias\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Whether bias parameters are trained\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Usually set to \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"none\"), \" to minimize trainable parameters\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"use_rslora\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Enables rank-stabilized LoRA\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Improves numerical stability at higher ranks (disabled here)\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"loftq_config\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Enables LoRA-aware quantization\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Used when combining LoRA with advanced quantization techniques\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"use_gradient_checkpointing\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Trades compute for memory by recomputing activations\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Enables training larger models on limited hardware\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"random_state\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Seed controlling LoRA initialization\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Ensures reproducibility of training runs\")))), mdx(\"p\", null, \"These hyperparameters determine \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"how much\"), \" the model can change and \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"where\"), \" those changes are applied.\"), mdx(\"h4\", null, \"learning\"), mdx(\"p\", null, \"Training hyperparameters control how the model learns from the dataset and how gradients are applied over time:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Hyperparameter\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Practical Impact\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"learning_rate\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Step size used when updating trainable parameters\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Too high can cause instability; too low slows learning\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"num_train_epochs\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Number of full passes over the dataset\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"More epochs improve learning but increase overfitting risk\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"max_steps\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Maximum number of training steps\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Used as an alternative to epochs for fine-grained control\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"per_device_train_batch_size\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Number of samples processed per GPU step\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Larger batches improve stability but increase memory use\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"gradient_accumulation_steps\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Number of steps to accumulate gradients before updating\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Simulates larger batch sizes on limited hardware\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"warmup_steps\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Number of steps used to gradually increase learning rate\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Stabilizes early training\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"lr_scheduler_type\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Learning rate schedule over time\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Controls how learning rate decays during training\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"weight_decay\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Regularization applied to model weights\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Helps prevent overfitting\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"optim\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Optimizer used to update parameters\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Memory-efficient optimizers (e.g., \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"adamw_8bit\"), \") reduce GPU usage\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"packing\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Packs multiple short samples into a single sequence\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Improves training efficiency for short conversations\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"max_seq_length\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Maximum token length of training samples\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Higher values increase memory usage and context capacity\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"seed\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Random seed for training\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Ensures reproducibility\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"logging_steps\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Frequency of training logs\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Affects observability, not training quality\")))), mdx(\"p\", null, \"These settings control the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"learning dynamics\"), \" - how fast the model learns, how stable training is, and how efficiently hardware is used.\"), mdx(\"p\", null, \"Fine-tuning usually begins with conservative defaults and small experiments. Hyperparameters are then adjusted iteratively based on training stability, loss curves, and model behavior.\"), mdx(\"h2\", null, \"inference\"), mdx(\"p\", null, \"In this section we evaluate the fine-tuned model across the full lifecycle: in development (directly in the notebook), in testing (by downloading from the Hub and running locally in LM Studio), and in production (by calling a deployed Chat API endpoint).\"), mdx(\"p\", null, \"Using a large language model to generate responses is referred to as \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"inference\"), \". During inference, the model applies its learned weights to predict outputs based on supplied input, such as a user question or conversation history.\"), mdx(\"h3\", null, \"development\"), mdx(\"p\", null, \"During development, Unsloth provides a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"generate\"), \" method on \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FastLanguageModel\"), \" that allows running inference as soon as training completes. This makes it possible to test prompts and evaluate model behavior without first pushing the model to a repository.\"), mdx(\"p\", null, \"Development inference is useful for rapid iteration, debugging prompts, and verifying that fine-tuning produced the expected behavior - all within the confines of the Python training notebook.\"), mdx(\"h3\", null, \"testing\"), mdx(\"p\", null, \"After training completes, the Python code in \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"./fine-tune.py\"\n  }, \"fine-tune.py\"), \" uses the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"push_to_hub_merged\"), \" method to upload the model to a Hugging Face repository.\"), mdx(\"p\", null, \"This merges the frozen pre-trained weights with the fine-tuned LoRA weights into a single, fully deployable model.\"), mdx(\"p\", null, \"A typical model repository includes the following files:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".gitattributes\"), \": maps large files to Git Large File Storage (LFS)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"README.md\"), \": model documentation, often generated from dataset metadata\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"chat_template.jinja\"), \": defines the request/response format used by inference services\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"config.json\"), \": model configuration (data types, vocabulary size, token IDs, etc.)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"*.safetensors\"), \": one or more shards of model weights\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"model.safetensors.index.json\"), \": index mapping shards to model layers\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"special_tokens_map.json\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"tokenizer.json\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"tokenizer_config.json\"), \": tokenizer configuration files\")), mdx(\"p\", null, \"Large models are often split into multiple files, or \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"shards\"), \", which allows registries to store and distribute them more efficiently.\"), mdx(\"p\", null, \"To load your fine-tuned model in LM Studio or try the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"./inference.py\"\n  }, \"inference.py\"), \" notebook, first it must be pushed to Hugging Face model registry.\"), mdx(\"p\", null, \"This will let you use the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://huggingface.co/docs/huggingface_hub/en/guides/cli\"\n  }, \"Hugging Face CLI\"), \", configured with a Hugging Face API Token, to download the model into LM Studio\\u2019s model folder for local testing:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"OS\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Location\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Mac\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"~/Library/Application Support/LM Studio/models\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Windows\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"%USERPROFILE%\\\\AppData\\\\Local\\\\LMStudio\\\\models\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Linux\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"~/.local/share/LMStudio/models\"))))), mdx(\"p\", null, \"Model repositories can contain weights for several flavors of the model. To avoid downloading all model flavors, specify the file name after the repository name.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"pip install --upgrade huggingface_hub\\n\\nhf auth login\\n\\nhf download <repo_id> <file_name> \\\\\\n  --local-dir <destination_folder>\\n\")), mdx(\"h3\", null, \"production\"), mdx(\"p\", null, \"Once your trained model is available on the Hugging Face registry, cloud providers can pull your model and start a virtual machine that exposes a Chat API:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://huggingface.co/docs/inference-endpoints/en/index\"\n  }, \"Hugging Face Inference Endpoints\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://aws.amazon.com/sagemaker\"\n  }, \"Amazon SageMaker\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://ai.azure.com/catalog/publishers/hugging%20face,huggingface\"\n  }, \"Microsoft Foundry\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://cloud.google.com/vertex-ai\"\n  }, \"Google Vertex AI\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://friendli.ai/product/dedicated-endpoints\"\n  }, \"Friendli Endpoints\"))));\n}\n;\nMDXContent.isMDXComponent = true;","timeToRead":13,"frontmatter":{"title":"AI integration","description":"Train your own AI model this weekend, then wire it into the software you built!","image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAACQklEQVQozwE3Asj9AM/PzQHCndgF10fyANJx5k3RYuiWw2LfFshHqwDFtn0X6MZBD0Fe/AB+h9gA////ALJMqBx3d7Mlvqy6ALezsCPGyMiQycnJT8vKygC5ubcAAMbIzQL/v9sGyA74AM5e5n3MUObt2knoGE5pulyCfqk3cnCDN3J3qXFsdr5cOTUSBm1huY1la8VA08CIAJKYnIqhm57/tra2/8LCwre7urkgAP702AIJJ9QJ7aXcANRh6TjHReTD/wrzElBgrXhreNBkLziJTT9Ijf9mcLrmb2+2YFpft5hVbNQZAFbsA6OFcqJpX2P/Wl5a/L+9vP+4uLdmAL7L7QC2wdybnKrToMaE5QDNVOeL0FriLP9i/wBgXrKUVFScqVhjofNjccfoYl6trIpzfSf/wAAAooGIPZptiFppf6Wxfn+E77Wzr/++vr5HANnZ2Tbc29r8v72+igAAAADRWutrzW3GNJ+ZABPTXa8XTUNxhVdfkf9kdM//W2G7r4KGumDWmF8qiWqiP1+f7y2dm/8Rp5+oJLS0rzMAAAAAAMbGxlvT09SQw83AAM1n5ADNXecpwnfDJ21xRCJNVKWeSEeVkkJIjNJcY7m7gVqXO11mtreDfsNCno/1CoSeyUGdgJwFb1mLAKCfkADBwL4CAP///wD///8AqpOuAL6OyQHLY+AASrFBAkM81QM9OYcWAKkAADAslw0YAAADmeh9CByuxSRNpN4cmnjZEYiyyRbM/7AAs6y4BMHBvwXPz88BzkYlrBRWejkAAAAASUVORK5CYII=","aspectRatio":2.742857142857143,"src":"/static/6881eaaf46b3c277c6f08136e0975add/79420/ai-integration.png","srcSet":"/static/6881eaaf46b3c277c6f08136e0975add/2481b/ai-integration.png 192w,\n/static/6881eaaf46b3c277c6f08136e0975add/1da6e/ai-integration.png 384w,\n/static/6881eaaf46b3c277c6f08136e0975add/79420/ai-integration.png 768w,\n/static/6881eaaf46b3c277c6f08136e0975add/497d3/ai-integration.png 1152w,\n/static/6881eaaf46b3c277c6f08136e0975add/e022e/ai-integration.png 1536w,\n/static/6881eaaf46b3c277c6f08136e0975add/94c9d/ai-integration.png 1950w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":"Valeriy Novytskyy","relativeDate":"a day ago","date":"Jul 29, 2026","location":"^H Hackerspace","tags":["engineering-software"]},"fields":{"url":"/articles/ai-integration/","collection":"articles","subCollection":null,"tags":["engineering-software"]},"headings":[{"value":"overview","depth":2},{"value":"pre-training","depth":3},{"value":"fine-tuning","depth":3},{"value":"evaluating models","depth":2},{"value":"exploring models","depth":3},{"value":"model capabilities","depth":3},{"value":"prompts","depth":3},{"value":"tool calling","depth":3},{"value":"integration","depth":2},{"value":"chat API","depth":3},{"value":"tool calls","depth":3},{"value":"structured output","depth":3},{"value":"mcp","depth":3},{"value":"fine-tuning","depth":2},{"value":"environment setup","depth":3},{"value":"loading a model","depth":3},{"value":"preparing a dataset","depth":3},{"value":"dataset formats","depth":3},{"value":"shareGPT","depth":4},{"value":"hugging face","depth":4},{"value":"uploading dataset","depth":3},{"value":"training","depth":2},{"value":"low-rank adaptation","depth":3},{"value":"hyperparameters","depth":3},{"value":"adaptation","depth":4},{"value":"learning","depth":4},{"value":"inference","depth":2},{"value":"development","depth":3},{"value":"testing","depth":3},{"value":"production","depth":3}]},"project":null,"tagGroups":{"group":[{"tag":"bookreview","totalCount":4},{"tag":"design-graphic","totalCount":2},{"tag":"design-industrial","totalCount":2},{"tag":"engineering-architecture","totalCount":1},{"tag":"engineering-electrical","totalCount":2},{"tag":"engineering-mechanical","totalCount":1},{"tag":"engineering-robotics","totalCount":3},{"tag":"engineering-software","totalCount":10},{"tag":"fp","totalCount":2},{"tag":"philosophy","totalCount":3},{"tag":"physics","totalCount":2},{"tag":"production","totalCount":2},{"tag":"signal","totalCount":2},{"tag":"tool-aftereffects","totalCount":1},{"tag":"tool-arduino","totalCount":2},{"tag":"tool-blender","totalCount":2},{"tag":"tool-cpp","totalCount":4},{"tag":"tool-illustrator","totalCount":1},{"tag":"tool-js","totalCount":1},{"tag":"tool-matlab","totalCount":3},{"tag":"tool-premiere","totalCount":1},{"tag":"tool-raspi","totalCount":1}]},"logs":{"nodes":[]},"images":{"edges":[{"node":{"original":{"src":"/static/blank-25bb876fead6a32c95ee0a2bebac36e5.png","width":960,"height":510}}},{"node":{"original":{"src":"/static/icon-69ef0f99e2367f4258dc0a6d0db98638.png","width":460,"height":460}}},{"node":{"original":{"src":"/static/microsoft-auth-process-e5f77055ef19cdd63231b42a23a3de68.png","width":1641,"height":680}}},{"node":{"original":{"src":"/static/360-camera-ab95d3caa7f5bc22b354498193beece3.jpg","width":960,"height":720}}},{"node":{"original":{"src":"/static/blank-25bb876fead6a32c95ee0a2bebac36e5.png","width":960,"height":510}}},{"node":{"original":{"src":"/static/inverse-kinematics-atan2-app-091086db3a10c3591948dc03f037f487.png","width":1915,"height":1096}}},{"node":{"original":{"src":"/static/inverse-kinematics-atan2-e4a14dc81542c70751a96a4a28573d40.png","width":1773,"height":765}}},{"node":{"original":{"src":"/static/inverse-kinematics-gradient-f7699e9132866b980d18242c58303444.png","width":1834,"height":494}}},{"node":{"original":{"src":"/static/inverse-kinematics-law-of-cosines-51d9f60e408d4886b7cb80e4a71acf4f.png","width":2333,"height":790}}},{"node":{"original":{"src":"/static/kalman-covariance2x2-40cc672b43271889884a3bd0406218e1.png","width":1434,"height":504}}},{"node":{"original":{"src":"/static/kalman-prediction-68359f50e5a8c19c2c2be28dadb468ff.png","width":2180,"height":848}}},{"node":{"original":{"src":"/static/kalman-rate-mismatch-dc4184f96c7c96c6fd4661733fd2d2e2.png","width":2099,"height":1119}}},{"node":{"original":{"src":"/static/kalman-simulation-0f511d290500813e38d14ae671978206.png","width":1647,"height":1241}}},{"node":{"original":{"src":"/static/model-of-human-mind-nuke-nodes-5cfae8349e1b420875b47026f3122cd8.png","width":925,"height":931}}},{"node":{"original":{"src":"/static/pid-control-characteristics-e5187e37776875d548812ef35d6eefe4.png","width":2282,"height":864}}},{"node":{"original":{"src":"/static/pid-delay-b4b0a723495b325313bb74e0ef4e218e.png","width":2293,"height":655}}},{"node":{"original":{"src":"/static/pid-envelope-a865cf8c1a6340af56677ea214fe5f5f.png","width":2296,"height":968}}},{"node":{"original":{"src":"/static/pid-equation-overview-27b60f24fc2a1392b914aed59e2056e9.png","width":1720,"height":475}}},{"node":{"original":{"src":"/static/pid-instability-82dbe73d841c7f3183e9bceac44c1214.png","width":2113,"height":655}}},{"node":{"original":{"src":"/static/pid-kd-term-68bde17c55023c446642a1645ccf3092.png","width":2102,"height":722}}},{"node":{"original":{"src":"/static/pid-ki-term-7f54879402993469acaf3727423fafd1.png","width":2166,"height":722}}},{"node":{"original":{"src":"/static/pid-kp-term-5a2a1cd5338640f40a85a90302fb339a.png","width":2012,"height":718}}},{"node":{"original":{"src":"/static/pid-model-predictive-control-648f0cfffdf01986d1666d16b79d3987.png","width":1980,"height":1028}}},{"node":{"original":{"src":"/static/pid-steady-state-f80a09dea36e8ad946db5c308666fd01.png","width":2293,"height":655}}},{"node":{"original":{"src":"/static/pid-sys-id-app-93147d72fbef7c41dd89a6ed5def02a0.png","width":1268,"height":206}}},{"node":{"original":{"src":"/static/pid-tuner-app-matlab-toolbar-3bc06115fa7d17da53133434971efbc8.png","width":1272,"height":252}}},{"node":{"original":{"src":"/static/pid-what-is-derivative-82522fe572a2a31b201bb47547dbc935.png","width":2188,"height":890}}},{"node":{"original":{"src":"/static/pid-windup-9269a8316b87f84ee0e60f523eebb203.png","width":2113,"height":655}}},{"node":{"original":{"src":"/static/what-they-dont-jk-46d431d41556229c8fd63a3c39a9f1d9.jpeg","width":128,"height":128}}},{"node":{"original":{"src":"/static/ai-integration-timeline-84901a32a56eba8e37ebaa4eed472d18.png","width":1900,"height":608}}},{"node":{"original":{"src":"/static/data-driven-graphics-a24d3280aa41464d6eaf78eb85139aff.png","width":2003,"height":731}}},{"node":{"original":{"src":"/static/inverse-kinematics-bias-angle-7bbfc7753ff6217b0fa15c6c1f5c91fd.png","width":2196,"height":1314}}},{"node":{"original":{"src":"/static/inverse-kinematics-law-of-cosines-shoulder-e8b9b5b2b76f5bafed4f99fd0de8f8e5.png","width":2474,"height":1334}}},{"node":{"original":{"src":"/static/inverse-kinematics-sampling-d0484cca07f5d9c4124c64d2da94a1f4.png","width":1750,"height":1000}}},{"node":{"original":{"src":"/static/kalman-avg-ec3a62c48f003dcf94cc2a54fe6ce79c.png","width":1794,"height":736}}},{"node":{"original":{"src":"/static/kalman-filter-sensors-fusion-282c30a4dccd1de36f8c6de72202fe5e.png","width":2371,"height":1165}}},{"node":{"original":{"src":"/static/kalman-covariance3x3-52e00c510ee060376047ee43ad9ee5f0.png","width":2238,"height":633}}},{"node":{"original":{"src":"/static/kalman-sensor-fusion3-c4831b8e75420fe95501d87645565fdd.png","width":2132,"height":1096}}},{"node":{"original":{"src":"/static/kalman-system-identification-799f87ae0bffff9f0e17750b0eda44ad.png","width":1484,"height":900}}},{"node":{"original":{"src":"/static/kalman-transition-c0e343505b6b56ef59769ca45f6f1fad.png","width":2360,"height":941}}},{"node":{"original":{"src":"/static/kalman-variance-ac921fd04e712765be29951178b3b485.png","width":2318,"height":1036}}},{"node":{"original":{"src":"/static/kalman-vehicle-f0c10de7a426ed2004f2118939de814f.png","width":2097,"height":744}}},{"node":{"original":{"src":"/static/pid-all-terms-e9fdd000c98759fcf7c1200c8f2873ad.png","width":1766,"height":732}}},{"node":{"original":{"src":"/static/pid-component-dynamics-b51862d84d8d1c2052c2257b645b388f.png","width":3030,"height":988}}},{"node":{"original":{"src":"/static/pid-control-neural-network-5b67f0ef6e3d8c45f2c09c3604fd8284.png","width":2318,"height":1074}}},{"node":{"original":{"src":"/static/pid-equation-all-terms-692f6250b661a4414c1b487d280bbf3e.png","width":1821,"height":1155}}},{"node":{"original":{"src":"/static/pid-import-column-vectors-b02d76b5d90f1542e5165da8a0d529f8.png","width":1442,"height":560}}},{"node":{"original":{"src":"/static/pid-import-data-plot-5871af58451fca708a6b03686d5a9d41.png","width":1618,"height":826}}},{"node":{"original":{"src":"/static/pid-import-data-e4cddc9b5ed430e6828056ba674e62a5.png","width":1228,"height":236}}},{"node":{"original":{"src":"/static/pid-live-script-a095708bb1175c9ee533847977c0fe8a.png","width":1362,"height":346}}},{"node":{"original":{"src":"/static/pid-model-output-4ecb953b8a8aca1b409847d3fbb754b1.png","width":1544,"height":944}}},{"node":{"original":{"src":"/static/pid-smooth-data-button-646a2ae3bee2103c105d7284b653b814.png","width":1334,"height":442}}},{"node":{"original":{"src":"/static/pid-web-app-step-e0e6acdb799909788e47d4b037e546b8.png","width":2654,"height":666}}},{"node":{"original":{"src":"/static/state-of-tech-decentralize-2c0eaa2df77e68d7fda5a304735d4371.png","width":1836,"height":681}}},{"node":{"original":{"src":"/static/absolute-encoders-orbis-1a24dd0ab5ba73f020ff1f0026130eb1.jpeg","width":1472,"height":909}}},{"node":{"original":{"src":"/static/art-of-coaching-drama-dd34d1cdd726ecd11b900f2ae20cbb8e.png","width":2077,"height":738}}},{"node":{"original":{"src":"/static/inverse-kinematics-fixed-joint-743ebc101520a4770dea555fea55736d.png","width":2406,"height":1159}}},{"node":{"original":{"src":"/static/inverse-kinematics-law-of-cosines-elbow-b19bd1acf2d0074ccaca097c9e0ddcaf.png","width":2213,"height":1255}}},{"node":{"original":{"src":"/static/kalman-motor-8f996e20c1be9bcab076f79bc1adc817.png","width":1678,"height":595}}},{"node":{"original":{"src":"/static/pid-sys-id-time-domain-de8165ce981fe7cd054c86ab29dc9c11.png","width":1354,"height":866}}},{"node":{"original":{"src":"/static/pid-tuner-import-plant-580cdac4e62e6876f6012abbedf075fc.png","width":2156,"height":588}}},{"node":{"original":{"src":"/static/state-of-tech-history-69950980f3849c95c85ea6b1eeba2bbd.png","width":1970,"height":617}}},{"node":{"original":{"src":"/static/theory-of-consciousness-e1cdf3f3f89755cdb7d598c68af44f6d.png","width":2142,"height":795}}},{"node":{"original":{"src":"/static/absolute-encoders-aksim2-dfb488712ab584d0ed83c98ff5f0373b.jpeg","width":1484,"height":1227}}},{"node":{"original":{"src":"/static/art-of-coaching-force-field-afc3592f4862704cc2a7aa3642450a75.png","width":2363,"height":887}}},{"node":{"original":{"src":"/static/kalman-constant-acceleration-notebook-7dd4328f5d10c47fee1f980c9bbbff18.png","width":1930,"height":1390}}},{"node":{"original":{"src":"/static/kalman-linear-model-notebook-53f2d7d06026fe020930f39d71f12f67.png","width":1827,"height":1372}}},{"node":{"original":{"src":"/static/kalman-lowpass-5236202bf9c9c2540e6342f4af0ec7e2.png","width":1793,"height":735}}},{"node":{"original":{"src":"/static/kalman-model-output-722de787fd4c65b07abbe268856fa50d.png","width":1805,"height":1157}}},{"node":{"original":{"src":"/static/personal-mba-book-8d098eb4d984501957096973fc02c12c.png","width":1521,"height":888}}},{"node":{"original":{"src":"/static/pid-smooth-data-667d1b139600d84957542ac6e26d24dd.png","width":2208,"height":904}}},{"node":{"original":{"src":"/static/ai-integration-system-prompt-47b60c5ea302ada40e70246e453cc2fe.png","width":2790,"height":1612}}},{"node":{"original":{"src":"/static/only-paranoid-survive-2fd8a64ab036595039d89690bcd2dc86.png","width":2148,"height":794}}},{"node":{"original":{"src":"/static/pid-tune-response-4b9eba9d8a82df95aed769a1d37fd118.png","width":2158,"height":1434}}},{"node":{"original":{"src":"/static/pid-spring-physics-9c3bbee3f6ef8ba012fcf368efc18626.png","width":2073,"height":893}}},{"node":{"original":{"src":"/static/ai-integration-postman-68462a623388dbc3f100af1db91ee0fe.png","width":2124,"height":1766}}},{"node":{"original":{"src":"/static/art-of-coaching-learning-cycle-01cfe8c84d9f2282c24d0a5c63234d84.png","width":2274,"height":1154}}},{"node":{"original":{"src":"/static/pid-control-design-b0f5a36c63ab21a0a38a929a7a7dccbb.png","width":2713,"height":1001}}},{"node":{"original":{"src":"/static/absolute-encoders-as5045-46e942cdaa780df4a35209f22e51970b.jpeg","width":2170,"height":1387}}},{"node":{"original":{"src":"/static/ai-integration-tool-call-0b28cc1a63eac922c6c247afb7093f87.png","width":2792,"height":1610}}},{"node":{"original":{"src":"/static/model-of-human-mind-15176466145dc6e631b994f6aaf168b1.png","width":2560,"height":953}}},{"node":{"original":{"src":"/static/theory-of-consciousness-philosophy-9e37422135d0b20d7bc553b3a194e493.png","width":1115,"height":603}}},{"node":{"original":{"src":"/static/what-they-dont-succession-6ba343f3fc94f30b10ff17b95c638db5.png","width":682,"height":397}}},{"node":{"original":{"src":"/static/absolute-encoders-as5045-custom-159a2ebc04c184e4e70cfc109d1fbfe5.jpeg","width":3115,"height":1195}}},{"node":{"original":{"src":"/static/inverse-kinematics-background-c1bd38e204819d8d7d3dea9c726f912c.png","width":2264,"height":1091}}},{"node":{"original":{"src":"/static/kalman-background-6137249fa065b9a59eb8600db46574ef.png","width":1698,"height":818}}},{"node":{"original":{"src":"/static/pid-show-parameters-3627b46fa99aa21f7f351083ebe294d3.png","width":2152,"height":1430}}},{"node":{"original":{"src":"/static/inverse-kinematics-end-effector-053804d866aa93f1cda425665dfa94d1.png","width":1383,"height":1248}}},{"node":{"original":{"src":"/static/pid-presentation-9632cb1a066d0d853008f20f0e2b4a13.png","width":1656,"height":930}}},{"node":{"original":{"src":"/static/pid-what-is-integral-44e09f4b9aaf464de5818c97c2eddc9c.png","width":2098,"height":920}}},{"node":{"original":{"src":"/static/investment-casting-process-da1a57c962eaa69fd0fcdbf6c14863f9.png","width":1864,"height":684}}},{"node":{"original":{"src":"/static/ai-integration-6881eaaf46b3c277c6f08136e0975add.png","width":1950,"height":720}}},{"node":{"original":{"src":"/static/personal-mba-refining-e9f1db03c81bed733e3cd01123af7693.png","width":1920,"height":921}}},{"node":{"original":{"src":"/static/absolute-encoders-rm08-6fcfbc9acc5faa6f848262e63007ebec.jpeg","width":2016,"height":1371}}},{"node":{"original":{"src":"/static/art-of-coaching-72579ce0a3ad1820b1f9a9ab39205ca0.png","width":1943,"height":698}}},{"node":{"original":{"src":"/static/microsoft-authentication-process-62ff97d35de82762e84a8b9418817471.png","width":1920,"height":800}}},{"node":{"original":{"src":"/static/microsoft-authentication-18932cda0756860182497be2c7ea1df1.png","width":1993,"height":728}}},{"node":{"original":{"src":"/static/pid-mpc-atlas-179410331cf7f348d7c74715f9830a27.png","width":1933,"height":1358}}},{"node":{"original":{"src":"/static/art-of-coaching-communication-98b4d7a6a910884f2c2115331c3dbacd.png","width":4441,"height":1270}}},{"node":{"original":{"src":"/static/art-of-coaching-do-it-disk-eadd2b510e8ffdec258a232138974e46.png","width":2381,"height":1307}}},{"node":{"original":{"src":"/static/art-of-coaching-support-295f70fe9872e7a5328bd6d4aa4407ec.png","width":1998,"height":1087}}},{"node":{"original":{"src":"/static/pid-background-06c4687b59f2caa7232337777d26bed3.png","width":1757,"height":1081}}},{"node":{"original":{"src":"/static/absolute-encoders-hall-effect-71b3164ebe9d8e38f6d107822b02276a.jpeg","width":2535,"height":2733}}},{"node":{"original":{"src":"/static/what-they-dont-title-6c84cfa981e236da71f98b7fcde554af.png","width":3012,"height":1036}}},{"node":{"original":{"src":"/static/personal-mba-measure-2eca9147b90b67475962a346bb25f257.png","width":1920,"height":1080}}},{"node":{"original":{"src":"/static/art-of-coaching-balloon-ea04393b9d39d0d7f10c1bb41fcd336f.png","width":1564,"height":1121}}},{"node":{"original":{"src":"/static/art-of-coaching-ei-cone-ef855493172972a227241e3d5ae96e5b.png","width":2740,"height":1138}}},{"node":{"original":{"src":"/static/absolute-encoders-np24hs-29a9d7db0b5e78dc79c1d6d07592bc6f.jpeg","width":2157,"height":2109}}},{"node":{"original":{"src":"/static/adc-review-2e0f04fc009d725ae33bdcd3d8b721b6.png","width":3505,"height":1254}}},{"node":{"original":{"src":"/static/inverse-kinematics-6543b397e7676e4350edc996b346e35b.png","width":2370,"height":915}}},{"node":{"original":{"src":"/static/model-of-human-mind-bacteria-04f0782cb84d3790ff1b442447376ef7.png","width":3505,"height":1897}}},{"node":{"original":{"src":"/static/adc-review-mcp3008-d1bd387618da0e041cc23c77a5490770.png","width":1244,"height":932}}},{"node":{"original":{"src":"/static/adc-review-pi16adc-0f653404b5f92b59a440b2fec69a80b0.png","width":1704,"height":616}}},{"node":{"original":{"src":"/static/model-of-human-mind-elements-4f4467f973209cfec904d7af71fb55c4.png","width":2065,"height":1323}}},{"node":{"original":{"src":"/static/ai-integration-llm-book-8e678374d421a3fc88dca91828444484.png","width":1194,"height":1458}}},{"node":{"original":{"src":"/static/model-of-human-mind-chess-3b64b83b4bcfb2fb678c11d9d000b58f.png","width":2880,"height":1420}}},{"node":{"original":{"src":"/static/absolute-encoders-jt30-7bef2fe460cf393df32763438717c6c8.jpeg","width":3024,"height":2970}}},{"node":{"original":{"src":"/static/what-they-dont-teach-you-1481963c2037a63c0315473a9841bef3.png","width":1737,"height":1355}}},{"node":{"original":{"src":"/static/360-video-pipeline-652c938f9559464fa0fa151f9f946273.png","width":2191,"height":796}}},{"node":{"original":{"src":"/static/kalman-filter-29410f73561e0e9a156ca8aa37385124.png","width":2261,"height":834}}},{"node":{"original":{"src":"/static/pid-fixture-d02a6a30acddb9c03617882e9607963c.png","width":1516,"height":1381}}},{"node":{"original":{"src":"/static/model-of-human-mind-blender-nodes-5b46cbc18c515d0786e6634c202ee885.png","width":3457,"height":1677}}},{"node":{"original":{"src":"/static/model-of-human-mind-ganglion-ecc4b5816e2b6f4177e07895c3040dc9.png","width":1370,"height":857}}},{"node":{"original":{"src":"/static/state-of-tech-15debc9599aa4d89cf328431df6c86a5.png","width":2880,"height":1105}}},{"node":{"original":{"src":"/static/personal-mba-f0dc1c539b758c308805c2edada6b42f.png","width":3857,"height":1460}}},{"node":{"original":{"src":"/static/absolute-encoder-review-1d0984a18e91b51416b63eef9e8ec4bb.png","width":2844,"height":1074}}},{"node":{"original":{"src":"/static/only-paranoid-survive-oldman-3c5a2e1ac50586c82ba027ea9686ad91.png","width":2032,"height":974}}},{"node":{"original":{"src":"/static/kalman-presentation-023ea5f5f91358009d4eac738511bc8a.png","width":3456,"height":1936}}},{"node":{"original":{"src":"/static/what-they-dont-teach-you-thegame-0c3bd8bd354e9cfbb2061a4c0120f0e8.png","width":2880,"height":1620}}},{"node":{"original":{"src":"/static/absolute-encoders-lamprey-fcf2d3ab697c3894b362b304f532d004.jpeg","width":4032,"height":3024}}},{"node":{"original":{"src":"/static/kalman-maybeck-vol1-e383aaeb6448f55edbf19468ecf3e8e4.png","width":2016,"height":1512}}},{"node":{"original":{"src":"/static/kalman-theory-user-9e611561e5c89ee26a08aad097451484.png","width":2016,"height":1456}}},{"node":{"original":{"src":"/static/model-of-human-mind-chariot-ddf769b36151e74bf42075fbaf443d78.png","width":2503,"height":1492}}},{"node":{"original":{"src":"/static/adc-review-arduino-micro-d5bd75ece713e3ca437ec5219638bf86.png","width":2218,"height":1528}}},{"node":{"original":{"src":"/static/adc-review-ads1115-fb958c48473610d92b9d505dd997ef61.png","width":1626,"height":1176}}},{"node":{"original":{"src":"/static/drumming-robot-logo-35bef056c6dbc3b66ccc76efa48c9521.png","width":864,"height":116}}},{"node":{"original":{"src":"/static/hybrid-logo-c4a8ec2e712d36180916ab7055b91a4b.png","width":1895,"height":420}}},{"node":{"original":{"src":"/static/hybrid-midi-f1801fc05d3c21e1605a1525c3b63e7e.png","width":1117,"height":838}}},{"node":{"original":{"src":"/static/cyber-guitar-logo-d74dc54c78f514b6e17f333d1bba4a76.png","width":1575,"height":162}}},{"node":{"original":{"src":"/static/hybrid-bridge-1-3862e85842841da1416dc48c4a98e7da.jpg","width":800,"height":600}}},{"node":{"original":{"src":"/static/hybrid-bridge-2-0139b8b0c2e295295fbf51960b81795b.jpg","width":800,"height":600}}},{"node":{"original":{"src":"/static/hybrid-switch-fe9cb4e3c672f346b031d84f75f56057.jpg","width":640,"height":640}}},{"node":{"original":{"src":"/static/cyber-guitar-live-049109088ee2b1b1adb1d51610fa0ba5.jpg","width":2270,"height":1548}}},{"node":{"original":{"src":"/static/drumming-robot-concepts3-08c283500a0f234682226cc5f6617c1f.png","width":690,"height":591}}},{"node":{"original":{"src":"/static/drumming-robot-concepts4-772c9529da36a6b6f0b997a11221c150.jpg","width":2016,"height":1241}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-chest-67d90711240598e23fed63485513c1fc.jpg","width":2048,"height":1080}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-hand-395c0fc9f6b5a582046cc4d8126b7a0e.jpg","width":1359,"height":1080}}},{"node":{"original":{"src":"/static/hybrid-back-e00050b5bd5f8a6c793260be4e7454c0.jpg","width":2499,"height":1497}}},{"node":{"original":{"src":"/static/hybrid-string-lock-1-acc0579c259eceab4738a57605463a3b.jpg","width":552,"height":414}}},{"node":{"original":{"src":"/static/hybrid-string-lock-2-6d4ce794efea00495821eef3c89fdb54.jpg","width":800,"height":600}}},{"node":{"original":{"src":"/static/hybrid-top-bdc6cac1e332b8ac93e19ccec53723f5.jpg","width":2558,"height":1601}}},{"node":{"original":{"src":"/static/cyber-guitar-lights-7e752716d921114847e0520988ec7d2d.jpg","width":1500,"height":716}}},{"node":{"original":{"src":"/static/cyber-guitar-paint-08f9d0e6f830f666b26d2f7721b43193.jpg","width":960,"height":832}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-chest-bake-cb52271802d059e7795f054e60dd2a2b.jpg","width":998,"height":1073}}},{"node":{"original":{"src":"/static/hybrid-cad-layout-2978a4622bc0249e60c18f2138a3e2ff.png","width":3769,"height":2912}}},{"node":{"original":{"src":"/static/hybrid-front-46b19e309b9e363e1dc90c53224a6f8c.jpg","width":2685,"height":1641}}},{"node":{"original":{"src":"/static/hybrid-midi-cad-cc106d4408d5904bf4e8f434d0d40b2b.png","width":1371,"height":889}}},{"node":{"original":{"src":"/static/cyber-guitar-cnc-d6521b26150a8526c49c20c6ef6e2752.jpg","width":1125,"height":793}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-assembly1-aa419423af3dfe99365be62bcd08b7f5.jpg","width":1210,"height":843}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-shells-c29504036d0597248d94b8ddc2b68630.jpg","width":1104,"height":998}}},{"node":{"original":{"src":"/static/cyber-guitar-cast-3224582f184c7fb8c91136a97b316db3.jpg","width":1682,"height":1678}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-assembly2-584ad388f7b84e7136b4cf656edb64a6.jpg","width":1210,"height":718}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-chest-cast-5ec23a0e4a2ec082f97d1fc63e6c2510.jpg","width":1331,"height":998}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-finishing-5d6baefba58e9ae749ebae1392364a32.jpg","width":1440,"height":1440}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-pistons-f8ae691d92edfc2b6f433e37eedde5d8.jpg","width":1350,"height":1152}}},{"node":{"original":{"src":"/static/hybrid-knobs-2760ce28f99066ec64444500472f1a22.png","width":714,"height":630}}},{"node":{"original":{"src":"/static/drumming-robot-head-model-37ff225caf8978dccd9d917230bad6c0.jpg","width":1663,"height":1543}}},{"node":{"original":{"src":"/static/tau-rubber2-ce93ab862e27eebf3b9a23684f7340b6.jpg","width":1760,"height":1351}}},{"node":{"original":{"src":"/static/cyber-guitar-d290afd7b028a39ec42c66dff95bf889.png","width":1869,"height":684}}},{"node":{"original":{"src":"/static/drumming-robot-arm-tool-172721d0b674de57974834dc7f92ed1f.jpg","width":2159,"height":1663}}},{"node":{"original":{"src":"/static/drumming-robot-motor-80f1be1a58cf2ed80e2e25ce8e72d7d1.jpg","width":1814,"height":1814}}},{"node":{"original":{"src":"/static/drumming-robot-power-6805f8a28c84748025f2495ec024d94d.jpg","width":1814,"height":1814}}},{"node":{"original":{"src":"/static/drumming-robot-f820ce0e367d6e292d546a0e749381d8.png","width":1557,"height":587}}},{"node":{"original":{"src":"/static/exoskeleton-presentation-40782b12db011a0fae7edd977d74225e.png","width":1774,"height":998}}},{"node":{"original":{"src":"/static/tau-coil-winding-5d11c176d4199f2b061b750bf149a1be.jpg","width":1512,"height":1512}}},{"node":{"original":{"src":"/static/tau-test-9372e4b3c51a7cfbdf38919d3479d34e.jpg","width":1398,"height":1398}}},{"node":{"original":{"src":"/static/cyber-guitar-ribbons-ddd25646dee6ddc01af2d5b69dc6b6ff.jpg","width":1633,"height":1512}}},{"node":{"original":{"src":"/static/drumming-robot-encoder-0fe08c0bebcd060cf8071743221f0468.jpg","width":2016,"height":1512}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-3d-48169464f2f23302cf27d3202ec5d563.png","width":1039,"height":1204}}},{"node":{"original":{"src":"/static/cyber-guitar-mold-c96497253847a128a51ce0eb2d731a5a.jpg","width":1857,"height":1333}}},{"node":{"original":{"src":"/static/drumming-robot-encoders-1a2e740e4fac668bf40057777025c3fe.jpg","width":2419,"height":1814}}},{"node":{"original":{"src":"/static/hybrid-bass-pickup-4c06dcb6ddc7a4537302a8d4d284d03b.png","width":1500,"height":958}}},{"node":{"original":{"src":"/static/hybrid-221ccf44c449c0fee293eabd36b99a19.png","width":3228,"height":1203}}},{"node":{"original":{"src":"/static/cyber-guitar-osc-pcb-4752552a56eaac1dc5d8f04cda3ae4c3.jpg","width":2016,"height":1512}}},{"node":{"original":{"src":"/static/tau-cast-14884726a704f6e3a1fdfbeac2824083.jpg","width":1876,"height":1512}}},{"node":{"original":{"src":"/static/drumming-robot-arm-assembly-42f658b29eb14395931ee2da06f95891.jpg","width":2097,"height":1617}}},{"node":{"original":{"src":"/static/drumming-robot-body-f6273ecdbfb0cbba10b95fa6559d4133.png","width":1432,"height":1363}}},{"node":{"original":{"src":"/static/drumming-robot-concepts1-94780f216fa4220f893cdfb4c7bd7e52.png","width":1343,"height":1291}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-print-assemble-564f861798d8fa434d5610ee79096969.jpg","width":1659,"height":945}}},{"node":{"original":{"src":"/static/tau-cad04-7ca4198fa7b4684556f28334a11c98f6.jpg","width":2665,"height":1809}}},{"node":{"original":{"src":"/static/tau-computer-39d530920af20fe10952cdc5abd3bc2b.jpg","width":2139,"height":1682}}},{"node":{"original":{"src":"/static/tau-inventor-26b8c64901808aafcf5356a2b8e0995a.jpg","width":4146,"height":1953}}},{"node":{"original":{"src":"/static/tau-assembly-8456977fdb3799c718a2ed8e1adfe126.jpg","width":1999,"height":1814}}},{"node":{"original":{"src":"/static/tau-cad03-65eb83cb78668eb0968d5ccd0dc50118.jpg","width":3154,"height":1790}}},{"node":{"original":{"src":"/static/drumming-robot-lab-8df28a089f4b9bbe3637122b65568029.jpg","width":2419,"height":1814}}},{"node":{"original":{"src":"/static/hybrid-midi-pickup-7103fa3cefdd6b214e63426d6697216f.png","width":2723,"height":1353}}},{"node":{"original":{"src":"/static/tau-parts03-61ffa5c847824b8d2223d753ad5fc829.jpg","width":1667,"height":1811}}},{"node":{"original":{"src":"/static/drumming-robot-head-9661d741cb20bf6a639653ae382d6dda.png","width":1542,"height":1095}}},{"node":{"original":{"src":"/static/tau-cad01-09d13f738565543b27703a9dac34887c.jpg","width":2605,"height":1531}}},{"node":{"original":{"src":"/static/drumming-robot-face-side-34f37a39b826031e18958b0012e47dd3.png","width":1216,"height":1128}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-print-f2f929bdcc3d57cba17600fb854dbb98.jpg","width":3455,"height":2303}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-c2216c54dff1e1789a7525f668367c64.png","width":1886,"height":1006}}},{"node":{"original":{"src":"/static/tau-cad02-347430ac5961bba60a8f71797c817a3a.jpg","width":2600,"height":1513}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-floor-c69dc30e046cf863356ab45afd260ab9.jpg","width":2984,"height":2201}}},{"node":{"original":{"src":"/static/cyber-guitar-screen-f545905e35f88af6df034786d62f9514.jpg","width":3024,"height":3560}}},{"node":{"original":{"src":"/static/drumming-robot-arms-d7eb6fcf155092144bc621b5b7a49044.png","width":1779,"height":1410}}},{"node":{"original":{"src":"/static/cyber-guitar-test-b3f004a33050c1e2d06eae3e1d76eec3.jpg","width":4032,"height":3024}}},{"node":{"original":{"src":"/static/drumming-robot-arm-sensors-b744e7d3c4b2034f6bb3306304ce33b4.jpg","width":4032,"height":3024}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-moldmaking-0d3de62f7cd0cac141c5bd8ef858d9e3.jpg","width":3024,"height":2829}}},{"node":{"original":{"src":"/static/drumming-robot-face-front-042189484f4f150e95416550432e06f6.png","width":1273,"height":1273}}},{"node":{"original":{"src":"/static/tau-parts02-2b823005b83fe8e4e4fac483c0c19f93.jpg","width":2822,"height":2117}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-chest-mold-5639d8bd556bb3799e1884d932ed199c.jpg","width":3024,"height":3385}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-chest-finished-7eee818f19a5e9ffe1abb4f1026bcc91.png","width":1210,"height":907}}},{"node":{"original":{"src":"/static/elysium-exoskeleton-print-parts-bd1a4a2aad4760a036255ec5b69b8baf.png","width":1555,"height":1037}}},{"node":{"original":{"src":"/static/drumming-robot-concepts2-6569b6fa82a791dc5a7f262c94a0a441.png","width":1802,"height":1442}}},{"node":{"original":{"src":"/static/cyber-guitar-tape-1f93fe9f005d1527f0b6773401cbd716.jpg","width":4032,"height":3024}}},{"node":{"original":{"src":"/static/drumming-robot-still-life-dcf5fc1480add471b50ea96ade07bc6e.png","width":1676,"height":1676}}},{"node":{"original":{"src":"/static/drumming-robot-wiring-dc84b753a47f26ba9dd553de31d34bb8.jpg","width":3146,"height":2967}}},{"node":{"original":{"src":"/static/cyber-guitar-done-8595ea82e6b15bd3e9098f9c986431d2.jpg","width":3623,"height":2733}}},{"node":{"original":{"src":"/static/tau-cannon-111bb35840474704cded256cc8ca2de4.png","width":4884,"height":1778}}},{"node":{"original":{"src":"/static/tau-muzzle-3a454d96a280834e213053cfeaeac80e.png","width":1856,"height":1287}}},{"node":{"original":{"src":"/static/drumming-robot-arm-6f1c020db528f161138225a156a7a825.png","width":1720,"height":1720}}}]}},"pageContext":{"slug":"ai-integration","collection":"articles","subCollection":null}},"staticQueryHashes":["3391108849","3391108849","3424358133"]}