[{"data":1,"prerenderedAt":1914},["ShallowReactive",2],{"/ja-jp/blog/how-gitlab-reduced-code-per-agentic-flow-ratio":3,"navigation-ja-jp":1168,"banner-ja-jp":1591,"footer-ja-jp":1602,"blog-post-authors-ja-jp-Mikolaj Wawrzyniak":1854,"blog-related-posts-ja-jp-how-gitlab-reduced-code-per-agentic-flow-ratio":1870,"blog-share-wrapper-ja-jp":1895,"next-steps-ja-jp":1905},{"id":4,"title":5,"authors":6,"body":8,"category":1148,"date":1149,"description":1150,"extension":1151,"externalUrl":1152,"faq":1152,"featured":1153,"heroImage":1154,"meta":1155,"navigation":396,"path":1156,"seo":1157,"slug":1159,"stem":1160,"tags":1161,"template":1165,"updatedDate":1166,"__hash__":1167},"blogPosts/ja-jp/blog/how-gitlab-reduced-code-per-agentic-flow-ratio.md","GitLabがエージェント型フローあたりのコード量を45%削減した方法",[7],"Mikolaj Wawrzyniak",{"type":9,"value":10,"toc":1134},"minimark",[11,21,24,53,56,59,64,67,70,73,103,110,117,126,129,132,135,148,151,154,158,165,168,171,189,192,197,202,358,365,562,565,569,583,595,692,695,706,709,713,726,746,759,994,997,1026,1029,1033,1042,1045,1059,1062,1069,1078,1081,1084,1087,1090,1098,1101,1109,1113,1122,1130],[12,13,14,20],"p",{},[15,16,19],"a",{"href":17,"rel":18},"https://about.gitlab.com/ja-jp/blog/gitlab-duo-agent-platform-is-generally-available/",[],"GitLab Duo Agent Platform","は、エージェント型フローによって複雑なタスクをオーケストレーションし、自動化します。その中核を担うのが、再利用可能なコンポーネントで構成され、YAMLを完全に機能するLangGraphフローへとコンパイルする宣言型の設定フレームワーク「Flow Registry」。Flow Registryを使えば、GitLabのエンジニアもお客様も、場当たり的なPythonコードを繰り返し書くことなく、宣言型のYAML設定でエージェントを構築できます。エージェントごとに重複していた独自の状態管理やエージェント間の接続処理も、エージェントビルダーが利用できる再利用可能なコンポーネントとプリミティブへと集約されました。",[12,22,23],{},"Flow Registryの導入により、GitLab社内ではエージェント型フロー1つあたりのコード量を45%削減できました。これによって得られた具体的な効果は、次のとおりです。",[25,26,27,35,41,47],"ul",{},[28,29,30,34],"li",{},[31,32,33],"strong",{},"イテレーションの高速化","：再利用可能なコンポーネントとプリミティブを備えた宣言型フレームワークにより、開発のスピードが上がります。",[28,36,37,40],{},[31,38,39],{},"信頼性の向上","：その場限りの実装ミスやボイラープレート由来のバグには、コンポーネントレベルで対処できます。",[28,42,43,46],{},[31,44,45],{},"保守コストの削減","：プラットフォームの改善は一度行うだけで、すべてのエージェントに反映されます。",[28,48,49,52],{},[31,50,51],{},"機能の後方互換性","：抽象化レイヤーがあるため、GitLabが提供する基本フローとお客様のカスタムフローのどちらでも後方互換性が保たれます。",[12,54,55],{},"これらのメリットはすべて、GitLab Duo Agent Platformでエージェントを構築・オーケストレーションするお客様にもご利用いただけます。",[12,57,58],{},"本記事では、この取り組みから得たアーキテクチャの原則と教訓、そしてそれを皆さまの環境に応用する方法をご紹介します。",[60,61,63],"h2",{"id":62},"gitlab-duo-agent-platformの基盤に選んだlanggraph","GitLab Duo Agent Platformの基盤に選んだLangGraph",[12,65,66],{},"GitLab Duoのコード提案とGitLab Duo Chatをリリースした後、私たちは当時まだ新しい技術だった、自律的に動作するAIエージェントの研究に着手しました。利用可能なAIフレームワークを調査した結果、GitLab Duo Agent Platformの基盤として選んだのが、LangChainが提供するエージェントランタイム兼低レベルのオーケストレーションフレームワーク「LangGraph」。",[12,68,69],{},"LangGraphは、幅広いモデルアダプター、永続的な実行（durable execution）、トレーサビリティといった豊富な機能を備えています。エンジニアリング上の自由度も高く、GitLab Duo Agent Platformの開発に着手するうえで求めていた構成要素がすべてそろっていました。",[12,71,72],{},"最初の数か月間、GitLabのエンジニアはLangGraphを活用してDuo Agent Platformの基盤を迅速に構築し、ほどなくして4つのエージェント型フローをリリースしました。",[25,74,75,82,89,96],{},[28,76,77],{},[15,78,81],{"href":79,"rel":80},"https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/foundational_flows/software_development/",[],"ソフトウェア開発フロー",[28,83,84],{},[15,85,88],{"href":86,"rel":87},"https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/agentic_chat/",[],"GitLab Duo Agentic Chat",[28,90,91],{},[15,92,95],{"href":93,"rel":94},"https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/foundational_flows/convert_to_gitlab_ci/",[],"GitLab CI/CD変換フロー",[28,97,98],{},[15,99,102],{"href":100,"rel":101},"https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/foundational_flows/developer/",[],"デベロッパーフロー",[12,104,105,106,109],{},"一方で、LangGraphのような低レベルのフレームワークでは解決できない重大な課題にも、すぐに気づきました。それは、",[31,107,108],{},"大規模な開発を一貫して進めるための構造が欠けている","という点です。",[12,111,112,113,116],{},"当時はフローが4つしかなく、GitLab Duo Agent Platformに携わるエンジニアチームも小規模でしたが、コードベースは急速に膨らんでいきました。各フローはその場しのぎの有向グラフとして実装され、ノードとエッジが複雑に絡み合う状態に。初期のDuo Agent Platformのコードベースには、",[31,114,115],{},"再利用性も組み合わせ可能性（コンポーザビリティ）もなく、共通の標準もほとんどありませんでした","。新機能の開発は非常に難しくなり、プラットフォーム全体に関わる横断的な変更は不可能に思えるほどでした。",[12,118,119,120,125],{},"どのフローも最低450行のその場しのぎのPythonコードで書かれ、この",[15,121,124],{"href":122,"rel":123},"https://gitlab.com/gitlab-org/duo-workflow/duo-workflow-service/-/blob/21d695615ee24d232826dd056da23dbf7f4cd4ee/duo_workflow_service/workflow/workflow.py",[],"例","のような状態でした。複雑さと密結合に圧倒されたエンジニアは変更を加えるのに苦労し、チームの開発速度は低下していきました。",[12,127,128],{},"グラフの複雑さは、テストスイートにも波及しました。各テストケースがグラフ全体を通した実行に依存していたため、品質を守るセーフティネットであるはずのテストは、誰も触れたがらない厄介者になっていました。",[12,130,131],{},"この低い抽象化レベルでグラフを最小単位の構成要素として扱うのは、プラットフォームの実装には不向きであることが明らかになりました。構想していた規模を支えるには、複雑さを分解し、プロジェクトを保守するプラットフォームエンジニアの認知負荷を軽減する、より小さな単位を導入する必要があったのです。",[12,133,134],{},"さらに、モデルAPIの呼び出しや、モデルが生成した関数呼び出しの実行を管理する低レベルのノードで構成されたグラフは、AIエンジニアにとっても適切な抽象化ではありませんでした。AIエンジニアには、エージェントやエージェントオーケストレーションといった用語のほうがなじみ深いからです。",[12,136,137,138,141,142,147],{},"この迷路から抜け出すため、私たちは新たな抽象化レイヤーを導入し、",[31,139,140],{},"AIエンジニアリングとプラットフォーム開発という2つの関心事を分離する","ことにしました。まず着手したのは、既存のグラフを見直し、繰り返し現れる構造（たとえば、エージェントループを実装する、大規模言語モデル（",[15,143,146],{"href":144,"rel":145},"https://about.gitlab.com/blog/what-is-a-large-language-model-llm/",[],"LLM","）の呼び出しとツール実行を行き来するサイクルなど）を特定して抽出する作業。このリファクタリングで最も複雑なファイルが小さな部品に分割され、それらが新しい抽象化レイヤーを形成したことで、状況はある程度改善しました。",[12,149,150],{},"しかし、プラットフォームがスケーラブルと呼べる状態には、まだ程遠いのが実情でした。抽出したグラフの部品は、残念ながらそれぞれ独自の状態構造で動作し、元のフローと密結合していたため、異なるフロー間で再利用できなかったのです。加えて懸念されたのが、このままでは新しいフローを作るたびに、既存の部品を組み合わせるのではなく、独自の部品セットが新たに生まれてしまうこと。協調的でも効率的でもないこのシステムを、長期にわたって維持することはできませんでした。",[12,152,153],{},"この気づきによって、進むべき道がはっきりしました。求められたのは、さらに力を注いでアーキテクチャを進化させ続けること、そして明確な開発ガイドラインを整備すること。当時すでに、Duo Agent Platformのフローは他のプロダクトチームだけが構築するものではなく、より広いGitLabコミュニティにもコントリビューションを呼びかける予定であることがわかっていました。",[60,155,157],{"id":156},"langgraphの詳細を新フレームワークflow-registryで抽象化","LangGraphの詳細を新フレームワークFlow Registryで抽象化",[12,159,160,161,164],{},"これまでの経験を生かし、野心的な目標に背中を押されるように、私はチームメイトのAlexander Chueshevとともに原点に立ち返り、システムを再考しました。目指したのは、",[31,162,163],{},"高い協調性と組み合わせ可能性を備え、AI開発の効率に最適化された","ソリューションです。",[12,166,167],{},"この新しいイテレーションでは、LangGraphの低レベルな実装の詳細を隠し、開発者がノードやエッジに煩わされないようにしたいと考えました。システムが話すべきなのは開発者の言語、つまりエージェントを中心に据えたAIエンジニアリングの言語です。",[12,169,170],{},"AI開発における思考の単位は、モデルを呼び出したりツールを実行したりするノードではなく、エージェントであることは明らかでした。前回のイテレーションから得た教訓をもとに、新しいフレームワークは次の3つの柱で構成することに決めました。",[172,173,174,179,184],"ol",{},[28,175,176],{},[31,177,178],{},"コンポーネント",[28,180,181],{},[31,182,183],{},"ルーター",[28,185,186],{},[31,187,188],{},"共有状態構造",[12,190,191],{},"これらをうまく設計できれば、ユーザーが構築したいと考えるあらゆるAIフローに対応できる柔軟なフレームワークになると確信していました。",[193,194,196],"h3",{"id":195},"柱1-aiエンジニアリングのプリミティブをコンポーネント化","柱1 AIエンジニアリングのプリミティブをコンポーネント化",[12,198,199,201],{},[31,200,178],{},"は、Flow Registryの中心となる最も重要な柱です。対象となるのは、エージェント、ヒューマンインザループのチェックポイント、固定ロジックのステップといった共通のプリミティブ。この柱によって、抽象化レベルがAIエンジニアリング分野で使われる用語に合わせて引き上げられました。コンポーネントのおかげで、エージェントビルダーはこれらのプリミティブを一から再実装する必要がなくなり、次の例のようなYAMLスニペットで宣言するだけで済みます。",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-yaml shiki shiki-themes github-light","     - type: AgentComponent\n        name: \"developer_agent\"\n        prompt_id: \"developer_agent_prompt\"\n        inputs:\n          - from: \"context:goal\"\n            as: \"goal\"\n          - from: \"context:project_id\"\n            as: \"project_id\"\n        toolset:\n          - \"read_file\"\n          - \"find_files\"\n          - \"edit_file\"\n          - \"run_command\"\n          - \"create_merge_request\"\n","yaml","",[210,211,212,232,243,254,263,277,288,300,310,318,326,334,342,350],"code",{"__ignoreMap":208},[213,214,217,221,225,228],"span",{"class":215,"line":216},"line",1,[213,218,220],{"class":219},"sgsFI","     - ",[213,222,224],{"class":223},"shJU0","type",[213,226,227],{"class":219},": ",[213,229,231],{"class":230},"sYBdl","AgentComponent\n",[213,233,235,238,240],{"class":215,"line":234},2,[213,236,237],{"class":223},"        name",[213,239,227],{"class":219},[213,241,242],{"class":230},"\"developer_agent\"\n",[213,244,246,249,251],{"class":215,"line":245},3,[213,247,248],{"class":223},"        prompt_id",[213,250,227],{"class":219},[213,252,253],{"class":230},"\"developer_agent_prompt\"\n",[213,255,257,260],{"class":215,"line":256},4,[213,258,259],{"class":223},"        inputs",[213,261,262],{"class":219},":\n",[213,264,266,269,272,274],{"class":215,"line":265},5,[213,267,268],{"class":219},"          - ",[213,270,271],{"class":223},"from",[213,273,227],{"class":219},[213,275,276],{"class":230},"\"context:goal\"\n",[213,278,280,283,285],{"class":215,"line":279},6,[213,281,282],{"class":223},"            as",[213,284,227],{"class":219},[213,286,287],{"class":230},"\"goal\"\n",[213,289,291,293,295,297],{"class":215,"line":290},7,[213,292,268],{"class":219},[213,294,271],{"class":223},[213,296,227],{"class":219},[213,298,299],{"class":230},"\"context:project_id\"\n",[213,301,303,305,307],{"class":215,"line":302},8,[213,304,282],{"class":223},[213,306,227],{"class":219},[213,308,309],{"class":230},"\"project_id\"\n",[213,311,313,316],{"class":215,"line":312},9,[213,314,315],{"class":223},"        toolset",[213,317,262],{"class":219},[213,319,321,323],{"class":215,"line":320},10,[213,322,268],{"class":219},[213,324,325],{"class":230},"\"read_file\"\n",[213,327,329,331],{"class":215,"line":328},11,[213,330,268],{"class":219},[213,332,333],{"class":230},"\"find_files\"\n",[213,335,337,339],{"class":215,"line":336},12,[213,338,268],{"class":219},[213,340,341],{"class":230},"\"edit_file\"\n",[213,343,345,347],{"class":215,"line":344},13,[213,346,268],{"class":219},[213,348,349],{"class":230},"\"run_command\"\n",[213,351,353,355],{"class":215,"line":352},14,[213,354,268],{"class":219},[213,356,357],{"class":230},"\"create_merge_request\"\n",[12,359,360,361,364],{},"内部的には、",[31,362,363],{},"AgentComponent","も依然としてLangGraphのグラフの一部であり、その簡略化した構造は下図のとおりです。ただし、実装の複雑さはエージェントビルダーからは隠され、ビルダーはよりなじみのあるプリミティブを扱えるようになりました。同じアーキテクチャ上の境界がもたらすメリットは、フレームワークの保守担当者にとっても大きなもの。基盤となる実装を変更・拡張する自由度が高まり、その変更はフローに透過的に反映されます。",[203,366,370],{"className":367,"code":368,"language":369,"meta":208,"style":208},"language-mermaid shiki shiki-themes github-light","flowchart LR\n    %% External input/output\n    input((inputs\u003Cbr>from\u003Cbr>shared state)) --> LLMCall\n    End --> output((outputs\u003Cbr>to shared state))\n\n    %% Prompts\n    Prompt[\"You are expert\u003Cbr>software\u003Cbr>engineer ...\"] --> LLMCall\n    subgraph Prompts\n        direction TB\n        style Prompts stroke-dasharray: 4 4, stroke:#3CB371\n        Prompt\n    end\n\n    %% LLM and internal component\n    LLMCall --> End\n    LLMCall --> RunTools\n    RunTools --> LLMCall\n\n    subgraph Component\n        direction LR\n        LLMCall[LLM Call]\n        RunTools[Run Tools]\n        End[END]\n    end\n\n    %% Tools\n    EditFile --> RunTools\n    ReadFile --> RunTools\n\n    subgraph Tools\n        direction LR\n        style Tools stroke-dasharray: 4 4, stroke:#1E90FF\n        EditFile[Edit file]\n        ReadFile[Read file]\n    end\n","mermaid",[210,371,372,377,382,387,392,398,403,408,413,418,423,428,433,437,442,448,454,460,465,471,477,483,489,495,500,505,511,517,523,528,534,539,545,551,557],{"__ignoreMap":208},[213,373,374],{"class":215,"line":216},[213,375,376],{"class":219},"flowchart LR\n",[213,378,379],{"class":215,"line":234},[213,380,381],{"class":219},"    %% External input/output\n",[213,383,384],{"class":215,"line":245},[213,385,386],{"class":219},"    input((inputs\u003Cbr>from\u003Cbr>shared state)) --> LLMCall\n",[213,388,389],{"class":215,"line":256},[213,390,391],{"class":219},"    End --> output((outputs\u003Cbr>to shared state))\n",[213,393,394],{"class":215,"line":265},[213,395,397],{"emptyLinePlaceholder":396},true,"\n",[213,399,400],{"class":215,"line":279},[213,401,402],{"class":219},"    %% Prompts\n",[213,404,405],{"class":215,"line":290},[213,406,407],{"class":219},"    Prompt[\"You are expert\u003Cbr>software\u003Cbr>engineer ...\"] --> LLMCall\n",[213,409,410],{"class":215,"line":302},[213,411,412],{"class":219},"    subgraph Prompts\n",[213,414,415],{"class":215,"line":312},[213,416,417],{"class":219},"        direction TB\n",[213,419,420],{"class":215,"line":320},[213,421,422],{"class":219},"        style Prompts stroke-dasharray: 4 4, stroke:#3CB371\n",[213,424,425],{"class":215,"line":328},[213,426,427],{"class":219},"        Prompt\n",[213,429,430],{"class":215,"line":336},[213,431,432],{"class":219},"    end\n",[213,434,435],{"class":215,"line":344},[213,436,397],{"emptyLinePlaceholder":396},[213,438,439],{"class":215,"line":352},[213,440,441],{"class":219},"    %% LLM and internal component\n",[213,443,445],{"class":215,"line":444},15,[213,446,447],{"class":219},"    LLMCall --> End\n",[213,449,451],{"class":215,"line":450},16,[213,452,453],{"class":219},"    LLMCall --> RunTools\n",[213,455,457],{"class":215,"line":456},17,[213,458,459],{"class":219},"    RunTools --> LLMCall\n",[213,461,463],{"class":215,"line":462},18,[213,464,397],{"emptyLinePlaceholder":396},[213,466,468],{"class":215,"line":467},19,[213,469,470],{"class":219},"    subgraph Component\n",[213,472,474],{"class":215,"line":473},20,[213,475,476],{"class":219},"        direction LR\n",[213,478,480],{"class":215,"line":479},21,[213,481,482],{"class":219},"        LLMCall[LLM Call]\n",[213,484,486],{"class":215,"line":485},22,[213,487,488],{"class":219},"        RunTools[Run Tools]\n",[213,490,492],{"class":215,"line":491},23,[213,493,494],{"class":219},"        End[END]\n",[213,496,498],{"class":215,"line":497},24,[213,499,432],{"class":219},[213,501,503],{"class":215,"line":502},25,[213,504,397],{"emptyLinePlaceholder":396},[213,506,508],{"class":215,"line":507},26,[213,509,510],{"class":219},"    %% Tools\n",[213,512,514],{"class":215,"line":513},27,[213,515,516],{"class":219},"    EditFile --> RunTools\n",[213,518,520],{"class":215,"line":519},28,[213,521,522],{"class":219},"    ReadFile --> RunTools\n",[213,524,526],{"class":215,"line":525},29,[213,527,397],{"emptyLinePlaceholder":396},[213,529,531],{"class":215,"line":530},30,[213,532,533],{"class":219},"    subgraph Tools\n",[213,535,537],{"class":215,"line":536},31,[213,538,476],{"class":219},[213,540,542],{"class":215,"line":541},32,[213,543,544],{"class":219},"        style Tools stroke-dasharray: 4 4, stroke:#1E90FF\n",[213,546,548],{"class":215,"line":547},33,[213,549,550],{"class":219},"        EditFile[Edit file]\n",[213,552,554],{"class":215,"line":553},34,[213,555,556],{"class":219},"        ReadFile[Read file]\n",[213,558,560],{"class":215,"line":559},35,[213,561,432],{"class":219},[12,563,564],{},"サブエージェントに作業を委任できる「コンポーネントとしてのエージェント」は、柱1だけで実現できる強力な基盤。現在の多くのエージェントプラットフォームでは、これだけで完結した十分な機能と見なされています。しかし、GitLabはDuo Agent Platformにより大きな目標を掲げており、Flow Registryは残る2つの柱でそれを実現しています。",[193,566,568],{"id":567},"柱2-ルーターでコンポーネントをフローとしてオーケストレーション","柱2 ルーターでコンポーネントをフローとしてオーケストレーション",[12,570,571,572,574,575,578,579,582],{},"Flow Registryの",[31,573,183],{},"を使うと、エージェントビルダーは",[31,576,577],{},"複数の専門エージェント","、さらにはエージェントチームを",[31,580,581],{},"1つのフローにオーケストレーション","し、非常に複雑なビジネスプロセスやソフトウェア開発プロセスをモデル化できます。現在の最大規模のモデルは単独でも複雑なタスクをこなせるほど強力ですが、最近のサブエージェントアーキテクチャの普及が示すように、複数のエージェントを組み合わせて1つのタスクに協力して取り組ませることには多くのメリットがあります。",[12,584,585,586,590,591,594],{},"実践的な",[15,587,124],{"href":588,"rel":589},"https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/-/blob/7ecb96f6c7b2865b0e401eec6f1264900ed49525/duo_workflow_service/agent_platform/v1/flows/configs/fix_pipeline/1.0.0.yml#L371",[],"として、GitLabの基本フローの1つである",[31,592,593],{},"CI/CDパイプライン修正フロー","を見てみましょう。このフローは、失敗したCIパイプラインを自動トリガーでトリアージし、修正するための構成。CIパイプラインは非常に複雑になりうるため、すべての失敗がコードの変更で解決されるわけではありません。たとえば依存先のサービスが一時的に応答していないだけなら、単純にリトライすれば解決することも。こうした2通りの対応に備えるため、フローは判定役のエージェントの判断に基づいて早い段階で分岐します。判定エージェントが「失敗は対処が必要なものか」を裁定し、Flow Registryのルーターがその結果をもとにフローの実行を適切なブランチへ導く仕組みです。",[203,596,598],{"className":205,"code":597,"language":207,"meta":208,"style":208},"routers:\n - from: \"fix_pipeline_context\"\n    condition:\n      input: \"context:fix_pipeline_context.final_answer.decision\"\n      routes:\n        \"add_comment\": \"fix_pipeline_add_comment\"\n        \"create_plan\": \"fix_pipeline_checkout_existing_branch\"\n        \"direct_code_suggestions\": \"fix_pipeline_code_suggestions\"\n        \"no_action\": \"end\"\n        \"default_route\": \"end\"\n",[210,599,600,607,619,626,636,643,653,663,673,683],{"__ignoreMap":208},[213,601,602,605],{"class":215,"line":216},[213,603,604],{"class":223},"routers",[213,606,262],{"class":219},[213,608,609,612,614,616],{"class":215,"line":234},[213,610,611],{"class":219}," - ",[213,613,271],{"class":223},[213,615,227],{"class":219},[213,617,618],{"class":230},"\"fix_pipeline_context\"\n",[213,620,621,624],{"class":215,"line":245},[213,622,623],{"class":223},"    condition",[213,625,262],{"class":219},[213,627,628,631,633],{"class":215,"line":256},[213,629,630],{"class":223},"      input",[213,632,227],{"class":219},[213,634,635],{"class":230},"\"context:fix_pipeline_context.final_answer.decision\"\n",[213,637,638,641],{"class":215,"line":265},[213,639,640],{"class":223},"      routes",[213,642,262],{"class":219},[213,644,645,648,650],{"class":215,"line":279},[213,646,647],{"class":230},"        \"add_comment\"",[213,649,227],{"class":219},[213,651,652],{"class":230},"\"fix_pipeline_add_comment\"\n",[213,654,655,658,660],{"class":215,"line":290},[213,656,657],{"class":230},"        \"create_plan\"",[213,659,227],{"class":219},[213,661,662],{"class":230},"\"fix_pipeline_checkout_existing_branch\"\n",[213,664,665,668,670],{"class":215,"line":302},[213,666,667],{"class":230},"        \"direct_code_suggestions\"",[213,669,227],{"class":219},[213,671,672],{"class":230},"\"fix_pipeline_code_suggestions\"\n",[213,674,675,678,680],{"class":215,"line":312},[213,676,677],{"class":230},"        \"no_action\"",[213,679,227],{"class":219},[213,681,682],{"class":230},"\"end\"\n",[213,684,685,688,690],{"class":215,"line":320},[213,686,687],{"class":230},"        \"default_route\"",[213,689,227],{"class":219},[213,691,682],{"class":230},[12,693,694],{},"確かに、最先端のモデルであれば同様の判断を下し、同時にそれを実行に移すことも可能なはずです。それでもマルチエージェントアーキテクチャを採用することで、エージェントビルダーは次のようなメリットを得られます。",[172,696,697,700,703],{},[28,698,699],{},"最大規模で高価なモデルを、より小さく安価なモデルに置き換えられます。1日に数百回実行される高頻度の自動化フローでは、このコストメリットが積み重なって大きな差になります。",[28,701,702],{},"役割分担によってセキュリティ対策状況が向上します。読み取り権限と書き込み権限を、別々のエージェントに分けられるためです。",[28,704,705],{},"ワークフローが事前にわかっている場合はプロセスのガードレールを適用でき、構造化されたタスクでモデルの判断に頼る度合いを減らせます。",[12,707,708],{},"柱2によって、エージェントビルダーは選択肢を得られます。強力なモデルでシンプルなフロー構成を採用するか、モデルのプロンプトが担っていた複雑さを明示的なフロー構造へと移すか。幅広いユースケース、コスト目標、リスクプロファイルに対応できる柔軟性です。",[193,710,712],{"id":711},"柱3-共有状態構造","柱3 共有状態構造",[12,714,715,716,719,720,722,723,725],{},"Flow Registryの3つ目にして最後の柱は、コンポーネント間の",[31,717,718],{},"通信プロトコル","として機能する",[31,721,188],{},"です。これがなければコンポーネントどうしが確実にやり取りする手段がなく、先の2つの柱も機能しません。",[31,724,593],{},"の例に戻って考えてみてください。判定エージェントの裁定も、Flow Registryのルーターに確実に渡せなければほとんど意味がありません。より広く見ても、あるエージェントが生成したデータは後続のエージェントで必要になることが多く、明確に定義された通信契約が欠かせないのです。",[12,727,728,729,733,734,736,737,739,740,745],{},"Flow Registryの状態構造には",[730,731,732],"em",{},"context","という特別な汎用属性があり、ネストされたキーバリューストア（またはJSONオブジェクト）のように、コンポーネントへ柔軟なストレージ領域を提供します。さらに、",[730,735,732],{},"属性の柔軟性を補完するため、ドット記法による",[730,738,732],{},"への宣言的なアクセスも導入。共有キーバリューストレージへのアクセスを静的な設定内で表現する必要がある他の分野（",[15,741,744],{"href":742,"rel":743},"https://docs.gitlab.com/ja-jp/ci/functions/#expression-syntax",[],"GitLab CI Functions","など）でもおなじみの規約です。",[12,747,748,749,752,753,758],{},"3つ目の柱を完成させるには、規約が欠かせません。Flow Registryでは、先ほどのドット記法を使って共有状態から柔軟に読み取りを行えますが、書き込みはすべて厳格なルールに従います。その結果として得られるのが、エージェントビルダーが信頼できる、安定した予測可能な出力。実際の動作を確認するため、もう1つの基本フローである",[31,750,751],{},"コードレビュー","のFlow Registry",[15,754,757],{"href":755,"rel":756},"https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/-/blob/6276bda602e39c947b09a6549f104327ec91fb78/duo_workflow_service/agent_platform/v1/flows/configs/code_review/1.0.0.yml#L77",[],"設定","の一部を見てみましょう。",[203,760,762],{"className":205,"code":761,"language":207,"meta":208,"style":208},"# …\n\n # Step 5: Fetch lightweight MR metadata (file paths + custom instructions)\n  - name: \"fetch_mr_metadata\"\n    type: DeterministicStepComponent\n    tool_name: \"build_review_merge_request_context\"\n\n# ….\n\n  # Step 6: Transform prescan results into structured JSON for review consumption\n  - name: \"analyze_prescan_results\"\n    type: AgentComponent\n    prompt_id: \"analyze_prescan_codebase_results\"\n    prompt_version: \"^1.0.0\"\n    inputs:\n      - from: \"context:fetch_mr_metadata.tool_responses\"\n        as: \"mr_context\"\n      - from: \"context:prescan_codebase.tool_responses\"\n        as: \"prescan_tool_responses\"\n        optional: True\n    toolset: []\n    ui_log_events:\n      - \"on_agent_final_answer\"\n\n# …..\n\nrouters:\n #  ….\n  - from: \"fetch_mr_metadata\"\n    to: \"analyze_prescan_results\"\n",[210,763,764,770,774,779,792,802,812,816,821,825,830,841,849,859,869,876,888,898,909,918,929,937,944,951,955,960,964,970,975,985],{"__ignoreMap":208},[213,765,766],{"class":215,"line":216},[213,767,769],{"class":768},"sAwPA","# …\n",[213,771,772],{"class":215,"line":234},[213,773,397],{"emptyLinePlaceholder":396},[213,775,776],{"class":215,"line":245},[213,777,778],{"class":768}," # Step 5: Fetch lightweight MR metadata (file paths + custom instructions)\n",[213,780,781,784,787,789],{"class":215,"line":256},[213,782,783],{"class":219},"  - ",[213,785,786],{"class":223},"name",[213,788,227],{"class":219},[213,790,791],{"class":230},"\"fetch_mr_metadata\"\n",[213,793,794,797,799],{"class":215,"line":265},[213,795,796],{"class":223},"    type",[213,798,227],{"class":219},[213,800,801],{"class":230},"DeterministicStepComponent\n",[213,803,804,807,809],{"class":215,"line":279},[213,805,806],{"class":223},"    tool_name",[213,808,227],{"class":219},[213,810,811],{"class":230},"\"build_review_merge_request_context\"\n",[213,813,814],{"class":215,"line":290},[213,815,397],{"emptyLinePlaceholder":396},[213,817,818],{"class":215,"line":302},[213,819,820],{"class":768},"# ….\n",[213,822,823],{"class":215,"line":312},[213,824,397],{"emptyLinePlaceholder":396},[213,826,827],{"class":215,"line":320},[213,828,829],{"class":768},"  # Step 6: Transform prescan results into structured JSON for review consumption\n",[213,831,832,834,836,838],{"class":215,"line":328},[213,833,783],{"class":219},[213,835,786],{"class":223},[213,837,227],{"class":219},[213,839,840],{"class":230},"\"analyze_prescan_results\"\n",[213,842,843,845,847],{"class":215,"line":336},[213,844,796],{"class":223},[213,846,227],{"class":219},[213,848,231],{"class":230},[213,850,851,854,856],{"class":215,"line":344},[213,852,853],{"class":223},"    prompt_id",[213,855,227],{"class":219},[213,857,858],{"class":230},"\"analyze_prescan_codebase_results\"\n",[213,860,861,864,866],{"class":215,"line":352},[213,862,863],{"class":223},"    prompt_version",[213,865,227],{"class":219},[213,867,868],{"class":230},"\"^1.0.0\"\n",[213,870,871,874],{"class":215,"line":444},[213,872,873],{"class":223},"    inputs",[213,875,262],{"class":219},[213,877,878,881,883,885],{"class":215,"line":450},[213,879,880],{"class":219},"      - ",[213,882,271],{"class":223},[213,884,227],{"class":219},[213,886,887],{"class":230},"\"context:fetch_mr_metadata.tool_responses\"\n",[213,889,890,893,895],{"class":215,"line":456},[213,891,892],{"class":223},"        as",[213,894,227],{"class":219},[213,896,897],{"class":230},"\"mr_context\"\n",[213,899,900,902,904,906],{"class":215,"line":462},[213,901,880],{"class":219},[213,903,271],{"class":223},[213,905,227],{"class":219},[213,907,908],{"class":230},"\"context:prescan_codebase.tool_responses\"\n",[213,910,911,913,915],{"class":215,"line":467},[213,912,892],{"class":223},[213,914,227],{"class":219},[213,916,917],{"class":230},"\"prescan_tool_responses\"\n",[213,919,920,923,925],{"class":215,"line":473},[213,921,922],{"class":223},"        optional",[213,924,227],{"class":219},[213,926,928],{"class":927},"sYu0t","True\n",[213,930,931,934],{"class":215,"line":479},[213,932,933],{"class":223},"    toolset",[213,935,936],{"class":219},": []\n",[213,938,939,942],{"class":215,"line":485},[213,940,941],{"class":223},"    ui_log_events",[213,943,262],{"class":219},[213,945,946,948],{"class":215,"line":491},[213,947,880],{"class":219},[213,949,950],{"class":230},"\"on_agent_final_answer\"\n",[213,952,953],{"class":215,"line":497},[213,954,397],{"emptyLinePlaceholder":396},[213,956,957],{"class":215,"line":502},[213,958,959],{"class":768},"# …..\n",[213,961,962],{"class":215,"line":507},[213,963,397],{"emptyLinePlaceholder":396},[213,965,966,968],{"class":215,"line":513},[213,967,604],{"class":223},[213,969,262],{"class":219},[213,971,972],{"class":215,"line":519},[213,973,974],{"class":768}," #  ….\n",[213,976,977,979,981,983],{"class":215,"line":525},[213,978,783],{"class":219},[213,980,271],{"class":223},[213,982,227],{"class":219},[213,984,791],{"class":230},[213,986,987,990,992],{"class":215,"line":530},[213,988,989],{"class":223},"    to",[213,991,227],{"class":219},[213,993,840],{"class":230},[12,995,996],{},"コードレビューフローのエージェント analyze_prescan_results は、その前段にある固定ステップのアクション fetch_mr_metadata が取得したデータを必要とします。この依存関係は、analyze_prescan_results エージェントに宣言された inputs によって表現されています。",[203,998,1000],{"className":205,"code":999,"language":207,"meta":208,"style":208},"    inputs:\n      - from: \"context:fetch_mr_metadata.tool_responses\"\n        as: \"mr_context\"\n",[210,1001,1002,1008,1018],{"__ignoreMap":208},[213,1003,1004,1006],{"class":215,"line":216},[213,1005,873],{"class":223},[213,1007,262],{"class":219},[213,1009,1010,1012,1014,1016],{"class":215,"line":234},[213,1011,880],{"class":219},[213,1013,271],{"class":223},[213,1015,227],{"class":219},[213,1017,887],{"class":230},[213,1019,1020,1022,1024],{"class":215,"line":245},[213,1021,892],{"class":223},[213,1023,227],{"class":219},[213,1025,897],{"class":230},[12,1027,1028],{},"このように、ドット記法と厳格な出力規約が連携することで、フロー内のコンポーネント間でデータを受け渡すための安定した予測可能なプロトコルがエージェントビルダーに提供されます。",[60,1030,1032],{"id":1031},"pythonからyamlへ","PythonからYAMLへ",[12,1034,1035,1036,1041],{},"Flow Registryは宣言型のYAML設定を使っていますが、設計と再アーキテクチャはPythonで始め、宣言型の設定APIは将来のイテレーションに先送りしていました。しかし、Flow Registryの3つの柱が1つのPythonブロックの中で",[15,1037,1040],{"href":1038,"rel":1039},"https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/-/blob/59706d3de14db9f0d687420ad00d7662343b6eaa/duo_workflow_service/workflows/issue_to_mr/workflow.py",[],"組み合わさった","とき、それらの宣言をYAML設定に変換するのはあと一歩だと気づき、その一歩を踏み出すことにしたのです。",[12,1043,1044],{},"この変更によって、Flow RegistryフレームワークはPythonとLangGraphから完全に切り離され、宣言的にAIフローを作成するための高レベルな抽象化構文が実現しました。LangGraphを基盤として実装されたままのプラットフォームと、外部に公開されるフレームワークの宣言型インターフェースとの間に明確な境界が生まれ、AIエンジニアはより慣れ親しんだ概念で作業できるようになっています。",[12,1046,1047,1048,1052,1053,1058],{},"GitLab Duo Agent Platformの基盤としてFlow Registryフレームワークを導入したことで、システム全体が、ユースケースごとの素のLangGraph実装から、宣言型のYAML設定へと大きく進化しました。現在本番環境で稼働している",[15,1049,1051],{"href":100,"rel":1050},[],"GitLab Duoデベロッパーフロー","を支える",[15,1054,1057],{"href":1055,"rel":1056},"https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/-/blob/77df7f5aa09cdaa0ae421084d2bc6285e7ebbdee/duo_workflow_service/agent_platform/v1/flows/configs/developer/1.0.0.yml#L115",[],"この設定","も、その一例です。",[12,1060,1061],{},"AIエンジニア向けに設計されたフレームワークAPIからプラットフォームが切り離されたことで、基盤となるPythonコードベースはすべてのフローで共有できるようになりました。エンジン自体に加えた改善はすべてのフローに行き渡るため、明確な分離による効率向上がいっそう際立ちます。",[12,1063,1064,1065,1068],{},"さらに、フローを追加するたびに、フローあたりのコードコストは下がっていきます。本記事の執筆時点で、Flow Registryの導入により",[31,1066,1067],{},"フローあたりのPythonソースコードの比率は45%削減","。この数値は、新しいフローが構築されるたびにさらに改善していきます。",[12,1070,1071,1072,1077],{},"そして何より、AIエンジニアやドメインエキスパートは、基盤となるプラットフォームの実装の詳細を理解する必要も、独自のテストスイートや保守が必要になるボイラープレートのPythonコードを繰り返し書く必要もなくなりました。それを実証したのが、今年初めに開催された",[15,1073,1076],{"href":1074,"rel":1075},"https://about.gitlab.com/ja-jp/blog/gitlab-ai-hackathon-2026-meet-the-winners",[],"GitLab AIハッカソン","。約7,000人の開発者が参加登録し、600以上のエージェントとフローが提出されました。",[60,1079,1080],{"id":1080},"得られた主な教訓",[12,1082,1083],{},"私たちが得た重要な気づきの1つは、現代のAIエンジニアリングがソフトウェア開発の中でもまだ非常に若い分野で、共通のアーキテクチャパターンやパラダイムが十分に形成されていないという点。しかし、だからといって、すでに確立された優れたソフトウェアエンジニアリングのプラクティスをAIエンジニアリングに適用できないわけではありません。むしろFlow Registryの事例が示すとおり、繰り返し現れるコードを特定し、システム内で明確な役割を持つ名前付きエンティティとして抽出し、そこから抽象化レイヤーを形成するといった、既存のソフトウェアエンジニアリングのパラダイムやプラクティスに立ち返ることで、大きな成果が得られるのです。",[12,1085,1086],{},"このほかにも、エージェント型システムを構築するあらゆるチームに広く当てはまる教訓と、LangGraphのような低レベルのフレームワークを扱うチームにとって実践的な出発点となる教訓をいくつかご紹介します。",[193,1088,1089],{"id":1089},"一般的な原則",[172,1091,1092,1095],{},[28,1093,1094],{},"現在のエージェント型フレームワークの中には、非常に強力でありながら、AIエンジニアリングのニーズに対して抽象化レベルが低すぎ、プラットフォームの関心事とエージェント開発が混在してしまうものがあります。",[28,1096,1097],{},"実行プラットフォームをAIエンジニアリングから分離することで、それぞれの分野の専門家がより自信を持って、よりスピーディーに作業できるようになります。",[193,1099,1100],{"id":1100},"低レベルフレームワークのユーザー向けの実践的な出発点",[172,1102,1103,1106],{},[28,1104,1105],{},"AIフローとプラットフォーム実装の分離は、既存のAIフローから繰り返し現れる構造を抽出することから始められます。手始めとしては、エージェント型ループがおすすめです。",[28,1107,1108],{},"キーバリューストアのような属性をデータモデルに導入すれば、柔軟な共有データモデルを実現できます。これは、AI分野以外のオーケストレーションフレームワークでも確立されているパターンです。",[60,1110,1112],{"id":1111},"flow-registryを試してみましょう","Flow Registryを試してみましょう",[12,1114,1115,1116,1121],{},"実際の動作を体感するには、AIカタログにアクセスしてみてください。AIカタログでは、この取り組みから生まれたFlow Registryオーケストレーションフレームワークが公開されており、誰でも",[15,1117,1120],{"href":1118,"rel":1119},"https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/custom/",[],"カスタムフロー","を構築できます。",[12,1123,1124,1129],{},[15,1125,1128],{"href":1126,"rel":1127},"https://about.gitlab.com/ja-jp/gitlab-duo-agent-platform/",[],"GitLab Duo Agent Platformは無料でお試しいただけます","。",[1131,1132,1133],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":208,"searchDepth":234,"depth":234,"links":1135},[1136,1137,1142,1143,1147],{"id":62,"depth":234,"text":63},{"id":156,"depth":234,"text":157,"children":1138},[1139,1140,1141],{"id":195,"depth":245,"text":196},{"id":567,"depth":245,"text":568},{"id":711,"depth":245,"text":712},{"id":1031,"depth":234,"text":1032},{"id":1080,"depth":234,"text":1080,"children":1144},[1145,1146],{"id":1089,"depth":245,"text":1089},{"id":1100,"depth":245,"text":1100},{"id":1111,"depth":234,"text":1112},"engineering","2026-09-22","YAML設定を完全に機能するLangGraphフローへコンパイルするコンポーネントベースのフレームワーク「Flow Registry」によって、GitLabはエージェント型フロー1つあたりのコード量を45%削減し、スケーラビリティや信頼性を高めました。その設計原則と得られた教訓を詳しく解説します。","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png",{},"/ja-jp/blog/how-gitlab-reduced-code-per-agentic-flow-ratio",{"config":1158,"title":5,"description":1150},{"noIndex":1153},"how-gitlab-reduced-code-per-agentic-flow-ratio","ja-jp/blog/how-gitlab-reduced-code-per-agentic-flow-ratio",[1162,1163,1164],"AI","DevSecOps","features","BlogPost","2026-09-24","MpCdAuW_0Z26hxes7noFT57d-d-FpX03yijoCJ6tI5s",{"logo":1169,"freeTrial":1174,"sales":1179,"login":1184,"items":1189,"search":1510,"minimal":1543,"duo":1561,"switchNav":1570,"pricingDeployment":1581},{"config":1170},{"href":1171,"dataGaName":1172,"dataGaLocation":1173},"/ja-jp/","gitlab logo","header",{"text":1175,"config":1176},"無料トライアルを開始",{"href":1177,"dataGaName":1178,"dataGaLocation":1173},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":1180,"config":1181},"デモをリクエスト",{"href":1182,"dataGaName":1183,"dataGaLocation":1173},"/ja-jp/sales/?contact-topic=request-demo","sales",{"text":1185,"config":1186},"サインイン",{"href":1187,"dataGaName":1188,"dataGaLocation":1173},"https://gitlab.com/users/sign_in/","sign in",[1190,1266,1354,1359,1434,1488],{"text":1191,"left":396,"config":1192,"menu":1194},"プラットフォーム",{"dataNavLevelOne":1193},"platform",{"type":1195,"link":1196,"columns":1200,"feature":1255},"lists",{"text":1197,"config":1198},"プラットフォームを詳しく見る",{"href":1199,"dataGaName":1193,"dataGaLocation":1173},"/ja-jp/platform/",[1201,1219,1237],{"title":1202,"items":1203},"実行とワークフロー",[1204,1209,1214],{"text":1205,"config":1206},"CI/CD",{"href":1207,"dataGaLocation":1173,"dataGaName":1208},"/ja-jp/solutions/continuous-integration/","ci/cd",{"text":1210,"config":1211},"ソースコード管理",{"href":1212,"dataGaLocation":1173,"dataGaName":1213},"/ja-jp/solutions/source-code-management/","source code management",{"text":1215,"config":1216},"アジャイルデリバリー",{"href":1217,"dataGaLocation":1173,"dataGaName":1218},"/ja-jp/solutions/agile-delivery/","agile delivery",{"title":1220,"items":1221},"セキュリティとガバナンス",[1222,1227,1232],{"text":1223,"config":1224},"アプリケーションセキュリティテスト",{"href":1225,"dataGaLocation":1173,"dataGaName":1226},"/ja-jp/solutions/application-security-testing/","application security testing",{"text":1228,"config":1229},"ガバナンスとコンプライアンス",{"href":1230,"dataGaLocation":1173,"dataGaName":1231},"/ja-jp/solutions/software-compliance/","governance and compliance",{"text":1233,"config":1234},"サプライチェーンセキュリティ",{"href":1235,"dataGaLocation":1173,"dataGaName":1236},"/ja-jp/solutions/supply-chain/","supply chain security",{"title":1238,"items":1239},"コンテキストとAI",[1240,1245,1250],{"text":1241,"config":1242},"エージェント型オーケストレーション",{"href":1243,"dataGaLocation":1173,"dataGaName":1244},"/ja-jp/gitlab-duo-agent-platform/","agentic orchestration",{"text":1246,"config":1247},"コンテキストグラフ",{"href":1248,"dataGaLocation":1173,"dataGaName":1249},"/ja-jp/gitlab-orbit/","context graph",{"text":1251,"config":1252},"可視性と測定",{"href":1253,"dataGaLocation":1173,"dataGaName":1254},"/ja-jp/solutions/visibility-measurement/","visibility and measurement",{"config":1256,"title":1259,"text":1260,"link":1261},{"background":1257,"textColor":1258},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabが選ばれる理由","ひとつのプラットフォームで、ソフトウェアライフサイクル全体を通じてスピードと制御を両立できます。",{"text":1262,"config":1263},"詳細はこちら",{"href":1264,"dataGaName":1265,"dataGaLocation":1173},"/ja-jp/why-gitlab/","why gitlab",{"text":1267,"left":396,"config":1268,"menu":1270},"ソリューション",{"dataNavLevelOne":1269},"solutions",{"type":1195,"link":1271,"columns":1275,"feature":1345},{"text":1272,"config":1273},"すべてのソリューションを表示",{"href":1274,"dataGaName":1269,"dataGaLocation":1173},"/ja-jp/solutions/",[1276,1294,1312],{"title":1277,"items":1278},"成果",[1279,1284,1289],{"text":1280,"config":1281},"DevOpsモダナイゼーション",{"href":1282,"dataGaLocation":1173,"dataGaName":1283},"/ja-jp/assessments/devops-modernization-assessment/","devops modernization",{"text":1285,"config":1286},"セキュリティモダナイゼーション",{"href":1287,"dataGaLocation":1173,"dataGaName":1288},"/ja-jp/assessments/security-modernization-assessment/","security modernization",{"text":1290,"config":1291},"AIモダナイゼーション",{"href":1292,"dataGaLocation":1173,"dataGaName":1293},"/ja-jp/assessments/ai-modernization-assessment/","ai modernization",{"title":1295,"items":1296},"規模別",[1297,1302,1307],{"text":1298,"config":1299},"エンタープライズ",{"href":1300,"dataGaLocation":1173,"dataGaName":1301},"/ja-jp/enterprise/","enterprise",{"text":1303,"config":1304},"スモールビジネス",{"href":1305,"dataGaLocation":1173,"dataGaName":1306},"/ja-jp/small-business/","small business",{"text":1308,"config":1309},"スタートアップ",{"href":1310,"dataGaLocation":1173,"dataGaName":1311},"/ja-jp/solutions/startups/","startups",{"title":1313,"items":1314},"業界",[1315,1320,1325,1330,1335,1340],{"text":1316,"config":1317},"金融サービス",{"href":1318,"dataGaLocation":1173,"dataGaName":1319},"/ja-jp/solutions/finance/","financial services",{"text":1321,"config":1322},"公共部門",{"href":1323,"dataGaLocation":1173,"dataGaName":1324},"/ja-jp/solutions/public-sector/","public sector",{"text":1326,"config":1327},"通信",{"href":1328,"dataGaLocation":1173,"dataGaName":1329},"/ja-jp/solutions/telecommunications/","telecommunications",{"text":1331,"config":1332},"自動車",{"href":1333,"dataGaLocation":1173,"dataGaName":1334},"/ja-jp/solutions/automotive/","automotive",{"text":1336,"config":1337},"教育",{"href":1338,"dataGaLocation":1173,"dataGaName":1339},"/ja-jp/solutions/education/","education",{"text":1341,"config":1342},"航空宇宙",{"href":1343,"dataGaLocation":1173,"dataGaName":1344},"/ja-jp/solutions/aerospace/","aerospace",{"config":1346,"title":1347,"text":1348,"link":1349},{"background":1257,"textColor":1258},"GitLab Transcend","前回のTranscendで発表された最新のイノベーションをご覧ください。",{"text":1350,"config":1351},"ブログを読む",{"href":1352,"dataGaName":1353,"dataGaLocation":1173},"/ja-jp/blog/gitlab-transcend-announcements/","gitlab transcend",{"text":1355,"config":1356},"価格",{"href":1357,"dataGaName":1358,"dataGaLocation":1173,"dataNavLevelOne":1358},"/ja-jp/pricing/","pricing",{"text":1360,"config":1361,"menu":1363},"関連リソース",{"dataNavLevelOne":1362},"resources",{"type":1195,"link":1364,"columns":1368,"feature":1425},{"text":1365,"config":1366},"すべてのリソースを表示",{"href":1367,"dataGaName":1362,"dataGaLocation":1173},"/ja-jp/resources/",[1369,1397],{"title":1370,"items":1371},"検索する",[1372,1377,1382,1387,1392],{"text":1373,"config":1374},"製品ドキュメント",{"href":1375,"dataGaName":1376,"dataGaLocation":1173},"https://docs.gitlab.com/","docs",{"text":1378,"config":1379},"GitLab University",{"href":1380,"dataGaName":1381,"dataGaLocation":1173},"https://university.gitlab.com/","university",{"text":1383,"config":1384},"技術デモ",{"href":1385,"dataGaName":1386,"dataGaLocation":1173},"/ja-jp/gitlab-technical-demo-series/","demo series",{"text":1388,"config":1389},"インタラクティブデモ",{"href":1390,"dataGaName":1391,"dataGaLocation":1173},"/ja-jp/demo-hub/","demo hub",{"text":1393,"config":1394},"GitLabサービス",{"href":1395,"dataGaName":1396,"dataGaLocation":1173},"/ja-jp/services/","services",{"title":1398,"items":1399},"つなげる",[1400,1405,1410,1415,1420],{"text":1401,"config":1402},"ブログ",{"href":1403,"dataGaName":1404,"dataGaLocation":1173},"/ja-jp/blog/","blog",{"text":1406,"config":1407},"コミュニティ",{"href":1408,"dataGaName":1409,"dataGaLocation":1173},"/community/","community",{"text":1411,"config":1412},"お客様事例",{"href":1413,"dataGaName":1414,"dataGaLocation":1173},"/ja-jp/customers/","customers",{"text":1416,"config":1417},"パートナー",{"href":1418,"dataGaName":1419,"dataGaLocation":1173},"/ja-jp/partners/","partners",{"text":1421,"config":1422},"イベント",{"href":1423,"dataGaName":1424,"dataGaLocation":1173},"/events/","events",{"config":1426,"title":1427,"text":1428,"link":1429},{"background":1257,"textColor":1258},"GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":1430,"config":1431},"最新情報を読む",{"href":1432,"dataGaName":1433,"dataGaLocation":1173},"/ja-jp/whats-new/","whats new",{"text":1435,"config":1436,"menu":1438},"企業情報",{"dataNavLevelOne":1437},"company",{"type":1195,"columns":1439},[1440],{"items":1441},[1442,1447,1453,1458,1463,1468,1473,1478,1483],{"text":1443,"config":1444},"GitLabについて",{"href":1445,"dataGaName":1446,"dataGaLocation":1173},"/ja-jp/company/","about",{"text":1448,"config":1449,"footerGa":1452},"採用情報",{"href":1450,"dataGaName":1451,"dataGaLocation":1173},"/jobs/","jobs",{"dataGaName":1451},{"text":1454,"config":1455},"プレス",{"href":1456,"dataGaName":1457,"dataGaLocation":1173},"/press/","press",{"text":1459,"config":1460},"ハンドブック",{"href":1461,"dataGaName":1462,"dataGaLocation":1173},"https://handbook.gitlab.com/","handbook",{"text":1464,"config":1465},"経営陣",{"href":1466,"dataGaName":1467,"dataGaLocation":1173},"/company/team/e-group/","leadership",{"text":1469,"config":1470},"投資家向け情報",{"href":1471,"dataGaName":1472,"dataGaLocation":1173},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1474,"config":1475},"トラストセンター",{"href":1476,"dataGaName":1477,"dataGaLocation":1173},"/ja-jp/security/","trust center",{"text":1479,"config":1480},"AI Transparency Center",{"href":1481,"dataGaName":1482,"dataGaLocation":1173},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":1484,"config":1485},"ニュースレター",{"href":1486,"dataGaName":1487,"dataGaLocation":1173},"/company/contact/#contact-forms","newsletter",{"text":1489,"config":1490,"menu":1491},"お問い合わせ",{"dataNavLevelOne":1437},{"type":1195,"columns":1492},[1493],{"items":1494},[1495,1500,1505],{"text":1496,"config":1497},"お問い合わせはこちら",{"href":1498,"dataGaName":1499,"dataGaLocation":1173},"/ja-jp/sales/","talk to sales",{"text":1501,"config":1502},"サポートポータル",{"href":1503,"dataGaName":1504,"dataGaLocation":1173},"https://support.gitlab.com/hc/en-us","support portal",{"text":1506,"config":1507},"カスタマーポータル",{"href":1508,"dataGaName":1509,"dataGaLocation":1173},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1511,"login":1512,"suggestions":1519},"閉じる",{"text":1513,"link":1514},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":1515,"config":1516},"GitLab.com",{"href":1187,"dataGaName":1517,"dataGaLocation":1518},"search login","search",{"text":1520,"default":1521},"提案",[1522,1524,1529,1531,1535,1539],{"text":19,"config":1523},{"href":1243,"dataGaName":19,"dataGaLocation":1518},{"text":1525,"config":1526},"コード提案（AI）",{"href":1527,"dataGaName":1528,"dataGaLocation":1518},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1205,"config":1530},{"href":1207,"dataGaName":1205,"dataGaLocation":1518},{"text":1532,"config":1533},"GitLab on AWS",{"href":1534,"dataGaName":1532,"dataGaLocation":1518},"/ja-jp/partners/technology-partners/aws/",{"text":1536,"config":1537},"GitLab on Google Cloud",{"href":1538,"dataGaName":1536,"dataGaLocation":1518},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":1540,"config":1541},"GitLabを選ぶ理由",{"href":1264,"dataGaName":1542,"dataGaLocation":1518},"Why GitLab?",{"freeTrial":1544,"mobileIcon":1548,"desktopIcon":1553,"secondaryButton":1556},{"text":1175,"config":1545},{"href":1546,"dataGaName":1178,"dataGaLocation":1547},"https://gitlab.com/-/trials/new/","nav",{"altText":1549,"config":1550},"GitLabアイコン",{"src":1551,"dataGaName":1552,"dataGaLocation":1547},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1549,"config":1554},{"src":1555,"dataGaName":1552,"dataGaLocation":1547},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1557,"config":1558},"はじめに",{"href":1559,"dataGaName":1560,"dataGaLocation":1547},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":1562,"mobileIcon":1566,"desktopIcon":1568},{"text":1563,"config":1564},"GitLab Duoの詳細はこちら",{"href":1243,"dataGaName":1565,"dataGaLocation":1547},"gitlab duo",{"altText":1549,"config":1567},{"src":1551,"dataGaName":1552,"dataGaLocation":1547},{"altText":1549,"config":1569},{"src":1555,"dataGaName":1552,"dataGaLocation":1547},{"button":1571,"mobileIcon":1576,"desktopIcon":1578},{"text":1572,"config":1573},"/switch",{"href":1574,"dataGaName":1575,"dataGaLocation":1547},"#contact","switch",{"altText":1549,"config":1577},{"src":1551,"dataGaName":1552,"dataGaLocation":1547},{"altText":1549,"config":1579},{"src":1580,"dataGaName":1552,"dataGaLocation":1547},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1582,"mobileIcon":1587,"desktopIcon":1589},{"text":1583,"config":1584},"料金ページに戻る",{"href":1357,"dataGaName":1585,"dataGaLocation":1547,"icon":1586},"back to pricing","GoBack",{"altText":1549,"config":1588},{"src":1551,"dataGaName":1552,"dataGaLocation":1547},{"altText":1549,"config":1590},{"src":1555,"dataGaName":1552,"dataGaLocation":1547},{"title":1592,"titleMobile":1593,"button":1594,"config":1600},"【10月9日開催】AI駆動開発の最前線を、日本企業8社の実例から学ぶ","10月9日開催｜AI駆動開発の最前線を学ぶ",{"text":1595,"config":1596},"無料で申し込む",{"href":1597,"dataGaName":1598,"dataGaLocation":1599},"https://www.bs-event.jp/gitlab-epic-tour-japan-2026/?r=gitLab-page","epic-tour-japan-2026-banner","global-banner",{"layout":1601,"disabled":1153},"release",{"data":1603},{"text":1604,"source":1605,"edit":1611,"contribute":1616,"config":1621,"items":1626,"minimal":1846},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":1606,"config":1607},"ページのソースを表示",{"href":1608,"dataGaName":1609,"dataGaLocation":1610},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1612,"config":1613},"このページを編集",{"href":1614,"dataGaName":1615,"dataGaLocation":1610},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1617,"config":1618},"ご協力をお願いします",{"href":1619,"dataGaName":1620,"dataGaLocation":1610},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1622,"facebook":1623,"youtube":1624,"linkedin":1625},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1627,1673,1727,1770,1813],{"title":1355,"links":1628,"subMenu":1643},[1629,1633,1638],{"text":1630,"config":1631},"プランの表示",{"href":1357,"dataGaName":1632,"dataGaLocation":1610},"view plans",{"text":1634,"config":1635},"Premiumを選ぶ理由",{"href":1636,"dataGaName":1637,"dataGaLocation":1610},"/ja-jp/pricing/premium/","why premium",{"text":1639,"config":1640},"Ultimateを選ぶ理由",{"href":1641,"dataGaName":1642,"dataGaLocation":1610},"/ja-jp/pricing/ultimate/","why ultimate",[1644],{"title":1489,"links":1645},[1646,1649,1651,1653,1658,1663,1668],{"text":1647,"config":1648},"営業担当へのお問い合わせ",{"href":1498,"dataGaName":1183,"dataGaLocation":1610},{"text":1501,"config":1650},{"href":1503,"dataGaName":1504,"dataGaLocation":1610},{"text":1506,"config":1652},{"href":1508,"dataGaName":1509,"dataGaLocation":1610},{"text":1654,"config":1655},"ステータス",{"href":1656,"dataGaName":1657,"dataGaLocation":1610},"https://status.gitlab.com/","status",{"text":1659,"config":1660},"利用規約",{"href":1661,"dataGaName":1662,"dataGaLocation":1610},"/terms/","terms of use",{"text":1664,"config":1665},"プライバシーに関する声明",{"href":1666,"dataGaName":1667,"dataGaLocation":1610},"/ja-jp/privacy/","privacy statement",{"text":1669,"config":1670},"Cookie設定",{"dataGaName":1671,"dataGaLocation":1610,"id":1672,"isOneTrustButton":396},"cookie preferences","ot-sdk-btn",{"title":1191,"links":1674,"subMenu":1685},[1675,1677,1679,1681,1683],{"text":1197,"config":1676},{"href":1199,"dataGaName":1193,"dataGaLocation":1610},{"text":1241,"config":1678},{"href":1243,"dataGaName":1244,"dataGaLocation":1610},{"text":1205,"config":1680},{"href":1207,"dataGaName":1208,"dataGaLocation":1610},{"text":1246,"config":1682},{"href":1248,"dataGaName":1249,"dataGaLocation":1610},{"text":1259,"config":1684},{"href":1264,"dataGaName":1265,"dataGaLocation":1610},[1686],{"title":1687,"links":1688},"トピック",[1689,1693,1698,1703,1708,1712,1717,1722],{"text":1205,"config":1690},{"href":1691,"dataGaName":1692,"dataGaLocation":1610},"/ja-jp/topics/ci-cd/","cicd",{"text":1694,"config":1695},"GitOps",{"href":1696,"dataGaName":1697,"dataGaLocation":1610},"/ja-jp/topics/gitops/","gitops",{"text":1699,"config":1700},"DevOps",{"href":1701,"dataGaName":1702,"dataGaLocation":1610},"/ja-jp/topics/devops/","devops",{"text":1704,"config":1705},"バージョン管理",{"href":1706,"dataGaName":1707,"dataGaLocation":1610},"/ja-jp/topics/version-control/","version control",{"text":1163,"config":1709},{"href":1710,"dataGaName":1711,"dataGaLocation":1610},"/ja-jp/topics/devsecops/","devsecops",{"text":1713,"config":1714},"クラウドネイティブ",{"href":1715,"dataGaName":1716,"dataGaLocation":1610},"/ja-jp/topics/cloud-native/","cloud native",{"text":1718,"config":1719},"コーディングのためのAI",{"href":1720,"dataGaName":1721,"dataGaLocation":1610},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":1723,"config":1724},"エージェント型AI",{"href":1725,"dataGaName":1726,"dataGaLocation":1610},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":1267,"links":1728},[1729,1731,1733,1735,1737,1740,1742,1744,1746,1748,1750,1752,1754,1757,1761,1766],{"text":1280,"config":1730},{"href":1282,"dataGaName":1283,"dataGaLocation":1610},{"text":1285,"config":1732},{"href":1287,"dataGaName":1288,"dataGaLocation":1610},{"text":1290,"config":1734},{"href":1292,"dataGaName":1293,"dataGaLocation":1610},{"text":1316,"config":1736},{"href":1318,"dataGaName":1319,"dataGaLocation":1610},{"text":1738,"config":1739},"公共機関",{"href":1323,"dataGaName":1324,"dataGaLocation":1610},{"text":1326,"config":1741},{"href":1328,"dataGaName":1329,"dataGaLocation":1610},{"text":1331,"config":1743},{"href":1333,"dataGaName":1334,"dataGaLocation":1610},{"text":1336,"config":1745},{"href":1338,"dataGaName":1339,"dataGaLocation":1610},{"text":1341,"config":1747},{"href":1343,"dataGaName":1344,"dataGaLocation":1610},{"text":1298,"config":1749},{"href":1300,"dataGaName":1301,"dataGaLocation":1610},{"text":1303,"config":1751},{"href":1305,"dataGaName":1306,"dataGaLocation":1610},{"text":1308,"config":1753},{"href":1310,"dataGaName":1311,"dataGaLocation":1610},{"text":1694,"config":1755},{"href":1756,"dataGaName":1697,"dataGaLocation":1610},"/ja-jp/solutions/gitops/",{"text":1758,"config":1759},"ソフトウェアコンポジション解析",{"href":1235,"dataGaName":1760,"dataGaLocation":1610},"software composition analysis",{"text":1762,"config":1763},"バリューストリーム管理",{"href":1764,"dataGaName":1765,"dataGaLocation":1610},"/ja-jp/solutions/value-stream-management/","value stream management",{"text":1767,"config":1768},"すべてのソリューション",{"href":1274,"dataGaName":1769,"dataGaLocation":1610},"all solutions",{"title":1771,"links":1772},"リソース",[1773,1778,1783,1786,1788,1790,1792,1794,1796,1798,1800,1802,1804,1806,1809],{"text":1774,"config":1775},"インストール",{"href":1776,"dataGaName":1777,"dataGaLocation":1610},"/ja-jp/install/","install",{"text":1779,"config":1780},"クイックスタートガイド",{"href":1781,"dataGaName":1782,"dataGaLocation":1610},"/ja-jp/get-started/","quick setup checklists",{"text":1373,"config":1784},{"href":1785,"dataGaName":1376,"dataGaLocation":1610},"https://docs.gitlab.com/ja-jp",{"text":1378,"config":1787},{"href":1380,"dataGaName":1381,"dataGaLocation":1610},{"text":1383,"config":1789},{"href":1385,"dataGaName":1386,"dataGaLocation":1610},{"text":1388,"config":1791},{"href":1390,"dataGaName":1391,"dataGaLocation":1610},{"text":1393,"config":1793},{"href":1395,"dataGaName":1396,"dataGaLocation":1610},{"text":1401,"config":1795},{"href":1403,"dataGaName":1404,"dataGaLocation":1610},{"text":1406,"config":1797},{"href":1408,"dataGaName":1409,"dataGaLocation":1610},{"text":1411,"config":1799},{"href":1413,"dataGaName":1414,"dataGaLocation":1610},{"text":1416,"config":1801},{"href":1418,"dataGaName":1419,"dataGaLocation":1610},{"text":1421,"config":1803},{"href":1423,"dataGaName":1424,"dataGaLocation":1610},{"text":1484,"config":1805},{"href":1486,"dataGaName":1487,"dataGaLocation":1610},{"text":1807,"config":1808},"最新リリース",{"href":1432,"dataGaName":1433,"dataGaLocation":1610},{"text":1810,"config":1811},"すべてのリソース",{"href":1367,"dataGaName":1812,"dataGaLocation":1610},"all resources",{"title":1814,"links":1815},"会社情報",[1816,1818,1820,1822,1824,1826,1828,1830,1832,1836,1841],{"text":1443,"config":1817},{"href":1445,"dataGaName":1437,"dataGaLocation":1610},{"text":1448,"config":1819},{"href":1450,"dataGaName":1451,"dataGaLocation":1610},{"text":1454,"config":1821},{"href":1456,"dataGaName":1457,"dataGaLocation":1610},{"text":1459,"config":1823},{"href":1461,"dataGaName":1462,"dataGaLocation":1610},{"text":1464,"config":1825},{"href":1466,"dataGaName":1467,"dataGaLocation":1610},{"text":1469,"config":1827},{"href":1471,"dataGaName":1472,"dataGaLocation":1610},{"text":1474,"config":1829},{"href":1476,"dataGaName":1477,"dataGaLocation":1610},{"text":1479,"config":1831},{"href":1481,"dataGaName":1482,"dataGaLocation":1610},{"text":1833,"config":1834},"Sustainability",{"href":1835,"dataGaName":1833,"dataGaLocation":1610},"/sustainability/",{"text":1837,"config":1838},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":1839,"dataGaName":1840,"dataGaLocation":1610},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1842,"config":1843},"現代奴隷制の透明性に関する声明",{"href":1844,"dataGaName":1845,"dataGaLocation":1610},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1847},[1848,1850,1852],{"text":1659,"config":1849},{"href":1661,"dataGaName":1662,"dataGaLocation":1610},{"text":1669,"config":1851},{"dataGaName":1671,"dataGaLocation":1610,"id":1672,"isOneTrustButton":396},{"text":1664,"config":1853},{"href":1666,"dataGaName":1667,"dataGaLocation":1610},[1855],{"id":1856,"title":7,"body":1152,"config":1857,"content":1859,"description":1152,"extension":1864,"meta":1865,"navigation":396,"path":1866,"seo":1867,"stem":1868,"__hash__":1869},"blogAuthors/en-us/blog/authors/mikolaj-wawrzyniak.yml",{"template":1858},"BlogAuthor",{"name":7,"config":1860},{"headshot":1861,"socialProof":1862},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1783429341/c9wg6qivdwt4zyirhzdg.png",{"gitlabHandle":1863},"mikolaj_wawrzyniak","yml",{},"/en-us/blog/authors/mikolaj-wawrzyniak",{},"en-us/blog/authors/mikolaj-wawrzyniak","qkE5HNDno9DueXh4uE9olnptvYtZ2L2mxuQu-yr3-po",[1871,1879,1888],{"title":1872,"description":1873,"heroImage":1874,"category":1148,"date":1875,"authors":1876,"slug":1878,"externalUrl":1152},"650人超が生んだ4,874件の改善、GitLab Co-Createの半年","GitLabユーザーが開発チームと共同で、2026年上半期に実現した実用的なプロダクト改善をご紹介します。","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-09-10",[1877],"Isa Huerga","co-create-h1-2026",{"title":1880,"description":1881,"heroImage":1882,"category":1148,"date":1883,"authors":1884,"slug":1887,"externalUrl":1152},"人間のために作られたGitを、エージェント時代に合わせて作り直す","エージェント向けに並行処理をスケールさせるGitLabの次世代SCM、そして新しいバックエンドが来歴とライフサイクルの課題に答えなければならない理由を解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773856365/gsx2c0vqlswox3ldmq88.jpg","2026-08-26",[1885,1886],"Kranthi Erusu","Jessica Taylor","gitlab-next-gen-scm",{"title":1889,"description":1890,"heroImage":1874,"category":1148,"date":1891,"authors":1892,"slug":1894,"externalUrl":1152},"カオスからコンテキストへ：AIと組む開発ワークフローのつくり方","AIディレクティブの改良、メモリシステムの構築、そしてソフトウェア開発においてAIがまだ代替できないもの。試行錯誤から得られた学びを紹介します。","2026-08-19",[1893],"Gregory Havenga","building-an-ai-dev-workflow",{"header":1896,"text":1897,"button":1901,"disclaimer":1904},"無料の\n\n30日間のGitLabトライアルを開始\n",[1898,1899,1900],"GitLab Duo Agent Platformへのアクセス","GitLabの最も高度な機能を試す","AIで複雑なタスクを自動化する",{"text":1175,"config":1902},{"href":1903,"dataGaName":1178,"dataGaLocation":1404},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/blog/","クレジットカードなしでご登録いただけます。",{"header":1906,"blurb":1907,"button":1908,"secondaryButton":1912},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":1175,"config":1909},{"href":1910,"dataGaName":1178,"dataGaLocation":1911},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":1489,"config":1913},{"href":1498,"dataGaName":1183,"dataGaLocation":1911},1790371276999]