Files
mas/langgraph/agents/prompt_generator_agent.py
Mayne0213 013140f02c
Some checks failed
Build Docker Image / build-and-push (push) Has been cancelled
REFACTOR(repo): simplify project structure
- 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)
2026-01-05 16:50:49 +09:00

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