[{"data":1,"prerenderedAt":1085},["ShallowReactive",2],{"/en-us/blog/categories/ai":3,"navigation-en-us":21,"banner-en-us":442,"footer-en-us":451,"ai-category-page-total-items-en-us":693,"ai-category-page-featured-en-us":694,"ai-category-page-10-en-us":1023},{"id":4,"title":5,"body":6,"category":6,"config":7,"content":11,"description":6,"extension":13,"meta":14,"navigation":15,"path":16,"seo":17,"slug":6,"stem":19,"testContent":6,"type":6,"__hash__":20},"blogCategories/en-us/blog/categories/ai.yml","Ai",null,{"template":8,"slug":9,"hide":10},"BlogCategory","ai",false,{"name":12},"AI","yml",{},true,"/en-us/blog/categories/ai",{"title":12,"description":18},"Browse articles related to AI on the GitLab Blog","en-us/blog/categories/ai","_mFb27wDITdukqW8E71tDTq_ZG9tW2x2RtwML1HudjI",{"logo":22,"freeTrial":27,"sales":32,"login":37,"items":42,"search":362,"minimal":393,"duo":412,"switchNav":421,"pricingDeployment":432},{"config":23},{"href":24,"dataGaName":25,"dataGaLocation":26},"/","gitlab logo","header",{"text":28,"config":29},"Get free trial",{"href":30,"dataGaName":31,"dataGaLocation":26},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":33,"config":34},"Talk to sales",{"href":35,"dataGaName":36,"dataGaLocation":26},"/sales/","sales",{"text":38,"config":39},"Sign in",{"href":40,"dataGaName":41,"dataGaLocation":26},"https://gitlab.com/users/sign_in/","sign in",[43,72,172,177,281,342],{"text":44,"config":45,"menu":47},"Platform",{"dataNavLevelOne":46},"platform",{"type":48,"columns":49},"cards",[50,56,64],{"title":44,"description":51,"link":52},"The intelligent orchestration platform for DevSecOps",{"text":53,"config":54},"Explore our Platform",{"href":55,"dataGaName":46,"dataGaLocation":26},"/platform/",{"title":57,"description":58,"link":59},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":60,"config":61},"Meet GitLab Duo",{"href":62,"dataGaName":63,"dataGaLocation":26},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":65,"description":66,"link":67},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":68,"config":69},"Learn more",{"href":70,"dataGaName":71,"dataGaLocation":26},"/why-gitlab/","why gitlab",{"text":73,"left":15,"config":74,"menu":76},"Product",{"dataNavLevelOne":75},"solutions",{"type":77,"link":78,"columns":82,"feature":151},"lists",{"text":79,"config":80},"View all Solutions",{"href":81,"dataGaName":75,"dataGaLocation":26},"/solutions/",[83,107,130],{"title":84,"description":85,"link":86,"items":91},"Automation","CI/CD and automation to accelerate deployment",{"config":87},{"icon":88,"href":89,"dataGaName":90,"dataGaLocation":26},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[92,96,99,103],{"text":93,"config":94},"CI/CD",{"href":95,"dataGaLocation":26,"dataGaName":93},"/solutions/continuous-integration/",{"text":57,"config":97},{"href":62,"dataGaLocation":26,"dataGaName":98},"gitlab duo agent platform - product menu",{"text":100,"config":101},"Source Code Management",{"href":102,"dataGaLocation":26,"dataGaName":100},"/solutions/source-code-management/",{"text":104,"config":105},"Automated Software Delivery",{"href":89,"dataGaLocation":26,"dataGaName":106},"Automated software delivery",{"title":108,"description":109,"link":110,"items":115},"Security","Deliver code faster without compromising security",{"config":111},{"href":112,"dataGaName":113,"dataGaLocation":26,"icon":114},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[116,120,125],{"text":117,"config":118},"Application Security Testing",{"href":112,"dataGaName":119,"dataGaLocation":26},"Application security testing",{"text":121,"config":122},"Software Supply Chain Security",{"href":123,"dataGaLocation":26,"dataGaName":124},"/solutions/supply-chain/","Software supply chain security",{"text":126,"config":127},"Software Compliance",{"href":128,"dataGaName":129,"dataGaLocation":26},"/solutions/software-compliance/","software compliance",{"title":131,"link":132,"items":137},"Measurement",{"config":133},{"icon":134,"href":135,"dataGaName":136,"dataGaLocation":26},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[138,142,146],{"text":139,"config":140},"Visibility & Measurement",{"href":135,"dataGaLocation":26,"dataGaName":141},"Visibility and Measurement",{"text":143,"config":144},"Value Stream Management",{"href":145,"dataGaLocation":26,"dataGaName":143},"/solutions/value-stream-management/",{"text":147,"config":148},"Analytics & Insights",{"href":149,"dataGaLocation":26,"dataGaName":150},"/solutions/analytics-and-insights/","Analytics and insights",{"title":152,"type":77,"items":153},"GitLab for",[154,160,166],{"text":155,"config":156},"Enterprise",{"icon":157,"href":158,"dataGaLocation":26,"dataGaName":159},"Building","/enterprise/","enterprise",{"text":161,"config":162},"Small Business",{"icon":163,"href":164,"dataGaLocation":26,"dataGaName":165},"Work","/small-business/","small business",{"text":167,"config":168},"Public Sector",{"icon":169,"href":170,"dataGaLocation":26,"dataGaName":171},"Organization","/solutions/public-sector/","public sector",{"text":173,"config":174},"Pricing",{"href":175,"dataGaName":176,"dataGaLocation":26,"dataNavLevelOne":176},"/pricing/","pricing",{"text":178,"config":179,"menu":181},"Resources",{"dataNavLevelOne":180},"resources",{"type":77,"link":182,"columns":186,"feature":270},{"text":183,"config":184},"View all resources",{"href":185,"dataGaName":180,"dataGaLocation":26},"/resources/",[187,220,242],{"title":188,"items":189},"Getting started",[190,195,200,205,210,215],{"text":191,"config":192},"Install",{"href":193,"dataGaName":194,"dataGaLocation":26},"/install/","install",{"text":196,"config":197},"Quick start guides",{"href":198,"dataGaName":199,"dataGaLocation":26},"/get-started/","quick setup checklists",{"text":201,"config":202},"Learn",{"href":203,"dataGaLocation":26,"dataGaName":204},"https://university.gitlab.com/","learn",{"text":206,"config":207},"Product documentation",{"href":208,"dataGaName":209,"dataGaLocation":26},"https://docs.gitlab.com/","product documentation",{"text":211,"config":212},"Best practice videos",{"href":213,"dataGaName":214,"dataGaLocation":26},"/getting-started-videos/","best practice videos",{"text":216,"config":217},"Integrations",{"href":218,"dataGaName":219,"dataGaLocation":26},"/integrations/","integrations",{"title":221,"items":222},"Discover",[223,228,233,237],{"text":224,"config":225},"Customer success stories",{"href":226,"dataGaName":227,"dataGaLocation":26},"/customers/","customer success stories",{"text":229,"config":230},"Blog",{"href":231,"dataGaName":232,"dataGaLocation":26},"/blog/","blog",{"text":234,"config":235},"The Source",{"href":236,"dataGaName":232,"dataGaLocation":26},"/the-source/",{"text":238,"config":239},"Remote",{"href":240,"dataGaName":241,"dataGaLocation":26},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":243,"items":244},"Connect",[245,250,255,260,265],{"text":246,"config":247},"GitLab Services",{"href":248,"dataGaName":249,"dataGaLocation":26},"/services/","services",{"text":251,"config":252},"Community",{"href":253,"dataGaName":254,"dataGaLocation":26},"/community/","community",{"text":256,"config":257},"Forum",{"href":258,"dataGaName":259,"dataGaLocation":26},"https://forum.gitlab.com/","forum",{"text":261,"config":262},"Events",{"href":263,"dataGaName":264,"dataGaLocation":26},"/events/","events",{"text":266,"config":267},"Partners",{"href":268,"dataGaName":269,"dataGaLocation":26},"/partners/","partners",{"config":271,"title":274,"text":275,"link":276},{"background":272,"textColor":273},"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":277,"config":278},"Read the latest",{"href":279,"dataGaName":280,"dataGaLocation":26},"/whats-new/","whats new",{"text":282,"config":283,"menu":285},"Company",{"dataNavLevelOne":284},"company",{"type":77,"columns":286},[287],{"items":288},[289,294,300,302,307,312,317,322,327,332,337],{"text":290,"config":291},"About",{"href":292,"dataGaName":293,"dataGaLocation":26},"/company/","about",{"text":295,"config":296,"footerGa":299},"Jobs",{"href":297,"dataGaName":298,"dataGaLocation":26},"/jobs/","jobs",{"dataGaName":298},{"text":261,"config":301},{"href":263,"dataGaName":264,"dataGaLocation":26},{"text":303,"config":304},"Leadership",{"href":305,"dataGaName":306,"dataGaLocation":26},"/company/team/e-group/","leadership",{"text":308,"config":309},"Team",{"href":310,"dataGaName":311,"dataGaLocation":26},"/company/team/","team",{"text":313,"config":314},"Handbook",{"href":315,"dataGaName":316,"dataGaLocation":26},"https://handbook.gitlab.com/","handbook",{"text":318,"config":319},"Investor relations",{"href":320,"dataGaName":321,"dataGaLocation":26},"https://ir.gitlab.com/","investor relations",{"text":323,"config":324},"Trust Center",{"href":325,"dataGaName":326,"dataGaLocation":26},"/security/","trust center",{"text":328,"config":329},"AI Transparency Center",{"href":330,"dataGaName":331,"dataGaLocation":26},"/ai-transparency-center/","ai transparency center",{"text":333,"config":334},"Newsletter",{"href":335,"dataGaName":336,"dataGaLocation":26},"/company/contact/#contact-forms","newsletter",{"text":338,"config":339},"Press",{"href":340,"dataGaName":341,"dataGaLocation":26},"/press/","press",{"text":343,"config":344,"menu":345},"Contact us",{"dataNavLevelOne":284},{"type":77,"columns":346},[347],{"items":348},[349,352,357],{"text":33,"config":350},{"href":35,"dataGaName":351,"dataGaLocation":26},"talk to sales",{"text":353,"config":354},"Support portal",{"href":355,"dataGaName":356,"dataGaLocation":26},"https://support.gitlab.com","support portal",{"text":358,"config":359},"Customer portal",{"href":360,"dataGaName":361,"dataGaLocation":26},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":363,"login":364,"suggestions":371},"Close",{"text":365,"link":366},"To search repositories and projects, login to",{"text":367,"config":368},"gitlab.com",{"href":40,"dataGaName":369,"dataGaLocation":370},"search login","search",{"text":372,"default":373},"Suggestions",[374,376,380,382,386,390],{"text":57,"config":375},{"href":62,"dataGaName":57,"dataGaLocation":370},{"text":377,"config":378},"Code Suggestions (AI)",{"href":379,"dataGaName":377,"dataGaLocation":370},"/solutions/code-suggestions/",{"text":93,"config":381},{"href":95,"dataGaName":93,"dataGaLocation":370},{"text":383,"config":384},"GitLab on AWS",{"href":385,"dataGaName":383,"dataGaLocation":370},"/partners/technology-partners/aws/",{"text":387,"config":388},"GitLab on Google Cloud",{"href":389,"dataGaName":387,"dataGaLocation":370},"/partners/technology-partners/google-cloud-platform/",{"text":391,"config":392},"Why GitLab?",{"href":70,"dataGaName":391,"dataGaLocation":370},{"freeTrial":394,"mobileIcon":399,"desktopIcon":404,"secondaryButton":407},{"text":395,"config":396},"Start free trial",{"href":397,"dataGaName":31,"dataGaLocation":398},"https://gitlab.com/-/trials/new/","nav",{"altText":400,"config":401},"Gitlab Icon",{"src":402,"dataGaName":403,"dataGaLocation":398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":400,"config":405},{"src":406,"dataGaName":403,"dataGaLocation":398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":408,"config":409},"Get Started",{"href":410,"dataGaName":411,"dataGaLocation":398},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":413,"mobileIcon":417,"desktopIcon":419},{"text":414,"config":415},"Learn more about GitLab Duo",{"href":62,"dataGaName":416,"dataGaLocation":398},"gitlab duo",{"altText":400,"config":418},{"src":402,"dataGaName":403,"dataGaLocation":398},{"altText":400,"config":420},{"src":406,"dataGaName":403,"dataGaLocation":398},{"button":422,"mobileIcon":427,"desktopIcon":429},{"text":423,"config":424},"/switch",{"href":425,"dataGaName":426,"dataGaLocation":398},"#contact","switch",{"altText":400,"config":428},{"src":402,"dataGaName":403,"dataGaLocation":398},{"altText":400,"config":430},{"src":431,"dataGaName":403,"dataGaLocation":398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":433,"mobileIcon":438,"desktopIcon":440},{"text":434,"config":435},"Back to pricing",{"href":175,"dataGaName":436,"dataGaLocation":398,"icon":437},"back to pricing","GoBack",{"altText":400,"config":439},{"src":402,"dataGaName":403,"dataGaLocation":398},{"altText":400,"config":441},{"src":406,"dataGaName":403,"dataGaLocation":398},{"title":443,"button":444,"config":449},"See how agentic AI transforms software delivery",{"text":445,"config":446},"Sign up for GitLab Transcend on June 10",{"href":447,"dataGaName":448,"dataGaLocation":26},"/events/transcend/virtual/","transcend event",{"layout":450,"disabled":10},"release",{"data":452},{"text":453,"source":454,"edit":460,"contribute":465,"config":470,"items":475,"minimal":682},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":455,"config":456},"View page source",{"href":457,"dataGaName":458,"dataGaLocation":459},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":461,"config":462},"Edit this page",{"href":463,"dataGaName":464,"dataGaLocation":459},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":466,"config":467},"Please contribute",{"href":468,"dataGaName":469,"dataGaLocation":459},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":471,"facebook":472,"youtube":473,"linkedin":474},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[476,523,577,621,648],{"title":173,"links":477,"subMenu":492},[478,482,487],{"text":479,"config":480},"View plans",{"href":175,"dataGaName":481,"dataGaLocation":459},"view plans",{"text":483,"config":484},"Why Premium?",{"href":485,"dataGaName":486,"dataGaLocation":459},"/pricing/premium/","why premium",{"text":488,"config":489},"Why Ultimate?",{"href":490,"dataGaName":491,"dataGaLocation":459},"/pricing/ultimate/","why ultimate",[493],{"title":494,"links":495},"Contact Us",[496,499,501,503,508,513,518],{"text":497,"config":498},"Contact sales",{"href":35,"dataGaName":36,"dataGaLocation":459},{"text":353,"config":500},{"href":355,"dataGaName":356,"dataGaLocation":459},{"text":358,"config":502},{"href":360,"dataGaName":361,"dataGaLocation":459},{"text":504,"config":505},"Status",{"href":506,"dataGaName":507,"dataGaLocation":459},"https://status.gitlab.com/","status",{"text":509,"config":510},"Terms of use",{"href":511,"dataGaName":512,"dataGaLocation":459},"/terms/","terms of use",{"text":514,"config":515},"Privacy statement",{"href":516,"dataGaName":517,"dataGaLocation":459},"/privacy/","privacy statement",{"text":519,"config":520},"Cookie preferences",{"dataGaName":521,"dataGaLocation":459,"id":522,"isOneTrustButton":15},"cookie preferences","ot-sdk-btn",{"title":73,"links":524,"subMenu":533},[525,529],{"text":526,"config":527},"DevSecOps platform",{"href":55,"dataGaName":528,"dataGaLocation":459},"devsecops platform",{"text":530,"config":531},"AI-Assisted Development",{"href":62,"dataGaName":532,"dataGaLocation":459},"ai-assisted development",[534],{"title":535,"links":536},"Topics",[537,542,547,552,557,562,567,572],{"text":538,"config":539},"CICD",{"href":540,"dataGaName":541,"dataGaLocation":459},"/topics/ci-cd/","cicd",{"text":543,"config":544},"GitOps",{"href":545,"dataGaName":546,"dataGaLocation":459},"/topics/gitops/","gitops",{"text":548,"config":549},"DevOps",{"href":550,"dataGaName":551,"dataGaLocation":459},"/topics/devops/","devops",{"text":553,"config":554},"Version Control",{"href":555,"dataGaName":556,"dataGaLocation":459},"/topics/version-control/","version control",{"text":558,"config":559},"DevSecOps",{"href":560,"dataGaName":561,"dataGaLocation":459},"/topics/devsecops/","devsecops",{"text":563,"config":564},"Cloud Native",{"href":565,"dataGaName":566,"dataGaLocation":459},"/topics/cloud-native/","cloud native",{"text":568,"config":569},"AI for Coding",{"href":570,"dataGaName":571,"dataGaLocation":459},"/topics/devops/ai-for-coding/","ai for coding",{"text":573,"config":574},"Agentic AI",{"href":575,"dataGaName":576,"dataGaLocation":459},"/topics/agentic-ai/","agentic ai",{"title":578,"links":579},"Solutions",[580,582,584,589,593,596,600,603,605,608,611,616],{"text":117,"config":581},{"href":112,"dataGaName":117,"dataGaLocation":459},{"text":106,"config":583},{"href":89,"dataGaName":90,"dataGaLocation":459},{"text":585,"config":586},"Agile development",{"href":587,"dataGaName":588,"dataGaLocation":459},"/solutions/agile-delivery/","agile delivery",{"text":590,"config":591},"SCM",{"href":102,"dataGaName":592,"dataGaLocation":459},"source code management",{"text":538,"config":594},{"href":95,"dataGaName":595,"dataGaLocation":459},"continuous integration & delivery",{"text":597,"config":598},"Value stream management",{"href":145,"dataGaName":599,"dataGaLocation":459},"value stream management",{"text":543,"config":601},{"href":602,"dataGaName":546,"dataGaLocation":459},"/solutions/gitops/",{"text":155,"config":604},{"href":158,"dataGaName":159,"dataGaLocation":459},{"text":606,"config":607},"Small business",{"href":164,"dataGaName":165,"dataGaLocation":459},{"text":609,"config":610},"Public sector",{"href":170,"dataGaName":171,"dataGaLocation":459},{"text":612,"config":613},"Education",{"href":614,"dataGaName":615,"dataGaLocation":459},"/solutions/education/","education",{"text":617,"config":618},"Financial services",{"href":619,"dataGaName":620,"dataGaLocation":459},"/solutions/finance/","financial services",{"title":178,"links":622},[623,625,627,629,632,634,636,638,640,642,644,646],{"text":191,"config":624},{"href":193,"dataGaName":194,"dataGaLocation":459},{"text":196,"config":626},{"href":198,"dataGaName":199,"dataGaLocation":459},{"text":201,"config":628},{"href":203,"dataGaName":204,"dataGaLocation":459},{"text":206,"config":630},{"href":208,"dataGaName":631,"dataGaLocation":459},"docs",{"text":229,"config":633},{"href":231,"dataGaName":232,"dataGaLocation":459},{"text":224,"config":635},{"href":226,"dataGaName":227,"dataGaLocation":459},{"text":238,"config":637},{"href":240,"dataGaName":241,"dataGaLocation":459},{"text":246,"config":639},{"href":248,"dataGaName":249,"dataGaLocation":459},{"text":251,"config":641},{"href":253,"dataGaName":254,"dataGaLocation":459},{"text":256,"config":643},{"href":258,"dataGaName":259,"dataGaLocation":459},{"text":261,"config":645},{"href":263,"dataGaName":264,"dataGaLocation":459},{"text":266,"config":647},{"href":268,"dataGaName":269,"dataGaLocation":459},{"title":282,"links":649},[650,652,654,656,658,660,662,666,671,673,675,677],{"text":290,"config":651},{"href":292,"dataGaName":284,"dataGaLocation":459},{"text":295,"config":653},{"href":297,"dataGaName":298,"dataGaLocation":459},{"text":303,"config":655},{"href":305,"dataGaName":306,"dataGaLocation":459},{"text":308,"config":657},{"href":310,"dataGaName":311,"dataGaLocation":459},{"text":313,"config":659},{"href":315,"dataGaName":316,"dataGaLocation":459},{"text":318,"config":661},{"href":320,"dataGaName":321,"dataGaLocation":459},{"text":663,"config":664},"Sustainability",{"href":665,"dataGaName":663,"dataGaLocation":459},"/sustainability/",{"text":667,"config":668},"Diversity, inclusion and belonging (DIB)",{"href":669,"dataGaName":670,"dataGaLocation":459},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":323,"config":672},{"href":325,"dataGaName":326,"dataGaLocation":459},{"text":333,"config":674},{"href":335,"dataGaName":336,"dataGaLocation":459},{"text":338,"config":676},{"href":340,"dataGaName":341,"dataGaLocation":459},{"text":678,"config":679},"Modern Slavery Transparency Statement",{"href":680,"dataGaName":681,"dataGaLocation":459},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":683},[684,687,690],{"text":685,"config":686},"Terms",{"href":511,"dataGaName":512,"dataGaLocation":459},{"text":688,"config":689},"Cookies",{"dataGaName":521,"dataGaLocation":459,"id":522,"isOneTrustButton":15},{"text":691,"config":692},"Privacy",{"href":516,"dataGaName":517,"dataGaLocation":459},149,{"id":695,"title":696,"authors":697,"body":699,"category":9,"date":1006,"description":1007,"extension":1008,"externalUrl":6,"featured":10,"heroImage":1009,"meta":1010,"navigation":15,"path":1011,"seo":1012,"slug":1015,"stem":1016,"tags":1017,"template":1021,"updatedDate":6,"__hash__":1022},"blogPosts/en-us/blog/automate-deployment-with-duo-agent-platform.md","Automate deployment processes using a custom agent in GitLab Duo Agent Platform",[698],"Cesar Saavedra",{"type":700,"value":701,"toc":991},"minimark",[702,706,713,716,728,731,736,739,744,764,773,776,780,791,794,797,801,808,843,854,858,872,883,903,907,919,922,931,935,948,962,966,969,972,976,979],[703,704,705],"p",{},"Every engineering organization has those tasks: complex, repetitive, and time-consuming, but absolutely critical to get right. Onboarding a new microservice into an established GitOps deployment workflow is a perfect example. It involves generating bespoke manifests, updating delivery pipelines, configuring image automation, and making sure every piece references the right namespaces, ports, and hostnames. If you miss a step, the deployment breaks. Do it manually and you can lose hours, sometimes a whole day, to a setup that follows the same pattern every time.",[703,707,708,709,712],{},"This is an example of the kind of work AI agents were built for. With ",[710,711,57],"a",{"href":62},", you can create a custom agent that understands your specific application, your specific GitOps workflow, and your specific conventions, and then performs that complex onboarding for you. Better still, the agent itself, along with all the artifacts it generates, is versioned, managed, and governed by GitLab, so you get the speed of automation without giving up enterprise control.",[703,714,715],{},"In this tutorial, you'll learn how to build one of these custom agents from scratch, from generating the system prompt to seeing the new microservice running on a Kubernetes cluster. You can follow along with the content below.",[717,718,721,722],"figure",{"className":719},[720],"video_container","\n  ",[723,724],"iframe",{"src":725,"frameBorder":726,"allowFullScreen":727},"https://www.youtube.com/embed/PpfT40mqr4A?si=CcgUwQr090FYCT3-","0","true",[729,730],"br",{},[732,733,735],"h2",{"id":734},"use-case-onboarding-a-microservice-for-tanukibank","Use case: Onboarding a microservice for TanukiBank",[703,737,738],{},"To make this concrete, we'll work with a fictitious bank called TanukiBank. The bank's web application offers checking accounts, savings accounts, home loans, mortgage and auto loan calculators, and a Pay & Transfer page. The Pay & Transfer page has a Quick Transfer panel, with a goal to allow users to transfer money from one account to another. This panel currently is not implemented so nothing happens when clicking the Transfer button because its underlying microservice doesn't exist yet. Our job is to build that microservice and onboard it into TanukiBank's existing GitOps workflow using a custom agent.",[740,741,743],"h3",{"id":742},"the-application-and-the-gitops-process","The application and the GitOps process",[703,745,746,751,752,755,756,759,760,763],{},[710,747,750],{"href":748,"rel":749},"https://gitlab.com/gitlab-da/projects/tanukibank",[],"TanukiBank's code lives in a GitLab group"," with a ",[753,754,249],"code",{}," subgroup that holds each microservice (home mortgage calculator, auto loan calculator, and so on), plus two top-level projects, ",[753,757,758],{},"Tanuki Bank - Delivery"," and ",[753,761,762],{},"Flux Config",", that handle the deployment to a Kubernetes cluster.",[703,765,766,767,769,770,772],{},"The GitOps workflow itself works like this: Every microservice has a pipeline that builds a container image and pushes it to its built-in container registry. The Flux Image Automation Controller, running on the Kubernetes cluster, watches those registries for changes and, when it detects one, updates the corresponding manifest in the ",[753,768,758],{}," project. That triggers a delivery pipeline which builds and signs a new container image and stores it in the delivery project's registry. Finally, the Flux CD Controller keeps the running pods in the Kubernetes cluster in sync with the delivery project’s container registry across each environment. All Flux manifests live in the ",[753,771,762],{}," project.",[703,774,775],{},"This is a clean workflow, but onboarding any new microservice means touching all of those moving parts in exactly the right way. So, creating a custom agent to do the onboarding for us would make our lives much easier!",[740,777,779],{"id":778},"generating-the-system-prompt","Generating the system prompt",[703,781,782,783,790],{},"A custom agent is only as good as its system prompt, so rather than writing one from scratch, we let GitLab Duo do the heavy lifting. From the ",[710,784,786,789],{"href":748,"rel":785},[],[753,787,788],{},"tanukibank"," group",", we open GitLab Agentic Chat and ask it to study the group, its subgroups, and their contents, and then draft a system prompt for an agent that can onboard new microservices. We are basically asking Duo to thoroughly understand and learn about the well-established GitOps workflow of this application. That way, Duo can create a system prompt that captures enough detail to automate the onboarding of a new microservice into this application’s GitOps workflow.",[703,792,793],{},"GitLab Duo ingests the files, reads the manifests and config files, examines the Dockerfiles, maps out dependencies, and then produces a thorough system prompt complete with reporting instructions, rules to follow, and recommended tools to enable. We save this output for the next step.",[703,795,796],{},"Something important to note is that the system prompt generated by GitLab Duo is specific to this application’s GitOps workflow at this moment. If, in the future, the GitOps workflow for this application were to change, then this system prompt would need to be re-generated by rerunning this step.",[740,798,800],{"id":799},"creating-the-custom-agent","Creating the custom agent",[703,802,803,804,807],{},"Next, we create a new blank project called ",[753,805,806],{},"application-agents",". This project will manage our custom agents, including who can administer them and where they can run. Follow these steps:",[809,810,811,823,834,837,840],"ol",{},[812,813,814,815,818,819,822],"li",{},"From ",[753,816,817],{},"AI > Agents",", we select the ",[753,820,821],{},"Managed"," tab.",[812,824,825,826,829,830,833],{},"Click on the ",[753,827,828],{},"New agent"," button to create a new agent named ",[753,831,832],{},"TanukiBank Microservice Onboarder",", give it a short description, and make it public.",[812,835,836],{},"We select the tools recommended by GitLab Duo.",[812,838,839],{},"Paste in the generated system prompt.",[812,841,842],{},"Create the agent.",[703,844,845,846,759,848,850,851,853],{},"Once the agent is created, we enable the agent in both projects that drive the GitOps workflow: ",[753,847,758],{},[753,849,762],{},". Opening the Agentic Chat panel in each and confirming that ",[753,852,832],{}," appears in the agent dropdown verifies the setup.",[740,855,857],{"id":856},"creating-a-new-microservice-with-the-developer-flow","Creating a new microservice with the Developer flow",[703,859,860,861,863,864,867,868,871],{},"Before testing the agent, we need an actual microservice to onboard. So, let’s create a new one. We head to the ",[753,862,249],{}," group, create a new project called ",[753,865,866],{},"intra-account-transfers",", and put the GitLab Duo Agent Platform's ",[753,869,870],{},"Developer"," foundational flow to work.",[703,873,874,875,878,879,882],{},"We open a new issue in the project and in its description, we list a series of specifications for the microservice. We then click the ",[753,876,877],{},"Generate MR with Duo"," button, which launches the Developer flow. The agent reads the spec, implements the microservice, creates a branch and a merge request, and links the MR back to the issue. After verifying the implementation works locally with a quick ",[753,880,881],{},"curl"," command, we merge the MR. The pipeline runs and pushes the new container images to the project's registry.",[703,884,885,886,889,890,892,893,895,896,899,900,902],{},"At this point, the new microservice exists, but the broader GitOps workflow has no idea about it. The ",[753,887,888],{},"manifests/dev"," directory in the ",[753,891,758],{}," project contains nothing for ",[753,894,866],{},", the delivery pipeline doesn't reference it, and the ",[753,897,898],{},"image-update-automation.yaml"," file in the ",[753,901,762],{}," project has no entries for the new microservice.",[740,904,906],{"id":905},"using-the-custom-agent","Using the custom agent",[703,908,909,910,912,913,915,916,918],{},"After enabling our ",[753,911,832],{}," in the newly created ",[753,914,866],{}," project, we go to ",[753,917,758],{},", open the Agentic Chat panel, select our custom agent from the agent dropdown, and ask it to onboard the new service, providing the service name and hostname.",[703,920,921],{},"The agent gets to work. It locates and reads the new microservice's Dockerfile to determine its port, generates the appropriate manifests, and updates the relevant pipelines. Along the way, it asks for approval before creating commits and merge requests, which we grant.",[703,923,924,925,927,928,930],{},"Then the agent opens two MRs, one in ",[753,926,758],{}," and one in ",[753,929,762],{},", and finishes with a summary of everything it did, including links to the MRs, service details, files created and modified, and recommended next steps.",[740,932,934],{"id":933},"the-results","The results",[703,936,937,938,940,941,943,944,947],{},"We review the changes in both MRs, merge the ",[753,939,762],{}," MR first to update the Flux components, then merge the ",[753,942,758],{}," MR. To verify the deployment, we create a new environment in GitLab named ",[753,945,946],{},"intra-account-transfers-dev"," connected to the Kubernetes cluster, select the appropriate namespace and Flux resource, and save.",[703,949,950,951,954,955,957,958,961],{},"The environment view shows the freshly started pods, and a ",[753,952,953],{},"kubectl"," listing in a terminal confirms three new pods are running. A final ",[753,956,881],{}," against the public hostname ",[753,959,960],{},"itransfers2.ocpgitlab.com"," returns the correct response. The microservice is live, and the onboarding that could potentially consume hours of careful manual work took minutes.",[732,963,965],{"id":964},"benefits","Benefits",[703,967,968],{},"Building a custom agent on top of the GitLab Duo Agent Platform delivers value on multiple fronts. It compresses complex, multi-project setup work into minutes, freeing engineers to focus on higher-value problems. It captures organizational knowledge and context, your specific GitOps conventions, naming patterns, and pipeline structures, into a reusable asset that any authorized team member can invoke.",[703,970,971],{},"Because the agent is defined in a managed project, its access, visibility, and scope are controlled the same way you control any other GitLab resource, which keeps platform teams comfortable. And every artifact the agent creates, every manifest, every commit, every MR, lives in GitLab, fully versioned and auditable. You get the speed of AI automation without sacrificing the governance and traceability your enterprise requires.",[732,973,975],{"id":974},"build-a-custom-agent-today","Build a custom agent today",[703,977,978],{},"Onboarding new services into a mature GitOps workflow is a good example of the kind of task that's complex enough to demand careful attention but repetitive enough to be a drain on engineering time. A custom agent built on the GitLab Duo Agent Platform changes that calculus: It understands your application and organizational context, follows your conventions, and produces consistent, reviewable changes, all while remaining versioned, governed, and secure inside GitLab.",[703,980,981,982,985,986,990],{},"You can ",[710,983,984],{"href":62},"try GitLab Duo Agent Platform"," as part of a free trial of GitLab Ultimate today! Or, if you already have access to GitLab Duo Agent Platform, learn more about it with our ",[710,987,989],{"href":988},"/blog/gitlab-duo-agent-platform-complete-getting-started-guide/","Get Started guide",".",{"title":992,"searchDepth":993,"depth":993,"links":994},"",2,[995,1004,1005],{"id":734,"depth":993,"text":735,"children":996},[997,999,1000,1001,1002,1003],{"id":742,"depth":998,"text":743},3,{"id":778,"depth":998,"text":779},{"id":799,"depth":998,"text":800},{"id":856,"depth":998,"text":857},{"id":905,"depth":998,"text":906},{"id":933,"depth":998,"text":934},{"id":964,"depth":993,"text":965},{"id":974,"depth":993,"text":975},"2026-05-07","Custom AI agents automate complex, repetitive GitOps work in minutes, while remaining versioned, governed, and secured within enterprise guardrails.","md","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773856365/gsx2c0vqlswox3ldmq88.jpg",{},"/en-us/blog/automate-deployment-with-duo-agent-platform",{"config":1013,"title":1014,"description":1007},{"noIndex":10},"Automate deployment processes with GitLab Duo Agent Platform","automate-deployment-with-duo-agent-platform","en-us/blog/automate-deployment-with-duo-agent-platform",[12,1018,1019,1020],"product","features","tutorial","BlogPost","6mX81eSF-cvZq8QXp7M9C4PMCnqEHAQrPBD7qSBUlqo",[1024,1031,1037,1044,1051,1058,1065,1072,1079],{"title":1025,"heroImage":1026,"category":9,"description":1027,"authors":1028,"slug":1030,"externalUrl":6},"GitLab Duo Enterprise is now available","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665660/Blog/Hero%20Images/Untitled__1800_x_945_px_.png","Organizations have an end-to-end AI partner for faster, more secure software development. Learn how GitLab Duo Enterprise supports the entire DevSecOps lifecycle.",[1029],"David DeSanto, Chief Product Officer, GitLab","gitlab-duo-enterprise-is-now-available",{"title":1032,"heroImage":1033,"category":9,"description":1034,"authors":1035,"slug":1036,"externalUrl":6},"5 videos and interactive tours to learn GitLab Duo fast","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659856/Blog/Hero%20Images/blog-hero-banner-1-0178-820x470-fy25.png","Get to know GitLab Duo's capabilities and benefits, and use these visual learning tools to understand how to incorporate AI throughout your software development lifecycle.\n",[698],"5-videos-and-interactive-tours-to-learn-gitlab-duo-fast",{"title":1038,"heroImage":1039,"category":9,"description":1040,"authors":1041,"slug":1043,"externalUrl":6},"Refactor code into modern languages with AI-powered GitLab Duo ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png","This detailed tutorial helps developers use AI to modernize code by switching to a new programming language and gain knowledge about new features in the same language.",[1042],"Michael Friedrich","refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",{"title":1045,"heroImage":1046,"category":9,"description":1047,"authors":1048,"slug":1050,"externalUrl":6},"GitLab named a Leader in 2024 Gartner Magic Quadrant for AI Code Assistants","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664458/Blog/Hero%20Images/Gartner_AI_Code_Assistants_Blog_Post_Cover_Image_1800x945.png","In the first Gartner® Magic Quadrant™ for this category, GitLab is recognized for its ability to execute and completeness of vision in AI code assistant technology.",[1049],"Dave Steer","gitlab-named-a-leader-in-2024-gartner-magic-quadrant-for-ai-code-assistants",{"title":1052,"heroImage":1053,"category":9,"description":1054,"authors":1055,"slug":1057,"externalUrl":6},"Mastering GitLab admin tasks with GitLab Duo Chat","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666405/Blog/Hero%20Images/GitLab_Duo_Blog_Hero_1800x945_r2_B__1_.png","Learn how to use Chat to streamline administrative tasks on self-managed instances, improving efficiency and problem-solving capabilities.",[1056],"David O'Regan","mastering-gitlab-admin-tasks-with-gitlab-duo-chat",{"title":1059,"heroImage":1060,"category":9,"description":1061,"authors":1062,"slug":1064,"externalUrl":6},"Use GitLab AI features out-of-the-box in a GitLab Workspace","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098843/Blog/Hero%20Images/Blog/Hero%20Images/securitylifecycle-light_securitylifecycle-light.png_1750098843047.png","GitLab Workspaces now ships with the GitLab workflow extension preinstalled, providing access to powerful AI features like GitLab Duo Chat and Code Suggestions for increased productivity.",[1063],"Safwan Ahmed","use-gitlab-ai-features-out-of-the-box-in-a-gitlab-workspace",{"title":1066,"heroImage":1067,"category":9,"description":1068,"authors":1069,"slug":1071,"externalUrl":6},"Developing GitLab Duo: Use AI to remediate security vulnerabilities ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098106/Blog/Hero%20Images/Blog/Hero%20Images/blog-hero-banner-1-0178-820x470-fy25_7JlF3WlEkswGQbcTe8DOTB_1750098106040.png","This tutorial shows how GitLab Duo Vulnerability Explanation and GitLab Duo Vulnerability Resolution, along with our other AI-powered features, can help to address vulnerabilities quickly.",[1042,1070],"Alana Bellucci","developing-gitlab-duo-use-ai-to-remediate-security-vulnerabilities",{"title":1073,"heroImage":1074,"category":9,"description":1075,"authors":1076,"slug":1078,"externalUrl":6},"Developing GitLab Duo: A roundup of recent Chat enhancements","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098374/Blog/Hero%20Images/Blog/Hero%20Images/blog-hero-banner-1-0178-820x470-fy25_7JlF3WlEkswGQbcTe8DOTB_1750098374059.png","Discover the latest improvements to GitLab Duo Chat, including a new integration, prompt cancellation, and architectural upgrades.",[1077,1056],"Jannik Lehmann","developing-gitlab-duo-a-roundup-of-recent-chat-enhancements",{"title":1080,"heroImage":1081,"category":9,"description":1082,"authors":1083,"slug":1084,"externalUrl":6},"Meet GitLab Duo Workflow - the future of AI-driven development","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749658912/Blog/Hero%20Images/blog-image-template-1800x945__20_.png","Workflow, our autonomous AI agent, will transform the way teams build and ship software – our first bold step towards AI-driven DevSecOps.",[1029],"meet-gitlab-duo-workflow-the-future-of-ai-driven-development",1778622499991]