Skip to content

feat(copilot): local agent generation with validation, fixing, MCP & sub-agent support - #12238

Merged
majdyz merged 60 commits into
devfrom
feat/copilot-local-agent-generation
Mar 9, 2026
Merged

feat(copilot): local agent generation with validation, fixing, MCP & sub-agent support#12238
majdyz merged 60 commits into
devfrom
feat/copilot-local-agent-generation

Conversation

@majdyz

@majdyz majdyz commented Mar 1, 2026

Copy link
Copy Markdown
Contributor

Summary

Port the agent generation pipeline from the external AgentGenerator service into local copilot tools, making the Claude Agent SDK itself handle validation, fixing, and block recommendation — no separate inner LLM calls needed.

Key capabilities:

  • Local agent generation: Create, edit, and customize agents entirely within the SDK session
  • Graph validation: 9 validation checks (block existence, link references, type compatibility, IO blocks, etc.)
  • Graph fixing: 17+ auto-fix methods (ID repair, link rewiring, type conversion, credential stripping, dynamic block sink names, etc.)
  • MCP tool blocks: Guide and fixer support for MCPToolBlock nodes with proper dynamic input schema handling
  • Sub-agent composition: AgentExecutorBlock support with library agent schema enrichment
  • Embedding fallback: Falls back to OpenRouter for embeddings when openai_internal_api_key is unavailable
  • Actionable error messages: Excluded block types (MCP, Agent) return specific hints redirecting to the correct tool

New Tools

  • validate_agent_graph — run 9 validation checks on agent JSON
  • fix_agent_graph — apply 17+ auto-fixes to agent JSON
  • get_blocks_for_goal — recommend blocks for a given goal (with optimized descriptions)

Refactored Tools

  • create_agent, edit_agent, customize_agent — accept agent_json for local generation with shared fix→validate→save pipeline
  • find_block — added include_schemas parameter, excludes MCP/Agent blocks with actionable hints
  • run_block — actionable error messages for excluded block types
  • find_library_agent — enriched with graph_version, input_schema, output_schema for sub-agent composition

Architecture

  • Split 2,558-line validation.py into fixer.py, validator.py, helpers.py, pipeline.py
  • Extracted shared fix_validate_and_save() pipeline (was duplicated across 3 tools)
  • Shared OPENROUTER_BASE_URL constant across codebase
  • Comprehensive test coverage: 78+ unit tests for fixer/validator, 8 run_block tests, 17 SDK compat tests

Test plan

  • poetry run format passes
  • poetry run pytest -s -vvv backend/copilot/ — all tests pass
  • CI green on all Python versions (3.11, 3.12, 3.13)
  • Manual E2E: copilot generates agents with correct IO blocks, links, and node structure
  • Manual E2E: MCP tool blocks use bare field names for dynamic inputs
  • Manual E2E: sub-agent composition with AgentExecutorBlock

…K tools

Port validation, fixing, and block recommendation logic from the external
AgentGenerator service into the copilot, so the Claude Agent SDK itself
serves as the generation brain. No separate inner LLM calls needed.

New tools:
- get_blocks_for_goal: discovers relevant blocks for a given goal
- validate_agent_graph: validates agent JSON structure and correctness
- fix_agent_graph: auto-fixes common agent JSON issues

Refactored tools (dual-mode with feature flag):
- create_agent: accepts agent_json for local validate+fix+save
- edit_agent: accepts agent_json for local patch+validate+fix+save
- customize_agent: accepts agent_json for local validate+fix+save

Also adds agent generation guide to copilot system prompt and
agent_generator_use_local feature flag in ChatConfig.
@github-project-automation github-project-automation Bot moved this to 🆕 Needs initial review in AutoGPT development kanban Mar 1, 2026
@github-actions github-actions Bot added platform/frontend AutoGPT Platform - Front end platform/backend AutoGPT Platform - Back end labels Mar 1, 2026
@coderabbitai

coderabbitai Bot commented Mar 1, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds an in-repo agent-generation subsystem (fixer, validator, blocks, pipeline), three new tools (get_blocks_for_goal, validate_agent_graph, fix_agent_graph), dual-mode local/external flows for create/edit/customize tools accepting agent_json, new response types, and a ChatConfig toggle agent_generator_use_local.

Changes

Cohort / File(s) Summary
Config & SDK
autogpt_platform/backend/backend/copilot/config.py, autogpt_platform/backend/backend/copilot/sdk/service.py
Added agent_generator_use_local: bool with a before-mode env-var validator; appended agent-generation guidance/documentation text in the SDK service file.
Tool Registry & Exports
autogpt_platform/backend/backend/copilot/tools/__init__.py, autogpt_platform/backend/backend/copilot/tools/agent_generator/__init__.py
Registered new agent-generation tools in TOOL_REGISTRY and exported AgentFixer, AgentValidator.
Blocks & Helpers
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py, .../helpers.py
New blocks module: cached block metadata/summaries, tokenized scoring, recommend_blocks_for_goal, lookup utilities, and _reset_caches; re-export get_blocks_as_dicts via helpers.
Fixer Core
.../agent_generator/fixer.py
Introduces AgentFixer with many async fix routines (ID normalization, wiring fixes, block insertions, type converters, agent-executor enrichment, apply_all_fixes, logging utilities).
Validator Core
.../agent_generator/validator.py, .../agent_generator/validation.py
Adds AgentValidator, fix_and_validate workflow and a validation module that re-exports fixer/validator/helpers.
Pipeline
autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py
New fetch_library_agents and fix_validate_and_save pipeline: applies fixes, validates, returns preview or saves agent (save requires auth), and yields structured responses.
New Tools & Models
autogpt_platform/backend/backend/copilot/tools/get_blocks.py, .../validate_agent.py, .../fix_agent.py, .../models.py
Added GetBlocksForGoalTool, ValidateAgentGraphTool, FixAgentGraphTool; new response types BlocksForGoalResponse, ValidationResultResponse, FixResultResponse and updated ResponseType enum.
Existing Tools — Dual-mode updates
autogpt_platform/backend/backend/copilot/tools/create_agent.py, .../customize_agent.py, .../edit_agent.py
Refactored to support local (agent_json) vs external generation: added agent_json parameter, split flows into _execute_local / _execute_external, integrated fix_validate_and_save and library-agent fetching.
Tool Registry Additions
autogpt_platform/backend/backend/copilot/tools/__init__.py
Registered new tools: get_blocks_for_goal, validate_agent_graph, fix_agent_graph.
Tests
autogpt_platform/backend/backend/copilot/tools/*_test.py
Added/expanded tests for block recommendation, validator/fixer, and dual-mode create/edit/customize flows (extensive mocks, AsyncMock, fixtures).
Frontend API
autogpt_platform/frontend/src/app/api/openapi.json
Updated ResponseType enum to include blocks_for_goal, validation_result, and fix_result.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Tool as Agent Tool
    participant Fixer as AgentFixer
    participant Validator as AgentValidator
    participant DB as save_agent_to_library
    participant ExtService as External Service

    alt Local Mode (agent_json provided)
        Client->>Tool: call _execute(agent_json, save?)
        Tool->>Tool: validate presence of nodes
        Tool->>Fixer: apply_all_fixes(agent_json, blocks)
        Fixer-->>Tool: fixed_agent, fixes_applied
        Tool->>Validator: validate(fixed_agent, blocks)
        alt Validation passes
            Tool-->>Client: AgentPreviewResponse (if save=false)
            alt save=true
                Tool->>DB: save_agent_to_library(user_id, fixed_agent)
                DB-->>Tool: AgentSavedResponse
                Tool-->>Client: AgentSavedResponse
            end
        else Validation fails
            Tool-->>Client: ErrorResponse(validation_failed, errors)
        end
    else External Mode (description/changes provided)
        Client->>Tool: call _execute(changes or description, save?)
        Tool->>ExtService: generate_agent_patch / agent generation
        ExtService-->>Tool: updated_agent_json or error
        alt Service success
            Tool-->>Client: AgentPreviewResponse (if save=false)
            alt save=true
                Tool->>DB: save_agent_to_library(user_id, updated_agent)
                DB-->>Tool: AgentSavedResponse
                Tool-->>Client: AgentSavedResponse
            end
        else Service error
            Tool-->>Client: ErrorResponse(service_error)
        end
    end
Loading
sequenceDiagram
    participant Client
    participant GetBlocksTool as GetBlocksForGoalTool
    participant Recommender as recommend_blocks_for_goal
    participant BlockCache as get_blocks_as_dicts
    participant ValidateTool as ValidateAgentGraphTool
    participant FixTool as FixAgentGraphTool
    participant Validator as AgentValidator
    participant Fixer as AgentFixer

    Client->>GetBlocksTool: goal="build auth flow"
    GetBlocksTool->>Recommender: recommend_blocks_for_goal(goal)
    Recommender->>BlockCache: get_blocks_as_dicts()
    BlockCache-->>Recommender: block metadata
    Recommender-->>GetBlocksTool: ranked blocks
    GetBlocksTool-->>Client: BlocksForGoalResponse

    Client->>ValidateTool: submit agent_json
    ValidateTool->>BlockCache: get_blocks_as_dicts()
    BlockCache-->>ValidateTool: blocks
    ValidateTool->>Validator: validate(agent_json, blocks)
    Validator-->>ValidateTool: valid/errors
    ValidateTool-->>Client: ValidationResultResponse

    Client->>FixTool: submit agent_json with issues
    FixTool->>BlockCache: get_blocks_as_dicts()
    BlockCache-->>FixTool: blocks
    FixTool->>Fixer: apply_all_fixes(agent_json, blocks)
    Fixer-->>FixTool: fixed_agent, fixes_applied
    FixTool->>Validator: validate(fixed_agent, blocks)
    Validator-->>FixTool: valid/remaining_errors
    FixTool-->>Client: FixResultResponse
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested labels

platform/blocks, Possible security concern, Review effort 4/5

Suggested reviewers

  • Swiftyos
  • ntindle
  • Pwuts

Poem

🐇
I nibbled broken links and sowed new nodes,
Tuned curly prompts and hopped along code roads,
Blocks now line up neat in rows,
Local builders hum while validation grows,
Hooray — the agent garden proudly glows!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 67.97% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: local agent generation with validation, fixing, MCP and sub-agent support in the copilot module.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, covering new tools, refactored tools, architecture changes, and test plans.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/copilot-local-agent-generation

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented Mar 1, 2026

Copy link
Copy Markdown
Contributor

🔍 PR Overlap Detection

This check compares your PR against all other open PRs targeting the same branch to detect potential merge conflicts early.

🔴 Merge Conflicts Detected

The following PRs have been tested and will have merge conflicts if merged after this PR. Consider coordinating with the authors.

🟢 Low Risk — File Overlap Only

These PRs touch the same files but different sections (click to expand)

Summary: 5 conflict(s), 0 medium risk, 13 low risk (out of 18 PRs with file overlap)


Auto-generated on push. Ignores: openapi.json, lock files.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (8)
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (1)

17-18: Export the primary helper functions in __all__ for a consistent public module surface.

Right now only BlockCategory and _reset_caches are exported, even though this module also defines core helper APIs used for retrieval/recommendation.

♻️ Proposed patch
-__all__ = ["BlockCategory", "_reset_caches"]
+__all__ = [
+    "BlockCategory",
+    "_reset_caches",
+    "get_blocks_as_dicts",
+    "get_block_summaries",
+    "recommend_blocks_for_goal",
+    "get_block_by_id",
+]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py`
around lines 17 - 18, The module currently only exposes "BlockCategory" and
"_reset_caches" in __all__; update __all__ to also export the module's primary
helper APIs used for retrieval/recommendation so the public surface is
consistent. Locate the helper functions in this file (the
retrieval/recommendation helpers near the BlockCategory/_reset_caches
definitions — e.g., functions like get_block_by_id, find_blocks,
recommend_blocks or other similarly named retrieval helpers) and add their exact
names to the __all__ list so they are publicly exported alongside
"BlockCategory" and "_reset_caches".
autogpt_platform/backend/backend/copilot/tools/create_agent_test.py (1)

33-38: Consider renaming test for clarity.

The test name test_missing_description_and_json_returns_error implies testing the case where both description and agent_json are missing, but the test only passes an empty description="". While this correctly tests the external mode error path (since agent_json is implicitly None), the name could be clearer.

Suggested rename
 `@pytest.mark.asyncio`
-async def test_missing_description_and_json_returns_error(tool, session):
-    """Missing both description and agent_json returns ErrorResponse."""
+async def test_external_mode_missing_description_returns_error(tool, session):
+    """External mode with empty description (no agent_json) returns ErrorResponse."""
     result = await tool._execute(user_id=_TEST_USER_ID, session=session, description="")
     assert isinstance(result, ErrorResponse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/create_agent_test.py` around
lines 33 - 38, Rename the test function
test_missing_description_and_json_returns_error to clearly indicate that
agent_json is omitted (None) while description is empty—e.g.,
test_missing_description_with_no_agent_json_returns_error or
test_empty_description_and_no_agent_json_returns_error—and update the function
name and its docstring to match; keep the test body (calling tool._execute with
description="" and no agent_json) unchanged so it still asserts
isinstance(result, ErrorResponse).
autogpt_platform/backend/backend/copilot/tools/edit_agent.py (1)

156-184: Same pattern issues as create_agent.py.

This has the same two issues:

  1. Redundant get_blocks_as_dicts() calls (Lines 158 and 169)
  2. Validation exception swallowed on Line 183-184, potentially allowing corrupted agents to be saved

Consider applying the same fix pattern suggested for create_agent.py to maintain consistency.

Suggested improvement
+        # Load blocks once for both fix and validate
+        try:
+            blocks = get_blocks_as_dicts()
+        except Exception as e:
+            logger.error(f"Failed to load blocks: {e}", exc_info=True)
+            return ErrorResponse(
+                message="Failed to load block definitions. Please try again.",
+                error="blocks_load_failed",
+                session_id=session_id,
+            )
+
         # Auto-fix
         try:
-            blocks = get_blocks_as_dicts()
             fixer = AgentFixer()
             agent_json = await fixer.apply_all_fixes(agent_json, blocks)
             # ...
         except Exception as e:
             logger.warning(f"Auto-fix failed: {e}")

         # Validate
         try:
-            blocks = get_blocks_as_dicts()
             validator = AgentValidator()
             # ...
         except Exception as e:
-            logger.warning(f"Validation failed: {e}")
+            logger.error(f"Validation error: {e}", exc_info=True)
+            return ErrorResponse(
+                message=f"Validation encountered an error: {str(e)}",
+                error="validation_exception",
+                session_id=session_id,
+            )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/edit_agent.py` around lines
156 - 184, The code calls get_blocks_as_dicts() twice and swallows validation
exceptions; change the flow so you call get_blocks_as_dicts() once and reuse the
result for both auto-fix (AgentFixer.apply_all_fixes) and validation
(AgentValidator.validate), and ensure validation exceptions are not silently
ignored—catch them and return or propagate a proper ErrorResponse (using
ErrorResponse with error="validation_failed" or re-raise) instead of only
logging via logger.warning; update references around AgentFixer,
AgentValidator.validate, get_blocks_as_dicts, logger.warning, and ErrorResponse
to implement this single-source blocks variable and robust error handling.
autogpt_platform/backend/backend/copilot/tools/create_agent.py (2)

101-101: Empty required array may cause issues with some OpenAI API clients.

The parameters schema has "required": []. While semantically correct (neither agent_json nor description is individually required since one or the other is needed), some OpenAI function-calling implementations may behave unexpectedly with an empty required array. Consider documenting this clearly or validating in _execute that at least one is provided.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/create_agent.py` at line 101,
The parameters schema currently sets "required": [] which can break some OpenAI
function-calling clients; update the handler for create_agent (in
create_agent.py) to validate inputs at runtime inside the _execute method (or
equivalent entrypoint) by checking that at least one of parameters "agent_json"
or "description" is present and non-empty, and raise a clear error (or return a
proper failure response) if neither is provided; alternatively add explicit
documentation in the function docstring/comments mentioning the requirement so
callers know to supply one of those fields.

144-174: Redundant call and overly permissive exception handling.

Two observations:

  1. get_blocks_as_dicts() is called twice (Lines 146 and 157). While the function caches results, assigning to a single variable would be cleaner.

  2. Line 173-174: Swallowing the validation exception and proceeding anyway may hide real issues. If validation itself fails (not just "invalid agent"), the agent could be saved in a corrupt state.

Suggested improvement
+        # Load blocks once for both fix and validate
+        try:
+            blocks = get_blocks_as_dicts()
+        except Exception as e:
+            logger.error(f"Failed to load blocks: {e}", exc_info=True)
+            return ErrorResponse(
+                message="Failed to load block definitions. Please try again.",
+                error="blocks_load_failed",
+                session_id=session_id,
+            )
+
         # Auto-fix common issues
         try:
-            blocks = get_blocks_as_dicts()
             fixer = AgentFixer()
             agent_json = await fixer.apply_all_fixes(agent_json, blocks)
             fixes = fixer.get_fixes_applied()
             if fixes:
                 logger.info(f"Applied {len(fixes)} auto-fixes to agent JSON")
         except Exception as e:
             logger.warning(f"Auto-fix failed, proceeding with original: {e}")

         # Validate
         try:
-            blocks = get_blocks_as_dicts()
             validator = AgentValidator()
             is_valid, _ = validator.validate(agent_json, blocks)
             if not is_valid:
                 # ... existing error handling ...
         except Exception as e:
-            logger.warning(f"Validation failed, proceeding anyway: {e}")
+            logger.error(f"Validation error: {e}", exc_info=True)
+            return ErrorResponse(
+                message=f"Validation encountered an error: {str(e)}",
+                error="validation_exception",
+                session_id=session_id,
+            )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/create_agent.py` around lines
144 - 174, Replace the two separate calls to get_blocks_as_dicts() by calling it
once before the auto-fix block and reusing the resulting blocks variable for
both AgentFixer.apply_all_fixes and AgentValidator.validate, and tighten
exception handling so that exceptions from validation are not silently ignored:
catch exceptions from validator.validate and on exception log the full exception
(using logger.error) and return an ErrorResponse (similar shape to the existing
validation failure response, including session_id and details) instead of
proceeding; keep the existing auto-fix try/except behavior but ensure the shared
blocks variable is used by AgentFixer and AgentValidator.
autogpt_platform/backend/backend/copilot/tools/get_blocks.py (1)

112-112: Move import to top of file.

The BlocksForGoalResponse import is inside the method (Line 112). Since ErrorResponse is already imported from the same module at the top (Line 10), BlocksForGoalResponse can be imported alongside it to maintain consistency and avoid the runtime import overhead on each call.

Suggested fix
 from .agent_generator.blocks import recommend_blocks_for_goal
 from .base import BaseTool
-from .models import ErrorResponse, ToolResponseBase
+from .models import BlocksForGoalResponse, ErrorResponse, ToolResponseBase

 logger = logging.getLogger(__name__)

Then remove Line 112:

-        from .models import BlocksForGoalResponse
-
         return BlocksForGoalResponse(
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/get_blocks.py` at line 112,
Move the from .models import BlocksForGoalResponse out of the function and into
the module-level imports alongside the existing ErrorResponse import;
specifically add BlocksForGoalResponse to the top-of-file import list where
ErrorResponse is already imported and remove the in-method import (the one
currently importing BlocksForGoalResponse inside the function) so the function
uses the module-level BlocksForGoalResponse symbol.
autogpt_platform/backend/backend/copilot/tools/customize_agent.py (2)

102-115: Local mode doesn't use agent_id but it's required.

The agent_id parameter is validated as required (lines 106-111), but _execute_local never uses it. In local mode, the complete agent is in agent_json. Consider either:

  1. Making agent_id optional when agent_json is provided, or
  2. Using agent_id for logging/tracking in local mode
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/customize_agent.py` around
lines 102 - 115, The handler currently rejects requests missing agent_id even
when a full agent is provided in agent_json; update the validation in the method
that reads agent_id/agent_json so that if agent_json is present and is a dict
the function does not return the ErrorResponse for missing agent_id but instead
proceeds to call _execute_local(user_id, session_id, agent_json, kwargs);
alternatively (preferred) set agent_id to a fallback value (e.g., derived from
agent_json metadata or a generated token) and pass it into _execute_local for
logging/tracking, ensuring _execute_local and _execute_external usage is
consistent and that ErrorResponse is only returned when neither agent_json nor
agent_id is provided.

187-213: Consider extracting common save logic.

The save flow (auth check, save_agent_to_library call, response construction) is duplicated between _execute_local (lines 187-213) and _execute_external (lines 381-408). Consider extracting a helper method like _save_agent(user_id, session_id, agent_json, display_name) to reduce duplication.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/customize_agent.py` around
lines 187 - 213, Extract the duplicated save flow in _execute_local and
_execute_external into a helper (e.g., _save_agent) that accepts user_id,
session_id, agent_json, and display_name; inside it perform the auth check
(return ErrorResponse with "auth_required" if no user_id), call
save_agent_to_library(agent_json, user_id, is_update=False), and
construct/return either AgentSavedResponse (using created_graph.id/name and
library_agent.id) or ErrorResponse on exception (propagating the exception
message in details). Replace the duplicated blocks in _execute_local and
_execute_external with calls to this new _save_agent helper.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@autogpt_platform/backend/backend/copilot/config.py`:
- Around line 96-103: Add an environment-variable field validator for the
agent_generator_use_local toggle so it can be set via
CHAT_AGENT_GENERATOR_USE_LOCAL like the existing use_claude_agent_sdk toggle;
specifically, in the same Pydantic model/class that defines
agent_generator_use_local, add a `@validator` (or `@field_validator` depending on
pydantic version) method named similarly to the existing use_claude_agent_sdk
validator that reads and parses os.getenv("CHAT_AGENT_GENERATOR_USE_LOCAL") into
a bool and returns/sets the field value, mirroring the logic and semantics used
by use_claude_agent_sdk to ensure consistent CHAT_* env var behavior.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py`:
- Around line 263-273: The function currently seeds result with all basic_blocks
which can exceed max_blocks; change the logic in the block that builds result
(variables basic_blocks, basic_ids, result, scored, max_blocks) so that you
first truncate basic_blocks to at most max_blocks (or slice result after
initialization) and update basic_ids accordingly, then iterate scored and append
until len(result) == max_blocks; ensure you return result[:max_blocks] as a
final safeguard so the caller never receives more than max_blocks.

In `@autogpt_platform/backend/backend/copilot/tools/customize_agent.py`:
- Around line 404-408: The except block in the save routine currently swallows
exceptions and returns ErrorResponse without details; update the handler in the
save method (the except in customize_agent.py around the save workflow) to
capture the exception as e, log it (e.g., via existing logger or process
logger), and include str(e) in the ErrorResponse.error or a new error_detail
field, mirroring the pattern used in _execute_local (lines ~207-213) so callers
and logs receive the actual exception message for debugging.
- Around line 139-166: The validation exception is currently swallowed which can
allow unvalidated agents to be saved and get_blocks_as_dicts() is called twice;
change the flow so you call get_blocks_as_dicts() once and reuse its result for
both fixes and validation, and ensure AgentValidator.validate exceptions do not
get ignored — either let the exception propagate or catch it and return an
ErrorResponse (e.g., error="validation_exception") containing the exception
message and details (include session_id and validator.errors if available) so
saving is aborted; reference AgentFixer.apply_all_fixes,
AgentValidator.validate, validator.errors, get_blocks_as_dicts, and
ErrorResponse when making these changes.

In `@autogpt_platform/backend/backend/copilot/tools/fix_agent.py`:
- Around line 86-90: The AgentExecutorBlock fixes are never executed because
AgentFixer.apply_all_fixes(agent_json, blocks) is called without the
library_agents parameter; update the call site (where get_blocks_as_dicts(),
AgentFixer(), and apply_all_fixes are used) to pass the library_agents value
through to apply_all_fixes so that validation.fix_agent_executor_blocks (which
checks if library_agents is truthy) runs, or alternatively remove/adjust any
tool description that claims AgentExecutorBlock fixes are applied; specifically
modify the call to apply_all_fixes to include the library_agents argument (e.g.,
apply_all_fixes(agent_json, blocks, library_agents)) so
fix_agent_executor_blocks will be invoked by AgentFixer.

In `@autogpt_platform/frontend/src/app/api/openapi.json`:
- Around line 11173-11176: ResponseType was extended to include
"blocks_for_goal", "validation_result", and "fix_result" but their corresponding
OpenAPI schemas (BlocksForGoalResponse, ValidationResultResponse,
FixResultResponse) and the export inclusion in /api/chat/schema/tool-responses
anyOf are missing; regenerate or sync the OpenAPI spec from the backend models
so those three response schemas are defined and added to the tool-responses
anyOf list (or add placeholder/dummy refs if necessary) so generated frontend
types include BlocksForGoalResponse, ValidationResultResponse, and
FixResultResponse and use generated types rather than inline SSE-only types.

---

Nitpick comments:
In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py`:
- Around line 17-18: The module currently only exposes "BlockCategory" and
"_reset_caches" in __all__; update __all__ to also export the module's primary
helper APIs used for retrieval/recommendation so the public surface is
consistent. Locate the helper functions in this file (the
retrieval/recommendation helpers near the BlockCategory/_reset_caches
definitions — e.g., functions like get_block_by_id, find_blocks,
recommend_blocks or other similarly named retrieval helpers) and add their exact
names to the __all__ list so they are publicly exported alongside
"BlockCategory" and "_reset_caches".

In `@autogpt_platform/backend/backend/copilot/tools/create_agent_test.py`:
- Around line 33-38: Rename the test function
test_missing_description_and_json_returns_error to clearly indicate that
agent_json is omitted (None) while description is empty—e.g.,
test_missing_description_with_no_agent_json_returns_error or
test_empty_description_and_no_agent_json_returns_error—and update the function
name and its docstring to match; keep the test body (calling tool._execute with
description="" and no agent_json) unchanged so it still asserts
isinstance(result, ErrorResponse).

In `@autogpt_platform/backend/backend/copilot/tools/create_agent.py`:
- Line 101: The parameters schema currently sets "required": [] which can break
some OpenAI function-calling clients; update the handler for create_agent (in
create_agent.py) to validate inputs at runtime inside the _execute method (or
equivalent entrypoint) by checking that at least one of parameters "agent_json"
or "description" is present and non-empty, and raise a clear error (or return a
proper failure response) if neither is provided; alternatively add explicit
documentation in the function docstring/comments mentioning the requirement so
callers know to supply one of those fields.
- Around line 144-174: Replace the two separate calls to get_blocks_as_dicts()
by calling it once before the auto-fix block and reusing the resulting blocks
variable for both AgentFixer.apply_all_fixes and AgentValidator.validate, and
tighten exception handling so that exceptions from validation are not silently
ignored: catch exceptions from validator.validate and on exception log the full
exception (using logger.error) and return an ErrorResponse (similar shape to the
existing validation failure response, including session_id and details) instead
of proceeding; keep the existing auto-fix try/except behavior but ensure the
shared blocks variable is used by AgentFixer and AgentValidator.

In `@autogpt_platform/backend/backend/copilot/tools/customize_agent.py`:
- Around line 102-115: The handler currently rejects requests missing agent_id
even when a full agent is provided in agent_json; update the validation in the
method that reads agent_id/agent_json so that if agent_json is present and is a
dict the function does not return the ErrorResponse for missing agent_id but
instead proceeds to call _execute_local(user_id, session_id, agent_json,
kwargs); alternatively (preferred) set agent_id to a fallback value (e.g.,
derived from agent_json metadata or a generated token) and pass it into
_execute_local for logging/tracking, ensuring _execute_local and
_execute_external usage is consistent and that ErrorResponse is only returned
when neither agent_json nor agent_id is provided.
- Around line 187-213: Extract the duplicated save flow in _execute_local and
_execute_external into a helper (e.g., _save_agent) that accepts user_id,
session_id, agent_json, and display_name; inside it perform the auth check
(return ErrorResponse with "auth_required" if no user_id), call
save_agent_to_library(agent_json, user_id, is_update=False), and
construct/return either AgentSavedResponse (using created_graph.id/name and
library_agent.id) or ErrorResponse on exception (propagating the exception
message in details). Replace the duplicated blocks in _execute_local and
_execute_external with calls to this new _save_agent helper.

In `@autogpt_platform/backend/backend/copilot/tools/edit_agent.py`:
- Around line 156-184: The code calls get_blocks_as_dicts() twice and swallows
validation exceptions; change the flow so you call get_blocks_as_dicts() once
and reuse the result for both auto-fix (AgentFixer.apply_all_fixes) and
validation (AgentValidator.validate), and ensure validation exceptions are not
silently ignored—catch them and return or propagate a proper ErrorResponse
(using ErrorResponse with error="validation_failed" or re-raise) instead of only
logging via logger.warning; update references around AgentFixer,
AgentValidator.validate, get_blocks_as_dicts, logger.warning, and ErrorResponse
to implement this single-source blocks variable and robust error handling.

In `@autogpt_platform/backend/backend/copilot/tools/get_blocks.py`:
- Line 112: Move the from .models import BlocksForGoalResponse out of the
function and into the module-level imports alongside the existing ErrorResponse
import; specifically add BlocksForGoalResponse to the top-of-file import list
where ErrorResponse is already imported and remove the in-method import (the one
currently importing BlocksForGoalResponse inside the function) so the function
uses the module-level BlocksForGoalResponse symbol.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1c51dd1 and 0d64af9.

📒 Files selected for processing (19)
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/sdk/service.py
  • autogpt_platform/backend/backend/copilot/tools/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
  • autogpt_platform/backend/backend/copilot/tools/models.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/frontend/src/app/api/openapi.json
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Seer Code Review
🧰 Additional context used
📓 Path-based instructions (6)
autogpt_platform/backend/**/*.py

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/backend/**/*.py: Use Python 3.11 (required; managed by Poetry via pyproject.toml) for backend development
Always run 'poetry run format' (Black + isort) before linting in backend development
Always run 'poetry run lint' (ruff) after formatting in backend development

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/models.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/sdk/service.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
  • autogpt_platform/backend/backend/copilot/tools/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
autogpt_platform/backend/**/*.{py,txt}

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use poetry run prefix for all Python commands, including testing, linting, formatting, and migrations

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/models.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/sdk/service.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
  • autogpt_platform/backend/backend/copilot/tools/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
autogpt_platform/backend/**/*_test.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

autogpt_platform/backend/**/*_test.py: Always review snapshot changes with git diff before committing when updating snapshots with poetry run pytest --snapshot-update
Use pytest with snapshot testing for API responses in test files
Colocate test files with source files using the *_test.py naming convention

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
autogpt_platform/backend/backend/**/*.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use Prisma ORM for database operations in PostgreSQL with pgvector for embeddings

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/models.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/sdk/service.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
  • autogpt_platform/backend/backend/copilot/tools/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
autogpt_platform/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Format Python code with poetry run format

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/models.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/sdk/service.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
  • autogpt_platform/backend/backend/copilot/tools/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
autogpt_platform/backend/**/*test*.py

📄 CodeRabbit inference engine (AGENTS.md)

Run poetry run test for backend testing (runs pytest with docker based postgres + prisma)

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
🧠 Learnings (13)
📓 Common learnings
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/(platform)/copilot/tools/RunMCPTool/helpers.tsx:23-24
Timestamp: 2026-02-27T10:45:49.499Z
Learning: As of PR `#12213`, MCP tool response types (MCPToolsDiscoveredResponse, MCPToolOutputResponse) are defined in openapi.json and frontend code in autogpt_platform/frontend/src/app/(platform)/copilot/tools/RunMCPTool/helpers.tsx uses the generated types from `@/app/api/__generated__/`. Other tools like RunBlock still use inline TypeScript interfaces (e.g., BlockDetailsResponse) for SSE stream payloads that are not included in openapi.json schemas. The pattern is tool-specific: use generated types when available in openapi.json, use inline types only when the payload schema is truly SSE-stream-only and not exposed via OpenAPI.
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/**/test/**/*.py : Use snapshot testing with '--snapshot-update' flag in backend tests when output changes; always review with 'git diff'

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
📚 Learning: 2026-02-26T17:02:22.448Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12211
File: .pre-commit-config.yaml:160-179
Timestamp: 2026-02-26T17:02:22.448Z
Learning: Keep the pre-commit hook pattern broad for autogpt_platform/backend to ensure OpenAPI schema changes are captured. Do not narrow to backend/api/ alone, since the generated schema depends on Pydantic models across multiple directories (backend/data/, backend/blocks/, backend/copilot/, backend/integrations/, backend/util/). Narrowing could miss schema changes and cause frontend type desynchronization.

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/models.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/sdk/service.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent.py
  • autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
  • autogpt_platform/backend/backend/copilot/tools/__init__.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
📚 Learning: 2026-02-27T10:45:49.499Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/(platform)/copilot/tools/RunMCPTool/helpers.tsx:23-24
Timestamp: 2026-02-27T10:45:49.499Z
Learning: As of PR `#12213`, MCP tool response types (MCPToolsDiscoveredResponse, MCPToolOutputResponse) are defined in openapi.json and frontend code in autogpt_platform/frontend/src/app/(platform)/copilot/tools/RunMCPTool/helpers.tsx uses the generated types from `@/app/api/__generated__/`. Other tools like RunBlock still use inline TypeScript interfaces (e.g., BlockDetailsResponse) for SSE stream payloads that are not included in openapi.json schemas. The pattern is tool-specific: use generated types when available in openapi.json, use inline types only when the payload schema is truly SSE-stream-only and not exposed via OpenAPI.

Applied to files:

  • autogpt_platform/frontend/src/app/api/openapi.json
  • autogpt_platform/backend/backend/copilot/tools/models.py
📚 Learning: 2026-03-01T07:58:56.207Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/api/openapi.json:10030-10037
Timestamp: 2026-03-01T07:58:56.207Z
Learning: When a backend field represents sensitive data, use a secret type (e.g., Pydantic SecretStr with length constraints) so OpenAPI marks it as a password/writeOnly field. Apply this pattern to similar sensitive request fields across API schemas so generated TypeScript clients and docs treat them as secrets and do not mishandle sensitivity. Review all openapi.jsons where sensitive inputs are defined and replace plain strings with SecretStr-like semantics with appropriate minLength constraints.

Applied to files:

  • autogpt_platform/frontend/src/app/api/openapi.json
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/api/features/**/*.py : Update routes in '/backend/backend/api/features/' and add/update Pydantic models in the same directory for API development

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/models.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/backend/blocks/*.py : When adding new blocks, analyze block interfaces to ensure inputs and outputs tie well together for productive graph-based editor connections

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/tools/get_blocks.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/backend/blocks/*.py : When creating new blocks, inherit from the `Block` base class and define input/output schemas using `BlockSchema`

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/blocks/**/*.py : Inherit from 'Block' base class with input/output schemas when adding new blocks in backend

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
📚 Learning: 2026-02-05T04:11:15.945Z
Learnt from: ntindle
Repo: Significant-Gravitas/AutoGPT PR: 11796
File: autogpt_platform/backend/backend/blocks/video/concat.py:3-4
Timestamp: 2026-02-05T04:11:15.945Z
Learning: Block IDs in autogpt_platform/backend/backend/blocks/**/*.py must be stable, hard-coded UUID strings. When initially creating a new block, generate a UUID once using `uuid.uuid4()` and then hard-code that UUID string as the block's `id` parameter. Do not call uuid.uuid4() dynamically at runtime, as block IDs must remain constant across all imports and runs.

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/**/*_test.py : Always review snapshot changes with `git diff` before committing when updating snapshots with `poetry run pytest --snapshot-update`

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/blocks/**/*.py : Write tests alongside block implementation when adding new blocks in backend

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/blocks/**/*.py : Implement 'run' method with proper error handling in backend blocks

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py
🧬 Code graph analysis (10)
autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py (1)
autogpt_platform/backend/backend/copilot/tools/customize_agent.py (2)
  • CustomizeAgentTool (31-409)
  • _execute (96-115)
autogpt_platform/backend/backend/copilot/tools/models.py (1)
autogpt_platform/backend/backend/copilot/response_model.py (1)
  • ResponseType (20-44)
autogpt_platform/backend/backend/copilot/tools/validate_agent.py (4)
autogpt_platform/backend/backend/copilot/model.py (1)
  • ChatSession (126-302)
autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py (3)
  • AgentValidator (1690-2537)
  • get_blocks_as_dicts (13-39)
  • validate (2461-2537)
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (1)
  • get_blocks_as_dicts (39-69)
autogpt_platform/backend/backend/copilot/tools/base.py (1)
  • BaseTool (16-119)
autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py (3)
autogpt_platform/backend/backend/copilot/tools/models.py (2)
  • ErrorResponse (207-212)
  • ValidationResultResponse (497-503)
autogpt_platform/backend/backend/copilot/tools/validate_agent.py (2)
  • ValidateAgentGraphTool (15-116)
  • _execute (59-116)
autogpt_platform/backend/backend/copilot/tools/_test_data.py (1)
  • make_session (22-32)
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (3)
autogpt_platform/backend/backend/blocks/_base.py (2)
  • BlockCategory (70-94)
  • get_info (576-592)
autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py (1)
  • get_blocks_as_dicts (13-39)
autogpt_platform/backend/backend/copilot/tools/get_blocks.py (2)
  • description (23-38)
  • name (19-20)
autogpt_platform/backend/backend/copilot/tools/get_blocks.py (2)
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (1)
  • recommend_blocks_for_goal (220-273)
autogpt_platform/backend/backend/copilot/tools/models.py (3)
  • ErrorResponse (207-212)
  • ToolResponseBase (58-63)
  • BlocksForGoalResponse (488-494)
autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py (5)
autogpt_platform/backend/backend/copilot/tools/fix_agent.py (2)
  • FixAgentGraphTool (15-135)
  • _execute (61-135)
autogpt_platform/backend/backend/copilot/tools/models.py (2)
  • ErrorResponse (207-212)
  • FixResultResponse (506-514)
autogpt_platform/backend/backend/copilot/tools/_test_data.py (1)
  • make_session (22-32)
autogpt_platform/backend/backend/copilot/tools/validate_agent.py (1)
  • _execute (59-116)
autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py (3)
  • apply_all_fixes (1630-1679)
  • get_fixes_applied (1681-1683)
  • validate (2461-2537)
autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py (3)
autogpt_platform/backend/backend/copilot/tools/get_blocks.py (2)
  • GetBlocksForGoalTool (15-120)
  • _execute (67-120)
autogpt_platform/backend/backend/copilot/tools/models.py (2)
  • BlocksForGoalResponse (488-494)
  • ErrorResponse (207-212)
autogpt_platform/backend/backend/copilot/tools/_test_data.py (1)
  • make_session (22-32)
autogpt_platform/backend/backend/copilot/tools/__init__.py (3)
autogpt_platform/backend/backend/copilot/tools/fix_agent.py (1)
  • FixAgentGraphTool (15-135)
autogpt_platform/backend/backend/copilot/tools/get_blocks.py (1)
  • GetBlocksForGoalTool (15-120)
autogpt_platform/backend/backend/copilot/tools/validate_agent.py (1)
  • ValidateAgentGraphTool (15-116)
autogpt_platform/backend/backend/copilot/tools/create_agent_test.py (1)
autogpt_platform/backend/backend/copilot/tools/models.py (2)
  • AgentPreviewResponse (272-280)
  • ErrorResponse (207-212)
🔇 Additional comments (14)
autogpt_platform/backend/backend/copilot/sdk/service.py (2)

218-297: Documentation quality looks good.

The Agent Generation Guide is comprehensive and well-structured:

  • Clear JSON structure examples with correct f-string escaping
  • Step-by-step workflow for creating/editing agents
  • Important rules and gotchas well-documented
  • Simple example to illustrate concepts

The content effectively guides the LLM through the agent generation process and aligns well with the PR objectives.


218-297: All tool names referenced in the documentation are verified correct: get_blocks_for_goal, validate_agent_graph, fix_agent_graph, create_agent, and edit_agent all exist as implemented tools. The agent_generator_use_local flag exists and is documented, but it controls tool behavior (local vs external generation path), not documentation visibility. Since the tools always support both modes regardless of the flag value, the documentation is appropriately unconditional—it documents both the local and external workflows that the tools implement. No changes needed.

Likely an incorrect or invalid review comment.

autogpt_platform/backend/backend/copilot/tools/agent_generator/__init__.py (1)

32-37: Public API export wiring looks good.

AgentFixer and AgentValidator are consistently added to both imports and __all__, so package-level access is now coherent.

autogpt_platform/backend/backend/copilot/tools/get_blocks_test.py (1)

25-109: Nice branch coverage for GetBlocksForGoalTool execution paths.

The tests cover input validation, happy path formatting, parameter passthrough, and error fallback behavior.

autogpt_platform/backend/backend/copilot/tools/fix_agent_test.py (1)

25-189: Good end-to-end branch coverage for the new fix tool behavior.

These tests exercise the major success/failure branches and validate response semantics cleanly.

autogpt_platform/backend/backend/copilot/tools/models.py (1)

51-54: Response type/model additions are coherent.

The new enum values and corresponding response models line up cleanly with the added tool surfaces.

Also applies to: 488-514

autogpt_platform/backend/backend/copilot/tools/__init__.py (1)

20-21: LGTM!

New agent-generation tools are properly imported and registered in TOOL_REGISTRY. The imports follow the alphabetical module order, and the registry entries follow the established pattern with appropriate tool instances.

Also applies to: 26-26, 62-65

autogpt_platform/backend/backend/copilot/tools/validate_agent_test.py (1)

1-160: LGTM!

Good test coverage for ValidateAgentGraphTool including:

  • Input validation (missing agent_json, empty nodes)
  • Success path with mocked validator
  • Failure path with validation errors
  • Exception handling

The mocking strategy properly isolates the tool logic from external dependencies.

autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py (1)

1-231: LGTM!

Comprehensive test coverage for CustomizeAgentTool covering:

  • Input validation (missing agent_id, missing modifications)
  • Local mode: empty nodes, preview flow, validation failure, auth required
  • External mode: invalid agent_id format

The dual-mode behavior is well tested with appropriate mocking of AgentFixer, AgentValidator, and get_blocks_as_dicts.

autogpt_platform/backend/backend/copilot/tools/create_agent_test.py (1)

131-292: LGTM!

Local mode tests are well-structured with proper mocking of the validation pipeline. Tests cover:

  • Empty nodes error
  • Preview flow (save=False)
  • Validation failure after fixing
  • Authentication required for save
autogpt_platform/backend/backend/copilot/tools/validate_agent.py (1)

1-116: LGTM!

Well-structured implementation of ValidateAgentGraphTool:

  • Proper input validation with clear error messages
  • Graceful exception handling with detailed logging
  • Returns structured ValidationResultResponse with both valid/invalid states
  • Good use of the existing AgentValidator infrastructure
autogpt_platform/backend/backend/copilot/tools/create_agent.py (1)

223-446: LGTM!

The external mode implementation is well-structured with comprehensive error handling for:

  • Missing description
  • Service not configured
  • Decomposition failures
  • Clarifying questions flow
  • Goal type responses (vague, unachievable)
  • Generation failures
  • Auth and save flows
autogpt_platform/backend/backend/copilot/tools/get_blocks.py (1)

67-120: LGTM overall!

The _execute implementation is clean with:

  • Proper input validation for the goal parameter
  • Good exception handling with logging
  • Well-structured block info formatting with sensible defaults
autogpt_platform/backend/backend/copilot/tools/edit_agent.py (1)

1-104: LGTM!

The dual-mode architecture is well-implemented:

  • Clean routing in _execute based on agent_json presence
  • Proper preservation of original agent id/version in local mode
  • Comprehensive error handling in external mode
  • Consistent response types across both modes

Also applies to: 233-392

Comment thread autogpt_platform/backend/backend/copilot/config.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/customize_agent.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/customize_agent.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/fix_agent.py
Comment thread autogpt_platform/frontend/src/app/api/openapi.json Outdated

@autogpt-reviewer autogpt-reviewer left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📋 PR #12238 — feat(copilot): integrate agent generation locally via Claude Agent SDK tools

Author: majdyz (Zamil Majdy) | Reviewers requested: Pwuts, Bentlybro | Files: 19 changed (+4,667 / -188)
CI: ✅ All checks passing | Labels: size/xl, platform/frontend, platform/backend


🎯 Verdict: APPROVE WITH CONDITIONS


What This PR Does

Ports the agent generation pipeline (validation, fixing, block recommendation) from the external AgentGenerator service into local copilot tools, making the Claude Agent SDK itself the brain for agent generation. Introduces 3 new tools (get_blocks_for_goal, validate_agent_graph, fix_agent_graph), refactors 3 existing tools (create_agent, edit_agent, customize_agent) with dual-mode support, and adds a feature flag (agent_generator_use_local) for safe rollout.


Specialist Findings

🛡️ Security ⚠️ — No critical vulnerabilities. Auth context properly maintained. Conditions: (1) verify credential references belong to requesting user during validation — the fix pipeline auto-attaches credentials and could potentially be manipulated, (2) add input size limit for agent_json parameter to prevent DoS via oversized payloads. Nice-to-haves: filter internal/experimental blocks from copilot, use strict JSON parsing.

🏗️ Architecture ⚠️ — Good module boundaries and feature flag pattern. Blocking concern: validation.py at 2,558 lines combines Validator and Fixer classes with fundamentally different responsibilities — should be split into validator.py, fixer.py, constants.py, helpers.py. Also: dual-mode pipeline logic duplicated across 3 tool files should be extracted, and system prompt text (80 lines) should move to a separate template file.

Performance ✅ — No blockers. Module-level loading of 488 blocks adds ~300ms startup cost (recommend lazy loading). Keyword matching is O(n×m) — fine at current scale, won't scale to 5000+ blocks. AgentFixer runs all 17+ fixes unconditionally instead of targeting specific errors. All acceptable for current load.

🧪 Testing ⚠️ — 858 lines of new tests across 5 files (~32 tests), but only ~30-40% coverage of the validation/fix logic. Only 3 of 9 validation checks and 5 of 17+ fix types are tested. No end-to-end pipeline integration test. No error path tests for create_agent local mode. Test fixtures are repetitive (need shared conftest.py).

📖 Quality ⚠️ — Good patterns and naming, but validation.py at 2,558 lines is unmaintainable. Inconsistent error handling across tools. Magic numbers in blocks.py. Incomplete docstrings on public methods. System prompt hardcoded in service.py.

📦 Product ✅ — Feature is well-scoped and complete. Dual-mode with feature flag is solid product design. All 9 capabilities (block discovery, validation, fixing, create/edit/customize local, flag control, prompt guide, external fallback) are implemented. Minor concerns: no user-facing docs, feature flag default unclear, block staleness risk at runtime.

📬 Discussion ✅ — No unresolved review threads (first review). Merge conflicts with 3 sibling PRs by same author (#12212, #12213, #12230) — merge ordering must be coordinated. 4 of 9 PR checklist items unchecked (unit tests, e2e testing).

🔎 QA ✅ (with caveats) — Frontend stable, no visual regressions, backend healthy. Login/dashboard/agent builder/copilot chat all render correctly. Caveat: Local agent generation pipeline could not be exercised end-to-end because feature flag defaults to disabled and no Claude API key was configured. Manual testing with flag enabled is recommended.


Conditions for Approval

  1. Split validation.py (2,558 lines) into separate modulesvalidator.py, fixer.py, constants.py, helpers.py. Two specialists independently flagged this as blocking. The file combines read-only analysis (Validator) with mutation operations (Fixer), violates SRP, and exacerbates merge conflict risk with 3 sibling PRs.

  2. Add credential ownership validation — The fix pipeline auto-attaches credentials. Verify referenced credential IDs belong to the requesting user during validation to prevent privilege escalation.

Should Fix (Follow-up OK)

  1. validation.py — test coverage gaps: Only ~30-40% of validation/fix code paths tested (3/9 validators, 5/17+ fixers). Add tests for remaining checks before or shortly after merge.
  2. create_agent.py, edit_agent.py, customize_agent.py — extract shared pipeline: Dual-mode logic duplicated across 3 files. Extract a shared local_agent_pipeline() function.
  3. blocks.py:L15-45 — lazy load block registry: 488 blocks loaded at import time (~300ms). Use lazy initialization pattern.
  4. agent_json input — add size limit: No max size check before JSON parsing. Add MAX_AGENT_JSON_SIZE guard.
  5. sdk/service.py — extract system prompt: 80 lines of prompt text hardcoded in Python. Move to separate template file.
  6. blocks.py — extract magic numbers: Hardcoded thresholds (0.5, 0.3, max_results=20) should be named constants.
  7. End-to-end pipeline test: No integration test exercises the full get_blocks → validate → fix → save flow.
  8. Merge conflict coordination: Agree on merge ordering with #12212, #12213, #12230 (all by majdyz, all conflicting).

Nice to Have

  • Filter internal/experimental blocks from copilot recommendations
  • Use strict JSON parsing (duplicate key handling)
  • Add observability hooks (metrics, structured logging, timing)
  • Shared test fixtures via conftest.py
  • TypedDict or TypeAlias for dict[str, Any] agent JSON type
  • Progress indicators for multi-step local generation

Risk Assessment

Merge risk: MEDIUM — Large PR (4,667 lines added) with confirmed conflicts against 3 sibling PRs. The 2,558-line validation.py is the primary maintenance risk. However, feature flag provides safe rollout and instant rollback.

Rollback: EASY — Feature flag agent_generator_use_local can disable the entire local pipeline. External service fallback preserved. No schema migrations.


Automated review by PR Review Squad — 8/8 specialists reported. QA live-tested frontend/backend with screenshots. Feature flag prevented full e2e testing of local generation pipeline.

@autogpt-reviewer autogpt-reviewer left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📋 ADDENDUM — Additional Findings from Deep Analysis

Three additional issues surfaced from deeper specialist analysis that were not in the initial review above. These upgrade the verdict.


🎯 Updated Verdict: REQUEST CHANGES


🔴 NEW BLOCKER — Credential Values Logged in Plaintext

File: agent_generator/validation.py:1315-1317

deleted_credentials = input_default.pop("credentials")
self.add_fix_log(
    f"Deleted credentials in node {node_id}: " f"{deleted_credentials}"
)

The fix_credentials method correctly strips credentials from input_default — good intent. However, it writes the full credential value into self.fixes_applied, which is:

  1. Logged at WARNING level (line ~1677)
  2. Returned in FixResultResponse.fixes_applied to the caller
  3. Included in AgentPreviewResponse context (logged at INFO)

API keys, OAuth tokens, or passwords embedded in agent JSON will appear in application logs and potentially in LLM context.

Fix: self.add_fix_log(f"Deleted credentials in node {node_id}: [REDACTED]")


🔴 NEW BLOCKER — Duplicate get_blocks_as_dicts() with Separate Caches

Files: agent_generator/blocks.py:39 and agent_generator/validation.py:13

Both files define an identical get_blocks_as_dicts() function with independent module-level _blocks_cache globals. This means:

  • Memory is doubled — two copies of every block dict
  • Cache invalidation is inconsistent — blocks._reset_caches() doesn't touch validation._blocks_cache
  • Tools import from different sources (get_blocks.py uses blocks.py, others use validation.py)

Fix: Delete from validation.py, import from blocks.py. Single source of truth.


🟡 NEW SHOULD FIX — Validation Exception Silently Bypassed

Files: create_agent.py:145-146, edit_agent.py:178, customize_agent.py:159

except Exception as e:
    logger.warning(f"Validation failed, proceeding anyway: {e}")

When the validator throws an unexpected exception, the code skips validation entirely and proceeds to save. A malformed agent_json that crashes the validator bypasses all checks and gets saved to the database.

Fix: Return an error instead of proceeding:

except Exception as e:
    logger.error(f"Validation error: {e}", exc_info=True)
    return ErrorResponse(message="Validation encountered an error.", error="validation_exception")

🟡 NEW SHOULD FIX — Copy-Pasted _execute_local Across 3 Tools

Files: create_agent.py, customize_agent.py, edit_agent.py

All three implement nearly identical ~70-line _execute_local methods (same fix→validate→save sequence). Extract a shared helper to prevent divergence bugs.


Updated Summary

Category Count
Blockers 3 (split validation.py, credential logging, duplicate cache)
Should Fix 10 (original 8 + validation bypass + extract shared pipeline)

The credential logging issue is a security blocker — secrets must not appear in logs or API responses.

…rity, deduplicate

- Split validation.py (2558 lines) into fixer.py, validator.py, helpers.py
  with re-export shim for backwards compatibility
- Redact credential values from fix logs (security: was logging plaintext)
- Deduplicate get_blocks_as_dicts cache (helpers.py re-exports from blocks.py)
- Extract shared fix_validate_and_save pipeline to reduce code duplication
  across create_agent, edit_agent, customize_agent
- Add CHAT_AGENT_GENERATOR_USE_LOCAL env var field validator
- Enforce max_blocks cap when BASIC blocks exceed limit
- Return ErrorResponse on validation exceptions instead of swallowing
- Add exception details to save error handling

@majdyz majdyz left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed Review Feedback

Blockers — All Fixed

  1. Split validation.py (2,558 lines) → Split into fixer.py (~1,647 lines), validator.py (~869 lines), helpers.py (re-export shim), with validation.py as a backwards-compatible re-export module.

  2. Credential values logged in plaintextfix_credentials now logs [REDACTED] instead of the actual credential value.

  3. Duplicate get_blocks_as_dicts() with separate cacheshelpers.py now re-exports from blocks.py, ensuring a single cache and single source of truth.

Should-Fix Items — Addressed

  1. Validation exception silently bypassed → All three tools (create_agent, edit_agent, customize_agent) now return ErrorResponse instead of swallowing validation exceptions.

  2. Copy-pasted _execute_local across 3 tools → Extracted shared fix_validate_and_save() pipeline in agent_generator/pipeline.py. All three tools delegate to it.

  3. max_blocks not enforced for BASIC blocks → Added early return when BASIC blocks already exceed limit.

  4. Missing env var field validator → Added CHAT_AGENT_GENERATOR_USE_LOCAL field validator in config.

  5. AgentExecutorBlock claim in fix_agent description → Removed since library_agents isn't passed.

  6. Exception details lost in save error handling → Added details={"exception": str(e)} to customize_agent save errors.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

♻️ Duplicate comments (1)
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (1)

220-223: ⚠️ Potential issue | 🟡 Minor

Guard max_blocks for non-positive values before slicing.

Line 263 currently allows negative max_blocks, which triggers Python’s slice-from-end behavior and returns unintended recommendations.

🔧 Proposed fix
 def recommend_blocks_for_goal(
     goal: str,
     max_blocks: int = 25,
 ) -> list[dict[str, Any]]:
@@
+    if max_blocks <= 0:
+        return []
+
     all_blocks = get_blocks_as_dicts()
@@
-    return result
+    return result[:max_blocks]

Also applies to: 263-276

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py`
around lines 220 - 223, The function recommend_blocks_for_goal allows negative
max_blocks which makes list slicing behave like "from-end" and returns
unintended items; update recommend_blocks_for_goal to guard max_blocks before
slicing (e.g., if max_blocks <= 0 return an empty list or set max_blocks = 0) so
the slice that uses [:max_blocks] cannot be passed a negative value—modify the
check just before the slice operation (referencing recommend_blocks_for_goal and
the slice around the current slicing logic) to enforce this guard.
🧹 Nitpick comments (5)
autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py (1)

46-56: Auto-fix modifies the input dict in-place.

Line 51 reassigns agent_json to the result of apply_all_fixes, which modifies the original dict passed by the caller. This side effect might be unexpected. Consider documenting this behavior or working on a copy if immutability is desired.

This is likely intentional for efficiency, but worth documenting in the docstring:

     """Shared pipeline: auto-fix → validate → preview or save.

     Args:
-        agent_json: The agent JSON dict (must already have id/version/is_active set).
+        agent_json: The agent JSON dict (must already have id/version/is_active set).
+                    Note: This dict is modified in-place by the auto-fixer.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py`
around lines 46 - 56, The auto-fix step reassigns agent_json to the return of
AgentFixer.apply_all_fixes, which mutates the input dict in-place; either make
the mutation explicit by operating on a deep copy before calling AgentFixer
(e.g., copy.deepcopy(agent_json) and use that for apply_all_fixes) or clearly
document the in-place behavior in the pipeline function/class docstring so
callers know agent_json may be mutated; reference AgentFixer.apply_all_fixes,
AgentFixer.get_fixes_applied, and the agent_json variable when updating the code
or docs.
autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (1)

1642-1644: Log level for applied fixes should be INFO, not WARNING.

Line 1644 logs each applied fix at WARNING level, but these are expected operations rather than warnings. This could create noise in production logs.

Proposed fix
     logger.info(f"Applied {len(self.fixes_applied)} fixes to agent")
     for fix in self.fixes_applied:
-        logger.warning(f"  - {fix}")
+        logger.debug(f"  - {fix}")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py`
around lines 1642 - 1644, The loop that logs each applied fix uses
logger.warning but these are normal informational events; update the loop in
fixer.py that iterates self.fixes_applied to call logger.info instead of
logger.warning (keep the same message format f"  - {fix}" and the existing
logger.info(f"Applied {len(self.fixes_applied)} fixes to agent") call intact) so
each individual fix is logged at INFO level.
autogpt_platform/backend/backend/copilot/tools/create_agent.py (1)

330-376: Consider using fix_validate_and_save for external mode save path too.

The external mode (lines 357-376) duplicates the save logic that exists in fix_validate_and_save. This could lead to inconsistencies over time. Consider refactoring to use the shared pipeline for the save step.

The external path already has agent_json at this point, so it could potentially call fix_validate_and_save with save=True for consistency.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/create_agent.py` around lines
330 - 376, The external-mode save branch duplicates logic from
save_agent_to_library; replace that block with a call to the shared pipeline
function fix_validate_and_save(agent_json, user_id, save=True) (or the correct
signature) instead of directly calling save_agent_to_library, and map its result
into the existing response shapes (AgentSavedResponse on success, ErrorResponse
on failure) while preserving session_id; ensure you still check user_id before
calling fix_validate_and_save and catch/convert any exceptions or error return
values from fix_validate_and_save into the same error structure currently used
(ErrorResponse with message, error="save_failed", and details).
autogpt_platform/backend/backend/copilot/tools/create_agent_test.py (1)

149-188: Consider adding test for successful save in local mode.

The tests cover preview (save=False) and no-auth save, but there's no test for a successful save=True scenario with a valid user. This would complete the local mode test coverage.

Would you like me to generate a test case for the successful local mode save scenario?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/create_agent_test.py` around
lines 149 - 188, Add a new async test (e.g., test_local_mode_save_success)
mirroring test_local_mode_preview but calling tool._execute with save=True and a
valid user_id; mock AgentFixer.apply_all_fixes to return the fixed agent JSON,
mock AgentValidator.validate to return (True, None) and patch
get_blocks_as_dicts/AgentFixer/AgentValidator as in the preview test, then
assert the result is the expected saved response (e.g., AgentCreateResponse or
whatever concrete response your _execute returns) and contains an agent_id,
correct agent_name ("Test Agent"), node_count==1, and verify the fixer/validator
were invoked; reference tool._execute, AgentFixer, AgentValidator, and
get_blocks_as_dicts when locating where to add the test.
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (1)

24-25: Align summary type hints with actual payload structure.

Line 24 and Line 79 declare dict[str, str], but fields like categories, input_fields, and output_fields are lists. This weakens type safety and readability.

🔧 Proposed fix
-_summaries_cache: list[dict[str, str]] | None = None
+_summaries_cache: list[dict[str, Any]] | None = None
@@
-def get_block_summaries() -> list[dict[str, str]]:
+def get_block_summaries() -> list[dict[str, Any]]:

Also applies to: 79-99

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py`
around lines 24 - 25, The type hint for _summaries_cache (and the other
summary-like declarations) uses dict[str, str] but the payload contains lists
(e.g., categories, input_fields, output_fields); update the annotations to
reflect the real shape—either create a Summary TypedDict (e.g., Summary =
TypedDict('Summary', {'title': str, 'categories': list[str], 'input_fields':
list[str], 'output_fields': list[str], ...}) and annotate _summaries_cache:
list[Summary] | None) or change to dict[str, Any] | list[dict[str, Any]] where
used; apply this corrected type to all summary declarations (including the
second declaration around lines 79-99) and any function signatures that return
or accept these summary objects so type checking matches the actual payload
fields.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py`:
- Around line 1112-1113: Lines computing source_x and sink_x access nested keys
directly and can raise KeyError if metadata or position is missing; change these
to safely dig into source_node and sink_node using .get with defaults (e.g.,
source_node.get("metadata", {}).get("position", {}).get("x", 0)) so missing
metadata/position yields 0 instead of error, and apply the same defensive
pattern for sink_x and any other similar accesses of ["metadata"]["position"]
elsewhere in the function/class (referencing source_x, sink_x, source_node,
sink_node).
- Around line 842-866: The default and allowed model identifiers in
fix_ai_model_parameter are invalid; update the default_model parameter and the
allowed_models set to use actual provider model IDs (e.g., replace
"gpt-5.2-2025-12-11" with a valid OpenAI ID like "gpt-5.2" or a correct
date-versioned snapshot, and replace "claude-opus-4-6" with a valid Anthropic ID
such as "claude-opus-4-20250514"), or implement dynamic retrieval instead of
hardcoding: modify the default_model default value and the allowed_models
declaration inside fix_ai_model_parameter to contain valid strings or call a
provider-listing helper to populate allowed_models at runtime so
input_default["model"] is validated against real model identifiers.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py`:
- Around line 164-166: The validator currently indexes link dictionaries
directly (e.g., link["sink_name"], link["sink_id"], link["source_id"],
link["source_output"]) which will raise KeyError on malformed links and abort
validation; update the functions validate_required_inputs,
validate_nested_sink_links, and validate_source_output_existence to use safe
lookups (link.get("sink_name"), link.get("sink_id"), link.get("source_id"),
link.get("source_output")) and add explicit guards (skip or record a validation
error when a required key is missing) before using those values so the
aggregated validation run continues instead of crashing. Ensure you replace each
direct bracket access in the mentioned functions with get+guard logic and
propagate a sensible error message or skip behavior.
- Around line 683-691: The validation error for AgentExecutorBlock leaks
potential secrets via repr(value); update the call to self.add_error in the
AgentExecutorBlock validation (the block that references node_id, input_name and
input_default.inputs) to remove repr(value) entirely and replace it with a
non-sensitive placeholder (e.g., "<redacted>" or omit the value), ensuring no
code paths log or include the actual value variable; keep the rest of the
message about using links from the appropriate source node intact.

In `@autogpt_platform/backend/backend/copilot/tools/customize_agent.py`:
- Around line 113-116: The routing currently checks "if agent_json and
isinstance(agent_json, dict)" which skips local mode for empty dicts; change the
condition to only check type so empty dicts are validated locally. Replace the
truthiness-based branch with "if isinstance(agent_json, dict): return await
self._execute_local(user_id, session_id, agent_json, kwargs)" and keep the
fallback to "return await self._execute_external(user_id, session_id, agent_id,
kwargs)"; this ensures _execute_local receives empty_agent cases for
deterministic validation.

In `@autogpt_platform/backend/backend/copilot/tools/edit_agent.py`:
- Around line 123-127: The routing check incorrectly treats an empty dict as
falsy so empty agent_json values bypass local validation; update the condition
in the routing logic (the block that calls _execute_local vs _execute_external)
to explicitly test type rather than truthiness (e.g., check that agent_json is a
dict via isinstance(agent_json, dict) or agent_json is not None and
isinstance(...)) so that empty {} is routed to _execute_local and triggers the
local empty_agent validation instead of going to _execute_external.
- Around line 149-154: The code fetches current_agent via get_agent_as_json but
silently proceeds if it's missing; change the behavior in the edit_agent
handler/function so that if get_agent_as_json(agent_id, user_id) returns falsy
in local edit mode the function returns an error response/action labeled
"agent_not_found" and exits immediately instead of falling through to
agent_json.setdefault lines; locate the block that calls get_agent_as_json and
add a guard that checks current_agent and returns the agent_not_found result
before any mutation of agent_json (references: get_agent_as_json,
agent_json.setdefault("id", ...), agent_json.setdefault("version", ...)).

---

Duplicate comments:
In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py`:
- Around line 220-223: The function recommend_blocks_for_goal allows negative
max_blocks which makes list slicing behave like "from-end" and returns
unintended items; update recommend_blocks_for_goal to guard max_blocks before
slicing (e.g., if max_blocks <= 0 return an empty list or set max_blocks = 0) so
the slice that uses [:max_blocks] cannot be passed a negative value—modify the
check just before the slice operation (referencing recommend_blocks_for_goal and
the slice around the current slicing logic) to enforce this guard.

---

Nitpick comments:
In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py`:
- Around line 24-25: The type hint for _summaries_cache (and the other
summary-like declarations) uses dict[str, str] but the payload contains lists
(e.g., categories, input_fields, output_fields); update the annotations to
reflect the real shape—either create a Summary TypedDict (e.g., Summary =
TypedDict('Summary', {'title': str, 'categories': list[str], 'input_fields':
list[str], 'output_fields': list[str], ...}) and annotate _summaries_cache:
list[Summary] | None) or change to dict[str, Any] | list[dict[str, Any]] where
used; apply this corrected type to all summary declarations (including the
second declaration around lines 79-99) and any function signatures that return
or accept these summary objects so type checking matches the actual payload
fields.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py`:
- Around line 1642-1644: The loop that logs each applied fix uses logger.warning
but these are normal informational events; update the loop in fixer.py that
iterates self.fixes_applied to call logger.info instead of logger.warning (keep
the same message format f"  - {fix}" and the existing logger.info(f"Applied
{len(self.fixes_applied)} fixes to agent") call intact) so each individual fix
is logged at INFO level.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py`:
- Around line 46-56: The auto-fix step reassigns agent_json to the return of
AgentFixer.apply_all_fixes, which mutates the input dict in-place; either make
the mutation explicit by operating on a deep copy before calling AgentFixer
(e.g., copy.deepcopy(agent_json) and use that for apply_all_fixes) or clearly
document the in-place behavior in the pipeline function/class docstring so
callers know agent_json may be mutated; reference AgentFixer.apply_all_fixes,
AgentFixer.get_fixes_applied, and the agent_json variable when updating the code
or docs.

In `@autogpt_platform/backend/backend/copilot/tools/create_agent_test.py`:
- Around line 149-188: Add a new async test (e.g., test_local_mode_save_success)
mirroring test_local_mode_preview but calling tool._execute with save=True and a
valid user_id; mock AgentFixer.apply_all_fixes to return the fixed agent JSON,
mock AgentValidator.validate to return (True, None) and patch
get_blocks_as_dicts/AgentFixer/AgentValidator as in the preview test, then
assert the result is the expected saved response (e.g., AgentCreateResponse or
whatever concrete response your _execute returns) and contains an agent_id,
correct agent_name ("Test Agent"), node_count==1, and verify the fixer/validator
were invoked; reference tool._execute, AgentFixer, AgentValidator, and
get_blocks_as_dicts when locating where to add the test.

In `@autogpt_platform/backend/backend/copilot/tools/create_agent.py`:
- Around line 330-376: The external-mode save branch duplicates logic from
save_agent_to_library; replace that block with a call to the shared pipeline
function fix_validate_and_save(agent_json, user_id, save=True) (or the correct
signature) instead of directly calling save_agent_to_library, and map its result
into the existing response shapes (AgentSavedResponse on success, ErrorResponse
on failure) while preserving session_id; ensure you still check user_id before
calling fix_validate_and_save and catch/convert any exceptions or error return
values from fix_validate_and_save into the same error structure currently used
(ErrorResponse with message, error="save_failed", and details).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 0d64af9 and 7034506.

📒 Files selected for processing (13)
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/helpers.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • autogpt_platform/backend/backend/copilot/tools/customize_agent_test.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: test (3.12)
  • GitHub Check: test (3.13)
  • GitHub Check: test (3.11)
  • GitHub Check: end-to-end tests
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (6)
autogpt_platform/backend/**/*.py

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/backend/**/*.py: Use Python 3.11 (required; managed by Poetry via pyproject.toml) for backend development
Always run 'poetry run format' (Black + isort) before linting in backend development
Always run 'poetry run lint' (ruff) after formatting in backend development

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/helpers.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/backend/**/*.{py,txt}

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use poetry run prefix for all Python commands, including testing, linting, formatting, and migrations

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/helpers.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/backend/backend/**/*.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use Prisma ORM for database operations in PostgreSQL with pgvector for embeddings

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/helpers.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Format Python code with poetry run format

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/helpers.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/backend/**/*_test.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

autogpt_platform/backend/**/*_test.py: Always review snapshot changes with git diff before committing when updating snapshots with poetry run pytest --snapshot-update
Use pytest with snapshot testing for API responses in test files
Colocate test files with source files using the *_test.py naming convention

Files:

  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
autogpt_platform/backend/**/*test*.py

📄 CodeRabbit inference engine (AGENTS.md)

Run poetry run test for backend testing (runs pytest with docker based postgres + prisma)

Files:

  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
🧠 Learnings (13)
📓 Common learnings
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/(platform)/copilot/tools/RunMCPTool/helpers.tsx:23-24
Timestamp: 2026-02-27T10:45:49.499Z
Learning: As of PR `#12213`, MCP tool response types (MCPToolsDiscoveredResponse, MCPToolOutputResponse) are defined in openapi.json and frontend code in autogpt_platform/frontend/src/app/(platform)/copilot/tools/RunMCPTool/helpers.tsx uses the generated types from `@/app/api/__generated__/`. Other tools like RunBlock still use inline TypeScript interfaces (e.g., BlockDetailsResponse) for SSE stream payloads that are not included in openapi.json schemas. The pattern is tool-specific: use generated types when available in openapi.json, use inline types only when the payload schema is truly SSE-stream-only and not exposed via OpenAPI.
📚 Learning: 2026-02-26T17:02:22.448Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12211
File: .pre-commit-config.yaml:160-179
Timestamp: 2026-02-26T17:02:22.448Z
Learning: Keep the pre-commit hook pattern broad for autogpt_platform/backend to ensure OpenAPI schema changes are captured. Do not narrow to backend/api/ alone, since the generated schema depends on Pydantic models across multiple directories (backend/data/, backend/blocks/, backend/copilot/, backend/integrations/, backend/util/). Narrowing could miss schema changes and cause frontend type desynchronization.

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/helpers.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py
  • autogpt_platform/backend/backend/copilot/tools/fix_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/backend/blocks/*.py : When creating new blocks, inherit from the `Block` base class and define input/output schemas using `BlockSchema`

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/backend/blocks/*.py : When adding new blocks, analyze block interfaces to ensure inputs and outputs tie well together for productive graph-based editor connections

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
📚 Learning: 2026-02-05T04:11:15.945Z
Learnt from: ntindle
Repo: Significant-Gravitas/AutoGPT PR: 11796
File: autogpt_platform/backend/backend/blocks/video/concat.py:3-4
Timestamp: 2026-02-05T04:11:15.945Z
Learning: Block IDs in autogpt_platform/backend/backend/blocks/**/*.py must be stable, hard-coded UUID strings. When initially creating a new block, generate a UUID once using `uuid.uuid4()` and then hard-code that UUID string as the block's `id` parameter. Do not call uuid.uuid4() dynamically at runtime, as block IDs must remain constant across all imports and runs.

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/blocks/**/*.py : Inherit from 'Block' base class with input/output schemas when adding new blocks in backend

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py
📚 Learning: 2026-02-27T15:58:44.424Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/api/openapi.json:9983-9995
Timestamp: 2026-02-27T15:58:44.424Z
Learning: Repo: Significant-Gravitas/AutoGPT PR: 12213 — OpenAPI/codegen
Learning: Ensuring a field is required in generated TS types needs two sides: (1) no default value on the Pydantic field, and (2) the OpenAPI model's "required" array must list it. For MCPToolInfo, making input_schema required in OpenAPI and removing Field(default_factory=dict) in the backend prevents optional typing drift.

Applied to files:

  • autogpt_platform/backend/backend/copilot/config.py
📚 Learning: 2026-02-04T16:50:51.495Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-04T16:50:51.495Z
Learning: Applies to autogpt_platform/**/data/*.py : For changes touching `data/*.py`, validate user ID checks or explain why not needed

Applied to files:

  • autogpt_platform/backend/backend/copilot/config.py
📚 Learning: 2026-02-27T15:58:44.424Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/api/openapi.json:9983-9995
Timestamp: 2026-02-27T15:58:44.424Z
Learning: Repo: Significant-Gravitas/AutoGPT PR: 12213 — Backend/frontend OpenAPI codegen
Learning: For MCP schema models, required OpenAPI fields must have no defaults in Pydantic. Specifically, MCPToolInfo.input_schema must be required (no Field(default_factory=dict)) so openapi.json emits it in "required", ensuring generated TS types treat input_schema as non-optional.

Applied to files:

  • autogpt_platform/backend/backend/copilot/config.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/**/test/**/*.py : Use snapshot testing with '--snapshot-update' flag in backend tests when output changes; always review with 'git diff'

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/**/*_test.py : Always review snapshot changes with `git diff` before committing when updating snapshots with `poetry run pytest --snapshot-update`

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/backend/api/features/**/*.py : When modifying API routes, update corresponding Pydantic models in the same directory and write tests alongside the route file

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/api/features/**/*.py : Update routes in '/backend/backend/api/features/' and add/update Pydantic models in the same directory for API development

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/create_agent_test.py
🧬 Code graph analysis (5)
autogpt_platform/backend/backend/copilot/tools/customize_agent.py (5)
autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py (1)
  • fix_validate_and_save (20-131)
autogpt_platform/backend/backend/copilot/tools/models.py (2)
  • ToolResponseBase (58-63)
  • ErrorResponse (207-212)
autogpt_platform/backend/backend/api/features/store/db.py (1)
  • get_store_agent_details (219-334)
autogpt_platform/backend/backend/copilot/tools/agent_generator/core.py (1)
  • graph_to_json (717-759)
autogpt_platform/backend/backend/copilot/tools/agent_generator/errors.py (1)
  • get_user_message_for_error (35-95)
autogpt_platform/backend/backend/copilot/tools/create_agent.py (2)
autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py (1)
  • fix_validate_and_save (20-131)
autogpt_platform/backend/backend/copilot/tools/models.py (2)
  • ToolResponseBase (58-63)
  • ErrorResponse (207-212)
autogpt_platform/backend/backend/copilot/tools/agent_generator/helpers.py (1)
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (1)
  • get_blocks_as_dicts (39-69)
autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py (5)
autogpt_platform/backend/backend/copilot/tools/models.py (3)
  • AgentPreviewResponse (272-280)
  • AgentSavedResponse (283-291)
  • ToolResponseBase (58-63)
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (1)
  • get_blocks_as_dicts (39-69)
autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (3)
  • AgentFixer (11-1654)
  • apply_all_fixes (1597-1646)
  • get_fixes_applied (1648-1650)
autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py (2)
  • AgentValidator (15-862)
  • validate (786-862)
autogpt_platform/backend/backend/copilot/tools/agent_generator/core.py (1)
  • save_agent_to_library (697-714)
autogpt_platform/backend/backend/copilot/tools/fix_agent.py (4)
autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (2)
  • AgentFixer (11-1654)
  • apply_all_fixes (1597-1646)
autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py (2)
  • AgentValidator (15-862)
  • validate (786-862)
autogpt_platform/backend/backend/copilot/tools/agent_generator/blocks.py (1)
  • get_blocks_as_dicts (39-69)
autogpt_platform/backend/backend/copilot/tools/models.py (3)
  • ErrorResponse (207-212)
  • FixResultResponse (506-514)
  • ToolResponseBase (58-63)
🔇 Additional comments (10)
autogpt_platform/backend/backend/copilot/config.py (1)

96-103: LGTM!

The new agent_generator_use_local field and its validator follow the established pattern from use_claude_agent_sdk. The environment variable support via CHAT_AGENT_GENERATOR_USE_LOCAL is correctly implemented.

Also applies to: 141-148

autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (1)

1264-1287: Good security practice: credentials redacted from logs.

The fix_credentials method properly removes credentials from input_default and logs [REDACTED] instead of actual values. This is a good security practice.

autogpt_platform/backend/backend/copilot/tools/agent_generator/helpers.py (1)

1-5: LGTM!

Clean re-export module that centralizes the get_blocks_as_dicts helper for easier imports throughout the agent_generator package.

autogpt_platform/backend/backend/copilot/tools/agent_generator/validation.py (1)

1-18: LGTM!

Well-documented re-export module that maintains backwards compatibility after splitting the original validation.py into separate modules. The __all__ properly exposes the public API.

autogpt_platform/backend/backend/copilot/tools/create_agent_test.py (1)

31-146: LGTM!

Good test coverage for both external and local modes. The tests properly mock the pipeline components (AgentFixer, AgentValidator, get_blocks_as_dicts) and verify the correct response types are returned for various scenarios.

autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py (1)

20-131: LGTM!

Well-structured pipeline function with clear separation of concerns: fix → validate → preview/save. Error handling is comprehensive with appropriate ErrorResponse returns for each failure mode. The lazy import pattern for save_agent_to_library correctly avoids circular dependencies.

autogpt_platform/backend/backend/copilot/tools/create_agent.py (2)

104-115: LGTM!

Clean dispatch logic that properly routes to local or external mode based on the presence of agent_json. The type check isinstance(agent_json, dict) ensures robustness against malformed input.


117-151: LGTM!

Local mode implementation correctly:

  • Validates that nodes exist (line 129-134)
  • Auto-populates required top-level fields (id, version, is_active)
  • Delegates to the shared fix_validate_and_save pipeline
autogpt_platform/backend/backend/copilot/tools/fix_agent.py (2)

85-89: AgentExecutorBlock fixes are not applied (by design).

As noted in a previous review, apply_all_fixes is called without library_agents, so fix_agent_executor_blocks won't run. This appears intentional since the tool description doesn't mention AgentExecutorBlock fixes and requires_auth is False (no user context to fetch library agents).

If AgentExecutorBlock fixes should be supported in the future, consider adding a library_agent_ids parameter and fetching the agents when provided.


60-134: LGTM!

The tool implementation is well-structured:

  • Input validation ensures agent_json is present and has nodes
  • Fix and validation errors are properly caught and returned as ErrorResponse
  • The FixResultResponse correctly reports both successful fixes and any remaining validation errors
  • The distinction between valid_after_fix=True/False paths is clear

Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/customize_agent.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/edit_agent.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/edit_agent.py
- Defensive .get() for metadata/position access in fixer node spacing
- Use .get() for all link field access in validator to prevent KeyError
- Add missing-fields guard in validate_data_type_compatibility
- Redact hardcoded input values from AgentExecutorBlock error messages
- Use isinstance(agent_json, dict) routing (not truthiness) in all tools
- Fail fast with agent_not_found when target agent missing in edit local mode
Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🧹 Nitpick comments (1)
autogpt_platform/backend/backend/copilot/tools/customize_agent.py (1)

127-145: Consider adding id and version defaults for local mode.

Unlike create_agent.py (lines 137-142) and edit_agent.py (lines 158-160), the local mode here only sets is_active. If agent_json lacks id or version, the downstream fix_validate_and_save pipeline may not set these, potentially causing issues during save.

🔧 Proposed fix
+        import uuid
+
         agent_json.setdefault("is_active", True)
+        if "id" not in agent_json:
+            agent_json["id"] = str(uuid.uuid4())
+        if "version" not in agent_json:
+            agent_json["version"] = 1
 
         return await fix_validate_and_save(
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/customize_agent.py` around
lines 127 - 145, In the local-mode branch where agent_json only gets is_active,
add defaults for id and version so downstream fix_validate_and_save receives
them: call agent_json.setdefault("id", str(uuid4())) and
agent_json.setdefault("version", 1) before calling fix_validate_and_save, and
add the required from uuid import uuid4 import if not already present; this
mirrors the behavior in create_agent/edit_agent and prevents missing-id/version
save issues.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py`:
- Around line 1546-1551: Replace direct dict indexing with .get() in the
sink_node lookup and the similar block at lines 1567-1572: in the generator used
to compute sink_node (and the other occurrence) change node["id"] and
link["sink_id"] to node.get("id") and link.get("sink_id") respectively, and keep
using agent.get("nodes", []) to remain defensive; also ensure the next(...) call
uses a safe default (e.g., next(..., None)) so a missing match doesn't raise
StopIteration.
- Around line 1527-1533: The dict comprehensions block_input_schemas and
block_names assume every block has an "id" key and directly index block["id"],
which can raise KeyError; update these comprehensions to safely handle missing
ids by using block.get("id") and either skipping entries where id is None
(filter blocks with a truthy id) or providing a sensible default key, e.g.,
continue only for blocks if block.get("id") is not None, and keep using
block.get("inputSchema", {}).get("properties", {}) and block.get("name",
"Unknown Block") for values; adjust the comprehensions for block_input_schemas
and block_names accordingly so blocks without an id are not indexed directly.
- Around line 940-941: block_lookup and node_lookup comprehensions directly
index block["id"] / node["id"], which will raise KeyError if any item lacks an
"id"; update the comprehensions in fixer.py to safely access the id (e.g., use
item.get("id")) and skip or handle items without ids (filter out None ids or
log/raise a clearer error) when building block_lookup and node_lookup so missing
ids no longer crash the code; reference the existing variable names blocks,
nodes, block_lookup, node_lookup when making the change.
- Around line 1325-1331: The dict comprehension for library_agent_lookup
directly indexes la["graph_id"], which can raise KeyError for agents missing
that key; change it to use la.get("graph_id") and only include entries with a
non-None key (e.g., filter with if la.get("graph_id") is not None) so missing
graph_id values are skipped, and optionally log or count skipped items for
visibility; locate the comprehension that builds library_agent_lookup and
replace the direct indexing with this safe-get-and-filter approach.
- Around line 711-717: The generator currently indexes node["id"] and
link["source_id"] directly which can raise KeyError; update the lookup that
produces source_node (the next(...) comprehension) to safely access keys (e.g.,
use node.get("id") and link.get("source_id") or check "id" in node and
"source_id" in link) and ensure link is a mapping before comparing, so the
generator returns None when keys are missing instead of raising.
- Around line 64-70: The loop that normalizes agent["links"] uses direct
indexing link["id"] which can raise KeyError for malformed links; update the
loop in fixer.py (the block that iterates over agent.get("links", []), calling
self.is_uuid, get_new_id, and self.add_fix_log) to first check if "id" is in
link (e.g., if "id" not in link or not self.is_uuid(link.get("id")) ) and, in
that case, set link["id"]=get_new_id() and call self.add_fix_log with the new
id; otherwise keep the existing id — this prevents KeyError while preserving the
existing validation/logging behavior.
- Around line 989-1008: The loop over links indexes link["source_id"],
link["sink_id"], link["source_name"], and link["sink_name"] without guards
causing possible KeyError; update the logic in the loop that builds
source_node/sink_node and determines source_type/sink_type (references: link,
node_lookup, block_lookup, get_defined_property_type, source_block, sink_block)
to first check presence of source_id/sink_id/source_name/sink_name (use
link.get(...) or explicit key checks) and skip/append the original link (as is
done for missing nodes/blocks) when any required key is missing so the code
never directly indexes missing keys.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py`:
- Around line 455-461: The comprehension blocks use direct indexing block["id"]
which can raise KeyError; update both block_output_schemas and block_names
comprehensions to defensively access the block id (e.g., use block.get("id") or
skip blocks missing an id) and handle missing "outputSchema" and "name"
similarly, mirroring the defensive pattern used in validate_nested_sink_links;
ensure keys are stable (only include entries when id is present) and default
values for outputSchema properties and name are used to avoid exceptions.
- Around line 613-615: The comprehension building library_agent_lookup can raise
KeyError when a library agent dict lacks "graph_id"; update the logic in the
library_agent_lookup assignment so it safely accesses keys (e.g., use
la.get("graph_id") and filter out falsy/None results) or handle missing keys
with a fallback, ensuring only valid graph_id values are used as keys; locate
the code that sets library_agent_lookup and change the comprehension to skip
entries without a valid "graph_id" (references: library_agent_lookup,
library_agents, la["graph_id"]).
- Line 368: The code inconsistently indexes link['sink_id'] directly after
previously extracting sink_id = link.get("sink_id"); update the usage in the
error message (the f-string that builds "for node ... (block ...") to use the
extracted sink_id variable (or safely fallback) instead of link['sink_id'] so
you don't reindex the dict and avoid KeyError; locate this in the validator
where link.get("sink_id") is used and replace direct dict access with the
sink_id variable in the f-string.
- Around line 296-301: The comprehensions building block_input_schemas and
block_names assume every item in blocks has a "id" and will KeyError if not;
update the comprehensions to defensively access block.get("id") and skip entries
without an id (e.g., for block in blocks if block.get("id") is not None) or use
a local id = block.get("id") and continue when falsy, then use id as the dict
key; ensure you still use block.get("inputSchema", {}) and block.get("name",
"Unknown Block") for values so block_input_schemas and block_names skip
malformed blocks without raising.
- Around line 593-599: The link iteration currently uses direct indexing like
link["source_id"], link["sink_id"], link["source_name"], and link["sink_name"],
which can raise KeyError for malformed links; update the iteration to safely
access these fields (use link.get("source_id"), etc.) or check for required keys
before use, skip or log malformed links rather than allowing an exception, and
ensure any downstream logic that assumes these values handles None/defaults;
look for the loop referencing the variable link in the validator code and
replace direct dictionary indexing with guarded access and short-circuiting
behavior.

---

Nitpick comments:
In `@autogpt_platform/backend/backend/copilot/tools/customize_agent.py`:
- Around line 127-145: In the local-mode branch where agent_json only gets
is_active, add defaults for id and version so downstream fix_validate_and_save
receives them: call agent_json.setdefault("id", str(uuid4())) and
agent_json.setdefault("version", 1) before calling fix_validate_and_save, and
add the required from uuid import uuid4 import if not already present; this
mirrors the behavior in create_agent/edit_agent and prevents missing-id/version
save issues.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 7034506 and 2900705.

📒 Files selected for processing (5)
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: test (3.13)
  • GitHub Check: test (3.12)
  • GitHub Check: test (3.11)
  • GitHub Check: end-to-end tests
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (4)
autogpt_platform/backend/**/*.py

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/backend/**/*.py: Use Python 3.11 (required; managed by Poetry via pyproject.toml) for backend development
Always run 'poetry run format' (Black + isort) before linting in backend development
Always run 'poetry run lint' (ruff) after formatting in backend development

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/backend/**/*.{py,txt}

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use poetry run prefix for all Python commands, including testing, linting, formatting, and migrations

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/backend/backend/**/*.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use Prisma ORM for database operations in PostgreSQL with pgvector for embeddings

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Format Python code with poetry run format

Files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
🧠 Learnings (2)
📚 Learning: 2026-02-26T17:02:22.448Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12211
File: .pre-commit-config.yaml:160-179
Timestamp: 2026-02-26T17:02:22.448Z
Learning: Keep the pre-commit hook pattern broad for autogpt_platform/backend to ensure OpenAPI schema changes are captured. Do not narrow to backend/api/ alone, since the generated schema depends on Pydantic models across multiple directories (backend/data/, backend/blocks/, backend/copilot/, backend/integrations/, backend/util/). Narrowing could miss schema changes and cause frontend type desynchronization.

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/customize_agent.py
  • autogpt_platform/backend/backend/copilot/tools/edit_agent.py
  • autogpt_platform/backend/backend/copilot/tools/create_agent.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/backend/blocks/*.py : When adding new blocks, analyze block interfaces to ensure inputs and outputs tie well together for productive graph-based editor connections

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
🧬 Code graph analysis (3)
autogpt_platform/backend/backend/copilot/tools/edit_agent.py (2)
autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py (1)
  • fix_validate_and_save (20-131)
autogpt_platform/backend/backend/copilot/tools/agent_generator/core.py (1)
  • get_agent_as_json (762-790)
autogpt_platform/backend/backend/copilot/tools/create_agent.py (2)
autogpt_platform/backend/backend/copilot/tools/agent_generator/pipeline.py (1)
  • fix_validate_and_save (20-131)
autogpt_platform/backend/backend/copilot/tools/models.py (2)
  • ToolResponseBase (58-63)
  • ErrorResponse (207-212)
autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (8)
autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py (4)
  • is_uuid (28-30)
  • generate_uuid (32-34)
  • get_defined_property_type (245-258)
  • are_types_compatible (263-266)
autogpt_platform/backend/backend/data/auth/api_key.py (1)
  • match (56-58)
autogpt_platform/backend/backend/data/graph.py (1)
  • block (123-132)
autogpt_platform/backend/backend/util/logging.py (3)
  • info (41-43)
  • debug (53-55)
  • warning (45-47)
autogpt_platform/backend/backend/copilot/tools/create_agent.py (1)
  • name (36-37)
autogpt_platform/backend/backend/copilot/tools/customize_agent.py (1)
  • name (35-36)
autogpt_platform/backend/backend/copilot/tools/edit_agent.py (1)
  • name (33-34)
autogpt_platform/backend/backend/copilot/tools/fix_agent.py (1)
  • name (19-20)
🔇 Additional comments (13)
autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py (2)

699-706: Hardcoded credential values removed from error messages — LGTM.

The past review flagged that repr(value) was being included in error messages, potentially leaking secrets. The current code no longer includes the value in the error message, only the input name.


880-897: LGTM — fix_and_validate helper is well-structured.

The async helper properly chains the fixer and validator, returning a clear tuple with the fixed agent, validity status, error message, and list of fixes applied.

autogpt_platform/backend/backend/copilot/tools/create_agent.py (3)

110-115: LGTM — Routing logic correctly uses type check.

The routing uses isinstance(agent_json, dict) which correctly handles empty dicts by routing them to local mode where they'll get the empty_agent error.


117-151: LGTM — Local mode implementation is solid.

The _execute_local method properly:

  • Validates that nodes exist (returns empty_agent error if empty)
  • Sets default top-level fields (id, version, is_active)
  • Delegates to the shared fix_validate_and_save pipeline

153-376: LGTM — External mode preserves existing behavior.

The external mode properly handles all decomposition result types (clarifying questions, unachievable/vague goals, errors) and maintains the save/preview flow.

autogpt_platform/backend/backend/copilot/tools/edit_agent.py (3)

123-127: LGTM — Routing correctly uses type check.

Past review addressed: the routing now uses isinstance(agent_json, dict) ensuring empty dicts are routed to local mode.


149-160: LGTM — Fail-fast when target agent not found.

Past review addressed: the code now returns an agent_not_found error immediately when current_agent is None, preventing the local edit from proceeding with a missing agent.


162-169: LGTM — Local edit mode correctly passes is_update=True.

The local mode properly sets is_update=True when calling fix_validate_and_save, ensuring the agent is treated as an update rather than a new creation.

autogpt_platform/backend/backend/copilot/tools/customize_agent.py (2)

113-115: LGTM — Routing correctly uses type check.

Past review addressed: the routing now uses isinstance(agent_json, dict) ensuring empty dicts are routed to local mode.


336-342: LGTM — Save error handling now includes exception details.

Past review addressed: the save error now logs the exception and includes str(e) in both the message and details.

autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (3)

842-866: Update AI model identifiers to valid values.

Past review flagged: The default model "gpt-5.2-2025-12-11" and allowed model "claude-opus-4-6" are not standard OpenAI or Anthropic identifiers. Valid OpenAI models include gpt-4o, gpt-4-turbo, or dated snapshots. Valid Anthropic models include claude-3-5-sonnet-20241022 or claude-3-opus-20240229.

Consider either:

  1. Using valid model identifiers
  2. Making this configurable via environment/settings
  3. Dynamically retrieving valid models from the API
What are valid OpenAI GPT model names for the API in 2025?

1112-1116: LGTM — Defensive access for position data.

Past review addressed: the code now uses .get() with defaults for accessing nested metadata.position data, preventing KeyError on nodes missing these fields.


1602-1651: LGTM — apply_all_fixes orchestrates fixes correctly.

The method clears the fixes log, applies all fixes in a sensible order (basic fixes first, then block-dependent, then library-agent-dependent), and logs the applied fixes.

Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py Outdated
Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py Outdated
Convert all direct key reads on external JSON data (nodes, links, blocks,
library_agents) to .get() patterns to prevent KeyError on malformed input.
Only write operations remain as direct indexing.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (1)

1653-1656: Consider using DEBUG level for fix enumeration.

Using logger.warning for each applied fix seems inappropriate since fixes are expected behavior. Consider logger.debug for the individual fix entries and keep logger.info for the summary line.

🔧 Proposed fix
         logger.info(f"Applied {len(self.fixes_applied)} fixes to agent")
         for fix in self.fixes_applied:
-            logger.warning(f"  - {fix}")
+            logger.debug(f"  - {fix}")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py`
around lines 1653 - 1656, The code logs each applied fix at warning level which
is noisy; change the per-fix log calls in the AgentFixer (the loop iterating
over self.fixes_applied) from logger.warning to logger.debug while keeping the
summary logger.info(f"Applied {len(self.fixes_applied)} fixes to agent") intact
so the summary remains visible but individual entries are debug-level; update
the loop that currently does for fix in self.fixes_applied: logger.warning(f"  -
{fix}") to use logger.debug instead.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py`:
- Around line 844-868: The default OpenAI model identifier used in
fix_ai_model_parameter (default_model parameter and the allowed_models set) is
invalid; update the default_model from "gpt-5.2-2025-12-11" to a valid OpenAI
identifier (e.g., "gpt-5.1" or a known snapshot like "gpt-5.1-2025-11-13") and
replace the entry in allowed_models accordingly (ensure allowed_models contains
the chosen valid OpenAI identifier and keeps "claude-opus-4-6" for Anthropic);
adjust any related validation logic in fix_ai_model_parameter to use the updated
allowed_models set.

---

Nitpick comments:
In `@autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py`:
- Around line 1653-1656: The code logs each applied fix at warning level which
is noisy; change the per-fix log calls in the AgentFixer (the loop iterating
over self.fixes_applied) from logger.warning to logger.debug while keeping the
summary logger.info(f"Applied {len(self.fixes_applied)} fixes to agent") intact
so the summary remains visible but individual entries are debug-level; update
the loop that currently does for fix in self.fixes_applied: logger.warning(f"  -
{fix}") to use logger.debug instead.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 2900705 and 2846e18.

📒 Files selected for processing (2)
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: test (3.12)
  • GitHub Check: test (3.13)
  • GitHub Check: test (3.11)
  • GitHub Check: end-to-end tests
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (4)
autogpt_platform/backend/**/*.py

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/backend/**/*.py: Use Python 3.11 (required; managed by Poetry via pyproject.toml) for backend development
Always run 'poetry run format' (Black + isort) before linting in backend development
Always run 'poetry run lint' (ruff) after formatting in backend development

Files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/backend/**/*.{py,txt}

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use poetry run prefix for all Python commands, including testing, linting, formatting, and migrations

Files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/backend/backend/**/*.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use Prisma ORM for database operations in PostgreSQL with pgvector for embeddings

Files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
autogpt_platform/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Format Python code with poetry run format

Files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
🧠 Learnings (6)
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/backend/blocks/*.py : When adding new blocks, analyze block interfaces to ensure inputs and outputs tie well together for productive graph-based editor connections

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
📚 Learning: 2026-02-05T04:11:15.945Z
Learnt from: ntindle
Repo: Significant-Gravitas/AutoGPT PR: 11796
File: autogpt_platform/backend/backend/blocks/video/concat.py:3-4
Timestamp: 2026-02-05T04:11:15.945Z
Learning: Block IDs in autogpt_platform/backend/backend/blocks/**/*.py must be stable, hard-coded UUID strings. When initially creating a new block, generate a UUID once using `uuid.uuid4()` and then hard-code that UUID string as the block's `id` parameter. Do not call uuid.uuid4() dynamically at runtime, as block IDs must remain constant across all imports and runs.

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/backend/blocks/*.py : When creating new blocks, inherit from the `Block` base class and define input/output schemas using `BlockSchema`

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/blocks/**/*.py : Inherit from 'Block' base class with input/output schemas when adding new blocks in backend

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
📚 Learning: 2026-02-04T16:50:51.495Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-04T16:50:51.495Z
Learning: Applies to autogpt_platform/**/data/*.py : For changes touching `data/*.py`, validate user ID checks or explain why not needed

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
📚 Learning: 2026-02-26T17:02:22.448Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12211
File: .pre-commit-config.yaml:160-179
Timestamp: 2026-02-26T17:02:22.448Z
Learning: Keep the pre-commit hook pattern broad for autogpt_platform/backend to ensure OpenAPI schema changes are captured. Do not narrow to backend/api/ alone, since the generated schema depends on Pydantic models across multiple directories (backend/data/, backend/blocks/, backend/copilot/, backend/integrations/, backend/util/). Narrowing could miss schema changes and cause frontend type desynchronization.

Applied to files:

  • autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py
  • autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py
🧬 Code graph analysis (1)
autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (1)
autogpt_platform/backend/backend/data/graph.py (1)
  • block (123-132)
🔇 Additional comments (19)
autogpt_platform/backend/backend/copilot/tools/agent_generator/validator.py (9)

1-49: LGTM: Well-structured validator foundation.

The class initialization, UUID utilities, and _values_equal helper are correctly implemented. The defensive approach with error collection via add_error allows aggregated validation rather than fail-fast behavior.


50-186: LGTM: Block existence, link references, and required inputs validation.

These validation methods correctly use defensive .get() patterns for all dictionary access. The logic for checking block existence, link node references, and required inputs is thorough with descriptive error messages.


296-302: Empty string keys may cause lookup issues.

Using block.get("id", "") prevents KeyError but creates dict entries with empty string keys when blocks lack IDs. This could cause incorrect schema lookups when block_id is also empty or missing.

🔧 Proposed fix to filter blocks without IDs
         block_input_schemas = {
-            block.get("id", ""): block.get("inputSchema", {}).get("properties", {})
-            for block in blocks
+            block_id: block.get("inputSchema", {}).get("properties", {})
+            for block in blocks
+            if (block_id := block.get("id"))
         }
         block_names = {
-            block.get("id", ""): block.get("name", "Unknown Block") for block in blocks
+            block_id: block.get("name", "Unknown Block")
+            for block in blocks
+            if (block_id := block.get("id"))
         }

455-461: Same empty-string-key pattern in output schema lookup.

This has the same concern as validate_nested_sink_links — blocks without IDs create empty string keys.


613-616: Same pattern for library_agent_lookup.

Library agents without graph_id will create an entry with empty string key, which could match nodes with missing/empty graph_id unexpectedly.

🔧 Proposed fix
         library_agent_lookup: dict[str, dict[str, Any]] = {}
         if library_agents:
-            library_agent_lookup = {la.get("graph_id", ""): la for la in library_agents}
+            library_agent_lookup = {
+                graph_id: la
+                for la in library_agents
+                if (graph_id := la.get("graph_id"))
+            }

379-432: LGTM: Prompt validation logic.

The double curly brace validation with context snippets is well-implemented. The regex pattern correctly identifies spaces within {{...}} patterns and provides helpful fix suggestions in error messages.


723-800: LGTM: AgentExecutorBlock schema validation.

The validate_agent_executor_block_schemas method correctly checks for missing or invalid schemas on AgentExecutorBlock nodes, which is important for preventing frontend crashes as noted in the comments.


801-878: LGTM: Validation orchestration and error aggregation.

The validate method properly aggregates all checks and builds a detailed numbered error message. The conditional inclusion of AgentExecutorBlock detailed validation when library_agents is provided is a good design choice.


880-898: LGTM: Fix-and-validate pipeline function.

The fix_and_validate function correctly sequences the fixer before validation, allowing automated repair before final validation checks. The return tuple provides all necessary information for callers.

autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py (10)

1-47: LGTM: Fixer class foundation.

The class initialization with hardcoded block IDs follows the project convention for stable UUIDs. The UUID regex, fix logging mechanism, and utility methods are well-structured. Based on learnings, block IDs must be stable hard-coded UUIDs, which this correctly implements.


48-79: LGTM: Agent ID fixing logic.

The fix_agent_ids method correctly uses defensive .get() patterns for reading and only uses direct indexing for write operations, which aligns with the PR's commit message about defensive patterns.


1332-1337: Same empty-string-key pattern in library_agent_lookup.

This matches the same issue flagged in the validator — library agents without graph_id create entries with empty string keys.

🔧 Proposed fix
-        library_agent_lookup = {la.get("graph_id", ""): la for la in library_agents}
+        library_agent_lookup = {
+            graph_id: la
+            for la in library_agents
+            if (graph_id := la.get("graph_id"))
+        }

80-226: LGTM: StoreValueBlock insertion logic.

The fix_storevalue_before_condition method correctly handles edge cases: checking for existing StoreValueBlock connections, preventing duplicates, and properly rewiring links. The defensive .get() usage throughout is appropriate.


227-344: LGTM: Double curly brace fixing.

The regex-based fix for single-to-double curly braces correctly handles already-double-braced values with the negative lookahead/lookbehind pattern. The prompt_values integration is thorough.


345-621: LGTM: AddToList block fixes.

The comprehensive logic for handling CreateListBlock removal, prerequisite block insertion, and self-referencing links is well-implemented with proper duplicate prevention and position calculations.


918-1082: LGTM: Data type mismatch fixing with type converter insertion.

The fix_data_type_mismatch method correctly identifies incompatible type connections and inserts UniversalTypeConverterBlock nodes. The type mapping and compatibility logic align with the validator's approach.


1275-1299: Good security practice: Credential removal.

The fix_credentials method properly removes credentials from agent JSON and logs only "[REDACTED]" rather than the actual credential values.


1508-1607: LGTM: Invalid nested sink link removal.

The fix_invalid_nested_sink_links method correctly identifies and removes links using invalid _#_ notation with array indices or array-type parents.


1608-1665: LGTM: Fix orchestration.

The apply_all_fixes method correctly sequences fixes with proper dependency ordering (ID fixes first, then structural fixes, then block-dependent fixes). The get_fixes_applied and clear_fixes_log utilities complete the public API.

Comment thread autogpt_platform/backend/backend/copilot/tools/agent_generator/fixer.py Outdated
…lock validation

Local mode now fetches library agents from library_agent_ids and passes
them to the fixer and validator via fix_validate_and_save, matching the
behavior of external mode for AgentExecutorBlock sub-agent validation.
Swiftyos
Swiftyos previously approved these changes Mar 9, 2026
@github-project-automation github-project-automation Bot moved this from 🆕 Needs initial review to 👍🏼 Mergeable in AutoGPT development kanban Mar 9, 2026
@majdyz
majdyz added this pull request to the merge queue Mar 9, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Mar 9, 2026
majdyz added 2 commits March 9, 2026 22:56
…#12346

ResponseType.clarification_needed, .agent_preview, .agent_saved were renamed
to agent_builder_* in the ResponseType refactor; update the new
INTERACTIVE_RESPONSE_TYPES set and styleguide to use the correct keys.
@majdyz
majdyz added this pull request to the merge queue Mar 9, 2026
Merged via the queue into dev with commit 6491cb1 Mar 9, 2026
25 checks passed
@majdyz
majdyz deleted the feat/copilot-local-agent-generation branch March 9, 2026 16:29
@github-project-automation github-project-automation Bot moved this to Done in Frontend Mar 9, 2026
@github-project-automation github-project-automation Bot moved this from 👍🏼 Mergeable to ✅ Done in AutoGPT development kanban Mar 9, 2026
github-merge-queue Bot pushed a commit that referenced this pull request Mar 11, 2026
`responseType.ts` was accidentally committed inside
`src/app/api/__generated__/models/` despite that directory being listed
in `.gitignore` (added in PR #12238).

### Changes 🏗️

- Removes
`autogpt_platform/frontend/src/app/api/__generated__/models/responseType.ts`
from git tracking — the file is already covered by the `.gitignore` rule
`src/app/api/__generated__/` and should never have been committed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] No functional changes — only removes a stale tracked file that is
already gitignored
0ubbe pushed a commit that referenced this pull request Mar 11, 2026
`responseType.ts` was accidentally committed inside
`src/app/api/__generated__/models/` despite that directory being listed
in `.gitignore` (added in PR #12238).

- Removes
`autogpt_platform/frontend/src/app/api/__generated__/models/responseType.ts`
from git tracking — the file is already covered by the `.gitignore` rule
`src/app/api/__generated__/` and should never have been committed.

- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] No functional changes — only removes a stale tracked file that is
already gitignored
@sentry

sentry Bot commented Mar 13, 2026

Copy link
Copy Markdown

Issues attributed to commits in this pull request

This pull request was merged and Sentry observed the following issues:

okxint pushed a commit to okxint/AutoGPT that referenced this pull request Mar 24, 2026
…sub-agent support (Significant-Gravitas#12238)

## Summary

Port the agent generation pipeline from the external AgentGenerator
service into local copilot tools, making the Claude Agent SDK itself
handle validation, fixing, and block recommendation — no separate inner
LLM calls needed.

Key capabilities:
- **Local agent generation**: Create, edit, and customize agents
entirely within the SDK session
- **Graph validation**: 9 validation checks (block existence, link
references, type compatibility, IO blocks, etc.)
- **Graph fixing**: 17+ auto-fix methods (ID repair, link rewiring, type
conversion, credential stripping, dynamic block sink names, etc.)
- **MCP tool blocks**: Guide and fixer support for MCPToolBlock nodes
with proper dynamic input schema handling
- **Sub-agent composition**: AgentExecutorBlock support with library
agent schema enrichment
- **Embedding fallback**: Falls back to OpenRouter for embeddings when
`openai_internal_api_key` is unavailable
- **Actionable error messages**: Excluded block types (MCP, Agent)
return specific hints redirecting to the correct tool

### New Tools
- `validate_agent_graph` — run 9 validation checks on agent JSON
- `fix_agent_graph` — apply 17+ auto-fixes to agent JSON
- `get_blocks_for_goal` — recommend blocks for a given goal (with
optimized descriptions)

### Refactored Tools
- `create_agent`, `edit_agent`, `customize_agent` — accept `agent_json`
for local generation with shared fix→validate→save pipeline
- `find_block` — added `include_schemas` parameter, excludes MCP/Agent
blocks with actionable hints
- `run_block` — actionable error messages for excluded block types
- `find_library_agent` — enriched with `graph_version`, `input_schema`,
`output_schema` for sub-agent composition

### Architecture
- Split 2,558-line `validation.py` into `fixer.py`, `validator.py`,
`helpers.py`, `pipeline.py`
- Extracted shared `fix_validate_and_save()` pipeline (was duplicated
across 3 tools)
- Shared `OPENROUTER_BASE_URL` constant across codebase
- Comprehensive test coverage: 78+ unit tests for fixer/validator, 8
run_block tests, 17 SDK compat tests

## Test plan
- [x] `poetry run format` passes
- [x] `poetry run pytest -s -vvv backend/copilot/` — all tests pass
- [x] CI green on all Python versions (3.11, 3.12, 3.13)
- [x] Manual E2E: copilot generates agents with correct IO blocks,
links, and node structure
- [x] Manual E2E: MCP tool blocks use bare field names for dynamic
inputs
- [x] Manual E2E: sub-agent composition with AgentExecutorBlock
okxint pushed a commit to okxint/AutoGPT that referenced this pull request Mar 24, 2026
…sub-agent support (Significant-Gravitas#12238)

## Summary

Port the agent generation pipeline from the external AgentGenerator
service into local copilot tools, making the Claude Agent SDK itself
handle validation, fixing, and block recommendation — no separate inner
LLM calls needed.

Key capabilities:
- **Local agent generation**: Create, edit, and customize agents
entirely within the SDK session
- **Graph validation**: 9 validation checks (block existence, link
references, type compatibility, IO blocks, etc.)
- **Graph fixing**: 17+ auto-fix methods (ID repair, link rewiring, type
conversion, credential stripping, dynamic block sink names, etc.)
- **MCP tool blocks**: Guide and fixer support for MCPToolBlock nodes
with proper dynamic input schema handling
- **Sub-agent composition**: AgentExecutorBlock support with library
agent schema enrichment
- **Embedding fallback**: Falls back to OpenRouter for embeddings when
`openai_internal_api_key` is unavailable
- **Actionable error messages**: Excluded block types (MCP, Agent)
return specific hints redirecting to the correct tool

### New Tools
- `validate_agent_graph` — run 9 validation checks on agent JSON
- `fix_agent_graph` — apply 17+ auto-fixes to agent JSON
- `get_blocks_for_goal` — recommend blocks for a given goal (with
optimized descriptions)

### Refactored Tools
- `create_agent`, `edit_agent`, `customize_agent` — accept `agent_json`
for local generation with shared fix→validate→save pipeline
- `find_block` — added `include_schemas` parameter, excludes MCP/Agent
blocks with actionable hints
- `run_block` — actionable error messages for excluded block types
- `find_library_agent` — enriched with `graph_version`, `input_schema`,
`output_schema` for sub-agent composition

### Architecture
- Split 2,558-line `validation.py` into `fixer.py`, `validator.py`,
`helpers.py`, `pipeline.py`
- Extracted shared `fix_validate_and_save()` pipeline (was duplicated
across 3 tools)
- Shared `OPENROUTER_BASE_URL` constant across codebase
- Comprehensive test coverage: 78+ unit tests for fixer/validator, 8
run_block tests, 17 SDK compat tests

## Test plan
- [x] `poetry run format` passes
- [x] `poetry run pytest -s -vvv backend/copilot/` — all tests pass
- [x] CI green on all Python versions (3.11, 3.12, 3.13)
- [x] Manual E2E: copilot generates agents with correct IO blocks,
links, and node structure
- [x] Manual E2E: MCP tool blocks use bare field names for dynamic
inputs
- [x] Manual E2E: sub-agent composition with AgentExecutorBlock
Bentlybro pushed a commit that referenced this pull request Apr 4, 2026
`responseType.ts` was accidentally committed inside
`src/app/api/__generated__/models/` despite that directory being listed
in `.gitignore` (added in PR #12238).

### Changes 🏗️

- Removes
`autogpt_platform/frontend/src/app/api/__generated__/models/responseType.ts`
from git tracking — the file is already covered by the `.gitignore` rule
`src/app/api/__generated__/` and should never have been committed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] No functional changes — only removes a stale tracked file that is
already gitignored
Bentlybro pushed a commit to Bentlybro/AutoGPT that referenced this pull request Apr 4, 2026
…icant-Gravitas#12373)

`responseType.ts` was accidentally committed inside
`src/app/api/__generated__/models/` despite that directory being listed
in `.gitignore` (added in PR Significant-Gravitas#12238).

### Changes 🏗️

- Removes
`autogpt_platform/frontend/src/app/api/__generated__/models/responseType.ts`
from git tracking — the file is already covered by the `.gitignore` rule
`src/app/api/__generated__/` and should never have been committed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] No functional changes — only removes a stale tracked file that is
already gitignored
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

platform/backend AutoGPT Platform - Back end platform/blocks platform/frontend AutoGPT Platform - Front end size/xl

Projects

Status: ✅ Done
Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants