amd-gaia 0.14.3__py3-none-any.whl → 0.15.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/METADATA +223 -223
- amd_gaia-0.15.1.dist-info/RECORD +178 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/entry_points.txt +1 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/licenses/LICENSE.md +20 -20
- gaia/__init__.py +29 -29
- gaia/agents/__init__.py +19 -19
- gaia/agents/base/__init__.py +9 -9
- gaia/agents/base/agent.py +2177 -2177
- gaia/agents/base/api_agent.py +120 -120
- gaia/agents/base/console.py +1841 -1841
- gaia/agents/base/errors.py +237 -237
- gaia/agents/base/mcp_agent.py +86 -86
- gaia/agents/base/tools.py +83 -83
- gaia/agents/blender/agent.py +556 -556
- gaia/agents/blender/agent_simple.py +133 -135
- gaia/agents/blender/app.py +211 -211
- gaia/agents/blender/app_simple.py +41 -41
- gaia/agents/blender/core/__init__.py +16 -16
- gaia/agents/blender/core/materials.py +506 -506
- gaia/agents/blender/core/objects.py +316 -316
- gaia/agents/blender/core/rendering.py +225 -225
- gaia/agents/blender/core/scene.py +220 -220
- gaia/agents/blender/core/view.py +146 -146
- gaia/agents/chat/__init__.py +9 -9
- gaia/agents/chat/agent.py +835 -835
- gaia/agents/chat/app.py +1058 -1058
- gaia/agents/chat/session.py +508 -508
- gaia/agents/chat/tools/__init__.py +15 -15
- gaia/agents/chat/tools/file_tools.py +96 -96
- gaia/agents/chat/tools/rag_tools.py +1729 -1729
- gaia/agents/chat/tools/shell_tools.py +436 -436
- gaia/agents/code/__init__.py +7 -7
- gaia/agents/code/agent.py +549 -549
- gaia/agents/code/cli.py +377 -0
- gaia/agents/code/models.py +135 -135
- gaia/agents/code/orchestration/__init__.py +24 -24
- gaia/agents/code/orchestration/checklist_executor.py +1763 -1763
- gaia/agents/code/orchestration/checklist_generator.py +713 -713
- gaia/agents/code/orchestration/factories/__init__.py +9 -9
- gaia/agents/code/orchestration/factories/base.py +63 -63
- gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -118
- gaia/agents/code/orchestration/factories/python_factory.py +106 -106
- gaia/agents/code/orchestration/orchestrator.py +841 -841
- gaia/agents/code/orchestration/project_analyzer.py +391 -391
- gaia/agents/code/orchestration/steps/__init__.py +67 -67
- gaia/agents/code/orchestration/steps/base.py +188 -188
- gaia/agents/code/orchestration/steps/error_handler.py +314 -314
- gaia/agents/code/orchestration/steps/nextjs.py +828 -828
- gaia/agents/code/orchestration/steps/python.py +307 -307
- gaia/agents/code/orchestration/template_catalog.py +469 -469
- gaia/agents/code/orchestration/workflows/__init__.py +14 -14
- gaia/agents/code/orchestration/workflows/base.py +80 -80
- gaia/agents/code/orchestration/workflows/nextjs.py +186 -186
- gaia/agents/code/orchestration/workflows/python.py +94 -94
- gaia/agents/code/prompts/__init__.py +11 -11
- gaia/agents/code/prompts/base_prompt.py +77 -77
- gaia/agents/code/prompts/code_patterns.py +2036 -2036
- gaia/agents/code/prompts/nextjs_prompt.py +40 -40
- gaia/agents/code/prompts/python_prompt.py +109 -109
- gaia/agents/code/schema_inference.py +365 -365
- gaia/agents/code/system_prompt.py +41 -41
- gaia/agents/code/tools/__init__.py +42 -42
- gaia/agents/code/tools/cli_tools.py +1138 -1138
- gaia/agents/code/tools/code_formatting.py +319 -319
- gaia/agents/code/tools/code_tools.py +769 -769
- gaia/agents/code/tools/error_fixing.py +1347 -1347
- gaia/agents/code/tools/external_tools.py +180 -180
- gaia/agents/code/tools/file_io.py +845 -845
- gaia/agents/code/tools/prisma_tools.py +190 -190
- gaia/agents/code/tools/project_management.py +1016 -1016
- gaia/agents/code/tools/testing.py +321 -321
- gaia/agents/code/tools/typescript_tools.py +122 -122
- gaia/agents/code/tools/validation_parsing.py +461 -461
- gaia/agents/code/tools/validation_tools.py +806 -806
- gaia/agents/code/tools/web_dev_tools.py +1758 -1758
- gaia/agents/code/validators/__init__.py +16 -16
- gaia/agents/code/validators/antipattern_checker.py +241 -241
- gaia/agents/code/validators/ast_analyzer.py +197 -197
- gaia/agents/code/validators/requirements_validator.py +145 -145
- gaia/agents/code/validators/syntax_validator.py +171 -171
- gaia/agents/docker/__init__.py +7 -7
- gaia/agents/docker/agent.py +642 -642
- gaia/agents/emr/__init__.py +8 -8
- gaia/agents/emr/agent.py +1506 -1506
- gaia/agents/emr/cli.py +1322 -1322
- gaia/agents/emr/constants.py +475 -475
- gaia/agents/emr/dashboard/__init__.py +4 -4
- gaia/agents/emr/dashboard/server.py +1974 -1974
- gaia/agents/jira/__init__.py +11 -11
- gaia/agents/jira/agent.py +894 -894
- gaia/agents/jira/jql_templates.py +299 -299
- gaia/agents/routing/__init__.py +7 -7
- gaia/agents/routing/agent.py +567 -570
- gaia/agents/routing/system_prompt.py +75 -75
- gaia/agents/summarize/__init__.py +11 -0
- gaia/agents/summarize/agent.py +885 -0
- gaia/agents/summarize/prompts.py +129 -0
- gaia/api/__init__.py +23 -23
- gaia/api/agent_registry.py +238 -238
- gaia/api/app.py +305 -305
- gaia/api/openai_server.py +575 -575
- gaia/api/schemas.py +186 -186
- gaia/api/sse_handler.py +373 -373
- gaia/apps/__init__.py +4 -4
- gaia/apps/llm/__init__.py +6 -6
- gaia/apps/llm/app.py +173 -169
- gaia/apps/summarize/app.py +116 -633
- gaia/apps/summarize/html_viewer.py +133 -133
- gaia/apps/summarize/pdf_formatter.py +284 -284
- gaia/audio/__init__.py +2 -2
- gaia/audio/audio_client.py +439 -439
- gaia/audio/audio_recorder.py +269 -269
- gaia/audio/kokoro_tts.py +599 -599
- gaia/audio/whisper_asr.py +432 -432
- gaia/chat/__init__.py +16 -16
- gaia/chat/app.py +430 -430
- gaia/chat/prompts.py +522 -522
- gaia/chat/sdk.py +1228 -1225
- gaia/cli.py +5481 -5621
- gaia/database/__init__.py +10 -10
- gaia/database/agent.py +176 -176
- gaia/database/mixin.py +290 -290
- gaia/database/testing.py +64 -64
- gaia/eval/batch_experiment.py +2332 -2332
- gaia/eval/claude.py +542 -542
- gaia/eval/config.py +37 -37
- gaia/eval/email_generator.py +512 -512
- gaia/eval/eval.py +3179 -3179
- gaia/eval/groundtruth.py +1130 -1130
- gaia/eval/transcript_generator.py +582 -582
- gaia/eval/webapp/README.md +167 -167
- gaia/eval/webapp/package-lock.json +875 -875
- gaia/eval/webapp/package.json +20 -20
- gaia/eval/webapp/public/app.js +3402 -3402
- gaia/eval/webapp/public/index.html +87 -87
- gaia/eval/webapp/public/styles.css +3661 -3661
- gaia/eval/webapp/server.js +415 -415
- gaia/eval/webapp/test-setup.js +72 -72
- gaia/llm/__init__.py +9 -2
- gaia/llm/base_client.py +60 -0
- gaia/llm/exceptions.py +12 -0
- gaia/llm/factory.py +70 -0
- gaia/llm/lemonade_client.py +3236 -3221
- gaia/llm/lemonade_manager.py +294 -294
- gaia/llm/providers/__init__.py +9 -0
- gaia/llm/providers/claude.py +108 -0
- gaia/llm/providers/lemonade.py +120 -0
- gaia/llm/providers/openai_provider.py +79 -0
- gaia/llm/vlm_client.py +382 -382
- gaia/logger.py +189 -189
- gaia/mcp/agent_mcp_server.py +245 -245
- gaia/mcp/blender_mcp_client.py +138 -138
- gaia/mcp/blender_mcp_server.py +648 -648
- gaia/mcp/context7_cache.py +332 -332
- gaia/mcp/external_services.py +518 -518
- gaia/mcp/mcp_bridge.py +811 -550
- gaia/mcp/servers/__init__.py +6 -6
- gaia/mcp/servers/docker_mcp.py +83 -83
- gaia/perf_analysis.py +361 -0
- gaia/rag/__init__.py +10 -10
- gaia/rag/app.py +293 -293
- gaia/rag/demo.py +304 -304
- gaia/rag/pdf_utils.py +235 -235
- gaia/rag/sdk.py +2194 -2194
- gaia/security.py +163 -163
- gaia/talk/app.py +289 -289
- gaia/talk/sdk.py +538 -538
- gaia/testing/__init__.py +87 -87
- gaia/testing/assertions.py +330 -330
- gaia/testing/fixtures.py +333 -333
- gaia/testing/mocks.py +493 -493
- gaia/util.py +46 -46
- gaia/utils/__init__.py +33 -33
- gaia/utils/file_watcher.py +675 -675
- gaia/utils/parsing.py +223 -223
- gaia/version.py +100 -100
- amd_gaia-0.14.3.dist-info/RECORD +0 -168
- gaia/agents/code/app.py +0 -266
- gaia/llm/llm_client.py +0 -729
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/WHEEL +0 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/top_level.txt +0 -0
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
"""Step implementations for orchestration workflows."""
|
|
4
|
-
|
|
5
|
-
from .base import BaseStep, ErrorCategory, StepResult, StepStatus, UserContext
|
|
6
|
-
from .error_handler import ErrorHandler, RecoveryAction
|
|
7
|
-
|
|
8
|
-
# Next.js steps
|
|
9
|
-
from .nextjs import (
|
|
10
|
-
CreateNextAppStep,
|
|
11
|
-
InstallDependenciesStep,
|
|
12
|
-
ManageApiEndpointDynamicStep,
|
|
13
|
-
ManageApiEndpointStep,
|
|
14
|
-
ManageDataModelStep,
|
|
15
|
-
ManageReactComponentStep,
|
|
16
|
-
PrismaInitStep,
|
|
17
|
-
RunTestsStep,
|
|
18
|
-
SetupTestingStep,
|
|
19
|
-
TestCrudApiStep,
|
|
20
|
-
UpdateLandingPageStep,
|
|
21
|
-
ValidateCrudStructureStep,
|
|
22
|
-
ValidateTypescriptStep,
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
# Python steps
|
|
26
|
-
from .python import (
|
|
27
|
-
AnalyzePylintStep,
|
|
28
|
-
AutoFixSyntaxStep,
|
|
29
|
-
CreateProjectStep,
|
|
30
|
-
FixLintingStep,
|
|
31
|
-
ListFilesStep,
|
|
32
|
-
RunPytestStep,
|
|
33
|
-
ValidateProjectStep,
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
__all__ = [
|
|
37
|
-
# Base
|
|
38
|
-
"BaseStep",
|
|
39
|
-
"StepResult",
|
|
40
|
-
"StepStatus",
|
|
41
|
-
"ErrorCategory",
|
|
42
|
-
"UserContext",
|
|
43
|
-
"ErrorHandler",
|
|
44
|
-
"RecoveryAction",
|
|
45
|
-
# Next.js steps
|
|
46
|
-
"CreateNextAppStep",
|
|
47
|
-
"InstallDependenciesStep",
|
|
48
|
-
"PrismaInitStep",
|
|
49
|
-
"ManageDataModelStep",
|
|
50
|
-
"ManageApiEndpointStep",
|
|
51
|
-
"ManageApiEndpointDynamicStep",
|
|
52
|
-
"ManageReactComponentStep",
|
|
53
|
-
"ValidateCrudStructureStep",
|
|
54
|
-
"ValidateTypescriptStep",
|
|
55
|
-
"TestCrudApiStep",
|
|
56
|
-
"UpdateLandingPageStep",
|
|
57
|
-
"SetupTestingStep",
|
|
58
|
-
"RunTestsStep",
|
|
59
|
-
# Python steps
|
|
60
|
-
"CreateProjectStep",
|
|
61
|
-
"ListFilesStep",
|
|
62
|
-
"ValidateProjectStep",
|
|
63
|
-
"AutoFixSyntaxStep",
|
|
64
|
-
"AnalyzePylintStep",
|
|
65
|
-
"FixLintingStep",
|
|
66
|
-
"RunPytestStep",
|
|
67
|
-
]
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""Step implementations for orchestration workflows."""
|
|
4
|
+
|
|
5
|
+
from .base import BaseStep, ErrorCategory, StepResult, StepStatus, UserContext
|
|
6
|
+
from .error_handler import ErrorHandler, RecoveryAction
|
|
7
|
+
|
|
8
|
+
# Next.js steps
|
|
9
|
+
from .nextjs import (
|
|
10
|
+
CreateNextAppStep,
|
|
11
|
+
InstallDependenciesStep,
|
|
12
|
+
ManageApiEndpointDynamicStep,
|
|
13
|
+
ManageApiEndpointStep,
|
|
14
|
+
ManageDataModelStep,
|
|
15
|
+
ManageReactComponentStep,
|
|
16
|
+
PrismaInitStep,
|
|
17
|
+
RunTestsStep,
|
|
18
|
+
SetupTestingStep,
|
|
19
|
+
TestCrudApiStep,
|
|
20
|
+
UpdateLandingPageStep,
|
|
21
|
+
ValidateCrudStructureStep,
|
|
22
|
+
ValidateTypescriptStep,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Python steps
|
|
26
|
+
from .python import (
|
|
27
|
+
AnalyzePylintStep,
|
|
28
|
+
AutoFixSyntaxStep,
|
|
29
|
+
CreateProjectStep,
|
|
30
|
+
FixLintingStep,
|
|
31
|
+
ListFilesStep,
|
|
32
|
+
RunPytestStep,
|
|
33
|
+
ValidateProjectStep,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
# Base
|
|
38
|
+
"BaseStep",
|
|
39
|
+
"StepResult",
|
|
40
|
+
"StepStatus",
|
|
41
|
+
"ErrorCategory",
|
|
42
|
+
"UserContext",
|
|
43
|
+
"ErrorHandler",
|
|
44
|
+
"RecoveryAction",
|
|
45
|
+
# Next.js steps
|
|
46
|
+
"CreateNextAppStep",
|
|
47
|
+
"InstallDependenciesStep",
|
|
48
|
+
"PrismaInitStep",
|
|
49
|
+
"ManageDataModelStep",
|
|
50
|
+
"ManageApiEndpointStep",
|
|
51
|
+
"ManageApiEndpointDynamicStep",
|
|
52
|
+
"ManageReactComponentStep",
|
|
53
|
+
"ValidateCrudStructureStep",
|
|
54
|
+
"ValidateTypescriptStep",
|
|
55
|
+
"TestCrudApiStep",
|
|
56
|
+
"UpdateLandingPageStep",
|
|
57
|
+
"SetupTestingStep",
|
|
58
|
+
"RunTestsStep",
|
|
59
|
+
# Python steps
|
|
60
|
+
"CreateProjectStep",
|
|
61
|
+
"ListFilesStep",
|
|
62
|
+
"ValidateProjectStep",
|
|
63
|
+
"AutoFixSyntaxStep",
|
|
64
|
+
"AnalyzePylintStep",
|
|
65
|
+
"FixLintingStep",
|
|
66
|
+
"RunPytestStep",
|
|
67
|
+
]
|
|
@@ -1,188 +1,188 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
"""
|
|
4
|
-
Base step classes for orchestration workflows.
|
|
5
|
-
|
|
6
|
-
Provides unified interfaces for workflow steps with standardized results.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from abc import ABC, abstractmethod
|
|
10
|
-
from dataclasses import dataclass, field
|
|
11
|
-
from enum import Enum, auto
|
|
12
|
-
from typing import Any, Callable, Dict, List, Optional, Tuple
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class StepStatus(Enum):
|
|
16
|
-
"""Status of a step execution."""
|
|
17
|
-
|
|
18
|
-
SUCCESS = auto()
|
|
19
|
-
WARNING = auto() # Succeeded with warnings
|
|
20
|
-
ERROR = auto()
|
|
21
|
-
SKIPPED = auto() # Step was skipped (e.g., already done)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class ErrorCategory(Enum):
|
|
25
|
-
"""Categories of errors for recovery routing."""
|
|
26
|
-
|
|
27
|
-
UNKNOWN = auto()
|
|
28
|
-
NETWORK = auto() # Transient network errors
|
|
29
|
-
RESOURCE = auto() # Resource unavailable (disk, memory)
|
|
30
|
-
DEPENDENCY = auto() # Missing dependency
|
|
31
|
-
COMPILATION = auto() # TypeScript, build errors
|
|
32
|
-
SYNTAX = auto() # Code syntax errors
|
|
33
|
-
RUNTIME = auto() # Runtime execution errors
|
|
34
|
-
VALIDATION = auto() # Lint, type check failures
|
|
35
|
-
CONFIGURATION = auto() # Config file issues
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@dataclass
|
|
39
|
-
class StepResult:
|
|
40
|
-
"""Unified result format for all step executions.
|
|
41
|
-
|
|
42
|
-
Replaces inconsistent patterns like:
|
|
43
|
-
- {"success": True, "files": [...]}
|
|
44
|
-
- {"status": "ok", "output": "..."}
|
|
45
|
-
- {"has_errors": False, "return_code": 0}
|
|
46
|
-
|
|
47
|
-
With a single consistent interface.
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
status: StepStatus
|
|
51
|
-
message: str
|
|
52
|
-
error_message: Optional[str] = None
|
|
53
|
-
error_category: ErrorCategory = ErrorCategory.UNKNOWN
|
|
54
|
-
output: Dict[str, Any] = field(default_factory=dict)
|
|
55
|
-
retryable: bool = True
|
|
56
|
-
|
|
57
|
-
@property
|
|
58
|
-
def success(self) -> bool:
|
|
59
|
-
"""Check if step completed successfully (including with warnings)."""
|
|
60
|
-
return self.status in (StepStatus.SUCCESS, StepStatus.WARNING)
|
|
61
|
-
|
|
62
|
-
@property
|
|
63
|
-
def error(self) -> Optional[str]:
|
|
64
|
-
"""Get error message (alias for error_message)."""
|
|
65
|
-
return self.error_message
|
|
66
|
-
|
|
67
|
-
@classmethod
|
|
68
|
-
def ok(cls, message: str, **output) -> "StepResult":
|
|
69
|
-
"""Create a successful result."""
|
|
70
|
-
return cls(status=StepStatus.SUCCESS, message=message, output=output)
|
|
71
|
-
|
|
72
|
-
@classmethod
|
|
73
|
-
def warning(cls, message: str, **output) -> "StepResult":
|
|
74
|
-
"""Create a warning result (success with caveats)."""
|
|
75
|
-
return cls(status=StepStatus.WARNING, message=message, output=output)
|
|
76
|
-
|
|
77
|
-
@classmethod
|
|
78
|
-
def make_error(
|
|
79
|
-
cls,
|
|
80
|
-
message: str,
|
|
81
|
-
error_msg: str,
|
|
82
|
-
category: ErrorCategory = ErrorCategory.UNKNOWN,
|
|
83
|
-
retryable: bool = True,
|
|
84
|
-
**output,
|
|
85
|
-
) -> "StepResult":
|
|
86
|
-
"""Create an error result."""
|
|
87
|
-
return cls(
|
|
88
|
-
status=StepStatus.ERROR,
|
|
89
|
-
message=message,
|
|
90
|
-
error_message=error_msg,
|
|
91
|
-
error_category=category,
|
|
92
|
-
retryable=retryable,
|
|
93
|
-
output=output,
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
@classmethod
|
|
97
|
-
def skipped(cls, message: str, **output) -> "StepResult":
|
|
98
|
-
"""Create a skipped result."""
|
|
99
|
-
return cls(status=StepStatus.SKIPPED, message=message, output=output)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
@dataclass
|
|
103
|
-
class UserContext:
|
|
104
|
-
"""Context passed through workflow execution.
|
|
105
|
-
|
|
106
|
-
Contains user request info and accumulated state from previous steps.
|
|
107
|
-
"""
|
|
108
|
-
|
|
109
|
-
user_request: str
|
|
110
|
-
project_dir: str
|
|
111
|
-
language: str = "typescript"
|
|
112
|
-
project_type: str = "fullstack"
|
|
113
|
-
entity_name: Optional[str] = None # e.g., "Todo", "User"
|
|
114
|
-
schema_fields: Optional[Dict[str, str]] = None # e.g., {"title": "string"}
|
|
115
|
-
accumulated_files: Dict[str, str] = field(default_factory=dict)
|
|
116
|
-
step_outputs: Dict[str, Any] = field(default_factory=dict)
|
|
117
|
-
fix_feedback: List[str] = field(default_factory=list)
|
|
118
|
-
validation_reports: List[Dict[str, Any]] = field(default_factory=list)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
@dataclass
|
|
122
|
-
class BaseStep(ABC):
|
|
123
|
-
"""Abstract base class for workflow steps.
|
|
124
|
-
|
|
125
|
-
Steps wrap tool invocations with standardized result handling.
|
|
126
|
-
The orchestrator calls steps, which return tool invocation specs.
|
|
127
|
-
The orchestrator executes the tool and passes results back to the step.
|
|
128
|
-
"""
|
|
129
|
-
|
|
130
|
-
name: str
|
|
131
|
-
description: str = ""
|
|
132
|
-
|
|
133
|
-
@abstractmethod
|
|
134
|
-
def get_tool_invocation(
|
|
135
|
-
self, context: UserContext
|
|
136
|
-
) -> Optional[Tuple[str, Dict[str, Any]]]:
|
|
137
|
-
"""Return the tool name and arguments to execute.
|
|
138
|
-
|
|
139
|
-
Args:
|
|
140
|
-
context: Current workflow context with user request and state
|
|
141
|
-
|
|
142
|
-
Returns:
|
|
143
|
-
Tuple of (tool_name, tool_args) or None to skip this step
|
|
144
|
-
"""
|
|
145
|
-
|
|
146
|
-
@abstractmethod
|
|
147
|
-
def handle_result(self, result: Any, context: UserContext) -> StepResult:
|
|
148
|
-
"""Convert raw tool result to standardized StepResult.
|
|
149
|
-
|
|
150
|
-
Args:
|
|
151
|
-
result: Raw result from tool execution
|
|
152
|
-
context: Current workflow context
|
|
153
|
-
|
|
154
|
-
Returns:
|
|
155
|
-
Standardized StepResult
|
|
156
|
-
"""
|
|
157
|
-
|
|
158
|
-
def should_skip(self, context: UserContext) -> Optional[str]: # noqa: ARG002
|
|
159
|
-
"""Check if this step should be skipped.
|
|
160
|
-
|
|
161
|
-
Args:
|
|
162
|
-
context: Current workflow context
|
|
163
|
-
|
|
164
|
-
Returns:
|
|
165
|
-
Reason string if should skip, None otherwise
|
|
166
|
-
"""
|
|
167
|
-
# Default: don't skip. Subclasses override to add skip logic.
|
|
168
|
-
del context # Unused in base class
|
|
169
|
-
return None
|
|
170
|
-
|
|
171
|
-
def validate_preconditions(
|
|
172
|
-
self, context: UserContext
|
|
173
|
-
) -> Optional[str]: # noqa: ARG002
|
|
174
|
-
"""Validate that preconditions for this step are met.
|
|
175
|
-
|
|
176
|
-
Args:
|
|
177
|
-
context: Current workflow context
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
Error message if preconditions not met, None otherwise
|
|
181
|
-
"""
|
|
182
|
-
# Default: no preconditions. Subclasses override.
|
|
183
|
-
del context # Unused in base class
|
|
184
|
-
return None
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
# Type alias for tool executor function
|
|
188
|
-
ToolExecutor = Callable[[str, Dict[str, Any]], Any]
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""
|
|
4
|
+
Base step classes for orchestration workflows.
|
|
5
|
+
|
|
6
|
+
Provides unified interfaces for workflow steps with standardized results.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from abc import ABC, abstractmethod
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from enum import Enum, auto
|
|
12
|
+
from typing import Any, Callable, Dict, List, Optional, Tuple
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class StepStatus(Enum):
|
|
16
|
+
"""Status of a step execution."""
|
|
17
|
+
|
|
18
|
+
SUCCESS = auto()
|
|
19
|
+
WARNING = auto() # Succeeded with warnings
|
|
20
|
+
ERROR = auto()
|
|
21
|
+
SKIPPED = auto() # Step was skipped (e.g., already done)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ErrorCategory(Enum):
|
|
25
|
+
"""Categories of errors for recovery routing."""
|
|
26
|
+
|
|
27
|
+
UNKNOWN = auto()
|
|
28
|
+
NETWORK = auto() # Transient network errors
|
|
29
|
+
RESOURCE = auto() # Resource unavailable (disk, memory)
|
|
30
|
+
DEPENDENCY = auto() # Missing dependency
|
|
31
|
+
COMPILATION = auto() # TypeScript, build errors
|
|
32
|
+
SYNTAX = auto() # Code syntax errors
|
|
33
|
+
RUNTIME = auto() # Runtime execution errors
|
|
34
|
+
VALIDATION = auto() # Lint, type check failures
|
|
35
|
+
CONFIGURATION = auto() # Config file issues
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class StepResult:
|
|
40
|
+
"""Unified result format for all step executions.
|
|
41
|
+
|
|
42
|
+
Replaces inconsistent patterns like:
|
|
43
|
+
- {"success": True, "files": [...]}
|
|
44
|
+
- {"status": "ok", "output": "..."}
|
|
45
|
+
- {"has_errors": False, "return_code": 0}
|
|
46
|
+
|
|
47
|
+
With a single consistent interface.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
status: StepStatus
|
|
51
|
+
message: str
|
|
52
|
+
error_message: Optional[str] = None
|
|
53
|
+
error_category: ErrorCategory = ErrorCategory.UNKNOWN
|
|
54
|
+
output: Dict[str, Any] = field(default_factory=dict)
|
|
55
|
+
retryable: bool = True
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def success(self) -> bool:
|
|
59
|
+
"""Check if step completed successfully (including with warnings)."""
|
|
60
|
+
return self.status in (StepStatus.SUCCESS, StepStatus.WARNING)
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def error(self) -> Optional[str]:
|
|
64
|
+
"""Get error message (alias for error_message)."""
|
|
65
|
+
return self.error_message
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def ok(cls, message: str, **output) -> "StepResult":
|
|
69
|
+
"""Create a successful result."""
|
|
70
|
+
return cls(status=StepStatus.SUCCESS, message=message, output=output)
|
|
71
|
+
|
|
72
|
+
@classmethod
|
|
73
|
+
def warning(cls, message: str, **output) -> "StepResult":
|
|
74
|
+
"""Create a warning result (success with caveats)."""
|
|
75
|
+
return cls(status=StepStatus.WARNING, message=message, output=output)
|
|
76
|
+
|
|
77
|
+
@classmethod
|
|
78
|
+
def make_error(
|
|
79
|
+
cls,
|
|
80
|
+
message: str,
|
|
81
|
+
error_msg: str,
|
|
82
|
+
category: ErrorCategory = ErrorCategory.UNKNOWN,
|
|
83
|
+
retryable: bool = True,
|
|
84
|
+
**output,
|
|
85
|
+
) -> "StepResult":
|
|
86
|
+
"""Create an error result."""
|
|
87
|
+
return cls(
|
|
88
|
+
status=StepStatus.ERROR,
|
|
89
|
+
message=message,
|
|
90
|
+
error_message=error_msg,
|
|
91
|
+
error_category=category,
|
|
92
|
+
retryable=retryable,
|
|
93
|
+
output=output,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
@classmethod
|
|
97
|
+
def skipped(cls, message: str, **output) -> "StepResult":
|
|
98
|
+
"""Create a skipped result."""
|
|
99
|
+
return cls(status=StepStatus.SKIPPED, message=message, output=output)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@dataclass
|
|
103
|
+
class UserContext:
|
|
104
|
+
"""Context passed through workflow execution.
|
|
105
|
+
|
|
106
|
+
Contains user request info and accumulated state from previous steps.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
user_request: str
|
|
110
|
+
project_dir: str
|
|
111
|
+
language: str = "typescript"
|
|
112
|
+
project_type: str = "fullstack"
|
|
113
|
+
entity_name: Optional[str] = None # e.g., "Todo", "User"
|
|
114
|
+
schema_fields: Optional[Dict[str, str]] = None # e.g., {"title": "string"}
|
|
115
|
+
accumulated_files: Dict[str, str] = field(default_factory=dict)
|
|
116
|
+
step_outputs: Dict[str, Any] = field(default_factory=dict)
|
|
117
|
+
fix_feedback: List[str] = field(default_factory=list)
|
|
118
|
+
validation_reports: List[Dict[str, Any]] = field(default_factory=list)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@dataclass
|
|
122
|
+
class BaseStep(ABC):
|
|
123
|
+
"""Abstract base class for workflow steps.
|
|
124
|
+
|
|
125
|
+
Steps wrap tool invocations with standardized result handling.
|
|
126
|
+
The orchestrator calls steps, which return tool invocation specs.
|
|
127
|
+
The orchestrator executes the tool and passes results back to the step.
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
name: str
|
|
131
|
+
description: str = ""
|
|
132
|
+
|
|
133
|
+
@abstractmethod
|
|
134
|
+
def get_tool_invocation(
|
|
135
|
+
self, context: UserContext
|
|
136
|
+
) -> Optional[Tuple[str, Dict[str, Any]]]:
|
|
137
|
+
"""Return the tool name and arguments to execute.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
context: Current workflow context with user request and state
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
Tuple of (tool_name, tool_args) or None to skip this step
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
@abstractmethod
|
|
147
|
+
def handle_result(self, result: Any, context: UserContext) -> StepResult:
|
|
148
|
+
"""Convert raw tool result to standardized StepResult.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
result: Raw result from tool execution
|
|
152
|
+
context: Current workflow context
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Standardized StepResult
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
def should_skip(self, context: UserContext) -> Optional[str]: # noqa: ARG002
|
|
159
|
+
"""Check if this step should be skipped.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
context: Current workflow context
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
Reason string if should skip, None otherwise
|
|
166
|
+
"""
|
|
167
|
+
# Default: don't skip. Subclasses override to add skip logic.
|
|
168
|
+
del context # Unused in base class
|
|
169
|
+
return None
|
|
170
|
+
|
|
171
|
+
def validate_preconditions(
|
|
172
|
+
self, context: UserContext
|
|
173
|
+
) -> Optional[str]: # noqa: ARG002
|
|
174
|
+
"""Validate that preconditions for this step are met.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
context: Current workflow context
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Error message if preconditions not met, None otherwise
|
|
181
|
+
"""
|
|
182
|
+
# Default: no preconditions. Subclasses override.
|
|
183
|
+
del context # Unused in base class
|
|
184
|
+
return None
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
# Type alias for tool executor function
|
|
188
|
+
ToolExecutor = Callable[[str, Dict[str, Any]], Any]
|