endueendue
← Use Cases
API 연동

에이전트 API 로 Tin 을 우리 서비스에 붙이기

스튜디오에서 API 키를 발급하면, 우리 서버·스크립트·자동화 도구가 HTTP 요청 하나로 에이전트에게 일을 맡길 수 있습니다. 키 발급부터 대화 이어가기까지 Tin 으로 따라가 봅니다.

Tin 은 흩어진 생각을 선명한 다음 단계로 정리해 주는 에이전트입니다. 보통은 endue 채팅창에서 Tin 과 이야기하지만, API 를 열어 두면 내가 만든 서비스 안에서도 같은 Tin 을 부를 수 있습니다. 메모 앱의 “계획으로 만들기” 버튼 뒤에서, 매일 아침 도는 스크립트 안에서, 설문이 접수될 때마다 움직이는 자동화 속에서요.

API 로 부른 Tin 은 채팅창의 Tin 과 같은 에이전트입니다. 지침, 스킬, 연결한 커넥터, 메모리를 그대로 쓰고, 사용량은 내 계정에 쌓입니다. 따로 서버를 띄우거나 모델을 연결할 필요가 없습니다.

어떻게 연결되나요

  1. 스튜디오에서 Tin 전용 API 키를 발급합니다.
  2. 우리 서버가 그 키를 실어 Tin 에게 요청을 보냅니다. 요청 본문은 “무엇을 해 달라” 는 문장 하나면 됩니다.
  3. Tin 이 답을 돌려줍니다. 주고받은 내용은 endue 의 대화 목록에도 남아서, 나중에 웹에서 그대로 확인할 수 있습니다.

이런 곳에 좋습니다

  • 내 앱 안의 기능으로. 사용자가 적은 메모를 Tin 에게 보내고, 돌아온 실행 계획을 우리 화면에 보여 줍니다. 사용자는 endue 를 몰라도 됩니다.
  • 정해진 시간에 도는 작업으로. 예약 작업(cron)이 어제 못 끝낸 일을 보내면, Tin 이 오늘 할 일 세 가지로 추려 줍니다. 결과를 사내 게시판이나 우리 DB 에 넣는 것까지 우리 코드가 맡습니다.
  • 노코드 자동화 도구에서. Zapier, Make, n8n 처럼 HTTP 요청을 보낼 수 있는 도구라면 코드 없이도 부를 수 있습니다.

결과를 endue 안에서만 받아 보면 충분하다면 루틴이 더 간단합니다. API 는 결과가 우리 시스템으로 들어와야 할 때 고르세요.

준비물

  • endue 계정과 에이전트 하나. 이 글에서는 Tin 을 씁니다.
  • 요청을 보낼 곳. 터미널, 우리 서비스의 서버, 또는 HTTP 요청을 보낼 수 있는 자동화 도구면 됩니다.
  • 키를 보관할 안전한 자리. 서버의 환경 변수나 시크릿 저장소를 권합니다.

1단계. 스튜디오에서 API 열기

Tin 을 열고 상단에서 Studio 로 전환하면 에이전트 구성 화면이 나옵니다. 왼쪽 “01 요청이 들어와요” 칸에 API 카드가 있습니다. 카드를 누르면 오른쪽에 API 패널이 열립니다.

Tin 의 스튜디오. 왼쪽 “요청이 들어와요” 칸에 API 카드가 있고, 오른쪽 API 패널에 호출 주소와 예시 요청이 보인다.

패널 맨 위의 POST 주소가 Tin 을 부르는 엔드포인트입니다. 아래쪽 curl 예시는 복사 버튼 한 번으로 가져갈 수 있고, Tin 의 에이전트 ID 가 이미 들어 있습니다.

2단계. Tin 전용 키 발급하기

키 발급을 누르고 두 가지를 정합니다.

  • 키 이름. 이 키를 어디에 쓰는지 적어 두세요. 예: “플래너 앱 서버”. 나중에 대화 기록에 이 이름이 표시되고, 키가 여러 개일 때 무엇을 폐기해야 할지 바로 알 수 있습니다.
  • 유효기간. 만료 없음, 30일, 90일, 365일 가운데 고릅니다. 처음 시험할 때는 짧게 두는 편이 안전합니다.

발급을 누르면 sk_ 로 시작하는 키가 딱 한 번 표시됩니다. 이 창을 닫으면 다시 볼 수 없으니 바로 복사해서 안전한 곳에 넣어 두세요. 잃어버렸다면 폐기하고 새로 발급하면 됩니다. 이때 패널 위쪽 예시 요청에도 방금 받은 키가 채워지므로, 그대로 복사해 바로 시험해 볼 수 있습니다.

왼쪽은 발급 양식으로, 키 이름에 “플래너 앱 서버”, 유효기간에 “90일 후 만료” 를 고른 상태. 오른쪽은 발급 직후로, 키가 한 번만 표시되고 전용 키 목록에 “플래너 앱 서버” 가 생겼다.

여기서 만든 키는 Tin 전용입니다. 이 키로는 내 다른 에이전트를 부를 수 없습니다. 모든 에이전트를 부를 수 있는 계정 전체 키는 설정 › 계정 › API 키에서 따로 발급하지만, 한 에이전트만 쓸 거라면 전용 키가 훨씬 안전합니다.

3단계. 첫 요청 보내기

터미널에서 바로 시험해 볼 수 있습니다. 키는 명령어에 직접 쓰지 말고 환경 변수에 넣어 두세요. AGENT_ID 자리에는 스튜디오에서 복사한 주소를 그대로 쓰면 됩니다.

export ENDUE_API_KEY="sk_..."   # 2단계에서 복사한 키

curl -X POST https://platform.endue.ai/api/public/v1/agents/AGENT_ID/invoke \
  -H "Authorization: Bearer $ENDUE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input": "이번 주 계획으로 바꿔줘: 우리 카페 소식지를 작게 시작하고 싶어. 이번 주에 쓸 수 있는 시간은 5시간 정도야."}'

Tin 이 답을 다 쓰면 이런 응답이 돌아옵니다.

{
  "success": true,
  "data": {
    "run_id": "...",
    "session_id": "cnv_...",
    "conversation_id": "cnv_...",
    "agent_id": "...",
    "status": "completed",
    "finish_reason": "final",
    "output_text": "주말을 쓰지 않고도 첫 호를 내보낼 수 있게 한 주를 짜 봤어요. ...",
    "usage": { "input_tokens": 1830, "output_tokens": 264, "total_tokens": 2094 }
  }
}

눈여겨볼 값은 세 개입니다.

  • output_text: Tin 의 답. 우리 화면에 보여 줄 내용입니다.
  • session_id: 이 대화의 번호. 다음 요청에 돌려보내면 대화가 이어집니다. conversation_id 에도 같은 값이 들어 있고, 스튜디오 안내문에 적힌 이름이 이쪽입니다.
  • status: completed 면 끝까지 답한 것입니다. incomplete 면 Tin 이 정해진 단계 안에 끝내지 못했거나 사람의 결정이 필요한 지점에서 멈춘 것이니, 요청을 더 구체적으로 다시 보내 보세요.

4단계. 대화 이어가기

사용자가 “수요일은 시간이 안 나” 라고 답했다면, 앞 응답의 session_id 를 실어 보냅니다. Tin 은 앞에서 짠 계획을 기억한 채로 고쳐 줍니다.

{
  "input": "수요일은 시간이 안 나. 목요일로 옮겨서 다시 짜 줘.",
  "session_id": "cnv_..."
}

session_id 를 빼면 새 대화가 시작됩니다. 사용자마다, 또는 메모마다 대화를 따로 두고 싶다면 우리 DB 에 session_id 를 함께 저장해 두면 됩니다.

5단계. 우리 서비스에 붙이기

예를 들어 메모 앱에 “계획으로 만들기” 버튼을 단다고 해 보겠습니다. 중요한 원칙은 하나입니다. Tin 을 부르는 코드는 서버에 둡니다. 브라우저나 모바일 앱에 키를 넣으면 누구나 꺼내 볼 수 있습니다. 화면은 우리 서버에 요청하고, 우리 서버가 Tin 을 부릅니다.

Node.js 서버라면 이 정도입니다.

// 서버 코드. 키는 환경 변수에서 읽습니다.
const TIN_URL = 'https://platform.endue.ai/api/public/v1/agents/AGENT_ID/invoke';

export async function askTin(input, sessionId) {
  const res = await fetch(TIN_URL, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.ENDUE_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(sessionId ? { input, session_id: sessionId } : { input }),
  });
  const body = await res.json();
  if (!res.ok) throw new Error(body.error?.message ?? `HTTP ${res.status}`);
  return { plan: body.data.output_text, sessionId: body.data.session_id };
}

매일 아침 도는 파이썬 스크립트라면 더 짧습니다.

import os
import requests

res = requests.post(
    "https://platform.endue.ai/api/public/v1/agents/AGENT_ID/invoke",
    headers={"Authorization": f"Bearer {os.environ['ENDUE_API_KEY']}"},
    json={"input": "어제 못 끝낸 일: 견적서 회신, 원두 발주, 블로그 초안. 오늘 할 일 세 가지로 정리해줘."},
    timeout=120,
)
res.raise_for_status()
print(res.json()["data"]["output_text"])

기본 호출은 Tin 이 답을 다 쓸 때까지 기다렸다가 한 번에 돌려줍니다. 길게 생각하는 요청이면 수십 초가 걸릴 수 있으니 타임아웃을 넉넉히 잡으세요. 채팅처럼 글자가 써지는 모습을 보여 주고 싶다면 요청에 "stream": true 를 넣습니다. 그러면 웹 채팅과 같은 SSE 로 run_created, delta(글자 조각), done 이벤트가 차례로 옵니다.

호출 기록은 endue 에 남습니다

API 로 주고받은 대화는 Tin 의 사이드바 API 묶음에 모입니다. 호출자의 요청은 “API 호출자” 로 표시되고, 제목 옆에는 어떤 키로 들어온 요청인지가 보입니다. 답이 이상했다면 여기서 Tin 이 무엇을 받고 어떻게 답했는지 그대로 확인할 수 있습니다.

Tin 의 API 대화. 사이드바 API 묶음에 세션 세 개가 있고, 본문에는 API 호출자의 요청과 Tin 의 주간 계획이 보인다. 제목 옆에 “플래너 앱 서버” 키 이름이 표시된다.

이 대화는 읽기 전용입니다. 이어서 말을 거는 것은 같은 session_id 를 실은 API 호출로만 할 수 있습니다.

스튜디오 구성 화면에서도 달라진 점이 보입니다. API 카드에 방금 만든 키가 활성 상태로 붙고, Tin 에게 이어지는 선이 생깁니다.

키 발급 뒤의 스튜디오 구성 화면. API 칸에 “플래너 앱 서버” 키가 활성 상태로 연결되어 있고, 오른쪽에는 Tin 이 쓰는 커넥터가 보인다.

API 로 부를 때 알아 둘 점

API 호출에는 화면 앞에 앉아 있는 사람이 없습니다. 그래서 endue 는 API 요청을 지켜보는 사람이 없는 실행으로 다룹니다.

  • 메일 발송이나 삭제처럼 밖으로 내보내거나 지우는 동작은 승인을 기다리지 않고 거절됩니다. 조회처럼 읽기만 하는 동작은 평소대로 합니다.
  • Tin 이 되물어야 하는 상황이 와도 답해 줄 사람이 없습니다. 요청에 필요한 정보(기한, 쓸 수 있는 시간, 원하는 형식)를 처음부터 담아 보내세요.

Tin 에게는 초안과 계획을 받아 오고, 실제로 보내거나 저장하는 일은 우리 코드가 하도록 나누면 가장 매끄럽습니다.

키를 안전하게 쓰는 법

  • 키는 서버에만. 브라우저 코드, 모바일 앱, git 저장소에 넣지 않습니다.
  • 쓰는 곳마다 키를 따로. “플래너 앱 서버”, “아침 요약 스크립트” 처럼 나눠 두면, 하나가 새어도 그 키만 폐기하면 됩니다.
  • 폐기는 바로. API 패널에서 폐기를 누르면 1분 안에 그 키로 들어오는 요청이 막힙니다.
  • 유효기간을 두세요. 만료가 가까워지거나 지난 키는 패널과 스튜디오 화면에 표시됩니다.

응답 코드가 알려 주는 것

  • 401: 키가 없거나 틀렸거나, 만료·폐기된 키입니다.
  • 403: 다른 에이전트 전용 키로 Tin 을 불렀습니다.
  • 404: 에이전트 ID 가 틀렸거나, 다른 에이전트의 session_id 를 보냈습니다.
  • 409: 같은 세션에서 앞 요청이 아직 실행 중입니다. 끝난 뒤 다시 보내세요.
  • 402: 요금제 사용 한도에 닿았습니다. 사용량 화면에서 남은 양을 확인하세요.

더 자세한 요청 필드와 제한은 에이전트 API 문서에 정리되어 있습니다.