Some checks failed
Build Docker Image / build-and-push (push) Has been cancelled
- Move services/backend to langgraph/ - Move deploy/docker/Dockerfile to Dockerfile - Remove deploy/, services/ folders - Update GitHub Actions workflow paths - Remove kustomization update logic (managed by K3S-HOME/applications)
179 lines
5.5 KiB
Python
179 lines
5.5 KiB
Python
"""
|
|
Prompt Generator Agent (Claude 4.5)
|
|
Decision Agent의 추천 결과를 바탕으로 다른 AI에게 전달할 구현 프롬프트 생성
|
|
"""
|
|
from langchain_anthropic import ChatAnthropic
|
|
from langchain_core.messages import SystemMessage, HumanMessage
|
|
from .state import AgentState
|
|
import os
|
|
import json
|
|
|
|
|
|
# Claude 4.5 모델 초기화
|
|
claude_prompt_gen = ChatAnthropic(
|
|
model="claude-sonnet-4-20250514",
|
|
api_key=os.getenv("ANTHROPIC_API_KEY"),
|
|
temperature=0.3
|
|
)
|
|
|
|
|
|
PROMPT_GEN_SYSTEM = """You are the Implementation Prompt Generator.
|
|
|
|
## Role
|
|
Generate structured deployment prompts for other AI assistants based on existing project patterns.
|
|
|
|
## Environment Context
|
|
- **Projects Root**: `/home/ubuntu/Projects/`
|
|
- **Git Sync**: Local ↔️ Server auto-sync
|
|
- **ArgoCD**: All apps managed by ArgoCD
|
|
- **Vault**: Secrets managed by Vault ExternalSecrets
|
|
- **Kustomize**: All resources use Kustomization
|
|
|
|
## Project Structure Categories
|
|
|
|
### 1. Applications (`/home/ubuntu/Projects/applications/`)
|
|
**용도**: User-facing applications, development tools
|
|
**예시**: gitea, code-server, kubernetes-dashboard, homer, umami
|
|
**패턴**:
|
|
```
|
|
applications/{app-name}/
|
|
├── argocd/{app-name}.yaml # ArgoCD Application
|
|
├── helm-values/{app-name}.yaml # (Optional) Helm values
|
|
├── vault/*.yaml # (Optional) ExternalSecrets
|
|
└── kustomization.yaml # Resource list
|
|
```
|
|
|
|
### 2. Cluster Infrastructure (`/home/ubuntu/Projects/cluster-infrastructure/`)
|
|
**용도**: Cluster-level infrastructure tools
|
|
**예시**: cert-manager, ingress-nginx, vault, external-secrets, reloader
|
|
**패턴**: Same as applications
|
|
|
|
### 3. Monitoring (`/home/ubuntu/Projects/monitoring/`)
|
|
**용도**: Monitoring and observability tools
|
|
**예시**: prometheus, grafana, loki
|
|
|
|
### 4. Databases (`/home/ubuntu/Projects/databases/`)
|
|
**용도**: Database services
|
|
**예시**: postgresql, redis, mongodb
|
|
|
|
### 5. Individual Projects (`/home/ubuntu/Projects/{project-name}/`)
|
|
**용도**: Standalone application projects
|
|
**예시**: mas, jaejadle, joossam, portfolio
|
|
**패턴**:
|
|
```
|
|
{project-name}/
|
|
├── deploy/
|
|
│ ├── argocd/{project-name}.yaml
|
|
│ └── k8s/
|
|
│ ├── base/
|
|
│ └── overlays/prod/
|
|
└── services/
|
|
```
|
|
|
|
## Output Format (Markdown)
|
|
Create a CONCISE guide (MAX 25 lines total):
|
|
|
|
```markdown
|
|
# [도구명] 배포 가이드
|
|
|
|
## 📍 배치
|
|
`/home/ubuntu/Projects/[category]/[tool-name]/`
|
|
**이유**: [1줄 설명]
|
|
**참고**: [category]/[example]/ 구조 동일
|
|
|
|
## 📂 구조
|
|
\`\`\`
|
|
[category]/[tool-name]/
|
|
├── argocd/[tool-name].yaml
|
|
├── kustomization.yaml
|
|
└── vault/*.yaml (선택)
|
|
\`\`\`
|
|
|
|
## 📋 파일
|
|
- **argocd/**: ArgoCD Application (repoURL, path, namespace)
|
|
- **kustomization.yaml**: 리소스 목록
|
|
- **vault/**: ExternalSecret (평문 금지)
|
|
|
|
## ✅ 필수
|
|
- ArgoCD 통합
|
|
- `/home/ubuntu/Projects/[category]/kustomization.yaml` 업데이트
|
|
```
|
|
|
|
CRITICAL: Response MUST be under 25 lines!
|
|
|
|
## Guidelines
|
|
1. **폴더 구조와 파일 역할**만 명시 (세부 YAML은 AI가 생성)
|
|
2. **카테고리 선택 기준** 명확히 제시
|
|
3. **기존 프로젝트 패턴** 반드시 준수
|
|
4. **ArgoCD, Vault, Kustomize 통합** 필수
|
|
5. **참고 예시** 제공하여 AI가 따라할 수 있도록
|
|
"""
|
|
|
|
|
|
def prompt_generator_node(state: AgentState) -> AgentState:
|
|
"""
|
|
Prompt Generator 노드: 다른 AI에게 전달할 구현 프롬프트 생성
|
|
"""
|
|
messages = state["messages"]
|
|
task_plan = state.get("task_plan", {})
|
|
research_data = state.get("research_data", {})
|
|
decision_report = state.get("decision_report", {})
|
|
|
|
# 입력 데이터 준비
|
|
plan_summary = json.dumps(task_plan, indent=2, ensure_ascii=False) if task_plan else "No plan"
|
|
research_summary = json.dumps(research_data, indent=2, ensure_ascii=False) if research_data else "No research"
|
|
|
|
# 사용자 원래 요청
|
|
user_request = messages[0]["content"] if messages else "Deploy infrastructure"
|
|
tool_name = task_plan.get("target_tool", "Unknown") if task_plan else "Unknown"
|
|
|
|
print(f"\n{'='*80}")
|
|
print(f"Prompt Generator - Creating implementation guide")
|
|
print(f"{'='*80}")
|
|
|
|
# Claude 호출
|
|
response = claude_prompt_gen.invoke([
|
|
SystemMessage(content=PROMPT_GEN_SYSTEM),
|
|
HumanMessage(content=f"""다른 AI에게 전달할 구현 가이드를 생성해주세요:
|
|
|
|
**사용자 요청:** {user_request}
|
|
**배포 대상:** {tool_name}
|
|
|
|
**계획 데이터:**
|
|
```json
|
|
{plan_summary}
|
|
```
|
|
|
|
**클러스터 상태:**
|
|
```json
|
|
{research_summary}
|
|
```
|
|
|
|
위 정보를 바탕으로:
|
|
1. **적절한 카테고리 선택** (applications, cluster-infrastructure, monitoring, databases)
|
|
2. **폴더 구조만 제시** (세부 YAML은 다른 AI가 생성)
|
|
3. **파일별 역할 설명** (필수 필드와 용도만 명시)
|
|
4. **기존 패턴 준수** (ArgoCD, Vault, Kustomize 통합)
|
|
5. **참고 예시 제공** (동일 카테고리 프로젝트)
|
|
|
|
**중요**:
|
|
- 구조와 역할만 설명하고, 세부 YAML 내용은 생성하지 마세요
|
|
- 다른 AI가 이 가이드를 보고 YAML을 직접 생성할 수 있도록 간결하게 작성
|
|
- 응답은 간결하게 유지 (너무 길면 잘립니다)
|
|
""")
|
|
])
|
|
|
|
content = response.content
|
|
|
|
print(f"✅ Implementation guide generated ({len(content)} characters)")
|
|
|
|
# 상태 업데이트
|
|
state["implementation_prompt"] = content
|
|
state["messages"].append({
|
|
"role": "prompt_generator",
|
|
"content": content
|
|
})
|
|
state["current_agent"] = "end" # 완료
|
|
|
|
return state
|