개요

CLOVA Studio GOV 에이전트는 특정 작업에 특화된 AI 어시스턴트입니다. 에이전트는 지식베이스 검색, 문서 처리, 질의응답 등 다양한 워크플로우를 자동화할 수 있습니다.

에이전트 작업 흐름

에이전트를 사용하는 전체 워크플로우는 다음과 같이 구성됩니다:
1

1. 에이전트 생성 (웹)

정보시스템 관리자 메뉴의 에이전트 관리에서 에이전트를 생성하고 구성합니다.
  • 워크플로우 패턴 선택
  • 지식 컬렉션 연결
  • 프롬프트 및 출력 설정
2

2. 배포 (웹)

생성한 에이전트를 검토하고 배포 요청을 제출합니다. 관리자 승인 후 배포됩니다.
3

3. 에이전트 사용

배포된 에이전트는 두 가지 방법으로 사용할 수 있습니다:웹 인터페이스:
  • “대화하기” 메뉴에서 에이전트 선택
  • 웹 UI를 통해 대화형으로 사용
API:
  • 이 문서에서 설명하는 API를 통해 프로그래밍 방식으로 호출
  • 애플리케이션에 통합하여 자동화된 워크플로우 구현
중요: 에이전트 생성 및 설정은 웹 인터페이스에서만 가능합니다. API는 이미 생성된 에이전트를 실행하는 용도로만 사용됩니다.에이전트 생성 방법은 에이전트 생성하기 가이드를 참조하세요.

Agent ID 이해하기

Agent ID는 API를 통해 에이전트를 호출할 때 필수적으로 필요한 고유 식별자입니다. 에이전트 관리 화면 - Agent ID 확인

Agent ID 확인 방법

1

에이전트 관리 메뉴 접속

정보시스템 관리자 메뉴에서 에이전트 관리를 클릭합니다.
2

Agent ID 확인

에이전트 목록에서 에이전트 ID 열을 확인합니다.
  • 각 에이전트마다 고유한 ID가 할당됩니다
  • ID 우측의 복사 아이콘을 클릭하여 복사할 수 있습니다
3

API 호출 시 사용

복사한 Agent ID를 API 엔드포인트 URL에 포함하여 호출합니다.
Agent ID는 API 호출 시 필수입니다. ID가 없거나 잘못된 경우 404 오류가 발생합니다.

주요 기능

RAG 검색

지식베이스에서 관련 문서를 검색하여 정확한 답변 제공

워크플로우 자동화

다단계 작업을 자동으로 처리하는 커스텀 워크플로우

스트리밍 응답

실시간으로 응답을 스트리밍하여 빠른 사용자 경험 제공

컨텍스트 유지

대화 맥락을 유지하며 이전 대화 참조 가능

에이전트 실행 (A2A Protocol)

에이전트는 A2A (Agent-to-Agent) 프로토콜을 사용하여 실행됩니다.

엔드포인트

POST /api/v1/teams/{team_id}/agent/{agent_workflow_id}/a2a

요청 형식

A2A 프로토콜은 JSON-RPC 2.0 형식을 사용합니다:
{
  "jsonrpc": "2.0",
  "method": "message/send",  // 또는 "message/stream"
  "params": {
    "message": {
      "role": "user",
      "messageId": "msg-123456",
      "parts": [
        {
          "text": "사용자 질문"
        }
      ]
    },
    "metadata": {
      "chat_session_id": 123
    }
  },
  "id": "unique-request-id"
}

파라미터

필드타입설명
jsonrpcstringJSON-RPC 버전 (항상 “2.0”)
methodstringmessage/send (일반) 또는 message/stream (스트리밍)
params.message.rolestring메시지 역할 (항상 “user”)
params.message.messageIdstring메시지 고유 식별자 (필수)
params.message.partsarray메시지 내용 배열
params.metadata.chat_session_idnumber채팅 세션 ID (필수)
idstring요청 고유 식별자
채팅 세션은 에이전트와의 대화 컨텍스트를 유지하기 위해 필요합니다. 웹 인터페이스를 통해 세션이 자동으로 관리됩니다.

권한 및 접근 제어

에이전트 접근 권한은 사용자 역할에 따라 다릅니다:
  • User (일반 사용자)
  • Developer (개발자)
  • Admin (관리자)
배포된 에이전트만 실행 가능
  • ✅ 배포 완료된 에이전트 사용
  • ❌ 개발 중이거나 검토 대기 중인 에이전트는 접근 불가
에이전트 역할 및 배포 상태에 대한 자세한 내용은 권한 관리를 참조하세요.

Python 예제

import requests
import json

class ClovaAgent:
    def __init__(self, api_key, team_id, agent_id, session_id):
        self.api_key = api_key
        self.base_url = "https://api.clovastudio.go.kr"
        self.team_id = team_id
        self.agent_id = agent_id
        self.session_id = session_id
    
    def execute(self, user_message):
        """에이전트 실행 (비스트리밍)"""
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "jsonrpc": "2.0",
            "method": "message/send",
            "params": {
                "message": {
                    "role": "user",
                    "messageId": f"msg-{int(time.time())}",
                    "parts": [
                        {"text": user_message}
                    ]
                },
                "metadata": {
                    "chat_session_id": self.session_id
                }
            },
            "id": f"req-{int(time.time())}"
        }
        
        response = requests.post(
            f"{self.base_url}/api/v1/teams/{self.team_id}/agent/{self.agent_id}/a2a",
            headers=headers,
            json=data
        )
        
        if response.status_code == 200:
            result = response.json()
            return result['result']['message']['parts'][0]['text']
        else:
            raise Exception(f"Agent Error: {response.status_code} - {response.text}")

# 사용 예제
agent = ClovaAgent(
    api_key="YOUR_API_KEY",
    team_id=1,
    agent_id=5,
    session_id=123
)

response = agent.execute("대한민국의 주요 국정과제는 무엇인가요?")
print(response)

JavaScript/TypeScript 예제

interface A2ARequest {
  jsonrpc: "2.0";
  method: "message/send" | "message/stream";
  params: {
    message: {
      role: "user";
      messageId: string;
      parts: Array<{ text: string }>;
    };
    metadata: {
      chat_session_id: number;
    };
  };
  id: string;
}

class ClovaAgent {
  private apiKey: string;
  private baseUrl: string = "https://api.clovastudio.go.kr";
  private teamId: number;
  private agentId: number;
  private sessionId: number;

  constructor(apiKey: string, teamId: number, agentId: number, sessionId: number) {
    this.apiKey = apiKey;
    this.teamId = teamId;
    this.agentId = agentId;
    this.sessionId = sessionId;
  }

  async execute(userMessage: string): Promise<string> {
    const request: A2ARequest = {
      jsonrpc: "2.0",
      method: "message/send",
      params: {
        message: {
          role: "user",
          messageId: `msg-${Date.now()}`,
          parts: [{ text: userMessage }]
        },
        metadata: {
          chat_session_id: this.sessionId
        }
      },
      id: `req-${Date.now()}`
    };

    const response = await fetch(
      `${this.baseUrl}/api/v1/teams/${this.teamId}/agent/${this.agentId}/a2a`,
      {
        method: 'POST',
        headers: {
          'Authorization': `Bearer ${this.apiKey}`,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(request)
      }
    );

    if (response.ok) {
      const result = await response.json();
      return result.result.message.parts[0].text;
    } else {
      throw new Error(`Agent Error: ${response.status} - ${await response.text()}`);
    }
  }
}

// 사용 예제
const agent = new ClovaAgent("YOUR_API_KEY", 1, 5, 123);
const response = await agent.execute("대한민국의 주요 국정과제는 무엇인가요?");
console.log(response);

스트리밍 예제

실시간으로 응답을 받으려면 message/stream 메서드를 사용하세요:
import requests
import json

def execute_agent_stream(api_key, team_id, agent_id, session_id, user_message):
    """에이전트 스트리밍 실행"""
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    data = {
        "jsonrpc": "2.0",
        "method": "message/stream",  # 스트리밍 메서드
        "params": {
            "message": {
                "role": "user",
                "messageId": f"msg-{int(time.time())}",
                "parts": [
                    {"text": user_message}
                ]
            },
            "metadata": {
                "chat_session_id": session_id
            }
        },
        "id": f"req-stream-{int(time.time())}"
    }
    
    response = requests.post(
        f"https://api.clovastudio.go.kr/api/v1/teams/{team_id}/agent/{agent_id}/a2a",
        headers=headers,
        json=data,
        stream=True  # 스트리밍 활성화
    )
    
    full_response = ""
    
    for line in response.iter_lines():
        if line:
            line = line.decode('utf-8')
            if line.startswith('data: '):
                data_str = line[6:]
                if data_str == '[DONE]':
                    break
                try:
                    data = json.loads(data_str)
                    if 'result' in data and 'message' in data['result']:
                        parts = data['result']['message'].get('parts', [])
                        for part in parts:
                            if 'text' in part:
                                print(part['text'], end='', flush=True)
                                full_response += part['text']
                except json.JSONDecodeError:
                    continue
    
    print()  # 새 줄
    return full_response

# 사용 예제
response = execute_agent_stream(
    api_key="YOUR_API_KEY",
    team_id=1,
    agent_id=5,
    session_id=123,
    user_message="대한민국의 주요 국정과제는 무엇인가요?"
)

에러 처리

A2A 프로토콜은 JSON-RPC 에러 형식을 사용합니다:
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32600,
    "message": "Invalid Request",
    "data": {
      "detail": "Missing required field: chat_session_id"
    }
  },
  "id": "req-123"
}

주요 에러 코드

상태 코드설명해결 방법
400잘못된 요청 형식JSON-RPC 형식과 필수 필드 확인
403권한 없음에이전트가 배포되었는지 확인 (User 역할의 경우)
404에이전트를 찾을 수 없음team_id와 agent_id 확인
500서버 에러에이전트 설정 및 지식베이스 확인

다음 단계

에이전트를 효과적으로 활용하려면 적절한 지식베이스 구성과 프롬프트 최적화가 중요합니다.