{"id":20895,"date":"2026-08-04T16:07:14","date_gmt":"2026-08-04T13:07:14","guid":{"rendered":"https:\/\/offline-web.com\/?page_id=20895"},"modified":"2026-08-14T17:40:42","modified_gmt":"2026-08-14T14:40:42","slug":"ai-integration","status":"publish","type":"page","link":"https:\/\/offline-web.com\/en\/ai-integration\/","title":{"rendered":"AI integration for web applications"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"20895\" class=\"elementor elementor-20895\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4f0e91b9 e-flex e-con-boxed tm-col-stretched-none tm-bg-color-over-image e-con e-parent\" data-id=\"4f0e91b9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-6c4fa7a2 e-con-full e-flex tm-col-stretched-none tm-bg-color-over-image e-con e-child\" data-id=\"6c4fa7a2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t<div class=\"elementor-element elementor-element-592ca323 e-con-full e-flex tm-col-stretched-none tm-bg-color-over-image e-con e-child\" data-id=\"592ca323\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-766590d elementor-widget elementor-widget-image\" data-id=\"766590d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.button-over-image\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration-1024x538.png\" class=\"attachment-large size-large wp-image-20888\" alt=\"AI features for Vue and Nuxt apps \u2014 an in-product copilot streaming an answer with cited sources\" srcset=\"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration-1024x538.png 1024w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration-300x158.png 300w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration-768x403.png 768w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3cb1a854 e-con-full tm-col-stretched-none e-flex tm-bg-color-over-image e-con e-child\" data-id=\"3cb1a854\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t<div class=\"elementor-element elementor-element-1f403bd2 e-con-full e-flex tm-col-stretched-none tm-bg-color-over-image e-con e-child\" data-id=\"1f403bd2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6d6314ad elementor-widget elementor-widget-tm-ele-text-editor\" data-id=\"6d6314ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"tm-text-editor\" >\r\n\t\t<p>Adding AI to a web application is rarely difficult because of the model API itself. The harder work sits around it: keeping the interface responsive while tokens arrive, letting users cancel, controlling spend and checking answers before they affect real workflows.<\/p><p>I build these features inside production applications, including in-product copilots, document search with citations and agent flows that use application data. My role is to connect the model to clear frontend and backend contracts, useful fallbacks and controls the product team can operate.<\/p><p>That can mean a copilot that works with a user&#8217;s own data, structured extraction that turns free text into typed fields, semantic search or workflows that call approved tools under rules you define. The right shape depends on the job the user needs to complete.<\/p>\t\t<\/div>\r\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4fd2d9de elementor-widget elementor-widget-tm-ele-text-editor\" data-id=\"4fd2d9de\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"tm-text-editor\" >\r\n\t\t<p>Most AI features work on the happy path in a demo, then meet long documents, slow responses, dropped connections and confident wrong answers. Without cancellation, retries, monitoring and evals, teams often limit or remove the feature after launch.<\/p><p>I build it like any other production feature: typed end to end, observable, cost-controlled and released behind a flag to a small group first. If the existing frontend makes that difficult, a <a href=\"https:\/\/offline-web.com\/vue-migration\/\">frontend framework migration<\/a> or <a href=\"https:\/\/offline-web.com\/nuxt-migration\/\">server rendering migration<\/a> can reduce the implementation debt. Streaming UI itself does not require a particular framework.<\/p>\t\t<\/div>\r\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d0cd627 e-con-full e-flex tm-col-stretched-none tm-bg-color-over-image e-con e-child\" data-id=\"d0cd627\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-44af6788 elementor-widget__width-initial elementor-widget elementor-widget-tm-ele-iconbox\" data-id=\"44af6788\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-iconbox.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"tm-sc-icon-box icon-box icon-left icon-left-style2 icon-text responsive-mobile icon-left-style2 animate-hover icon-rotate-y\">\r\n\t\r\n  \t<div class=\"icon-box-wrapper\">\r\n\t\t<div class=\"icon-left-block\">\r\n\t\t\t<div class=\"icon-box-icon\">\r\n\t\t\t\t\r\n\t\t<div class=\"icon-wrapper\">\r\n\t\t<div class=\"icon icon-round icon-type-icon-text icon-size-default\">\r\n\t\t\t\r\n\t\t\t\t<span class=\"icon-text\">\r\n\t\t\t\t01\t\t<\/span>\r\n\t\t\t\t<\/div>\r\n\r\n\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\r\n\t\t\t\t<h5 class=\"icon-box-title \">\r\n\t\t\t\t\t\t\tFeasibility audit\t\t\t\t\t<\/h5>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<div class=\"icon-text\">\r\n\t\t\t\t\t\t<div class=\"content\"><p>The first step is pinning down the use case and whether an LLM is the right tool for it. I map your data sources, latency budget, privacy constraints and a realistic cost per user, then hand you a short report with the recommended approach, the risks and an effort estimate, before any code is written.<\/p><\/div>\r\n\t\t\t\r\n\t\t\t\r\n\t\r\n\t\t\t\t\t<\/div>\r\n\t\t<div class=\"clearfix\"><\/div>\r\n\t<\/div>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5e59e3a3 elementor-widget__width-initial elementor-widget elementor-widget-tm-ele-iconbox\" data-id=\"5e59e3a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-iconbox.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"tm-sc-icon-box icon-box icon-left icon-left-style2 icon-text responsive-mobile icon-left-style2 animate-hover icon-rotate-y\">\r\n\t\r\n  \t<div class=\"icon-box-wrapper\">\r\n\t\t<div class=\"icon-left-block\">\r\n\t\t\t<div class=\"icon-box-icon\">\r\n\t\t\t\t\r\n\t\t<div class=\"icon-wrapper\">\r\n\t\t<div class=\"icon icon-default icon-type-icon-text icon-size-default\">\r\n\t\t\t\r\n\t\t\t\t<span class=\"icon-text\">\r\n\t\t\t\t02\t\t<\/span>\r\n\t\t\t\t<\/div>\r\n\r\n\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\r\n\t\t\t\t<h5 class=\"icon-box-title \">\r\n\t\t\t\t\t\t\tArchitecture &amp; design\t\t\t\t\t<\/h5>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<div class=\"icon-text\">\r\n\t\t\t\t\t\t<div class=\"content\"><p>The shape of the feature: model and provider choice, prompt and context strategy, retrieval design if it needs your own data, streaming and error contract between frontend and backend, plus the guardrails. You see the data flow, the types and the fallback path up front.<\/p><\/div>\r\n\t\t\t\r\n\t\t\t\r\n\t\r\n\t\t\t\t\t<\/div>\r\n\t\t<div class=\"clearfix\"><\/div>\r\n\t<\/div>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-14cd3a65 e-con-full tm-col-stretched-none e-flex tm-bg-color-over-image e-con e-child\" data-id=\"14cd3a65\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1887c9ac elementor-widget__width-initial elementor-widget elementor-widget-tm-ele-iconbox\" data-id=\"1887c9ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-iconbox.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"tm-sc-icon-box icon-box icon-left icon-left-style2 icon-text responsive-mobile icon-left-style2 animate-hover icon-rotate-y\">\r\n\t\r\n  \t<div class=\"icon-box-wrapper\">\r\n\t\t<div class=\"icon-left-block\">\r\n\t\t\t<div class=\"icon-box-icon\">\r\n\t\t\t\t\r\n\t\t<div class=\"icon-wrapper\">\r\n\t\t<div class=\"icon icon-round icon-type-icon-text icon-size-default\">\r\n\t\t\t\r\n\t\t\t\t<span class=\"icon-text\">\r\n\t\t\t\t03\t\t<\/span>\r\n\t\t\t\t<\/div>\r\n\r\n\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\r\n\t\t\t\t<h5 class=\"icon-box-title \">\r\n\t\t\t\t\t\t\tBuild &amp; evaluate\t\t\t\t\t<\/h5>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<div class=\"icon-text\">\r\n\t\t\t\t\t\t<div class=\"content\"><p>I build the interface with Vue 3 and strict TypeScript, including streaming responses, cancellation, partial rendering and accessible result states. An eval set shows whether a prompt change made the feature better or worse.<\/p><\/div>\r\n\t\t\t\r\n\t\t\t\r\n\t\r\n\t\t\t\t\t<\/div>\r\n\t\t<div class=\"clearfix\"><\/div>\r\n\t<\/div>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d0e8691 elementor-widget__width-initial elementor-widget elementor-widget-tm-ele-iconbox\" data-id=\"4d0e8691\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-iconbox.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"tm-sc-icon-box icon-box icon-left icon-left-style2 icon-text responsive-mobile icon-left-style2 animate-hover icon-rotate-y\">\r\n\t\r\n  \t<div class=\"icon-box-wrapper\">\r\n\t\t<div class=\"icon-left-block\">\r\n\t\t\t<div class=\"icon-box-icon\">\r\n\t\t\t\t\r\n\t\t<div class=\"icon-wrapper\">\r\n\t\t<div class=\"icon icon-round icon-type-icon-text icon-size-default\">\r\n\t\t\t\r\n\t\t\t\t<span class=\"icon-text\">\r\n\t\t\t\t04\t\t<\/span>\r\n\t\t\t\t<\/div>\r\n\r\n\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\r\n\t\t\t\t<h5 class=\"icon-box-title \">\r\n\t\t\t\t\t\t\tShip &amp; harden\t\t\t\t\t<\/h5>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t<div class=\"icon-text\">\r\n\t\t\t\t\t\t<div class=\"content\"><p>A staged rollout behind a feature flag, cost and latency instrumentation, rate limiting and abuse handling, documentation and a team walkthrough, plus a 30-day technical warranty after go-live.<\/p><\/div>\r\n\t\t\t\r\n\t\t\t\r\n\t\r\n\t\t\t\t\t<\/div>\r\n\t\t<div class=\"clearfix\"><\/div>\r\n\t<\/div>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-203048ca elementor-widget elementor-widget-tm-ele-text-editor\" data-id=\"203048ca\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"tm-text-editor\" >\r\n\t\t<h3>What an AI feature build delivers<\/h3>\t\t<\/div>\r\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-25734f74 elementor-widget elementor-widget-tm-ele-list\" data-id=\"25734f74\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<ul class=\"tm-sc-list \">\r\n\t<li class=\"\">\r\n\t\t\t\t<i aria-hidden=\"true\" class=\" flaticon-common-confirmation\"><\/i>\t\t\t\t<span>\r\n\tA streaming, cancellable interface with clear limits and fallback states when the model cannot answer reliably<\/span><\/li>\t<li class=\"\">\r\n\t\t\t\t<i aria-hidden=\"true\" class=\" flaticon-common-confirmation\"><\/i>\t\t\t\t<span>\r\n\tCost per user measured during rollout, with usage caps, rate limits and alerts tied to an agreed budget<\/span><\/li>\t<li class=\"\">\r\n\t\t\t\t<i aria-hidden=\"true\" class=\" flaticon-common-confirmation\"><\/i>\t\t\t\t<span>\r\n\tAn eval set, so prompt changes become measurable instead of vibes<\/span><\/li>\t<li class=\"\">\r\n\t\t\t\t<i aria-hidden=\"true\" class=\" flaticon-common-confirmation\"><\/i>\t\t\t\t<span>\r\n\tTypeScript strict end to end, plus documentation and a 30-day warranty after go-live<\/span><\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-55ed9aa7 e-con-full e-flex tm-col-stretched-none tm-bg-color-over-image e-con e-child\" data-id=\"55ed9aa7\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t<div class=\"elementor-element elementor-element-d12fdde e-con-full e-flex tm-col-stretched-none tm-bg-color-over-image e-con e-child\" data-id=\"d12fdde\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-55b846b6 elementor-widget elementor-widget-image\" data-id=\"55b846b6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-1-1024x576.png\" class=\"attachment-large size-large wp-image-20889\" alt=\"Before and after: a blocking fetch replaced by a streaming copilot response with cancellation and citations in Vue\" srcset=\"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-1-1024x576.png 1024w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-1-300x169.png 300w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-1-768x432.png 768w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-1.png 1280w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-569a857e e-con-full tm-col-stretched-none e-flex tm-bg-color-over-image e-con e-child\" data-id=\"569a857e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c617780 elementor-widget elementor-widget-image\" data-id=\"c617780\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-2-1024x576.png\" class=\"attachment-large size-large wp-image-20890\" alt=\"LLM evaluation suite and runtime dashboard showing pass rate, p95 latency and cost per request\" srcset=\"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-2-1024x576.png 1024w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-2-300x169.png 300w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-2-768x432.png 768w, https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/ai-integration-inner-2.png 1280w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6c998b88 ha-has-bg-overlay elementor-widget elementor-widget-tm-ele-accordion\" data-id=\"6c998b88\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-accordion.skin-classic\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div id=\"accordion-holder-362036\" class=\"tm-accordion skin-classic\">\r\n\t\r\n  <div class=\"card active\">\r\n    <div class=\"card-header p-0\" id=\"heading611\">\r\n      <h5 class=\"title \" data-bs-toggle=\"collapse\" data-bs-target=\"#collapse611\" aria-expanded=\"true\" aria-controls=\"collapse611\">\r\n        <span class=\"text\">How much does it cost to add AI features to an existing app?<\/span>\r\n        <span class=\"accordion-controls-icon\"><svg class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\r\n      <\/h5>\r\n    <\/div>\r\n    <div id=\"collapse611\" class=\"collapse show\" aria-labelledby=\"heading611\" data-bs-parent=\"#accordion-holder-362036\">\r\n      <div class=\"card-body\">\r\n        <p>Scope depends on the use case, data access, privacy constraints, retrieval needs, eval coverage and rollout plan. The feasibility audit maps those dependencies first, then provides an effort, cost and timeline estimate based on the work the feature actually requires.<\/p>      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"card \">\r\n    <div class=\"card-header p-0\" id=\"heading612\">\r\n      <h5 class=\"title collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapse612\" aria-expanded=\"false\" aria-controls=\"collapse612\">\r\n        <span class=\"text\">Which model or provider should we use?<\/span>\r\n        <span class=\"accordion-controls-icon\"><svg class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\r\n      <\/h5>\r\n    <\/div>\r\n    <div id=\"collapse612\" class=\"collapse \" aria-labelledby=\"heading612\" data-bs-parent=\"#accordion-holder-362036\">\r\n      <div class=\"card-body\">\r\n        <p>Whichever fits the latency, cost and privacy constraints the audit pins down. A provider abstraction keeps model-specific code localized and reduces the work involved if you later change provider. Differences in APIs, model behavior and hosting still need to be assessed.<\/p>      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"card \">\r\n    <div class=\"card-header p-0\" id=\"heading613\">\r\n      <h5 class=\"title collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapse613\" aria-expanded=\"false\" aria-controls=\"collapse613\">\r\n        <span class=\"text\">Will our data be sent to a third-party model?<\/span>\r\n        <span class=\"accordion-controls-icon\"><svg class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\r\n      <\/h5>\r\n    <\/div>\r\n    <div id=\"collapse613\" class=\"collapse \" aria-labelledby=\"heading613\" data-bs-parent=\"#accordion-holder-362036\">\r\n      <div class=\"card-body\">\r\n        <p>Only if you decide it should. The audit covers exactly which fields leave your infrastructure, which stay, what gets redacted, and whether a self-hosted or EU-region model is required. I work with EU and US teams and treat this as an architecture constraint, not a checkbox.<\/p>      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"card \">\r\n    <div class=\"card-header p-0\" id=\"heading614\">\r\n      <h5 class=\"title collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapse614\" aria-expanded=\"false\" aria-controls=\"collapse614\">\r\n        <span class=\"text\">How do you stop the AI from making things up?<\/span>\r\n        <span class=\"accordion-controls-icon\"><svg class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\r\n      <\/h5>\r\n    <\/div>\r\n    <div id=\"collapse614\" class=\"collapse \" aria-labelledby=\"heading614\" data-bs-parent=\"#accordion-holder-362036\">\r\n      <div class=\"card-body\">\r\n        <p>You cannot eliminate it, so the design has to survive it: retrieval with citations users can click, schema-validated structured output instead of free text where the answer feeds other code, confidence and empty states that say &#8220;not found&#8221;, and an eval set that catches regressions before your users do.<\/p>      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"card \">\r\n    <div class=\"card-header p-0\" id=\"heading615\">\r\n      <h5 class=\"title collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapse615\" aria-expanded=\"false\" aria-controls=\"collapse615\">\r\n        <span class=\"text\">Do you build chatbots?<\/span>\r\n        <span class=\"accordion-controls-icon\"><svg class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\r\n      <\/h5>\r\n    <\/div>\r\n    <div id=\"collapse615\" class=\"collapse \" aria-labelledby=\"heading615\" data-bs-parent=\"#accordion-holder-362036\">\r\n      <div class=\"card-body\">\r\n        <p>I build in-product assistants, something that can see the user&#8217;s data, call your API and act, with the answers cited. That is a different thing from a support chatbot widget dropped on top of an FAQ, which a hosted tool will do faster and cheaper than I can. If a widget is what you need, take the widget. If the assistant has to understand your product and do work inside it, that is this.<\/p>      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"card \">\r\n    <div class=\"card-header p-0\" id=\"heading616\">\r\n      <h5 class=\"title collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapse616\" aria-expanded=\"false\" aria-controls=\"collapse616\">\r\n        <span class=\"text\">Do you do the backend too, or only the frontend?<\/span>\r\n        <span class=\"accordion-controls-icon\"><svg class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\r\n      <\/h5>\r\n    <\/div>\r\n    <div id=\"collapse616\" class=\"collapse \" aria-labelledby=\"heading616\" data-bs-parent=\"#accordion-holder-362036\">\r\n      <div class=\"card-body\">\r\n        <p>Frontend-led, full stack where the feature needs it. I use Node.js server routes for the streaming endpoint, retrieval and tool calls. Pure backend-only AI work is not what I take on; my role is to make the feature work inside the product.<\/p>      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"card \">\r\n    <div class=\"card-header p-0\" id=\"heading617\">\r\n      <h5 class=\"title collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapse617\" aria-expanded=\"false\" aria-controls=\"collapse617\">\r\n        <span class=\"text\">Can we add AI features to an older frontend?<\/span>\r\n        <span class=\"accordion-controls-icon\"><svg class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\r\n      <\/h5>\r\n    <\/div>\r\n    <div id=\"collapse617\" class=\"collapse \" aria-labelledby=\"heading617\" data-bs-parent=\"#accordion-holder-362036\">\r\n      <div class=\"card-body\">\r\n        <p>Yes. Older tooling and dependencies may increase implementation risk and cost, so I audit the existing stack first. That evidence determines whether it is sensible to add the feature in place or <a href=\"https:\/\/offline-web.com\/vue-migration\/\">migrate first<\/a>.<\/p>      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\t\t<\/div>\r\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-72cc0840 e-con-full tm-col-stretched-none e-flex tm-bg-color-over-image e-con e-child\" data-id=\"72cc0840\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t<div class=\"elementor-element elementor-element-63038be5 e-con-full e-flex tm-col-stretched-none tm-bg-color-over-image e-con e-child\" data-id=\"63038be5\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9f2b3c7 elementor-widget elementor-widget-tm-ele-text-editor\" data-id=\"9f2b3c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"tm-text-editor\" >\r\n\t\t<h4>More Services<\/h4><p><\/p>\t\t<\/div>\r\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3391ae5f elementor-widget__width-initial elementor-absolute elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"3391ae5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;absolute&quot;}\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-247ec524 elementor-widget elementor-widget-tm-ele-navigation-menu\" data-id=\"247ec524\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-navigation-menu.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"tm-sc-simple-nav-menu\"><ul id=\"menu-services-links\" class=\"\"><li id=\"menu-item-20082\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-20082\"><a href=\"https:\/\/offline-web.com\/en\/vue-migration\/\"><i class=\"tm-nav-arrow-icon  flaticon-common-arrow-right\"><\/i>Vue 2 to Vue 3 migration<\/a><\/li>\n<li id=\"menu-item-20083\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-20083\"><a href=\"https:\/\/offline-web.com\/en\/web-app-development\/\"><i class=\"tm-nav-arrow-icon  flaticon-common-arrow-right\"><\/i>Custom Web App Development<\/a><\/li>\n<li id=\"menu-item-20084\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-20084\"><a href=\"https:\/\/offline-web.com\/en\/excel-to-dashboard\/\"><i class=\"tm-nav-arrow-icon  flaticon-common-arrow-right\"><\/i>Excel to Web App<\/a><\/li>\n<li id=\"menu-item-20085\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-20085\"><a href=\"https:\/\/offline-web.com\/en\/jquery-to-vue-migration\/\"><i class=\"tm-nav-arrow-icon  flaticon-common-arrow-right\"><\/i>jQuery to Vue migration<\/a><\/li>\n<li id=\"menu-item-20086\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-20086\"><a href=\"https:\/\/offline-web.com\/en\/nuxt-migration\/\"><i class=\"tm-nav-arrow-icon  flaticon-common-arrow-right\"><\/i>Nuxt 4 migration<\/a><\/li>\n<li id=\"menu-item-20897\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-20897\"><a href=\"https:\/\/offline-web.com\/en\/ai-integration\/\"><i class=\"tm-nav-arrow-icon  flaticon-common-arrow-right\"><\/i>AI Features for Vue &#038; Nuxt<\/a><\/li>\n<li id=\"menu-item-20199\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-20199\"><a href=\"https:\/\/offline-web.com\/en\/vanilla-js-to-vue-migration\/\"><i class=\"tm-nav-arrow-icon  flaticon-common-arrow-right\"><\/i>Vanilla JS to Vue migration<\/a><\/li>\n<\/ul><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6e8f8363 e-con-full tm-col-stretched-none e-flex tm-bg-color-over-image e-con e-child\" data-id=\"6e8f8363\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6e9a9ded elementor-widget elementor-widget-tm-ele-text-editor\" data-id=\"6e9a9ded\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"tm-text-editor\" >\r\n\t\t<h4>Get in touch<\/h4>\t\t<\/div>\r\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6c30e07a elementor-widget elementor-widget-tm-ele-text-editor-advanced\" data-id=\"6c30e07a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-text-editor-advanced.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"tm-text-editor-advanced\">\r\n\t\t\t\t\t<div class=\"each-item elementor-repeater-item-f5252c0\" >\r\n\t\t\t\t<p>Athens, Greece, working remotely with EU &amp; US teams<\/p>\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t<div class=\"each-item elementor-repeater-item-7af36a6\" >\r\n\t\t\t\t<p>info@offline-web.com<\/p>\t\t\t\t<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-40a30e43 elementor-widget elementor-widget-tm-ele-iconbox\" data-id=\"40a30e43\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-iconbox.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"tm-sc-icon-box icon-box icon-left font-icon icon-left animate-hover icon-rotate-y\">\r\n\t\r\n  \t<div class=\"icon-box-wrapper\">\r\n\t\t\r\n\t\t<div class=\"icon-wrapper\">\r\n\t\t<div class=\"icon icon-default icon-type-font-icon icon-size-default\">\r\n\t\t\t<i aria-hidden=\"true\" class=\" flaticon-common-technology\"><\/i>\t\t<\/div>\r\n\r\n\t\t\t<\/div>\r\n\t\t\t<div class=\"icon-text\">\r\n\t\t\t\t\t\t<div class=\"content\"><h6>I reply by email<\/h6><\/div>\r\n\t\t\t\r\n\t\t\t\t<h5 class=\"icon-box-title \">\r\n\t\t\t\t\t\t\tGet a price and timeline\t\t\t\t\t<\/h5>\r\n\t\t\t\t\t\r\n\t\t\t\r\n\t\r\n\t\t\t\t\t<\/div>\r\n\t\t<div class=\"clearfix\"><\/div>\r\n\t<\/div>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c131c9 tm-contact-form-7-button-full-width elementor-widget elementor-widget-tm-ele-contact-form-7\" data-id=\"4c131c9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"tm-ele-contact-form-7.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"tm-contact-form-7-wrapper\">\r\n\t\t\t\t<div class=\"tm-contact-form tm-contact-form-7 tm-contact-form-4c131c9 placeholder-show tm-contact-form-align-default\">\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f6-o1\" lang=\"en-US\" dir=\"ltr\" data-wpcf7-id=\"6\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/en\/wp-json\/wp\/v2\/pages\/20895#wpcf7-f6-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Contact form\" novalidate=\"novalidate\" data-status=\"init\">\n<fieldset class=\"hidden-fields-container\"><input type=\"hidden\" name=\"_wpcf7\" value=\"6\" \/><input type=\"hidden\" name=\"_wpcf7_version\" value=\"6.1.6\" \/><input type=\"hidden\" name=\"_wpcf7_locale\" value=\"en_US\" \/><input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f6-o1\" \/><input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/><input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/><input type=\"hidden\" name=\"_wpcf7_recaptcha_response\" value=\"\" \/>\n<\/fieldset>\n<div class=\"contact\">\n  <div class=\"row g-3\">\n    <div class=\"col-sm-12\">\n       <div class=\"ow-howit\" style=\"font-size:13px;line-height:1.55;opacity:.72;margin-bottom:2px;\">\n         <div style=\"text-transform:uppercase;letter-spacing:.06em;font-size:11px;opacity:.85;margin-bottom:6px;\">How it works<\/div>\n         <div style=\"margin-bottom:3px;\"><strong>1.<\/strong> Tell me about your project below.<\/div>\n         <div style=\"margin-bottom:3px;\"><strong>2.<\/strong> I'll email you a few quick questions (about 3 minutes).<\/div>\n         <div><strong>3.<\/strong> You get a price, timeline and project scope by email \u2014 no call.<\/div>\n       <\/div>\n    <\/div>\n    <div class=\"col-sm-6\">\n       <label for=\"fname\">Name *<\/label>\n       <span class=\"wpcf7-form-control-wrap\" data-name=\"your-name\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required form-control\" autocomplete=\"name\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Jane Doe\" value=\"\" type=\"text\" name=\"your-name\" \/><\/span>\n    <\/div>\n    <div class=\"col-sm-6\">\n       <label for=\"femail\">Email *<\/label>\n       <span class=\"wpcf7-form-control-wrap\" data-name=\"your-email\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-email wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-email form-control\" autocomplete=\"email\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"you@example.com\" value=\"\" type=\"email\" name=\"your-email\" \/><\/span>\n    <\/div>\n    <div class=\"col-sm-12\">\n       <label for=\"fcompany\">Company or website (optional)<\/label>\n       <span class=\"wpcf7-form-control-wrap\" data-name=\"your-company\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text form-control\" aria-invalid=\"false\" placeholder=\"Company name or website, if you have one\" value=\"\" type=\"text\" name=\"your-company\" \/><\/span>\n       <small class=\"form-hint\">A link helps me scope your project faster.<\/small>\n    <\/div>\n    <div class=\"col-sm-12\">\n       <label for=\"fservice\">Which service? *<\/label>\n       <span class=\"wpcf7-form-control-wrap\" data-name=\"your-service\"><select class=\"wpcf7-form-control wpcf7-select wpcf7-validates-as-required form-control\" aria-required=\"true\" aria-invalid=\"false\" name=\"your-service\"><option value=\"\">&#8212;Please choose an option&#8212;<\/option><option value=\"Vue 2 to 3 migration\">Vue 2 to 3 migration<\/option><option value=\"jQuery to Vue migration\">jQuery to Vue migration<\/option><option value=\"Nuxt migration\">Nuxt migration<\/option><option value=\"Vanilla JS to Vue migration\">Vanilla JS to Vue migration<\/option><option value=\"Excel to web app \/ dashboard\">Excel to web app \/ dashboard<\/option><option value=\"Custom web app development\">Custom web app development<\/option><option value=\"AI features \/ LLM integration\">AI features \/ LLM integration<\/option><option value=\"Something else\">Something else<\/option><\/select><\/span>\n    <\/div>\n    <div class=\"col-sm-12\">\n       <label for=\"fmessage\">What do you want to build or fix? *<\/label>\n       <span class=\"wpcf7-form-control-wrap\" data-name=\"your-message\"><textarea cols=\"40\" rows=\"4\" maxlength=\"2000\" class=\"wpcf7-form-control wpcf7-textarea wpcf7-validates-as-required form-control\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"e.g. Migrate a Vue 2 dashboard to Vue 3, or turn an Excel workflow into a web app. A sentence or two is enough.\" name=\"your-message\"><\/textarea><\/span>\n    <\/div>\n    <div class=\"col-sm-12\">\n       <input class=\"wpcf7-form-control wpcf7-submit has-spinner btn btn-theme-colored2\" type=\"submit\" value=\"Get a price &amp; timeline\" \/>\n    <\/div>\n    <div class=\"col-sm-12\">\n       <p class=\"form-sla\">Complete the short questionnaire to receive your indicative price, timeline and scope by email.<\/p>\n       <p class=\"offline-recaptcha-note\">This site is protected by reCAPTCHA and the Google <a href=\"https:\/\/policies.google.com\/privacy\" target=\"_blank\" rel=\"noopener\">Privacy Policy<\/a> and <a href=\"https:\/\/policies.google.com\/terms\" target=\"_blank\" rel=\"noopener\">Terms of Service<\/a> apply.<\/p>\n    <\/div>\n  <\/div>\n<\/div><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n<\/div>\r\n\t\t\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Adding AI to a web application is rarely difficult because of the model API itself. The harder work sits around&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-20895","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>AI Integration for Web Applications | OFFLINE<\/title>\n<meta name=\"description\" content=\"AI features for web apps: copilots and document search with evals, cost controls and clear fallbacks. Get a price and timeline by email.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/offline-web.com\/en\/ai-integration\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AI integration for web applications\" \/>\n<meta property=\"og:description\" content=\"AI features for web apps: copilots and document search with evals, cost controls and clear fallbacks. Get a price and timeline by email.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/offline-web.com\/en\/ai-integration\/\" \/>\n<meta property=\"og:site_name\" content=\"offline-web.com\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61565994551139\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-14T14:40:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration.png\" \/>\n<meta name=\"twitter:site\" content=\"@offline_web\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/ai-integration\\\/\",\"url\":\"https:\\\/\\\/offline-web.com\\\/en\\\/ai-integration\\\/\",\"name\":\"AI Integration for Web Applications | OFFLINE\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/ai-integration\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/ai-integration\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/offline-web.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/7-ai-integration-1024x538.png\",\"datePublished\":\"2026-08-04T13:07:14+00:00\",\"dateModified\":\"2026-08-14T14:40:42+00:00\",\"description\":\"AI features for web apps: copilots and document search with evals, cost controls and clear fallbacks. Get a price and timeline by email.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/ai-integration\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/offline-web.com\\\/en\\\/ai-integration\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/ai-integration\\\/#primaryimage\",\"url\":\"https:\\\/\\\/offline-web.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/7-ai-integration-1024x538.png\",\"contentUrl\":\"https:\\\/\\\/offline-web.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/7-ai-integration-1024x538.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/ai-integration\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/offline-web.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AI integration for web applications\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/offline-web.com\\\/en\\\/\",\"name\":\"offline-web.com\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/#\\\/schema\\\/person\\\/520626b2a7a5c2d1fbeb91e5bd8b4aa3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/offline-web.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/offline-web.com\\\/en\\\/#\\\/schema\\\/person\\\/520626b2a7a5c2d1fbeb91e5bd8b4aa3\",\"name\":\"Stelios Kitziris\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/offline-web.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/0404afea-ad5d-45e2-8111-d489cd7935ab.png\",\"url\":\"https:\\\/\\\/offline-web.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/0404afea-ad5d-45e2-8111-d489cd7935ab.png\",\"contentUrl\":\"https:\\\/\\\/offline-web.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/0404afea-ad5d-45e2-8111-d489cd7935ab.png\",\"width\":1122,\"height\":1402,\"caption\":\"Stelios Kitziris\"},\"logo\":{\"@id\":\"https:\\\/\\\/offline-web.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/0404afea-ad5d-45e2-8111-d489cd7935ab.png\"},\"sameAs\":[\"https:\\\/\\\/offline-web.com\",\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61565994551139\",\"https:\\\/\\\/www.instagram.com\\\/offline_web_\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/offline-web\\\/\",\"https:\\\/\\\/x.com\\\/offline_web\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"AI Integration for Web Applications | OFFLINE","description":"AI features for web apps: copilots and document search with evals, cost controls and clear fallbacks. Get a price and timeline by email.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/offline-web.com\/en\/ai-integration\/","og_locale":"en_US","og_type":"article","og_title":"AI integration for web applications","og_description":"AI features for web apps: copilots and document search with evals, cost controls and clear fallbacks. Get a price and timeline by email.","og_url":"https:\/\/offline-web.com\/en\/ai-integration\/","og_site_name":"offline-web.com","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61565994551139","article_modified_time":"2026-08-14T14:40:42+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_image":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration.png","twitter_site":"@offline_web","twitter_misc":{"Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/offline-web.com\/en\/ai-integration\/","url":"https:\/\/offline-web.com\/en\/ai-integration\/","name":"AI Integration for Web Applications | OFFLINE","isPartOf":{"@id":"https:\/\/offline-web.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/offline-web.com\/en\/ai-integration\/#primaryimage"},"image":{"@id":"https:\/\/offline-web.com\/en\/ai-integration\/#primaryimage"},"thumbnailUrl":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration-1024x538.png","datePublished":"2026-08-04T13:07:14+00:00","dateModified":"2026-08-14T14:40:42+00:00","description":"AI features for web apps: copilots and document search with evals, cost controls and clear fallbacks. Get a price and timeline by email.","breadcrumb":{"@id":"https:\/\/offline-web.com\/en\/ai-integration\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/offline-web.com\/en\/ai-integration\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/offline-web.com\/en\/ai-integration\/#primaryimage","url":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration-1024x538.png","contentUrl":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/08\/7-ai-integration-1024x538.png"},{"@type":"BreadcrumbList","@id":"https:\/\/offline-web.com\/en\/ai-integration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/offline-web.com\/en\/"},{"@type":"ListItem","position":2,"name":"AI integration for web applications"}]},{"@type":"WebSite","@id":"https:\/\/offline-web.com\/en\/#website","url":"https:\/\/offline-web.com\/en\/","name":"offline-web.com","description":"","publisher":{"@id":"https:\/\/offline-web.com\/en\/#\/schema\/person\/520626b2a7a5c2d1fbeb91e5bd8b4aa3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/offline-web.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/offline-web.com\/en\/#\/schema\/person\/520626b2a7a5c2d1fbeb91e5bd8b4aa3","name":"Stelios Kitziris","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/06\/0404afea-ad5d-45e2-8111-d489cd7935ab.png","url":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/06\/0404afea-ad5d-45e2-8111-d489cd7935ab.png","contentUrl":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/06\/0404afea-ad5d-45e2-8111-d489cd7935ab.png","width":1122,"height":1402,"caption":"Stelios Kitziris"},"logo":{"@id":"https:\/\/offline-web.com\/wp-content\/uploads\/2026\/06\/0404afea-ad5d-45e2-8111-d489cd7935ab.png"},"sameAs":["https:\/\/offline-web.com","https:\/\/www.facebook.com\/profile.php?id=61565994551139","https:\/\/www.instagram.com\/offline_web_\/","https:\/\/www.linkedin.com\/company\/offline-web\/","https:\/\/x.com\/offline_web"]}]}},"_links":{"self":[{"href":"https:\/\/offline-web.com\/en\/wp-json\/wp\/v2\/pages\/20895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/offline-web.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/offline-web.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/offline-web.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/offline-web.com\/en\/wp-json\/wp\/v2\/comments?post=20895"}],"version-history":[{"count":15,"href":"https:\/\/offline-web.com\/en\/wp-json\/wp\/v2\/pages\/20895\/revisions"}],"predecessor-version":[{"id":21564,"href":"https:\/\/offline-web.com\/en\/wp-json\/wp\/v2\/pages\/20895\/revisions\/21564"}],"wp:attachment":[{"href":"https:\/\/offline-web.com\/en\/wp-json\/wp\/v2\/media?parent=20895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}