[{"data":1,"prerenderedAt":1105},["ShallowReactive",2],{"/blog/training-and-deploying-ai-models-with-gitlab-and-vertex-ai":3,"navigation-en-us":321,"banner-en-us":749,"footer-en-us":759,"blog-post-authors-en-us-Regnard Raquedan":1003,"blog-related-posts-en-us-training-and-deploying-ai-models-with-gitlab-and-vertex-ai":1018,"blog-promotions-en-us":1043,"next-steps-en-us":1095},{"id":4,"title":5,"authors":6,"body":8,"category":299,"date":300,"description":301,"extension":302,"externalUrl":303,"faq":303,"featured":304,"heroImage":305,"meta":306,"navigation":159,"path":307,"seo":308,"slug":312,"stem":313,"tags":314,"template":319,"updatedDate":303,"__hash__":320},"blogPosts/en-us/blog/training-and-deploying-ai-models-with-gitlab-and-vertex-ai.md","Train and deploy AI models with GitLab and Google Cloud's Vertex AI",[7],"Regnard Raquedan",{"type":9,"value":10,"toc":285},"minimark",[11,29,44,59,64,67,75,84,87,112,116,119,122,151,160,164,173,178,181,185,194,198,207,214,220,231,237,243,247,256,260,268,272,279,282],[12,13,14],"p",{},[15,16,17,18,23,24,28],"em",{},"This blog is the latest post in an ongoing series about GitLab's journey to ",[19,20,22],"a",{"href":21},"/blog/ai-ml-in-devsecops-series/","build and integrate AI/ML into our DevSecOps platform",". The first blog post can be found ",[19,25,27],{"href":26},"/blog/what-the-ml-ai/","here",". Throughout the series, we'll feature blogs from our product, engineering, and UX teams to showcase how we're infusing AI/ML into GitLab.",[12,30,31,32,37,38,43],{},"Most development and engineering teams are now tasked with maintaining and deploying AI/ML-related code. In this context, the focus on security and efficiency becomes even more crucial. Companies are keen to capitalize on the benefits of AI swiftly while striving to decrease potential risks. GitLab can be used to orchestrate any AI/ML workloads, enabling teams to rapidly develop new generative AI capabilities. ",[19,33,36],{"href":34,"rel":35},"https://about.gitlab.com/press/releases/2023-05-02-gitlab-and-google-cloud-partner-to-expand-ai-assisted-capabilities/",[],"GitLab recently announced a partnership with Google"," to bring ",[19,39,42],{"href":40,"rel":41},"https://cloud.google.com/ai/generative-ai",[],"generative AI on Google Cloud"," to our mutual customers.",[12,45,46,47,52,53,58],{},"This is a tutorial of how to use these tools to deploy an AI model with ",[19,48,51],{"href":49,"rel":50},"https://cloud.google.com/vertex-ai",[],"Google Cloud's Vertex AI"," using GitLab to orchestrate the ",[19,54,57],{"href":55,"rel":56},"https://docs.gitlab.com/user/project/ml/",[],"ModelOps workload",". Our custom model training use case is simple introductory credit card fraud detection, a pertinent issue in the financial industry.",[60,61,63],"h2",{"id":62},"the-solution","The solution",[12,65,66],{},"Our solution is a Python-based credit card transaction fraud detection app. Once deployed, applications can use an API endpoint to make predictions on whether a submitted transaction is fraudulent or not.",[12,68,69,74],{},[19,70,73],{"href":71,"rel":72},"https://cloud.google.com/vertex-ai/docs",[],"Vertex AI"," is Google Cloud's flagship AI/ML platform that lets users train and deploy machine learning models and AI applications. This is the platform where the API endpoint and model are hosted. While Vertex AI can handle training using prebuilt functions, this demo uses a custom training script written in Python.",[12,76,77,78,83],{},"For the demo’s purposes, GitLab hosts the ",[19,79,82],{"href":80,"rel":81},"https://gitlab.com/gitlab-com/alliances/google/sandbox-projects/demos/vertex-ai",[],"application source code"," and helps to ensure quality and security by running the tests and scans automatically. We also use GitLab's CI/CD to execute the Python code, programmatically upload the resulting artifacts to Google Cloud Storage, and create the endpoint in Vertex AI.",[12,85,86],{},"Let's take a high-level look at how the solution is designed and what it does:",[88,89,90,100,109],"ul",{},[91,92,93,94,99],"li",{},"Data preprocessing: To effectively detect fraudulent transactions, we address the initial imbalance in the raw transaction data. By employing the ",[19,95,98],{"href":96,"rel":97},"https://imbalanced-learn.org/stable/references/generated/imblearn.over_sampling.SMOTE.html",[],"Synthetic Minority Over-sampling Technique (SMOTE)",", we duplicate instances of the minority class, enhancing the model's ability to identify patterns.",[91,101,102,103,108],{},"Model training: Using the balanced dataset, we train a ",[19,104,107],{"href":105,"rel":106},"https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html",[],"RandomForestClassifier"," model. This creates a 'forest' of decision trees, each based on a random subset of the training data. It outputs the mode of the classes determined by the individual trees, making it well-suited for binary outcomes, such as identifying fraudulent transactions. The trained model is stored in a Google Cloud Storage bucket for later use.",[91,110,111],{},"Model deployment: Leveraging GitLab's DevSecOps platform, model deployment becomes straightforward. By committing the code to GitLab, the trained model is automatically deployed to Vertex AI. Subsequently, the API endpoint is also established.",[60,113,115],{"id":114},"prerequisites","Prerequisites",[12,117,118],{},"Before we dive into the details, let's make sure you have everything you need to get started with deploying your AI model using GitLab and Vertex AI.",[12,120,121],{},"Here are the requirements:",[123,124,125,128,148],"ol",{},[91,126,127],{},"Google Cloud project",[91,129,130,131],{},"Google Cloud service account with these permissions:\n",[123,132,133,136,139,142,145],{},[91,134,135],{},"AI Platform Admin",[91,137,138],{},"Service Account User",[91,140,141],{},"Storage Admin",[91,143,144],{},"Storage Object Admin",[91,146,147],{},"Vertex AI Administrator",[91,149,150],{},"GitLab project",[152,153],"iframe",{"width":154,"height":155,"src":156,"frameBorder":157,"allow":158,"allowFullScreen":159},560,315,"https://www.youtube-nocookie.com/embed/p7GTsbSQWF4","0","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",true,[60,161,163],{"id":162},"demo-walkthrough","Demo walkthrough",[12,165,166,167,172],{},"Following the ",[19,168,171],{"href":169,"rel":170},"https://youtu.be/p7GTsbSQWF4",[],"video walkthrough",", here's a guide for setting up an AI pipeline with GitLab and Google Cloud's Vertex AI.",[174,175,177],"h3",{"id":176},"step-1-gitlab-and-google-cloud-connection","Step 1: GitLab and Google Cloud connection",[12,179,180],{},"Firstly, we need GitLab to interact with Google Cloud. Insert your Google Cloud Service Account credentials into your GitLab project's environment variables (make sure they're Base64 encoded for security).",[174,182,184],{"id":183},"step-2-uploading-data-to-vertex-ai","Step 2: Uploading data to Vertex AI",[12,186,187,188,193],{},"Move to the Vertex AI section in Google Cloud. Here, ",[19,189,192],{"href":190,"rel":191},"https://cloud.google.com/vertex-ai/docs/tabular-data/forecasting/create-dataset",[],"create and upload your dataset",". In our demo, we use a 'Tabular' dataset for 'Classification' as we're predicting credit card fraud.",[174,195,197],{"id":196},"step-3-creating-the-cicd-pipeline","Step 3: Creating the CI/CD pipeline",[12,199,200,201,206],{},"Back to GitLab to structure our ",[19,202,205],{"href":203,"rel":204},"https://gitlab.com/gitlab-com/alliances/google/sandbox-projects/demos/vertex-ai/-/ci/editor",[],"CI/CD pipeline",". It comprises three stages:",[12,208,209,213],{},[210,211,212],"strong",{},"Test:"," Quality and security checks.",[12,215,216,219],{},[210,217,218],{},"Train:"," Executes a Python script to train the model, outputting a .pkl artifact.",[221,222,228],"pre",{"className":223,"code":225,"language":226,"meta":227},[224],"language-text","train:\n stage: train\n script:\n   - apt-get update && apt-get install -y python3-pip python3-venv\n   - python3 -m venv venv\n   - source venv/bin/activate\n   - pip install --upgrade pip\n   - pip install pandas scikit-learn joblib imbalanced-learn google-cloud-storage\n   - python3 src/train.py\n artifacts:\n   paths:\n     - model.pkl\n","text","",[229,230,225],"code",{"__ignoreMap":227},[12,232,233,236],{},[210,234,235],{},"Deploy:"," Uses Google Cloud's Deep Learning platform container to deploy the trained model on Vertex AI.",[221,238,241],{"className":239,"code":240,"language":226,"meta":227},[224],"deploy:\n stage: deploy\n image:\n   name: us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-5\n   entrypoint: [\"\"]\n script:\n   - python src/deploy.py\n dependencies:\n   - train\n only:\n   - main\n",[229,242,240],{"__ignoreMap":227},[174,244,246],{"id":245},"step-4-model-training","Step 4: Model training",[12,248,249,250,255],{},"The ",[19,251,254],{"href":252,"rel":253},"https://gitlab.com/gitlab-com/alliances/google/sandbox-projects/demos/vertex-ai/-/blob/main/src/train.py",[],"training code",", running on GitLab CI/CD, fetches data from Vertex AI, processes it, trains our RandomForestClassifier model, and saves the model to Google Cloud Storage.",[174,257,259],{"id":258},"step-5-model-deployment","Step 5: Model deployment",[12,261,249,262,267],{},[19,263,266],{"href":264,"rel":265},"https://gitlab.com/gitlab-com/alliances/google/sandbox-projects/demos/vertex-ai/-/blob/main/src/deploy.py",[],"deployment script"," creates an endpoint on Vertex AI and deploys our trained model there, utilizing the service account credentials we set initially.",[174,269,271],{"id":270},"step-6-prediction-testing","Step 6: Prediction testing",[12,273,274],{},[275,276],"img",{"alt":277,"src":278},"Screenshot of Vertex AI","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399272/blog/Content%20Images/vertex-ai-screenshot.png",[12,280,281],{},"Finally, within Vertex AI, navigate to your model and test its predictions using an input JSON request. If all goes well, you'll get a response from your model.",[12,283,284],{},"There you have it: an AI pipeline with GitLab and Google Cloud's Vertex AI. This combination of GitLab's DevSecOps capabilities with Vertex AI's scalable ML platform is designed with the aim of rapid and secure AI deployments.",{"title":227,"searchDepth":286,"depth":286,"links":287},2,[288,289,290],{"id":62,"depth":286,"text":63},{"id":114,"depth":286,"text":115},{"id":162,"depth":286,"text":163,"children":291},[292,294,295,296,297,298],{"id":176,"depth":293,"text":177},3,{"id":183,"depth":293,"text":184},{"id":196,"depth":293,"text":197},{"id":245,"depth":293,"text":246},{"id":258,"depth":293,"text":259},{"id":270,"depth":293,"text":271},"ai","2023-06-08","Demo of GitLab's DevSecOps capabilities combined with Vertex AI's scalable ML platform, designed with the aim of rapid and secure AI deployments.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662840/Blog/Hero%20Images/ai-experiment-stars.png",{},"/en-us/blog/training-and-deploying-ai-models-with-gitlab-and-vertex-ai",{"title":5,"description":301,"ogTitle":5,"ogDescription":301,"noIndex":304,"ogImage":305,"ogUrl":309,"ogSiteName":310,"ogType":311,"canonicalUrls":309},"https://about.gitlab.com/blog/training-and-deploying-ai-models-with-gitlab-and-vertex-ai","https://about.gitlab.com","article","training-and-deploying-ai-models-with-gitlab-and-vertex-ai","en-us/blog/training-and-deploying-ai-models-with-gitlab-and-vertex-ai",[315,316,317,318],"DevSecOps","product","features","AI","BlogPost","twmXkr3EstffStpA_zPnykAJ8wRRClVM0l2GuuWHNZQ",{"logo":322,"freeTrial":327,"sales":332,"login":337,"items":342,"search":669,"minimal":700,"duo":719,"switchNav":728,"pricingDeployment":739},{"config":323},{"href":324,"dataGaName":325,"dataGaLocation":326},"/","gitlab logo","header",{"text":328,"config":329},"Get free trial",{"href":330,"dataGaName":331,"dataGaLocation":326},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":333,"config":334},"Request a demo",{"href":335,"dataGaName":336,"dataGaLocation":326},"/sales/?contact-topic=request-demo","sales",{"text":338,"config":339},"Sign in",{"href":340,"dataGaName":341,"dataGaLocation":326},"https://gitlab.com/users/sign_in/","sign in",[343,372,472,477,591,647],{"text":344,"config":345,"menu":347},"Platform",{"dataNavLevelOne":346},"platform",{"type":348,"columns":349},"cards",[350,356,364],{"title":344,"description":351,"link":352},"The intelligent orchestration platform for DevSecOps",{"text":353,"config":354},"Explore our Platform",{"href":355,"dataGaName":346,"dataGaLocation":326},"/platform/",{"title":357,"description":358,"link":359},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":360,"config":361},"Meet GitLab Duo",{"href":362,"dataGaName":363,"dataGaLocation":326},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":365,"description":366,"link":367},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":368,"config":369},"Learn more",{"href":370,"dataGaName":371,"dataGaLocation":326},"/why-gitlab/","why gitlab",{"text":373,"left":159,"config":374,"menu":376},"Product",{"dataNavLevelOne":375},"solutions",{"type":377,"link":378,"columns":382,"feature":451},"lists",{"text":379,"config":380},"View all Solutions",{"href":381,"dataGaName":375,"dataGaLocation":326},"/solutions/",[383,407,430],{"title":384,"description":385,"link":386,"items":391},"Automation","CI/CD and automation to accelerate deployment",{"config":387},{"icon":388,"href":389,"dataGaName":390,"dataGaLocation":326},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[392,396,399,403],{"text":393,"config":394},"CI/CD",{"href":395,"dataGaLocation":326,"dataGaName":393},"/solutions/continuous-integration/",{"text":357,"config":397},{"href":362,"dataGaLocation":326,"dataGaName":398},"gitlab duo agent platform - product menu",{"text":400,"config":401},"Source Code Management",{"href":402,"dataGaLocation":326,"dataGaName":400},"/solutions/source-code-management/",{"text":404,"config":405},"Automated Software Delivery",{"href":389,"dataGaLocation":326,"dataGaName":406},"Automated software delivery",{"title":408,"description":409,"link":410,"items":415},"Security","Deliver code faster without compromising security",{"config":411},{"href":412,"dataGaName":413,"dataGaLocation":326,"icon":414},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[416,420,425],{"text":417,"config":418},"Application Security Testing",{"href":412,"dataGaName":419,"dataGaLocation":326},"Application security testing",{"text":421,"config":422},"Software Supply Chain Security",{"href":423,"dataGaLocation":326,"dataGaName":424},"/solutions/supply-chain/","Software supply chain security",{"text":426,"config":427},"Software Compliance",{"href":428,"dataGaName":429,"dataGaLocation":326},"/solutions/software-compliance/","software compliance",{"title":431,"link":432,"items":437},"Measurement",{"config":433},{"icon":434,"href":435,"dataGaName":436,"dataGaLocation":326},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[438,442,446],{"text":439,"config":440},"Visibility & Measurement",{"href":435,"dataGaLocation":326,"dataGaName":441},"Visibility and Measurement",{"text":443,"config":444},"Value Stream Management",{"href":445,"dataGaLocation":326,"dataGaName":443},"/solutions/value-stream-management/",{"text":447,"config":448},"Analytics & Insights",{"href":449,"dataGaLocation":326,"dataGaName":450},"/solutions/analytics-and-insights/","Analytics and insights",{"title":452,"type":377,"items":453},"GitLab for",[454,460,466],{"text":455,"config":456},"Enterprise",{"icon":457,"href":458,"dataGaLocation":326,"dataGaName":459},"Building","/enterprise/","enterprise",{"text":461,"config":462},"Small Business",{"icon":463,"href":464,"dataGaLocation":326,"dataGaName":465},"Work","/small-business/","small business",{"text":467,"config":468},"Public Sector",{"icon":469,"href":470,"dataGaLocation":326,"dataGaName":471},"Organization","/solutions/public-sector/","public sector",{"text":473,"config":474},"Pricing",{"href":475,"dataGaName":476,"dataGaLocation":326,"dataNavLevelOne":476},"/pricing/","pricing",{"text":478,"config":479,"menu":481},"Resources",{"dataNavLevelOne":480},"resources",{"type":377,"link":482,"columns":486,"feature":580},{"text":483,"config":484},"View all resources",{"href":485,"dataGaName":480,"dataGaLocation":326},"/resources/",[487,520,547],{"title":488,"items":489},"Getting started",[490,495,500,505,510,515],{"text":491,"config":492},"Install",{"href":493,"dataGaName":494,"dataGaLocation":326},"/install/","install",{"text":496,"config":497},"Quick start guides",{"href":498,"dataGaName":499,"dataGaLocation":326},"/get-started/","quick setup checklists",{"text":501,"config":502},"Learn",{"href":503,"dataGaLocation":326,"dataGaName":504},"https://university.gitlab.com/","learn",{"text":506,"config":507},"Product documentation",{"href":508,"dataGaName":509,"dataGaLocation":326},"https://docs.gitlab.com/","product documentation",{"text":511,"config":512},"Best practice videos",{"href":513,"dataGaName":514,"dataGaLocation":326},"/getting-started-videos/","best practice videos",{"text":516,"config":517},"Integrations",{"href":518,"dataGaName":519,"dataGaLocation":326},"/integrations/","integrations",{"title":521,"items":522},"Discover",[523,528,533,538,542],{"text":524,"config":525},"Customer success stories",{"href":526,"dataGaName":527,"dataGaLocation":326},"/customers/","customer success stories",{"text":529,"config":530},"Blog",{"href":531,"dataGaName":532,"dataGaLocation":326},"/blog/","blog",{"text":534,"config":535},"Demo Hub",{"href":536,"dataGaName":537,"dataGaLocation":326},"/demo-hub/","demo hub",{"text":539,"config":540},"The Source",{"href":541,"dataGaName":532,"dataGaLocation":326},"/the-source/",{"text":543,"config":544},"Remote",{"href":545,"dataGaName":546,"dataGaLocation":326},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":548,"items":549},"Connect",[550,555,560,565,570,575],{"text":551,"config":552},"GitLab Services",{"href":553,"dataGaName":554,"dataGaLocation":326},"/services/","services",{"text":556,"config":557},"Contribute",{"href":558,"dataGaName":559,"dataGaLocation":326},"https://contributors.gitlab.com","contribute",{"text":561,"config":562},"Community",{"href":563,"dataGaName":564,"dataGaLocation":326},"/community/","community",{"text":566,"config":567},"Forum",{"href":568,"dataGaName":569,"dataGaLocation":326},"https://forum.gitlab.com/","forum",{"text":571,"config":572},"Events",{"href":573,"dataGaName":574,"dataGaLocation":326},"/events/","events",{"text":576,"config":577},"Partners",{"href":578,"dataGaName":579,"dataGaLocation":326},"/partners/","partners",{"config":581,"title":584,"text":585,"link":586},{"background":582,"textColor":583},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":587,"config":588},"Read the latest",{"href":589,"dataGaName":590,"dataGaLocation":326},"/whats-new/","whats new",{"text":592,"config":593,"menu":595},"Company",{"dataNavLevelOne":594},"company",{"type":377,"columns":596},[597],{"items":598},[599,604,610,612,617,622,627,632,637,642],{"text":600,"config":601},"About",{"href":602,"dataGaName":603,"dataGaLocation":326},"/company/","about",{"text":605,"config":606,"footerGa":609},"Jobs",{"href":607,"dataGaName":608,"dataGaLocation":326},"/jobs/","jobs",{"dataGaName":608},{"text":571,"config":611},{"href":573,"dataGaName":574,"dataGaLocation":326},{"text":613,"config":614},"Leadership",{"href":615,"dataGaName":616,"dataGaLocation":326},"/company/team/e-group/","leadership",{"text":618,"config":619},"Handbook",{"href":620,"dataGaName":621,"dataGaLocation":326},"https://handbook.gitlab.com/","handbook",{"text":623,"config":624},"Investor relations",{"href":625,"dataGaName":626,"dataGaLocation":326},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":628,"config":629},"Trust Center",{"href":630,"dataGaName":631,"dataGaLocation":326},"/security/","trust center",{"text":633,"config":634},"AI Transparency Center",{"href":635,"dataGaName":636,"dataGaLocation":326},"/ai-transparency-center/","ai transparency center",{"text":638,"config":639},"Newsletter",{"href":640,"dataGaName":641,"dataGaLocation":326},"/company/contact/#contact-forms","newsletter",{"text":643,"config":644},"Press",{"href":645,"dataGaName":646,"dataGaLocation":326},"/press/","press",{"text":648,"config":649,"menu":650},"Contact us",{"dataNavLevelOne":594},{"type":377,"columns":651},[652],{"items":653},[654,659,664],{"text":655,"config":656},"Talk to sales",{"href":657,"dataGaName":658,"dataGaLocation":326},"/sales/","talk to sales",{"text":660,"config":661},"Support portal",{"href":662,"dataGaName":663,"dataGaLocation":326},"https://support.gitlab.com/hc/en-us","support portal",{"text":665,"config":666},"Customer portal",{"href":667,"dataGaName":668,"dataGaLocation":326},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":670,"login":671,"suggestions":678},"Close",{"text":672,"link":673},"To search repositories and projects, login to",{"text":674,"config":675},"gitlab.com",{"href":340,"dataGaName":676,"dataGaLocation":677},"search login","search",{"text":679,"default":680},"Suggestions",[681,683,687,689,693,697],{"text":357,"config":682},{"href":362,"dataGaName":357,"dataGaLocation":677},{"text":684,"config":685},"Code Suggestions (AI)",{"href":686,"dataGaName":684,"dataGaLocation":677},"/solutions/code-suggestions/",{"text":393,"config":688},{"href":395,"dataGaName":393,"dataGaLocation":677},{"text":690,"config":691},"GitLab on AWS",{"href":692,"dataGaName":690,"dataGaLocation":677},"/partners/technology-partners/aws/",{"text":694,"config":695},"GitLab on Google Cloud",{"href":696,"dataGaName":694,"dataGaLocation":677},"/partners/technology-partners/google-cloud-platform/",{"text":698,"config":699},"Why GitLab?",{"href":370,"dataGaName":698,"dataGaLocation":677},{"freeTrial":701,"mobileIcon":706,"desktopIcon":711,"secondaryButton":714},{"text":702,"config":703},"Start free trial",{"href":704,"dataGaName":331,"dataGaLocation":705},"https://gitlab.com/-/trials/new/","nav",{"altText":707,"config":708},"Gitlab Icon",{"src":709,"dataGaName":710,"dataGaLocation":705},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":707,"config":712},{"src":713,"dataGaName":710,"dataGaLocation":705},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":715,"config":716},"Get Started",{"href":717,"dataGaName":718,"dataGaLocation":705},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":720,"mobileIcon":724,"desktopIcon":726},{"text":721,"config":722},"Learn more about GitLab Duo",{"href":362,"dataGaName":723,"dataGaLocation":705},"gitlab duo",{"altText":707,"config":725},{"src":709,"dataGaName":710,"dataGaLocation":705},{"altText":707,"config":727},{"src":713,"dataGaName":710,"dataGaLocation":705},{"button":729,"mobileIcon":734,"desktopIcon":736},{"text":730,"config":731},"/switch",{"href":732,"dataGaName":733,"dataGaLocation":705},"#contact","switch",{"altText":707,"config":735},{"src":709,"dataGaName":710,"dataGaLocation":705},{"altText":707,"config":737},{"src":738,"dataGaName":710,"dataGaLocation":705},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":740,"mobileIcon":745,"desktopIcon":747},{"text":741,"config":742},"Back to pricing",{"href":475,"dataGaName":743,"dataGaLocation":705,"icon":744},"back to pricing","GoBack",{"altText":707,"config":746},{"src":709,"dataGaName":710,"dataGaLocation":705},{"altText":707,"config":748},{"src":713,"dataGaName":710,"dataGaLocation":705},{"title":750,"titleMobile":751,"button":752,"config":757},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":368,"config":753},{"href":754,"dataGaName":755,"dataGaLocation":756},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":758,"disabled":304},"release",{"data":760},{"text":761,"source":762,"edit":768,"contribute":773,"config":778,"items":783,"minimal":992},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":763,"config":764},"View page source",{"href":765,"dataGaName":766,"dataGaLocation":767},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":769,"config":770},"Edit this page",{"href":771,"dataGaName":772,"dataGaLocation":767},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":774,"config":775},"Please contribute",{"href":776,"dataGaName":777,"dataGaLocation":767},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":779,"facebook":780,"youtube":781,"linkedin":782},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[784,831,884,928,960],{"title":473,"links":785,"subMenu":800},[786,790,795],{"text":787,"config":788},"View plans",{"href":475,"dataGaName":789,"dataGaLocation":767},"view plans",{"text":791,"config":792},"Why Premium?",{"href":793,"dataGaName":794,"dataGaLocation":767},"/pricing/premium/","why premium",{"text":796,"config":797},"Why Ultimate?",{"href":798,"dataGaName":799,"dataGaLocation":767},"/pricing/ultimate/","why ultimate",[801],{"title":802,"links":803},"Contact Us",[804,807,809,811,816,821,826],{"text":805,"config":806},"Contact sales",{"href":657,"dataGaName":336,"dataGaLocation":767},{"text":660,"config":808},{"href":662,"dataGaName":663,"dataGaLocation":767},{"text":665,"config":810},{"href":667,"dataGaName":668,"dataGaLocation":767},{"text":812,"config":813},"Status",{"href":814,"dataGaName":815,"dataGaLocation":767},"https://status.gitlab.com/","status",{"text":817,"config":818},"Terms of use",{"href":819,"dataGaName":820,"dataGaLocation":767},"/terms/","terms of use",{"text":822,"config":823},"Privacy statement",{"href":824,"dataGaName":825,"dataGaLocation":767},"/privacy/","privacy statement",{"text":827,"config":828},"Cookie preferences",{"dataGaName":829,"dataGaLocation":767,"id":830,"isOneTrustButton":159},"cookie preferences","ot-sdk-btn",{"title":373,"links":832,"subMenu":841},[833,837],{"text":834,"config":835},"DevSecOps platform",{"href":355,"dataGaName":836,"dataGaLocation":767},"devsecops platform",{"text":838,"config":839},"AI-Assisted Development",{"href":362,"dataGaName":840,"dataGaLocation":767},"ai-assisted development",[842],{"title":843,"links":844},"Topics",[845,850,855,860,865,869,874,879],{"text":846,"config":847},"CICD",{"href":848,"dataGaName":849,"dataGaLocation":767},"/topics/ci-cd/","cicd",{"text":851,"config":852},"GitOps",{"href":853,"dataGaName":854,"dataGaLocation":767},"/topics/gitops/","gitops",{"text":856,"config":857},"DevOps",{"href":858,"dataGaName":859,"dataGaLocation":767},"/topics/devops/","devops",{"text":861,"config":862},"Version Control",{"href":863,"dataGaName":864,"dataGaLocation":767},"/topics/version-control/","version control",{"text":315,"config":866},{"href":867,"dataGaName":868,"dataGaLocation":767},"/topics/devsecops/","devsecops",{"text":870,"config":871},"Cloud Native",{"href":872,"dataGaName":873,"dataGaLocation":767},"/topics/cloud-native/","cloud native",{"text":875,"config":876},"AI for Coding",{"href":877,"dataGaName":878,"dataGaLocation":767},"/topics/devops/ai-for-coding/","ai for coding",{"text":880,"config":881},"Agentic AI",{"href":882,"dataGaName":883,"dataGaLocation":767},"/topics/agentic-ai/","agentic ai",{"title":885,"links":886},"Solutions",[887,889,891,896,900,903,907,910,912,915,918,923],{"text":417,"config":888},{"href":412,"dataGaName":417,"dataGaLocation":767},{"text":406,"config":890},{"href":389,"dataGaName":390,"dataGaLocation":767},{"text":892,"config":893},"Agile development",{"href":894,"dataGaName":895,"dataGaLocation":767},"/solutions/agile-delivery/","agile delivery",{"text":897,"config":898},"SCM",{"href":402,"dataGaName":899,"dataGaLocation":767},"source code management",{"text":846,"config":901},{"href":395,"dataGaName":902,"dataGaLocation":767},"continuous integration & delivery",{"text":904,"config":905},"Value stream management",{"href":445,"dataGaName":906,"dataGaLocation":767},"value stream management",{"text":851,"config":908},{"href":909,"dataGaName":854,"dataGaLocation":767},"/solutions/gitops/",{"text":455,"config":911},{"href":458,"dataGaName":459,"dataGaLocation":767},{"text":913,"config":914},"Small business",{"href":464,"dataGaName":465,"dataGaLocation":767},{"text":916,"config":917},"Public sector",{"href":470,"dataGaName":471,"dataGaLocation":767},{"text":919,"config":920},"Education",{"href":921,"dataGaName":922,"dataGaLocation":767},"/solutions/education/","education",{"text":924,"config":925},"Financial services",{"href":926,"dataGaName":927,"dataGaLocation":767},"/solutions/finance/","financial services",{"title":478,"links":929},[930,932,934,936,939,941,944,946,948,950,952,954,956,958],{"text":491,"config":931},{"href":493,"dataGaName":494,"dataGaLocation":767},{"text":496,"config":933},{"href":498,"dataGaName":499,"dataGaLocation":767},{"text":501,"config":935},{"href":503,"dataGaName":504,"dataGaLocation":767},{"text":506,"config":937},{"href":508,"dataGaName":938,"dataGaLocation":767},"docs",{"text":529,"config":940},{"href":531,"dataGaName":532,"dataGaLocation":767},{"text":942,"config":943},"What's new",{"href":589,"dataGaName":590,"dataGaLocation":767},{"text":524,"config":945},{"href":526,"dataGaName":527,"dataGaLocation":767},{"text":543,"config":947},{"href":545,"dataGaName":546,"dataGaLocation":767},{"text":551,"config":949},{"href":553,"dataGaName":554,"dataGaLocation":767},{"text":556,"config":951},{"href":558,"dataGaName":559,"dataGaLocation":767},{"text":561,"config":953},{"href":563,"dataGaName":564,"dataGaLocation":767},{"text":566,"config":955},{"href":568,"dataGaName":569,"dataGaLocation":767},{"text":571,"config":957},{"href":573,"dataGaName":574,"dataGaLocation":767},{"text":576,"config":959},{"href":578,"dataGaName":579,"dataGaLocation":767},{"title":592,"links":961},[962,964,966,968,970,972,976,981,983,985,987],{"text":600,"config":963},{"href":602,"dataGaName":594,"dataGaLocation":767},{"text":605,"config":965},{"href":607,"dataGaName":608,"dataGaLocation":767},{"text":613,"config":967},{"href":615,"dataGaName":616,"dataGaLocation":767},{"text":618,"config":969},{"href":620,"dataGaName":621,"dataGaLocation":767},{"text":623,"config":971},{"href":625,"dataGaName":626,"dataGaLocation":767},{"text":973,"config":974},"Sustainability",{"href":975,"dataGaName":973,"dataGaLocation":767},"/sustainability/",{"text":977,"config":978},"Diversity, inclusion and belonging (DIB)",{"href":979,"dataGaName":980,"dataGaLocation":767},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":628,"config":982},{"href":630,"dataGaName":631,"dataGaLocation":767},{"text":638,"config":984},{"href":640,"dataGaName":641,"dataGaLocation":767},{"text":643,"config":986},{"href":645,"dataGaName":646,"dataGaLocation":767},{"text":988,"config":989},"Modern Slavery Transparency Statement",{"href":990,"dataGaName":991,"dataGaLocation":767},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":993},[994,997,1000],{"text":995,"config":996},"Terms",{"href":819,"dataGaName":820,"dataGaLocation":767},{"text":998,"config":999},"Cookies",{"dataGaName":829,"dataGaLocation":767,"id":830,"isOneTrustButton":159},{"text":1001,"config":1002},"Privacy",{"href":824,"dataGaName":825,"dataGaLocation":767},[1004],{"id":1005,"title":7,"body":303,"config":1006,"content":1008,"description":303,"extension":1012,"meta":1013,"navigation":159,"path":1014,"seo":1015,"stem":1016,"__hash__":1017},"blogAuthors/en-us/blog/authors/regnard-raquedan.yml",{"template":1007},"BlogAuthor",{"name":7,"config":1009},{"headshot":1010,"ctfId":1011},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663118/Blog/Author%20Headshots/regnard_raquedan_headshot.png","rraquedan","yml",{},"/en-us/blog/authors/regnard-raquedan",{},"en-us/blog/authors/regnard-raquedan","1JCF9gTeSA0OaLWrorCsz7_b5_2A2kagAMVhH8r4NcM",[1019,1027,1035],{"title":1020,"description":1021,"heroImage":1022,"category":299,"date":1023,"authors":1024,"slug":1026,"externalUrl":303},"How I built a demo generator with GitLab Duo Agent Platform","Demos haven't always looked like this. Looking back over my career, here's how they have evolved. Follow the tutorial to build your own demo and agent.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-08-13",[1025],"Itzik Gan Baruch","agentic-click-through-demo",{"title":1028,"description":1029,"heroImage":1030,"category":299,"date":1031,"authors":1032,"slug":1034,"externalUrl":303},"How to govern agentic AI, MCPs, and AI code assistants","AI agents can write, push, and deploy without human review at each step. Learn a practical framework for controlling access, permissions, and audit trails.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785337625/ifzlc2hyzaxhzmjgyymh.png","2026-07-31",[1033],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":1036,"description":1037,"heroImage":1038,"category":299,"date":1039,"authors":1040,"slug":1042,"externalUrl":303},"Claude Opus 5 on GitLab: Reasoning built for the hard tasks","Anthropic’s Claude Opus 5 is now available on GitLab Duo Agent Platform, delivering deeper reasoning without sacrificing speed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-07-27",[1041],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":1044},[1045,1058,1069,1081],{"id":1046,"categories":1047,"header":1048,"text":1049,"button":1050,"image":1055},"ai-modernization",[299],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1051,"config":1052},"Get your AI maturity score",{"href":1053,"dataGaName":1054,"dataGaLocation":532},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1056},{"src":1057},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1059,"categories":1060,"header":1061,"text":1049,"button":1062,"image":1066},"devops-modernization",[316,868],"Are you just managing tools or shipping innovation?",{"text":1063,"config":1064},"Get your DevOps maturity score",{"href":1065,"dataGaName":1054,"dataGaLocation":532},"/assessments/devops-modernization-assessment/",{"config":1067},{"src":1068},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1070,"categories":1071,"header":1073,"text":1049,"button":1074,"image":1078},"security-modernization",[1072],"security","Are you trading speed for security?",{"text":1075,"config":1076},"Get your security maturity score",{"href":1077,"dataGaName":1054,"dataGaLocation":532},"/assessments/security-modernization-assessment/",{"config":1079},{"src":1080},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1082,"paths":1083,"header":1086,"text":1087,"button":1088,"image":1093},"github-azure-migration",[1084,1085],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1089,"config":1090},"See how GitLab compares to GitHub",{"href":1091,"dataGaName":1092,"dataGaLocation":532},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1094},{"src":1068},{"header":1096,"blurb":1097,"button":1098,"secondaryButton":1103},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1099,"config":1100},"Get your free trial",{"href":1101,"dataGaName":331,"dataGaLocation":1102},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":805,"config":1104},{"href":657,"dataGaName":336,"dataGaLocation":1102},1786803775958]