CLI
분석 기준: 14c213405669414492bda0f8d52cc6531d062c45. 기존 8월 설명을 공식 README·패키지·채널·런타임 소스와 비교했습니다. upstream 설치·스크립트·브라우저·모델 호출은 실행하지 않았습니다.
Agent-Reach 1.6.0은 웹·동영상·SNS의 검색·읽기 기능을 하나의 CLI와 JSON 결과로 제공하는 Python 도구입니다. 플랫폼별 도구를 설치·관리하고, 채널마다 정의한 동작과 백엔드를 연결합니다. 기본 Python 패키지 자체가 모델을 호출해 추론하는 에이전트는 아닙니다.
기존 8월 문서의 “도구를 연결한 뒤 에이전트가 외부 CLI를 직접 호출한다”는 설명에서 범위가 넓어졌습니다. 현재 입구는 agent-reach <channel> <action>이며 입력 검사·시도 순서·공통 오류·로그인 세션을 런타임이 관리합니다.
2026-10-28 Daily 9위에서 다시 관측됐습니다. 순위는 사용성·안정성 검증이 아닙니다. 소스에서 볼 차별점은 사이트별 명령·반환 형식의 차이를 공통 계약 안에 넣고, 실패한 작업을 빈 검색 결과로 포장하지 않으려는 설계입니다.
| 등록 채널 | 현재 level | 주요 조건 |
|---|---|---|
| GitHub·YouTube·Bilibili·V2EX·Web | default 5개 | 기본 검색·읽기. 자막·전사 등 일부 동작은 로그인·별도 키 필요 |
| Xiaohongshu·Xueqiu·Boss·Xiaoyuzhou·LinkedIn·Reddit | optional 6개 | 사용자가 추가하며 동작별 로그인·키 조건이 다름 |
| Twitter/X·Facebook·Instagram | experimental 3개 | 로그인과 브라우저가 필요하고 플랫폼 변화로 실패할 수 있음 |
총 14개는 channels/__init__.py의 실제 등록 목록입니다. 예전 RSS·Exa를 독립 채널로 세던 15개 표와 다릅니다. Exa는 현재 Web 등의 백엔드 역할도 하므로 채널 수와 사용 도구 수를 섞지 않습니다.
| 층 | 실제 파일·기술 | 역할 |
|---|---|---|
| 패키지 | Python 3.10+, Hatchling, pyproject v1.6.0 | agent-reach CLI 배포 |
| 기본 의존성 | requests·loguru·PyYAML·yt-dlp[default]==2026.8.19 | HTTP·로그·설정·동영상 추출 |
| 채널 계약 | Channel ABC, frozen Action·Param | 동작·인자·순서 있는 백엔드 선언 |
| 실행 런타임 | runtime/dispatch.py·result.py·state.py | 입력 검증·deadline·오류 분류·상태·결과 envelope |
| 외부 도구 | OpenCLI·bili-cli·gh·yt-dlp·Jina·Exa 등 | 사이트별 실제 검색·읽기. 종류와 조건은 채널별 |
| 로그인 | 전용 브라우저·OpenCLI 연결, sessions/ | 사이트별 로그인 재사용과 원시 도구의 전용 HOME |
과거 문서의 Rich·python-dotenv·browser_cookie3를 현 기본 의존성으로 적지 않습니다. 모델 API는 기본 검색의 공통 필수가 아니지만 YouTube 음성 전사는 Groq/OpenAI, Xiaoyuzhou 전사는 Groq 키 등 별도 조건이 있습니다.
명령 / URL
→ Channel·Action 선택
→ 인자·timeout 검증
→ 추가/도구/세션 상태 확인
→ 동작에 선언한 백엔드 순서로 실행
→ {schema_version, ok, channel, action,
backend, items, meta, error}
Param은 이름·필수 여부·형식·기본값을, Action은 백엔드 이름과 구현 메서드의 순서를 선언합니다. dispatcher는 정의되지 않은 인자, 음수 limit, bool을 정수로 쓰는 입력, 유한하지 않은 timeout을 설치·로그인 준비 전에 거부합니다. 이름만 있는 Channel 하위 클래스로 모든 동작이 자동 등록되는 것은 아닙니다.
result.py의 FINAL_CODES에는 NOT_FOUND·BAD_INPUT·PLATFORM_BLOCKED·RATE_LIMITED·NEED_LOGIN·BUSY가 있습니다. 이런 오류는 다른 백엔드로 계속 우회하지 않습니다. TIMEOUT·UPSTREAM_BROKEN 등은 정해진 정책에 따라 처리하고 건강 상태를 기록합니다. 실제 제한은 채널 단위 cooldown으로 관리합니다. 반환의 items: []만 보고 “검색 결과 없음”이라 결론 내리지 말고 ok와 error.code를 함께 읽어야 합니다.
공식 세션 문서는 연결된 Chrome/OpenCLI가 있을 때 첫 사이트 사용 시 해당 사이트 쿠키만 전용 브라우저로 한 번 복사할 수 있다고 설명합니다. 브라우저 전체·암호 저장소를 복사하는 방식은 아닙니다. 사용자가 직접 로그인했거나 logout/remove한 뒤에는 자동 복사를 반복하지 않습니다. 일반 CLI 도구는 ~/.agent-reach/sessions/<tool>/를 HOME/USERPROFILE로 사용합니다.
현재 TwitterChannel은 OpenCLI만 선언합니다. twitter-cli가 인증 실패 시 브라우저 쿠키를 다시 읽는다는 이유로 사용하지 않는다는 코드 주석이 있습니다. 옛 twitter-cli→OpenCLI→bird 순서를 현재 구조로 안내하면 안 됩니다.
agent_reach/
├─ cli.py 프로그램 진입점
├─ config.py 사용자 설정
├─ channels/
│ ├─ base.py Channel·Action·Param
│ ├─ __init__.py 실제 14채널 등록
│ └─ twitter.py · web.py ... 플랫폼별 동작·백엔드
├─ runtime/
│ ├─ dispatch.py · result.py 실행·공통 JSON·오류
│ ├─ tools.py · manage.py 도구 설치·채널 관리
│ ├─ sessions.py 원시 CLI 로그인 디렉터리
│ ├─ browser*.py 전용 브라우저와 동시성
│ ├─ session_reuse.py 사이트별 기존 로그인 복사
│ └─ state.py 관리 상태
├─ backends/ OpenCLI·브라우저 등 어댑터
└─ skill/ 에이전트 사용 지침
docs/install.md 1.6 설치·업데이트·이전 버전 이전
기존의 core.py → doctor.py 위임 구조를 현재 파일 지도에 남기지 않습니다. 채널에서 actions를 먼저 읽고 dispatcher와 result를 따라가면 “무엇을 할 수 있고 실패를 어떻게 표현하는가”를 확인할 수 있습니다.
| 목적 | 확인할 조건 |
|---|---|
| 소스 학습 | Git·편집기. 계정·키·모델 실행 불필요 |
| 기본 CLI | Python 3.10+와 공식 설치 문서의 uv 경로 |
| 채널 추가 | 도구·Node·브라우저·ffmpeg 등 prereqs가 채널별로 다름. add/setup이 설치와 상태 변경을 할 수 있음 |
| 로그인 채널 | 전용 브라우저 세션. 기존 사이트 로그인이 복사될 수 있으므로 사용할 계정을 확인 |
| 전사 | 기능별 Groq/OpenAI 키·네트워크·비용 확인 |
현재 문서는 모든 채널에 Docker나 동일 Node 최소 버전을 요구하지 않습니다. 확인하지 않은 RAM·디스크·실행 속도 최솟값도 만들지 않습니다. PyPI 동명 패키지는 이 프로젝트가 아니므로 설치 출처를 확인해야 합니다. 검색·읽기 전용이라는 제품 설명과 플랫폼이 자동 접근을 허용한다는 판단은 별개입니다.
PIN=14c213405669414492bda0f8d52cc6531d062c45
git show "$PIN:pyproject.toml"
git show "$PIN:agent_reach/channels/__init__.py"
git show "$PIN:agent_reach/channels/base.py"완료 기준: 등록 14채널을 level별로 나누고 Action 하나의 Param·backend를 적습니다.
자신의 별도 테스트 환경에서 선택할 수 있는 공식 설치 예시입니다. setup은 도구·스킬을 설치하고 상태를 바꾸므로 실행 전 내용을 확인합니다. 분석에서는 실행하지 않았습니다.
uv tool install https://github.com/Panniantong/Agent-Reach/releases/latest/download/agent-reach.zip
agent-reach setup
agent-reach channels
agent-reach read https://www.v2ex.com/t/123
마지막 URL은 문서에 나온 명령 형식 예시이며 특정 게시물의 존재·접근 성공을 보장하지 않습니다. 자신이 확인한 공개 URL로 바꾸고 반환 JSON의 ok·backend·출처를 기록합니다. 처음부터 개인 계정이나 SNS 쿠키를 넣을 필요는 없습니다.
가상의 JSON fixture에 ok:false·RATE_LIMITED, ok:false·NEED_LOGIN, ok:true·items:[]를 각각 만듭니다. 완료 기준: 대기·사용자 로그인·빈 결과를 서로 다른 상태로 표시하는 설계표를 작성합니다. 실제 플랫폼 요청 없이 할 수 있습니다.
git show "$PIN:agent_reach/runtime/sessions.py"
git show "$PIN:agent_reach/skill/references/sessions.md"
git show "$PIN:agent_reach/channels/twitter.py"기존 로그인 복사·직접 로그인·logout/remove 이후 상태를 표로 적습니다. 완료 기준은 재로그인이나 전체 쿠키 추출을 자동으로 반복하지 않아야 할 조건을 설명하는 것입니다. 이 과제는 실제 브라우저·비밀번호·쿠키 파일을 읽지 않습니다.
| 주차 | 읽기와 산출물 |
|---|---|
| 1주 | 채널별 Param·Action을 CLI 입력 표와 연결 |
| 2주 | dispatcher·result에서 오류별 재시도·중단 상태도 작성 |
| 3주 | sessions·소유권·브라우저 로그인 상태와 제거 조건 대조 |
| 4주 | 공개 URL fixture로 결과 계약을 쓰는 작은 소비자 설계. 실제 사이트 가용성은 별도 검증 |
| 용어 | 현재 코드에서의 뜻 |
|---|---|
| Channel / Action | 플랫폼 단위 / 그 플랫폼의 search·read 등 실행 계약 |
| Level | default·optional·experimental의 관리 분류. 옛 숫자 tier와 다름 |
| Backend | 동작을 실제 수행하는 원시 CLI·API·브라우저 구현 |
| Envelope | 성공·결과·메타·오류를 함께 담는 JSON 바깥 구조 |
| Cooldown / deadline | 제한 뒤 대기 상태 / 한 실행에서 사용할 수 있는 시간 한계 |
| Site-scoped session | 사이트별로 복사·보존·해제하는 로그인 상태 |
본문의 소스 근거를 분석 커밋에 고정했습니다.