<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>보안과 그 개발, 그 어딘가</title>
    <link>https://bob3rdnewbie.tistory.com/</link>
    <description>보안과 개발(프론트는 좀 약함, 미적 감각 부재 이슈)을 좋아하며 업으로 삼고 있습니다.</description>
    <language>ko</language>
    <pubDate>Sun, 2 Aug 2026 00:30:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>초보 &amp;amp; 뉴비</managingEditor>
    <image>
      <title>보안과 그 개발, 그 어딘가</title>
      <url>https://tistory1.daumcdn.net/tistory/1913153/attach/5832ae20de524fabb39a6045d26c3d87</url>
      <link>https://bob3rdnewbie.tistory.com</link>
    </image>
    <item>
      <title>[이더리움/Foundry] Permit ERC2612 서명값(ERC712) 가져오기</title>
      <link>https://bob3rdnewbie.tistory.com/379</link>
      <description>&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;(uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, digest);&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// Permit 내에 구현된 해시 (그대로 사용해야 함 )
bytes32 permitTypeHash = keccak256(&quot;Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)&quot;);


address spender = 0x;
uint256 value = 1; // 1 wei
uint256 nonce = contractInstance.nonces(owner); // 서명 재사용 방지, ERC20Permit을 상속하는 contractInstance 메소드
uint256 deadline = block.timestamp + 1 hours;

bytes32 digest = keccak256(
  abi.encodePacked(
    &quot;\x19\x01&quot;, // 고정
    contractInstance.DOMAIN_SEPARATOR(), // 서명 재사용 방지, ERC20Permit을 상속하는 contractInstance 메소드
    keccak256(abi.encode(permitTypeHash, owner, spender, value, nonce, deadline))
  )
);

(uint8 v, bytes32 r, bytes32 s) = vm.sign(digest);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Foundry 사용 시 사실상 PrivateKey를 알고 있기 때문에 ECDSA 서명을 만들 수 있음 =&amp;gt; &lt;code&gt;vm.sign()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;서명 함수 리턴 값인 v r s 를 가지고 ecrecover, ECDSA.recover, permit() 등에 넣어서 서명을 검증 할 수 있음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>블록체인</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/379</guid>
      <comments>https://bob3rdnewbie.tistory.com/379#entry379comment</comments>
      <pubDate>Sun, 26 Apr 2026 05:52:58 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능/Hermes] 헤르메스 슬랙 연동하기</title>
      <link>https://bob3rdnewbie.tistory.com/375</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;헤르메스 에이전트와 슬랙을 연동하는 방법을 알아보기 전에, 굳이 슬랙을 선택한 이유는 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hermes-agent.nousresearch.com/docs/user-guide/messaging/#platform-comparison&quot;&gt;메신저 공식 비교 테이블&lt;/a&gt;를(혹은 아래 사진 참고) 보면 모든 기능을 지원하는 메신저 중 쓸만한게(최소 내가 써본것들이) 슬랙(및 디스코드)였기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;1001&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpPEQ9/dJMcahKYOWn/tvITkIgDHnzM4aAkb5dz71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpPEQ9/dJMcahKYOWn/tvITkIgDHnzM4aAkb5dz71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpPEQ9/dJMcahKYOWn/tvITkIgDHnzM4aAkb5dz71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpPEQ9%2FdJMcahKYOWn%2FtvITkIgDHnzM4aAkb5dz71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;1001&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;1001&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hermes Agent Slack 연동 가이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;한 줄 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent는 Slack App의 &lt;code&gt;Socket Mode&lt;/code&gt;를 사용해서 Slack과 연결할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Slack 사용자
   &amp;darr;
Slack App / Bot
   &amp;darr;
Socket Mode WebSocket
   &amp;darr;
Hermes Messaging Gateway
   &amp;darr;
Hermes Agent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서 기준으로 Hermes Slack 연동은 &lt;code&gt;slack-bolt&lt;/code&gt; / &lt;code&gt;slack_sdk&lt;/code&gt; 기반 Socket Mode를 사용하고, 필요한 토큰은 Bot Token인 &lt;code&gt;xoxb-&lt;/code&gt;와 App-Level Token인 &lt;code&gt;xapp-&lt;/code&gt; 두 가지다.&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Slack 연동 방식&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Socket Mode란 무엇인가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack Bot을 외부 서비스와 연결하려면 일반적으로 Slack이 이벤트를 보낼 수 있는 공개 (Hook) URL이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Socket Mode를 사용하면 공개 URL이 필요 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Gateway가 Slack 쪽으로 WebSocket 연결을 열고, 그 연결을 통해 이벤트를 받는 구조다.&lt;/p&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;일반 이벤트 방식:
Slack &amp;rarr; 공개 HTTP URL &amp;rarr; 내 서버

Socket Mode:
내 Hermes Gateway &amp;rarr; Slack WebSocket 연결
Slack &amp;rarr; 열린 WebSocket으로 이벤트 전달&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식의 장점은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내 PC에서 바로 테스트할 수 있다.&lt;/li&gt;
&lt;li&gt;ngrok, ssh tunneling 같은 터널링 도구가 필요 없다.&lt;/li&gt;
&lt;li&gt;방화벽 뒤 서버에서도 사용할 수 있다. ( 기업 환경에서는 꽤나 편리함 )&lt;/li&gt;
&lt;li&gt;외부에 공개 엔드포인트를 열지 않아도 된다. ( 기업 환경에서는 꽤나 편리함 )&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필요한 토큰&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack 연동에는 토큰이 2개 필요하다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;토큰&lt;/th&gt;
&lt;th&gt;형식&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bot Token&lt;/td&gt;
&lt;td&gt;&lt;code&gt;xoxb-...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;봇이 메시지를 읽고 보내는 데 사용한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App-Level Token&lt;/td&gt;
&lt;td&gt;&lt;code&gt;xapp-...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Socket Mode WebSocket 연결에 사용한다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes에서는 이 토큰을 보통 다음 환경변수로 설정한다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;SLACK_BOT_TOKEN=xoxb-your-bot-token-here
SLACK_APP_TOKEN=xapp-your-app-token-here&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Slack App 생성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Slack App 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Slack API 페이지에서 새 앱을 만든다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;https://api.slack.com/apps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진행 순서는 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;Create an App&lt;/code&gt;을 클릭한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;From scratch&lt;/code&gt;를 선택한다.&lt;/li&gt;
&lt;li&gt;앱 이름을 입력한다.&lt;/li&gt;
&lt;li&gt;연결할 Slack workspace를 선택한다. ( 최소 1개의 워크스페이스가 미리 생성되어 있어야 한다 )&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Create App&lt;/code&gt;을 클릭한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 이름은 예를 들어 다음처럼 정하면 된다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Hermes Agent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 후에는 Slack App의 &lt;code&gt;Basic Information&lt;/code&gt; 페이지로 이동하게 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Bot Token Scopes 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack App 설정 화면에서 다음 메뉴로 이동한다.&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;Features &amp;rarr; OAuth &amp;amp; Permissions&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;Scopes(범위) &amp;rarr; Bot Token Scopes(봇 토큰 범위)&lt;/code&gt; 항목에 필요한 권한을 추가하면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 Scope 추가&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3MYm/dJMcaad1gZy/TfdgLkT996vzyr0igBjhWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3MYm/dJMcaad1gZy/TfdgLkT996vzyr0igBjhWK/img.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;686&quot; data-filename=&quot;스크린샷 2026-04-25 211535.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.4604%; margin-right: 10px;&quot; data-widthpercent=&quot;37.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3MYm/dJMcaad1gZy/TfdgLkT996vzyr0igBjhWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3MYm%2FdJMcaad1gZy%2FTfdgLkT996vzyr0igBjhWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBulrV/dJMcaad1gZx/kcWhSw9QjXhv9J9oP0JWH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBulrV/dJMcaad1gZx/kcWhSw9QjXhv9J9oP0JWH0/img.png&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;434&quot; data-filename=&quot;스크린샷 2026-04-25 211542.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 61.3768%;&quot; data-widthpercent=&quot;62.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBulrV/dJMcaad1gZx/kcWhSw9QjXhv9J9oP0JWH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBulrV%2FdJMcaad1gZx%2FkcWhSw9QjXhv9J9oP0JWH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;737&quot; height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Slack Bot에 필요한 주요 Bot Token Scope는 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;height: 265px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;Scope&lt;/th&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;chat:write&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;봇이 메시지를 보낼 수 있게 한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;app_mentions:read&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;채널에서 봇이 멘션된 것을 감지한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;channels:history&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;봇이 들어간 공개 채널의 메시지를 읽는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;channels:read&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;공개 채널 목록과 정보를 읽는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;groups:history&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;봇이 초대된 비공개 채널 메시지를 읽는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;im:history&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;DM 메시지 기록을 읽는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;im:read&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;DM 기본 정보를 읽는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;im:write&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;DM을 열고 관리한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;users:read&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;사용자 정보를 조회한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;files:read&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;첨부파일, 음성 파일, 오디오 파일을 읽는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;files:write&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;이미지, 오디오, 문서 파일을 업로드한다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비공개 채널 정보까지 포함하고 싶으면 다음 Scope도 추가한다.&lt;/p&gt;
&lt;table style=&quot;height: 45px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;Scope&lt;/th&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;code&gt;groups:read&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;비공개 채널 목록과 정보를 읽는다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자주 빠뜨리는 Scope&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널에서 봇이 응답하지 않는 가장 흔한 원인은 다음 Scope 누락이다.&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;channels:history
groups:history&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;channels:history&lt;/code&gt;가 없으면 공개 채널 메시지를 제대로 받지 못할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;groups:history&lt;/code&gt;가 없으면 비공개 채널 메시지를 제대로 받지 못할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DM만 동작하고 채널에서 동작하지 않는다면 이 Scope부터 확인하면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Socket Mode 활성화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Socket Mode 켜기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack App 설정에서 다음 메뉴로 이동한다.&lt;/p&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;Settings &amp;rarr; Socket Mode&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;Enable Socket Mode&lt;/code&gt;를 켠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Socket Mode를 켜면 App-Level Token 생성을 요구한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App-Level Token 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App-Level Token 생성 시 다음처럼 설정하면 된다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Token name: 원하는 값으로
Scope: connections:write&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 토큰은 &lt;code&gt;xapp-&lt;/code&gt;로 시작한다. ( 나중에 써야 하니 복사해두자. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 토큰이 Hermes의 &lt;code&gt;SLACK_APP_TOKEN&lt;/code&gt;이 된다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;SLACK_APP_TOKEN=xapp-your-app-token-here&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App-Level Token은 나중에 다음 메뉴에서도 확인하거나 재생성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;Settings &amp;rarr; Basic Information &amp;rarr; App-Level Tokens&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Event Subscriptions 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이벤트 구독 켜기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 중요한 단계이다, 봇이 읽을 수 있는 메시지의 종류가 여기에서 결정 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack App 설정에서 다음 메뉴로 이동한다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;Features &amp;rarr; Event Subscriptions&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;Enable Events&lt;/code&gt;를 켠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 &lt;code&gt;Subscribe to bot events&lt;/code&gt; 항목에 이벤트를 추가한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필요한 Bot Event&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Slack Bot에 필요한 이벤트는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;필수 여부&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;message.im&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;td&gt;봇이 DM을 받는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;message.channels&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;td&gt;봇이 들어간 공개 채널 메시지를 받는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;message.groups&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;권장&lt;/td&gt;
&lt;td&gt;봇이 초대된 비공개 채널 메시지를 받는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;app_mention&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;td&gt;채널에서 봇이 멘션된 것을 처리한다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트를 추가한 뒤에는 반드시 페이지 하단의 &lt;code&gt;Save Changes&lt;/code&gt;를 눌러야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가장 흔한 설정 실수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack Bot이 DM에서는 잘 동작하는데 채널에서 응답하지 않는다면 대부분 다음 둘 중 하나다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;message.channels 누락
message.groups 누락&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개 채널에서 응답하지 않으면 &lt;code&gt;message.channels&lt;/code&gt;를 확인하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비공개 채널에서 응답하지 않으면 &lt;code&gt;message.groups&lt;/code&gt;를 확인하면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Messages Tab 활성화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Home 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DM으로 Hermes Bot에게 메시지를 보내려면 Messages Tab을 켜야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack App 설정에서 다음 메뉴로 이동한다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;Features &amp;rarr; App Home&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;Show Tabs&lt;/code&gt; 섹션에서 다음을 설정한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;Messages Tab&lt;/code&gt;을 &lt;code&gt;ON&lt;/code&gt;으로 켠다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Allow users to send Slash commands and messages from the messages tab&lt;/code&gt;을 체크한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계를 하지 않으면 DM에서 다음과 같은 메시지를 볼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;Sending messages to this app has been turned off&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 Hermes 설정 문제가 아니라 Slack App 설정 문제라고 보면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Workspace에 App 설치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Install App 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack App 설정에서 다음 메뉴로 이동한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;Settings &amp;rarr; Install App&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다음 순서로 진행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;Install to {워크스페이스명}&lt;/code&gt;를 클릭한다.&lt;/li&gt;
&lt;li&gt;권한 목록을 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Allow&lt;/code&gt;를 클릭한다.&lt;/li&gt;
&lt;li&gt;설치 후 &lt;code&gt;Bot User OAuth Token&lt;/code&gt;을 복사한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bot User OAuth Token은 &lt;code&gt;xoxb-&lt;/code&gt;로 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값이 Hermes의 &lt;code&gt;SLACK_BOT_TOKEN&lt;/code&gt;이다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;SLACK_BOT_TOKEN=xoxb-your-bot-token-here&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Scope 변경 후 재설치 필요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack App의 Scope나 Event Subscription을 나중에 변경했다면 App을 workspace에 다시 설치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않으면 새 권한이 실제 봇에 적용되지 않을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 아래 중 하나의 행위라도 했으면 반드시 재설치해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bot Token Scope 추가&lt;/li&gt;
&lt;li&gt;Event Subscription 추가&lt;/li&gt;
&lt;li&gt;Socket Mode 관련 설정 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Allowlist용 Slack Member ID 찾기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Member ID가 필요한 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Gateway는 허용된 사용자만 메시지를 처리하도록 설정하는 것이 기본이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack에서는 사용자 이름이나 표시 이름이 아니라 &lt;code&gt;Member ID&lt;/code&gt;를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Member ID는 보통 다음처럼 생겼다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;U01ABC2DEF3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes 설정에서는 이 값을 &lt;code&gt;SLACK_ALLOWED_USERS&lt;/code&gt;에 넣는다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;SLACK_ALLOWED_USERS=U01ABC2DEF3&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Member ID 찾는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack에서 Member ID를 찾는 방법은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bknxL6/dJMb99TGV2q/AlS8cb87bDcRjEm7DzNro0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bknxL6/dJMb99TGV2q/AlS8cb87bDcRjEm7DzNro0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;554&quot; data-filename=&quot;blob&quot; width=&quot;323&quot; data-widthpercent=&quot;45.66&quot; style=&quot;width: 45.1299%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bknxL6/dJMb99TGV2q/AlS8cb87bDcRjEm7DzNro0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbknxL6%2FdJMb99TGV2q%2FAlS8cb87bDcRjEm7DzNro0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7wjz/dJMcabqtfzt/Ww3Ipfii1gs1NRYSz8Z6XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7wjz/dJMcabqtfzt/Ww3Ipfii1gs1NRYSz8Z6XK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;297&quot; data-filename=&quot;blob&quot; width=&quot;280&quot; data-widthpercent=&quot;54.34&quot; style=&quot;width: 53.7073%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7wjz/dJMcabqtfzt/Ww3Ipfii1gs1NRYSz8Z6XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7wjz%2FdJMcabqtfzt%2FWw3Ipfii1gs1NRYSz8Z6XK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Slack에서 사용자 이름이나 아바타를 클릭한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;View full profile&lt;/code&gt;을 클릭한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;⋮&lt;/code&gt; 버튼을 클릭한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Copy member ID&lt;/code&gt;를 선택한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소한 자신의 Member ID는 반드시 등록하는 게 좋다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hermes 환경변수 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.env 파일 수정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes 설정 파일은 기본적으로 다음 위치를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/.env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 Slack 설정을 추가하면 된다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# Required
SLACK_BOT_TOKEN=xoxb-your-bot-token-here
SLACK_APP_TOKEN=xapp-your-app-token-here
SLACK_ALLOWED_USERS=U01ABC2DEF3

# Optional
SLACK_HOME_CHANNEL=C01234567890
SLACK_HOME_CHANNEL_NAME=general&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 값의 의미는 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;환경변수&lt;/th&gt;
&lt;th&gt;필수 여부&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SLACK_BOT_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;td&gt;Slack Bot User OAuth Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SLACK_APP_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;td&gt;Socket Mode용 App-Level Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SLACK_ALLOWED_USERS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;필수 권장&lt;/td&gt;
&lt;td&gt;Hermes를 사용할 수 있는 Slack Member ID 목록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SLACK_HOME_CHANNEL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;선택&lt;/td&gt;
&lt;td&gt;cron, scheduled message를 보낼 기본 채널 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SLACK_HOME_CHANNEL_NAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;선택&lt;/td&gt;
&lt;td&gt;사람이 읽기 쉬운 기본 채널 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 사용자를 허용하려면 쉼표로 구분하면 된다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;SLACK_ALLOWED_USERS=U01ABC2DEF3,U04XYZ9AAAA&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Interactive Setup 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 &lt;code&gt;.env&lt;/code&gt;를 수정하지 않고 대화형 설정을 사용할 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;hermes gateway setup&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 후 Slack을 선택하고 토큰과 사용자 ID를 입력하면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Gateway 실행&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Foreground 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 테스트할 때는 foreground로 실행하는 게 좋다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;hermes gateway&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 터미널에 로그가 바로 나오기 때문에 문제를 확인하기 쉽다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;User Service로 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 개발 머신이나 일반 사용자 환경에서는 user service로 설치하면 된다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;hermes gateway install
hermes gateway start
hermes gateway status&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중지하려면 다음 명령을 사용한다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;hermes gateway stop&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Linux System Service로 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPS나 서버에서 부팅 시 자동 실행하고 싶다면 system service로 설치할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;sudo hermes gateway install --system
sudo hermes gateway start --system
sudo hermes gateway status --system&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 개발 머신에서는 user service가 더 적합하고, 서버에서는 system service가 적합하다고 보면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Bot을 채널에 초대&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;채널 초대&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway를 실행한 뒤에는 Hermes Bot을 사용할 Slack 채널에 초대해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널에서 다음 명령을 입력하면 된다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/invite @봇이름
/invite @Hermes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;봇은 자동으로 모든 채널에 들어가지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용할 채널마다 직접 초대해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비공개 채널 주의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비공개 채널에서 사용하려면 다음 조건이 필요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;groups:history&lt;/code&gt; Scope가 있어야 한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;message.groups&lt;/code&gt; Event Subscription이 있어야 한다.&lt;/li&gt;
&lt;li&gt;App을 재설치해야 한다.&lt;/li&gt;
&lt;li&gt;해당 비공개 채널에 봇을 초대해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 하나라도 빠지면 비공개 채널에서 응답하지 않을 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hermes Bot 응답 방식&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DM에서의 동작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DM에서는 봇이 모든 메시지에 응답한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 별도로 &lt;code&gt;@Hermes Agent&lt;/code&gt;를 멘션하지 않아도 된다.&lt;/p&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;사용자: 오늘 할 일 정리해줘.
Hermes: ...&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;채널에서의 동작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널에서는 기본적으로 &lt;code&gt;@mention&lt;/code&gt;이 필요하다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;@Hermes 이 에러 로그 원인 분석해줘.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널에서 Hermes는 보통 해당 메시지의 thread에 답변한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 다른 메시지랑 섞일 수 있는 채널에서 봇 응답이 메인 채널을 어지럽히지 않도록 하기 위한 구조라고 보면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Thread에서의 동작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 Hermes가 활성화된 thread 안에서는 이후 답글에 매번 멘션하지 않아도 대화를 이어갈 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;채널:
@Hermes 이 로그 분석해줘.

Thread:
Hermes: 원인은 kubelet 설정 문제로 보인다.

사용자:
해결 명령어만 정리해줘.

Hermes:
앞서 분석한 kubelet 문제 기준으로 명령어를 정리하면...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 채널에서 대화를 시작할 때는 멘션하고, thread 안에서는 자연스럽게 이어가면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qXSEO/dJMcah5hH74/aymol4RD2b3WfLqJUMC981/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qXSEO/dJMcah5hH74/aymol4RD2b3WfLqJUMC981/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qXSEO/dJMcah5hH74/aymol4RD2b3WfLqJUMC981/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqXSEO%2FdJMcah5hH74%2Faymol4RD2b3WfLqJUMC981%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;363&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;363&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Slack 동작 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Thread 응답 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack Bot의 thread 응답 방식은 &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;에서 조정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;platforms:
  slack:
    reply_to_mode: &quot;first&quot;
    extra:
      reply_in_thread: true
      reply_broadcast: false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 설정의 의미는 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;설정&lt;/th&gt;
&lt;th&gt;기본값&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;platforms.slack.reply_to_mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&quot;first&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;여러개의 메시지가 있을 때 thread 처리 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;platforms.slack.extra.reply_in_thread&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;채널 메시지에 thread로 답할지 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;platforms.slack.extra.reply_broadcast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;thread 답변을 메인 채널에도 보낼지 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;reply_to_mode&lt;/code&gt;는 다음 값 중 하나를 사용할 수 있다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;원본 메시지에 thread로 묶지 않는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;first&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;첫 번째 응답 조각만 원본 메시지에 thread로 묶는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;모든 응답 조각을 원본 메시지에 thread로 묶는다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자별 세션 분리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유 채널에서는 사용자별로 대화 세션을 분리하는 게 기본값이다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;group_sessions_per_user: true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값이 &lt;code&gt;true&lt;/code&gt;이면 같은 채널에서 여러 사람이 Hermes에게 말을 걸어도 각자의 대화 맥락이 분리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;#general 안에서

A 사용자 &amp;rarr; Hermes와 Kubernetes 문제 상담
B 사용자 &amp;rarr; Hermes와 블로그 글 작성 상담

두 대화의 컨텍스트는 서로 섞이지 않음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 협업 모드처럼 채널 전체가 하나의 대화 세션을 공유하게 하려면 다음처럼 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;group_sessions_per_user: false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이 경우에는 주의가 필요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 사용자의 대화 맥락이 섞일 수 있다.&lt;/li&gt;
&lt;li&gt;토큰 사용량이 늘어날 수 있다.&lt;/li&gt;
&lt;li&gt;한 사용자의 &lt;code&gt;/reset&lt;/code&gt;이 전체 채널 세션을 초기화할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멘션 트리거 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack 채널에서는 기본적으로 멘션이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시적으로 설정하려면 다음처럼 할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;slack:
  require_mention: true
  mention_patterns:
    - &quot;hey hermes&quot;
    - &quot;hermes,&quot;
  reply_prefix: &quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;mention_patterns&lt;/code&gt;를 사용하면 &lt;code&gt;@mention&lt;/code&gt; 외에도 특정 문구로 봇을 호출할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 다음 문구도 트리거로 만들 수 있다.&lt;/p&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;hey hermes
hermes,&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특정 채널에서 자유 응답 허용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack은 기본적으로 채널에서 &lt;code&gt;@mention&lt;/code&gt;이 필요하지만, 특정 채널은 멘션이 필요 없는 자유 응답 채로 설정할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수 방식은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;dns&quot;&gt;&lt;code&gt;SLACK_FREE_RESPONSE_CHANNELS=C01234567890,C09876543210&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &lt;code&gt;config.yaml&lt;/code&gt;에서 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;slack:
  free_response_channels:
    - C01234567890
    - C09876543210&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기능은 전용 봇 채널처럼 Hermes가 모든 메시지를 읽고 응답해도 되는 채널에서만 사용하는 게 좋다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Home Channel 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Home Channel 용도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;SLACK_HOME_CHANNEL&lt;/code&gt;은 Hermes가 예약 메시지, cron 결과, proactive notification을 보낼 기본 Slack 채널이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 다음과 같은 작업 결과를 받을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;매일 아침 서버 상태 점검 결과
예약된 리포트 생성 결과
백그라운드 작업 완료 알림&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;SLACK_HOME_CHANNEL=C01234567890
SLACK_HOME_CHANNEL_NAME=general&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Channel ID 찾는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack Channel ID는 다음 방법으로 찾을 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Slack에서 채널 이름을 우클릭한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;View channel details&lt;/code&gt;를 클릭한다.&lt;/li&gt;
&lt;li&gt;하단으로 스크롤한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Channel ID&lt;/code&gt;를 확인한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 &lt;code&gt;SLACK_HOME_CHANNEL&lt;/code&gt;에는 채널 이름이 아니라 채널 ID를 넣어야 한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Hermes Bot이 해당 채널에 초대되어 있어야 한다.&lt;/p&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;/invite @Hermes Agent&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;채널별 Prompt 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Per-Channel Prompt란 무엇인가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬랙 채널별로 임시 시스템 프롬프트를 지정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프롬프트는 매 응답마다 주입되지만 대화 기록에는 저장되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 설정을 바꾸면 즉시 반영되고, 대화 기록 자체에는 남지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;slack:
  channel_prompts:
    &quot;C01RESEARCH&quot;: |
      너는 연구원을 보조하는 역할이야. 학술적인 부분에 집중해.
    &quot;C02ENGINEERING&quot;: |
      코드 리뷰 모드. 엣지 케이스와 퍼포먼스 영향도 주의.&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;멀티 워크스페이스 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;여러 Slack Workspace 연결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes는 하나의 Gateway 인스턴스로 여러 Slack workspace에 연결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 Bot Token을 쉼표로 구분해서 넣으면 된다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;SLACK_BOT_TOKEN=xoxb-workspace1-token,xoxb-workspace2-token,xoxb-workspace3-token
SLACK_APP_TOKEN=xapp-your-app-token&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &lt;code&gt;config.yaml&lt;/code&gt;에 넣을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;platforms:
  slack:
    token: &quot;xoxb-workspace1-token,xoxb-workspace2-token&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OAuth Token File 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰 파일을 사용할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 위치는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/slack_tokens.json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;T01ABC2DEF3&quot;: {
    &quot;token&quot;: &quot;xoxb-workspace-token-here&quot;,
    &quot;team_name&quot;: &quot;My Workspace&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일의 토큰은 &lt;code&gt;SLACK_BOT_TOKEN&lt;/code&gt;으로 지정한 토큰과 병합된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복 토큰은 자동으로 deduplicate 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멀티 워크스페이스 동작 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작 방식은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;첫 번째 Bot Token이 primary token이 된다.&lt;/li&gt;
&lt;li&gt;각 token은 시작 시 &lt;code&gt;auth.test&lt;/code&gt;로 검증된다.&lt;/li&gt;
&lt;li&gt;Hermes는 &lt;code&gt;team_id&lt;/code&gt;별로 &lt;code&gt;WebClient&lt;/code&gt;와 &lt;code&gt;bot_user_id&lt;/code&gt;를 매핑한다.&lt;/li&gt;
&lt;li&gt;메시지가 들어오면 해당 workspace에 맞는 client로 응답한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 개인 사용에서는 멀티 워크스페이스가 필요하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 workspace와 개인 workspace를 하나의 Hermes Gateway에서 함께 관리하고 싶을 때 고려하면 된다.&lt;/p&gt;</description>
      <category>인공지능/Hermes</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/375</guid>
      <comments>https://bob3rdnewbie.tistory.com/375#entry375comment</comments>
      <pubDate>Sat, 25 Apr 2026 23:25:13 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능/Hermes] 헤르메스 메시징 게이트웨이 이해하기</title>
      <link>https://bob3rdnewbie.tistory.com/374</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hermes Messaging Gateway 정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;한 줄 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Messaging Gateway는 Telegram, Discord, Slack, WhatsApp 같은 외부 메시징 플랫폼에서 Hermes Agent와 대화할 수 있게 해주는 백그라운드 게이트웨이라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 터미널에서만 &lt;code&gt;hermes&lt;/code&gt;를 쓰는 것이 아니라, 메신저 앱에서도 Hermes Agent를 호출하고 작업을 시킬 수 있게 해주는 중간 서버 역할을 한다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;사용자 메시지
   &amp;darr;
Telegram / Discord / Slack / WhatsApp
   &amp;darr;
Hermes Messaging Gateway
   &amp;darr;
Hermes Agent
   &amp;darr;
응답 반환&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Messaging Gateway가 하는 일&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;여러 메시징 플랫폼 연결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Messaging Gateway는 여러 플랫폼을 하나의 프로세스에서 연결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 플랫폼은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;li&gt;Discord&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Signal&lt;/li&gt;
&lt;li&gt;SMS&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Home Assistant&lt;/li&gt;
&lt;li&gt;Mattermost&lt;/li&gt;
&lt;li&gt;Matrix&lt;/li&gt;
&lt;li&gt;DingTalk&lt;/li&gt;
&lt;li&gt;Feishu / Lark&lt;/li&gt;
&lt;li&gt;WeCom&lt;/li&gt;
&lt;li&gt;Weixin&lt;/li&gt;
&lt;li&gt;BlueBubbles&lt;/li&gt;
&lt;li&gt;QQ&lt;/li&gt;
&lt;li&gt;Open WebUI&lt;/li&gt;
&lt;li&gt;Webhooks&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 하나의 Hermes Agent를 여러 채널에서 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 이런 식이다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;Telegram에서는 개인 비서처럼 사용
Discord에서는 개발 서버 봇처럼 사용
Slack에서는 팀 작업 도우미처럼 사용
Email에서는 비동기 작업 처리용으로 사용
Home Assistant에서는 홈 자동화 제어용으로 사용&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;세션 관리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway는 플랫폼별, 채팅별 세션을 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 Telegram에서 나눈 대화와 Discord에서 나눈 대화는 서로 다른 세션으로 관리될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조 덕분에 각 채팅방마다 대화 맥락을 따로 유지할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Telegram DM 세션
Discord 채널 세션
Slack 채널 A 세션
Slack 채널 B 세션&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은 메시지를 보낼 때마다 이어지고, 특정 조건이 되면 초기화될 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cron 작업 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway는 단순 메시지 중계만 하는 것이 아니라 cron scheduler도 함께 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 기준으로 Gateway는 60초마다 due job이 있는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 예약 작업이나 반복 작업을 Hermes Agent와 연결해서 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 다음과 같은 작업이 가능하다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;매일 아침 서버 상태 점검
매시간 특정 서비스 health check
정해진 시간에 요약 리포트 생성
주기적으로 파일 정리&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;음성 메시지 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway는 플랫폼에 따라 음성 관련 기능도 처리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 범위는 플랫폼마다 다르지만, 기본적으로 다음과 같은 기능을 기대할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;음성 메시지 transcription&lt;/li&gt;
&lt;li&gt;TTS 음성 응답&lt;/li&gt;
&lt;li&gt;Discord voice-channel 대화&lt;/li&gt;
&lt;li&gt;메시징 플랫폼에서 음성 답변 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 모든 플랫폼이 동일한 음성 기능을 지원하는 것은 아니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전체 아키텍처&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 흐름&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Messaging Gateway의 기본 흐름은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;Platform Adapter
   &amp;darr;
Per-chat Session Store
   &amp;darr;
AIAgent
   &amp;darr;
Platform Adapter
   &amp;darr;
사용자에게 응답&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 플랫폼에는 adapter가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Telegram에는 Telegram adapter, Discord에는 Discord adapter, Slack에는 Slack adapter가 있다고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Adapter는 외부 플랫폼에서 들어온 메시지를 받아 Hermes Agent가 이해할 수 있는 형태로 넘기고, Hermes Agent의 응답을 다시 해당 플랫폼으로 돌려보낸다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;플랫폼 Adapter&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Platform Adapter는 각 메시징 서비스와 직접 통신하는 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메시지 수신&lt;/li&gt;
&lt;li&gt;사용자 인증 확인&lt;/li&gt;
&lt;li&gt;첨부파일 처리&lt;/li&gt;
&lt;li&gt;이미지 처리&lt;/li&gt;
&lt;li&gt;음성 메시지 처리&lt;/li&gt;
&lt;li&gt;typing indicator 표시&lt;/li&gt;
&lt;li&gt;streaming 응답 업데이트&lt;/li&gt;
&lt;li&gt;thread 처리&lt;/li&gt;
&lt;li&gt;reaction 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 기능은 플랫폼마다 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Discord와 Slack은 thread, reaction, typing, streaming 같은 기능을 폭넓게 지원하지만, SMS는 기능이 제한적이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Session Store&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Session Store는 채팅별 대화 상태를 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 사용자가 이전에 어떤 질문을 했고, Hermes가 어떤 답을 했는지 기억하는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션이 유지되면 다음과 같은 대화가 가능하다.&lt;/p&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;사용자: 이 서버 로그 분석해줘.
Hermes: 이 로그에서는 kubelet 문제가 보인다.

사용자: 그럼 해결 명령어만 정리해줘.
Hermes: 앞서 분석한 kubelet 문제 기준으로 해결 명령어를 정리하면...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 세션이 초기화되면 이전 대화 맥락 없이 새 대화로 시작한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;AIAgent 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway가 메시지를 받으면 최종적으로 Hermes의 AIAgent로 전달된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AIAgent는 다음을 수행할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 질의응답&lt;/li&gt;
&lt;li&gt;코드 분석&lt;/li&gt;
&lt;li&gt;터미널 명령 실행&lt;/li&gt;
&lt;li&gt;파일 작업&lt;/li&gt;
&lt;li&gt;웹 검색&lt;/li&gt;
&lt;li&gt;MCP 도구 호출&lt;/li&gt;
&lt;li&gt;스킬 실행&lt;/li&gt;
&lt;li&gt;백그라운드 작업 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 메시징 플랫폼에서도 Hermes의 도구 기능을 사용할 수 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 보안 설정을 반드시 신경 써야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Session Persistence&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway 세션은 메시지 사이에서 유지된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 한 번 질문하고 끝나는 구조가 아니라, 같은 채팅방에서는 이전 대화 맥락을 이어서 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 흐름이 가능하다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;사용자: 이 Docker Compose 파일 분석해줘.
Hermes: redis, api, db 서비스로 구성되어 있다.

사용자: 여기서 db 볼륨만 분리하려면 어떻게 해?
Hermes: 앞서 본 compose 구조 기준으로 db service의 volumes를 이렇게 바꾸면 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 맥락 유지는 메시징 환경에서 매우 중요하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reset Policy&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은 설정된 정책에 따라 초기화될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표 정책은 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;정책&lt;/th&gt;
&lt;th&gt;기본값&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily&lt;/td&gt;
&lt;td&gt;오전 4시&lt;/td&gt;
&lt;td&gt;매일 특정 시간에 세션 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle&lt;/td&gt;
&lt;td&gt;1440분&lt;/td&gt;
&lt;td&gt;일정 시간 동안 대화가 없으면 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;조합&lt;/td&gt;
&lt;td&gt;둘 중 먼저 발생하는 조건으로 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플랫폼별로 reset 정책을 다르게 줄 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 파일은 다음 위치를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/gateway.json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;reset_by_platform&quot;: {
    &quot;telegram&quot;: { &quot;mode&quot;: &quot;idle&quot;, &quot;idle_minutes&quot;: 240 },
    &quot;discord&quot;: { &quot;mode&quot;: &quot;idle&quot;, &quot;idle_minutes&quot;: 60 }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 Telegram은 4시간 idle 후 초기화되고, Discord는 1시간 idle 후 초기화된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;보안 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 보안 모델&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Messaging Gateway는 기본적으로 allowlist에 없는 사용자를 거부한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기본값은 매우 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent는 터미널 실행, 파일 접근, 도구 호출 같은 강력한 기능을 가질 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 아무나 봇에게 DM을 보내서 내 서버 명령을 실행하게 만들면 안 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Allowlist 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플랫폼별로 허용할 사용자를 지정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;TELEGRAM_ALLOWED_USERS=123456789,987654321
DISCORD_ALLOWED_USERS=123456789012345678
SIGNAL_ALLOWED_USERS=+155****4567,+155****6543
SMS_ALLOWED_USERS=+155****4567,+155****6543
EMAIL_ALLOWED_USERS=trusted@example.com,colleague@work.com
MATTERMOST_ALLOWED_USERS=3uo8dkh1p7g1mfk49ear5fzs5c
MATRIX_ALLOWED_USERS=@alice:matrix.org
DINGTALK_ALLOWED_USERS=user-id-1
FEISHU_ALLOWED_USERS=ou_xxxxxxxx,ou_yyyyyyyy
WECOM_ALLOWED_USERS=user-id-1,user-id-2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통 allowlist를 사용할 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;GATEWAY_ALLOWED_USERS=123456789,987654321&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Allow All 주의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 사용자를 허용하는 설정도 있다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;GATEWAY_ALLOW_ALL_USERS=true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 설정은 터미널 접근 권한이 있는 봇에서는 권장하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 서버, 개인 PC, 운영 서버에 연결된 Hermes라면 반드시 allowlist를 사용하는 게 좋다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Tool Progress Notification&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;도구 실행 상태 표시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes가 작업 중 어떤 도구를 실행하는지 메시징 플랫폼에 표시할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정은 다음 파일에서 한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;display:
  tool_progress: all
  tool_progress_command: false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;tool_progress&lt;/code&gt;는 다음 값을 가질 수 있다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;도구 진행 상황을 표시하지 않는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;new&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;새 도구 실행만 표시한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;도구 실행 상황을 표시한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;verbose&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;더 자세히 표시한다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Hermes가 작업하면서 다음과 같은 상태 메시지를 보낼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;`ls -la`...
web_search...
web_extract...
execute_code...&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제 켜면 좋은가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tool Progress Notification은 다음 상황에서 유용하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hermes가 멈춘 것처럼 보이는 문제를 줄이고 싶을 때&lt;/li&gt;
&lt;li&gt;장시간 작업 중 어떤 명령을 실행하는지 보고 싶을 때&lt;/li&gt;
&lt;li&gt;터미널 명령 실행 여부를 확인하고 싶을 때&lt;/li&gt;
&lt;li&gt;팀 채널에서 Agent 작업 과정을 투명하게 보여주고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 메시지가 너무 많이 오는 것이 싫다면 &lt;code&gt;off&lt;/code&gt; 또는 &lt;code&gt;new&lt;/code&gt;로 줄이면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Background Sessions&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Messaging Gateway에서는 &lt;code&gt;/background&lt;/code&gt; 명령으로 별도 백그라운드 세션을 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;/background Check all servers in the cluster and report any that are down&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령을 보내면 Hermes는 별도 Agent instance를 만들어 작업을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 메인 채팅을 계속 사용할 수 있고, 작업이 끝나면 같은 채팅방으로 결과가 돌아온다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동작 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Background session은 다음 특징을 가진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별도 세션으로 실행된다.&lt;/li&gt;
&lt;li&gt;현재 채팅 맥락을 자동으로 공유하지 않는다.&lt;/li&gt;
&lt;li&gt;prompt에 적은 내용만 전달된다.&lt;/li&gt;
&lt;li&gt;현재 Gateway 설정의 model, provider, toolset, reasoning 설정을 상속한다.&lt;/li&gt;
&lt;li&gt;메인 채팅은 계속 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;작업 완료 시 같은 채팅방에 결과가 전달된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 독립적인 작업 큐처럼 사용할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 상태 점검을 백그라운드로 실행할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/background 모든 서비스에 대해 헬스체크를 하고 다운 상태가 있으면 알려줘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 빌드 작업을 맡길 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/background staing 환경 빌드하고 배포해&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조사 작업도 가능하다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/background 경쟁사의 제품에 대해 분석을 하고 테이블(표)로 요약해줘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 정리 작업도 시킬 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/background ~/Downloads 폴더에 있는 사진을 날짜순으로 정리해줘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Background Process Notification&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 작업 중 장기 실행 프로세스의 상태 알림을 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;display:
  background_process_notifications: all&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 가능한 값은 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;실행 중 출력과 최종 완료 메시지를 모두 받는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;result&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;최종 완료 메시지만 받는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;실패했을 때만 최종 메시지를 받는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;프로세스 watcher 메시지를 받지 않는다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수로도 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;HERMES_BACKGROUND_NOTIFICATIONS=result&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메시징 플랫폼별 기능 차이&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기능 비교 관점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 메시징 플랫폼이 같은 기능을 지원하는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교할 때는 다음 기능을 보면 된다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Voice&lt;/td&gt;
&lt;td&gt;TTS 응답 또는 음성 메시지 transcription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images&lt;/td&gt;
&lt;td&gt;이미지 송수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Files&lt;/td&gt;
&lt;td&gt;파일 첨부 송수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Threads&lt;/td&gt;
&lt;td&gt;thread 기반 대화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reactions&lt;/td&gt;
&lt;td&gt;emoji reaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typing&lt;/td&gt;
&lt;td&gt;처리 중 typing indicator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Streaming&lt;/td&gt;
&lt;td&gt;응답을 점진적으로 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Telegram, Discord, Slack은 비교적 많은 기능을 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SMS는 기능이 매우 제한적이다. ( 문자로 쓸일이 있을까... )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Email은 이미지, 파일, thread에는 강점이 있지만 typing이나 streaming 같은 실시간 기능은 기대하기 어렵다. ( 마찬가지로 이메일로 쓸일이 있을까... )&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;플랫폼 선택 기준&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인용으로는 Telegram이 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 채널에서는 Discord나 Slack이 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화와 시스템 연동은 Webhooks나 Home Assistant가 적합하다. =&amp;gt; 단순 작업이면 오픈클로가 훨씬 가볍다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이메일 기반 비동기 작업은 Email integration을 고려할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;목적&lt;/th&gt;
&lt;th&gt;추천 플랫폼&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;개인 비서처럼 사용&lt;/td&gt;
&lt;td&gt;Telegram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개발 커뮤니티 또는 팀 서버&lt;/td&gt;
&lt;td&gt;Discord&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;업무 채널 연동&lt;/td&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모바일 메신저 중심&lt;/td&gt;
&lt;td&gt;WhatsApp, Signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;서버 자동화&lt;/td&gt;
&lt;td&gt;Webhooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;홈 자동화&lt;/td&gt;
&lt;td&gt;Home Assistant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비동기 업무 처리&lt;/td&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자체 UI 연동&lt;/td&gt;
&lt;td&gt;Open WebUI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;운영 시 주의할 점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;allowlist는 필수로 보는 게 좋다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway는 기본적으로 allowlist에 없는 사용자를 거부한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기본값을 유지하는 게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Hermes가 다음 권한을 가진다면 더더욱 allowlist가 필요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;터미널 실행&lt;/li&gt;
&lt;li&gt;파일 수정&lt;/li&gt;
&lt;li&gt;서버 접속&lt;/li&gt;
&lt;li&gt;API 호출&lt;/li&gt;
&lt;li&gt;배포 명령 실행&lt;/li&gt;
&lt;li&gt;Home Assistant 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;GATEWAY_ALLOW_ALL_USERS=true&lt;/code&gt;는 테스트 환경이 아니라면 피하는 게 좋다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;user service와 system service를 동시에 쓰지 않는 게 좋다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux에서는 user service와 system service를 둘 다 설치할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 둘 다 설치하면 start, stop, status 대상이 모호해질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서에서도 두 service unit을 동시에 유지하는 것을 피하라고 안내한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 머신은 user service를 쓰고, 서버는 system service를 쓰는 식으로 하나만 선택하면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;background 작업은 현재 대화 맥락을 자동 공유하지 않는다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;/background&lt;/code&gt;는 독립 세션으로 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 현재 대화에서만 알고 있는 정보를 바탕으로 백그라운드 작업을 시키면 원하는 결과가 나오지 않을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나쁜 예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;/background 아까 말한 서버들 점검해줘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 좋은 예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;/background Check these servers: node01, node02, node03. Verify SSH, disk usage, kubelet status, and containerd status. Report failures only.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;background prompt는 독립적으로 이해할 수 있게 구체적으로 작성하면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추천 설정 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인 개발자용 보안 중심 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 개발자가 Telegram으로만 사용한다면 allowlist를 명확히 지정하는 게 좋다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN=your-token
TELEGRAM_ALLOWED_USERS=123456789&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway는 user service로 실행하면 된다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;hermes gateway install
hermes gateway start
hermes gateway status&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 확인은 다음처럼 한다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;journalctl --user -u hermes-gateway -f&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서버용 system service 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPS나 홈서버에서 계속 실행하려면 system service를 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;sudo hermes gateway install --system
sudo hermes gateway start --system
sudo hermes gateway status --system&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그는 다음 명령으로 확인한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;journalctl -u hermes-gateway -f&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서는 반드시 allowlist를 설정하는 게 좋다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;GATEWAY_ALLOWED_USERS=123456789&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;tool progress 표시 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes가 어떤 작업을 하는지 보고 싶으면 다음 설정을 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;display:
  tool_progress: all
  tool_progress_command: false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 시끄럽다면 다음처럼 줄일 수 있다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;display:
  tool_progress: new&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아예 끄려면 다음처럼 하면 된다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;display:
  tool_progress: off&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;background notification 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 작업 알림을 최종 결과만 받고 싶다면 다음처럼 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;display:
  background_process_notifications: result&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수로는 다음과 같이 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;HERMES_BACKGROUND_NOTIFICATIONS=result&lt;/code&gt;&lt;/pre&gt;</description>
      <category>인공지능/Hermes</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/374</guid>
      <comments>https://bob3rdnewbie.tistory.com/374#entry374comment</comments>
      <pubDate>Sat, 25 Apr 2026 19:56:24 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능/Hermes] 헤르메스 메모리 시스템 이해하기</title>
      <link>https://bob3rdnewbie.tistory.com/373</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;헤르메스 에이전트 메모리 시스템 정리&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;한 줄 요약&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Hermes Agent의 메모리는&lt;span&gt;&amp;nbsp;&lt;/span&gt;항상 필요한 핵심 사실은 Markdown 파일에 저장하고, 과거 대화는 SQLite 검색으로 찾고, 더 깊은 장기 기억은 외부 Provider로 확장하며, 반복 작업은 Skill로 절차화하는 다층 메모리 구조라고 보면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent의 메모리 시스템은 크게 보면 다음 계층으로 나눌 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내장 영구 메모리&lt;/li&gt;
&lt;li&gt;세션 검색 메모리&lt;/li&gt;
&lt;li&gt;외부 메모리 Provider&lt;/li&gt;
&lt;li&gt;스킬 기반 절차적 메모리&lt;/li&gt;
&lt;li&gt;사용자 모델링 메모리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 단순히 &lt;code&gt;기억 파일 하나&lt;/code&gt;를 두는 구조가 아니라, 짧고 중요한 사실은 항상 프롬프트에 넣고, 과거 대화는 검색으로 가져오고, 더 깊은 장기 기억은 외부 메모리 Provider로 확장하는 방식이라고 보면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내장 영구 메모리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MEMORY.md&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;MEMORY.md&lt;/code&gt;는 에이전트가 기억해야 하는 개인 노트에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 위치는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;~/.hermes/memories/MEMORY.md&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 이런 정보를 저장한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 개발 환경&lt;/li&gt;
&lt;li&gt;프로젝트 정보&lt;/li&gt;
&lt;li&gt;자주 쓰는 명령어&lt;/li&gt;
&lt;li&gt;특정 서버나 도구의 특이사항&lt;/li&gt;
&lt;li&gt;에이전트가 작업하면서 학습한 사실&lt;/li&gt;
&lt;li&gt;나중에도 반복적으로 도움이 될 운영 지식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 이런 내용이 들어갈 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;User runs macOS with zsh and Homebrew. Main editor is VS Code.
Project ~/code/api uses Go 1.22, sqlc, chi router. Run tests with make test.
Staging server requires SSH port 2222 instead of 22.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 메모리는 에이전트의 &lt;code&gt;개인 작업 노트&lt;/code&gt;라고 보면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;USER.md&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;USER.md&lt;/code&gt;는 사용자 프로필에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 위치는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;~/.hermes/memories/USER.md&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 이런 정보를 저장한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 선호&lt;/li&gt;
&lt;li&gt;응답 스타일&lt;/li&gt;
&lt;li&gt;커뮤니케이션 방식&lt;/li&gt;
&lt;li&gt;장기적인 목표&lt;/li&gt;
&lt;li&gt;반복적으로 나타나는 기대사항&lt;/li&gt;
&lt;li&gt;사용자가 원하는 작업 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 이런 내용이 들어갈 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;User prefers concise technical answers with concrete commands.
User likes explanations structured as problem, cause, fix, and verification.
User works mostly on infrastructure, blockchain, and backend systems.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 &lt;code&gt;MEMORY.md&lt;/code&gt;가 작업 환경과 지식 중심이라면, &lt;code&gt;USER.md&lt;/code&gt;는 사용자 자체에 대한 이해를 저장하는 공간이라고 보면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프롬프트 주입 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;MEMORY.md&lt;/code&gt;와 &lt;code&gt;USER.md&lt;/code&gt;는 세션 시작 시 시스템 프롬프트에 삽입된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 특징은 &lt;code&gt;frozen snapshot&lt;/code&gt; 방식이라는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 세션 시작 시점의 메모리 내용이 프롬프트에 들어가고, 세션 중간에 메모리를 수정하더라도 현재 프롬프트에는 바로 반영되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 디스크에는 즉시 저장되고, 다음 세션부터 새 메모리 내용이 반영된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하는 이유는 프롬프트 캐시 효율과 세션 안정성을 유지하기 위해서라고 보면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션 검색 메모리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;session_search&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent는 모든 과거 대화를 무조건 &lt;code&gt;MEMORY.md&lt;/code&gt;에 넣지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 과거 세션 전체를 SQLite에 저장하고, 필요할 때 &lt;code&gt;session_search&lt;/code&gt; 도구로 검색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 위치는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;~/.hermes/state.db&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 방식은 SQLite FTS5 기반이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 과거 CLI 대화나 메신저 대화가 세션 단위로 저장되고, 나중에 에이전트가 다음과 같은 질문을 받으면 검색해서 찾아올 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;지난주에 내가 말한 Kubernetes 문제 기억나?
전에 설정했던 서버 IP 뭐였지?
저번에 분석한 설치 스크립트 다시 찾아줘.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Persistent Memory와 Session Search 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; / &lt;code&gt;USER.md&lt;/code&gt;와 &lt;code&gt;session_search&lt;/code&gt;는 목적이 다르다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;Persistent Memory&lt;/th&gt;
&lt;th&gt;Session Search&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;저장 대상&lt;/td&gt;
&lt;td&gt;핵심 사실&lt;/td&gt;
&lt;td&gt;모든 과거 세션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저장 위치&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.hermes/memories/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.hermes/state.db&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;검색 방식&lt;/td&gt;
&lt;td&gt;프롬프트에 항상 주입&lt;/td&gt;
&lt;td&gt;필요할 때 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;용량&lt;/td&gt;
&lt;td&gt;제한 있음&lt;/td&gt;
&lt;td&gt;사실상 세션 누적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;속도&lt;/td&gt;
&lt;td&gt;즉시 사용 가능&lt;/td&gt;
&lt;td&gt;검색과 요약 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;용도&lt;/td&gt;
&lt;td&gt;항상 알아야 하는 정보&lt;/td&gt;
&lt;td&gt;과거 대화 회상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;MEMORY.md&lt;/code&gt;, &lt;code&gt;USER.md&lt;/code&gt;는 항상 기억해야 하는 핵심 메모리다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session_search&lt;/code&gt;는 과거 대화 전체를 뒤지는 검색 메모리다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;외부 메모리 Provider&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent는 기본 메모리 외에 외부 메모리 Provider를 붙일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 Provider는 &lt;code&gt;MEMORY.md&lt;/code&gt;와 &lt;code&gt;USER.md&lt;/code&gt;를 대체하는 것이 아니라 추가로 붙는 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 기본 메모리는 항상 유지되고, 그 위에 외부 장기 기억 시스템을 하나 더 연결하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 제약은 한 번에 하나의 외부 Provider만 활성화할 수 있다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정은 다음처럼 할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;hermes memory setup
hermes memory status
hermes memory off&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &lt;code&gt;config.yaml&lt;/code&gt;에서 직접 지정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;memory:
  provider: honcho&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 가능한 Provider는 다음 8개다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Honcho&lt;/li&gt;
&lt;li&gt;OpenViking&lt;/li&gt;
&lt;li&gt;Mem0&lt;/li&gt;
&lt;li&gt;Hindsight&lt;/li&gt;
&lt;li&gt;Holographic&lt;/li&gt;
&lt;li&gt;RetainDB&lt;/li&gt;
&lt;li&gt;ByteRover&lt;/li&gt;
&lt;li&gt;Supermemory&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Honcho&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Honcho는 사용자 모델링에 강한 메모리 Provider다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 사용자가 말한 내용을 저장하는 수준이 아니라, 대화를 분석해서 사용자의 성향, 목표, 선호, 커뮤니케이션 패턴을 추론한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 기능은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cross-session user modeling&lt;/li&gt;
&lt;li&gt;dialectic reasoning&lt;/li&gt;
&lt;li&gt;session-scoped context injection&lt;/li&gt;
&lt;li&gt;semantic search&lt;/li&gt;
&lt;li&gt;persistent conclusions&lt;/li&gt;
&lt;li&gt;peer 기반 사용자/AI 모델 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Honcho는 이런 경우에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자를 장기적으로 이해하는 에이전트를 만들고 싶을 때&lt;/li&gt;
&lt;li&gt;여러 프로필 또는 여러 에이전트가 같은 사용자와 상호작용할 때&lt;/li&gt;
&lt;li&gt;단순 기억보다 사용자 성향 추론이 중요할 때&lt;/li&gt;
&lt;li&gt;AI가 사용자의 작업 방식과 목표를 점점 더 잘 파악하게 만들고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenViking&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenViking은 ByteDance 계열 Volcengine의 context database를 기반으로 한 self-hosted 메모리 Provider다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;filesystem-style knowledge hierarchy&lt;/li&gt;
&lt;li&gt;tiered retrieval&lt;/li&gt;
&lt;li&gt;automatic memory extraction&lt;/li&gt;
&lt;li&gt;&lt;code&gt;viking://&lt;/code&gt; URI 기반 지식 탐색&lt;/li&gt;
&lt;li&gt;self-hosted 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenViking은 기억을 계층형 지식 저장소처럼 다루는 방식에 가깝다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenViking은 이런 경우에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라우드 메모리 서비스 대신 직접 호스팅하고 싶을 때&lt;/li&gt;
&lt;li&gt;지식을 폴더나 파일 시스템처럼 계층적으로 탐색하고 싶을 때&lt;/li&gt;
&lt;li&gt;프로젝트 지식 베이스를 에이전트와 연결하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Mem0&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mem0는 서버 측 LLM 기반 fact extraction을 제공하는 메모리 Provider다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 사실 추출&lt;/li&gt;
&lt;li&gt;semantic search&lt;/li&gt;
&lt;li&gt;reranking&lt;/li&gt;
&lt;li&gt;automatic deduplication&lt;/li&gt;
&lt;li&gt;cloud 기반 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 에이전트가 대화를 일일이 정리하지 않아도 Mem0 쪽에서 기억할 만한 사실을 추출하고 관리하는 방식이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mem0는 이런 경우에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 관리를 최대한 자동화하고 싶을 때&lt;/li&gt;
&lt;li&gt;cloud 기반 장기 기억을 빠르게 붙이고 싶을 때&lt;/li&gt;
&lt;li&gt;fact extraction과 deduplication을 직접 구현하고 싶지 않을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hindsight&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hindsight는 knowledge graph 기반 장기 메모리 Provider다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;knowledge graph&lt;/li&gt;
&lt;li&gt;entity resolution&lt;/li&gt;
&lt;li&gt;multi-strategy retrieval&lt;/li&gt;
&lt;li&gt;cross-memory synthesis&lt;/li&gt;
&lt;li&gt;full conversation turn retention&lt;/li&gt;
&lt;li&gt;session-level document tracking&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 검색보다 엔티티 관계와 기억 간 연결을 중시하는 구조라고 보면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hindsight는 이런 경우에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔티티 관계를 기반으로 기억을 검색하고 싶을 때&lt;/li&gt;
&lt;li&gt;여러 기억을 종합해서 결론을 내리는 기능이 필요할 때&lt;/li&gt;
&lt;li&gt;프로젝트, 사람, 문서, 사건 사이의 관계가 중요한 경우&lt;/li&gt;
&lt;li&gt;cloud 또는 local PostgreSQL 기반 메모리를 쓰고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Holographic&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Holographic은 로컬 SQLite 기반 fact store다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;local SQLite 저장&lt;/li&gt;
&lt;li&gt;FTS5 full-text search&lt;/li&gt;
&lt;li&gt;trust scoring&lt;/li&gt;
&lt;li&gt;HRR 기반 compositional query&lt;/li&gt;
&lt;li&gt;conflicting fact detection&lt;/li&gt;
&lt;li&gt;외부 서비스 의존성 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 장점은 로컬에서만 동작할 수 있다는 점이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Holographic은 이런 경우에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 클라우드 없이 로컬 메모리만 쓰고 싶을 때&lt;/li&gt;
&lt;li&gt;SQLite 기반으로 단순하게 관리하고 싶을 때&lt;/li&gt;
&lt;li&gt;fact 단위 저장, 검색, 신뢰도 점수 관리가 필요할 때&lt;/li&gt;
&lt;li&gt;conflicting fact를 탐지하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RetainDB&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RetainDB는 cloud memory API 기반 Provider다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Vector search&lt;/li&gt;
&lt;li&gt;BM25&lt;/li&gt;
&lt;li&gt;reranking&lt;/li&gt;
&lt;li&gt;hybrid search&lt;/li&gt;
&lt;li&gt;7 memory types&lt;/li&gt;
&lt;li&gt;delta compression&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 품질과 memory type 분류를 중시하는 클라우드 기반 메모리라고 보면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RetainDB는 이런 경우에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀 단위로 RetainDB 인프라를 이미 쓰고 있을 때&lt;/li&gt;
&lt;li&gt;vector search와 BM25를 함께 쓰는 hybrid search가 필요할 때&lt;/li&gt;
&lt;li&gt;memory type 기반 정리가 필요한 경우&lt;/li&gt;
&lt;li&gt;클라우드 API 기반 메모리를 선호할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ByteRover&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ByteRover는 &lt;code&gt;brv&lt;/code&gt; CLI 기반의 local-first 메모리 Provider다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hierarchical knowledge tree&lt;/li&gt;
&lt;li&gt;fuzzy text search&lt;/li&gt;
&lt;li&gt;LLM-driven search&lt;/li&gt;
&lt;li&gt;local-first storage&lt;/li&gt;
&lt;li&gt;optional cloud sync&lt;/li&gt;
&lt;li&gt;pre-compression extraction&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 context compression 전에 중요한 내용을 먼저 추출해서 저장하는 기능이 특징이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ByteRover는 이런 경우에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자 친화적인 CLI 기반 메모리를 원할 때&lt;/li&gt;
&lt;li&gt;로컬 우선 저장 방식을 선호할 때&lt;/li&gt;
&lt;li&gt;지식을 knowledge tree 형태로 관리하고 싶을 때&lt;/li&gt;
&lt;li&gt;필요하면 cloud sync도 붙이고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Supermemory&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supermemory는 semantic long-term memory Provider다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;semantic recall&lt;/li&gt;
&lt;li&gt;profile recall&lt;/li&gt;
&lt;li&gt;semantic search&lt;/li&gt;
&lt;li&gt;explicit memory tools&lt;/li&gt;
&lt;li&gt;session-end conversation ingest&lt;/li&gt;
&lt;li&gt;graph-level knowledge building&lt;/li&gt;
&lt;li&gt;context fencing&lt;/li&gt;
&lt;li&gt;multi-container support&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;context fencing&lt;/code&gt;은 회수된 메모리가 다시 저장되어 메모리 오염이 반복되는 문제를 줄이기 위한 장치라고 보면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supermemory는 이런 경우에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;semantic search 중심의 장기 메모리가 필요할 때&lt;/li&gt;
&lt;li&gt;사용자 프로필과 최근 맥락을 함께 쓰고 싶을 때&lt;/li&gt;
&lt;li&gt;세션 종료 시 대화 전체를 그래프 형태로 흡수하고 싶을 때&lt;/li&gt;
&lt;li&gt;프로젝트별 container를 나눠서 메모리를 관리하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메모리 저장 위치 정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 파일 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent의 기본 메모리 관련 파일은 대략 다음 구조로 볼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;~/.hermes/
├── memories/
│   ├── MEMORY.md
│   └── USER.md
├── state.db
├── skills/
└── config.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 파일의 역할은 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;위치&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.hermes/memories/MEMORY.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;에이전트 개인 노트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.hermes/memories/USER.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;사용자 프로필&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.hermes/state.db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;세션 저장 및 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;메모리 설정 및 Provider 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 메모리 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;에서 기본 메모리 설정은 다음과 같이 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;memory:
  memory_enabled: true
  user_profile_enabled: true
  memory_char_limit: 2200
  user_char_limit: 1375&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 항목의 의미는 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;설정&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;memory_enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; 사용 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;user_profile_enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;USER.md&lt;/code&gt; 사용 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;memory_char_limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;에이전트 메모리 글자 수 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;user_char_limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;사용자 프로필 글자 수 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;외부 Provider 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 Provider를 쓰려면 다음처럼 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;memory:
  provider: honcho&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 Provider를 쓰려면 값만 바꾸면 된다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;memory:
  provider: openviking&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 가능한 값은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;honcho
openviking
mem0
hindsight
holographic
retaindb
byterover
supermemory&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;각 메모리 시스템 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비교표&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;메모리 시스템&lt;/th&gt;
&lt;th&gt;저장 방식&lt;/th&gt;
&lt;th&gt;주요 용도&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MEMORY.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;로컬 Markdown 파일&lt;/td&gt;
&lt;td&gt;에이전트 개인 노트&lt;/td&gt;
&lt;td&gt;항상 프롬프트에 주입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USER.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;로컬 Markdown 파일&lt;/td&gt;
&lt;td&gt;사용자 프로필&lt;/td&gt;
&lt;td&gt;선호, 스타일, 기대사항 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;session_search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SQLite + FTS5&lt;/td&gt;
&lt;td&gt;과거 대화 검색&lt;/td&gt;
&lt;td&gt;필요할 때 검색 후 요약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Honcho&lt;/td&gt;
&lt;td&gt;Cloud 또는 self-hosted&lt;/td&gt;
&lt;td&gt;사용자 모델링&lt;/td&gt;
&lt;td&gt;dialectic reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenViking&lt;/td&gt;
&lt;td&gt;self-hosted&lt;/td&gt;
&lt;td&gt;계층형 지식 관리&lt;/td&gt;
&lt;td&gt;tiered retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mem0&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;자동 사실 추출&lt;/td&gt;
&lt;td&gt;deduplication, reranking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hindsight&lt;/td&gt;
&lt;td&gt;Cloud 또는 local&lt;/td&gt;
&lt;td&gt;지식 그래프&lt;/td&gt;
&lt;td&gt;entity relationship, reflect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holographic&lt;/td&gt;
&lt;td&gt;Local SQLite&lt;/td&gt;
&lt;td&gt;로컬 fact store&lt;/td&gt;
&lt;td&gt;trust scoring, conflict detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RetainDB&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;hybrid search&lt;/td&gt;
&lt;td&gt;Vector + BM25 + reranking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ByteRover&lt;/td&gt;
&lt;td&gt;Local 또는 Cloud&lt;/td&gt;
&lt;td&gt;knowledge tree&lt;/td&gt;
&lt;td&gt;CLI 기반 local-first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supermemory&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;semantic long-term memory&lt;/td&gt;
&lt;td&gt;context fencing, graph ingest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skills&lt;/td&gt;
&lt;td&gt;Markdown/스킬 파일&lt;/td&gt;
&lt;td&gt;절차적 메모리&lt;/td&gt;
&lt;td&gt;작업 루틴 재사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 사용 관점 정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인 개발자 기준 추천&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 개발자가 로컬에서 Hermes Agent를 써보는 정도라면 처음에는 기본 메모리만으로도 충분하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 다음 조합이면 된다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;MEMORY.md
USER.md
session_search
skills&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 조합만으로도 다음이 가능하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내 개발 환경 기억&lt;/li&gt;
&lt;li&gt;프로젝트별 규칙 기억&lt;/li&gt;
&lt;li&gt;내 답변 스타일 기억&lt;/li&gt;
&lt;li&gt;과거 대화 검색&lt;/li&gt;
&lt;li&gt;반복 작업 스킬화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로컬 우선 메모리가 필요할 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 클라우드 없이 로컬에서만 쓰고 싶으면 다음 Provider가 적합하다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Holographic
ByteRover
OpenViking&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 느낌은 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;추천 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Holographic&lt;/td&gt;
&lt;td&gt;SQLite 기반 로컬 fact store가 필요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ByteRover&lt;/td&gt;
&lt;td&gt;CLI 기반 knowledge tree를 원할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenViking&lt;/td&gt;
&lt;td&gt;self-hosted 지식 계층과 tiered retrieval이 필요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자 모델링이 중요할 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 성향과 장기적 선호를 깊게 모델링하고 싶으면 Honcho가 가장 특화되어 있다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Honcho&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Honcho는 단순 기억보다 &lt;code&gt;사용자를 이해하는 모델&lt;/code&gt;에 가깝다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;검색 품질이 중요할 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 품질이나 semantic search가 중요하면 다음 Provider를 고려할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;Mem0
RetainDB
Supermemory
Hindsight&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 방향은 조금 다르다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;강점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mem0&lt;/td&gt;
&lt;td&gt;자동 fact extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RetainDB&lt;/td&gt;
&lt;td&gt;hybrid search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supermemory&lt;/td&gt;
&lt;td&gt;semantic recall + graph ingest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hindsight&lt;/td&gt;
&lt;td&gt;knowledge graph + synthesis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent의 메모리 시스템은 다음처럼 정리할 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;MEMORY.md&lt;/code&gt;는 에이전트가 기억해야 할 작업 지식이다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USER.md&lt;/code&gt;는 사용자 선호와 프로필을 저장하는 공간이다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session_search&lt;/code&gt;는 과거 대화 전체를 SQLite FTS5로 검색하는 기능이다.&lt;/li&gt;
&lt;li&gt;외부 Provider는 기본 메모리를 대체하지 않고 확장한다.&lt;/li&gt;
&lt;li&gt;외부 Provider는 한 번에 하나만 활성화할 수 있다.&lt;/li&gt;
&lt;li&gt;사용 가능한 외부 Provider는 Honcho, OpenViking, Mem0, Hindsight, Holographic, RetainDB, ByteRover, Supermemory다.&lt;/li&gt;
&lt;li&gt;Skills System은 작업 절차를 저장하고 재사용하는 절차적 메모리로 볼 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;</description>
      <category>인공지능/Hermes</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/373</guid>
      <comments>https://bob3rdnewbie.tistory.com/373#entry373comment</comments>
      <pubDate>Sat, 25 Apr 2026 19:32:08 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능/Hermes] 헤르메스 리눅스에 설치하기</title>
      <link>https://bob3rdnewbie.tistory.com/372</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 명령어&lt;/h2&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRXmw4/dJMcafTVCrr/n3VTPK0niCtn43XzxwQNT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRXmw4/dJMcafTVCrr/n3VTPK0niCtn43XzxwQNT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRXmw4/dJMcafTVCrr/n3VTPK0niCtn43XzxwQNT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRXmw4%2FdJMcafTVCrr%2Fn3VTPK0niCtn43XzxwQNT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1215&quot; height=&quot;865&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설치 명령어 실행 시 위 사진처럼 자동으로 필요한 과정들을 진행하며 설치한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;1282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clOJWp/dJMb990u2jj/n9QESoUAHqteQtkYzJNuk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clOJWp/dJMb990u2jj/n9QESoUAHqteQtkYzJNuk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clOJWp/dJMb990u2jj/n9QESoUAHqteQtkYzJNuk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclOJWp%2FdJMb990u2jj%2Fn9QESoUAHqteQtkYzJNuk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1169&quot; height=&quot;1282&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;1282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고로 설치하고자 하는 서버에 오픈클로가 설치되었을 경우 위 사진의 상단부 노란색처럼 오픈클로 데이터를 가져올지 물어본다.&lt;/li&gt;
&lt;li&gt;초록색으로 표시 된 &quot;Wolud import&quot;가 가져올 수 있는거고 &quot;Would skip&quot;이 가져오지 못하는 데이터인데 생각보다 가져오지 못하는 데이터가 많은 것을 볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lhna4/dJMcabKMXON/emrY4lTr97zPO9HQDOKRAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lhna4/dJMcabKMXON/emrY4lTr97zPO9HQDOKRAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lhna4/dJMcabKMXON/emrY4lTr97zPO9HQDOKRAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLhna4%2FdJMcabKMXON%2FemrY4lTr97zPO9HQDOKRAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;961&quot; height=&quot;289&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오픈클로 데이터 마이그레이션에 대해 워닝 메시지인데 그대로 진행하면 기존에 연동 된 메신저가 제대로 동작하지 않을 수 있기에 나는 &quot;N&quot;을 선택 후 세팅은 직접 하기로 했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5pizK/dJMcaakLyhI/0ey4ioFuw9P3LKP5AC2Em1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5pizK/dJMcaakLyhI/0ey4ioFuw9P3LKP5AC2Em1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5pizK/dJMcaakLyhI/0ey4ioFuw9P3LKP5AC2Em1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5pizK%2FdJMcaakLyhI%2F0ey4ioFuw9P3LKP5AC2Em1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;109&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;헤르메스 셋업 여부를 결정하는데 간단하게 사용하기 위해 &quot;Quick setup&quot;으로 진행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zIA8k/dJMcaakLyhJ/nLzfvRrnDNt4XKfZDIQKo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zIA8k/dJMcaakLyhJ/nLzfvRrnDNt4XKfZDIQKo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zIA8k/dJMcaakLyhJ/nLzfvRrnDNt4XKfZDIQKo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzIA8k%2FdJMcaakLyhJ%2FnLzfvRrnDNt4XKfZDIQKo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;586&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로바이더 선택화면인데 원하는 프로바이더를 선택하면 된다. 나는 OpenAI (ChatGPT)를 메인으로 사용하고 있어서 코덱스를 선택했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2001&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l55AM/dJMcajooTKE/5k04Xr78f3wOQYnjWeIUf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l55AM/dJMcajooTKE/5k04Xr78f3wOQYnjWeIUf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l55AM/dJMcajooTKE/5k04Xr78f3wOQYnjWeIUf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl55AM%2FdJMcajooTKE%2F5k04Xr78f3wOQYnjWeIUf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2001&quot; height=&quot;786&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2001&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가이드되로 인증하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;1172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yLU6E/dJMb990u2ji/0B6dMOGCOR2iOYSO99vGA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yLU6E/dJMb990u2ji/0B6dMOGCOR2iOYSO99vGA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yLU6E/dJMb990u2ji/0B6dMOGCOR2iOYSO99vGA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyLU6E%2FdJMb990u2ji%2F0B6dMOGCOR2iOYSO99vGA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1224&quot; height=&quot;1172&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;1172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설치 과정에서 선택 여부에 따라 현재 사용 가능한 것과 가능하지 않은 것들을 보여주는데 추후 필요에 따라 부분 설정하면 모든 툴을 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;제일 하단에 노란색 글씨로 헤르메스 채팅을 런칭할지 물어보는데 Y를 누른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;1043&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZQVJI/dJMcafTVCrs/YbHSZj9A1T2NjmfNASKxd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZQVJI/dJMcafTVCrs/YbHSZj9A1T2NjmfNASKxd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZQVJI/dJMcafTVCrs/YbHSZj9A1T2NjmfNASKxd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZQVJI%2FdJMcafTVCrs%2FYbHSZj9A1T2NjmfNASKxd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1327&quot; height=&quot;1043&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;1043&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그러면 위 사진처럼 헤르메스 채팅이 런칭된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;이하 내용 스크립트 상세 분석&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스크립트 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스크립트는 &lt;code&gt;Hermes Agent&lt;/code&gt;를 사용자의 홈 디렉터리 아래에 설치하고, Python/Node.js 의존성, CLI 명령어, 설정 파일, 브라우저 도구, 메시징 게이트웨이까지 한 번에 구성하는 설치 스크립트라고 보면 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 설치 위치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 경로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 기본적으로 아래 경로를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;~/.hermes
~/.hermes/hermes-agent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적으로는 다음 변수를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;HERMES_HOME=&quot;${HERMES_HOME:-$HOME/.hermes}&quot;
INSTALL_DIR=&quot;${HERMES_INSTALL_DIR:-$HERMES_HOME/hermes-agent}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 기본 구조는 이렇게 된다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;~/.hermes/
├── hermes-agent/      # 소스 코드
├── .env               # API 키 설정
├── config.yaml        # Hermes 설정
├── SOUL.md            # 페르소나 설정
├── cron/
├── sessions/
├── logs/
├── pairing/
├── hooks/
├── image_cache/
├── audio_cache/
├── memories/
└── skills/&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;지원 옵션&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실행 옵션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 다음 옵션을 받을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;--no-venv
--skip-setup
--branch NAME
--dir PATH
--hermes-home PATH
--help&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;옵션 의미&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--no-venv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Python 가상환경을 만들지 않는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--skip-setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;설치 후 대화형 설정 마법사를 실행하지 않는다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--branch NAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;설치할 Git 브랜치를 지정한다. 기본값은 &lt;code&gt;main&lt;/code&gt;이다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--dir PATH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hermes Agent 소스 설치 위치를 지정한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--hermes-home PATH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hermes 데이터 디렉터리를 지정한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;도움말을 출력한다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시는 이렇게 쓸 수 있다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh \
  | bash -s -- --skip-setup&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OS 감지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;감지 대상&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 &lt;code&gt;uname -s&lt;/code&gt;와 Termux 환경 변수를 이용해서 OS를 감지한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;li&gt;macOS&lt;/li&gt;
&lt;li&gt;Android Termux&lt;/li&gt;
&lt;li&gt;Windows 계열&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Windows 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows가 감지되면 이 Bash 설치 스크립트는 중단된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 PowerShell 설치 방식을 안내한다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1 | iex&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 이 &lt;code&gt;install.sh&lt;/code&gt;는 Windows용이 아니라 Linux/macOS/Termux용이라고 보면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치되는 주요 구성 요소&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;uv 설치 또는 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;uv&lt;/code&gt;는 Python 패키지 관리자이자 Python 버전 관리 도구로 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 다음 순서로 &lt;code&gt;uv&lt;/code&gt;를 찾는다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;PATH&lt;/code&gt;에 있는 &lt;code&gt;uv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.local/bin/uv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.cargo/bin/uv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;없으면 &lt;code&gt;https://astral.sh/uv/install.sh&lt;/code&gt;를 통해 설치&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분도 원격 스크립트를 다시 받아 실행하는 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 이 설치 스크립트는 직접적으로 다음 원격 코드를 실행한다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh
https://astral.sh/uv/install.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안상으로는 다운로드 후 직접 검토하고 실행하는 방식이 더 안전하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python 3.11 확인 또는 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 Python &lt;code&gt;3.11&lt;/code&gt;을 요구한다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;PYTHON_VERSION=&quot;3.11&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 Linux/macOS에서는 &lt;code&gt;uv&lt;/code&gt;를 통해 Python 3.11을 찾고, 없으면 설치한다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;uv python find 3.11
uv python install 3.11&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Termux에서는 &lt;code&gt;uv&lt;/code&gt; 대신 시스템 Python + &lt;code&gt;venv&lt;/code&gt; + &lt;code&gt;pip&lt;/code&gt;를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python이 없으면 아래처럼 설치한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pkg install -y python&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Git 확인 또는 설치 안내&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 &lt;code&gt;git&lt;/code&gt;이 있는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git이 없으면 OS별 설치 방법을 안내한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu/Debian 계열은 다음 명령을 안내한다.&lt;/p&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fedora 계열은 다음 명령을 안내한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;sudo dnf install git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arch 계열은 다음 명령을 안내한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;sudo pacman -S git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;macOS는 다음 명령을 안내한다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;xcode-select --install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 Homebrew를 통해 설치할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;brew install git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Termux에서는 다음 명령을 사용한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pkg install git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Termux에서는 Git을 자동 설치하려고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Node.js 확인 또는 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js는 Hermes의 브라우저 도구, Playwright, TUI 관련 기능에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 Node.js &lt;code&gt;22&lt;/code&gt; 버전을 기준으로 설치한다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;NODE_VERSION=&quot;22&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 &lt;code&gt;node&lt;/code&gt;가 있으면 그대로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없으면 다음 경로도 확인한다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;~/.hermes/node/bin/node&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 없으면 OS/아키텍처에 맞는 Node.js 바이너리를 다운로드해서 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 경로는 아래와 같다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;~/.hermes/node/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다음 심볼릭 링크를 만든다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;~/.local/bin/node
~/.local/bin/npm
~/.local/bin/npx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Termux에서는 아래 명령으로 설치한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pkg install -y nodejs&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ripgrep, ffmpeg 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 다음 도구를 확인한다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;도구&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ripgrep&lt;/code&gt; / &lt;code&gt;rg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;빠른 파일 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ffmpeg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TTS 음성 메시지 관련 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;macOS에서 Homebrew가 있으면 자동 설치를 시도한다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;brew install ripgrep ffmpeg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu/Debian 계열에서는 다음 명령을 사용한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;sudo apt install -y ripgrep ffmpeg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fedora 계열에서는 다음 명령을 사용한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;sudo dnf install -y ripgrep ffmpeg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arch 계열에서는 다음 명령을 사용한다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;sudo pacman -S --noconfirm ripgrep ffmpeg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Termux에서는 다음 패키지들을 설치하려고 한다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;pkg install -y clang rust make pkg-config libffi openssl ripgrep ffmpeg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux에서는 &lt;code&gt;sudo&lt;/code&gt;가 필요할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 &lt;code&gt;ripgrep&lt;/code&gt;과 &lt;code&gt;ffmpeg&lt;/code&gt;를 선택적 시스템 패키지로 보고, 설치 실패 시 Hermes 설치 자체를 반드시 중단하지는 않는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git 저장소 클론 또는 업데이트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;새 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 디렉터리가 없으면 저장소를 클론한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 SSH를 시도한다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone --branch main git@github.com:NousResearch/hermes-agent.git ~/.hermes/hermes-agent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH가 실패하면 HTTPS로 재시도한다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;git clone --branch main https://github.com/NousResearch/hermes-agent.git ~/.hermes/hermes-agent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH는 &lt;code&gt;BatchMode=yes&lt;/code&gt;와 &lt;code&gt;ConnectTimeout=5&lt;/code&gt;를 사용해서 키가 없을 때 오래 멈추지 않도록 되어 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기존 설치가 있는 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 설치 디렉터리가 있고 &lt;code&gt;.git&lt;/code&gt; 저장소라면 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수행 흐름은 이렇다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;설치 디렉터리로 이동한다.&lt;/li&gt;
&lt;li&gt;로컬 변경사항을 확인한다.&lt;/li&gt;
&lt;li&gt;변경사항이 있으면 자동 stash 한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git fetch origin&lt;/code&gt;을 실행한다.&lt;/li&gt;
&lt;li&gt;지정 브랜치로 checkout 한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull --ff-only&lt;/code&gt;를 실행한다.&lt;/li&gt;
&lt;li&gt;stash 했던 변경사항 복원을 시도한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 기존 설치를 덮어쓰기 전에 로컬 변경사항을 보존하려고 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Python 가상환경 생성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 동작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 &lt;code&gt;venv&lt;/code&gt;를 만든다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/hermes-agent/venv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 Linux/macOS에서는 &lt;code&gt;uv&lt;/code&gt;를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;uv venv venv --python 3.11&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Termux에서는 Python 표준 &lt;code&gt;venv&lt;/code&gt;를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;python -m venv venv&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;no-venv 사용 시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;--no-venv&lt;/code&gt; 옵션을 주면 가상환경 생성을 생략한다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;--no-venv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이 경우 시스템 Python 환경에 설치될 수 있으므로 충돌 가능성이 커진다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Python 패키지 설치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;일반 Linux/macOS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 editable install을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 모든 extra를 포함해서 설치를 시도한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;uv pip install -e &quot;.[all]&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실패하면 base install로 fallback한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;uv pip install -e &quot;.&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu/Debian 계열에서는 Python 패키지 빌드를 위해 다음 패키지 설치를 제안하거나 시도한다.&lt;/p&gt;
&lt;pre class=&quot;q&quot;&gt;&lt;code&gt;build-essential
python3-dev
libffi-dev&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Termux&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Termux에서는 다음 순서로 설치한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;python -m pip install --upgrade pip setuptools wheel
python -m pip install -e '.[termux]' -c constraints-termux.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실패하면 기본 설치로 fallback한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;python -m pip install -e '.' -c constraints-termux.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Android 빌드 환경을 위해 &lt;code&gt;ANDROID_API_LEVEL&lt;/code&gt;을 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값을 못 가져오면 기본값으로 &lt;code&gt;24&lt;/code&gt;를 사용한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Node.js 의존성 설치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;루트 package.json&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소 루트에 &lt;code&gt;package.json&lt;/code&gt;이 있으면 아래 명령을 실행한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;npm install --silent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 브라우저 도구 관련 Node 의존성을 설치하는 부분이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Playwright Chromium 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 자동화 도구로 Playwright Chromium을 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu/Debian 계열에서는 다음을 시도한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;npx playwright install --with-deps chromium&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arch/Manjaro에서는 필요한 시스템 라이브러리를 &lt;code&gt;pacman&lt;/code&gt;으로 설치하려고 한다.&lt;/p&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;sudo pacman -S --noconfirm --needed \
  nss atk at-spi2-core cups libdrm libxkbcommon mesa pango cairo alsa-lib&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fedora/RHEL/CentOS 계열은 자동 의존성 설치를 완전히 지원하지 않으므로 수동 설치 안내를 출력한다.&lt;/p&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;sudo dnf install nss atk at-spi2-core cups-libs libdrm libxkbcommon mesa-libgbm pango cairo alsa-lib&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TUI 의존성 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 경로에 &lt;code&gt;package.json&lt;/code&gt;이 있으면 TUI 의존성을 설치한다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;~/.hermes/hermes-agent/ui-tui/package.json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 명령은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd ~/.hermes/hermes-agent/ui-tui
npm install --silent&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;hermes 명령어 등록&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;심볼릭 링크 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 &lt;code&gt;hermes&lt;/code&gt; 명령어를 전역처럼 사용할 수 있도록 심볼릭 링크를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 Linux/macOS에서는 다음 위치에 만든다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;~/.local/bin/hermes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Termux에서는 다음 위치에 만든다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;$PREFIX/bin/hermes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경을 쓰는 경우 원본 바이너리는 보통 아래 위치다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;~/.hermes/hermes-agent/venv/bin/hermes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이렇게 링크된다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;ln -sf ~/.hermes/hermes-agent/venv/bin/hermes ~/.local/bin/hermes&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PATH 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;~/.local/bin&lt;/code&gt;이 &lt;code&gt;PATH&lt;/code&gt;에 없으면 셸 설정 파일에 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zsh에서는 다음 파일을 대상으로 한다.&lt;/p&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;~/.zshrc
~/.zprofile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bash에서는 다음 파일을 대상으로 한다.&lt;/p&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;~/.bashrc
~/.bash_profile
~/.profile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fish에서는 다음 파일을 대상으로 한다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;~/.config/fish/config.fish&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가되는 내용은 일반 셸 기준으로 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# Hermes Agent &amp;mdash; ensure ~/.local/bin is on PATH
export PATH=&quot;$HOME/.local/bin:$PATH&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fish는 다음 형식이다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;fish_add_path &quot;$HOME/.local/bin&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정 파일 생성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;생성 디렉터리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트는 &lt;code&gt;~/.hermes&lt;/code&gt; 아래에 설정 파일과 데이터 디렉터리를 만든다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/cron
~/.hermes/sessions
~/.hermes/logs
~/.hermes/pairing
~/.hermes/hooks
~/.hermes/image_cache
~/.hermes/audio_cache
~/.hermes/memories
~/.hermes/skills&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.env 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없으면 다음 파일을 생성한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/.env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소에 &lt;code&gt;.env.example&lt;/code&gt;이 있으면 복사한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;cp ~/.hermes/hermes-agent/.env.example ~/.hermes/.env&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;config.yaml 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없으면 다음 파일을 생성한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소에 &lt;code&gt;cli-config.yaml.example&lt;/code&gt;이 있으면 복사한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;cp ~/.hermes/hermes-agent/cli-config.yaml.example ~/.hermes/config.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SOUL.md 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없으면 기본 페르소나 파일을 만든다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;~/.hermes/SOUL.md&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용은 최소 형태다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# Hermes Agent Persona&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 여기서 &lt;code&gt;# Hermes Agent Persona&lt;/code&gt;는 스크립트가 생성하는 파일 내용이다. 이 글의 제목 규칙과는 별개다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;skills 동기화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번들 skills를 사용자 디렉터리로 동기화한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;~/.hermes/skills/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Python 스크립트로 동기화를 시도한다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;~/.hermes/hermes-agent/tools/skills_sync.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실패하면 단순 복사 fallback을 수행한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 후 setup wizard 실행&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 동작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 설치가 끝나면 대화형 설정 마법사를 실행한다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;python -m hermes_cli.main setup&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경 사용 시 정확히는 다음처럼 실행된다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;~/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main setup&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;skip-setup 사용 시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;--skip-setup&lt;/code&gt; 옵션을 주면 이 단계는 생략된다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;--skip-setup&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널이 없는 Docker build나 CI 같은 환경에서는 자동으로 생략하고 나중에 실행하라고 안내한다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;hermes setup&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메시징 게이트웨이 처리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;토큰 감지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 &lt;code&gt;.env&lt;/code&gt; 파일에서 메시징 플랫폼 토큰이 설정되어 있는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인하는 변수는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN
DISCORD_BOT_TOKEN
SLACK_BOT_TOKEN
SLACK_APP_TOKEN
WHATSAPP_ENABLED&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값들이 설정되어 있으면 게이트웨이 실행 또는 서비스 등록을 제안한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;WhatsApp pairing&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;WHATSAPP_ENABLED=true&lt;/code&gt;인데 세션 파일이 없으면 QR 페어링을 위해 다음 명령 실행을 제안한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;hermes whatsapp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 파일 위치는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;~/.hermes/whatsapp/session/creds.json&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;systemd 서비스 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux에서 &lt;code&gt;systemctl&lt;/code&gt;이 있으면 다음 명령을 실행하려고 한다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;hermes gateway install
hermes gateway start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemd가 없거나 Termux인 경우에는 백그라운드 프로세스로 실행한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;nohup hermes gateway &amp;gt; ~/.hermes/logs/gateway.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 완료 후 안내되는 명령어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 명령어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 완료 후 다음 명령어들이 안내된다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;hermes
hermes setup
hermes config
hermes config edit
hermes gateway install
hermes update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 의미는 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hermes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hermes 채팅 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hermes setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API 키 및 설정 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hermes config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;설정 확인/관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hermes config edit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;설정 파일 편집&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hermes gateway install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;메시징/cron용 게이트웨이 서비스 설치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hermes update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;최신 버전으로 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>인공지능/Hermes</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/372</guid>
      <comments>https://bob3rdnewbie.tistory.com/372#entry372comment</comments>
      <pubDate>Sat, 25 Apr 2026 19:17:58 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능/Hermes] 헤르메스란 ( feat. 오픈클로와의 차이 )</title>
      <link>https://bob3rdnewbie.tistory.com/371</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;1448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvg8nN/dJMcaaSvvhP/uikrBvIdYveL9zZezdjgU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvg8nN/dJMcaaSvvhP/uikrBvIdYveL9zZezdjgU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvg8nN/dJMcaaSvvhP/uikrBvIdYveL9zZezdjgU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvg8nN%2FdJMcaaSvvhP%2FuikrBvIdYveL9zZezdjgU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;1448&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;1448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenClaw vs Hermes Agent 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 에이전트가 주목받으면서 &lt;b&gt;OpenClaw&lt;/b&gt;와 &lt;b&gt;Hermes Agent&lt;/b&gt;도 자주 함께 언급된다.&lt;br /&gt;두 프로젝트 모두 &amp;ldquo;실제로 일을 수행하는 에이전트&amp;rdquo;를 지향하지만, 설계 방향은 분명히 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 말하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OpenClaw&lt;/b&gt;는 채널에 연결해 바로 활용하는 &lt;b&gt;개인 비서형 에이전트&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hermes Agent&lt;/b&gt;는 서버에 상주시켜 기억&amp;middot;자동화&amp;middot;학습을 수행하는 &lt;b&gt;운영형 자율 에이전트&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 둘 다 비슷한 범주에 속하지만, 실제로는 사용 목적과 운영 방식이 꽤 다르다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;한눈에 보는 차이&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;th&gt;Hermes Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;핵심 성격&lt;/td&gt;
&lt;td&gt;개인 AI 비서&lt;/td&gt;
&lt;td&gt;운영형 자율 에이전트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중심 UX&lt;/td&gt;
&lt;td&gt;메신저/채널 기반&lt;/td&gt;
&lt;td&gt;서버/런타임 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;강점&lt;/td&gt;
&lt;td&gt;빠른 실사용, 채널 연동&lt;/td&gt;
&lt;td&gt;장기 기억, 자동화, 분업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기억&lt;/td&gt;
&lt;td&gt;문맥 유지 중심&lt;/td&gt;
&lt;td&gt;장기 기억과 재사용 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;확장 방식&lt;/td&gt;
&lt;td&gt;Tools / Skills / Plugins&lt;/td&gt;
&lt;td&gt;Skills / Subagents / Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;적합한 환경&lt;/td&gt;
&lt;td&gt;개인용, 즉시 활용&lt;/td&gt;
&lt;td&gt;VPS, 서버, 장기 운영&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. OpenClaw: 바로 써먹는 AI 비서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenClaw는 &lt;b&gt;&amp;ldquo;지금 바로 쓸 수 있는 assistant&amp;rdquo;&lt;/b&gt;에 가깝다.&lt;br /&gt;슬랙, 텔레그램, 디스코드 같은 채널에 연결해 사용자가 요청하면 도구를 호출하고 실제 작업을 수행하는 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 성격에 잘 맞는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메신저에서 바로 AI를 호출하고 싶은 경우&lt;/li&gt;
&lt;li&gt;이메일, 일정, 간단한 업무 자동화가 필요한 경우&lt;/li&gt;
&lt;li&gt;복잡한 운영보다 빠른 도입과 사용성이 중요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;채널 친화성&lt;/b&gt;과 &lt;b&gt;즉시 활용성&lt;/b&gt;이다.&lt;br /&gt;즉 OpenClaw는 &amp;ldquo;운영 플랫폼&amp;rdquo;이라기보다 &lt;b&gt;실사용 중심의 AI 비서&lt;/b&gt;라는 표현이 더 잘 어울린다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Hermes Agent: 운영하며 키우는 에이전트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent는 단순 assistant보다 &lt;b&gt;장기 운영형 agent runtime&lt;/b&gt;에 가깝다.&lt;br /&gt;서버에 상주시켜 기억을 유지하고, 반복 작업을 자동화하고, 필요하면 여러 작업을 분업시키는 구조를 지향한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 다음과 같은 환경에서 강점이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VPS나 서버에서 24/7 실행해야 하는 경우&lt;/li&gt;
&lt;li&gt;반복 업무를 자동화하고 싶은 경우&lt;/li&gt;
&lt;li&gt;장기 기억과 학습 효과가 중요한 경우&lt;/li&gt;
&lt;li&gt;하나의 assistant보다 에이전트 시스템을 운영하고 싶은 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 Hermes의 핵심은 &lt;b&gt;지속성&lt;/b&gt;과 &lt;b&gt;자기개선 가능성&lt;/b&gt;이다.&lt;br /&gt;단순히 &amp;ldquo;한 번 잘 답하는 AI&amp;rdquo;가 아니라, &lt;b&gt;계속 돌리면서 더 잘하게 만드는 에이전트&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 가장 큰 차이: 기억과 학습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 프로젝트의 가장 큰 차이는 기억을 다루는 방식이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OpenClaw&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenClaw도 문맥 유지와 메모리 개념이 있지만, 그것은 어디까지나 &lt;b&gt;작업 수행을 돕는 요소&lt;/b&gt;에 가깝다.&lt;br /&gt;핵심은 여전히 &lt;b&gt;도구 사용, 스킬 실행, 실제 액션 수행&lt;/b&gt;이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Hermes Agent&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent는 기억이 단순 보조 기능이 아니라 &lt;b&gt;정체성 자체에 가까운 요소&lt;/b&gt;다.&lt;br /&gt;과거 경험을 쌓고, 반복 작업을 재사용하고, 장기적으로 더 나은 방식으로 일하도록 설계되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OpenClaw&lt;/b&gt;: 기억하는 assistant&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hermes Agent&lt;/b&gt;: 기억하고 학습하는 agent&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 어떤 경우에 무엇을 선택해야 할까&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OpenClaw가 더 적합한 경우&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 상황이라면 OpenClaw가 더 잘 맞는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메신저에서 바로 쓸 AI 비서가 필요하다&lt;/li&gt;
&lt;li&gt;빠르게 붙여서 실사용하고 싶다&lt;/li&gt;
&lt;li&gt;일정, 메시지, 간단한 액션 자동화가 중요하다&lt;/li&gt;
&lt;li&gt;채널 연동이 핵심이다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Hermes Agent가 더 적합한 경우&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 상황이라면 Hermes Agent가 더 잘 맞는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에서 상주시켜 운영하고 싶다&lt;/li&gt;
&lt;li&gt;반복 작업을 자동화하고 싶다&lt;/li&gt;
&lt;li&gt;장기 기억과 자기개선이 중요하다&lt;/li&gt;
&lt;li&gt;병렬 작업이나 분업 구조가 필요하다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenClaw와 Hermes Agent는 모두 강력한 오픈소스 AI 에이전트이지만, 지향점은 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OpenClaw&lt;/b&gt;는 &lt;b&gt;잘 연결된 AI 비서&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hermes Agent&lt;/b&gt;는 &lt;b&gt;기억하고 성장하는 AI 작업 런타임&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 선택 기준은 단순하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;즉시 활용성과 채널 기반 사용성&lt;/b&gt;이 중요하다면 &lt;b&gt;OpenClaw&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장기 운영, 자동화, 학습형 구조&lt;/b&gt;가 중요하다면 &lt;b&gt;Hermes Agent&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 두 프로젝트의 차이는 기능의 많고 적음보다,&lt;br /&gt;&lt;b&gt;AI를 &amp;ldquo;비서&amp;rdquo;로 볼 것인지, &amp;ldquo;운영하는 시스템&amp;rdquo;으로 볼 것인지&lt;/b&gt;에 더 가깝다.&lt;/p&gt;</description>
      <category>인공지능/Hermes</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/371</guid>
      <comments>https://bob3rdnewbie.tistory.com/371#entry371comment</comments>
      <pubDate>Wed, 15 Apr 2026 20:18:01 +0900</pubDate>
    </item>
    <item>
      <title>샤오미 공기청정기(미에어 mb3) 3H 스마트싱스 연동 (엣지드라이버)</title>
      <link>https://bob3rdnewbie.tistory.com/370</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스마트싱스 채널 초대 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bestow-regional.api.smartthings.com/invite/adMK96OEA1l9&quot;&gt;https://bestow-regional.api.smartthings.com/invite/adMK96OEA1l9&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775027093307&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SmartThings. Add a little smartness to your things.&quot; data-og-description=&quot;&quot; data-og-host=&quot;account.smartthings.com&quot; data-og-source-url=&quot;https://bestow-regional.api.smartthings.com/invite/adMK96OEA1l9&quot; data-og-url=&quot;https://account.smartthings.com/login-redirect?state=b8f28e7f321b1f63253b3be11a34a812f5d22fab74290b44b5e258e7616bdd5eaHR0cHM6Ly9iZXN0b3ctcmVnaW9uYWwuYXBpLnNtYXJ0dGhpbmdzLmNvbS9pbnZpdGUvYWRNSzk2T0VBMWw5Pw%3D%3D&amp;amp;referenceId=0f499b4d-c91a-d246-608f-7bb4443f4f9c&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://bestow-regional.api.smartthings.com/invite/adMK96OEA1l9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bestow-regional.api.smartthings.com/invite/adMK96OEA1l9&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SmartThings. Add a little smartness to your things.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;account.smartthings.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 기기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zhimi.airpurifier.mb3 ( 3H 모델 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연동 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 및 Token&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Vevs 개조판 미홈에서 획득 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;nbsp;전원&amp;nbsp;on/off&lt;br /&gt;-&amp;nbsp;공기질&amp;nbsp;(&amp;nbsp;좋음,&amp;nbsp;보통,&amp;nbsp;약간&amp;nbsp;나쁨,&amp;nbsp;나쁨,&amp;nbsp;위험&amp;nbsp;)&lt;br /&gt;-&amp;nbsp;PM&amp;nbsp;2.5&amp;nbsp;미세먼지&lt;br /&gt;-&amp;nbsp;온/습도&lt;br /&gt;- *팬 모드 ( 자동, 야간, 선호, 약/중/강 == Level 1/2/3 )&lt;br /&gt;-&amp;nbsp;설정&amp;nbsp;메뉴에서&amp;nbsp;기기&amp;nbsp;추가&amp;nbsp;토글&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* 팬모드 관련&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;nbsp;미홈&amp;nbsp;앱에서는&amp;nbsp;팬&amp;nbsp;모드가&amp;nbsp;자동/야간/선호&amp;nbsp;3개&amp;nbsp;있고,&amp;nbsp;블록&amp;nbsp;위치&amp;nbsp;모드로&amp;nbsp;가야&amp;nbsp;팬&amp;nbsp;속도(Level&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3)&amp;nbsp;설정이&amp;nbsp;됩니다.&lt;br /&gt;-&amp;nbsp;다만&amp;nbsp;저걸&amp;nbsp;스싱에서도&amp;nbsp;굳이&amp;nbsp;나누자니&amp;nbsp;UX만&amp;nbsp;늘어나는&amp;nbsp;느낌이&amp;nbsp;있어&amp;nbsp;팬모드로&amp;nbsp;합쳐놨습니다.&lt;br /&gt;-&amp;nbsp;약&amp;nbsp;=&amp;nbsp;Level&amp;nbsp;1,&amp;nbsp;중&amp;nbsp;=&amp;nbsp;Level&amp;nbsp;2,&amp;nbsp;강&amp;nbsp;=&amp;nbsp;Level&amp;nbsp;3&amp;nbsp;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JaGEx/dJMcabDG3ED/MVpxqFgjrSufkXPA84h3M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JaGEx/dJMcabDG3ED/MVpxqFgjrSufkXPA84h3M0/img.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2323&quot; data-is-animation=&quot;false&quot; width=&quot;400&quot; height=&quot;860&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JaGEx/dJMcabDG3ED/MVpxqFgjrSufkXPA84h3M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJaGEx%2FdJMcabDG3ED%2FMVpxqFgjrSufkXPA84h3M0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2323&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3rXRk/dJMcacP77iK/SldBrFKvss1zHpis6bVsuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3rXRk/dJMcacP77iK/SldBrFKvss1zHpis6bVsuK/img.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2323&quot; data-is-animation=&quot;false&quot; width=&quot;400&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3rXRk/dJMcacP77iK/SldBrFKvss1zHpis6bVsuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3rXRk%2FdJMcacP77iK%2FSldBrFKvss1zHpis6bVsuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2323&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>IoT/SmartThings</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/370</guid>
      <comments>https://bob3rdnewbie.tistory.com/370#entry370comment</comments>
      <pubDate>Wed, 1 Apr 2026 16:08:52 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능/OpenClaw] 클로드 사용량 보여주기</title>
      <link>https://bob3rdnewbie.tistory.com/369</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;디스코드랑 연결 된 오픈클로에서 클로드(모델)의 사용량 (5시간 세션, 주간 리밋)을 보여주고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 프로바이더를 OpenAI로 쓰고 있기는 한데 복잡한 코딩을 할 때에는 클로드(앤트로픽)을 사용하라고 설정한 상태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단 오픈클로 사용량이 95% 이상이 되면 백업으로 OpenAI로 코딩을 하라고 설정하고 싶었고, 전제 조건으로 어떻게든 클로드 사용량을 가져와야만 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 시도한 방법은, 오픈클로가 설치 된 우분투에 xrdp를 연결하여 크롬 브라우저를 실행해서 사용량 페이지(&lt;a href=&quot;https://claude.ai/settings/usage&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://claude.ai/settings/usage&lt;/a&gt;)를 띄어놓고 캡쳐해서 OCR을 통해 사용량을 보여주게 했는데 크게 2가지 문제가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 해상도나 xrdp 상태에 따라서 캡쳐가 안되거나 OCR이 제대로 안&amp;nbsp; 돈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이미지 OCR 해석하는 API 초과 ( 딱히 어디라고 지정 안 했는데 오픈클로가 어딘가랑 연동하고 알아서 해석하고 있었다 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 이유로 다른 방법을 찾던 중 GUI가 아닌 TUI를 이용하면 될까 싶어서 진행했는데 너무 잘 되서 방법을 작성한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;준비사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. (오픈클로 설치 환경에서) 클로드 CLI 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. (오픈클로 설치 환경에서) tmux 설치 및 세션 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이전 단계에서 생성 tmux 세션에서 claude 실행&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NMCiL/dJMcacPG4tZ/IJYcKK83VKP6A5hKYUWPKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NMCiL/dJMcacPG4tZ/IJYcKK83VKP6A5hKYUWPKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NMCiL/dJMcacPG4tZ/IJYcKK83VKP6A5hKYUWPKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNMCiL%2FdJMcacPG4tZ%2FIJYcKK83VKP6A5hKYUWPKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;628&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비사항을 끝마쳤으면 위 사진처럼 클로드 대화창이 나타나 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 오픈클로한테 적당한 프롬프트를 주면 되는데 몇 가지 조건을 붙였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 현재 &amp;amp; 주간 전부 보여줄 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 세션 초기화 시간이랑 그때까지 얼마나 남았는지 보여줄 것 ( 0 단위 제외 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 현재 또는 주간 세션 중 하나라도 85% 이상이면 디스코드에서 나를 태그에서 알람 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간을 들여 몇번씩 수정하면서 테스트를 했고 만족스럽게 실행이 되서, 오픈클로한테 설정 방법을 프롬프트로 만들어 달라고 했더니 아래처럼 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1771842808328&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## OpenClaw용 Claude 사용량 수집 프롬프트

Claude 사용량을 **이미지 OCR 없이 tmux 텍스트만**으로 수집하세요.

### 1) 대상
- tmux pane: `openclaw_claude_usage:1.1`

### 2) 실행 순서
1. pane에 `/usage` 입력 후 Enter
2. **10초 대기**
3. 아래 명령으로 텍스트 캡처
- `tmux capture-pane -p -J -t openclaw_claude_usage:1.1 -S -160`
4. 캡처 텍스트에서 아래 항목 파싱
- `Current session`의 `% used` + `Resets ...`
- `Current week (all models)`의 `% used` + `Resets ...`
5. 수집 후 **Esc 1회** 눌러 usage 패널 닫기
6. 값이 안 나오면 **최대 3회 재시도**

### 3) 시간 처리 규칙 (Asia/Seoul)
- `Resets Feb 24, 2am`처럼 날짜+시간이면 그대로 사용
- `Resets 2am`처럼 **시간만 있으면**:
- 아직 안 지난 시각이면 **오늘**
- 이미 지난 시각이면 **내일**
- 남은 시간 표기:
- 앞쪽 0 단위는 생략
- 중간 0 단위는 유지
- 예: `47분`, `2일 0시간 47분`

### 4) 출력 형식 (한국어)
- `Claude 현재 세션: &amp;lt;percent&amp;gt;% 사용 / &amp;lt;리셋시각&amp;gt; 재설정 / &amp;lt;남은시간&amp;gt; 남음`
- `Claude 주간 한도: &amp;lt;percent&amp;gt;% 사용 / &amp;lt;리셋시각&amp;gt; 재설정 / &amp;lt;남은시간&amp;gt; 남음`
- `판정: &amp;lt;주의|정상&amp;gt;`

### 5) 판정 기준
- 현재 세션 또는 주간 한도 중 하나라도 **85% 이상**이면 `주의`
- 그 외는 `정상`&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0QItP/dJMcajutKjD/ff8eQk9Iukau4qs27kcwVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0QItP/dJMcajutKjD/ff8eQk9Iukau4qs27kcwVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0QItP/dJMcajutKjD/ff8eQk9Iukau4qs27kcwVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0QItP%2FdJMcajutKjD%2Fff8eQk9Iukau4qs27kcwVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;109&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트 잘 넘겨주면 디코로 알람이 잘 온다.&lt;/p&gt;</description>
      <category>인공지능/OpenClaw</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/369</guid>
      <comments>https://bob3rdnewbie.tistory.com/369#entry369comment</comments>
      <pubDate>Mon, 23 Feb 2026 19:34:21 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능/OpenClaw] 오픈클로 구글(지메일, 캘린더 등) 연동하기 (feat. Gog 스킬)</title>
      <link>https://bob3rdnewbie.tistory.com/368</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;업데이트&lt;br /&gt;- 2026.03.08&lt;br /&gt;&amp;gt; 해외 포럼에서 구글 계정 차단(사유: 구글 약관을 우회하기 위한 다중 계정 사용 혹은 봇에서 생성 된 계정) 소식이 들려오고 있습니다.&lt;br /&gt;&amp;gt; 가급적 부계정을 이용하는걸 권장합니다. ( 계정 차단에 대한 책임은 사용자 본인에게 있습니다 )&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ClawHub에서 제일 유명한 스킬 중 하나가 구글 계정을 연동하는 &quot;Gog&quot; 스킬이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://clawhub.ai/steipete/gog&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://clawhub.ai/steipete/gog&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771089302566&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Gog &amp;mdash; ClawHub&quot; data-og-description=&quot;Google Workspace CLI for Gmail, Calendar, Drive, Contacts, Sheets, and Docs.&quot; data-og-host=&quot;clawhub.ai&quot; data-og-source-url=&quot;https://clawhub.ai/steipete/gog&quot; data-og-url=&quot;https://clawhub.ai/steipete/gog&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://clawhub.ai/steipete/gog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://clawhub.ai/steipete/gog&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Gog &amp;mdash; ClawHub&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Google Workspace CLI for Gmail, Calendar, Drive, Contacts, Sheets, and Docs.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;clawhub.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 이메일이랑 일정 관리 해주면 편하다 싶어서 연동을 하기로 결정했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OAuth 클라이언트 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원하는 구글 서비스 API 활성화&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://console.cloud.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://console.cloud.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771089782364&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://accounts.google.com/v3/signin/identifier?continue=https%3A%2F%2Fconsole.cloud.google.com%2F&amp;amp;dsh=S1898337448%3A1771089762574420&amp;amp;followup=https%3A%2F%2Fconsole.cloud.google.com%2F&amp;amp;ifkv=ASfE1-ohpi6L-KPjXgdjdJsLQp5MZZhWjlEa5kFS1OLq4t2I91Fx33kfRBNfOir8hXSXTO0XyyFneA&amp;amp;osid=1&amp;amp;passive=1209600&amp;amp;service=cloudconsole&amp;amp;flowName=WebLiteSignIn&amp;amp;flowEntry=ServiceLogin&quot; data-og-description=&quot;&quot; data-og-host=&quot;accounts.google.com&quot; data-og-source-url=&quot;https://console.cloud.google.com/&quot; data-og-url=&quot;https://accounts.google.com/v3/signin/identifier?continue=https%3A%2F%2Fconsole.cloud.google.com%2F&amp;amp;dsh=S1898337448%3A1771089762574420&amp;amp;followup=https%3A%2F%2Fconsole.cloud.google.com%2F&amp;amp;ifkv=ASfE1-ohpi6L-KPjXgdjdJsLQp5MZZhWjlEa5kFS1OLq4t2I91Fx33kfRBNfOir8hXSXTO0XyyFneA&amp;amp;osid=1&amp;amp;passive=1209600&amp;amp;service=cloudconsole&amp;amp;flowName=WebLiteSignIn&amp;amp;flowEntry=ServiceLogin&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://console.cloud.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://console.cloud.google.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://accounts.google.com/v3/signin/identifier?continue=https%3A%2F%2Fconsole.cloud.google.com%2F&amp;amp;dsh=S1898337448%3A1771089762574420&amp;amp;followup=https%3A%2F%2Fconsole.cloud.google.com%2F&amp;amp;ifkv=ASfE1-ohpi6L-KPjXgdjdJsLQp5MZZhWjlEa5kFS1OLq4t2I91Fx33kfRBNfOir8hXSXTO0XyyFneA&amp;amp;osid=1&amp;amp;passive=1209600&amp;amp;service=cloudconsole&amp;amp;flowName=WebLiteSignIn&amp;amp;flowEntry=ServiceLogin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;accounts.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 클라우드 콘솔로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVnsuW/dJMcaaxtFOk/Ad4NNu5IVrEck0zdUVR1Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVnsuW/dJMcaaxtFOk/Ad4NNu5IVrEck0zdUVR1Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVnsuW/dJMcaaxtFOk/Ad4NNu5IVrEck0zdUVR1Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVnsuW%2FdJMcaaxtFOk%2FAd4NNu5IVrEck0zdUVR1Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;410&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 상단의 &quot;프로젝트 선택&quot; 후 나타나는 창에서 &quot;새 프로젝트&quot; 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZ6sv2/dJMcagEtpfL/PIP9ygeV1EUQqvyyTLlmqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZ6sv2/dJMcagEtpfL/PIP9ygeV1EUQqvyyTLlmqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZ6sv2/dJMcagEtpfL/PIP9ygeV1EUQqvyyTLlmqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZ6sv2%2FdJMcagEtpfL%2FPIP9ygeV1EUQqvyyTLlmqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;457&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적절한 프로젝트 이름을 넣고 만들기를 누른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnNqIV/dJMcagRZS51/pPOz8OCTcJtk8GIGdhsNak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnNqIV/dJMcagRZS51/pPOz8OCTcJtk8GIGdhsNak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnNqIV/dJMcagRZS51/pPOz8OCTcJtk8GIGdhsNak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnNqIV%2FdJMcagRZS51%2FpPOz8OCTcJtk8GIGdhsNak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;206&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별다른 문제가 없으면 10초 이내로 성공 메시지가 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zKhEu/dJMcaiPKyRd/JIGR3DiSpoHyfD7wEielH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zKhEu/dJMcaiPKyRd/JIGR3DiSpoHyfD7wEielH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zKhEu/dJMcaiPKyRd/JIGR3DiSpoHyfD7wEielH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzKhEu%2FdJMcaiPKyRd%2FJIGR3DiSpoHyfD7wEielH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;368&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 좌측에서 &quot;API 및 서비스&quot; - &quot;라이브러리&quot;를 눌러서 내가 원하는 서비스(메일, 캘린더 등)에 대해서 활성화를 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxGnaU/dJMcadnnVFQ/ciSGIloYdJ3QSFH8x3TcSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxGnaU/dJMcadnnVFQ/ciSGIloYdJ3QSFH8x3TcSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxGnaU/dJMcadnnVFQ/ciSGIloYdJ3QSFH8x3TcSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxGnaU%2FdJMcadnnVFQ%2FciSGIloYdJ3QSFH8x3TcSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;299&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KJzvT/dJMcabiRBEE/cnkKZFnyzr4bv3vg2nxxF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KJzvT/dJMcabiRBEE/cnkKZFnyzr4bv3vg2nxxF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KJzvT/dJMcabiRBEE/cnkKZFnyzr4bv3vg2nxxF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKJzvT%2FdJMcabiRBEE%2FcnkKZFnyzr4bv3vg2nxxF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;327&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gmail 검색 후 선택하면 세부정보 화면이 나타나는데 저기서 &quot;사용&quot;을 눌러주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이런 식으로 다른 서비스 (캘린더, 드라이브 등등)도 설정해주면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OAuth 인증 구성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1cGVt/dJMcagqUsAj/hE2aQ6vuSwJqQa9ZdpO6k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1cGVt/dJMcagqUsAj/hE2aQ6vuSwJqQa9ZdpO6k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1cGVt/dJMcagqUsAj/hE2aQ6vuSwJqQa9ZdpO6k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1cGVt%2FdJMcagqUsAj%2FhE2aQ6vuSwJqQa9ZdpO6k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;225&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;API 및 서비스&quot;의 &quot;OAuth 동의 화면&quot;으로 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zsJ6Z/dJMcacPAV2Z/Ai9LPLQcjfH6NDVI7wl6Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zsJ6Z/dJMcacPAV2Z/Ai9LPLQcjfH6NDVI7wl6Ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zsJ6Z/dJMcacPAV2Z/Ai9LPLQcjfH6NDVI7wl6Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzsJ6Z%2FdJMcacPAV2Z%2FAi9LPLQcjfH6NDVI7wl6Ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;558&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작하기를 눌러 기본 정보를 구성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VrcvZ/dJMcahJ9c21/bFkfzwk8bG7JsR2NwUmsuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VrcvZ/dJMcahJ9c21/bFkfzwk8bG7JsR2NwUmsuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VrcvZ/dJMcahJ9c21/bFkfzwk8bG7JsR2NwUmsuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVrcvZ%2FdJMcahJ9c21%2FbFkfzwk8bG7JsR2NwUmsuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;270&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKUwZh/dJMcajnAwiy/Kkcfags5kLDcscCAkk5vjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKUwZh/dJMcajnAwiy/Kkcfags5kLDcscCAkk5vjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKUwZh/dJMcajnAwiy/Kkcfags5kLDcscCAkk5vjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKUwZh%2FdJMcajnAwiy%2FKkcfags5kLDcscCAkk5vjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;539&quot; height=&quot;316&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDqhVf/dJMcabQFfUh/0PiCaUHt4kYWwuIXJorkLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDqhVf/dJMcabQFfUh/0PiCaUHt4kYWwuIXJorkLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDqhVf/dJMcabQFfUh/0PiCaUHt4kYWwuIXJorkLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDqhVf%2FdJMcabQFfUh%2F0PiCaUHt4kYWwuIXJorkLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;539&quot; height=&quot;182&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs9sKl/dJMcai93KsV/9ZDBXHjiTQzU3DaJ9KOwRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs9sKl/dJMcai93KsV/9ZDBXHjiTQzU3DaJ9KOwRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs9sKl/dJMcai93KsV/9ZDBXHjiTQzU3DaJ9KOwRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs9sKl%2FdJMcai93KsV%2F9ZDBXHjiTQzU3DaJ9KOwRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;228&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 4가지 단계를 거치면 인증 구성은 완료 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자 인증 정보 생성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1vtdP/dJMcafrZ0iN/Uzg7a9KUkylwcK5iZgQkU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1vtdP/dJMcafrZ0iN/Uzg7a9KUkylwcK5iZgQkU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1vtdP/dJMcafrZ0iN/Uzg7a9KUkylwcK5iZgQkU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1vtdP%2FdJMcafrZ0iN%2FUzg7a9KUkylwcK5iZgQkU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;218&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3fAI/dJMcafyNqiQ/MF1lnMjj5TAKADur37VDyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3fAI/dJMcafyNqiQ/MF1lnMjj5TAKADur37VDyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3fAI/dJMcafyNqiQ/MF1lnMjj5TAKADur37VDyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3fAI%2FdJMcafyNqiQ%2FMF1lnMjj5TAKADur37VDyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;164&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vVSYA/dJMcadHGi22/GkbkgOk2AV8kgujrTNGFmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vVSYA/dJMcadHGi22/GkbkgOk2AV8kgujrTNGFmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vVSYA/dJMcadHGi22/GkbkgOk2AV8kgujrTNGFmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvVSYA%2FdJMcadHGi22%2FGkbkgOk2AV8kgujrTNGFmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;419&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ScTjn/dJMcahJ9c22/hVKceaisEQPKeDJ2B61jl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ScTjn/dJMcahJ9c22/hVKceaisEQPKeDJ2B61jl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ScTjn/dJMcahJ9c22/hVKceaisEQPKeDJ2B61jl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FScTjn%2FdJMcahJ9c22%2FhVKceaisEQPKeDJ2B61jl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;632&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트까지 생성하면 마지막에 위와 같은 화면이 나타나는데 &quot;JSON&quot; 다운로드를 하면 &quot;client_secret_xxxxx.json&quot; 파일이 다운로드 되며, 해당 파일을 오픈클로가 설치 된 환경으로 복사까지 해야 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;테스트 사용자 추가&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIxJcu/dJMcahXFcyV/QDikceOpBp7gmwIkkmpaGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIxJcu/dJMcahXFcyV/QDikceOpBp7gmwIkkmpaGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIxJcu/dJMcahXFcyV/QDikceOpBp7gmwIkkmpaGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIxJcu%2FdJMcahXFcyV%2FQDikceOpBp7gmwIkkmpaGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;469&quot; height=&quot;216&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tGRba/dJMcabQFfUi/Dzqx5BlTJeLRLNKlK91GBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tGRba/dJMcabQFfUi/Dzqx5BlTJeLRLNKlK91GBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tGRba/dJMcabQFfUi/Dzqx5BlTJeLRLNKlK91GBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtGRba%2FdJMcabQFfUi%2FDzqx5BlTJeLRLNKlK91GBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;584&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 사용자에 오픈클로랑 연동하고자 하는 메일이 있어야 하는데 없으면 &quot;Add Users&quot;를 눌러 추가하면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오픈클로 설정하기&lt;/h2&gt;
&lt;pre id=&quot;code_1771093113806&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew tap steipete/tap
brew install steipete/tap/gogcli
gog --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈클로가 설치 된 환경에 &quot;gog&quot; 명령어가 있어야 하는데 없으면 위 명령어를 설치하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chSvsf/dJMcafevLYD/oArRap1QISZOeu91cu6rH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chSvsf/dJMcafevLYD/oArRap1QISZOeu91cu6rH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chSvsf/dJMcafevLYD/oArRap1QISZOeu91cu6rH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchSvsf%2FdJMcafevLYD%2FoArRap1QISZOeu91cu6rH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;151&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1771093160358&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gog auth add xxxx@gmail.com --services gmail,calendar,drive&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈클로 설치 된 환경에서 위 명령어를 실행하면 URL 하나 주는데 연동하고자 하는 구글 계정이 로그인 된 브라우저에서 열어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRE89/dJMcafleWJz/Mro6YNuJ4AwDSumPuiDik0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRE89/dJMcafleWJz/Mro6YNuJ4AwDSumPuiDik0/img.png&quot; data-alt=&quot;&amp;quot;계속&amp;quot; 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRE89/dJMcafleWJz/Mro6YNuJ4AwDSumPuiDik0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRE89%2FdJMcafleWJz%2FMro6YNuJ4AwDSumPuiDik0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;854&quot; height=&quot;408&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&quot;계속&quot; 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tyIes/dJMcabQFfUj/zAhcl0J9GDzMHysgT3oKyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tyIes/dJMcabQFfUj/zAhcl0J9GDzMHysgT3oKyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tyIes/dJMcabQFfUj/zAhcl0J9GDzMHysgT3oKyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtyIes%2FdJMcabQFfUj%2FzAhcl0J9GDzMHysgT3oKyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;962&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2tQ2A/dJMcadVdsgK/XgQHpLy6kALVb0bJnDUBDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2tQ2A/dJMcadVdsgK/XgQHpLy6kALVb0bJnDUBDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2tQ2A/dJMcadVdsgK/XgQHpLy6kALVb0bJnDUBDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2tQ2A%2FdJMcadVdsgK%2FXgQHpLy6kALVb0bJnDUBDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;714&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 화면까지 나타나면 연동은 성공된거고 재빠르게 터미널을 다시 가야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C01T4/dJMcabQFfUk/1Ec9QoycDdg19Ek4UmOMOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C01T4/dJMcabQFfUk/1Ec9QoycDdg19Ek4UmOMOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C01T4/dJMcabQFfUk/1Ec9QoycDdg19Ek4UmOMOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC01T4%2FdJMcabQFfUk%2F1Ec9QoycDdg19Ek4UmOMOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;285&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 비밀번호를 요구하는데 추후에 다시 사용할 수 있으니 기억할만한 비밀번호를 입력하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hkeo1/dJMcadt8uIf/sgB15gCGwMilmcm7m5KQLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hkeo1/dJMcadt8uIf/sgB15gCGwMilmcm7m5KQLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hkeo1/dJMcadt8uIf/sgB15gCGwMilmcm7m5KQLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHkeo1%2FdJMcadt8uIf%2FsgB15gCGwMilmcm7m5KQLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;376&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연동 후 디스코드에서 저렇게 부탁을 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bco9u6/dJMcacIPV4Q/UITJEIvQbZ8kkt7JL3vLLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bco9u6/dJMcacIPV4Q/UITJEIvQbZ8kkt7JL3vLLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bco9u6/dJMcacIPV4Q/UITJEIvQbZ8kkt7JL3vLLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbco9u6%2FdJMcacIPV4Q%2FUITJEIvQbZ8kkt7JL3vLLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;662&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 실제로 구글 캘린더에 등록 된다.&lt;/p&gt;</description>
      <category>인공지능/OpenClaw</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/368</guid>
      <comments>https://bob3rdnewbie.tistory.com/368#entry368comment</comments>
      <pubDate>Sun, 15 Feb 2026 03:21:59 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능/OpenClaw] 오픈클로 디스코드 연동하기</title>
      <link>https://bob3rdnewbie.tistory.com/367</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT와의 연동이 끝났으니 이제는 &quot;채널&quot;을 연동하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈클로에서 &quot;채널(이하 메신저)&quot;은 오픈클로와 대화할 수 있는 메신저를 의미하는데, 각 메신저는 게이트웨이를 통해 연결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원하는 메신저 목록은 &lt;a href=&quot;https://docs.openclaw.ai/channels&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;서 확인할 수 있는데 아쉽게도 카카오톡은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그나마 한국에서 좀 쓸만한 것들 중에는 아래와 같은 사유로 디스코드로 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왓츠앱 ( 본인이 사용하지 않음 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 텔레그램 ( 텔레그램의 경우 한 채널에 여러 봇을 못 붙인다는 얘기가 좀 있음 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디스코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 슬랙 ( 개인용보단 업무용 아닐까 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라인 ( 본인이 사용하지 않음 )&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;디스코드 서버 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 기준 디스코드 설치하고 아래와 같은 단계로 우선 서버를 만들어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VJ9IS/dJMcagRZPCe/gJTKvMcL4TJY0ugrNetc7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VJ9IS/dJMcagRZPCe/gJTKvMcL4TJY0ugrNetc7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VJ9IS/dJMcagRZPCe/gJTKvMcL4TJY0ugrNetc7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVJ9IS%2FdJMcagRZPCe%2FgJTKvMcL4TJY0ugrNetc7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;445&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스코드 좌측 상단에 위치한 &quot;+&quot; 버튼을 눌러 서버를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3V9vg/dJMcabb3FOw/ce66t10hnZ194m3fqDisK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3V9vg/dJMcabb3FOw/ce66t10hnZ194m3fqDisK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3V9vg/dJMcabb3FOw/ce66t10hnZ194m3fqDisK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3V9vg%2FdJMcabb3FOw%2Fce66t10hnZ194m3fqDisK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;546&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 만들기 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5FFcu/dJMcacIPR4E/yFtkcSDbZy4w0PU5QnoNK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5FFcu/dJMcacIPR4E/yFtkcSDbZy4w0PU5QnoNK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5FFcu/dJMcacIPR4E/yFtkcSDbZy4w0PU5QnoNK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5FFcu%2FdJMcacIPR4E%2FyFtkcSDbZy4w0PU5QnoNK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;389&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문을 건너뛰기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bECQ3t/dJMb99L4qDS/VbLXbHQXe5kHGdyMyD3AkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bECQ3t/dJMb99L4qDS/VbLXbHQXe5kHGdyMyD3AkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bECQ3t/dJMb99L4qDS/VbLXbHQXe5kHGdyMyD3AkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbECQ3t%2FdJMb99L4qDS%2FVbLXbHQXe5kHGdyMyD3AkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;402&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 이름을 적당히 넣어주고 만들기를 누르면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lUwQZ/dJMcag5w7Fd/UKY3BbFDOOuZkirKHCM520/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lUwQZ/dJMcag5w7Fd/UKY3BbFDOOuZkirKHCM520/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lUwQZ/dJMcag5w7Fd/UKY3BbFDOOuZkirKHCM520/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlUwQZ%2FdJMcag5w7Fd%2FUKY3BbFDOOuZkirKHCM520%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;702&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나만의 서버가 만들어진다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;디스코드 봇 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 만들었으니 이제 봇을 만들어야 한다. 봇은 오픈클로의 복사본 느낌으로 생각하면 된다.&amp;nbsp; 우리가 디스코드에 어떤 채팅을 입력하면 그걸 복사본인 봇이 받아서 오픈클로에 넘기는 구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 &lt;a href=&quot;https://discord.com/developers/applications&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;디스코드 개발자 포탈&lt;/a&gt;로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXl3n5/dJMcahXE9mI/mlKchr7QSir951vnJkjht0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXl3n5/dJMcahXE9mI/mlKchr7QSir951vnJkjht0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXl3n5/dJMcahXE9mI/mlKchr7QSir951vnJkjht0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXl3n5%2FdJMcahXE9mI%2FmlKchr7QSir951vnJkjht0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;686&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;New Application&quot; 클릭 후 앱의 이름을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8lwpM/dJMcaivsHcO/n2xC3jwtAsiC5MLYW5rU6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8lwpM/dJMcaivsHcO/n2xC3jwtAsiC5MLYW5rU6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8lwpM/dJMcaivsHcO/n2xC3jwtAsiC5MLYW5rU6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8lwpM%2FdJMcaivsHcO%2Fn2xC3jwtAsiC5MLYW5rU6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1405&quot; height=&quot;587&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 앱의 페이지로 이동되는데 &quot;Installation&quot; 메뉴에 들어가서 &quot;Install Link&quot;을 &quot;None&quot;으로 바꾼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1kLrq/dJMcadt8qyY/JgmnK3Yq0NkEB7kT1oV7y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1kLrq/dJMcadt8qyY/JgmnK3Yq0NkEB7kT1oV7y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1kLrq/dJMcadt8qyY/JgmnK3Yq0NkEB7kT1oV7y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1kLrq%2FdJMcadt8qyY%2FJgmnK3Yq0NkEB7kT1oV7y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1389&quot; height=&quot;666&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1391&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHqOUC/dJMcahi5lLE/YEKLpaS61BXkYK3P9W2371/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHqOUC/dJMcahi5lLE/YEKLpaS61BXkYK3P9W2371/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHqOUC/dJMcahi5lLE/YEKLpaS61BXkYK3P9W2371/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHqOUC%2FdJMcahi5lLE%2FYEKLpaS61BXkYK3P9W2371%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1391&quot; height=&quot;786&quot; data-origin-width=&quot;1391&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;OAuth2&quot; 메뉴에서 Scopes와 Bot Permissions를 위와 같이 체크한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Scopes의 경우 &quot;bot&quot;은 필수이며 &quot;application.commands&quot;는 슬래시 기반 명령어를 사용할 거면 추가 아니면 안 해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &quot;Bot Permissions&quot;의 경우 &quot;View Channels&quot;, &quot;Send Messages&quot;, &quot;Read Message History&quot;는 필수이며 나머지 것들은 원하는만큼 추가하면 된다. ( 나는 파일 첨부와 쓰레드 기능을 위해 위 사진과 같이 선택했다. )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJALjI/dJMcac9PI0i/KF5sk0xV8K8aRXxfkEyDl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJALjI/dJMcac9PI0i/KF5sk0xV8K8aRXxfkEyDl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJALjI/dJMcac9PI0i/KF5sk0xV8K8aRXxfkEyDl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJALjI%2FdJMcac9PI0i%2FKF5sk0xV8K8aRXxfkEyDl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1133&quot; height=&quot;195&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 URL 값이 나오는데 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;반드시 메모&lt;/span&gt;&lt;/b&gt;해두자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OSWKc/dJMcabpDsJF/siTjvhc9Z2JFf0f8ZA5uRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OSWKc/dJMcabpDsJF/siTjvhc9Z2JFf0f8ZA5uRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OSWKc/dJMcabpDsJF/siTjvhc9Z2JFf0f8ZA5uRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOSWKc%2FdJMcabpDsJF%2FsiTjvhc9Z2JFf0f8ZA5uRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1435&quot; height=&quot;223&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Bot&quot; 메뉴에서 &quot;Reset Token&quot;을 눌러 토큰을 재발급 후 나오는 값을 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드시 메모&lt;/b&gt;&lt;/span&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buxb3S/dJMcadHGfuH/OpGPz7Gk2HkjweIBb5hMZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buxb3S/dJMcadHGfuH/OpGPz7Gk2HkjweIBb5hMZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buxb3S/dJMcadHGfuH/OpGPz7Gk2HkjweIBb5hMZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbuxb3S%2FdJMcadHGfuH%2FOpGPz7Gk2HkjweIBb5hMZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1148&quot; height=&quot;86&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(권장) 공용 봇 옵션은 기본으로 켜져 있는데 굳이 공용으로 할 필요가 없으니 나만 추가할 수 있게 끈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9OJ1J/dJMcacWkIfR/CctLsiwa17GVF7VUd3PLFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9OJ1J/dJMcacWkIfR/CctLsiwa17GVF7VUd3PLFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9OJ1J/dJMcacWkIfR/CctLsiwa17GVF7VUd3PLFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9OJ1J%2FdJMcacWkIfR%2FCctLsiwa17GVF7VUd3PLFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;246&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(옵션) Server Members Intent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디스코드 서버의 멤버 목록이나 멤버 상태 변화(서버 참가, 퇴장, 역할 변경 등) 관련 이벤트를 받아올 수 있게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특정 역할을 가진 사람만 봇을 쓰게 한다거나, 역할에 따라 다른 규칙을 처리하게 한다거나 할 수 있게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버를 공용으로 쓸 꺼면 활성화 해주고, 개인용도로 쓸꺼면 꺼주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(필수) Message Content Intent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버의 메시지를 처리할 수 있게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 안 키면 멍청한 깡통 봇이 되버린다. 오픈클로와 대화를 하지 못하니 반드시 켜야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6l8FD/dJMcabJVZbj/iPYyV1vgkNXsqe1nP0kCHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6l8FD/dJMcabJVZbj/iPYyV1vgkNXsqe1nP0kCHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6l8FD/dJMcabJVZbj/iPYyV1vgkNXsqe1nP0kCHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6l8FD%2FdJMcabJVZbj%2FiPYyV1vgkNXsqe1nP0kCHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;681&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그러면 이제 &quot;OAuth2&quot; 메뉴 마지막에 나온 링크를 브라우저에 복사하면 위 사진처럼 나오는데 본인이 생성한 서버에 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgA4NU/dJMcaaqHIN6/byTuSefbYkCUPvjGwScgS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgA4NU/dJMcaaqHIN6/byTuSefbYkCUPvjGwScgS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgA4NU/dJMcaaqHIN6/byTuSefbYkCUPvjGwScgS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgA4NU%2FdJMcaaqHIN6%2FbyTuSefbYkCUPvjGwScgS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;836&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxCzOX/dJMcahwBQLI/z4Df7NqUinkcRze7LAMBy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxCzOX/dJMcahwBQLI/z4Df7NqUinkcRze7LAMBy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxCzOX/dJMcahwBQLI/z4Df7NqUinkcRze7LAMBy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxCzOX%2FdJMcahwBQLI%2Fz4Df7NqUinkcRze7LAMBy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;340&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 권한을 다시 한번 확인해서 승인하는 창이 뜨고, 승인까지 하면 성공 창이 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1GjQm/dJMcaf6BJ4w/Jc3KFmBXcIfqTmQFxF2NG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1GjQm/dJMcaf6BJ4w/Jc3KFmBXcIfqTmQFxF2NG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1GjQm/dJMcaf6BJ4w/Jc3KFmBXcIfqTmQFxF2NG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1GjQm%2FdJMcaf6BJ4w%2FJc3KFmBXcIfqTmQFxF2NG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;750&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;봇이 성공적으로 추가 되면 디스코드 서버에 &quot;착륙&quot; 메시지가 나타난다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 아직 오픈클로에서 그 어떠한 설정도 하지 않았기에 말을 걸어도 딱히 반응을 하지 않는다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오픈클로 설정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 메모한 토큰 값을 사용할 차례이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;1069&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfBx07/dJMb99L4rmE/k2kp5P2E4aCkKOMQ53bCAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfBx07/dJMb99L4rmE/k2kp5P2E4aCkKOMQ53bCAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfBx07/dJMb99L4rmE/k2kp5P2E4aCkKOMQ53bCAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfBx07%2FdJMb99L4rmE%2Fk2kp5P2E4aCkKOMQ53bCAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;1069&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;1069&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1771078390965&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openclaw config&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 포스팅에서 OpenAI 연동하듯이 config 명령어를 이용해서 채널(메신저) 설정을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널까지 선택하면 현재 상황이 나오는데 &quot;install plugin to enable&quot;로 된것들은 플러그인 설치 후 연동이 가능하며, 나머지는 바로 연동이 가능한 것들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;1025&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKE7ZN/dJMcagj8zT7/csG0EEdBOmpLAiYpsekuOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKE7ZN/dJMcagj8zT7/csG0EEdBOmpLAiYpsekuOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKE7ZN/dJMcagj8zT7/csG0EEdBOmpLAiYpsekuOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKE7ZN%2FdJMcagj8zT7%2FcsG0EEdBOmpLAiYpsekuOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;1025&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;1025&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스코드를 선택하면 봇 토큰을 입력하라고 하는데 기존에 메모한 값을 입력하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rf6nR/dJMcaiPKwMD/pv40mPzOdnt3cPpn7Vblx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rf6nR/dJMcaiPKwMD/pv40mPzOdnt3cPpn7Vblx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rf6nR/dJMcaiPKwMD/pv40mPzOdnt3cPpn7Vblx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRf6nR%2FdJMcaiPKwMD%2Fpv40mPzOdnt3cPpn7Vblx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;846&quot; height=&quot;694&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나서 디스코드 채널 액세스를 오픈으로 설정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본값이면서도 권장값은 허용할 특정 서버를 고르는건데 어차피 디스코드쪽에서 봇을 직접 추가했기에 오픈으로 설정하여도 무방하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;디스코드 채팅하기 ( @ 태그 필수 )&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 봇과 채팅할 때는 여타 다른 SNS 마냥 &quot;@&quot; 태그를 해줘야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4XQQI/dJMcaiIZVdi/4t84RKJgXqL1KgckK3PMM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4XQQI/dJMcaiIZVdi/4t84RKJgXqL1KgckK3PMM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4XQQI/dJMcaiIZVdi/4t84RKJgXqL1KgckK3PMM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4XQQI%2FdJMcaiIZVdi%2F4t84RKJgXqL1KgckK3PMM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;198&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;디스코드 채팅하기 ( @ 태그 없이 )&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진처럼 봇과 대화를 하려면 꼭 태그를 해야 하는데 이게 여간 불편한게 아니다. 공용 서버면 어쩔 수 없겠지만 개인 서버라면 어차피 1:1 대화이기 때문에 태그 없이 바로 입력하는게 편한데 설정 파일을 약간 수정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 파일이 보통 &quot;~/.openclaw/openclaw.json&quot;에 있을텐데 아래처럼 디스코드 부분을 수정하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5PpCy/dJMcaiIZVoe/5suIT3MzIwC2NUfuMQ6oJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5PpCy/dJMcaiIZVoe/5suIT3MzIwC2NUfuMQ6oJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5PpCy/dJMcaiIZVoe/5suIT3MzIwC2NUfuMQ6oJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5PpCy%2FdJMcaiIZVoe%2F5suIT3MzIwC2NUfuMQ6oJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;307&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1771082212032&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;channels&quot;: {
    &quot;discord&quot;: {
      &quot;enabled&quot;: true,
      &quot;token&quot;: &quot;xxxxxxxxxxxxxxxxxxxxxxxx&quot;,
      &quot;groupPolicy&quot;: &quot;open&quot;,
      &quot;guilds&quot;: {
        &quot;*&quot;: {
          &quot;requireMention&quot;: false,
          &quot;channels&quot;: {
            &quot;*&quot;: { &quot;allow&quot;: true, &quot;requireMention&quot;: false }
          }
        }
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGDjqn/dJMcai93Ix1/PhGFnlOpvJ6eDoKKKhKPiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGDjqn/dJMcai93Ix1/PhGFnlOpvJ6eDoKKKhKPiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGDjqn/dJMcai93Ix1/PhGFnlOpvJ6eDoKKKhKPiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGDjqn%2FdJMcai93Ix1%2FPhGFnlOpvJ6eDoKKKhKPiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;333&quot; height=&quot;153&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>인공지능/OpenClaw</category>
      <author>초보 &amp;amp; 뉴비</author>
      <guid isPermaLink="true">https://bob3rdnewbie.tistory.com/367</guid>
      <comments>https://bob3rdnewbie.tistory.com/367#entry367comment</comments>
      <pubDate>Sun, 15 Feb 2026 00:02:00 +0900</pubDate>
    </item>
  </channel>
</rss>