[{"data":1,"prerenderedAt":1696},["ShallowReactive",2],{"/blog/accelerate-learning-with-gitlab-duo-agent-platform":3,"navigation-en-us":913,"banner-en-us":1339,"footer-en-us":1350,"blog-post-authors-en-us-Halil Coban":1595,"blog-related-posts-en-us-accelerate-learning-with-gitlab-duo-agent-platform":1610,"blog-promotions-en-us":1635,"next-steps-en-us":1686},{"id":4,"title":5,"authors":6,"body":8,"category":896,"date":897,"description":898,"extension":899,"externalUrl":900,"faq":900,"featured":202,"heroImage":901,"meta":902,"navigation":202,"path":903,"seo":904,"slug":905,"stem":906,"tags":907,"template":911,"updatedDate":900,"__hash__":912},"blogPosts/en-us/blog/accelerate-learning-with-gitlab-duo-agent-platform.md","Accelerate learning with GitLab Duo Agent Platform",[7],"Halil Coban",{"type":9,"value":10,"toc":888},"minimark",[11,15,25,34,37,48,52,57,60,63,66,69,72,88,91,95,98,105,111,114,118,121,124,138,141,145,148,757,760,792,795,799,802,834,842,851,855,884],[12,13,14],"p",{},"At GitLab, we continue to expand our AI capabilities so I often find myself learning and working in new codebases. Whether I'm debugging issues, implementing new features, or onboarding to different projects, understanding system architecture quickly is crucial. But let's be honest — manually tracing through complex communication flows, especially gRPC connections, can eat up hours of productive development time.",[12,16,17,18,24],{},"This is exactly the type of tedious, yet necessary, work ",[19,20,23],"a",{"href":21,"rel":22},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-what-is-next-for-intelligent-devsecops/",[],"GitLab Duo Agent Platform"," is designed to handle. Instead of replacing developers, it amplifies our capabilities by automating routine tasks so we can focus on creative problem solving and strategic technical work.",[12,26,27,28,33],{},"Let me show you how I used ",[19,29,32],{"href":30,"rel":31},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"Duo Agent Platform"," to generate comprehensive documentation for a Golang project's gRPC communication flow — and how it transformed hours of code analysis into a few minutes of guided interaction.",[12,35,36],{},"You can follow along with this video:",[38,39,40],"div",{},[41,42],"iframe",{"src":43,"frameBorder":44,"allow":45,"style":46,"title":47},"https://player.vimeo.com/video/1098569263?badge=0&autopause=0&player_id=0&app_id=58479","0","autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share","position:absolute;top:0;left:0;width:100%;height:100%;","AI Agent Generates Complete gRPC Documentation in Minutes | GitLab Duo Agent Platform Demo",[49,50],"script",{"src":51},"https://player.vimeo.com/api/player.js",[53,54,56],"h2",{"id":55},"the-challenge-understanding-grpc-communication-flows","The challenge: Understanding gRPC communication flows",[12,58,59],{},"I was working with a project called \"Duo Workflow Executor\" that communicates with a gRPC server. Rather than spending my afternoon manually tracing through the codebase to understand the communication patterns, I decided to let Duo Agent Platform handle the heavy lifting.",[12,61,62],{},"My goal was simple: generate a clear diagram showing how the gRPC communication works, including what payloads are received, what actions are executed, and what responses are sent back.",[12,64,65],{},"Working in VS Code with the GitLab Workflow extension installed, I opened the project and crafted a specific prompt for Duo Agent Platform:",[12,67,68],{},"\"Can you prepare a mermaid diagram that shows the gRPC connection between duo-workflow-service and this project. It should show what this project receives in gRPC payload, and what actions it executes based on the payload, and what it sends back. Study internal/services/runner/runner.go, especially the Run method, and write the mermaid output to a grpc.md file.\"",[12,70,71],{},"Duo Agent Platform didn't just blindly execute my request — it began intelligently gathering context to create a comprehensive execution plan. The platform automatically:",[73,74,75,79,82,85],"ul",{},[76,77,78],"li",{},"Searched through relevant Go files in the project",[76,80,81],{},"Read the specific file I mentioned (runner.go)",[76,83,84],{},"Identified additional files that would provide necessary context",[76,86,87],{},"Analyzed the codebase structure to understand the gRPC implementation",[12,89,90],{},"This contextual awareness is what sets agentic AI tools with great context apart from simple code generation tools. Instead of working in isolation, Duo Agent Platform understands the relationships between different components of your project.",[53,92,94],{"id":93},"collaborative-refinement","Collaborative refinement",[12,96,97],{},"Rather than making assumptions, Duo Agent Platform is designed to keep a human in the loop at critical moments in task execution to deliver better results. In this scenario, the platform paused to ask clarifying questions about the level of detail I wanted.",[12,99,100,104],{},[101,102,103],"strong",{},"Agent:"," \"Should I include error handling details in the diagram?\"",[12,106,107,110],{},[101,108,109],{},"Me:"," \"Don't focus on error handling. Include all actions. Focus on gRPC payload.\"",[12,112,113],{},"This back-and-forth refinement is crucial. The agent isn't just executing commands — it's working with me to ensure the deliverable meets my specific requirements.",[53,115,117],{"id":116},"execution-and-results","Execution and results",[12,119,120],{},"With the clarified requirements, Duo Agent Platform finalized its execution plan and requested confirmation before proceeding. I could have modified the approach at this stage, but the plan was perfectly aligned with what I needed.",[12,122,123],{},"The agent then executed each task in sequence, providing real-time progress updates. Within minutes, it had:",[73,125,126,129,132,135],{},[76,127,128],{},"Analyzed all relevant files across the project",[76,130,131],{},"Created comprehensive documentation with a detailed mermaid diagram",[76,133,134],{},"Saved everything to the requested grpc.md file",[76,136,137],{},"Included valuable context about outgoing payloads and connection management",[12,139,140],{},"The resulting documentation wasn't just a basic diagram — it was thorough, accurate, and immediately useful for understanding the system architecture.",[53,142,144],{"id":143},"reviewing-the-output","Reviewing the output",[12,146,147],{},"Here's the actual mermaid diagram that Duo Agent Platform created, showing the complete gRPC communication flow:",[149,150,155],"pre",{"className":151,"code":152,"language":153,"meta":154,"style":154},"language-mermaid shiki shiki-themes github-light","sequenceDiagram\nparticipant DWS as duo-workflow-service\nparticipant DWE as duo-workflow-executor\nparticipant Runner as ExecutionRunner\nparticipant ActionExecutor as Action Executor\nparticipant FileSystem as File System/Commands\n\n\nNote over DWS, DWE: gRPC Bidirectional Streaming (ExecuteWorkflow)\n\n%% Connection Establishment\nDWE->>DWS: gRPC Connection with Headers\nNote over DWE, DWS: Headers: authorization (Bearer token)\u003Cbr/>x-gitlab-authentication-type: oidc\u003Cbr/>x-gitlab-realm, x-gitlab-global-user-id\u003Cbr/>x-gitlab-oauth-token, x-gitlab-base-url\u003Cbr/>x-gitlab-instance-id, x-request-id\u003Cbr/>x-gitlab-namespace-id, x-gitlab-project-id\n\n\n%% Workflow Start Request\nDWE->>DWS: ClientEvent{StartWorkflowRequest}\nNote over DWE, DWS: StartWorkflowRequest:\u003Cbr/>- ClientVersion\u003Cbr/>- WorkflowDefinition\u003Cbr/>- Goal\u003Cbr/>- WorkflowID\u003Cbr/>- WorkflowMetadata\u003Cbr/>- ClientCapabilities[]\n\n\n%% Action Processing Loop\nloop Action Processing\nDWS->>DWE: Action Message\nNote over DWS, DWE: Action Types:\u003Cbr/>- Action_RunCommand {program, flags[], arguments[]}\u003Cbr/>- Action_RunGitCommand {command, arguments[], repositoryUrl}\u003Cbr/>- Action_RunReadFile {filepath}\u003Cbr/>- Action_RunWriteFile {filepath, contents}\u003Cbr/>- Action_RunEditFile {filepath, oldString, newString}\u003Cbr/>- Action_RunHTTPRequest {method, path, body}\u003Cbr/>- Action_ListDirectory {directory}\u003Cbr/>- Action_FindFiles {namePattern}\u003Cbr/>- Action_Grep {searchDirectory, pattern, caseInsensitive}\u003Cbr/>- Action_NewCheckpoint {}\u003Cbr/>- Action_RunMCPTool {}\n\n\nDWE->>Runner: Receive Action\nRunner->>Runner: processWorkflowActions()\nRunner->>ActionExecutor: executeAction(ctx, action)\n\nalt Action_RunCommand\n    ActionExecutor->>FileSystem: Execute Shell Command\n    Note over ActionExecutor, FileSystem: Executes: program + flags + arguments\u003Cbr/>in basePath directory\n    FileSystem-->>ActionExecutor: Command Output + Exit Code\n\nelse Action_RunReadFile\n    ActionExecutor->>FileSystem: Read File\n    Note over ActionExecutor, FileSystem: Check gitignore rules\u003Cbr/>Read file contents\n    FileSystem-->>ActionExecutor: File Contents\n\nelse Action_RunWriteFile\n    ActionExecutor->>FileSystem: Write File\n    Note over ActionExecutor, FileSystem: Check gitignore rules\u003Cbr/>Create/overwrite file\n    FileSystem-->>ActionExecutor: Success/Error Message\n\nelse Action_RunEditFile\n    ActionExecutor->>FileSystem: Edit File\n    Note over ActionExecutor, FileSystem: Read → Replace oldString with newString → Write\u003Cbr/>Check gitignore rules\n    FileSystem-->>ActionExecutor: Edit Result Message\n\nelse Action_RunGitCommand\n    ActionExecutor->>FileSystem: Execute Git Command \n    Note over ActionExecutor, FileSystem: Git operations with authentication\u003Cbr/>Uses provided git config\n    FileSystem-->>ActionExecutor: Git Command Output\n\nelse Action_RunHTTPRequest\n    ActionExecutor->>DWS: HTTP Request to GitLab API\n    Note over ActionExecutor, DWS: Method: GET/POST/PUT/DELETE\u003Cbr/>Path: API endpoint\u003Cbr/>Body: Request payload\u003Cbr/>Headers: Authorization\n    DWS-->>ActionExecutor: HTTP Response\n\nelse Action_ListDirectory\n    ActionExecutor->>FileSystem: List Directory Contents\n    Note over ActionExecutor, FileSystem: Respect gitignore rules\n    FileSystem-->>ActionExecutor: Directory Listing\n\nelse Action_FindFiles\n    ActionExecutor->>FileSystem: Find Files by Pattern\n    Note over ActionExecutor, FileSystem: Recursive search with name pattern\u003Cbr/>Respect gitignore rules\n    FileSystem-->>ActionExecutor: File Paths List\n\nelse Action_Grep\n    ActionExecutor->>FileSystem: Search Text Pattern\n    Note over ActionExecutor, FileSystem: Recursive text search\u003Cbr/>Case sensitive/insensitive option\n    FileSystem-->>ActionExecutor: Search Results\n\nelse Action_NewCheckpoint/Action_RunMCPTool\n    ActionExecutor->>ActionExecutor: No-op Action\n    Note over ActionExecutor: Returns empty success result\nend\n\n\nActionExecutor-->>Runner: Action Result (string)\n\nalt Result Size Check\n    Runner->>Runner: Check if result > 4MB\n    Note over Runner: If result exceeds MaxMessageSize (4MB)\u003Cbr/>Replace with error message about size limit\nend\n\n\nRunner->>DWE: ActionResponse\nDWE->>DWS: ClientEvent{ActionResponse}\nNote over DWE, DWS: ActionResponse:\u003Cbr/>- RequestID (matches Action.RequestID)\u003Cbr/>- Response (execution result string)\nend\n\n\n%% Workflow Completion\nDWE->>DWS: CloseSend()\nNote over DWE, DWS: Signal end of workflow execution\n\n\n%% Analytics and Cleanup\nRunner->>Runner: Send Analytics Event (Finish)\nDWE->>DWE: Token Revocation (if enabled)\nDWE->>DWS: Close gRPC Connection\n","mermaid","",[156,157,158,167,173,179,185,191,197,204,209,215,220,226,232,238,243,248,254,260,266,271,276,282,288,294,300,305,310,316,322,328,333,339,345,351,357,362,368,374,380,386,391,397,403,409,415,420,426,432,438,444,449,455,461,467,473,478,484,490,496,502,507,513,519,525,531,536,542,548,554,560,565,571,577,583,589,594,600,606,612,618,623,628,634,639,645,651,657,662,667,672,678,684,690,695,700,705,711,717,723,728,733,739,745,751],"code",{"__ignoreMap":154},[159,160,163],"span",{"class":161,"line":162},"line",1,[159,164,166],{"class":165},"sgsFI","sequenceDiagram\n",[159,168,170],{"class":161,"line":169},2,[159,171,172],{"class":165},"participant DWS as duo-workflow-service\n",[159,174,176],{"class":161,"line":175},3,[159,177,178],{"class":165},"participant DWE as duo-workflow-executor\n",[159,180,182],{"class":161,"line":181},4,[159,183,184],{"class":165},"participant Runner as ExecutionRunner\n",[159,186,188],{"class":161,"line":187},5,[159,189,190],{"class":165},"participant ActionExecutor as Action Executor\n",[159,192,194],{"class":161,"line":193},6,[159,195,196],{"class":165},"participant FileSystem as File System/Commands\n",[159,198,200],{"class":161,"line":199},7,[159,201,203],{"emptyLinePlaceholder":202},true,"\n",[159,205,207],{"class":161,"line":206},8,[159,208,203],{"emptyLinePlaceholder":202},[159,210,212],{"class":161,"line":211},9,[159,213,214],{"class":165},"Note over DWS, DWE: gRPC Bidirectional Streaming (ExecuteWorkflow)\n",[159,216,218],{"class":161,"line":217},10,[159,219,203],{"emptyLinePlaceholder":202},[159,221,223],{"class":161,"line":222},11,[159,224,225],{"class":165},"%% Connection Establishment\n",[159,227,229],{"class":161,"line":228},12,[159,230,231],{"class":165},"DWE->>DWS: gRPC Connection with Headers\n",[159,233,235],{"class":161,"line":234},13,[159,236,237],{"class":165},"Note over DWE, DWS: Headers: authorization (Bearer token)\u003Cbr/>x-gitlab-authentication-type: oidc\u003Cbr/>x-gitlab-realm, x-gitlab-global-user-id\u003Cbr/>x-gitlab-oauth-token, x-gitlab-base-url\u003Cbr/>x-gitlab-instance-id, x-request-id\u003Cbr/>x-gitlab-namespace-id, x-gitlab-project-id\n",[159,239,241],{"class":161,"line":240},14,[159,242,203],{"emptyLinePlaceholder":202},[159,244,246],{"class":161,"line":245},15,[159,247,203],{"emptyLinePlaceholder":202},[159,249,251],{"class":161,"line":250},16,[159,252,253],{"class":165},"%% Workflow Start Request\n",[159,255,257],{"class":161,"line":256},17,[159,258,259],{"class":165},"DWE->>DWS: ClientEvent{StartWorkflowRequest}\n",[159,261,263],{"class":161,"line":262},18,[159,264,265],{"class":165},"Note over DWE, DWS: StartWorkflowRequest:\u003Cbr/>- ClientVersion\u003Cbr/>- WorkflowDefinition\u003Cbr/>- Goal\u003Cbr/>- WorkflowID\u003Cbr/>- WorkflowMetadata\u003Cbr/>- ClientCapabilities[]\n",[159,267,269],{"class":161,"line":268},19,[159,270,203],{"emptyLinePlaceholder":202},[159,272,274],{"class":161,"line":273},20,[159,275,203],{"emptyLinePlaceholder":202},[159,277,279],{"class":161,"line":278},21,[159,280,281],{"class":165},"%% Action Processing Loop\n",[159,283,285],{"class":161,"line":284},22,[159,286,287],{"class":165},"loop Action Processing\n",[159,289,291],{"class":161,"line":290},23,[159,292,293],{"class":165},"DWS->>DWE: Action Message\n",[159,295,297],{"class":161,"line":296},24,[159,298,299],{"class":165},"Note over DWS, DWE: Action Types:\u003Cbr/>- Action_RunCommand {program, flags[], arguments[]}\u003Cbr/>- Action_RunGitCommand {command, arguments[], repositoryUrl}\u003Cbr/>- Action_RunReadFile {filepath}\u003Cbr/>- Action_RunWriteFile {filepath, contents}\u003Cbr/>- Action_RunEditFile {filepath, oldString, newString}\u003Cbr/>- Action_RunHTTPRequest {method, path, body}\u003Cbr/>- Action_ListDirectory {directory}\u003Cbr/>- Action_FindFiles {namePattern}\u003Cbr/>- Action_Grep {searchDirectory, pattern, caseInsensitive}\u003Cbr/>- Action_NewCheckpoint {}\u003Cbr/>- Action_RunMCPTool {}\n",[159,301,303],{"class":161,"line":302},25,[159,304,203],{"emptyLinePlaceholder":202},[159,306,308],{"class":161,"line":307},26,[159,309,203],{"emptyLinePlaceholder":202},[159,311,313],{"class":161,"line":312},27,[159,314,315],{"class":165},"DWE->>Runner: Receive Action\n",[159,317,319],{"class":161,"line":318},28,[159,320,321],{"class":165},"Runner->>Runner: processWorkflowActions()\n",[159,323,325],{"class":161,"line":324},29,[159,326,327],{"class":165},"Runner->>ActionExecutor: executeAction(ctx, action)\n",[159,329,331],{"class":161,"line":330},30,[159,332,203],{"emptyLinePlaceholder":202},[159,334,336],{"class":161,"line":335},31,[159,337,338],{"class":165},"alt Action_RunCommand\n",[159,340,342],{"class":161,"line":341},32,[159,343,344],{"class":165},"    ActionExecutor->>FileSystem: Execute Shell Command\n",[159,346,348],{"class":161,"line":347},33,[159,349,350],{"class":165},"    Note over ActionExecutor, FileSystem: Executes: program + flags + arguments\u003Cbr/>in basePath directory\n",[159,352,354],{"class":161,"line":353},34,[159,355,356],{"class":165},"    FileSystem-->>ActionExecutor: Command Output + Exit Code\n",[159,358,360],{"class":161,"line":359},35,[159,361,203],{"emptyLinePlaceholder":202},[159,363,365],{"class":161,"line":364},36,[159,366,367],{"class":165},"else Action_RunReadFile\n",[159,369,371],{"class":161,"line":370},37,[159,372,373],{"class":165},"    ActionExecutor->>FileSystem: Read File\n",[159,375,377],{"class":161,"line":376},38,[159,378,379],{"class":165},"    Note over ActionExecutor, FileSystem: Check gitignore rules\u003Cbr/>Read file contents\n",[159,381,383],{"class":161,"line":382},39,[159,384,385],{"class":165},"    FileSystem-->>ActionExecutor: File Contents\n",[159,387,389],{"class":161,"line":388},40,[159,390,203],{"emptyLinePlaceholder":202},[159,392,394],{"class":161,"line":393},41,[159,395,396],{"class":165},"else Action_RunWriteFile\n",[159,398,400],{"class":161,"line":399},42,[159,401,402],{"class":165},"    ActionExecutor->>FileSystem: Write File\n",[159,404,406],{"class":161,"line":405},43,[159,407,408],{"class":165},"    Note over ActionExecutor, FileSystem: Check gitignore rules\u003Cbr/>Create/overwrite file\n",[159,410,412],{"class":161,"line":411},44,[159,413,414],{"class":165},"    FileSystem-->>ActionExecutor: Success/Error Message\n",[159,416,418],{"class":161,"line":417},45,[159,419,203],{"emptyLinePlaceholder":202},[159,421,423],{"class":161,"line":422},46,[159,424,425],{"class":165},"else Action_RunEditFile\n",[159,427,429],{"class":161,"line":428},47,[159,430,431],{"class":165},"    ActionExecutor->>FileSystem: Edit File\n",[159,433,435],{"class":161,"line":434},48,[159,436,437],{"class":165},"    Note over ActionExecutor, FileSystem: Read → Replace oldString with newString → Write\u003Cbr/>Check gitignore rules\n",[159,439,441],{"class":161,"line":440},49,[159,442,443],{"class":165},"    FileSystem-->>ActionExecutor: Edit Result Message\n",[159,445,447],{"class":161,"line":446},50,[159,448,203],{"emptyLinePlaceholder":202},[159,450,452],{"class":161,"line":451},51,[159,453,454],{"class":165},"else Action_RunGitCommand\n",[159,456,458],{"class":161,"line":457},52,[159,459,460],{"class":165},"    ActionExecutor->>FileSystem: Execute Git Command \n",[159,462,464],{"class":161,"line":463},53,[159,465,466],{"class":165},"    Note over ActionExecutor, FileSystem: Git operations with authentication\u003Cbr/>Uses provided git config\n",[159,468,470],{"class":161,"line":469},54,[159,471,472],{"class":165},"    FileSystem-->>ActionExecutor: Git Command Output\n",[159,474,476],{"class":161,"line":475},55,[159,477,203],{"emptyLinePlaceholder":202},[159,479,481],{"class":161,"line":480},56,[159,482,483],{"class":165},"else Action_RunHTTPRequest\n",[159,485,487],{"class":161,"line":486},57,[159,488,489],{"class":165},"    ActionExecutor->>DWS: HTTP Request to GitLab API\n",[159,491,493],{"class":161,"line":492},58,[159,494,495],{"class":165},"    Note over ActionExecutor, DWS: Method: GET/POST/PUT/DELETE\u003Cbr/>Path: API endpoint\u003Cbr/>Body: Request payload\u003Cbr/>Headers: Authorization\n",[159,497,499],{"class":161,"line":498},59,[159,500,501],{"class":165},"    DWS-->>ActionExecutor: HTTP Response\n",[159,503,505],{"class":161,"line":504},60,[159,506,203],{"emptyLinePlaceholder":202},[159,508,510],{"class":161,"line":509},61,[159,511,512],{"class":165},"else Action_ListDirectory\n",[159,514,516],{"class":161,"line":515},62,[159,517,518],{"class":165},"    ActionExecutor->>FileSystem: List Directory Contents\n",[159,520,522],{"class":161,"line":521},63,[159,523,524],{"class":165},"    Note over ActionExecutor, FileSystem: Respect gitignore rules\n",[159,526,528],{"class":161,"line":527},64,[159,529,530],{"class":165},"    FileSystem-->>ActionExecutor: Directory Listing\n",[159,532,534],{"class":161,"line":533},65,[159,535,203],{"emptyLinePlaceholder":202},[159,537,539],{"class":161,"line":538},66,[159,540,541],{"class":165},"else Action_FindFiles\n",[159,543,545],{"class":161,"line":544},67,[159,546,547],{"class":165},"    ActionExecutor->>FileSystem: Find Files by Pattern\n",[159,549,551],{"class":161,"line":550},68,[159,552,553],{"class":165},"    Note over ActionExecutor, FileSystem: Recursive search with name pattern\u003Cbr/>Respect gitignore rules\n",[159,555,557],{"class":161,"line":556},69,[159,558,559],{"class":165},"    FileSystem-->>ActionExecutor: File Paths List\n",[159,561,563],{"class":161,"line":562},70,[159,564,203],{"emptyLinePlaceholder":202},[159,566,568],{"class":161,"line":567},71,[159,569,570],{"class":165},"else Action_Grep\n",[159,572,574],{"class":161,"line":573},72,[159,575,576],{"class":165},"    ActionExecutor->>FileSystem: Search Text Pattern\n",[159,578,580],{"class":161,"line":579},73,[159,581,582],{"class":165},"    Note over ActionExecutor, FileSystem: Recursive text search\u003Cbr/>Case sensitive/insensitive option\n",[159,584,586],{"class":161,"line":585},74,[159,587,588],{"class":165},"    FileSystem-->>ActionExecutor: Search Results\n",[159,590,592],{"class":161,"line":591},75,[159,593,203],{"emptyLinePlaceholder":202},[159,595,597],{"class":161,"line":596},76,[159,598,599],{"class":165},"else Action_NewCheckpoint/Action_RunMCPTool\n",[159,601,603],{"class":161,"line":602},77,[159,604,605],{"class":165},"    ActionExecutor->>ActionExecutor: No-op Action\n",[159,607,609],{"class":161,"line":608},78,[159,610,611],{"class":165},"    Note over ActionExecutor: Returns empty success result\n",[159,613,615],{"class":161,"line":614},79,[159,616,617],{"class":165},"end\n",[159,619,621],{"class":161,"line":620},80,[159,622,203],{"emptyLinePlaceholder":202},[159,624,626],{"class":161,"line":625},81,[159,627,203],{"emptyLinePlaceholder":202},[159,629,631],{"class":161,"line":630},82,[159,632,633],{"class":165},"ActionExecutor-->>Runner: Action Result (string)\n",[159,635,637],{"class":161,"line":636},83,[159,638,203],{"emptyLinePlaceholder":202},[159,640,642],{"class":161,"line":641},84,[159,643,644],{"class":165},"alt Result Size Check\n",[159,646,648],{"class":161,"line":647},85,[159,649,650],{"class":165},"    Runner->>Runner: Check if result > 4MB\n",[159,652,654],{"class":161,"line":653},86,[159,655,656],{"class":165},"    Note over Runner: If result exceeds MaxMessageSize (4MB)\u003Cbr/>Replace with error message about size limit\n",[159,658,660],{"class":161,"line":659},87,[159,661,617],{"class":165},[159,663,665],{"class":161,"line":664},88,[159,666,203],{"emptyLinePlaceholder":202},[159,668,670],{"class":161,"line":669},89,[159,671,203],{"emptyLinePlaceholder":202},[159,673,675],{"class":161,"line":674},90,[159,676,677],{"class":165},"Runner->>DWE: ActionResponse\n",[159,679,681],{"class":161,"line":680},91,[159,682,683],{"class":165},"DWE->>DWS: ClientEvent{ActionResponse}\n",[159,685,687],{"class":161,"line":686},92,[159,688,689],{"class":165},"Note over DWE, DWS: ActionResponse:\u003Cbr/>- RequestID (matches Action.RequestID)\u003Cbr/>- Response (execution result string)\n",[159,691,693],{"class":161,"line":692},93,[159,694,617],{"class":165},[159,696,698],{"class":161,"line":697},94,[159,699,203],{"emptyLinePlaceholder":202},[159,701,703],{"class":161,"line":702},95,[159,704,203],{"emptyLinePlaceholder":202},[159,706,708],{"class":161,"line":707},96,[159,709,710],{"class":165},"%% Workflow Completion\n",[159,712,714],{"class":161,"line":713},97,[159,715,716],{"class":165},"DWE->>DWS: CloseSend()\n",[159,718,720],{"class":161,"line":719},98,[159,721,722],{"class":165},"Note over DWE, DWS: Signal end of workflow execution\n",[159,724,726],{"class":161,"line":725},99,[159,727,203],{"emptyLinePlaceholder":202},[159,729,731],{"class":161,"line":730},100,[159,732,203],{"emptyLinePlaceholder":202},[159,734,736],{"class":161,"line":735},101,[159,737,738],{"class":165},"%% Analytics and Cleanup\n",[159,740,742],{"class":161,"line":741},102,[159,743,744],{"class":165},"Runner->>Runner: Send Analytics Event (Finish)\n",[159,746,748],{"class":161,"line":747},103,[159,749,750],{"class":165},"DWE->>DWE: Token Revocation (if enabled)\n",[159,752,754],{"class":161,"line":753},104,[159,755,756],{"class":165},"DWE->>DWS: Close gRPC Connection\n",[12,758,759],{},"This diagram reveals several important architectural insights that would have taken considerable time to extract manually:",[73,761,762,768,774,780,786],{},[76,763,764,767],{},[101,765,766],{},"Bidirectional communication:"," The workflow executor both initiates requests and responds to service actions.",[76,769,770,773],{},[101,771,772],{},"Rich payload structure:"," Each action type has specific parameters and expected responses.",[76,775,776,779],{},[101,777,778],{},"Multiple integration points:"," The executor interacts with local filesystem, Git repositories, and GitLab APIs.",[76,781,782,785],{},[101,783,784],{},"Comprehensive action set:"," Nine different action types handle everything from file operations to HTTP requests.",[76,787,788,791],{},[101,789,790],{},"Proper lifecycle management:"," Clear connection establishment and teardown patterns.",[12,793,794],{},"What impressed me most was how the agent automatically included the detailed payload structures for each action type. This level of detail transforms the diagram from a high-level overview into actionable documentation that other developers can immediately use.",[53,796,798],{"id":797},"looking-ahead","Looking ahead",[12,800,801],{},"This demonstration represents just one use case for GitLab Duo Agent Platform. The same contextual understanding and collaborative approach that made documentation generation seamless can be applied to:",[73,803,804,810,816,822,828],{},[76,805,806,809],{},[101,807,808],{},"Code reviews:"," Agents can analyze merge requests with full project context",[76,811,812,815],{},[101,813,814],{},"Testing:"," Generate comprehensive test suites based on actual usage patterns",[76,817,818,821],{},[101,819,820],{},"Debugging:"," Trace issues across multiple services and components",[76,823,824,827],{},[101,825,826],{},"Security scanning:"," Identify vulnerabilities with understanding of your specific architecture",[76,829,830,833],{},[101,831,832],{},"CI/CD optimization:"," Improve pipeline performance based on historical data",[12,835,836,837,841],{},"GitLab Duo Agent Platform will enter public beta soon so ",[19,838,840],{"href":30,"rel":839},[],"join the wait list today",".",[12,843,844,845,850],{},"Stay tuned to the ",[19,846,849],{"href":847,"rel":848},"https://about.gitlab.com/blog/",[],"GitLab Blog"," and social channels for additional updates. GitLab Duo Agent Platform is evolving rapidly with specialized agents, custom workflows, and community-driven extensions on the roadmap.",[53,852,854],{"id":853},"learn-more","Learn more",[73,856,857,864,870,877],{},[76,858,859],{},[19,860,863],{"href":861,"rel":862},"https://about.gitlab.com/blog/agentic-ai-guides-and-resources/",[],"Agentic AI guides and resources",[76,865,866],{},[19,867,869],{"href":21,"rel":868},[],"GitLab Duo Agent Platform: What’s next for intelligent DevSecOps",[76,871,872],{},[19,873,876],{"href":874,"rel":875},"https://about.gitlab.com/topics/agentic-ai/",[],"What is agentic AI?",[76,878,879],{},[19,880,883],{"href":881,"rel":882},"https://about.gitlab.com/the-source/ai/from-vibe-coding-to-agentic-ai-a-roadmap-for-technical-leaders/",[],"From vibe coding to agentic AI: A roadmap for technical leaders",[885,886,887],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":154,"searchDepth":169,"depth":169,"links":889},[890,891,892,893,894,895],{"id":55,"depth":169,"text":56},{"id":93,"depth":169,"text":94},{"id":116,"depth":169,"text":117},{"id":143,"depth":169,"text":144},{"id":797,"depth":169,"text":798},{"id":853,"depth":169,"text":854},"ai","2025-07-07","Learn how agentic AI helped generate comprehensive gRPC documentation in minutes, not hours.","md",null,"Blog/Hero%20Images/Workflow_1800x945.png",{},"/en-us/blog/accelerate-learning-with-gitlab-duo-agent-platform",{"title":5,"description":898},"accelerate-learning-with-gitlab-duo-agent-platform","en-us/blog/accelerate-learning-with-gitlab-duo-agent-platform",[908,909,910],"tutorial","product","security","BlogPost","amD2lPAPF0dEvgJRapUrjxH8916ahW-mgx5AyKBq6ac",{"logo":914,"freeTrial":919,"sales":924,"login":929,"items":934,"search":1259,"minimal":1290,"duo":1309,"switchNav":1318,"pricingDeployment":1329},{"config":915},{"href":916,"dataGaName":917,"dataGaLocation":918},"/","gitlab logo","header",{"text":920,"config":921},"Get free trial",{"href":922,"dataGaName":923,"dataGaLocation":918},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":925,"config":926},"Request a demo",{"href":927,"dataGaName":928,"dataGaLocation":918},"/sales/?contact-topic=request-demo","sales",{"text":930,"config":931},"Sign in",{"href":932,"dataGaName":933,"dataGaLocation":918},"https://gitlab.com/users/sign_in/","sign in",[935,962,1062,1067,1181,1237],{"text":936,"config":937,"menu":939},"Platform",{"dataNavLevelOne":938},"platform",{"type":940,"columns":941},"cards",[942,948,955],{"title":936,"description":943,"link":944},"The intelligent orchestration platform for DevSecOps",{"text":945,"config":946},"Explore our Platform",{"href":947,"dataGaName":938,"dataGaLocation":918},"/platform/",{"title":23,"description":949,"link":950},"Agentic AI for the entire software lifecycle",{"text":951,"config":952},"Meet GitLab Duo",{"href":953,"dataGaName":954,"dataGaLocation":918},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":956,"description":957,"link":958},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":854,"config":959},{"href":960,"dataGaName":961,"dataGaLocation":918},"/why-gitlab/","why gitlab",{"text":963,"left":202,"config":964,"menu":966},"Product",{"dataNavLevelOne":965},"solutions",{"type":967,"link":968,"columns":972,"feature":1041},"lists",{"text":969,"config":970},"View all Solutions",{"href":971,"dataGaName":965,"dataGaLocation":918},"/solutions/",[973,997,1020],{"title":974,"description":975,"link":976,"items":981},"Automation","CI/CD and automation to accelerate deployment",{"config":977},{"icon":978,"href":979,"dataGaName":980,"dataGaLocation":918},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[982,986,989,993],{"text":983,"config":984},"CI/CD",{"href":985,"dataGaLocation":918,"dataGaName":983},"/solutions/continuous-integration/",{"text":23,"config":987},{"href":953,"dataGaLocation":918,"dataGaName":988},"gitlab duo agent platform - product menu",{"text":990,"config":991},"Source Code Management",{"href":992,"dataGaLocation":918,"dataGaName":990},"/solutions/source-code-management/",{"text":994,"config":995},"Automated Software Delivery",{"href":979,"dataGaLocation":918,"dataGaName":996},"Automated software delivery",{"title":998,"description":999,"link":1000,"items":1005},"Security","Deliver code faster without compromising security",{"config":1001},{"href":1002,"dataGaName":1003,"dataGaLocation":918,"icon":1004},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1006,1010,1015],{"text":1007,"config":1008},"Application Security Testing",{"href":1002,"dataGaName":1009,"dataGaLocation":918},"Application security testing",{"text":1011,"config":1012},"Software Supply Chain Security",{"href":1013,"dataGaLocation":918,"dataGaName":1014},"/solutions/supply-chain/","Software supply chain security",{"text":1016,"config":1017},"Software Compliance",{"href":1018,"dataGaName":1019,"dataGaLocation":918},"/solutions/software-compliance/","software compliance",{"title":1021,"link":1022,"items":1027},"Measurement",{"config":1023},{"icon":1024,"href":1025,"dataGaName":1026,"dataGaLocation":918},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1028,1032,1036],{"text":1029,"config":1030},"Visibility & Measurement",{"href":1025,"dataGaLocation":918,"dataGaName":1031},"Visibility and Measurement",{"text":1033,"config":1034},"Value Stream Management",{"href":1035,"dataGaLocation":918,"dataGaName":1033},"/solutions/value-stream-management/",{"text":1037,"config":1038},"Analytics & Insights",{"href":1039,"dataGaLocation":918,"dataGaName":1040},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1042,"type":967,"items":1043},"GitLab for",[1044,1050,1056],{"text":1045,"config":1046},"Enterprise",{"icon":1047,"href":1048,"dataGaLocation":918,"dataGaName":1049},"Building","/enterprise/","enterprise",{"text":1051,"config":1052},"Small Business",{"icon":1053,"href":1054,"dataGaLocation":918,"dataGaName":1055},"Work","/small-business/","small business",{"text":1057,"config":1058},"Public Sector",{"icon":1059,"href":1060,"dataGaLocation":918,"dataGaName":1061},"Organization","/solutions/public-sector/","public sector",{"text":1063,"config":1064},"Pricing",{"href":1065,"dataGaName":1066,"dataGaLocation":918,"dataNavLevelOne":1066},"/pricing/","pricing",{"text":1068,"config":1069,"menu":1071},"Resources",{"dataNavLevelOne":1070},"resources",{"type":967,"link":1072,"columns":1076,"feature":1170},{"text":1073,"config":1074},"View all resources",{"href":1075,"dataGaName":1070,"dataGaLocation":918},"/resources/",[1077,1110,1137],{"title":1078,"items":1079},"Getting started",[1080,1085,1090,1095,1100,1105],{"text":1081,"config":1082},"Install",{"href":1083,"dataGaName":1084,"dataGaLocation":918},"/install/","install",{"text":1086,"config":1087},"Quick start guides",{"href":1088,"dataGaName":1089,"dataGaLocation":918},"/get-started/","quick setup checklists",{"text":1091,"config":1092},"Learn",{"href":1093,"dataGaLocation":918,"dataGaName":1094},"https://university.gitlab.com/","learn",{"text":1096,"config":1097},"Product documentation",{"href":1098,"dataGaName":1099,"dataGaLocation":918},"https://docs.gitlab.com/","product documentation",{"text":1101,"config":1102},"Best practice videos",{"href":1103,"dataGaName":1104,"dataGaLocation":918},"/getting-started-videos/","best practice videos",{"text":1106,"config":1107},"Integrations",{"href":1108,"dataGaName":1109,"dataGaLocation":918},"/integrations/","integrations",{"title":1111,"items":1112},"Discover",[1113,1118,1123,1128,1132],{"text":1114,"config":1115},"Customer success stories",{"href":1116,"dataGaName":1117,"dataGaLocation":918},"/customers/","customer success stories",{"text":1119,"config":1120},"Blog",{"href":1121,"dataGaName":1122,"dataGaLocation":918},"/blog/","blog",{"text":1124,"config":1125},"Demo Hub",{"href":1126,"dataGaName":1127,"dataGaLocation":918},"/demo-hub/","demo hub",{"text":1129,"config":1130},"The Source",{"href":1131,"dataGaName":1122,"dataGaLocation":918},"/the-source/",{"text":1133,"config":1134},"Remote",{"href":1135,"dataGaName":1136,"dataGaLocation":918},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1138,"items":1139},"Connect",[1140,1145,1150,1155,1160,1165],{"text":1141,"config":1142},"GitLab Services",{"href":1143,"dataGaName":1144,"dataGaLocation":918},"/services/","services",{"text":1146,"config":1147},"Contribute",{"href":1148,"dataGaName":1149,"dataGaLocation":918},"https://contributors.gitlab.com","contribute",{"text":1151,"config":1152},"Community",{"href":1153,"dataGaName":1154,"dataGaLocation":918},"/community/","community",{"text":1156,"config":1157},"Forum",{"href":1158,"dataGaName":1159,"dataGaLocation":918},"https://forum.gitlab.com/","forum",{"text":1161,"config":1162},"Events",{"href":1163,"dataGaName":1164,"dataGaLocation":918},"/events/","events",{"text":1166,"config":1167},"Partners",{"href":1168,"dataGaName":1169,"dataGaLocation":918},"/partners/","partners",{"config":1171,"title":1174,"text":1175,"link":1176},{"background":1172,"textColor":1173},"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":1177,"config":1178},"Read the latest",{"href":1179,"dataGaName":1180,"dataGaLocation":918},"/whats-new/","whats new",{"text":1182,"config":1183,"menu":1185},"Company",{"dataNavLevelOne":1184},"company",{"type":967,"columns":1186},[1187],{"items":1188},[1189,1194,1200,1202,1207,1212,1217,1222,1227,1232],{"text":1190,"config":1191},"About",{"href":1192,"dataGaName":1193,"dataGaLocation":918},"/company/","about",{"text":1195,"config":1196,"footerGa":1199},"Jobs",{"href":1197,"dataGaName":1198,"dataGaLocation":918},"/jobs/","jobs",{"dataGaName":1198},{"text":1161,"config":1201},{"href":1163,"dataGaName":1164,"dataGaLocation":918},{"text":1203,"config":1204},"Leadership",{"href":1205,"dataGaName":1206,"dataGaLocation":918},"/company/team/e-group/","leadership",{"text":1208,"config":1209},"Handbook",{"href":1210,"dataGaName":1211,"dataGaLocation":918},"https://handbook.gitlab.com/","handbook",{"text":1213,"config":1214},"Investor relations",{"href":1215,"dataGaName":1216,"dataGaLocation":918},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1218,"config":1219},"Trust Center",{"href":1220,"dataGaName":1221,"dataGaLocation":918},"/security/","trust center",{"text":1223,"config":1224},"AI Transparency Center",{"href":1225,"dataGaName":1226,"dataGaLocation":918},"/ai-transparency-center/","ai transparency center",{"text":1228,"config":1229},"Newsletter",{"href":1230,"dataGaName":1231,"dataGaLocation":918},"/company/contact/#contact-forms","newsletter",{"text":1233,"config":1234},"Press",{"href":1235,"dataGaName":1236,"dataGaLocation":918},"/press/","press",{"text":1238,"config":1239,"menu":1240},"Contact us",{"dataNavLevelOne":1184},{"type":967,"columns":1241},[1242],{"items":1243},[1244,1249,1254],{"text":1245,"config":1246},"Talk to sales",{"href":1247,"dataGaName":1248,"dataGaLocation":918},"/sales/","talk to sales",{"text":1250,"config":1251},"Support portal",{"href":1252,"dataGaName":1253,"dataGaLocation":918},"https://support.gitlab.com/hc/en-us","support portal",{"text":1255,"config":1256},"Customer portal",{"href":1257,"dataGaName":1258,"dataGaLocation":918},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1260,"login":1261,"suggestions":1268},"Close",{"text":1262,"link":1263},"To search repositories and projects, login to",{"text":1264,"config":1265},"gitlab.com",{"href":932,"dataGaName":1266,"dataGaLocation":1267},"search login","search",{"text":1269,"default":1270},"Suggestions",[1271,1273,1277,1279,1283,1287],{"text":23,"config":1272},{"href":953,"dataGaName":23,"dataGaLocation":1267},{"text":1274,"config":1275},"Code Suggestions (AI)",{"href":1276,"dataGaName":1274,"dataGaLocation":1267},"/solutions/code-suggestions/",{"text":983,"config":1278},{"href":985,"dataGaName":983,"dataGaLocation":1267},{"text":1280,"config":1281},"GitLab on AWS",{"href":1282,"dataGaName":1280,"dataGaLocation":1267},"/partners/technology-partners/aws/",{"text":1284,"config":1285},"GitLab on Google Cloud",{"href":1286,"dataGaName":1284,"dataGaLocation":1267},"/partners/technology-partners/google-cloud-platform/",{"text":1288,"config":1289},"Why GitLab?",{"href":960,"dataGaName":1288,"dataGaLocation":1267},{"freeTrial":1291,"mobileIcon":1296,"desktopIcon":1301,"secondaryButton":1304},{"text":1292,"config":1293},"Start free trial",{"href":1294,"dataGaName":923,"dataGaLocation":1295},"https://gitlab.com/-/trials/new/","nav",{"altText":1297,"config":1298},"Gitlab Icon",{"src":1299,"dataGaName":1300,"dataGaLocation":1295},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1297,"config":1302},{"src":1303,"dataGaName":1300,"dataGaLocation":1295},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1305,"config":1306},"Get Started",{"href":1307,"dataGaName":1308,"dataGaLocation":1295},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1310,"mobileIcon":1314,"desktopIcon":1316},{"text":1311,"config":1312},"Learn more about GitLab Duo",{"href":953,"dataGaName":1313,"dataGaLocation":1295},"gitlab duo",{"altText":1297,"config":1315},{"src":1299,"dataGaName":1300,"dataGaLocation":1295},{"altText":1297,"config":1317},{"src":1303,"dataGaName":1300,"dataGaLocation":1295},{"button":1319,"mobileIcon":1324,"desktopIcon":1326},{"text":1320,"config":1321},"/switch",{"href":1322,"dataGaName":1323,"dataGaLocation":1295},"#contact","switch",{"altText":1297,"config":1325},{"src":1299,"dataGaName":1300,"dataGaLocation":1295},{"altText":1297,"config":1327},{"src":1328,"dataGaName":1300,"dataGaLocation":1295},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1330,"mobileIcon":1335,"desktopIcon":1337},{"text":1331,"config":1332},"Back to pricing",{"href":1065,"dataGaName":1333,"dataGaLocation":1295,"icon":1334},"back to pricing","GoBack",{"altText":1297,"config":1336},{"src":1299,"dataGaName":1300,"dataGaLocation":1295},{"altText":1297,"config":1338},{"src":1303,"dataGaName":1300,"dataGaLocation":1295},{"title":1340,"titleMobile":1341,"button":1342,"config":1347},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":854,"config":1343},{"href":1344,"dataGaName":1345,"dataGaLocation":1346},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1348,"disabled":1349},"release",false,{"data":1351},{"text":1352,"source":1353,"edit":1359,"contribute":1364,"config":1369,"items":1374,"minimal":1584},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1354,"config":1355},"View page source",{"href":1356,"dataGaName":1357,"dataGaLocation":1358},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1360,"config":1361},"Edit this page",{"href":1362,"dataGaName":1363,"dataGaLocation":1358},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1365,"config":1366},"Please contribute",{"href":1367,"dataGaName":1368,"dataGaLocation":1358},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1370,"facebook":1371,"youtube":1372,"linkedin":1373},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1375,1422,1476,1520,1552],{"title":1063,"links":1376,"subMenu":1391},[1377,1381,1386],{"text":1378,"config":1379},"View plans",{"href":1065,"dataGaName":1380,"dataGaLocation":1358},"view plans",{"text":1382,"config":1383},"Why Premium?",{"href":1384,"dataGaName":1385,"dataGaLocation":1358},"/pricing/premium/","why premium",{"text":1387,"config":1388},"Why Ultimate?",{"href":1389,"dataGaName":1390,"dataGaLocation":1358},"/pricing/ultimate/","why ultimate",[1392],{"title":1393,"links":1394},"Contact Us",[1395,1398,1400,1402,1407,1412,1417],{"text":1396,"config":1397},"Contact sales",{"href":1247,"dataGaName":928,"dataGaLocation":1358},{"text":1250,"config":1399},{"href":1252,"dataGaName":1253,"dataGaLocation":1358},{"text":1255,"config":1401},{"href":1257,"dataGaName":1258,"dataGaLocation":1358},{"text":1403,"config":1404},"Status",{"href":1405,"dataGaName":1406,"dataGaLocation":1358},"https://status.gitlab.com/","status",{"text":1408,"config":1409},"Terms of use",{"href":1410,"dataGaName":1411,"dataGaLocation":1358},"/terms/","terms of use",{"text":1413,"config":1414},"Privacy statement",{"href":1415,"dataGaName":1416,"dataGaLocation":1358},"/privacy/","privacy statement",{"text":1418,"config":1419},"Cookie preferences",{"dataGaName":1420,"dataGaLocation":1358,"id":1421,"isOneTrustButton":202},"cookie preferences","ot-sdk-btn",{"title":963,"links":1423,"subMenu":1432},[1424,1428],{"text":1425,"config":1426},"DevSecOps platform",{"href":947,"dataGaName":1427,"dataGaLocation":1358},"devsecops platform",{"text":1429,"config":1430},"AI-Assisted Development",{"href":953,"dataGaName":1431,"dataGaLocation":1358},"ai-assisted development",[1433],{"title":1434,"links":1435},"Topics",[1436,1441,1446,1451,1456,1461,1466,1471],{"text":1437,"config":1438},"CICD",{"href":1439,"dataGaName":1440,"dataGaLocation":1358},"/topics/ci-cd/","cicd",{"text":1442,"config":1443},"GitOps",{"href":1444,"dataGaName":1445,"dataGaLocation":1358},"/topics/gitops/","gitops",{"text":1447,"config":1448},"DevOps",{"href":1449,"dataGaName":1450,"dataGaLocation":1358},"/topics/devops/","devops",{"text":1452,"config":1453},"Version Control",{"href":1454,"dataGaName":1455,"dataGaLocation":1358},"/topics/version-control/","version control",{"text":1457,"config":1458},"DevSecOps",{"href":1459,"dataGaName":1460,"dataGaLocation":1358},"/topics/devsecops/","devsecops",{"text":1462,"config":1463},"Cloud Native",{"href":1464,"dataGaName":1465,"dataGaLocation":1358},"/topics/cloud-native/","cloud native",{"text":1467,"config":1468},"AI for Coding",{"href":1469,"dataGaName":1470,"dataGaLocation":1358},"/topics/devops/ai-for-coding/","ai for coding",{"text":1472,"config":1473},"Agentic AI",{"href":1474,"dataGaName":1475,"dataGaLocation":1358},"/topics/agentic-ai/","agentic ai",{"title":1477,"links":1478},"Solutions",[1479,1481,1483,1488,1492,1495,1499,1502,1504,1507,1510,1515],{"text":1007,"config":1480},{"href":1002,"dataGaName":1007,"dataGaLocation":1358},{"text":996,"config":1482},{"href":979,"dataGaName":980,"dataGaLocation":1358},{"text":1484,"config":1485},"Agile development",{"href":1486,"dataGaName":1487,"dataGaLocation":1358},"/solutions/agile-delivery/","agile delivery",{"text":1489,"config":1490},"SCM",{"href":992,"dataGaName":1491,"dataGaLocation":1358},"source code management",{"text":1437,"config":1493},{"href":985,"dataGaName":1494,"dataGaLocation":1358},"continuous integration & delivery",{"text":1496,"config":1497},"Value stream management",{"href":1035,"dataGaName":1498,"dataGaLocation":1358},"value stream management",{"text":1442,"config":1500},{"href":1501,"dataGaName":1445,"dataGaLocation":1358},"/solutions/gitops/",{"text":1045,"config":1503},{"href":1048,"dataGaName":1049,"dataGaLocation":1358},{"text":1505,"config":1506},"Small business",{"href":1054,"dataGaName":1055,"dataGaLocation":1358},{"text":1508,"config":1509},"Public sector",{"href":1060,"dataGaName":1061,"dataGaLocation":1358},{"text":1511,"config":1512},"Education",{"href":1513,"dataGaName":1514,"dataGaLocation":1358},"/solutions/education/","education",{"text":1516,"config":1517},"Financial services",{"href":1518,"dataGaName":1519,"dataGaLocation":1358},"/solutions/finance/","financial services",{"title":1068,"links":1521},[1522,1524,1526,1528,1531,1533,1536,1538,1540,1542,1544,1546,1548,1550],{"text":1081,"config":1523},{"href":1083,"dataGaName":1084,"dataGaLocation":1358},{"text":1086,"config":1525},{"href":1088,"dataGaName":1089,"dataGaLocation":1358},{"text":1091,"config":1527},{"href":1093,"dataGaName":1094,"dataGaLocation":1358},{"text":1096,"config":1529},{"href":1098,"dataGaName":1530,"dataGaLocation":1358},"docs",{"text":1119,"config":1532},{"href":1121,"dataGaName":1122,"dataGaLocation":1358},{"text":1534,"config":1535},"What's new",{"href":1179,"dataGaName":1180,"dataGaLocation":1358},{"text":1114,"config":1537},{"href":1116,"dataGaName":1117,"dataGaLocation":1358},{"text":1133,"config":1539},{"href":1135,"dataGaName":1136,"dataGaLocation":1358},{"text":1141,"config":1541},{"href":1143,"dataGaName":1144,"dataGaLocation":1358},{"text":1146,"config":1543},{"href":1148,"dataGaName":1149,"dataGaLocation":1358},{"text":1151,"config":1545},{"href":1153,"dataGaName":1154,"dataGaLocation":1358},{"text":1156,"config":1547},{"href":1158,"dataGaName":1159,"dataGaLocation":1358},{"text":1161,"config":1549},{"href":1163,"dataGaName":1164,"dataGaLocation":1358},{"text":1166,"config":1551},{"href":1168,"dataGaName":1169,"dataGaLocation":1358},{"title":1182,"links":1553},[1554,1556,1558,1560,1562,1564,1568,1573,1575,1577,1579],{"text":1190,"config":1555},{"href":1192,"dataGaName":1184,"dataGaLocation":1358},{"text":1195,"config":1557},{"href":1197,"dataGaName":1198,"dataGaLocation":1358},{"text":1203,"config":1559},{"href":1205,"dataGaName":1206,"dataGaLocation":1358},{"text":1208,"config":1561},{"href":1210,"dataGaName":1211,"dataGaLocation":1358},{"text":1213,"config":1563},{"href":1215,"dataGaName":1216,"dataGaLocation":1358},{"text":1565,"config":1566},"Sustainability",{"href":1567,"dataGaName":1565,"dataGaLocation":1358},"/sustainability/",{"text":1569,"config":1570},"Diversity, inclusion and belonging (DIB)",{"href":1571,"dataGaName":1572,"dataGaLocation":1358},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1218,"config":1574},{"href":1220,"dataGaName":1221,"dataGaLocation":1358},{"text":1228,"config":1576},{"href":1230,"dataGaName":1231,"dataGaLocation":1358},{"text":1233,"config":1578},{"href":1235,"dataGaName":1236,"dataGaLocation":1358},{"text":1580,"config":1581},"Modern Slavery Transparency Statement",{"href":1582,"dataGaName":1583,"dataGaLocation":1358},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1585},[1586,1589,1592],{"text":1587,"config":1588},"Terms",{"href":1410,"dataGaName":1411,"dataGaLocation":1358},{"text":1590,"config":1591},"Cookies",{"dataGaName":1420,"dataGaLocation":1358,"id":1421,"isOneTrustButton":202},{"text":1593,"config":1594},"Privacy",{"href":1415,"dataGaName":1416,"dataGaLocation":1358},[1596],{"id":1597,"title":7,"body":900,"config":1598,"content":1601,"description":900,"extension":1604,"meta":1605,"navigation":202,"path":1606,"seo":1607,"stem":1608,"__hash__":1609},"blogAuthors/en-us/blog/authors/halil-coban.yml",{"template":1599,"gitlabHandle":1600},"BlogAuthor","halilcoban",{"name":7,"config":1602},{"headshot":1603},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1751039592/hlxd6cnlgdioobqfvwus.png","yml",{},"/en-us/blog/authors/halil-coban",{},"en-us/blog/authors/halil-coban","XCk-kHFWFcKTRHD7-olqalZoxlaArZ_0zpRqcgazPtA",[1611,1619,1627],{"title":1612,"description":1613,"heroImage":1614,"category":896,"date":1615,"authors":1616,"slug":1618,"externalUrl":900},"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",[1617],"Itzik Gan Baruch","agentic-click-through-demo",{"title":1620,"description":1621,"heroImage":1622,"category":896,"date":1623,"authors":1624,"slug":1626,"externalUrl":900},"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",[1625],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":1628,"description":1629,"heroImage":1630,"category":896,"date":1631,"authors":1632,"slug":1634,"externalUrl":900},"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",[1633],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":1636},[1637,1650,1661,1672],{"id":1638,"categories":1639,"header":1640,"text":1641,"button":1642,"image":1647},"ai-modernization",[896],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1643,"config":1644},"Get your AI maturity score",{"href":1645,"dataGaName":1646,"dataGaLocation":1122},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1648},{"src":1649},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1651,"categories":1652,"header":1653,"text":1641,"button":1654,"image":1658},"devops-modernization",[909,1460],"Are you just managing tools or shipping innovation?",{"text":1655,"config":1656},"Get your DevOps maturity score",{"href":1657,"dataGaName":1646,"dataGaLocation":1122},"/assessments/devops-modernization-assessment/",{"config":1659},{"src":1660},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1662,"categories":1663,"header":1664,"text":1641,"button":1665,"image":1669},"security-modernization",[910],"Are you trading speed for security?",{"text":1666,"config":1667},"Get your security maturity score",{"href":1668,"dataGaName":1646,"dataGaLocation":1122},"/assessments/security-modernization-assessment/",{"config":1670},{"src":1671},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1673,"paths":1674,"header":1677,"text":1678,"button":1679,"image":1684},"github-azure-migration",[1675,1676],"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":1680,"config":1681},"See how GitLab compares to GitHub",{"href":1682,"dataGaName":1683,"dataGaLocation":1122},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1685},{"src":1660},{"header":1687,"blurb":1688,"button":1689,"secondaryButton":1694},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1690,"config":1691},"Get your free trial",{"href":1692,"dataGaName":923,"dataGaLocation":1693},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1396,"config":1695},{"href":1247,"dataGaName":928,"dataGaLocation":1693},1786803727685]