<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Spryker Documentation</title>
        <description>Spryker documentation center.</description>
        <link>https://docs.spryker.com/</link>
        <atom:link href="https://docs.spryker.com/feed.xml" rel="self" type="application/rss+xml"/>
        <lastBuildDate>Wed, 22 Jul 2026 11:42:12 +0000</lastBuildDate>
        <generator>Jekyll v4.2.2</generator>
        
        
        <item>
            <title>AI Dev SDK Skills and Agents</title>
            <description>&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Experimental module&lt;/div&gt;
&lt;p&gt;The AiDev module is experimental and not stable. There is no backward compatibility promise for this module. We welcome your feedback and contributions as we continue to develop and improve this module.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;The AI Dev SDK ships a set of skills and agents that codify common Spryker workflows. They reach your project in two ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Via the &lt;code&gt;ai-dev:setup&lt;/code&gt; console command&lt;/strong&gt; — copies the skills and agents into your project’s AI-tool directories (&lt;code&gt;.claude/skills/&lt;/code&gt; + &lt;code&gt;.claude/agents/&lt;/code&gt;, &lt;code&gt;.windsurf/skills/&lt;/code&gt; + &lt;code&gt;.windsurf/agents/&lt;/code&gt;, and so on). Works for every AI tool listed on the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html#setup-command&quot;&gt;AI Dev SDK Overview&lt;/a&gt; that supports an agents directory. Codex CLI is the one exception — it has no agents directory, so agents are skipped for that tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Via the Claude Code plugin&lt;/strong&gt; — for Claude Code users, the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code-plugin.html&quot;&gt;Claude Code Plugin&lt;/a&gt; installs the same skills and agents through the official marketplace, no console command required.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both delivery paths read from the same source files — the plugin just packages them for marketplace installation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What’s the difference between a skill and an agent?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; load into the active chat on demand. Use them when you want the assistant to follow a specific workflow (write a product requirement document, refresh caches, run QA).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agents&lt;/strong&gt; are isolated sub-conversations the assistant delegates to. Use them when you want focused, single-purpose work done in its own context window (verify a behavior, diagnose a failure).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You do not need to remember the names — the assistant picks the right skill or agent from your prompt. The tables below explain what each one does so you know what to expect.&lt;/p&gt;
&lt;h2 id=&quot;how-to-invoke&quot;&gt;How to invoke&lt;/h2&gt;
&lt;p&gt;In most cases you do not need to call a skill or agent by name. Describe what you want — &lt;em&gt;“build this feature”&lt;/em&gt;, &lt;em&gt;“verify the new fee shows on the cart”&lt;/em&gt;, &lt;em&gt;“write a product requirement document for…”&lt;/em&gt; — and the assistant matches your wording to the right skill or agent from the set installed in your project.&lt;/p&gt;
&lt;p&gt;If you want to invoke one explicitly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code plugin&lt;/strong&gt; — every skill is also available as a slash command. Type &lt;code&gt;/&amp;lt;skill-name&amp;gt;&lt;/code&gt; (for example &lt;code&gt;/spryker-customization&lt;/code&gt;) and the skill loads into the current chat. The full list of commands is on the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code-plugin.html#skills&quot;&gt;Claude Code Plugin&lt;/a&gt; page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Other AI tools&lt;/strong&gt; — invocation follows the tool’s own convention for skills and agents. In Cursor, Windsurf, Copilot, OpenCode, and Codex CLI, the skills and agents land in the tool-specific directories (&lt;code&gt;.cursor/&lt;/code&gt;, &lt;code&gt;.windsurf/&lt;/code&gt;, etc.) and are picked up automatically by your assistant. The &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html#setup-command&quot;&gt;AI Dev SDK Overview&lt;/a&gt; lists the output paths per tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agents (subagents)&lt;/strong&gt; are not invoked by the user directly — they are spawned by the assistant or by a parent skill when the work calls for an isolated context. You can suggest one by name in your prompt (&lt;em&gt;“use the spryker-verifier to…”&lt;/em&gt;), but the assistant decides when to spawn.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;skills&quot;&gt;Skills&lt;/h2&gt;
&lt;p&gt;Skills are delivered through &lt;code&gt;ai-dev:setup&lt;/code&gt; (all supported AI tools) or the Claude Code plugin.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Benefits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ai-dev-setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generate rules, an agents/context file, and skills for the project and the chosen AI tool&lt;/td&gt;
&lt;td&gt;One command sets up consistent AI tooling for the whole team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;code-review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Review staged or PR changes against Spryker coding standards&lt;/td&gt;
&lt;td&gt;Catches Spryker-specific issues before they reach a pull request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;propel-schema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create and modify Propel ORM schema files&lt;/td&gt;
&lt;td&gt;Follows Spryker schema conventions automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-import&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create and modify data import CSV files and importers&lt;/td&gt;
&lt;td&gt;Generates importers that fit Spryker’s data-import path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codecept-functional&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generate Codeception functional tests&lt;/td&gt;
&lt;td&gt;Tests follow Spryker test patterns out of the box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;static-validation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run and interpret static analysis tools (PHPStan, PHP CS Fixer)&lt;/td&gt;
&lt;td&gt;Quick diagnosis of style and type issues without context-switching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;payment-template&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scaffold payment method integration&lt;/td&gt;
&lt;td&gt;Follows Spryker payment module patterns end-to-end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;yves-atomic-frontend&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create atomic design components for the Yves storefront&lt;/td&gt;
&lt;td&gt;Components match the project’s atomic conventions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;product-requirement-document&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Turn a feature idea into a research-grounded product requirement document before any code is written&lt;/td&gt;
&lt;td&gt;Spec-before-code; assigns a real Spryker actor to every story; cuts ambiguity before implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-customization-workflow.html&quot;&gt;&lt;code&gt;spryker-customization&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Walk a product requirement document or set of acceptance criteria through to a committed branch&lt;/td&gt;
&lt;td&gt;One workflow drives the full build; quality bar (PoC or MVP) chosen up-front; delegates focused work to the agents below; never auto-commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-bugfix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Drive a bug from an optional tracker ticket or a plain description through to a committed, validated, QA-accepted fix&lt;/td&gt;
&lt;td&gt;Orchestrates reproduce, root-cause, minimal fix, functional test, static validation, review, QA, and final verification; a shared attempt budget loops back on any failed gate; Autonomous mode adds a pushed Draft PR with a remote-CI watch loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-refresher&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run the right post-change console and composer commands after edits&lt;/td&gt;
&lt;td&gt;Owns the file-to-command mapping (codegen, caches, frontend builds, class-resolver); no missed cache rebuilds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-qa-coverage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Turn acceptance criteria into a four-bucket test plan executed against the live app&lt;/td&gt;
&lt;td&gt;Coverage goes beyond literal ACs — happy / negative / authorization / corner cases; reports pass/fail with real evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-docs-research&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Look up the right answer in official Spryker documentation&lt;/td&gt;
&lt;td&gt;Grounds AI work in documented behavior rather than the model’s memory; falls back gracefully when MCP tools are unavailable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-runtime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Drive the running Spryker application — Yves, Back Office, Merchant Portal, console, HTTP&lt;/td&gt;
&lt;td&gt;Real authenticated sessions; read-only DB / Redis / queue inspection; reusable building block for higher-level skills and agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ai-runtime-debugging&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inspect Spryker runtime state safely from an AI session&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[AI-DEBUG]&lt;/code&gt; tagged-log pattern plus optional XDebug step-debug; built-in cleanup of debug instrumentation before commit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;agents&quot;&gt;Agents&lt;/h2&gt;
&lt;p&gt;Agents are delivered through &lt;code&gt;ai-dev:setup&lt;/code&gt; (every supported AI tool with an agents directory) or the Claude Code plugin.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Benefits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-code-reviewer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Review code against Spryker’s coding standards and architectural rules&lt;/td&gt;
&lt;td&gt;Deeper, Spryker-aware review than a generic linter; catches layer-architecture and module-convention issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-feature-expert&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Answer “how does feature X work in this project / in Spryker”&lt;/td&gt;
&lt;td&gt;Pushes back when the user’s framing reinvents an existing primitive; surfaces canonical patterns first; never edits code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-verifier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verify that a specific behavior holds in the running Spryker environment&lt;/td&gt;
&lt;td&gt;Returns PASS / FAIL / BLOCKED per acceptance criterion with raw evidence; never lies green; never tries to fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-issue-diagnoser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Investigate why something failed and return a root cause&lt;/td&gt;
&lt;td&gt;Reads logs, DB state, queue, search, browser console — returns a suggested direction; never attempts the fix itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-data-seeder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create small additive test data through Spryker’s existing import path&lt;/td&gt;
&lt;td&gt;Safe and incremental — CSV + &lt;code&gt;data:import&lt;/code&gt; only; never edits code, never writes directly to the database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-screenshot-collector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture screenshots and GIFs of pages and flows for demos and documentation&lt;/td&gt;
&lt;td&gt;Pure capture — never asserts whether something works, never investigates failures, never edits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;AI Dev SDK Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-mcp-server.html&quot;&gt;AI Dev MCP Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code-plugin.html&quot;&gt;Claude Code Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Wed, 22 Jul 2026 11:41:26 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html</guid>
            
            
        </item>
        
        <item>
            <title>Claude Code Plugin</title>
            <description>&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Experimental module&lt;/div&gt;
&lt;p&gt;The AiDev module is experimental and not stable. There is no backward compatibility promise for this module. We welcome your feedback and contributions as we continue to develop and improve this module.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Project must be running&lt;/div&gt;
&lt;p&gt;The MCP server runs inside your Spryker Docker container. Start your project with &lt;code&gt;docker/sdk run&lt;/code&gt; before using any skills that rely on MCP tools.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Working with Spryker in an AI coding assistant without project-specific context leads to a predictable pattern: the AI generates plausible-looking code that does not follow Spryker’s layer architecture, uses the wrong patterns, or misses module conventions entirely. You end up spending more time correcting mistakes than you saved.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; Claude Code plugin closes this gap. It gives Claude Code deep knowledge of how Spryker projects are structured — layers, namespaces, plugin stacks, transfer objects, OMS flows — so the code it generates fits your project from the start instead of requiring repeated corrections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does for you:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No more explaining Spryker basics.&lt;/strong&gt; Rules covering 20 Spryker architectural patterns are automatically loaded into every session. Claude Code knows about factories, dependency providers, expanders, mappers, and more without you having to explain them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correct code on the first attempt.&lt;/strong&gt; Skills for common Spryker tasks — Propel schema changes, data importers, functional tests, payment integrations, atomic frontend components — follow the exact conventions your project expects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live project context.&lt;/strong&gt; The MCP server runs inside your Docker container and gives Claude Code real-time access to your transfer objects, module interfaces, and OMS configuration. The AI works with your actual project data, not guesses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent code reviews.&lt;/strong&gt; The &lt;code&gt;spryker-code-reviewer&lt;/code&gt; subagent checks your changes against Spryker’s coding standards and architectural rules, catching issues before they reach a PR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team-wide consistency.&lt;/strong&gt; Generated rules and context files are committed to your repository, so every developer on the team works with the same AI configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The plugin is distributed through the &lt;code&gt;spryker-plugins-official&lt;/code&gt; marketplace and installed directly inside Claude Code.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.ai/code&quot;&gt;Claude Code&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;Your Spryker project is running: &lt;code&gt;docker/sdk run&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;install-the-plugin-from-the-marketplace&quot;&gt;Install the plugin from the marketplace&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open Claude Code in your terminal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the Spryker plugin marketplace:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-plugin-step-1.png&quot; alt=&quot;step 1&quot; /&gt;
&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-plugin-step-2.png&quot; alt=&quot;step 2&quot; /&gt;
&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-plugin-step-3.png&quot; alt=&quot;step 3&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the plugin:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-plugin-step-4.png&quot; alt=&quot;step 4&quot; /&gt;
&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-plugin-step-5.png&quot; alt=&quot;step 5&quot; /&gt;
&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-plugin-step-6.png&quot; alt=&quot;step 6&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After installation, reload plugins in Claude Code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-plugin-step-7.png&quot; alt=&quot;Choose output mode step 7&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;set-up-ai-tooling-for-your-project&quot;&gt;Set up AI tooling for your project&lt;/h2&gt;
&lt;p&gt;After installing the plugin, run the &lt;code&gt;ai-dev-setup&lt;/code&gt; skill to configure your project. The skill generates rules, context files, and reusable AI skills tailored to your project and AI tool.&lt;/p&gt;
&lt;p&gt;In Claude Code, run the setup skill:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-skill-setup.png&quot; alt=&quot;ai-dev-setup&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The skill:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installs the &lt;code&gt;spryker-sdk/ai-dev&lt;/code&gt; package in your Spryker project.&lt;/li&gt;
&lt;li&gt;Wires up console commands for &lt;code&gt;McpServerConsole&lt;/code&gt; and &lt;code&gt;AiToolSetupConsole&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Registers the AI Dev MCP server with Claude Code.&lt;/li&gt;
&lt;li&gt;Adds &lt;code&gt;.claude/rules/&lt;/code&gt; with Spryker coding conventions and architectural guidelines.&lt;/li&gt;
&lt;li&gt;Adds &lt;code&gt;CLAUDE.md&lt;/code&gt; with project-specific context loaded into every Claude Code session.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Check with running &lt;code&gt;/context&lt;/code&gt; in Claude Code to see:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-install-1.png&quot; alt=&quot;claude-setup-1&quot; /&gt;
&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-install-2.png&quot; alt=&quot;claude-setup-2&quot; /&gt;
&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-install-3.png&quot; alt=&quot;claude-setup-3&quot; /&gt;
&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/claude-install-4.png&quot; alt=&quot;claude-setup-4&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;capabilities&quot;&gt;Capabilities&lt;/h2&gt;
&lt;p&gt;For a one-page reference of every skill and agent — what each does, when to use it, and the value it adds — see &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html&quot;&gt;AI Dev SDK Skills and Agents&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;skills&quot;&gt;Skills&lt;/h3&gt;
&lt;p&gt;The plugin bundles the following Spryker-aware skills. Invoke them in Claude Code with the &lt;code&gt;/&lt;/code&gt; prefix.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI Dev Setup&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:ai-dev-setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generates rules, a context file, and skills for your project and AI tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code Review&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:code-review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reviews staged or PR changes against Spryker coding standards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Propel Schema&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:propel-schema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Helps create and modify Propel ORM schema files following Spryker conventions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Import&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:data-import&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assists with creating and modifying data import CSV files and importers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codecept Functional&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:codecept-functional&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generates Codeception functional tests following Spryker test patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static Validation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:static-validation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs and interprets static analysis tools (PHPStan, PHP CS Fixer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment Template&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:payment-template&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scaffolds payment method integration following Spryker payment module patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yves Atomic Frontend&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:yves-atomic-frontend&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Helps create atomic design components for the Yves frontend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product Requirement Document&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:product-requirement-document&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Drafts a research-grounded product requirement document for a Spryker feature before implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spryker Customization&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:spryker-customization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Orchestrates the end-to-end build of a customization from product requirement document to committed branch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spryker Bugfix&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:spryker-bugfix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Orchestrates the end-to-end bug fix from a ticket or description to a committed, validated, QA-accepted branch (Autonomous mode adds a pushed Draft PR with a CI watch loop)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spryker Refresher&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:spryker-refresher&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs the right post-change console and composer commands after edits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spryker QA Coverage&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:spryker-qa-coverage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Turns acceptance criteria into a four-bucket test plan and executes it against the running app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spryker Docs Research&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:spryker-docs-research&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Looks up grounded answers in the official Spryker documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spryker Runtime&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:spryker-runtime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Drives the running Spryker application — storefront, back office, console, HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Runtime Debugging&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/spryker-ai-dev-sdk:ai-runtime-debugging&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adds tagged debug logs (and optional XDebug) for inspecting Spryker runtime state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;subagents&quot;&gt;Subagents&lt;/h3&gt;
&lt;p&gt;The plugin includes the following subagents. They are isolated sub-conversations that the assistant delegates to for focused, single-purpose work:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subagent&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-code-reviewer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Performs deep code reviews of your changes against Spryker architectural patterns, coding standards, and best practices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-feature-expert&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Answers questions about how a Spryker feature, module, or capability works, grounded in docs and the project’s actual code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-verifier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verifies a specific behavior in the running Spryker environment and returns PASS, FAIL, or BLOCKED per acceptance criterion with raw evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-issue-diagnoser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Investigates a failure across logs, database, queue, search, and browser state and returns a root cause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-data-seeder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creates small additive test data through Spryker’s existing data import path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spryker-screenshot-collector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Captures screenshots and short GIFs of pages and flows for demos and documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;rules&quot;&gt;Rules&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;ai-dev-setup&lt;/code&gt; skill writes a set of &lt;a href=&quot;https://github.com/spryker-sdk/ai-dev/tree/master/data/rules&quot;&gt;Spryker-specific coding rules&lt;/a&gt; into your project. These rules guide the AI to follow Spryker conventions automatically, without requiring you to explain them in every prompt.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule file&lt;/th&gt;
&lt;th&gt;What it enforces&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;business-models.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Business model structure and responsibilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;client-zed-communication.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Client–Zed gateway communication patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;controller.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controller conventions and responsibilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dependency-provider.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dependency provider wiring and plugin stacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enforce-constants-for-control-flow.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use of constants instead of magic strings in control flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;expander-pattern.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expander pattern for extending transfer objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;factory-pattern.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Factory class structure and dependency injection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;form-data-loading-performance.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Performant data loading in Zed forms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;layer-communication.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cross-layer call rules (Presentation → Communication → Business → Persistence)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mapper-pattern.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mapper pattern for transfer-to-transfer and entity-to-transfer mappings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;module-config.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Module configuration class conventions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;naming-conventions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Class, method, and variable naming standards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;owasp.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OWASP security guidelines applied to Spryker code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;performance.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Performance best practices (query optimization, caching)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;persistence.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persistence layer conventions (repositories, entity managers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;php-code-style.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PHP code style rules (PSR compliance, formatting)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plugins.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Plugin and plugin interface implementation patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;table.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Back Office table and query container conventions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;transfer-object.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transfer object usage and immutability rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;upgradability.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Backward compatibility and upgradability guidelines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;context-file&quot;&gt;Context file&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;ai-dev-setup&lt;/code&gt; skill generates a &lt;code&gt;CLAUDE.md&lt;/code&gt; context file based on the &lt;a href=&quot;https://github.com/spryker-sdk/ai-dev/blob/master/data/agents/AGENTS.example.md&quot;&gt;AGENTS.example.md&lt;/a&gt; template. This file is automatically loaded into every Claude Code session and provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Common Docker CLI commands for your Spryker project&lt;/li&gt;
&lt;li&gt;Spryker application layer overview (Zed, Yves, Glue, Client, Service, Shared)&lt;/li&gt;
&lt;li&gt;Namespace and directory structure&lt;/li&gt;
&lt;li&gt;Component rules for controllers, plugins, factories, repositories, and more&lt;/li&gt;
&lt;li&gt;Abstract class references for all layers&lt;/li&gt;
&lt;/ul&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Starting point, not a complete setup&lt;/div&gt;
&lt;p&gt;The files generated by &lt;code&gt;ai-dev-setup&lt;/code&gt; are a baseline derived from Spryker defaults. They cover general Spryker conventions but do not include anything specific to your project — custom modules, third-party integrations, team conventions, or environment details. Treat the generated &lt;code&gt;CLAUDE.md&lt;/code&gt; and rules as a starting point and extend them with your project-specific requirements.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
</description>
            <pubDate>Wed, 22 Jul 2026 11:41:26 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-claude-code-plugin.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-claude-code-plugin.html</guid>
            
            
        </item>
        
        <item>
            <title>Release notes 202606.0</title>
            <description>Spryker Cloud Commerce OS is an end-to-end solution for digital commerce. This document contains a business-level description of new features and improvements.

For information about installing Spryker, see [Getting started guide](/docs/dg/dev/development-getting-started-guide).

## B2B Business-Ready Commerce Experiences

### Recurring Orders {% include badge.html type=&quot;early-access,feature&quot; %}

Recurring Orders let buyers create cadence-based repeat purchases during checkout and execute them automatically on a defined schedule. The feature includes controls for confirmations and approvals, as well as review and recovery flows for basket changes, price changes, or ERP-related issues.

**Key capabilities:**
- Create recurring order schedules such as weekly, bi-weekly, or monthly
- Support buyer-controlled confirmations, skips, modifications
- Detect basket drift, price drift, and ERP errors with clear recovery flows

**Business benefits:**
- Reduces manual effort for repeat procurement
- Helps prevent missed or delayed replenishment orders
- Increases trust through controlled automation, governance, and auditability

**Documentation:**
- [Recurring Orders Feature Overview](/docs/pbc/all/order-experience-management/latest/base-shop/feature-overviews/recurring-orders-feature-overview.html)
- [Install Recurring Orders](/docs/pbc/all/order-experience-management/latest/base-shop/install-and-upgrade/install-features/install-the-recurring-orders-feature)

### Budget &amp; Cost Centers {% include badge.html type=&quot;feature&quot; %}

Budget &amp; Cost Centers introduces native purchasing controls for departmental or project-based spending in B2B commerce. Companies can manage budgets and cost centers directly in Spryker to support compliant, auditable, and policy-driven purchasing workflows.

**Key capabilities:**
- Define and manage cost centers for purchasing activities
- Enforce budgets directly within procurement workflows
- Align spend controls with existing approval processes

**Business benefits:**
- Reduces overspending risk through built-in budget enforcement
- Improves financial transparency across teams and projects
- Streamlines procurement with consistent spend governance in one system

**Documentation:**
- [Purchasing Control Feature Overview](/docs/pbc/all/cart-and-checkout/latest/base-shop/feature-overviews/purchasing-control-feature-overview)
- [Install Purchasing Control](/docs/pbc/all/cart-and-checkout/latest/base-shop/install-and-upgrade/install-features/install-the-purchasing-control-feature)

### New Spryker Design System Storefront

We extended the Spryker design system across key storefront pages, including product listing, product detail, and cart pages. This creates a more consistent and modern buyer experience while giving teams reusable components for faster delivery.

**Key capabilities:**
- Design system applied across the product details page
- New reusable components such as cart entries, pagination, and quantity selectors
- Storybook documentation for reference and reuse

**Business benefits:**
- Improves buyer trust with a more polished storefront experience
- Reduces future implementation and QA effort through reusable patterns
- Strengthens Spryker&apos;s out-of-the-box storefront for demos and evaluations

&lt;figure class=&quot;video_container&quot;&gt;
    &lt;video width=&quot;100%&quot; height=&quot;auto&quot; controls&gt;
      &lt;source src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/spryker+b2b+design+system-no+voice.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;


### Search Statistics &amp; Google Analytics {% include badge.html type=&quot;feature&quot; %}

Search Statistics brings native search analytics to the Back Office for customers using ElasticSearch. Business users can review frequent searches and zero-result searches to better understand buyer behavior and optimize product discovery.

**Key capabilities:**
- View top frequent searches and top zero-result searches in the Back Office
- Filter analytics by time period and review detailed search data
- Export search statistics to Google Analytics for further analysis and sharing

**Business benefits:**
- Reduces the need for custom project-specific search analytics implementations
- Helps teams improve search relevance, synonyms, and catalog quality based on real data
- Identifies search gaps that can negatively affect discoverability and conversion

**Documentation:**
- [Search Statistics Feature Overview](/docs/pbc/all/miscellaneous/latest/third-party-integrations/marketing-and-conversion/analytics/google-analytics/search-statistics)
- [Install Search Statistics](/docs/pbc/all/miscellaneous/latest/third-party-integrations/marketing-and-conversion/analytics/google-analytics/install-search-statistics)

### Back Office usability improvements {% include badge.html type=&quot;improvement&quot; %}

We improved several Back Office interactions to make administration tasks clearer and less error-prone. This covers block and slot assignment validation.

**Key capabilities:**
- Restores validation feedback when saving block and slot assignments
- Fixes missing menu highlight on the View Merchant page in the Back Office

**Business benefits:**
- Improves clarity during Back Office administration
- Helps business users navigate merchant management more easily

**Releases:**
- [No validation errors when saving block + slot assignment](https://api.release.spryker.com/release-group/6509)


### PunchOut support in the Back Office {% include badge.html type=&quot;improvement&quot; %}

PunchOut support in the Back Office makes PunchOut integrations easier to configure and manage with a more low-code approach. Building on Spryker&apos;s native support for common PunchOut flows and cXML/OCI compatibility, this update adds a dedicated PunchOut section with relevant fields and configuration support. This helps solution teams deliver integrations with less custom development effort.

**Key capabilities:**
- Adds a dedicated PunchOut section in the Back Office
- Supports configuration of relevant PunchOut integration fields in a more low-code way
- Complements native cXML, OCI, and core PunchOut message handling capabilities

**Business benefits:**
- Reduces bespoke development effort for PunchOut integrations
- Makes implementations more repeatable and faster across projects
- Simplifies setup and maintenance for customers and implementation partners

&lt;figure class=&quot;video_container&quot;&gt;
    &lt;video width=&quot;100%&quot; height=&quot;auto&quot; controls&gt;
      &lt;source src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/Spryker+b2b+Punchout+Backoffice.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;

**Documentation:**
- [PunchOut Gateway](/docs/pbc/all/punchout-gateway/punchout-gateway.html)

### PunchCommerce Punchout Connector {% include badge.html type=&quot;feature&quot; %}

The PunchCommerce Punchout Connector extends Spryker&apos;s support for complex PunchOut scenarios through a partner integration. It is designed for use cases that require multiple eProcurement connectors and document handling beyond Spryker&apos;s native capabilities. This helps customers address more advanced procurement integration requirements.

**Key capabilities:**
- Connects Spryker with PunchCommerce for advanced PunchOut scenarios
- Supports use cases with multiple eProcurement connectors
- Adds support for document-handling requirements not covered by native capabilities

**Business benefits:**
- Broadens PunchOut coverage for more complex B2B procurement scenarios
- Reduces the need for bespoke implementations in advanced projects
- Expands ecosystem support through a specialized partner solution

**Documentation:**
- [https://gitlab.netzdirektion.de/packages/punchcommerce-spryker-module](https://gitlab.netzdirektion.de/packages/punchcommerce-spryker-module)

## Connected, and AI-Enabled Platform

### AI Dev SDK: AI-Assisted Customization for Spryker Projects {% include badge.html type=&quot;early-access&quot; %}

The AI Dev SDK helps teams customize Spryker projects faster and with less manual effort. It supports developers in generating quick proofs of concept and MVP customizations that follow Spryker&apos;s patterns and project conventions, with developers staying in control at each approval point. This helps teams validate ideas faster, keep customization quality more consistent, and lower the manual effort each one takes.

&lt;figure class=&quot;video_container&quot;&gt;
    &lt;video width=&quot;100%&quot; height=&quot;auto&quot; controls&gt;
      &lt;source src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/ai-dev-sdk-workflow.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;

**Key capabilities:**
- Orchestrates the full Spryker customization workflow, from research and planning through code generation, testing, and verification, with self-correction when issues are detected and developer approval at key checkpoints
- Automates the technical work needed after every code change, including database migrations, cache rebuilds, and frontend builds
- Offers two quality levels: quick PoC for validating ideas fast, and MVP for delivering code that follows Spryker&apos;s canonical patterns and project conventions

**Business benefits:**
- Speeds up delivery of Spryker customizations, whether a quick proof of concept or an MVP-grade build.
- Reduces development effort and catches issues against Spryker and project standards earlier.
- Lowers the cost of experimentation — quick PoCs make it cheap to validate an idea before investing in a full implementation.

**Documentation:**
- [AI Dev SDK Skills and Agents](/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html)
- [AI Dev SDK Customization Workflow](/docs/dg/dev/ai/ai-dev/ai-dev-customization-workflow.html)
- [Claude Code Plugin](/docs/dg/dev/ai/ai-dev/ai-dev-claude-code-plugin.html)

### AI Commerce: Smart CMS for AI-assisted content creation {% include badge.html type=&quot;early-access&quot; %}

Smart CMS brings AI assistance directly into the CMS page and block creation in the Back Office. Content editors and business users can generate structured text content in-flow instead of writing or copying content manually. This reduces the effort required to create and update commerce content experiences at scale.

{% include carousel.html
images=&quot;
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_smart_cms_1.png||::
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_smart_cms_2.png||::
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_smart_cms_3.png||&quot;
%}

**Key capabilities:**
- Generates CMS page and block content directly in the Back Office authoring flow
- Accepts source attachments, such as documents with customer questions, to generate structured content like FAQ pages
- Understands Spryker-specific content items so generated content fits existing content structures

**Business benefits:**
- Reduces manual effort for routine content creation and updates
- Improves productivity for content editors and business admins
- Helps scale content operations more efficiently as content needs grow

**Documentation:**
- [Smart CMS Content Assistant](/docs/pbc/all/ai-commerce/latest/smart-cms-content-assistant)
- [Install Smart CMS Content Assistant](/docs/dg/dev/ai/ai-commerce/content-assistant/install-smart-cms-content-assistant#prerequisites)

### AI Foundation: Back Office AI Configuration {% include badge.html type=&quot;early-access&quot; %}

AI Foundation now includes a unified configuration experience in the Back Office for managing AI providers, models, prompts, and feature-specific behavior. This gives business and operational users a clearer, more consistent way to activate and control AI-powered capabilities, including switching AI vendors or models on the fly, without developer involvement or redeployment.

{% include carousel.html
images=&quot;
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_ai_configuration_1.png||::
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_ai_configuration_2.png||&quot;
%}

**Key capabilities:**
- Centralizes AI provider and credential management in one configuration area
- Supports feature-level enablement and control of AI behavior, including AI vendor, model, and prompt configuration, with no code changes or deployments required
- Provides an extensible foundation designed to support additional AI-powered features over time

**Business benefits:**
- Simplifies setup and onboarding for AI-powered features
- Gives merchants more control over AI behavior, output quality, and governance
- Reduces configuration errors and repetitive administrative work

**Documentation:**
- [Configure multiple AI providers for AI Commerce](/docs/dg/dev/ai/ai-commerce/configure-multiple-ai-providers)

### AI Foundation: Back Office AI Cost Estimator {% include badge.html type=&quot;early-access&quot; %}

The AI Cost Estimator adds estimated AI cost visibility to the AI Audit Logs in the Back Office. Admins can configure model pricing once and then see estimated costs per interaction, total estimated spend, and breakdowns by provider and model. This makes it easier to understand the cost of individual AI-powered commerce features and make informed decisions about their value and continued use.

{% include carousel.html
images=&quot;
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_ai_cost_estimator_1.png||::
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_ai_cost_estimator_2.png||&quot;
%}

**Key capabilities:**
- Shows estimated cost per AI interaction in the Audit Logs page
- Provides total estimated cost and provider and model-level cost breakdowns based on active filters
- Uses customer-configured provider and model prices, including support for multiple currencies

**Business benefits:**
- Improves visibility into AI operating costs across commerce features
- Supports better governance and value assessment of AI capabilities
- Reduces manual work previously needed to estimate AI spend from token usage

**Documentation:**
- [AI Audit Logs &amp; Cost Estimations](/docs/dg/dev/ai/ai-foundation/ai-foundation-audit-logs)

### GLUE REST API migration to API Platform {% include badge.html type=&quot;feature&quot; %}

Spryker has modernized its internal GLUE REST API infrastructure by migrating it to API Platform. This change is backward compatible for existing API clients, while making APIs easier to maintain, extend, and evolve internally. It also improves the foundation for delivering new endpoints and capabilities faster.

**Key capabilities:**
- Keeps existing external API contracts unchanged for current clients and consumers
- Replaces custom internal API infrastructure with API Platform
- Enables more standardized API generation, validation, and documentation

**Business benefits:**
- Accelerates API delivery and reduces development effort for new endpoints
- Improves maintainability and extensibility of the API layer
- Supports more consistent and predictable machine-to-machine integrations

**Documentation:**
- [API Strategy](/docs/integrations/spryker-glue-api/getting-started-with-apis/api-strategy.html)
- [Spryker API roadmap and adoption](/docs/integrations/spryker-glue-api/getting-started-with-apis/api-roadmap-and-adoption#whats-on-the-roadmap.html)
- [Storefront API B2B Demo Shop reference](/docs/integrations/spryker-glue-api/storefront-api/api-references/storefront-api-b2b-demo-shop-reference.html)

### Backend API added to the Spryker API Strategy {% include badge.html type=&quot;feature&quot; %}

Spryker extended its API strategy to cover the Backend API, the application for administrative and system-to-system integrations. The strategy now documents the API types available under the Backend API—starting with the Back Office API you can build on today—and the types planned on the roadmap, all built on API Platform integration. As with the rest of the strategy, existing Glue Backend APIs remain fully supported with no End-of-Life and no forced migration.

**Key capabilities:**
- Documents the Backend API application and its API types, and clarifies that the Backend API application is distinct from the Back Office API type
- Back Office API is available today for administrator-level and trusted internal integrations
- Roadmap types documented for planning: Merchant API, Merchant Data Exchange API, Data Exchange API, and Async Event API
- Guidance for choosing a Backend API type by caller and data-flow shape—record-by-record, bulk, or event-driven

**Business benefits:**
- Gives a clear, forward-looking view of backend integration options across administration, merchant, data exchange, and events
- Protects existing Glue Backend API investments with a no-End-of-Life, no-forced-migration commitment
- Speeds up planning for ERP, PIM, OMS, and marketplace integrations with consistent guidance

**Documentation:**
- [Spryker API Strategy](/docs/integrations/spryker-glue-api/getting-started-with-apis/api-strategy.html)
- [Spryker API roadmap and adoption](/docs/integrations/spryker-glue-api/getting-started-with-apis/api-roadmap-and-adoption.html)

## Efficient and Flexible Cloud Foundation

### Propel 2.0 LTS  {% include badge.html type=&quot;improvement&quot; %}

This work includes advancing Propel toward a stable release and increasing active maintenance.

**Documentation:**
- [PropelORM](https://github.com/propelorm/Propel2/releases/tag/2.0.0)

### Maintenance and service updates {% include badge.html type=&quot;improvement&quot; %}

We rolled out regular maintenance and service updates across cloud components to keep environments secure, stable, and maintainable. This includes updates to core services and supporting infrastructure components. These changes help reduce operational risk and technical debt over time.

**Key capabilities:**
- Updates core services and infrastructure components such as Nginx 1.30, and Docker images
- Improves long-term maintainability of cloud services
- Updated multiple dependencies

**Business benefits:**
- Improves system reliability and operational resilience
- Updates `shell-quote` to a patched version addressing a critical shell injection vulnerability.
- Upgrades `symfony/runtime` to address unsafe request argument handling.
- Upgrades `symfony/monolog-bridge` to address unauthenticated log listener exposure.

**Documentation:**
- [Docker Images](/docs/about/all/releases/image-releases/spryker-php/release-notes-spryker-php-20260608.html)

### Key-Value Storage Optimization for Dynamic Store Mode {% include badge.html type=&quot;improvement&quot; %}

We optimized key-value storage usage for Dynamic Store Mode to reduce duplicated data across store and locale combinations. This improvement lowers Valkey/Redis memory consumption and key volume while keeping the solution backward compatible and opt-in. It is especially valuable for deployments with multiple stores and locales.

**Key capabilities:**
- Reduces duplicated product abstract and URL storage data in Dynamic Store Mode
- Keeps compatibility with existing storage formats and supports gradual adoption
- Provides an opt-in configuration and migration path for controlled rollout

**Business benefits:**
- Improves scalability for multi-store and multi-locale setups
- Helps delay or avoid costly cache instance size increases

**Documentation:**
- [KV Storage Deduplication](/docs/dg/dev/guidelines/performance-guidelines/kv-storage-deduplication.html)

### Queue processing resilience and worker behavior {% include badge.html type=&quot;improvement&quot; %}

We improved queue processing behavior to reduce the risk of blocked or stalled message handling. The update addresses long-running worker processes, retry queue handling, and premature worker exits while messages are still waiting.

**Key capabilities:**
- Improves handling of long-running or stuck queue worker child processes
- Prevents failed messages from being lost when no retry queue exists
- Ensures `queue:worker:start --stop-when-empty` behaves more reliably

**Business benefits:**
- Reduces the risk of blocked publish and processing pipelines
- Improves operational stability for queue-based workloads
- Helps teams recover from processing failures more predictably

**Documentation:**
- [Publish and synchronization (queue and event performance)](/docs/dg/dev/guidelines/performance-guidelines/keeping-dependencies-updated#publish-and-synchronization-queue-and-event-performance)
- [Enable queue worker wait limit](/docs/dg/dev/guidelines/performance-guidelines/general-performance-guidelines#enable-queue-worker-wait-limit)

### Cloud security improvements {% include badge.html type=&quot;improvement&quot; %}

We delivered a set of cloud security improvements to strengthen infrastructure protection and reduce unnecessary access paths. These updates address container-to-instance access risks, improve IAM controls, and support more secure cloud operations. They also include compatibility adjustments for newer managed service defaults.

**Key capabilities:**
- Tightens IAM policy controls to prevent overly broad administrative permissions in customer PaaS accounts
- Adds compatibility handling for MariaDB 11.8 secure transport defaults in infrastructure templates

**Business benefits:**
- Reduces the risk of unauthorized access to cloud resources and secrets
- Improves security posture across customer environments
- Helps maintain secure operations as infrastructure components evolve

### RDS Auditability Extensions {% include badge.html type=&quot;feature&quot; %}

We have introduced advanced activity tracking for database operations to enhance security governance and accountability across your environments. This update provides clear visibility into data modifications and structural changes within your live production systems.
**Key capabilities:**
- Monitors and records database operations performed in production environments
- Securely retains activity logs for a rolling two-year period to satisfy standard corporate compliance and security policies.

**Business benefits:**
- Provides complete transparency into exactly who executed which database operation, ensuring robust compliance and clear user accountability
- Enhances Security Auditing: Simplifies the detection of potential application exploits—such as SQL injections—by tracking critical service account behaviors

### Persistent Jenkins Configuration {% include badge.html type=&quot;improvement&quot; %}

We have updated our cloud automation storage model to significantly improve platform stability. This enhancement ensures that your custom adjustments are safely preserved during routine platform updates and security maintenance.
**Key capabilities:**
- Permanently safeguards all manually created configurations and fine-tunings across system upgrades and server restarts
- Unlocks continuous, automated operating system upgrades and critical infrastructure patching to keep your system completely protected

**Business benefits:**
- Eliminates the risk of losing bespoke operational settings, removing the need for costly and repetitive manual reconfiguration work
- Enhances your overall security posture by allowing the seamless deployment of critical patches without disrupting business continuity

### Customer authentication and session handling {% include badge.html type=&quot;improvement&quot; %}

We fixed issues affecting customer authentication and session behavior in edge cases. These changes improve reliability for API authentication and login flows.

**Key capabilities:**
- Prevents unintended API authentication behavior related to `spy_customer.registered = NULL`
- Improves error handling for invalid JWT tokens in warehouse token requests
- Avoids false-positive WAF blocking caused by specific patterns that are not malicious.

**Business benefits:**
- Improves trust in authentication flows
- Reduces login-related support cases
- Helps secure customer access scenarios more consistently

**Documentation:**
- [spy_customer.registered=NULL allows API auth](https://api.release.spryker.com/release-group/6618)
- [Adjusted Quote data and UI fixes](https://api.release.spryker.com/release-group/6621)
- [Added optional base64 encoding for gateway](https://api.release.spryker.com/release-group/6633)

### Voucher code tracking and order display accuracy in the Back Office {% include badge.html type=&quot;improvement&quot; %}

We fixed issues with orders that use multiple voucher-code discounts. The Back Office now shows the correct voucher code for each applied discount, and usage counters are updated correctly for all voucher codes used in an order.

**Key capabilities:**
- Displays the actual voucher code used for each discount in the Back Office order overview.
- Correctly increments usage counters for all voucher codes applied to an order.
- Supports orders with multiple non-exclusive voucher-based discounts more accurately.

**Business benefits:**
- Improves trust in discount reporting and order auditability.
- Reduces manual verification effort for merchandising and support teams.
- Ensures voucher campaign performance is tracked correctly.

**Release:**
- [Multiple voucher codes on order](https://api.release.spryker.com/release-group/6640)

### Product and catalog experience improvements {% include badge.html type=&quot;improvement&quot; %}

We improved several product-related experiences in the Back Office and storefront to make catalog management and shopping journeys more reliable. The update covers product images in Zed, product readiness visibility, replacement product rendering, and marketplace product offer handling in carts.

**Key capabilities:**
- Restores product concrete image visibility in the Back Office

**Business benefits:**
- Gives business users clearer product status information
- Reduces confusion during catalog maintenance in the Back Office
- Improves cart accuracy for marketplace shopping scenarios

**Documentation:**
- [Show Product Concrete images in Zed](https://api.release.spryker.com/release-group/6501)

### Storefront performance, search, and content management improvements {% include badge.html type=&quot;improvement&quot; %}

We improved storefront performance, search reliability, content management efficiency, and product data consistency to deliver faster customer experiences, more accurate search results, and better scalability across high-volume environments.

**Key capabilities:**
- Improves checkout and customer-facing page performance by reducing unnecessary backend requests and eliminating Redis bottlenecks for large datasets.
- Enhances product data publishing and search indexing to keep Storage and Search synchronized with catalog changes across multi-store and multi-locale environments.
- Generates search index mappings correctly for advanced analyzer and multi-field configurations.
- Optimizes CMS page version history loading for better Back Office performance when managing long-lived content.
- Preserves locale selection across storefront, configurator, agent emulation, and authentication flows for a more consistent user experience.

**Business benefits:**
- Delivers faster storefront and checkout experiences, even at scale.
- Improves search accuracy and product data consistency across channels.
- Enhances Back Office productivity for content managers.
- Reduces backend load and improves platform scalability.
- Provides a more consistent localized shopping experience for customers and support agents.

**Documentation and Releases:**
- [Cart page and checkout for large carts](/docs/dg/dev/guidelines/performance-guidelines/keeping-dependencies-updated#cart-page-and-checkout-for-large-carts-100-items)
- [Adjusted reading shipment type uuids on Checkout](https://api.release.spryker.com/release-group/5736)
- [Added child fields to index map](https://api.release.spryker.com/release-group/6616)
- [CMS page versions query for the form loads too much data](https://api.release.spryker.com/release-group/6630)
- [Remediate error in spryker/category &gt;= 5.23.0](https://api.release.spryker.com/release-group/6452)
- [Remove Concrete Product on deactivation](https://api.release.spryker.com/release-group/6500)
- [Remove product concrete from the search index](https://api.release.spryker.com/release-group/6574)
- [Locale selection preserved when navigating in the Storefront](https://api.release.spryker.com/release-group/6521)
- [Performance improvements to the checkout](https://api.release.spryker.com/release-group/6479)
</description>
            <pubDate>Tue, 21 Jul 2026 12:48:50 +0000</pubDate>
            <link>https://docs.spryker.com/docs/about/all/releases/release-notes-202606.0.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/about/all/releases/release-notes-202606.0.html</guid>
            
            
        </item>
        
        <item>
            <title>Add a custom Back Office Assistant agent</title>
            <description>&lt;p&gt;Back Office Assistant routes each conversation to the most appropriate agent through its intent router. To handle a new domain—for example, managing customers or CMS content—implement a custom agent and register it alongside the built-in agents described in &lt;a href=&quot;/docs/dg/dev/ai/ai-commerce/backoffice-assistant/backoffice-assistant.html&quot;&gt;Back Office Assistant&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;implement-the-agent-plugin&quot;&gt;1) Implement the agent plugin&lt;/h2&gt;
&lt;p&gt;Create a plugin that implements &lt;code&gt;BackofficeAssistantAgentPluginInterface&lt;/code&gt; from &lt;code&gt;SprykerFeature\Zed\AiCommerce\Dependency\BackofficeAssistant&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;METHOD&lt;/th&gt;
&lt;th&gt;PURPOSE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getName()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns the unique agent name used for routing. This value is matched against the intent router’s response.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getDescription()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Describes what the agent handles. The intent router AI uses this description to decide which agent matches the user’s request, so make it specific about the agent’s domain and capabilities.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;isApplicable()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns whether the agent is available for routing. Use this to gate the agent behind a configuration flag, similar to the built-in agents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;executeAgent()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Builds a &lt;code&gt;PromptRequestTransfer&lt;/code&gt;, calls &lt;code&gt;AiFoundationFacade::prompt()&lt;/code&gt;, and maps the result into a &lt;code&gt;BackofficeAssistantPromptResponseTransfer&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Pyz\Zed\AiCommerce\Communication\Plugin\Agent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Generated\Shared\Transfer\BackofficeAssistantPromptRequestTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Generated\Shared\Transfer\BackofficeAssistantPromptResponseTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Generated\Shared\Transfer\CustomerManagementAgentResponseTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Generated\Shared\Transfer\PromptMessageTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Generated\Shared\Transfer\PromptRequestTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Spryker\Shared\AiFoundation\AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Spryker\Zed\Kernel\Communication\AbstractPlugin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeature\Zed\AiCommerce\Dependency\BackofficeAssistant\BackofficeAssistantAgentPluginInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;cd&quot;&gt;/**
 * @method \Pyz\Zed\AiCommerce\Communication\AiCommerceCommunicationFactory getFactory()
 * @method \Pyz\Zed\AiCommerce\AiCommerceConfig getConfig()
 */&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CustomerManagementAgentPlugin&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AbstractPlugin&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BackofficeAssistantAgentPluginInterface&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;NAME&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Customer Management&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;TOOL_SET_CUSTOMER_MANAGEMENT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;customer_management_tools&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;NAME&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Answers questions about customer accounts, addresses, and status. Use for customer lookup and account management questions.&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isApplicable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;BackofficeAssistantPromptRequestTransfer&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;isCustomerManagementAgentEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;executeAgent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;BackofficeAssistantPromptRequestTransfer&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;BackofficeAssistantPromptResponseTransfer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$promptRequest&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PromptRequestTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setAiConfigurationName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getCustomerManagementAgentAiConfigurationName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setConversationReference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptRequest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getConversationReference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setStructuredMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CustomerManagementAgentResponseTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;addToolSetName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;TOOL_SET_CUSTOMER_MANAGEMENT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setPromptMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PromptMessageTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
                    &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;setType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;MESSAGE_TYPE_USER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptRequest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getPrompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
                    &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setAttachments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptRequest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getAttachments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()),&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;nv&quot;&gt;$promptResponse&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getAiFoundationFacade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$promptRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptResponse&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BackofficeAssistantPromptResponseTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$promptResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getIsSuccessful&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;cd&quot;&gt;/** @var \Generated\Shared\Transfer\CustomerManagementAgentResponseTransfer $customerManagementAgentResponse */&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$customerManagementAgentResponse&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$promptResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getStructuredMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setAgent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$customerManagementAgentResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getAgent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$customerManagementAgentResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;setReasoningMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$customerManagementAgentResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getReasoningMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$backofficeAssistantPromptResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Info&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;CustomerManagementAgentResponseTransfer&lt;/code&gt; structured message transfer, the &lt;code&gt;isCustomerManagementAgentEnabled()&lt;/code&gt; and &lt;code&gt;getCustomerManagementAgentAiConfigurationName()&lt;/code&gt; config methods, and the &lt;code&gt;customer_management_tools&lt;/code&gt; toolset are project-specific and must be defined as part of this implementation. Model the response transfer on the existing &lt;code&gt;GeneralAgentResponseTransfer&lt;/code&gt; or &lt;code&gt;DiscountManagementAgentResponseTransfer&lt;/code&gt; structure, with &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;message&lt;/code&gt;, and &lt;code&gt;reasoningMessage&lt;/code&gt; fields.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;implement-the-toolset-plugin&quot;&gt;2) Implement the toolset plugin&lt;/h2&gt;
&lt;p&gt;Each agent resolves its tools through a named toolset. Create a plugin that implements &lt;code&gt;ToolSetPluginInterface&lt;/code&gt; from &lt;code&gt;Spryker\Zed\AiFoundation\Dependency\Tools&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Pyz\Zed\AiCommerce\Communication\Plugin\AiFoundation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Spryker\Zed\AiFoundation\Dependency\Tools\ToolSetPluginInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Spryker\Zed\Kernel\Communication\AbstractPlugin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;cd&quot;&gt;/**
 * @method \Pyz\Zed\AiCommerce\Communication\AiCommerceCommunicationFactory getFactory()
 */&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CustomerManagementToolSetPlugin&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AbstractPlugin&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ToolSetPluginInterface&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;TOOL_SET_CUSTOMER_MANAGEMENT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;customer_management_tools&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;TOOL_SET_CUSTOMER_MANAGEMENT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;cd&quot;&gt;/**
     * @return array&amp;lt;\Spryker\Zed\AiFoundation\Dependency\Tools\ToolPluginInterface&amp;gt;
     */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getTools&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;array&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;createGetCustomerDetailsToolPlugin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Each tool referenced in &lt;code&gt;getTools()&lt;/code&gt; implements &lt;code&gt;ToolPluginInterface&lt;/code&gt; from &lt;code&gt;Spryker\Zed\AiFoundation\Dependency\Tools&lt;/code&gt;, exposing &lt;code&gt;getName()&lt;/code&gt;, &lt;code&gt;getDescription()&lt;/code&gt;, &lt;code&gt;getParameters()&lt;/code&gt;, and &lt;code&gt;execute()&lt;/code&gt;. The AI model uses &lt;code&gt;getName()&lt;/code&gt; and &lt;code&gt;getDescription()&lt;/code&gt; to decide when to call the tool, and &lt;code&gt;getParameters()&lt;/code&gt; to know which arguments to pass.&lt;/p&gt;
&lt;h2 id=&quot;register-the-plugins&quot;&gt;3) Register the plugins&lt;/h2&gt;
&lt;p&gt;Add the agent plugin to the array returned by &lt;code&gt;AiCommerceDependencyProvider::getBackofficeAssistantAgentPlugins()&lt;/code&gt;, alongside the already-registered built-in agents described in &lt;a href=&quot;/docs/dg/dev/ai/ai-commerce/backoffice-assistant/install-backoffice-assistant.html#4-set-up-behavior&quot;&gt;Install Back Office Assistant&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;src/Pyz/Zed/AiCommerce/AiCommerceDependencyProvider.php&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pyz\Zed\AiCommerce\Communication\Plugin\Agent\CustomerManagementAgentPlugin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceDependencyProvider&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeatureAiCommerceDependencyProvider&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cd&quot;&gt;/**
     * @return array&amp;lt;\SprykerFeature\Zed\AiCommerce\Dependency\BackofficeAssistant\BackofficeAssistantAgentPluginInterface&amp;gt;
     */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getBackofficeAssistantAgentPlugins&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;array&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// ... existing agent plugins&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CustomerManagementAgentPlugin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Add the toolset plugin to the array returned by &lt;code&gt;AiFoundationDependencyProvider::getAiToolSetPlugins()&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;src/Pyz/Zed/AiFoundation/AiFoundationDependencyProvider.php&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pyz\Zed\AiCommerce\Communication\Plugin\AiFoundation\CustomerManagementToolSetPlugin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationDependencyProvider&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerAiFoundationDependencyProvider&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cd&quot;&gt;/**
     * @return array&amp;lt;\Spryker\Zed\AiFoundation\Dependency\Tools\ToolSetPluginInterface&amp;gt;
     */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getAiToolSetPlugins&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;array&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// ... existing toolset plugins&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CustomerManagementToolSetPlugin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;add-a-dedicated-ai-configuration&quot;&gt;4) Add a dedicated AI configuration&lt;/h2&gt;
&lt;p&gt;Built-in Back Office Assistant agents share one Back Office setting, &lt;strong&gt;AI Commerce &amp;gt; Back Office Assistant &amp;gt; AI Vendor&lt;/strong&gt;, that lets a project pick OpenAI, AWS Bedrock, or Anthropic for all agents at once. Each agent then resolves to a dedicated, per-provider named AI configuration for that choice. Follow the same pattern for a new agent so it participates in the same vendor switch and gets its own entries in the &lt;code&gt;AiFoundation&lt;/code&gt; audit log.&lt;/p&gt;
&lt;h3 id=&quot;define-configuration-key-constants&quot;&gt;4.1) Define configuration key constants&lt;/h3&gt;
&lt;p&gt;Add project-level constants for the new agent’s per-provider configuration names and its model settings in &lt;code&gt;Pyz\Shared\AiCommerce\AiCommerceConstants&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;src/Pyz/Shared/AiCommerce/AiCommerceConstants.php&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Pyz\Shared\AiCommerce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeature\Shared\AiCommerce\AiCommerceConstants&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeatureAiCommerceConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeatureAiCommerceConstants&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_OPENAI&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;AI_COMMERCE:AI_CONFIGURATION_CUSTOMER_MANAGEMENT_OPENAI&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_AWS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;AI_COMMERCE:AI_CONFIGURATION_CUSTOMER_MANAGEMENT_AWS&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_ANTHROPIC&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;AI_COMMERCE:AI_CONFIGURATION_CUSTOMER_MANAGEMENT_ANTHROPIC&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;resolve-the-configuration-name-from-codeaicommerceconfigcode&quot;&gt;4.2) Resolve the configuration name from &lt;code&gt;AiCommerceConfig&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Override &lt;code&gt;AiCommerceConfig&lt;/code&gt; in Zed to resolve the new agent’s configuration name from the existing vendor setting, reusing &lt;code&gt;getBackofficeAssistantAiConfigurationName()&lt;/code&gt;. This is the method referenced as &lt;code&gt;getCustomerManagementAgentAiConfigurationName()&lt;/code&gt; in the agent plugin from step 1:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;src/Pyz/Zed/AiCommerce/AiCommerceConfig.php&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Pyz\Zed\AiCommerce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pyz\Shared\AiCommerce\AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeature\Zed\AiCommerce\AiCommerceConfig&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeatureAiCommerceConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConfig&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeatureAiCommerceConfig&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getCustomerManagementAgentAiConfigurationName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;?string&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getBackofficeAssistantAiConfigurationName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_BACKOFFICE_ASSISTANT_AWS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_AWS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_BACKOFFICE_ASSISTANT_ANTHROPIC&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_ANTHROPIC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_OPENAI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isCustomerManagementAgentEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;filter_var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getModuleConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;ai_commerce:customer_management:general:is_enabled&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;no&quot;&gt;FILTER_VALIDATE_BOOLEAN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;getBackofficeAssistantAiConfigurationName()&lt;/code&gt; and the &lt;code&gt;AI_CONFIGURATION_BACKOFFICE_ASSISTANT_*&lt;/code&gt; constants are defined in your project’s &lt;code&gt;Pyz\Zed\AiCommerce\AiCommerceConfig&lt;/code&gt; and &lt;code&gt;Pyz\Shared\AiCommerce\AiCommerceConstants&lt;/code&gt; when you install the Back Office Assistant, as described in &lt;a href=&quot;/docs/dg/dev/ai/ai-commerce/backoffice-assistant/install-backoffice-assistant.html#3-configure-ai-models-for-back-office-assistant&quot;&gt;Install Back Office Assistant&lt;/a&gt;. Reuse them instead of adding a separate vendor switch for the new agent.&lt;/p&gt;
&lt;h3 id=&quot;add-the-configuration-entries&quot;&gt;4.3) Add the configuration entries&lt;/h3&gt;
&lt;p&gt;Add one entry per provider to &lt;code&gt;config/Shared/config_ai.php&lt;/code&gt;, following the same pattern used for the built-in agents in &lt;a href=&quot;/docs/dg/dev/ai/ai-commerce/backoffice-assistant/install-backoffice-assistant.html#3-configure-ai-models-for-back-office-assistant&quot;&gt;Install Back Office Assistant&lt;/a&gt;. Reuse the existing &lt;code&gt;CONFIGURATION_KEY_BACKOFFICE_ASSISTANT_*_MODEL&lt;/code&gt; and API token constants so the model and provider credentials stay configurable through Configuration Management, consistent with the other agents:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;config/Shared/config_ai.php&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pyz\Shared\AiCommerce\AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Spryker\Shared\AiFoundation\AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATIONS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_OPENAI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&apos;provider_name&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;PROVIDER_OPENAI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&apos;provider_config&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;key&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_REFERENCE_PREFIX&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_KEY_OPENAI_API_TOKEN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;model&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_REFERENCE_PREFIX&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_KEY_BACKOFFICE_ASSISTANT_OPENAI_MODEL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATIONS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_AWS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&apos;provider_name&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;PROVIDER_BEDROCK&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&apos;provider_config&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;model&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_REFERENCE_PREFIX&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_KEY_BACKOFFICE_ASSISTANT_AWS_MODEL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;bedrockRuntimeClient&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;region&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_REFERENCE_PREFIX&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_KEY_AWS_REGION&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;token&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_REFERENCE_PREFIX&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_KEY_AWS_API_TOKEN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATIONS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;AI_CONFIGURATION_CUSTOMER_MANAGEMENT_ANTHROPIC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&apos;provider_name&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;PROVIDER_ANTHROPIC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&apos;provider_config&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;key&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_REFERENCE_PREFIX&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_KEY_ANTHROPIC_API_TOKEN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;model&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiFoundationConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_REFERENCE_PREFIX&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIGURATION_KEY_BACKOFFICE_ASSISTANT_ANTHROPIC_MODEL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Info&lt;/div&gt;
&lt;p&gt;If the new agent needs its own model choice independent of the other agents, define dedicated &lt;code&gt;CONFIGURATION_KEY_CUSTOMER_MANAGEMENT_*_MODEL&lt;/code&gt; constants and Configuration Management settings instead of reusing &lt;code&gt;CONFIGURATION_KEY_BACKOFFICE_ASSISTANT_*_MODEL&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;enable-sse-streaming-for-the-new-agent&quot;&gt;5) Enable SSE streaming for the new agent&lt;/h2&gt;
&lt;p&gt;Back Office Assistant streams tool call progress to the chat widget over Server-Sent Events. &lt;code&gt;BackofficeAssistantSsePreToolCallPlugin&lt;/code&gt; and &lt;code&gt;BackofficeAssistantSsePostToolCallPlugin&lt;/code&gt; only emit an event when the current prompt’s AI configuration name is present in &lt;code&gt;AiCommerceConfig::getBackofficeAssistantSseAiConfigurationNames()&lt;/code&gt;. If the new agent’s configuration name is missing from that list, its tool calls run normally but their progress does not stream to the widget.&lt;/p&gt;
&lt;p&gt;Override &lt;code&gt;getBackofficeAssistantSseAiConfigurationNames()&lt;/code&gt; in the project’s &lt;code&gt;AiCommerceConfig&lt;/code&gt; to include the new agent’s configuration name:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;src/Pyz/Zed/AiCommerce/AiCommerceConfig.php&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Pyz\Zed\AiCommerce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pyz\Shared\AiCommerce\AiCommerceConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeature\Zed\AiCommerce\AiCommerceConfig&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeatureAiCommerceConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AiCommerceConfig&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SprykerFeatureAiCommerceConfig&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ... getCustomerManagementAgentAiConfigurationName() and isCustomerManagementAgentEnabled() from step 4.2&lt;/span&gt;

    &lt;span class=&quot;cd&quot;&gt;/**
     * @return array&amp;lt;string&amp;gt;
     */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getBackofficeAssistantSseAiConfigurationNames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;array&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;array_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;array_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
            &lt;span class=&quot;mf&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getBackofficeAssistantSseAiConfigurationNames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
            &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getCustomerManagementAgentAiConfigurationName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;]));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;BackofficeAssistantSsePreToolCallPlugin&lt;/code&gt; and &lt;code&gt;BackofficeAssistantSsePostToolCallPlugin&lt;/code&gt; are registered once in &lt;code&gt;AiFoundationDependencyProvider::getPreToolCallPlugins()&lt;/code&gt; and &lt;code&gt;getPostToolCallPlugins()&lt;/code&gt;, as shown in &lt;a href=&quot;/docs/dg/dev/ai/ai-commerce/backoffice-assistant/install-backoffice-assistant.html#4-set-up-behavior&quot;&gt;Install Back Office Assistant&lt;/a&gt;. They apply to every agent whose configuration name is in the list above, so no additional plugin registration is required for the new agent.&lt;/p&gt;
&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Verification&lt;/div&gt;
&lt;p&gt;In the Back Office, open the Back Office Assistant chat widget and send a message that matches the new agent’s description. Confirm the intent router routes the request to the new agent, that tool call progress streams live in the widget, and that the response uses the expected tools.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
</description>
            <pubDate>Mon, 20 Jul 2026 08:24:20 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/ai/ai-commerce/backoffice-assistant/add-custom-backoffice-assistant-agent.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/ai/ai-commerce/backoffice-assistant/add-custom-backoffice-assistant-agent.html</guid>
            
            
        </item>
        
        <item>
            <title>Getting started with cloud administration</title>
            <description>This document is a starting point for managing your Spryker Cloud Commerce OS (SCCOS) cloud environments.

SCCOS is a fully managed solution. Before you start developing, we set up environments, tools, and services based on your Onboarding Questionnaire. If you didn&apos;t request something in the questionnaire, you can always do it via [support](https://support.spryker.com).

After the initial setup, the following is configured and available:

- [Environments](/docs/ca/dev/environments-overview.html): staging and production.
- Services: RDS database, RDS backup, logs, SMTP, etc.
- Access to AWS, internal resources, and services.
- CD pipelines for staging and production environments.
- Domain names and SSL certificates.


## Accessing the cloud environments

You can access your cloud environments via the following means:

- IAM account: provides access to the AWS Management Console and AWS CLI. For instructions, see [Connecting to AWS Console and CLI with an IAM user](/docs/ca/dev/access/connecting-to-aws-console-and-cli-with-an-iam-user.html).
- SSH: provides access to internal services via [bastion host](https://docs.aws.amazon.com/managedservices/latest/userguide/using-bastions.html). For instructions, see [Connect to services via SSH](/docs/ca/dev/access/connect-to-services-via-ssh.html).
- VPN: provides access to internal services via [bastion host](https://docs.aws.amazon.com/managedservices/latest/userguide/using-bastions.html). You receive these access details during the onboarding.
- SFTP: provides access to the SFTP folder mounted inside the Jenkins container. You receive these access details during the onboarding.


## Service credentials

You can find the credentials for services in the environment variables for the Zed container in [Elastic Container Service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html). For instructions, see [Locate service credentials](/docs/ca/dev/access/locate-service-credentials.html).


## CD pipelines

The following CD pipelines are configured in [CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html):

&lt;div class=&quot;width-100&quot;&gt;

| Pipeline | Details |
| --- | --- |
| DESTRUCTIVE | You can configure the installation stage of this pipeline in `config/install/destructive.yml`. |
| NORMAL | You can configure the installation stage of this pipeline in `config/install/production.yml`. |
| Build | Compiles images and pushes them into the [Amazon Elastic Container Registry](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html). Starts automatically when a new commit&apos;s detected.  |
| Rollout Scheduler | Deploys the scheduler. |

&lt;/div&gt;

To learn about running pipelines, see [Deploy in a staging environment](/docs/ca/dev/deploy-in-a-staging-environment.html) and [Deploy in a production environment](/docs/ca/dev/deploy-in-a-production-environment.html).

## Next step

[Environments overview](/docs/ca/dev/environments-overview.html)
</description>
            <pubDate>Thu, 16 Jul 2026 15:05:07 +0000</pubDate>
            <link>https://docs.spryker.com/docs/ca/dev/getting-started-with-cloud-administration.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/ca/dev/getting-started-with-cloud-administration.html</guid>
            
            
        </item>
        
        <item>
            <title>Connecting to AWS Console and CLI with an IAM user</title>
            <description>&lt;p&gt;This document describes how to access the AWS Management Console and configure AWS CLI access as an IAM user with Multi-Factor Authentication (MFA) enforced.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html&quot;&gt;AWS CLI installed&lt;/a&gt; on your machine.&lt;/li&gt;
&lt;li&gt;An IAM user account and credentials provided by your administrator. If you need an account, &lt;a href=&quot;https://portal.spryker.com&quot;&gt;contact support&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;step-1-sign-in-to-the-aws-management-console&quot;&gt;Step 1: Sign in to the AWS Management Console&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;In your browser, open the sign-in URL provided by your administrator.&lt;/li&gt;
&lt;/ol&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Sign-in URL&lt;/div&gt;
&lt;p&gt;The sign-in URL contains the ID of the account you are signing into. The pattern is &lt;code&gt;https://{AWS_ACCOUNT_ID}.signin.aws.amazon.com/console/&lt;/code&gt;. Alternatively, you can sign in at the &lt;a href=&quot;https://console.aws.amazon.com/&quot;&gt;general sign-in endpoint&lt;/a&gt; by entering the account ID manually.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;p&gt;The sign-in page opens with the &lt;strong&gt;Account ID (12 digits) or account alias&lt;/strong&gt; field entered automatically.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Enter your &lt;strong&gt;IAM user name&lt;/strong&gt; and &lt;strong&gt;Password&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Sign in&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;When prompted, enter the MFA code from your authenticator application.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You are now signed in to the AWS Management Console.&lt;/p&gt;
&lt;h2 id=&quot;step-2-generate-access-keys&quot;&gt;Step 2: Generate access keys&lt;/h2&gt;
&lt;p&gt;Access keys are the long-term static credentials used to configure AWS CLI. Generate them once and store them securely.&lt;/p&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Access key scope&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;You can only generate an access key for your own account.&lt;/li&gt;
&lt;li&gt;Access keys are intended for local development and personal AWS CLI access only. Do not use them for automations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;ol&gt;
&lt;li&gt;In the AWS Management Console navigation bar, click your username &amp;gt; &lt;strong&gt;My Security Credentials&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Security credentials&lt;/strong&gt; page, click &lt;strong&gt;Create access key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Access key best practices &amp;amp; alternatives&lt;/strong&gt; page, select &lt;strong&gt;Command Line Interface (CLI)&lt;/strong&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.
The &lt;strong&gt;Create access key&lt;/strong&gt; window opens. Your access key has been generated.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Download .csv file&lt;/strong&gt; to save the credentials.&lt;/li&gt;
&lt;li&gt;Optional: To view the secret key in this window, click &lt;strong&gt;Show secret access key&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Store the downloaded credentials securely. The secret access key is shown only once.&lt;/p&gt;
&lt;h2 id=&quot;step-3-configure-static-credentials-in-your-terminal&quot;&gt;Step 3: Configure static credentials in your terminal&lt;/h2&gt;
&lt;p&gt;Because MFA is enforced, you need temporary session credentials to use the AWS CLI. Static credentials alone are only used to request those temporary credentials.&lt;/p&gt;
&lt;p&gt;Start by clearing any previously exported credentials to ensure no stale values are used:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;unset &lt;/span&gt;AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Then export your static access key pair:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;{YOUR_ACCESS_KEY_ID}&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;{YOUR_SECRET_ACCESS_KEY}&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;{YOUR_ACCESS_KEY_ID}&lt;/code&gt; and &lt;code&gt;{YOUR_SECRET_ACCESS_KEY}&lt;/code&gt; with the values from the &lt;code&gt;.csv&lt;/code&gt; file you downloaded in &lt;a href=&quot;#step-2-generate-access-keys&quot;&gt;Step 2&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;step-4-find-your-mfa-device-arn&quot;&gt;Step 4: Find your MFA device ARN&lt;/h2&gt;
&lt;p&gt;To retrieve your MFA device serial number, use the AWS CLI:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;aws iam list-mfa-devices
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The output contains a &lt;code&gt;SerialNumber&lt;/code&gt; field with a value in the following format:&lt;/p&gt;
&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;arn:aws:iam::{ACCOUNT_ID}:mfa/{DEVICE_NAME}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note this value — you need it in the next step.&lt;/p&gt;
&lt;h2 id=&quot;step-5-generate-temporary-session-credentials&quot;&gt;Step 5: Generate temporary session credentials&lt;/h2&gt;
&lt;p&gt;Use one of the following options, replacing the placeholders with your values:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option A: Step by step&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Request temporary credentials from AWS STS and save the output to a variable:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;temp_creds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;aws sts get-session-token &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--serial-number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;MFA_DEVICE_ARN&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--token-code&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;MFA_TOKEN_CODE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--query&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Credentials.[AccessKeyId,SecretAccessKey,SessionToken]&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--output&lt;/span&gt; text&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Read the three values from the output into separate variables:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$temp_creds&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Export them to your terminal session:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Clean up the temporary variable:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;unset &lt;/span&gt;temp_creds
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Option B: Single command&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run all of the above as a single command:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;temp_creds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;aws sts get-session-token &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--serial-number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;MFA_DEVICE_ARN&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--token-code&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;MFA_TOKEN_CODE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--query&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Credentials.[AccessKeyId,SecretAccessKey,SessionToken]&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--output&lt;/span&gt; text&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$temp_creds&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;unset &lt;/span&gt;temp_creds
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Placeholder&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{MFA_DEVICE_ARN}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;SerialNumber&lt;/code&gt; from &lt;a href=&quot;#step-4-find-your-mfa-device-arn&quot;&gt;Step 4&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{MFA_TOKEN_CODE}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The current 6-digit code from your authenticator application.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;temp_creds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;aws sts get-session-token &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--serial-number&lt;/span&gt; arn:aws:iam::123456789012:mfa/john.doe &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--token-code&lt;/span&gt; 521288 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--query&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Credentials.[AccessKeyId,SecretAccessKey,SessionToken]&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--output&lt;/span&gt; text&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$temp_creds&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;unset &lt;/span&gt;temp_creds
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The command fetches temporary credentials from AWS STS, reads the three values into variables, and exports them — overriding the static credentials in your current terminal session.&lt;/p&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Session duration&lt;/div&gt;
&lt;p&gt;Temporary credentials are valid for limited timeframe. When they expire, repeat &lt;a href=&quot;#step-3-configure-static-credentials-in-your-terminal&quot;&gt;Step 3&lt;/a&gt; and &lt;a href=&quot;#step-5-generate-temporary-session-credentials&quot;&gt;Step 5&lt;/a&gt; to obtain new ones. You can customize the duration using the &lt;code&gt;--duration-seconds&lt;/code&gt; parameter (minimum: 900 seconds).&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;p&gt;You can now use the AWS CLI to access your environment:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;aws ec2 describe-instances
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/connecting-the-docker-sdk.html&quot;&gt;Connecting the Docker SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/connecting-to-aws-cli-with-an-sso-user.html&quot;&gt;Connecting to AWS CLI with an SSO user&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Thu, 16 Jul 2026 15:05:07 +0000</pubDate>
            <link>https://docs.spryker.com/docs/ca/dev/access/connecting-to-aws-console-and-cli-with-an-iam-user.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/ca/dev/access/connecting-to-aws-console-and-cli-with-an-iam-user.html</guid>
            
            
        </item>
        
        <item>
            <title>Security</title>
            <description>This section explains how to check ECR image scan results and introduces the web application firewall:

- [Checking ECR image scan results](/docs/ca/dev/security/check-ecr-image-scan-results.html)
- [Web Application Firewall (WAF)](/docs/ca/dev/security/web-application-firewall-waf.html)

You can also find some details on the [Regular patching activities](/docs/ca/dev/security/patching-maintenancewindows.html)</description>
            <pubDate>Thu, 16 Jul 2026 13:50:17 +0000</pubDate>
            <link>https://docs.spryker.com/docs/ca/dev/security/security.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/ca/dev/security/security.html</guid>
            
            
        </item>
        
        <item>
            <title>Environments overview</title>
            <description>&lt;p&gt;This document describes the environment types shipped with Spryker and the best ways to use them. Knowing the purpose of the environments and working with them as intended can help you build more solid and performant projects.&lt;/p&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;
&lt;ul&gt;
&lt;li&gt;Contracts may vary, and this document only describes the environments types that may represent your default setup. If you are using a different setup, ask your project manager or product owner for a more detailed explanation.&lt;/li&gt;
&lt;li&gt;Your non-production environments don’t scale automatically. If you want to increase their scaling, let us know by submitting this form: &lt;a href=&quot;https://support.spryker.com/s/hosting-change-requests/environment-upscaling&quot;&gt;Upscale Request&lt;/a&gt;. Because of contractual reasons, only customers can request these changes, not partners.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;basic-concept&quot;&gt;Basic concept&lt;/h2&gt;
&lt;p&gt;We offer environments that serve different purposes. These environments are non-production, production-like, and production environments. We can configure these environments to be as similar as possible to make sure that the code you deploy in one environment behaves the same way as in the others. You can help us keep your environments consistent by taking this into consideration when sending us change requests.&lt;/p&gt;
&lt;h2 id=&quot;non-production-environments-non-prod&quot;&gt;Non-production environments (NON-PROD)&lt;/h2&gt;
&lt;p&gt;Used for development and testing purposes, smaller in size and doesn’t scale. We offer several types of NON-PROD environments as described in the following sections. Non-production environments don’t feature zero-downtime deployments because services, such as Yves or Glue, aren’t set up in a redundant manner.&lt;/p&gt;
&lt;h3 id=&quot;developer-environment-dev&quot;&gt;Developer environment (DEV)&lt;/h3&gt;
&lt;p&gt;A Dev environment is a non-production environment that is usually used to test code that just left your development team, or is used in the development process directly through continuous deployment. It is not designed to handle load tests and large datasets. The development environment does not provide autoscaling and and can only be scaled up upon request.&lt;/p&gt;
&lt;h3 id=&quot;staging-stage&quot;&gt;Staging (STAGE)&lt;/h3&gt;
&lt;p&gt;This environment is a non-production environment that is usually used to host a snapshot of the DEV environment, or a stable version of your code that is deployed to production eventually. You can use your STAGE environment to test how your code behaves in a production environment. However, staging is not of the same size as production, and a subset of data and expected traffic must be considered while running tests. This environment is regularly used for demos. The staging environment provides limited autoscaling capabilities and can only be scaled up on request.&lt;/p&gt;
&lt;h2 id=&quot;production-like-prod-like&quot;&gt;Production-like (PROD-LIKE)&lt;/h2&gt;
&lt;p&gt;This environment is set up exactly like a PROD environment. It’s designed to carry out temporary load testing and related activities in an environment similar to PROD. This makes deployments to PROD more predictable and prevents issues. PROD-LIKE behaves exactly like PROD, but it’s only available for a short time period to perform the necessary tests.&lt;/p&gt;
&lt;h2 id=&quot;production-prod&quot;&gt;Production (PROD)&lt;/h2&gt;
&lt;p&gt;Your production environment hosts the code that the end-user gets to interact with directly. The code must already be tested on the STAGE environment for stability and performance. In a PROD Environment, the application is automatically scaled to handle the load on the infrastructure generated by incoming requests.
Production environments also offer zero-downtime deployments of Spryker services, because Spryker services, such as Glue, Yves, and Back Office, are set up in a redundant manner, making sure there is always enough instances available to serve requests while others are updated.&lt;/p&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Making changes on PROD&lt;/div&gt;
&lt;p&gt;Before you deploy to PROD, make sure the changes were deployed and tested in your DEV and STAGE environments. We highly recommend testing every data load and import, as well as any integrations on your STAGE.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;next-step&quot;&gt;Next step&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/docs/ca/dev/access/connecting-to-aws-console-and-cli-with-an-iam-user.html&quot;&gt;Connecting to AWS Console and CLI with an IAM user&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Thu, 16 Jul 2026 13:50:17 +0000</pubDate>
            <link>https://docs.spryker.com/docs/ca/dev/environments-overview.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/ca/dev/environments-overview.html</guid>
            
            
        </item>
        
        <item>
            <title>Connecting to AWS CLI with an SSO user</title>
            <description>&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;
&lt;p&gt;This feature is part of a gradual rollout and will be available to everyone eventually. We will notify your team once your project is onboarded.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;p&gt;This document describes how to configure and use &lt;a href=&quot;https://github.com/Versent/saml2aws&quot;&gt;SAML2AWS&lt;/a&gt; to authenticate with the AWS CLI using your SSO credentials.&lt;/p&gt;
&lt;p&gt;SAML2AWS is a command-line tool that lets you authenticate against an identity provider (IdP) using SAML and obtain temporary AWS credentials. This gives you AWS CLI access to your cloud environment without managing long-lived AWS access keys.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Versent/saml2aws#install&quot;&gt;SAML2AWS installed&lt;/a&gt; on your machine.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html&quot;&gt;AWS CLI installed&lt;/a&gt; on your machine.&lt;/li&gt;
&lt;li&gt;An SSO user. See &lt;a href=&quot;/docs/ca/dev/cloud-hub/sso-user-management.html&quot;&gt;User Management SSO&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Your SSO login page URL. To get it, see &lt;a href=&quot;/docs/ca/dev/access/sso-access.html&quot;&gt;SSO Access&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;step-1-configure-saml2aws&quot;&gt;Step 1: Configure SAML2AWS&lt;/h2&gt;
&lt;p&gt;To configure SAML2AWS, replace the placeholders with your actual values and execute the following:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;saml2aws configure &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--idp-provider&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;Browser &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--browser-type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;BROWSER_TYPE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;YOUR_SSO_LOGIN_PAGE_URL&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;YOUR_PROFILE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--skip-prompt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--idp-provider=Browser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uses a browser-based login flow via your identity provider.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--browser-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The browser to use for authentication. See &lt;a href=&quot;#supported-browser-types&quot;&gt;Supported browser types&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SSO login page URL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The AWS CLI profile name to store credentials under.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--skip-prompt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skips interactive prompts and applies values directly.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;saml2aws configure &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--idp-provider&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;Browser &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--browser-type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;chrome &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;https://auth.spryker.systems/realms/my-realm/protocol/saml/clients/my-aws-client &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;my-aws-profile &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--skip-prompt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;step-2-log-in-with-saml2aws&quot;&gt;Step 2: Log in with SAML2AWS&lt;/h2&gt;
&lt;p&gt;After configuring, run the login command to authenticate and retrieve temporary AWS credentials:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;saml2aws login &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;YOUR_PROFILE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--skip-prompt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Add &lt;code&gt;--force&lt;/code&gt; to skip the expiry check and re-authenticate even if existing credentials are still valid:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;saml2aws login &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;YOUR_PROFILE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--skip-prompt&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Browser driver&lt;/div&gt;
&lt;p&gt;On some operating systems and browsers, SAML2AWS needs to download a browser driver automatically. If login fails or the browser does not open, add the &lt;code&gt;--download-browser-driver&lt;/code&gt; flag:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;saml2aws login &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;YOUR_PROFILE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--download-browser-driver&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--skip-prompt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You do not need this flag if you are on Linux and using Chrome.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;p&gt;On successful authentication, your terminal displays a confirmation and the credentials are saved under the specified profile.&lt;/p&gt;
&lt;h2 id=&quot;step-3-use-the-aws-cli&quot;&gt;Step 3: Use the AWS CLI&lt;/h2&gt;
&lt;p&gt;Pass &lt;code&gt;--profile {YOUR_PROFILE}&lt;/code&gt; to any AWS CLI command to use the credentials obtained from SAML2AWS:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;aws &lt;span class=&quot;nt&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;YOUR_PROFILE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; s3 &lt;span class=&quot;nb&quot;&gt;ls
&lt;/span&gt;aws &lt;span class=&quot;nt&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;YOUR_PROFILE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; ec2 describe-instances
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;To avoid specifying &lt;code&gt;--profile&lt;/code&gt; with every command, set the &lt;code&gt;AWS_PROFILE&lt;/code&gt; environment variable for your session:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AWS_PROFILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;YOUR_PROFILE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
aws s3 &lt;span class=&quot;nb&quot;&gt;ls
&lt;/span&gt;aws ec2 describe-instances
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The temporary credentials expire after a set period. When they expire, re-run the login command from &lt;a href=&quot;#step-2-log-in-with-saml2aws&quot;&gt;Step 2&lt;/a&gt; to refresh them.&lt;/p&gt;
&lt;h2 id=&quot;supported-browser-types&quot;&gt;Supported browser types&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;--browser-type&lt;/code&gt; parameter accepts the following values (see the &lt;a href=&quot;https://github.com/Versent/saml2aws/blob/v2.36.19/cmd/saml2aws/main.go#L76&quot;&gt;full list in the saml2aws source&lt;/a&gt;):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Browser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chrome&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google Chrome (stable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chrome-beta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google Chrome Beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chrome-dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google Chrome Dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chrome-canary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google Chrome Canary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chromium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chromium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;firefox&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mozilla Firefox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;webkit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WebKit (Safari engine, macOS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msedge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Edge (stable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msedge-beta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Edge Beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msedge-dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Edge Dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msedge-canary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Edge Canary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;os-and-browser-combinations&quot;&gt;OS and browser combinations&lt;/h2&gt;
&lt;p&gt;The following combinations have been verified to work:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operating system&lt;/th&gt;
&lt;th&gt;Browser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu&lt;/td&gt;
&lt;td&gt;Chrome, Chromium, Firefox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS&lt;/td&gt;
&lt;td&gt;WebKit, Chromium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows 10&lt;/td&gt;
&lt;td&gt;Chrome, Firefox, Microsoft Edge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Chrome on macOS&lt;/div&gt;
&lt;p&gt;Chrome on macOS may not work for all users. If you experience issues, use &lt;code&gt;webkit&lt;/code&gt; or &lt;code&gt;chromium&lt;/code&gt; instead.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;Troubleshooting&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The browser does not open during login.&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;--download-browser-driver&lt;/code&gt; to the login command to let SAML2AWS download the required browser driver automatically.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication fails or credentials are not saved.&lt;/td&gt;
&lt;td&gt;Verify that &lt;code&gt;--browser-type&lt;/code&gt; matches a browser installed on your machine and that the &lt;code&gt;--url&lt;/code&gt; value is correct.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The AWS CLI does not recognize the profile.&lt;/td&gt;
&lt;td&gt;Ensure the &lt;code&gt;--profile&lt;/code&gt; value in the login command matches the one used during configuration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Error authenticating to IDP.: please install the driver (vx.x.x) and browsers first: %!w(&amp;lt;nil&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;--download-browser-driver&lt;/code&gt; to the login command to let SAML2AWS download the required browser driver automatically.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/sso-access.html&quot;&gt;SSO Access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/connecting-to-aws-console-and-cli-with-an-iam-user.html&quot;&gt;Connecting to AWS Console and CLI with an IAM user&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Thu, 16 Jul 2026 13:50:17 +0000</pubDate>
            <link>https://docs.spryker.com/docs/ca/dev/access/connecting-to-aws-cli-with-an-sso-user.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/ca/dev/access/connecting-to-aws-cli-with-an-sso-user.html</guid>
            
            
        </item>
        
        <item>
            <title>Access</title>
            <description>&lt;p&gt;This section describes how to access AWS Management Console as an Identity and Access Management (IAM) user, locate the credentials for Spryker Cloud Commerce OS services, and connect to services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/sso-access.html&quot;&gt;SSO Access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/sso-security-options.html&quot;&gt;SSO Security Options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/connecting-to-aws-console-and-cli-with-an-iam-user.html&quot;&gt;Connecting to AWS Console and CLI with an IAM user&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/connecting-to-aws-cli-with-an-sso-user.html&quot;&gt;Connecting to AWS CLI with an SSO user&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/locate-service-credentials.html&quot;&gt;Locating service credentials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/ca/dev/access/connect-to-services-via-ssh.html&quot;&gt;Connecting to services via SSH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Thu, 16 Jul 2026 13:50:17 +0000</pubDate>
            <link>https://docs.spryker.com/docs/ca/dev/access/access.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/ca/dev/access/access.html</guid>
            
            
        </item>
        
    </channel>
</rss>
