docs: skill-slack 입출력 분리 — 아이디어 보강(OpenClaw/JSON 인터페이스) + 리서치 신설
- 아이디어: 표준 JSON 출력 인터페이스 초안, OpenClaw 커넥터 패턴, 메시지 버스 트렌드 반영 - 리서치: 현재 코드 기반 실현 경로 4단계, Facts 6건, Unresolved 3건 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
66b0b91772
commit
ffa9923743
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
type: ideas
|
type: ideas
|
||||||
tags: [ideas, skill-slack, rb8001, gateway, architecture, refactoring]
|
tags: [ideas, skill-slack, rb8001, gateway, architecture, refactoring, openclaw, message-bus]
|
||||||
adopted_by:
|
adopted_by:
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -24,26 +24,60 @@ Slack → rb8001(이벤트 수신 + 판단 + 처리 + Slack SDK 직접 호출)
|
|||||||
## 제안 구조
|
## 제안 구조
|
||||||
|
|
||||||
```
|
```
|
||||||
Slack → Gateway → rb8001(판단·처리, CEU 단위체 중심) → skill-slack(입출력 전담) → Slack
|
Slack → skill-slack(수신·표준화) → rb8001(판단·처리) → skill-slack(렌더링·전송) → Slack
|
||||||
```
|
```
|
||||||
|
|
||||||
| 컴포넌트 | 역할 |
|
| 컴포넌트 | 역할 |
|
||||||
|----------|------|
|
|----------|------|
|
||||||
| Gateway | 프로토콜 라우팅 (Slack/웹/API → 내부 메시지 표준화) |
|
| Gateway | 프로토콜 라우팅 (Slack/웹/API → 내부 메시지 표준화) |
|
||||||
| rb8001 | 의도 판단, RAG 검색, LLM 호출, 응답 생성 (채널 무관) |
|
| rb8001 | 의도 판단, RAG 검색, LLM 호출, 응답 생성 (채널 무관). 출력은 표준 JSON |
|
||||||
| skill-slack | Slack 전용 입출력 — 이벤트 수신, Block Kit 포맷, 스레드 관리, 파일 업로드 |
|
| skill-slack | Slack 전용 입출력 전담 — 이벤트 수신, 표준 메시지 변환, Block Kit 렌더링, 스레드 관리, 파일 업로드 |
|
||||||
|
|
||||||
|
### 데이터 흐름 상세
|
||||||
|
|
||||||
|
1. **수신**: Slack Event → skill-slack이 수신 → 표준 메시지 객체로 변환 → rb8001에 전달
|
||||||
|
2. **처리**: rb8001은 RAG·LLM 수행 → 표준 JSON 결과 반환 (채널 무관)
|
||||||
|
3. **렌더링**: skill-slack이 결과 JSON을 Slack Block Kit으로 변환 → 전송
|
||||||
|
|
||||||
|
### rb8001 출력 표준 JSON 인터페이스 (초안)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "grounding_answer",
|
||||||
|
"content": {
|
||||||
|
"direct_answer": "답변 텍스트",
|
||||||
|
"evidence_docs": ["파일명1.pdf"],
|
||||||
|
"data_format": "table",
|
||||||
|
"data": [
|
||||||
|
{"항목": "자산총계", "값": "318,145,805원"},
|
||||||
|
{"항목": "부채총계", "값": "40,618,963원"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
skill-slack은 `data_format`을 보고 Block Kit `fields`로 렌더링할지, 줄바꿈 텍스트로 할지 결정.
|
||||||
|
|
||||||
|
## 업계 참조: OpenClaw 및 2026년 에이전트 아키텍처 트렌드
|
||||||
|
|
||||||
|
- **OpenClaw** 등 최신 에이전트 프레임워크는 '커넥터(Connector)' 패턴으로 채널을 추상화. 에이전트 본체는 채널을 모르고 표준 JSON만 주고받음.
|
||||||
|
- **메시지 버스 기반 아키텍처**: 중앙 통제형(rb8001이 다 하는 현재)에서 메시지 기반 분리로 진화.
|
||||||
|
- **비동기 처리**: 게이트웨이가 즉시 200 OK → 백그라운드 처리 → skill-slack이 결과 push. 현재 rb8001도 부분적으로 이 패턴 사용 중(콜드메일).
|
||||||
|
- Slack Block Kit 2026년 업데이트로 마크다운 코드 하이라이팅, 체크리스트 등 지원 확장.
|
||||||
|
|
||||||
## 기대 효과
|
## 기대 효과
|
||||||
|
|
||||||
- rb8001에서 Slack SDK 의존 제거 → 채널 독립적 코어
|
- rb8001에서 Slack SDK 의존 제거 → 채널 독립적 코어
|
||||||
- 출력 포맷(Block Kit, 줄바꿈, 표)을 skill-slack에서 단독 관리
|
- 출력 포맷(Block Kit, 줄바꿈, 표)을 skill-slack에서 단독 관리
|
||||||
- 새 채널(웹 대시보드, API) 추가 시 skill-web만 붙이면 됨
|
- 새 채널(웹 대시보드, API) 추가 시 skill-web만 붙이면 됨
|
||||||
|
- rb8001 출력을 표준 JSON으로 통일하면 리팩토링 시 점진적 이전 가능
|
||||||
|
|
||||||
## 제약
|
## 제약
|
||||||
|
|
||||||
- 리팩토링 범위가 크고 현재 RAG 작업과 별개 트랙
|
- 리팩토링 범위가 크고 현재 RAG 작업과 별개 트랙
|
||||||
- rb8001의 `slack/message_service.py`, `slack/file_service.py` 등 이동 필요
|
- rb8001의 `slack/message_service.py`, `slack/file_service.py` 등 이동 필요
|
||||||
- 기존 동작 회귀 테스트 필요
|
- 기존 동작 회귀 테스트 필요
|
||||||
|
- workspace-team-project 계층 재정의 작업과 접근 권한 경계가 겹칠 수 있음
|
||||||
|
|
||||||
## 관련 파일
|
## 관련 파일
|
||||||
|
|
||||||
@ -51,3 +85,8 @@ Slack → Gateway → rb8001(판단·처리, CEU 단위체 중심) → skill-sla
|
|||||||
- `rb8001/app/services/slack/file_service.py`
|
- `rb8001/app/services/slack/file_service.py`
|
||||||
- `robeing/skill-slack/`
|
- `robeing/skill-slack/`
|
||||||
- `robeing/robeing-gateway/`
|
- `robeing/robeing-gateway/`
|
||||||
|
|
||||||
|
## 관련 문서
|
||||||
|
|
||||||
|
- [260316 workspace-team-project 계층 재정의 전환계획](../plans/260316_workspace_team_project_계층_재정의_전환계획.md)
|
||||||
|
- [OpenClaw 레퍼런스](../../reference/openclaw/)
|
||||||
|
|||||||
78
journey/research/260323_skill_slack_입출력분리_아키텍처_리서치.md
Normal file
78
journey/research/260323_skill_slack_입출력분리_아키텍처_리서치.md
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
type: research
|
||||||
|
tags: [research, skill-slack, rb8001, architecture, openclaw, message-bus, block-kit]
|
||||||
|
status: open
|
||||||
|
research_target: rb8001-skill-slack 입출력 분리의 기술적 타당성과 현재 코드 기반 실현 경로 확인
|
||||||
|
---
|
||||||
|
|
||||||
|
# 260323 skill-slack 입출력 분리 아키텍처 리서치
|
||||||
|
|
||||||
|
## 목적
|
||||||
|
|
||||||
|
- rb8001과 skill-slack 사이의 입출력 분리가 현재 코드 구조에서 실현 가능한지 확인한다.
|
||||||
|
- 업계 트렌드(OpenClaw, 메시지 버스)와 현재 로빙 아키텍처의 차이를 확인한다.
|
||||||
|
|
||||||
|
## 사실 (Facts)
|
||||||
|
|
||||||
|
### 1. 현재 rb8001의 Slack 의존 범위
|
||||||
|
|
||||||
|
- `rb8001/app/services/slack/` 디렉토리에 5개 서비스 파일 존재
|
||||||
|
- `message_service.py`: 이벤트 수신 + 라우팅 + `chat_postMessage` 직접 호출
|
||||||
|
- `file_service.py`: 파일 업로드 + Block Kit 진행률 표시
|
||||||
|
- `coldmail_service.py`: Block Kit blocks 사용 (이미 분리된 패턴)
|
||||||
|
- `clarify_service.py`: `chat_postMessage` 직접 호출
|
||||||
|
- `news_service.py`: Block Kit blocks 전달
|
||||||
|
- Slack SDK(`slack_sdk`)가 rb8001의 직접 의존성
|
||||||
|
- grounding 응답 경로: `message_service.py` → `chat_postMessage(text=final_text)` — Block Kit 미사용
|
||||||
|
|
||||||
|
### 2. skill-slack의 현재 역할
|
||||||
|
|
||||||
|
- `robeing/skill-slack/`: 독립 서비스 (포트 할당, Docker 컨테이너)
|
||||||
|
- 콜드메일 리스트, Slack Lists 연동 등 일부 기능만 담당
|
||||||
|
- rb8001의 메인 메시지 응답 경로와 무관하게 동작
|
||||||
|
|
||||||
|
### 3. 업계 참조 — OpenClaw 커넥터 패턴
|
||||||
|
|
||||||
|
- 에이전트 본체는 채널을 모르고 표준 JSON만 주고받음
|
||||||
|
- 채널별 '커넥터'가 프로토콜 변환 전담
|
||||||
|
- 로빙의 Gateway(`robeing-gateway`)가 이 역할에 가장 가까우나, 현재는 HTTP 프록시 수준
|
||||||
|
|
||||||
|
### 4. Block Kit 사용 현황
|
||||||
|
|
||||||
|
- rb8001 내부에서 이미 Block Kit을 사용하는 서비스: `file_service.py`, `coldmail_service.py`, `news_service.py`
|
||||||
|
- grounding 응답만 plain text로 보내고 있음
|
||||||
|
- Block Kit `fields`를 사용하면 키-값 2열 정렬 가능 (Slack이 표를 지원하지 않는 대안)
|
||||||
|
|
||||||
|
### 5. 표준 JSON 인터페이스 가능성
|
||||||
|
|
||||||
|
- rb8001의 grounding 응답은 이미 `CompanyXRAGOutput` Pydantic 모델로 구조화되어 있음
|
||||||
|
- `direct_answer`, `evidence_docs`, `failure_reason` 필드가 있으므로 JSON 인터페이스 전환 비용 낮음
|
||||||
|
- 추가로 `data_format` (text/table/list) 필드를 넣으면 skill-slack이 렌더링 방식을 결정 가능
|
||||||
|
|
||||||
|
### 6. workspace-team-project 계층 재정의와의 관계
|
||||||
|
|
||||||
|
- 23서버에서 진행 중인 계층 재정의 작업에서 접근 권한·에이전트 등록이 추가됨
|
||||||
|
- skill-slack이 입출력 전담이 되면 접근 권한 enforcement 지점이 달라짐 (현재 rb8001 내부 → Gateway 또는 skill-slack 레벨로 이동 가능)
|
||||||
|
|
||||||
|
## 실현 경로 (점진적)
|
||||||
|
|
||||||
|
| 단계 | 내용 | 영향 범위 |
|
||||||
|
|------|------|----------|
|
||||||
|
| 1단계 | rb8001 grounding 응답을 JSON 인터페이스로 통일 | rb8001만 수정 |
|
||||||
|
| 2단계 | skill-slack에 Block Kit 렌더링 엔드포인트 추가 | skill-slack 수정 |
|
||||||
|
| 3단계 | rb8001의 `chat_postMessage` 직접 호출을 skill-slack 호출로 교체 | rb8001 + skill-slack |
|
||||||
|
| 4단계 | 이벤트 수신을 skill-slack → rb8001 API 호출로 전환 | Gateway + skill-slack + rb8001 |
|
||||||
|
|
||||||
|
1단계는 RAG 작업과 병행 가능. 2~4단계는 별도 트랙.
|
||||||
|
|
||||||
|
## Unresolved
|
||||||
|
|
||||||
|
- skill-slack을 거치면 응답 지연이 얼마나 증가하는지 (현재 직접 호출 vs HTTP 1홉 추가)
|
||||||
|
- 비동기 처리(200 OK 즉시 반환 + 백그라운드 push)로 전환 시 기존 스레드 응답 UX에 영향이 있는지
|
||||||
|
- Gateway의 역할 경계 — 프로토콜 라우팅만 할지, 인증/접근 권한도 담당할지
|
||||||
|
|
||||||
|
## 관련 문서
|
||||||
|
|
||||||
|
- [260323 skill-slack 입출력 전담 구조 분리 아이디어](../ideas/260323_skill_slack_입출력_전담_구조_분리_아이디어.md)
|
||||||
|
- [260316 workspace-team-project 계층 재정의 전환계획](../plans/260316_workspace_team_project_계층_재정의_전환계획.md)
|
||||||
|
- [OpenClaw 레퍼런스](../../reference/openclaw/)
|
||||||
Loading…
x
Reference in New Issue
Block a user