Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/docs/content/docs/meta.ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"---連携---",
"github-integration",
"lark-bot-integration",
"octo-im-integration",
"---セルフホスト & 運用---",
"environment-variables",
"auth-setup",
Expand Down
1 change: 1 addition & 0 deletions apps/docs/content/docs/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"---Integrations---",
"github-integration",
"lark-bot-integration",
"octo-im-integration",
"---Self-hosting & ops---",
"environment-variables",
"auth-setup",
Expand Down
1 change: 1 addition & 0 deletions apps/docs/content/docs/meta.ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"---연동---",
"github-integration",
"lark-bot-integration",
"octo-im-integration",
"---자체 호스팅 & 운영---",
"environment-variables",
"auth-setup",
Expand Down
1 change: 1 addition & 0 deletions apps/docs/content/docs/meta.zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"---集成---",
"github-integration",
"lark-bot-integration",
"octo-im-integration",
"---自部署运维---",
"environment-variables",
"auth-setup",
Expand Down
109 changes: 109 additions & 0 deletions apps/docs/content/docs/octo-im-integration.ja.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
---
title: Octo IM 連携
description: Multica のエージェントを Octo IM ボットに紐付けると、Octo の DM やグループからそのまま対話でき、エージェントの返信が会話にストリーミングで返ってきます。
---

import { Callout } from "fumadocs-ui/components/callout";

任意の[エージェント](/agents)を Octo IM ボットに紐付けると、チームは Octo の中からそのまま使えます——ボットに DM するか、グループで @ メンションすれば、エージェントがチャットで答えます。返信は通常の Octo メッセージとして返り、エージェントの作業中はその場で更新されます。

各ボットは 1 つの Multica エージェントと **1 対 1** で紐付きます。2 つ目のエージェントを紐付けるには 2 つ目のボットを使います。1 つのエージェントが 2 つのボットを持つことはありません。

## この連携でできること

| 入口 | 挙動 |
|---|---|
| **エージェント → 連携** | エージェント詳細ページに **連携(Integrations)** タブがあります(左サイドバーにも対応するセクション)。オーナーと管理者はそこに **Octo ボットを接続** が表示され、接続後は **Octo に接続済み** の状態に切り替わります。 |
| **ボットに DM** | ワークスペースのメンバーが Octo でボットに直接メッセージを送ります。各会話はそのエージェントとの Multica [chat](/chat) セッションになり、エージェントがスレッド内で答えます。 |
| **グループで @ メンション** | ボットを Octo のグループに追加して @ メンションします。読み取られるのはメンションしたメッセージだけで、グループ全体は監視しません。 |
| **ストリーミング返信** | ボットはエージェントの答えを通常の Octo メッセージとして投稿し(Octo は Markdown をネイティブ表示)、エージェントの実行に合わせてその場で編集して更新します。各ステップごとに新しいメッセージを出さずに進捗と最終結果が見えます。 |

<Callout type="info">
Octo は **チャット**連携です——`/issue` コマンドはありません。ユーザーは自然言語でエージェントと対話します。issue を作成するには、エージェントチャットか Multica アプリを使ってください。(これが、`/issue` を追加する Lark Bot との主な違いです。)
</Callout>

## エージェントを接続する(オーナー / 管理者)

Octo ボットは QR スキャンではなく **ボットトークン** で設定します。

1. お使いの Octo デプロイのボットプラットフォームから **User Bot トークン**(`bf_` で始まる)を取得します。
2. Multica で **Agents → 対象のエージェント** を開きます。
3. **連携(Integrations)** タブ(または左サイドバーの **連携** セクション)を開き、**Octo ボットを接続** をクリックします。エージェント ID は自動入力されロックされるので、ボットは開いたエージェントにしか紐付きません。
4. **ボットトークン** を貼り付けます。デプロイにデフォルト API URL が設定されていない場合は、**API URL**(Octo ボット API のベース、例:`https://im.example.com/api`)も入力します。
5. **ボットを設定** をクリックします。Multica はそのトークンで Octo に登録してトークンの有効性を検証し、ボットの識別情報を取得したうえで **Octo に接続済み** を表示します。

<Callout type="warning">
あるOcto ボットは、**デプロイ全体で 1 つのエージェントにしか**紐付けられません。すでに別の場所に紐付いているボットを接続しようとすると、Multica は明確なメッセージで拒否します——先にそのエージェントから切断してください。
</Callout>

**設定 → 連携 → Octo IM** からも同じダイアログでボットを設定できます。エージェントごとのボタンはエージェント ID を事前入力してくれるだけです。

## ボットを使う(メンバー)

### 最初のメッセージ:Octo の本人確認を紐付ける

初めてボットにメッセージを送ると、ボットは **Octo の本人確認を紐付ける** ためのリンクを返します。リンクを開いて Multica にサインインすると、あなたの Octo アカウントが Multica のメンバーシップに紐付きます。これにより、エージェントがあなたの代わりに動作し、メッセージを正しいエージェントへ振り分けられるようになります。

<Callout type="warning">
ボットを使えるのは**ワークスペースのメンバー**だけです。メンバーでない場合、または紐付けリンクをまだ使っていない場合、ボットはメッセージを処理しません——破棄されます(監査のため記録されますが、内容は含みません)。紐付けリンクは 1 回限り・15 分間有効です。期限切れになったら、ボットにもう一度メッセージを送って新しいリンクを受け取ってください。
</Callout>

### エージェントと対話する

- **何でも聞く** —— ボットに DM するか、グループで @ メンションします。この会話は通常のエージェントチャットセッションで、エージェントの返信はチャットに表示され、作業に合わせてその場で更新されます。
- **Markdown 対応** —— エージェントの答えは Markdown で送られ、Octo がネイティブ表示します。

エージェントが**オフライン**(ランタイム未接続)または**アーカイブ済み**の場合、ボットはメッセージを黙って破棄せず、短いステータス通知を返します。

## 管理と切断

ワークスペース全体の管理は **設定 → 連携 → Octo IM** にあります:

- **接続済みのボット** に、ワークスペース内の各ボット、それぞれが紐付くエージェント、接続状態が一覧表示されます。この一覧は全メンバーに見えます。
- **切断** は **オーナー / 管理者のみ** です。切断するとボットは Octo メッセージの受信を停止し、WebSocket 接続が解除されます。インストール記録は監査のため保持され、後で同じエージェントを再設定できます。

ボットトークンのローテーション(または再登録)は、同じエージェントに対して **ボットを設定** をもう一度実行するだけです——稼働中の接続が自動的に新しい認証情報を取り込みます。

## 権限

- **接続 / 切断** にはワークスペースの**オーナー**または**管理者**が必要です。メンバーは接続済みボットの一覧は見られますが、設定・切断の操作はできません。
- **ボットとの対話** には、ワークスペースのメンバーであり、かつ Octo の本人確認が紐付いていることが必要です。それ以外はすべて破棄されます。
- 破棄されたメッセージについて、連携は本文を一切保存しません——監査用に破棄理由だけを記録します。ボットトークンは保存時に暗号化されます。

## セルフホスト設定

Multica Cloud では連携はすでに利用可能です——このセクションは飛ばしてください。

セルフホストでは、Octo は**保存時暗号化キーを設定するまで無効**です。このキーは、ボットトークンがデータベースに触れる前に暗号化します。

1. 32 バイトのキーを生成し、API サーバーに設定します:

```dotenv
MULTICA_OCTO_SECRET_KEY=<base64 エンコードした 32 バイトのキー>
```

`openssl rand -base64 32` で生成できます。

2. (任意)デフォルトの Octo ボット API URL を設定しておくと、管理者がインストールのたびに貼り付けずに済みます:

```dotenv
MULTICA_OCTO_API_URL=https://im.example.com/api
```

3. ボットが送る本人確認リンクをクリック可能にするため、Multica アプリの公開 URL を設定します:

```dotenv
MULTICA_PUBLIC_URL=https://multica.example.com
```

4. API を再起動します。`MULTICA_OCTO_SECRET_KEY` を設定するまで、**設定 → 連携** には「Octo 連携は無効」という通知が表示され、**Octo ボットを接続** の入口は非表示のままです。

<Callout type="info">
**紐付けリンクには `MULTICA_PUBLIC_URL` が必要です。** ボットの「本人確認を紐付ける」リンクは `{MULTICA_PUBLIC_URL}/octo/bind?token=…` を指します。この変数が未設定でも連携は動きますが、未紐付けのユーザーは有効なリンクを受け取れず、自分で紐付けできません。サーバーは起動時にこの状況をログに出すので、運用側が気づけます。
</Callout>

## 次のステップ

- [エージェント](/agents) —— 各ボットはちょうど 1 つのエージェントに紐付きます
- [Chat](/chat) —— ボットの会話が Multica 内部で何にマッピングされるか
- [環境変数](/environment-variables) —— セルフホスト設定の完全なリファレンス
109 changes: 109 additions & 0 deletions apps/docs/content/docs/octo-im-integration.ko.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
---
title: Octo IM 연동
description: Multica 에이전트를 Octo IM 봇에 연결하면 Octo의 DM이나 그룹에서 바로 대화할 수 있고, 에이전트의 답변이 대화로 스트리밍되어 돌아옵니다.
---

import { Callout } from "fumadocs-ui/components/callout";

아무 [에이전트](/agents)나 Octo IM 봇에 연결하면 팀이 Octo 안에서 바로 사용할 수 있습니다——봇에게 DM을 보내거나 그룹에서 @ 멘션하면 에이전트가 채팅에서 답합니다. 답변은 일반 Octo 메시지로 돌아오며, 에이전트가 작업하는 동안 그 자리에서 갱신됩니다.

각 봇은 하나의 Multica 에이전트와 **일대일**로 연결됩니다. 두 번째 에이전트를 연결하려면 두 번째 봇을 사용합니다. 한 에이전트가 두 개의 봇을 갖는 일은 없습니다.

## 이 연동이 하는 일

| 진입점 | 동작 |
|---|---|
| **에이전트 → 연동** | 에이전트 상세 페이지에 **연동(Integrations)** 탭이 있습니다(왼쪽 사이드바에도 대응 섹션). 소유자와 관리자는 거기에서 **Octo 봇 연결**을 보고, 연결 후에는 **Octo에 연결됨** 상태로 바뀝니다. |
| **봇에 DM** | 워크스페이스 멤버가 Octo에서 봇에게 직접 메시지를 보냅니다. 각 대화는 해당 에이전트와의 Multica [chat](/chat) 세션이 되고, 에이전트가 스레드 안에서 답합니다. |
| **그룹에서 @ 멘션** | 봇을 Octo 그룹에 추가하고 @ 멘션합니다. 멘션한 메시지만 읽으며, 그룹 전체를 듣지는 않습니다. |
| **스트리밍 답변** | 봇은 에이전트의 답변을 일반 Octo 메시지로 게시하고(Octo는 Markdown을 기본 렌더링), 에이전트 실행에 맞춰 그 자리에서 편집·갱신합니다. 단계마다 새 메시지를 만들지 않고도 진행 상황과 최종 결과가 보입니다. |

<Callout type="info">
Octo는 **채팅** 연동입니다——`/issue` 명령은 없습니다. 사용자는 자연어로 에이전트와 대화합니다. 이슈를 만들려면 에이전트 채팅이나 Multica 앱을 사용하세요. (이것이 `/issue`를 추가하는 Lark 봇과의 주요 차이입니다.)
</Callout>

## 에이전트 연결하기 (소유자 / 관리자)

Octo 봇은 QR 스캔이 아니라 **봇 토큰**으로 설정합니다.

1. 사용 중인 Octo 배포의 봇 플랫폼에서 **User Bot 토큰**(`bf_`로 시작)을 발급받습니다.
2. Multica에서 **Agents → 해당 에이전트**를 엽니다.
3. **연동(Integrations)** 탭(또는 왼쪽 사이드바의 **연동** 섹션)을 열고 **Octo 봇 연결**을 클릭합니다. 에이전트 ID가 미리 채워지고 잠기므로, 봇은 연 에이전트에만 연결됩니다.
4. **봇 토큰**을 붙여넣습니다. 배포에 기본 API URL이 설정되어 있지 않으면 **API URL**(Octo 봇 API의 베이스, 예: `https://im.example.com/api`)도 입력합니다.
5. **봇 구성**을 클릭합니다. Multica는 그 토큰으로 Octo에 등록해 유효성을 검증하고 봇 신원을 가져온 뒤 **Octo에 연결됨**을 표시합니다.

<Callout type="warning">
특정 Octo 봇은 **배포 전체에서 하나의 에이전트에만** 연결할 수 있습니다. 이미 다른 곳에 연결된 봇을 연결하려고 하면 Multica가 명확한 메시지로 거부합니다——먼저 그 에이전트에서 연결을 해제하세요.
</Callout>

**설정 → 연동 → Octo IM**에서도 같은 대화상자로 봇을 구성할 수 있습니다. 에이전트별 버튼은 에이전트 ID를 미리 채워줄 뿐입니다.

## 봇 사용하기 (멤버)

### 첫 메시지: Octo 신원 연결

봇에게 처음 메시지를 보내면 봇이 **Octo 신원을 연결**하라는 링크로 답합니다. 링크를 열고 Multica에 로그인하면 Octo 계정이 Multica 멤버십에 연결됩니다. 이를 통해 에이전트가 당신을 대신해 동작하고, 메시지를 올바른 에이전트로 라우팅할 수 있습니다.

<Callout type="warning">
봇은 **워크스페이스 멤버**만 사용할 수 있습니다. 멤버가 아니거나 연결 링크를 아직 사용하지 않았다면, 봇은 메시지를 처리하지 않습니다——폐기됩니다(감사를 위해 기록되지만 내용은 포함되지 않습니다). 연결 링크는 일회용이며 15분간 유효합니다. 만료되면 봇에게 메시지를 한 번 더 보내 새 링크를 받으세요.
</Callout>

### 에이전트와 대화하기

- **무엇이든 물어보기** —— 봇에게 DM하거나 그룹에서 @ 멘션합니다. 이 대화는 일반 에이전트 채팅 세션이며, 에이전트의 답변이 채팅에 나타나고 작업에 맞춰 그 자리에서 갱신됩니다.
- **Markdown 지원** —— 에이전트의 답변은 Markdown으로 전송되며 Octo가 기본 표시합니다.

에이전트가 **오프라인**(런타임 미연결)이거나 **보관됨** 상태이면, 봇은 메시지를 조용히 버리지 않고 짧은 상태 알림으로 답합니다.

## 관리 및 연결 해제

워크스페이스 전체 관리는 **설정 → 연동 → Octo IM**에 있습니다:

- **연결된 봇**에 워크스페이스의 각 봇, 각각이 연결된 에이전트, 그리고 연결 상태가 나열됩니다. 이 목록은 모든 멤버가 볼 수 있습니다.
- **연결 해제**는 **소유자 / 관리자 전용**입니다. 해제하면 봇이 Octo 메시지 수신을 멈추고 WebSocket 연결이 해제됩니다. 설치 기록은 감사를 위해 보존되며, 나중에 같은 에이전트를 다시 구성할 수 있습니다.

봇 토큰 교체(또는 재등록)는 같은 에이전트에 대해 **봇 구성**을 다시 실행하기만 하면 됩니다——실행 중인 연결이 자동으로 새 자격 증명을 가져갑니다.

## 권한

- **연결 / 해제**에는 워크스페이스 **소유자** 또는 **관리자**가 필요합니다. 멤버는 연결된 봇 목록은 볼 수 있지만 구성·해제 컨트롤은 없습니다.
- **봇과 대화하기**에는 워크스페이스 멤버이면서 Octo 신원이 연결되어 있어야 합니다. 그 외에는 모두 폐기됩니다.
- 폐기된 메시지에 대해 연동은 본문을 전혀 저장하지 않습니다——감사를 위해 폐기 사유만 기록합니다. 봇 토큰은 저장 시 암호화됩니다.

## 셀프호스트 설정

Multica Cloud에서는 연동이 이미 제공됩니다——이 섹션은 건너뛰세요.

셀프호스트에서는 Octo가 **저장 시 암호화 키를 설정하기 전까지 꺼져 있습니다**. 이 키는 봇 토큰이 데이터베이스에 닿기 전에 암호화합니다.

1. 32바이트 키를 생성해 API 서버에 설정합니다:

```dotenv
MULTICA_OCTO_SECRET_KEY=<base64로 인코딩한 32바이트 키>
```

`openssl rand -base64 32`로 생성할 수 있습니다.

2. (선택) 기본 Octo 봇 API URL을 설정하면 관리자가 설치할 때마다 붙여넣지 않아도 됩니다:

```dotenv
MULTICA_OCTO_API_URL=https://im.example.com/api
```

3. 봇이 보내는 신원 연결 링크가 클릭 가능하도록 Multica 앱의 공개 URL을 설정합니다:

```dotenv
MULTICA_PUBLIC_URL=https://multica.example.com
```

4. API를 재시작합니다. `MULTICA_OCTO_SECRET_KEY`가 설정되기 전에는 **설정 → 연동**에 "Octo 연동이 활성화되지 않음" 알림이 표시되고 **Octo 봇 연결** 진입점은 숨겨진 채로 유지됩니다.

<Callout type="info">
**연결 링크에는 `MULTICA_PUBLIC_URL`이 필요합니다.** 봇의 "신원 연결" 링크는 `{MULTICA_PUBLIC_URL}/octo/bind?token=…`을 가리킵니다. 이 변수가 설정되지 않아도 연동은 동작하지만, 연결되지 않은 사용자는 유효한 링크를 받지 못해 스스로 연결할 수 없습니다. 서버는 시작 시 이 상황을 로그로 남겨 운영자가 알 수 있게 합니다.
</Callout>

## 다음 단계

- [에이전트](/agents) —— 각 봇은 정확히 하나의 에이전트에 연결됩니다
- [Chat](/chat) —— 봇 대화가 Multica 내부에서 무엇에 매핑되는지
- [환경 변수](/environment-variables) —— 전체 셀프호스트 구성 참조
Loading
Loading