CLOVA Studio GOV 에이전트는 특정 작업에 특화된 AI 어시스턴트입니다. 에이전트는 지식베이스 검색, 문서 처리, 질의응답 등 다양한 워크플로우를 자동화할 수 있습니다.
에이전트 작업 흐름
에이전트를 사용하는 전체 워크플로우는 다음과 같이 구성됩니다:
1. 에이전트 생성 (웹)
정보시스템 관리자 메뉴의 에이전트 관리에서 에이전트를 생성하고 구성합니다.
- 워크플로우 패턴 선택
- 지식 컬렉션 연결
- 프롬프트 및 출력 설정
2. 배포 (웹)
생성한 에이전트를 검토하고 배포 요청을 제출합니다.
관리자 승인 후 배포됩니다.
3. 에이전트 사용
배포된 에이전트는 두 가지 방법으로 사용할 수 있습니다:웹 인터페이스:
- “대화하기” 메뉴에서 에이전트 선택
- 웹 UI를 통해 대화형으로 사용
API:
- 이 문서에서 설명하는 API를 통해 프로그래밍 방식으로 호출
- 애플리케이션에 통합하여 자동화된 워크플로우 구현
중요: 에이전트 생성 및 설정은 웹 인터페이스에서만 가능합니다. API는 이미 생성된 에이전트를 실행하는 용도로만 사용됩니다.에이전트 생성 방법은 에이전트 생성하기 가이드를 참조하세요.
Agent ID 이해하기
Agent ID는 API를 통해 에이전트를 호출할 때 필수적으로 필요한 고유 식별자입니다.
Agent ID 확인 방법
에이전트 관리 메뉴 접속
정보시스템 관리자 메뉴에서 에이전트 관리를 클릭합니다.
Agent ID 확인
에이전트 목록에서 에이전트 ID 열을 확인합니다.
- 각 에이전트마다 고유한 ID가 할당됩니다
- ID 우측의 복사 아이콘을 클릭하여 복사할 수 있습니다
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"
}
파라미터
| 필드 | 타입 | 설명 |
|---|
jsonrpc | string | JSON-RPC 버전 (항상 “2.0”) |
method | string | message/send (일반) 또는 message/stream (스트리밍) |
params.message.role | string | 메시지 역할 (항상 “user”) |
params.message.messageId | string | 메시지 고유 식별자 (필수) |
params.message.parts | array | 메시지 내용 배열 |
params.metadata.chat_session_id | number | 채팅 세션 ID (필수) |
id | string | 요청 고유 식별자 |
채팅 세션은 에이전트와의 대화 컨텍스트를 유지하기 위해 필요합니다. 웹 인터페이스를 통해 세션이 자동으로 관리됩니다.
권한 및 접근 제어
에이전트 접근 권한은 사용자 역할에 따라 다릅니다:
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 | 서버 에러 | 에이전트 설정 및 지식베이스 확인 |
다음 단계
에이전트를 효과적으로 활용하려면 적절한 지식베이스 구성과 프롬프트 최적화가 중요합니다.