레이블이 에이전트인 게시물을 표시합니다. 모든 게시물 표시
레이블이 에이전트인 게시물을 표시합니다. 모든 게시물 표시

2025년 9월 14일 일요일

n8n용 실전 워크플로우: 서비스계정(서비스 계정 토큰)으로 Google apal(Gemini) 호출하고 Gmail/Sheets로 처리하기

n8n용 실전 워크플로우: 서비스계정(서비스 계정 토큰)으로 Google apal(Gemini) 호출하고 Gmail/Sheets로 처리하기

실전 튜토리얼 — n8n에 Import 가능한 Gemini(apal) 워크플로우 + 서비스계정 인증 가이드

요약: 이 글은 n8n에 바로 Import 가능한 JSON 워크플로우( Webhook → Gemini 호출 → 응답 추출 → Gmail 발송 → Google Sheets 기록 )와, 서비스계정 기반 인증(토큰 발급 방법: gcloud, Node 스크립트)을 단계별로 설명합니다. 워크플로우는 API 키 대신 서비스계정에서 발급한 Access Token(짧은 수명)을 사용하도록 설계되어 있습니다.

1) 준비물

  • n8n 계정(클라우드 또는 자체 호스팅)
  • Google Cloud 프로젝트
  • 서비스 계정(Service Account) JSON 키 파일 (roles: access to Generative API + Sheets + Gmail 필요)
  • gcloud CLI (테스트용 토큰 발급 시 권장) 또는 Node.js(자동화 스크립트용)
  • n8n에서 Gmail/Google Sheets 크레덴셜 설정 (OAuth 방식 또는 서비스 계정 연동)

2) 핵심 아이디어(동작 흐름)

  1. 외부에서 Webhook 호출 → n8n 워크플로우 시작
  2. 서비스 계정으로 Access Token 발급(수동 혹은 자동화 방식)
  3. HTTP Request 노드로 Gemini(apal) REST API 호출(Authorization: Bearer <ACCESS_TOKEN>)
  4. Function 노드로 응답 추출 및 포맷
  5. Gmail 노드로 발송, Google Sheets 노드로 발송 로그 저장

3) n8n Import용 워크플로우 JSON

아래 JSON을 그대로 복사 → n8n UI에서 Import from file/clipboard로 불러오세요. (노드 내에 있는 REPLACE_WITH_ACCESS_TOKEN 자리표시자를 실제 Access Token 또는 n8n 환경변수로 바꿔주세요)

{
  "name": "Gemini ServiceAccount Workflow (Webhook → Gemini → Gmail → Sheets)",
  "nodes": [
    {
      "parameters": {
        "path": "gemini-serviceagent",
        "responseMode": "lastNode",
        "options": {}
      },
      "id": "1",
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [240, 260]
    },
    {
      "parameters": {
        "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent",
        "method": "POST",
        "authentication": "headerAuth",
        "headerAuth": {
          "name": "Authorization",
          "value": "Bearer REPLACE_WITH_ACCESS_TOKEN"
        },
        "jsonParameters": true,
        "options": {},
        "body": {
          "contents": [
            {
              "parts": [
                {
                  "text": "You are an assistant. Given the user request, produce a concise reply in markdown. Input: {{$json.body.inputText || $json.inputText || $json.query || 'No input provided.'}}"
                }
              ]
            }
          ],
          "generation_config": {
            "max_output_tokens": 400
          }
        }
      },
      "id": "2",
      "name": "Gemini (HTTP Request)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [560, 260]
    },
    {
      "parameters": {
        "functionCode": "const body = items[0].json;\n// 안전하게 구조를 확인하고 텍스트 추출\nlet text = '';\ntry {\n  text = body.candidates?.[0]?.content?.parts?.[0]?.text || JSON.stringify(body);\n} catch (e) {\n  text = JSON.stringify(body);\n}\nreturn [{ json: { reply: text, raw: body } }];"
      },
      "id": "3",
      "name": "Extract Reply",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [820, 260]
    },
    {
      "parameters": {
        "fromEmail": "me",
        "toEmail": "{{$json.body?.email || $json.email || 'recipient@example.com'}}",
        "subject": "自动发出: Gemini 에이전트 응답",
        "text": "{{$json.reply}}",
        "additionalFields": {}
      },
      "id": "4",
      "name": "Gmail Send",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 1,
      "position": [1080, 180]
    },
    {
      "parameters": {
        "operation": "append",
        "sheetId": "REPLACE_WITH_SHEET_ID",
        "sheetRange": "Sheet1!A:C",
        "options": {},
        "columns": [
          {
            "column": "A",
            "value": "={{$now}}"
          },
          {
            "column": "B",
            "value": "={{$json.reply}}"
          },
          {
            "column": "C",
            "value": "={{$json.raw && JSON.stringify($json.raw).slice(0,200)}}"
          }
        ]
      },
      "id": "5",
      "name": "Google Sheets Append",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 1,
      "position": [1080, 340]
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Gemini (HTTP Request)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini (HTTP Request)": {
      "main": [
        [
          {
            "node": "Extract Reply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Reply": {
      "main": [
        [
          {
            "node": "Gmail Send",
            "type": "main",
            "index": 0
          },
          {
            "node": "Google Sheets Append",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

설명(중요):

  • Gemini (HTTP Request) 노드는 Authorization 헤더에 `Bearer REPLACE_WITH_ACCESS_TOKEN`가 들어가 있습니다. 이 자리에 실제 Access Token(예: ya29.<...>)을 넣거나, n8n의 환경변수/credentials로 대체하세요.
  • Google Sheets AppendsheetId를 실제 스프레드시트 ID로 바꿔야 합니다.
  • Gmail Send 노드는 n8n에서 미리 Gmail credentials를 설정해두어야 정상 작동합니다.

4) 서비스계정으로 Access Token 얻는 방법 (권장: gcloud CLI — 빠르고 안전)

가장 간단한 방법(테스트용)은 gcloud CLI를 사용하는 것입니다. 아래는 로컬에서 토큰을 얻는 방법입니다.

# 1) 서비스 계정 키 파일로 gcloud에 인증 (한 번만)
gcloud auth activate-service-account --key-file="/path/to/service-account.json"

# 2) Access Token 발급 (짧은 유효기간 토큰)
gcloud auth print-access-token

# 출력 예시:
# ya29.a0AfH6SMB... (이를 n8n HTTP Request의 Authorization 헤더에 넣으세요)
    

토큰은 일반적으로 ~1시간 정도 유효합니다. 운영 환경에서는 토큰을 주기적으로 재발급하거나 자동 갱신 로직을 구현해야 합니다.

5) 서비스계정 토큰 자동화 (Node.js 스크립트 예제)

운영에서 매번 수동으로 토큰을 붙여넣기보다, 다음과 같은 작은 서비스(또는 n8n 내부의 FunctionHTTP Request 조합)를 사용해 토큰을 자동으로 갱신하고 워크플로우 실행 시 최신 토큰을 주입하는 방법이 좋습니다. 아래는 Node.js에서 google-auth-library를 사용해 액세스 토큰을 얻는 예제입니다.

// getAccessToken.js
const { GoogleAuth } = require('google-auth-library');

async function getToken() {
  const auth = new GoogleAuth({
    keyFile: '/path/to/service-account.json',
    scopes: ['https://www.googleapis.com/auth/cloud-platform','https://www.googleapis.com/auth/userinfo.email']
  });
  const client = await auth.getClient();
  const accessToken = await client.getAccessToken();
  console.log(accessToken.token);
}

getToken().catch(console.error);
    

이 스크립트를 서버에서 실행하거나, CI/pipeline에서 주기적으로 돌려 n8n의 환경변수 또는 별도 비밀 저장소(예: Vault)에 갱신하면 안전하게 운영할 수 있습니다.

6) n8n에서 토큰을 안전하게 사용하는 방법 (권장 패턴)

  1. 환경 변수 사용: n8n을 실행하는 환경의 환경변수에 GEMINI_ACCESS_TOKEN을 저장하고 HTTP Request 노드에서 `Authorization: Bearer {{$env.GEMINI_ACCESS_TOKEN}}`로 참조.
  2. 외부 시크릿 스토어: HashiCorp Vault, AWS Secrets Manager 등에서 토큰을 관리하고 n8n에서 주기적으로 가져옴.
  3. 자동 갱신 워크플로우: 별도 n8n 워크플로우로 토큰 발급(예: Node 스크립트 호출 → token 변수에 저장) 후 주 워크플로우에서 참조.

7) Gmail/Sheets 크레덴셜 구성 팁

  • Gmail 노드: n8n의 OAuth2 연결을 사용하세요(개인 Gmail 테스트 시 'me'로 사용 가능). 프로덕션에서는 G Suite(Workspace) 서비스 계정을 통한 도메인 권한 위임(delegation) 구성 권장.
  • Google Sheets: 서비스 계정으로 편집 권한을 준 시트를 사용하면 서비스 계정 기반 접근이 가능합니다. 서비스 계정 이메일을 시트 공유 대상에 추가하세요.

8) 테스트 & 운영 체크리스트

  • Webhook을 호출하여 전체 플로우가 동작하는지 확인
  • Gemini 응답 구조( candidates → content → parts → text )가 예상대로인지 확인
  • 토큰 만료 시 자동 갱신 로직 작동 여부 확인
  • Sheets에 로그가 정상 기록되는지(중복/포맷) 확인
  • Gmail 발송 성공 여부와 스팸 처리를 모니터링
보안 경고: 서비스 계정 키 파일(.json)은 절대 공개 저장소에 올리지 마세요. 블로그, 스크린샷, 코드 예제에는 실제 키를 노출하지 마시고 마스킹된 예시만 사용하세요.

9) 다음 단계 제안

원하시면 제가 아래 작업을 바로 해드릴게요:

  • ① 위 JSON에서 REPLACE_WITH_ACCESS_TOKEN을 자동으로 갱신해 넣는 n8n 워크플로우(토큰 발급 워크플로우) 생성
  • ② Gmail 발송 템플릿(HTML) 자동화 및 이메일 구독자 필드 연동
  • ③ 서비스 계정 범위(roles) 최소화와 IAM 설정 가이드 문서 작성

n8n + Google Gemini로 AI 에이전트 구현하기 — 초보자용 상세 가이드

n8n + Google Gemini로 AI 에이전트 구현하기 — 초보자용 상세 가이드

n8n + Google Gemini로 AI 에이전트 구현하기 — 초보자용 상세 가이드

작성자: 지식인 질문답변 생성기 • 카테고리: AI 자동화 • 퍼머링크: /n8n-gemini-agent-guide

개괄(서론) — 왜 Google Gemini와 n8n인가? 🤖✨

요약: Google의 Gemini는 텍스트·멀티모달 생성, 함수 호출(function calling), 장기 컨텍스트 등 실무형 기능을 갖춘 LLM이며, n8n은 시각적 워크플로우로 다양한 서비스(메일, 시트, HTTP 등)를 연결해 에이전트를 손쉽게 만들 수 있습니다. 따라서 Gemini의 강력한 '두뇌'와 n8n의 '도구 연결력'을 합치면 코드 적은(또는 없는) 상태로도 실전형 자동화 에이전트를 빠르게 프로토타입하고 운영할 수 있습니다. :contentReference[oaicite:1]{index=1}

이 글은 (1) 핵심 개념 요약(표), (2) 단계별 구현 체크리스트·흐름도, (3) n8n에서의 구체 세팅(예: HTTP Request / Gemini 통합 노드 예제), (4) 사례 두 건, (5) 보안·운영 팁, (6) 요약·피드백 그래프로 구성됩니다. 필요하시면 즉시 n8n 워크플로우 JSON도 만들어 드립니다.

기·승 (도입 & 전개)

핵심 개념 표 (한눈에 보기) 🧭

구성요소역할n8n에서의 구현
두뇌 (Brain)추론·요약·함수 호출Google Gemini 노드 또는 HTTP Request → Gemini REST/SDK 호출(GenerateContent).
감각 (Sensors)외부 데이터 수집(뉴스, API, 이메일)HTTP Request / RSS / Gmail / SERP API 노드
기억 (Memory)보낸 기록·대화 컨텍스트 저장Google Sheets / PostgreSQL / Airtable 등 데이터베이스 노드
도구 (Actuators)행동(메일발송, CRM 업데이트)Gmail, Slack, HTTP Request, Google Sheets 노드

참고: Gemini API는 REST 및 여러 공식 SDK(파이썬, JS 등)를 제공하며, n8n은 공식 통합 또는 HTTP Request를 통해 Gemini와 연동할 수 있습니다. :contentReference[oaicite:2]{index=2}

단계별 체크리스트 (기 → 승) ✅

  • 🔹 목표 정의: 에이전트의 1가지 핵심 목적을 정한다(예: 매일 요약 전송).
  • 🔹 계정/키 준비: Google AI Studio(또는 Vertex AI)에서 Gemini API 키 발급. :contentReference[oaicite:3]{index=3}
  • 🔹 n8n 환경 준비: n8n 계정 또는 자체 호스팅, 필요한 크레덴셜 추가.
  • 🔹 간단 프로토타입: 수동 트리거로 Gemini 호출 테스트.
  • 🔹 메모리 설계: 중복 방지·전송 로그 저장 위치 결정.

간단 흐름도 — 초기 워크플로우 (기 → 승)

Trigger (Cron / Webhook) Fetch Data (News / API) Gemini (LLM) — Prompt / Function Calling Action Nodes (Gmail / Sheets)

참고 템플릿: n8n은 Gemini용 미리 만들어진 워크플로우 템플릿을 제공합니다(불러와서 키만 넣고 실행 가능). :contentReference[oaicite:4]{index=4}

둘째 글 — 기·승·전·결 (완전 구현 가이드)

기 — 문제 정의와 핵심 요구사항

예제 목표: 매일 아침 07:30특정 도시의 날씨 요약 + 긍정적 뉴스 2건을 자동으로 생성해 구독자에게 이메일로 보내는 에이전트를 만든다.

핵심 성공 지표: 전송 성공률, 중복율(중복 기사 재전송 방지), LLM 응답 적합도(사용자 클릭률) 등.

승 — 자세한 워크플로우 설계 및 n8n 세팅

  1. 트리거: Cron Trigger — 매일 07:30 (n8n Cron 노드)
  2. 데이터 수집: OpenWeatherMap(API)로 기상 데이터 수집 → News API(또는 SERP API)로 최근 뉴스 검색
  3. 중복 필터: Google Sheets에서 최근 전송 URL 검사 → 신규 기사만 선택
  4. LLM 호출 (Gemini): n8n의 Google Gemini 통합 노드 사용 또는 HTTP Request 노드로 Gemini REST 호출. (예: generateContent). :contentReference[oaicite:5]{index=5}
  5. 함수 호출(Function Calling): 복잡한 작업(예: 기사 메타데이터 추출)을 Gemini의 함수 호출 기능으로 구조화된 JSON으로 받아 처리. (참고: Google의 function calling 가이드). :contentReference[oaicite:6]{index=6}
  6. 포맷·후처리: AI 응답을 마크다운/HTML로 포맷 → 사용자 이메일 템플릿 생성
  7. 전송 & 기록: Gmail 노드로 발송 → Google Sheets에 전송 로그(타임스탬프·기사 URL) 기록

n8n에서 Gemini 호출 예시 (HTTP Request 노드 설정)

아래 예시는 n8n의 HTTP Request 노드에서 직접 Gemini REST를 호출하는 최소 예시(cURL 기반 REST와 동일한 요청)를 보여줍니다. (문서의 REST 예시 참조) :contentReference[oaicite:7]{index=7}

POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent
Headers:
  Content-Type: application/json
  x-goog-api-key: {{GEMINI_API_KEY}}   // 또는 쿼리 ?key=API_KEY 로도 가능

Body (raw JSON):
{
  "contents": [
    {
      "parts": [
        { "text": "San Francisco의 오늘 날씨 한 줄 요약과 최근 24시간의 긍정적 뉴스 2건을 1문장 요약과 원문 링크 포함해 마크다운으로 작성해줘." }
      ]
    }
  ],
  "generation_config": {
    "max_output_tokens": 400
  }
}
      

팁: n8n의 Google Gemini 전용 노드를 사용하면 인증·키 관리를 더 편리하게 할 수 있습니다. n8n 공식 통합 문서를 참고하세요. :contentReference[oaicite:8]{index=8}

전 — 가드레일(안전)과 비용·성능 고려

  • 안전·콘텐츠 정책: Gemini의 사용 정책과 안전 설정(safetySettings)을 요청에 포함해 불허 콘텐츠 생성을 방지하세요. :contentReference[oaicite:9]{index=9}
  • 토큰·비용 최적화: 응답 길이 제한, thinking budget 조정(느린 'thinking' 기능 끄기)으로 비용·지연 최소화. :contentReference[oaicite:10]{index=10}
  • 재시도·Rate Limit: 외부 API 호출 실패 시 백오프(retry) 로직을 설계.
  • 보안: API 키는 n8n Credentials(환경 변수)로 저장하고, 로그에 민감정보가 남지 않도록 필터링.

결 — 배포·모니터링·학습 루프

배포 후에는 매일 실행 로그를 수집해(성공·실패·응답시간) 모니터링 대시보드를 운영하세요. 또한 Google Sheets에 '보낸 기사'를 저장해 중복을 방지하고, 주간 성능(열람·클릭률)을 보고해 프롬프트·필터·데이터 소스 개선에 반영합니다.

프롬프트(시스템/유저) & 프롬프트 엔지니어링 예시

System Prompt:
You are a concise morning newsletter assistant.
- Goal: Provide a one-line weather summary for {{city}} and 2 positive news items (headline + 1-sentence summary + source URL).
- Format: Markdown mini-email. Use neutral tone, avoid speculation.
- Constraint: Check 'sent_log' sheet; skip URLs already sent.

User Prompt:
"오늘 날짜 기준으로 {{city}}의 날씨 요약과 지난 24시간 내 긍정적 뉴스 2건을 마크다운으로 작성해줘."
      

프롬프트에 '체크리스트'나 '출력 JSON 스키마'를 명시하면 Function Calling으로 구조화된 응답(예: [{"title":"", "summary":"", "url":""}, ...])을 받을 수 있어 후처리가 쉬워집니다. :contentReference[oaicite:11]{index=11}

테스트 & 디버깅 체크리스트

  • ✅ 수동 실행으로 각 노드 출력(특히 Gemini 응답) 확인
  • ✅ 중복 필터(시트 조회) 작동 확인
  • ✅ 실패 시 Slack/메일 알림 수신 테스트
  • ✅ 비용: 하루/주 단위 요청량 기반 시뮬레이션

사례 연구 (Case Studies) — 구체 예시 2개 📚

사례 1: 콘텐츠 큐레이터 에이전트

목표: 지정 키워드 기반으로 유익한 블로그·뉴스를 매일 자동 큐레이션해 편집자에게 전달.

구현: n8n Cron → SERP API로 키워드 검색 → Gemini에 요약·카테고리 요청(Function Calling으로 JSON 반환) → Google Sheets에 저장 → 편집자에게 이메일.

성과: 편집자 조사시간 70% 감소, 콘텐츠 아이디어 발굴 가속화.

사례 2: 고객지원 AI 에이전트 (Inbound 자동화)

목표: 이메일로 들어온 FAQ성 문의를 분류하고, 자주 묻는 질문은 자동응답, 복잡한 케이스는 티켓 생성.

구현: Gmail 트리거 → Gemini로 분류(감정·우선순위) → 단순 문의는 템플릿 응답(자동 발송), 복잡한 케이스는 CRM에 티켓 생성 → 로그 기록.

성과: 1차 처리 자동화로 평균 응답시간 단축, 고객 만족도 개선.

운영 팁 요약

  • 작게 시작(한 가지 목적), 로그 기록을 필수로
  • Function Calling을 활용해 구조화된 응답을 받아 후처리 자동화
  • 비용-성능 밸런스: 모델·토큰 수 조절

핵심 요약 & 피드백 그래프 ✅

핵심 요약

  • Gemini는 함수 호출, 멀티모달, REST/SDK 모두 지원하는 강력한 LLM입니다. :contentReference[oaicite:12]{index=12}
  • n8n은 Gemini 통합 또는 HTTP Request로 연결해 에이전트를 시각적 워크플로우로 구성할 수 있습니다. :contentReference[oaicite:13]{index=13}
  • 작게 시작하고(핵심 목적 1개), 메모리/중복필터/가드레일을 설계하세요.

피드백 그래프 (초기 준비도)

Readiness 80%Prototype 60%Security 55%Monitoring 45%Cost Efficiency

Google apal(Gemini)로 AI 에이전트 만들기 — n8n 워크플로우 구현 가이드

```html Google apal(Gemini)로 AI 에이전트 만들기 — n8n 워크플로우 구현 가이드
실전 튜토리얼

Google apal(Gemini)로 AI 에이전트 만들기 — n8n 워크플로우 구현 가이드

작성자: 지식인 질문답변 생성기 • 카테고리: AI 자동화 • 퍼머링크: /google-apal-agent-workflow

1. 들어가며 — 무엇을 만들 것인가?

이 글은 Google의 Generative AI(Gemini/PaLM, 이하 'apal') API를 사용해 n8n 기반 AI 에이전트를 만드는 실전 워크플로우 가이드입니다. 목표는 인증 설정 → n8n 트리거 → apal 호출 → 응답 후처리 → 도구 연동 → 배포까지 초보자도 따라 할 수 있도록 단계별로 설명하는 것입니다.

핵심 사용 사례 예: 매일 아침 날씨 + 긍정 뉴스 요약 발송, 이메일 자동 분류 및 티켓 생성, 캘린더 자동 일정 등록 등.

2. 전체 워크플로우 개요

에이전트의 구성은 다음 4가지 핵심 요소로 정리됩니다.

구성요소역할n8n에서의 구현
Brain추론·생성 (apal / Gemini)HTTP Request 또는 n8n의 Gemini 통합 노드
Sensors입력 수집 (Webhook, Gmail, RSS)Webhook / Gmail / HTTP Request
Memory대화·이력 저장Google Sheets / PostgreSQL / Airtable
Tools행동 실행 (메일 전송, 캘린더)Gmail / Google Calendar / Slack 노드

3. 단계별 구현 가이드

Step 1. Google API 키(또는 서비스 계정) 발급

  1. Google Cloud Console 또는 AI Studio 접속 → 프로젝트 생성
  2. API 사용 설정: Generative Language API (또는 Gemini 관련 API) 활성화
  3. 인증 방식 선택:
    • 개발/테스트: API Key (간단하지만 권한 제어 제한)
    • 프로덕션: 서비스 계정(권장) — JSON 키 파일을 발급받아 사용

환경변수 예시: export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"

Step 2. n8n 기본 워크플로우 만들기 (구성 요소)

  1. Webhook Trigger: 외부 요청(또는 테스트 호출)으로 워크플로우 시작
  2. HTTP Request (apal 호출): Gemini/PaLM REST 엔드포인트에 POST
  3. Function / Set 노드: LLM 응답에서 필요한 텍스트 추출·정리
  4. 도구 노드: Gmail(발송), Google Sheets(로그/메모리), Calendar(일정 생성)
  5. Cron 노드 (선택): 스케줄러를 이용한 자율 실행 설정

apal(Gemini) 호출 — HTTP Request 노드 예시

{
  "method": "POST",
  "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=AIzaSyD-FAKEKEYEXAMPLE1234567",
  "headers": {
    "Content-Type": "application/json"
  },
  "body": {
    "contents": [
      {
        "parts": [
          {"text": "오늘의 샌프란시스코 날씨 한 줄 요약과 긍정 뉴스 2건을 마크다운 형식으로 작성해줘."}
        ]
      }
    ],
    "generation_config": {
      "max_output_tokens": 400
    }
  }
}

※ 실제 환경에서는 위 URL의 API Key를 환경변수로 관리하세요. 서비스계정 사용 시 OAuth/서비스 계정 토큰 방식으로 인증합니다.

Step 3. 응답 후처리 (Function 노드 예시)

// n8n Function node
return [{
  json: {
    reply: items[0].json.candidates?.[0]?.content?.parts?.[0]?.text || "No reply"
  }
}];

Step 4. 메모리(로그) 저장 — Google Sheets 예시

전송한 기사 URL, 전송일시, 사용자 ID 등을 Google Sheets에 기록해 중복 전송을 방지하고 분석에 활용합니다.

Step 5. 도구 연동 — Gmail 발송 예시

Function 노드에서 생성한 마크다운/HTML을 Gmail 노드의 본문으로 넣어 자동 발송합니다. 발송 성공 여부는 동일 시트에 기록하세요.

Step 6. 스케줄 및 자율성

n8n의 Cron 노드를 활용해 매일 정해진 시간에 워크플로우를 실행하면 사용자 입력 없이 자동으로 동작하는 에이전트가 됩니다.

4. 테스트 & 디버깅 체크리스트

  • Webhook을 직접 호출해 전체 플로우 수동 테스트
  • HTTP Request의 응답 구조(candidates → content → parts)를 콘솔/로그로 확인
  • 중복 필터(시트 조회)가 예상대로 동작하는지 점검
  • API Key 및 서비스 계정 권한(범위, IAM)이 올바른지 검증
  • 실패 시 재시도 로직과 알림(Slack/Gmail) 설정

5. 실전 활용 시나리오(예시)

사례 A — 매일 아침 뉴스·날씨 요약 발송

Flow: Cron → Weather API → News API → apal로 요약 → 중복 필터 → Gmail 발송 → Sheets 기록

사례 B — 이메일 분류 및 자동응답

Flow: Gmail Trigger → apal로 분류/요약 → 단순 문의 자동응답(Gmail) / 복잡 케이스는 티켓 생성 → Sheets 기록

6. 운영 팁 & 보안 고려사항

  • API 키 관리: 절대 코드나 공개 리포지토리에 키를 직접 넣지 마세요. n8n Credentials나 환경변수로 관리.
  • 비용 관리: 모델 선택, 토큰 제한, 응답 길이 조절로 비용을 최적화하세요.
  • 가드레일: system prompt에 제약을 명확히 넣어 불필요한 행동을 제한합니다.
  • 로그·모니터링: 실패율, 응답시간, 중복율을 모니터링해 프롬프트·필터를 조정하세요.

7. 요약 및 다음 단계

요약: Google apal(Gemini)을 n8n에 연결하면 코드 적은(또는 없는) 상태로도 강력한 에이전트를 설계·운영할 수 있습니다. 핵심은 작게 시작 → 로그 저장 → 가드레일 적용 → 점진적 확장입니다.

다음 글에서는 이 워크플로우를 실제로 import 가능한 n8n JSON(예: Webhook → Gemini → Function → Gmail → Sheets)을 제공하고, 서비스계정 기반 인증 예제를 상세히 다뤄드리겠습니다.

```

2025년 8월 16일 토요일

'Opal' AI 에이전트 매뉴얼의 모든것

'Opal' AI 에이전트 매뉴얼의 모든것 

오늘은 유튜브 영상의 내용을 바탕으로 'Opal' AI 에이전트의 상세한 사용 방법을 정리하여 매뉴얼 형태로 블로그글을 작성해 드리겠습니다.

Opal ai에이전트-킬러앱

'Opal' AI 에이전트 바로가기

이 매뉴얼은 유튜브 영상 (https://www.youtube.com/watch?v=GzGcQzMo_Rw)에 소개된 Google의 'Opal' AI 에이전트의 주요 기능과 사용법을 요약한 것입니다. 'Opal'은 구글의 새로운 바이브 코딩앱입니다. 복잡한 코딩 없이도 AI 에이전트를 시각화된 워크플로우로 쉽게 만들고 커스터마이징할 수 있는 도구입니다.


1단계: 시작하기 및 기본 구성 요소

  • 접근 방법: 현재는 미국 계정이 필요하며, VPN 서비스를 통해 접속해야 합니다. Google 계정으로 가입하면 사전 제작된 다양한 프리셋(예: 블로그 작성, 게임 웹페이지 생성, 유튜브 요약 등)을 사용할 수 있습니다.

  • 핵심 기능: 복잡한 코드가 아닌, 다이어그램 형태의 시각적 워크플로우를 통해 앱을 구성할 수 있습니다. 각 기능은 '모듈'로 불리며, 이를 연결하여 원하는 작업을 자동화합니다.

  • 비디오 마케터를 선택해보겠습니다.

  • 이앱의 구성은 다음과 같습니다.
    Opal의 장점은 이렇게 다이어그램으로 워크플로우를 시각화하고 있습니다.

2단계: 워크플로우 생성 및 커스터마이징

  • 모듈 연결: 점을 잡고 끌어서 모듈들을 연결하여 작업의 흐름(워크플로우)을 만듭니다. 예를 들어, '리서치' 모듈의 결과물을 '마케팅 문구 생성' 모듈로 전달하는 방식으로 연결할 수 있습니다.

    모듈별로 연결 앱서비스를 만듬
  • 모듈별 세부 설정: 각 모듈을 클릭하면 세부 설정 창이 나타납니다.

    • 모델 선택: 원하는 AI 모델(예: Gemini 2.5 Flash, Deep Research 등)을 선택하여 작업의 성능을 조정할 수 있습니다.

    • 프롬프트 커스터마이징: 각 모듈에 구체적인 지시사항을 담은 프롬프트를 입력하여 원하는 결과물이 나오도록 커스터마이징합니다. 예를 들어, "당신은 카피라이터다"와 같은 역할을 부여하거나, "월택남이 추천하는"과 같은 특정 문구를 포함시키도록 지시할 수 있습니다.
opal-실습
월텍남:이미지

3단계: 입력 및 출력 설정

  • 사용자 입력(User Input) 모듈: 앱의 시작점에서 사용자로부터 제품명, 이미지, 텍스트 등 다양한 정보를 입력받도록 설정할 수 있습니다. '골뱅이(@)'를 입력하면 사용 가능한 입력 옵션 목록이 나타납니다.

  • 출력(Output) 모듈: 워크플로우의 최종 결과물을 설정합니다. 이미지, 비디오, 텍스트(예: DOCS 파일) 등 다양한 형식으로 (선택하여) 출력할 수 있습니다.

4단계: 앱 실행 및 결과 확인

  • 프리뷰(Preview) 기능: '프리뷰' 버튼을 눌러 앱이 어떻게 작동하는지 미리 볼 수 있습니다. 각 모듈이 작동하는 과정을 시각적으로 확인할 수 있습니다.

  • 콘솔(Console) 확인: 앱을 실행하면 '콘솔' 창에서 각 단계가 어떻게 진행되었는지 상세한 로그를 확인할 수 있습니다. 어떤 데이터를 입력받아 어떤 결과물이 나왔는지 흐름을 파악할 수 있습니다.


'Opal ai agent'의 고급 기능

  • 리믹스(Remix): 이미 만들어진 프리셋을 가져와 사용자의 필요에 맞게 워크플로우를 수정하거나 새로운 기능을 추가할 수 있습니다.

  • 텍스트-투-앱(Text-to-App): 직접 워크플로우를 만들지 않아도, 원하는 앱의 기능과 흐름을 자세히 텍스트로 설명하면 'Opal'이 자동으로 복잡한 워크플로우를 생성해 줍니다. 예를 들어, "물건을 팔고 싶어. 자세한 시장 조사 계획 및 판매 전략을 딥 리서치로 만들고 결과물 Docs형식으로 출력해 줘"와 같이 입력하는 방식입니다. 즉, 프롬프트를 주면 결과를 만들어주는....미친 성능!!


문제점::

Gemini 모델을 기반으로 한다면, 환각 발생 수준도 기존 모델과 유사할 것 같기는 한데.. 원래라면 딥리서치 결과를 사람이 검토한 뒤 다음 단계(이미지·영상 생성)로 넘어가는 과정에서 잘못된 정보를 걸러낼 수 있었을텐데 이부분도 문제인 듯 합니다. 이번 방식은 그런 검증 절차가 없다보니 초기에는 작은 환각이었던 것이 최종 결과물에서는 큰 오류로 확대될 가능성도 있습니다.
환각hallucination이 생겨서 결과가 이상해지면 전체 시나리오를 다시 돌려야하고, 이때 token사용량이 어느정도까지 될지도 문제인듯합니다.

처음으로