rename: Agent Eyes → Agent Reach
全局重命名: - 包名: agent_eyes → agent_reach - CLI: agent-eyes → agent-reach - 类名: AgentEyes → AgentReach - 显示名: Agent Eyes → Agent Reach - GitHub: Panniantong/agent-eyes → Panniantong/Agent-Reach 所有 36 个测试通过,CLI/doctor/read/search 全部正常。
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
<p align="center">
|
||||
<img src="docs/assets/logo.png" alt="Agent Eyes" width="200">
|
||||
<img src="docs/assets/logo.png" alt="Agent Reach" width="200">
|
||||
</p>
|
||||
|
||||
<h1 align="center">👁️ Agent Eyes</h1>
|
||||
<h1 align="center">👁️ Agent Reach</h1>
|
||||
|
||||
<p align="center">
|
||||
<strong>给你的 AI Agent 一键装上互联网能力</strong>
|
||||
@@ -11,7 +11,7 @@
|
||||
<p align="center">
|
||||
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
|
||||
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/Python-3.8+-green.svg?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.8+"></a>
|
||||
<a href="https://github.com/Panniantong/agent-eyes/stargazers"><img src="https://img.shields.io/github/stars/Panniantong/agent-eyes?style=for-the-badge" alt="GitHub Stars"></a>
|
||||
<a href="https://github.com/Panniantong/agent-reach/stargazers"><img src="https://img.shields.io/github/stars/Panniantong/agent-reach?style=for-the-badge" alt="GitHub Stars"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
---
|
||||
|
||||
## 为什么需要 Agent Eyes?
|
||||
## 为什么需要 Agent Reach?
|
||||
|
||||
AI Agent 已经能访问互联网——但只是"能上网"而已。
|
||||
|
||||
@@ -35,10 +35,10 @@ AI Agent 已经能访问互联网——但只是"能上网"而已。
|
||||
|
||||
你要让 Agent 接入这些平台,就得一个一个去踩坑、装工具、调配置。
|
||||
|
||||
**Agent Eyes 把这件事变成一行命令:**
|
||||
**Agent Reach 把这件事变成一行命令:**
|
||||
|
||||
```
|
||||
帮我安装 Agent Eyes:https://raw.githubusercontent.com/Panniantong/agent-eyes/main/docs/install.md
|
||||
帮我安装 Agent Reach:https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md
|
||||
```
|
||||
|
||||
复制给你的 Agent,30 秒后它就能读推特、搜 Reddit、看 B站了。
|
||||
@@ -51,7 +51,7 @@ AI Agent 已经能访问互联网——但只是"能上网"而已。
|
||||
| 🔒 **隐私安全** | Cookie 只存在你本地,不上传不外传。代码完全开源,随时可审查 |
|
||||
| 🔄 **持续更新** | 底层工具(yt-dlp、birdx、Jina Reader 等)定期追踪更新到最新版,你不用自己盯 |
|
||||
| 🤖 **兼容所有 Agent** | Claude Code、OpenClaw、Cursor、Windsurf……任何能跑命令行的 Agent 都能用 |
|
||||
| 🩺 **自带诊断** | `agent-eyes doctor` 一条命令告诉你哪个通、哪个不通、怎么修 |
|
||||
| 🩺 **自带诊断** | `agent-reach doctor` 一条命令告诉你哪个通、哪个不通、怎么修 |
|
||||
|
||||
---
|
||||
|
||||
@@ -78,7 +78,7 @@ AI Agent 已经能访问互联网——但只是"能上网"而已。
|
||||
复制给你的 AI Agent(Claude Code、OpenClaw、Cursor 等):
|
||||
|
||||
```
|
||||
帮我安装 Agent Eyes:https://raw.githubusercontent.com/Panniantong/agent-eyes/main/docs/install.md
|
||||
帮我安装 Agent Reach:https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md
|
||||
```
|
||||
|
||||
Agent 自动安装、检测环境、告诉你哪些功能已经可以用。
|
||||
@@ -87,8 +87,8 @@ Agent 自动安装、检测环境、告诉你哪些功能已经可以用。
|
||||
<summary>手动安装</summary>
|
||||
|
||||
```bash
|
||||
pip install https://github.com/Panniantong/agent-eyes/archive/main.zip
|
||||
agent-eyes install --env=auto
|
||||
pip install https://github.com/Panniantong/agent-reach/archive/main.zip
|
||||
agent-reach install --env=auto
|
||||
```
|
||||
</details>
|
||||
|
||||
@@ -132,9 +132,9 @@ Reddit 和 B站封服务器 IP。买个代理(推荐 [Webshare](https://websha
|
||||
## 状态一目了然
|
||||
|
||||
```
|
||||
$ agent-eyes doctor
|
||||
$ agent-reach doctor
|
||||
|
||||
👁️ Agent Eyes 状态
|
||||
👁️ Agent Reach 状态
|
||||
========================================
|
||||
|
||||
✅ 装好即用:
|
||||
@@ -159,11 +159,11 @@ $ agent-eyes doctor
|
||||
|
||||
## 设计理念
|
||||
|
||||
**Agent Eyes 是一个 Agent 初始化脚手架,不是框架。**
|
||||
**Agent Reach 是一个 Agent 初始化脚手架,不是框架。**
|
||||
|
||||
你给一个新 Agent 装环境的时候,总要花时间去找工具、装依赖、调配置——Twitter 用什么读?Reddit 怎么绕封?YouTube 字幕怎么提取?每次都要重新踩一遍。
|
||||
|
||||
Agent Eyes 做的事情很简单:**帮你把这些选型和配置的活儿做完了。**
|
||||
Agent Reach 做的事情很简单:**帮你把这些选型和配置的活儿做完了。**
|
||||
|
||||
| 场景 | 选型 | 为什么选它 |
|
||||
|------|------|-----------|
|
||||
@@ -179,7 +179,7 @@ Agent Eyes 做的事情很简单:**帮你把这些选型和配置的活儿做
|
||||
<summary>项目结构</summary>
|
||||
|
||||
```
|
||||
agent_eyes/channels/
|
||||
agent_reach/channels/
|
||||
├── web.py → Jina Reader
|
||||
├── twitter.py → birdx
|
||||
├── youtube.py → yt-dlp
|
||||
@@ -196,7 +196,7 @@ agent_eyes/channels/
|
||||
|
||||
## 贡献
|
||||
|
||||
欢迎提 [Issue](https://github.com/Panniantong/agent-eyes/issues) 和 [PR](https://github.com/Panniantong/agent-eyes/pulls)。
|
||||
欢迎提 [Issue](https://github.com/Panniantong/agent-reach/issues) 和 [PR](https://github.com/Panniantong/agent-reach/pulls)。
|
||||
|
||||
想加新平台?复制任意一个 channel 文件,改改就行——每个文件只有 ~50 行。
|
||||
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Agent Eyes — Give your AI Agent eyes to see the entire internet."""
|
||||
|
||||
__version__ = "1.0.0"
|
||||
__author__ = "Neo Reid"
|
||||
|
||||
from agent_eyes.core import AgentEyes
|
||||
|
||||
__all__ = ["AgentEyes"]
|
||||
@@ -1,65 +0,0 @@
|
||||
---
|
||||
name: agent-eyes
|
||||
description: "Give your AI Agent eyes to see the entire internet. Search + read 10+ platforms with one install."
|
||||
install: pip install git+https://github.com/Panniantong/agent-eyes.git
|
||||
---
|
||||
|
||||
# Agent Eyes — 给 Agent 装上眼睛 👁️
|
||||
|
||||
安装后你就能搜索和阅读全网内容。
|
||||
|
||||
## 安装
|
||||
|
||||
```bash
|
||||
pip install git+https://github.com/Panniantong/agent-eyes.git
|
||||
```
|
||||
|
||||
## 装完直接能用的(零配置)
|
||||
|
||||
- `agent-eyes read <URL>` — 读取任意网页、GitHub、B站、YouTube、RSS
|
||||
- `agent-eyes search-github "query"` — 搜索 GitHub 仓库
|
||||
- `agent-eyes doctor` — 查看所有平台状态
|
||||
|
||||
## 解锁更多功能
|
||||
|
||||
运行 `agent-eyes setup` 进行交互式配置,或者读取以下指南:
|
||||
|
||||
| 功能 | 指南文件 |
|
||||
|------|---------|
|
||||
| 全网搜索 + Reddit搜索 + Twitter搜索 | `agent_eyes/guides/setup-exa.md` |
|
||||
| Reddit 完整阅读 | `agent_eyes/guides/setup-reddit.md` |
|
||||
| Twitter 高级(时间线/线程) | `agent_eyes/guides/setup-twitter.md` |
|
||||
| 小红书 | `agent_eyes/guides/setup-xiaohongshu.md` |
|
||||
| 微信公众号 | `agent_eyes/guides/setup-wechat.md` |
|
||||
| 视频语音转文字 | `agent_eyes/guides/setup-groq.md` |
|
||||
|
||||
每个指南里有详细的步骤说明,你(Agent)可以照着做,只有需要人类操作的部分(登录、复制 key)才需要问用户。
|
||||
|
||||
## MCP Server
|
||||
|
||||
如果你的 Agent 平台支持 MCP:
|
||||
|
||||
```bash
|
||||
pip install agent-eyes[mcp]
|
||||
python -m agent_eyes.integrations.mcp_server
|
||||
```
|
||||
|
||||
提供 8 个工具:read_url, read_batch, detect_platform, search, search_reddit, search_github, search_twitter, get_status
|
||||
|
||||
## Python API
|
||||
|
||||
```python
|
||||
from agent_eyes import AgentEyes
|
||||
import asyncio
|
||||
|
||||
eyes = AgentEyes()
|
||||
|
||||
# 读取
|
||||
result = asyncio.run(eyes.read("https://github.com/openai/gpt-4"))
|
||||
|
||||
# 搜索
|
||||
results = asyncio.run(eyes.search("AI agent framework"))
|
||||
|
||||
# 健康检查
|
||||
print(eyes.doctor_report())
|
||||
```
|
||||
@@ -0,0 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Agent Reach — Give your AI Agent eyes to see the entire internet."""
|
||||
|
||||
__version__ = "1.0.0"
|
||||
__author__ = "Neo Reid"
|
||||
|
||||
from agent_reach.core import AgentReach
|
||||
|
||||
__all__ = ["AgentReach"]
|
||||
@@ -2,7 +2,7 @@
|
||||
"""
|
||||
Channel registry — routes URLs to the right channel.
|
||||
|
||||
This is the core of Agent Eyes' pluggable architecture.
|
||||
This is the core of Agent Reach' pluggable architecture.
|
||||
Add a new channel: just create a file and register it here.
|
||||
Swap a backend: just change the implementation inside the channel file.
|
||||
"""
|
||||
@@ -123,7 +123,7 @@ class Channel(ABC):
|
||||
# Check required config
|
||||
for key in self.requires_config:
|
||||
if config and not config.get(key):
|
||||
return "off", f"需要配置 {key},运行 agent-eyes setup"
|
||||
return "off", f"需要配置 {key},运行 agent-reach setup"
|
||||
|
||||
return "ok", f"{'、'.join(self.backends) if self.backends else '内置'}"
|
||||
|
||||
@@ -34,7 +34,7 @@ class BilibiliChannel(Channel):
|
||||
]
|
||||
is_server = any(indicators)
|
||||
if is_server:
|
||||
return "warn", "服务器 IP 可能被封,配置代理即可解决:agent-eyes configure proxy URL"
|
||||
return "warn", "服务器 IP 可能被封,配置代理即可解决:agent-reach configure proxy URL"
|
||||
return "ok", "本地直连可用"
|
||||
|
||||
async def read(self, url: str, config=None) -> ReadResult:
|
||||
@@ -52,7 +52,7 @@ class BilibiliChannel(Channel):
|
||||
|
||||
if not bv_id:
|
||||
# Fallback to Jina Reader
|
||||
from agent_eyes.channels.web import WebChannel
|
||||
from agent_reach.channels.web import WebChannel
|
||||
return await WebChannel().read(url, config)
|
||||
|
||||
# Get video info
|
||||
@@ -75,7 +75,7 @@ class BilibiliChannel(Channel):
|
||||
title=f"Bilibili: {bv_id}",
|
||||
content=f"⚠️ Bilibili blocked this request ({msg}). "
|
||||
f"This usually means the server IP is blocked. "
|
||||
f"Try: agent-eyes configure proxy http://user:pass@ip:port",
|
||||
f"Try: agent-reach configure proxy http://user:pass@ip:port",
|
||||
url=url,
|
||||
platform="bilibili",
|
||||
)
|
||||
@@ -1,5 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Exa semantic search — the search backbone for Agent Eyes.
|
||||
"""Exa semantic search — the search backbone for Agent Reach.
|
||||
|
||||
Backend: Exa API (https://exa.ai) — free 1000 searches/month
|
||||
Swap to: Tavily, SerpAPI, or any search API
|
||||
@@ -37,7 +37,7 @@ class ExaSearchChannel(Channel):
|
||||
raise ValueError(
|
||||
"Exa API key not configured.\n"
|
||||
"Get a free key at https://exa.ai (1000 searches/month free)\n"
|
||||
"Then run: agent-eyes setup"
|
||||
"Then run: agent-reach setup"
|
||||
)
|
||||
|
||||
async def search(self, query: str, config=None, **kwargs) -> List[SearchResult]:
|
||||
@@ -31,9 +31,9 @@ class RedditChannel(Channel):
|
||||
elif proxy:
|
||||
return "ok", "代理已配置,可读取帖子。配置 REDDIT_CLIENT_ID/SECRET 可解锁高级搜索和发帖"
|
||||
elif has_bot:
|
||||
return "warn", "OAuth Bot 已配置,但服务器直连可能被封。配个代理更稳定:agent-eyes configure proxy URL"
|
||||
return "warn", "OAuth Bot 已配置,但服务器直连可能被封。配个代理更稳定:agent-reach configure proxy URL"
|
||||
else:
|
||||
return "off", "搜索用 Exa 免费可用。读帖子需配个代理:agent-eyes configure proxy URL"
|
||||
return "off", "搜索用 Exa 免费可用。读帖子需配个代理:agent-reach configure proxy URL"
|
||||
|
||||
async def read(self, url: str, config=None) -> ReadResult:
|
||||
proxy = config.get("reddit_proxy") if config else None
|
||||
@@ -63,10 +63,10 @@ class RedditChannel(Channel):
|
||||
title="Reddit",
|
||||
content="⚠️ Reddit blocked this request (403 Forbidden). "
|
||||
"Reddit blocks most server IPs.\n"
|
||||
"Fix: agent-eyes configure proxy http://user:pass@ip:port\n"
|
||||
"Fix: agent-reach configure proxy http://user:pass@ip:port\n"
|
||||
"Cheap option: https://www.webshare.io ($1/month)\n\n"
|
||||
"Alternatively, search Reddit via Exa (free, no proxy needed): "
|
||||
"agent-eyes search-reddit \"your query\"",
|
||||
"agent-reach search-reddit \"your query\"",
|
||||
url=url,
|
||||
platform="reddit",
|
||||
)
|
||||
@@ -145,6 +145,6 @@ class TwitterChannel(Channel):
|
||||
return results
|
||||
|
||||
async def _search_exa(self, query: str, limit: int, config=None) -> List[SearchResult]:
|
||||
from agent_eyes.channels.exa_search import ExaSearchChannel
|
||||
from agent_reach.channels.exa_search import ExaSearchChannel
|
||||
exa = ExaSearchChannel()
|
||||
return await exa.search(f"site:x.com {query}", config=config, limit=limit)
|
||||
@@ -26,7 +26,7 @@ class XiaoHongShuChannel(Channel):
|
||||
cookie = config.get("xhs_cookie") if config else None
|
||||
if cookie:
|
||||
return "ok", "Cookie 已配置,完整可用"
|
||||
return "off", "需要配置 Cookie 才能访问。导入浏览器 Cookie 即可:agent-eyes configure --from-browser chrome"
|
||||
return "off", "需要配置 Cookie 才能访问。导入浏览器 Cookie 即可:agent-reach configure --from-browser chrome"
|
||||
|
||||
async def read(self, url: str, config=None) -> ReadResult:
|
||||
cookie = config.get("xhs_cookie") if config else None
|
||||
@@ -35,7 +35,7 @@ class XiaoHongShuChannel(Channel):
|
||||
return ReadResult(
|
||||
title="XiaoHongShu",
|
||||
content="⚠️ XiaoHongShu requires cookies to access.\n"
|
||||
"Set up: agent-eyes configure xhs-cookie \"YOUR_COOKIE_STRING\"\n"
|
||||
"Set up: agent-reach configure xhs-cookie \"YOUR_COOKIE_STRING\"\n"
|
||||
"How to get it: install Cookie-Editor extension → go to xiaohongshu.com → Export → Header String",
|
||||
url=url,
|
||||
platform="xiaohongshu",
|
||||
@@ -44,7 +44,7 @@ class XiaoHongShuChannel(Channel):
|
||||
# Extract note ID from URL
|
||||
note_id = self._extract_note_id(url)
|
||||
if not note_id:
|
||||
from agent_eyes.channels.web import WebChannel
|
||||
from agent_reach.channels.web import WebChannel
|
||||
return await WebChannel().read(url, config)
|
||||
|
||||
headers = {
|
||||
@@ -1,16 +1,16 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Agent Eyes CLI — command-line interface.
|
||||
Agent Reach CLI — command-line interface.
|
||||
|
||||
Usage:
|
||||
agent-eyes read <url>
|
||||
agent-eyes search <query>
|
||||
agent-eyes search-reddit <query> [--sub <subreddit>]
|
||||
agent-eyes search-github <query> [--lang <language>]
|
||||
agent-eyes search-twitter <query>
|
||||
agent-eyes setup
|
||||
agent-eyes doctor
|
||||
agent-eyes version
|
||||
agent-reach read <url>
|
||||
agent-reach search <query>
|
||||
agent-reach search-reddit <query> [--sub <subreddit>]
|
||||
agent-reach search-github <query> [--lang <language>]
|
||||
agent-reach search-twitter <query>
|
||||
agent-reach setup
|
||||
agent-reach doctor
|
||||
agent-reach version
|
||||
"""
|
||||
|
||||
import sys
|
||||
@@ -19,7 +19,7 @@ import argparse
|
||||
import json
|
||||
import os
|
||||
|
||||
from agent_eyes import __version__
|
||||
from agent_reach import __version__
|
||||
|
||||
|
||||
def _configure_logging(verbose: bool = False):
|
||||
@@ -32,7 +32,7 @@ def _configure_logging(verbose: bool = False):
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="agent-eyes",
|
||||
prog="agent-reach",
|
||||
description="👁️ Give your AI Agent eyes to see the entire internet",
|
||||
)
|
||||
parser.add_argument("-v", "--verbose", action="store_true", help="Show debug logs")
|
||||
@@ -106,7 +106,7 @@ def main():
|
||||
sys.exit(0)
|
||||
|
||||
if args.command == "version":
|
||||
print(f"Agent Eyes v{__version__}")
|
||||
print(f"Agent Reach v{__version__}")
|
||||
sys.exit(0)
|
||||
|
||||
if args.command == "doctor":
|
||||
@@ -129,12 +129,12 @@ def main():
|
||||
def _cmd_install(args):
|
||||
"""One-shot deterministic installer."""
|
||||
import os
|
||||
from agent_eyes.config import Config
|
||||
from agent_eyes.doctor import check_all, format_report
|
||||
from agent_reach.config import Config
|
||||
from agent_reach.doctor import check_all, format_report
|
||||
|
||||
config = Config()
|
||||
print()
|
||||
print("👁️ Agent Eyes Installer")
|
||||
print("👁️ Agent Reach Installer")
|
||||
print("=" * 40)
|
||||
|
||||
# Auto-detect environment
|
||||
@@ -169,7 +169,7 @@ def _cmd_install(args):
|
||||
print()
|
||||
print("🍪 Trying to import cookies from browser...")
|
||||
try:
|
||||
from agent_eyes.cookie_extract import configure_from_browser
|
||||
from agent_reach.cookie_extract import configure_from_browser
|
||||
results = configure_from_browser("chrome", config)
|
||||
found = False
|
||||
for platform, success, message in results:
|
||||
@@ -193,7 +193,7 @@ def _cmd_install(args):
|
||||
print()
|
||||
print("💡 Tip: Reddit and Bilibili block server IPs.")
|
||||
print(" Reddit search still works via Exa (free).")
|
||||
print(" For full access: agent-eyes configure proxy http://user:pass@ip:port")
|
||||
print(" For full access: agent-reach configure proxy http://user:pass@ip:port")
|
||||
print(" Cheap option: https://www.webshare.io ($1/month)")
|
||||
|
||||
# Test channels
|
||||
@@ -207,7 +207,7 @@ def _cmd_install(args):
|
||||
if not config.get("exa_api_key"):
|
||||
print()
|
||||
print("🔍 Recommended: unlock search with a free Exa API key")
|
||||
print(" agent-eyes configure exa-key YOUR_KEY")
|
||||
print(" agent-reach configure exa-key YOUR_KEY")
|
||||
print(" Get free key: https://exa.ai")
|
||||
|
||||
# Final status
|
||||
@@ -260,13 +260,13 @@ def _detect_environment():
|
||||
|
||||
def _cmd_configure(args):
|
||||
"""Set a config value and test it, or auto-extract from browser."""
|
||||
from agent_eyes.config import Config
|
||||
from agent_reach.config import Config
|
||||
|
||||
config = Config()
|
||||
|
||||
# ── Auto-extract from browser ──
|
||||
if args.from_browser:
|
||||
from agent_eyes.cookie_extract import configure_from_browser
|
||||
from agent_reach.cookie_extract import configure_from_browser
|
||||
|
||||
browser = args.from_browser
|
||||
print(f"🔍 Extracting cookies from {browser}...")
|
||||
@@ -284,15 +284,15 @@ def _cmd_configure(args):
|
||||
|
||||
print()
|
||||
if found_any:
|
||||
print("✅ Cookies configured! Run `agent-eyes doctor` to see updated status.")
|
||||
print("✅ Cookies configured! Run `agent-reach doctor` to see updated status.")
|
||||
else:
|
||||
print(f"No cookies found. Make sure you're logged into the platforms in {browser}.")
|
||||
return
|
||||
|
||||
# ── Manual configure ──
|
||||
if not args.key:
|
||||
print("Usage: agent-eyes configure <key> <value>")
|
||||
print(" or: agent-eyes configure --from-browser chrome")
|
||||
print("Usage: agent-reach configure <key> <value>")
|
||||
print(" or: agent-reach configure --from-browser chrome")
|
||||
return
|
||||
|
||||
value = " ".join(args.value) if args.value else ""
|
||||
@@ -329,8 +329,8 @@ def _cmd_configure(args):
|
||||
print("Testing search...", end=" ")
|
||||
try:
|
||||
import asyncio
|
||||
from agent_eyes.core import AgentEyes
|
||||
eyes = AgentEyes(config)
|
||||
from agent_reach.core import AgentReach
|
||||
eyes = AgentReach(config)
|
||||
results = asyncio.run(eyes.search("test", num_results=1))
|
||||
if results:
|
||||
print("✅ Search works!")
|
||||
@@ -383,8 +383,8 @@ def _cmd_configure(args):
|
||||
else:
|
||||
print("❌ Could not find auth_token and ct0 in your input.")
|
||||
print(" Accepted formats:")
|
||||
print(" 1. agent-eyes configure twitter-cookies AUTH_TOKEN CT0")
|
||||
print(' 2. agent-eyes configure twitter-cookies "auth_token=xxx; ct0=yyy; ..."')
|
||||
print(" 1. agent-reach configure twitter-cookies AUTH_TOKEN CT0")
|
||||
print(' 2. agent-reach configure twitter-cookies "auth_token=xxx; ct0=yyy; ..."')
|
||||
|
||||
elif args.key == "xhs-cookie":
|
||||
config.set("xhs_cookie", value)
|
||||
@@ -423,19 +423,19 @@ def _cmd_configure(args):
|
||||
|
||||
|
||||
def _cmd_doctor():
|
||||
from agent_eyes.config import Config
|
||||
from agent_eyes.doctor import check_all, format_report
|
||||
from agent_reach.config import Config
|
||||
from agent_reach.doctor import check_all, format_report
|
||||
config = Config()
|
||||
results = check_all(config)
|
||||
print(format_report(results))
|
||||
|
||||
|
||||
def _cmd_setup():
|
||||
from agent_eyes.config import Config
|
||||
from agent_reach.config import Config
|
||||
|
||||
config = Config()
|
||||
print()
|
||||
print("👁️ Agent Eyes Setup")
|
||||
print("👁️ Agent Reach Setup")
|
||||
print("=" * 40)
|
||||
print()
|
||||
|
||||
@@ -461,7 +461,7 @@ def _cmd_setup():
|
||||
config.set("exa_api_key", key)
|
||||
print(" ✅ 全网搜索 + Reddit搜索 + Twitter搜索 已开启!")
|
||||
else:
|
||||
print(" ℹ️ 跳过。稍后可运行 agent-eyes setup 配置")
|
||||
print(" ℹ️ 跳过。稍后可运行 agent-reach setup 配置")
|
||||
print()
|
||||
|
||||
# Step 2: GitHub token
|
||||
@@ -514,13 +514,13 @@ def _cmd_setup():
|
||||
# Summary
|
||||
print("=" * 40)
|
||||
print(f"✅ 配置已保存到 {config.config_path}")
|
||||
print("运行 agent-eyes doctor 查看完整状态")
|
||||
print("运行 agent-reach doctor 查看完整状态")
|
||||
print()
|
||||
|
||||
|
||||
async def _cmd_read(args):
|
||||
from agent_eyes.core import AgentEyes
|
||||
eyes = AgentEyes()
|
||||
from agent_reach.core import AgentReach
|
||||
eyes = AgentReach()
|
||||
try:
|
||||
result = await eyes.read(args.url)
|
||||
if args.as_json:
|
||||
@@ -537,8 +537,8 @@ async def _cmd_read(args):
|
||||
|
||||
|
||||
async def _cmd_search(args):
|
||||
from agent_eyes.core import AgentEyes
|
||||
eyes = AgentEyes()
|
||||
from agent_reach.core import AgentReach
|
||||
eyes = AgentReach()
|
||||
query = " ".join(args.query).strip()
|
||||
num = args.num
|
||||
|
||||
@@ -563,12 +563,12 @@ async def _cmd_search(args):
|
||||
if "401" in error_str or "Unauthorized" in error_str:
|
||||
print("⚠️ Exa API key not configured or invalid.")
|
||||
print("Get a free key at https://exa.ai (1000 searches/month free)")
|
||||
print("Then run: agent-eyes configure exa-key YOUR_KEY")
|
||||
print("Then run: agent-reach configure exa-key YOUR_KEY")
|
||||
sys.exit(1)
|
||||
elif "exa" in error_str.lower() or "api_key" in error_str.lower():
|
||||
print("⚠️ Exa API key not configured.")
|
||||
print("Get a free key at https://exa.ai")
|
||||
print("Then run: agent-eyes configure exa-key YOUR_KEY")
|
||||
print("Then run: agent-reach configure exa-key YOUR_KEY")
|
||||
sys.exit(1)
|
||||
else:
|
||||
print(f"❌ Error: {e}", file=sys.stderr)
|
||||
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Configuration management for Agent Eyes.
|
||||
"""Configuration management for Agent Reach.
|
||||
|
||||
Stores settings in ~/.agent-eyes/config.yaml.
|
||||
Stores settings in ~/.agent-reach/config.yaml.
|
||||
Auto-creates directory on first use.
|
||||
"""
|
||||
|
||||
@@ -13,9 +13,9 @@ import yaml
|
||||
|
||||
|
||||
class Config:
|
||||
"""Manages Agent Eyes configuration."""
|
||||
"""Manages Agent Reach configuration."""
|
||||
|
||||
CONFIG_DIR = Path.home() / ".agent-eyes"
|
||||
CONFIG_DIR = Path.home() / ".agent-reach"
|
||||
CONFIG_FILE = CONFIG_DIR / "config.yaml"
|
||||
|
||||
# Feature → required config keys
|
||||
@@ -5,7 +5,7 @@ Supports: Chrome, Firefox, Edge, Brave, Opera
|
||||
Extracts: Twitter, XiaoHongShu, Bilibili cookies in one shot.
|
||||
|
||||
Usage:
|
||||
agent-eyes configure --from-browser chrome
|
||||
agent-reach configure --from-browser chrome
|
||||
"""
|
||||
|
||||
import sys
|
||||
@@ -1,14 +1,14 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
AgentEyes — the unified entry point.
|
||||
AgentReach — the unified entry point.
|
||||
|
||||
Pure glue: routes URLs to the right channel, routes searches to the right engine.
|
||||
Every channel is a thin wrapper around an external tool. Swap any backend anytime.
|
||||
|
||||
Usage:
|
||||
from agent_eyes import AgentEyes
|
||||
from agent_reach import AgentReach
|
||||
|
||||
eyes = AgentEyes()
|
||||
eyes = AgentReach()
|
||||
content = await eyes.read("https://github.com/openai/gpt-4")
|
||||
results = await eyes.search("AI agent framework")
|
||||
"""
|
||||
@@ -16,11 +16,11 @@ Usage:
|
||||
import asyncio
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from agent_eyes.config import Config
|
||||
from agent_eyes.channels import get_channel_for_url, get_channel, get_all_channels
|
||||
from agent_reach.config import Config
|
||||
from agent_reach.channels import get_channel_for_url, get_channel, get_all_channels
|
||||
|
||||
|
||||
class AgentEyes:
|
||||
class AgentReach:
|
||||
"""Give your AI Agent eyes to see the entire internet."""
|
||||
|
||||
def __init__(self, config: Optional[Config] = None):
|
||||
@@ -87,12 +87,12 @@ class AgentEyes:
|
||||
|
||||
def doctor(self) -> Dict[str, dict]:
|
||||
"""Check all channel availability."""
|
||||
from agent_eyes.doctor import check_all
|
||||
from agent_reach.doctor import check_all
|
||||
return check_all(self.config)
|
||||
|
||||
def doctor_report(self) -> str:
|
||||
"""Get formatted health report."""
|
||||
from agent_eyes.doctor import check_all, format_report
|
||||
from agent_reach.doctor import check_all, format_report
|
||||
return format_report(check_all(self.config))
|
||||
|
||||
# ── Sync wrappers ───────────────────────────────────
|
||||
@@ -5,8 +5,8 @@ Each channel knows how to check itself. Doctor just collects the results.
|
||||
"""
|
||||
|
||||
from typing import Dict
|
||||
from agent_eyes.config import Config
|
||||
from agent_eyes.channels import get_all_channels
|
||||
from agent_reach.config import Config
|
||||
from agent_reach.channels import get_all_channels
|
||||
|
||||
|
||||
def check_all(config: Config) -> Dict[str, dict]:
|
||||
@@ -27,7 +27,7 @@ def check_all(config: Config) -> Dict[str, dict]:
|
||||
def format_report(results: Dict[str, dict]) -> str:
|
||||
"""Format results as a readable text report."""
|
||||
lines = []
|
||||
lines.append("👁️ Agent Eyes 状态")
|
||||
lines.append("👁️ Agent Reach 状态")
|
||||
lines.append("=" * 40)
|
||||
|
||||
ok_count = sum(1 for r in results.values() if r["status"] == "ok")
|
||||
@@ -72,6 +72,6 @@ def format_report(results: Dict[str, dict]) -> str:
|
||||
lines.append("")
|
||||
lines.append(f"状态:{ok_count}/{total} 个渠道可用")
|
||||
if ok_count < total:
|
||||
lines.append("运行 `agent-eyes setup` 解锁更多渠道")
|
||||
lines.append("运行 `agent-reach setup` 解锁更多渠道")
|
||||
|
||||
return "\n".join(lines)
|
||||
@@ -10,17 +10,17 @@ Exa 是一个语义搜索引擎,免费提供 1000 次/月搜索。配置后解
|
||||
|
||||
1. 检查是否已配置:
|
||||
```bash
|
||||
agent-eyes doctor | grep "Web Search"
|
||||
agent-reach doctor | grep "Web Search"
|
||||
```
|
||||
|
||||
2. 如果用户提供了 key,写入配置:
|
||||
```bash
|
||||
# 方法1: 通过 setup 命令
|
||||
agent-eyes setup
|
||||
agent-reach setup
|
||||
|
||||
# 方法2: 直接写入配置文件
|
||||
python3 -c "
|
||||
from agent_eyes.config import Config
|
||||
from agent_reach.config import Config
|
||||
c = Config()
|
||||
c.set('exa_api_key', '用户提供的KEY')
|
||||
print('✅ Exa API key saved')
|
||||
@@ -29,7 +29,7 @@ print('✅ Exa API key saved')
|
||||
|
||||
3. 测试是否有效:
|
||||
```bash
|
||||
agent-eyes search "test query" -n 1
|
||||
agent-reach search "test query" -n 1
|
||||
```
|
||||
|
||||
## 需要用户手动做的步骤
|
||||
@@ -7,12 +7,12 @@
|
||||
|
||||
1. 检查是否已配置:
|
||||
```bash
|
||||
agent-eyes doctor | grep -i "groq\|whisper"
|
||||
agent-reach doctor | grep -i "groq\|whisper"
|
||||
```
|
||||
|
||||
2. 如果用户提供了 key,写入配置:
|
||||
```python
|
||||
from agent_eyes.config import Config
|
||||
from agent_reach.config import Config
|
||||
c = Config()
|
||||
c.set("groq_api_key", "用户提供的KEY")
|
||||
```
|
||||
@@ -9,7 +9,7 @@ Reddit 封锁了大量服务器 IP,直接访问会返回 403。需要 ISP 代
|
||||
|
||||
1. 检查当前状态:
|
||||
```bash
|
||||
agent-eyes doctor | grep "Reddit"
|
||||
agent-reach doctor | grep "Reddit"
|
||||
```
|
||||
|
||||
2. 如果用户提供了代理,测试连通性:
|
||||
@@ -23,7 +23,7 @@ curl -s --proxy "用户提供的代理" \
|
||||
|
||||
3. 写入配置:
|
||||
```python
|
||||
from agent_eyes.config import Config
|
||||
from agent_reach.config import Config
|
||||
c = Config()
|
||||
c.set("reddit_proxy", "http://用户名:密码@IP:端口")
|
||||
```
|
||||
@@ -18,7 +18,7 @@ playwright install chromium
|
||||
|
||||
3. 安装完成后测试:
|
||||
```bash
|
||||
agent-eyes read "https://mp.weixin.qq.com/s/一个测试链接"
|
||||
agent-reach read "https://mp.weixin.qq.com/s/一个测试链接"
|
||||
```
|
||||
|
||||
## 需要用户手动做的步骤
|
||||
@@ -19,7 +19,7 @@ playwright install chromium
|
||||
3. 检查是否已有登录态:
|
||||
```bash
|
||||
# 检查 cookie 文件是否存在
|
||||
ls ~/.agent-eyes/xhs_cookies.json 2>/dev/null
|
||||
ls ~/.agent-reach/xhs_cookies.json 2>/dev/null
|
||||
```
|
||||
|
||||
## 需要用户手动做的步骤
|
||||
@@ -37,6 +37,6 @@ ls ~/.agent-eyes/xhs_cookies.json 2>/dev/null
|
||||
|
||||
## Agent 收到确认后的操作
|
||||
|
||||
1. 保存浏览器 cookie 到 `~/.agent-eyes/xhs_cookies.json`
|
||||
1. 保存浏览器 cookie 到 `~/.agent-reach/xhs_cookies.json`
|
||||
2. 测试:读取一条小红书笔记
|
||||
3. 反馈:"✅ 小红书已配置!现在我可以读取小红书笔记了。"
|
||||
@@ -1,8 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Agent Eyes MCP Server — expose all capabilities as MCP tools.
|
||||
Agent Reach MCP Server — expose all capabilities as MCP tools.
|
||||
|
||||
Run: python -m agent_eyes.integrations.mcp_server
|
||||
Run: python -m agent_reach.integrations.mcp_server
|
||||
|
||||
8 tools for any MCP-compatible AI Agent.
|
||||
"""
|
||||
@@ -11,8 +11,8 @@ import asyncio
|
||||
import json
|
||||
import sys
|
||||
|
||||
from agent_eyes.config import Config
|
||||
from agent_eyes.core import AgentEyes
|
||||
from agent_reach.config import Config
|
||||
from agent_reach.core import AgentReach
|
||||
|
||||
try:
|
||||
from mcp.server import Server
|
||||
@@ -25,12 +25,12 @@ except ImportError:
|
||||
|
||||
def create_server():
|
||||
if not HAS_MCP:
|
||||
print("MCP not installed. Install: pip install agent-eyes[mcp]", file=sys.stderr)
|
||||
print("MCP not installed. Install: pip install agent-reach[mcp]", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
server = Server("agent-eyes")
|
||||
server = Server("agent-reach")
|
||||
config = Config()
|
||||
eyes = AgentEyes(config)
|
||||
eyes = AgentReach(config)
|
||||
|
||||
@server.list_tools()
|
||||
async def list_tools():
|
||||
@@ -57,7 +57,7 @@ def create_server():
|
||||
description="Search Twitter/X posts.",
|
||||
inputSchema={"type": "object", "properties": {"query": {"type": "string"}, "limit": {"type": "integer", "default": 10}}, "required": ["query"]}),
|
||||
Tool(name="get_status",
|
||||
description="Get Agent Eyes status: which channels are active.",
|
||||
description="Get Agent Reach status: which channels are active.",
|
||||
inputSchema={"type": "object", "properties": {}}),
|
||||
]
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
name: agent-reach
|
||||
description: "Give your AI Agent eyes to see the entire internet. Search + read 10+ platforms with one install."
|
||||
install: pip install git+https://github.com/Panniantong/agent-reach.git
|
||||
---
|
||||
|
||||
# Agent Reach — 给 Agent 装上眼睛 👁️
|
||||
|
||||
安装后你就能搜索和阅读全网内容。
|
||||
|
||||
## 安装
|
||||
|
||||
```bash
|
||||
pip install git+https://github.com/Panniantong/agent-reach.git
|
||||
```
|
||||
|
||||
## 装完直接能用的(零配置)
|
||||
|
||||
- `agent-reach read <URL>` — 读取任意网页、GitHub、B站、YouTube、RSS
|
||||
- `agent-reach search-github "query"` — 搜索 GitHub 仓库
|
||||
- `agent-reach doctor` — 查看所有平台状态
|
||||
|
||||
## 解锁更多功能
|
||||
|
||||
运行 `agent-reach setup` 进行交互式配置,或者读取以下指南:
|
||||
|
||||
| 功能 | 指南文件 |
|
||||
|------|---------|
|
||||
| 全网搜索 + Reddit搜索 + Twitter搜索 | `agent_reach/guides/setup-exa.md` |
|
||||
| Reddit 完整阅读 | `agent_reach/guides/setup-reddit.md` |
|
||||
| Twitter 高级(时间线/线程) | `agent_reach/guides/setup-twitter.md` |
|
||||
| 小红书 | `agent_reach/guides/setup-xiaohongshu.md` |
|
||||
| 微信公众号 | `agent_reach/guides/setup-wechat.md` |
|
||||
| 视频语音转文字 | `agent_reach/guides/setup-groq.md` |
|
||||
|
||||
每个指南里有详细的步骤说明,你(Agent)可以照着做,只有需要人类操作的部分(登录、复制 key)才需要问用户。
|
||||
|
||||
## MCP Server
|
||||
|
||||
如果你的 Agent 平台支持 MCP:
|
||||
|
||||
```bash
|
||||
pip install agent-reach[mcp]
|
||||
python -m agent_reach.integrations.mcp_server
|
||||
```
|
||||
|
||||
提供 8 个工具:read_url, read_batch, detect_platform, search, search_reddit, search_github, search_twitter, get_status
|
||||
|
||||
## Python API
|
||||
|
||||
```python
|
||||
from agent_reach import AgentReach
|
||||
import asyncio
|
||||
|
||||
eyes = AgentReach()
|
||||
|
||||
# 读取
|
||||
result = asyncio.run(eyes.read("https://github.com/openai/gpt-4"))
|
||||
|
||||
# 搜索
|
||||
results = asyncio.run(eyes.search("AI agent framework"))
|
||||
|
||||
# 健康检查
|
||||
print(eyes.doctor_report())
|
||||
```
|
||||
+23
-23
@@ -1,8 +1,8 @@
|
||||
# 👁️ Agent Eyes
|
||||
# 👁️ Agent Reach
|
||||
|
||||
**Give your AI Agent eyes to see the entire internet.**
|
||||
|
||||
Your AI Agent is smart but blind. It can't browse Reddit, search Twitter, or read Bilibili videos. Agent Eyes fixes this — once installed, your Agent can search and read content across 10+ platforms.
|
||||
Your AI Agent is smart but blind. It can't browse Reddit, search Twitter, or read Bilibili videos. Agent Reach fixes this — once installed, your Agent can search and read content across 10+ platforms.
|
||||
|
||||
> Install once. Superpowers unlocked. Most features work with zero config, zero cost.
|
||||
|
||||
@@ -15,7 +15,7 @@ Your AI Agent is smart but blind. It can't browse Reddit, search Twitter, or rea
|
||||
Copy this to your AI Agent (Claude Code, OpenClaw, Cursor, etc.):
|
||||
|
||||
```
|
||||
Install Agent Eyes: https://raw.githubusercontent.com/Panniantong/agent-eyes/main/docs/install.md
|
||||
Install Agent Reach: https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md
|
||||
```
|
||||
|
||||
Your Agent handles everything. You answer 1-2 questions at most.
|
||||
@@ -24,9 +24,9 @@ Your Agent handles everything. You answer 1-2 questions at most.
|
||||
<summary>Manual install</summary>
|
||||
|
||||
```bash
|
||||
pip install https://github.com/Panniantong/agent-eyes/archive/main.zip
|
||||
agent-eyes install --env=auto
|
||||
agent-eyes doctor
|
||||
pip install https://github.com/Panniantong/agent-reach/archive/main.zip
|
||||
agent-reach install --env=auto
|
||||
agent-reach doctor
|
||||
```
|
||||
</details>
|
||||
|
||||
@@ -44,8 +44,8 @@ No configuration needed:
|
||||
- 🐦 **Twitter** — read individual tweets
|
||||
|
||||
```bash
|
||||
agent-eyes read "https://github.com/openai/gpt-4"
|
||||
agent-eyes search-github "LLM framework"
|
||||
agent-reach read "https://github.com/openai/gpt-4"
|
||||
agent-reach search-github "LLM framework"
|
||||
```
|
||||
|
||||
---
|
||||
@@ -55,10 +55,10 @@ agent-eyes search-github "LLM framework"
|
||||
Sign up at [Exa](https://exa.ai) (free, 1000 searches/month). One key unlocks **web + Reddit + Twitter search**:
|
||||
|
||||
```bash
|
||||
agent-eyes configure exa-key YOUR_KEY
|
||||
agent-eyes search "best open source LLM 2025"
|
||||
agent-eyes search-reddit "self-hosted LLM" --sub LocalLLaMA
|
||||
agent-eyes search-twitter "AI agent"
|
||||
agent-reach configure exa-key YOUR_KEY
|
||||
agent-reach search "best open source LLM 2025"
|
||||
agent-reach search-reddit "self-hosted LLM" --sub LocalLLaMA
|
||||
agent-reach search-twitter "AI agent"
|
||||
```
|
||||
|
||||
---
|
||||
@@ -69,11 +69,11 @@ agent-eyes search-twitter "AI agent"
|
||||
|
||||
```bash
|
||||
# Local: auto-import all cookies
|
||||
agent-eyes configure --from-browser chrome
|
||||
agent-reach configure --from-browser chrome
|
||||
|
||||
# Server: use Cookie-Editor extension, export Header String
|
||||
agent-eyes configure twitter-cookies "cookie_string"
|
||||
agent-eyes configure xhs-cookie "cookie_string"
|
||||
agent-reach configure twitter-cookies "cookie_string"
|
||||
agent-reach configure xhs-cookie "cookie_string"
|
||||
```
|
||||
|
||||
Unlocks: Twitter deep search, XiaoHongShu notes
|
||||
@@ -83,7 +83,7 @@ Unlocks: Twitter deep search, XiaoHongShu notes
|
||||
Reddit and Bilibili block server IPs. Local computers are fine.
|
||||
|
||||
```bash
|
||||
agent-eyes configure proxy http://user:pass@ip:port
|
||||
agent-reach configure proxy http://user:pass@ip:port
|
||||
```
|
||||
|
||||
Recommend [Webshare](https://webshare.io). One proxy covers both Reddit and Bilibili.
|
||||
@@ -95,24 +95,24 @@ Recommend [Webshare](https://webshare.io). One proxy covers both Reddit and Bili
|
||||
**CLI** · **Python API** · **MCP Server**
|
||||
|
||||
```bash
|
||||
agent-eyes read "URL"
|
||||
agent-eyes search "query"
|
||||
agent-eyes doctor
|
||||
agent-reach read "URL"
|
||||
agent-reach search "query"
|
||||
agent-reach doctor
|
||||
```
|
||||
|
||||
```python
|
||||
from agent_eyes import AgentEyes
|
||||
eyes = AgentEyes()
|
||||
from agent_reach import AgentReach
|
||||
eyes = AgentReach()
|
||||
result = asyncio.run(eyes.read("https://example.com"))
|
||||
```
|
||||
|
||||
```json
|
||||
{"mcpServers": {"agent-eyes": {"command": "python", "args": ["-m", "agent_eyes.integrations.mcp_server"]}}}
|
||||
{"mcpServers": {"agent-reach": {"command": "python", "args": ["-m", "agent_reach.integrations.mcp_server"]}}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Why Agent Eyes?
|
||||
## Why Agent Reach?
|
||||
|
||||
Not a framework. Not an SDK. Just glue — beautifully simple glue.
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ Here's how to export cookies from your local computer — **fastest method first
|
||||
|
||||
That's it! Your Agent will run:
|
||||
```bash
|
||||
agent-eyes configure twitter-cookies <your_pasted_string>
|
||||
agent-reach configure twitter-cookies <your_pasted_string>
|
||||
```
|
||||
|
||||
### Sites to export:
|
||||
|
||||
+17
-17
@@ -1,11 +1,11 @@
|
||||
# Agent Eyes — Installation Guide
|
||||
# Agent Reach — Installation Guide
|
||||
|
||||
## For Humans
|
||||
|
||||
Copy this to your AI Agent:
|
||||
|
||||
```
|
||||
帮我安装 Agent Eyes:https://raw.githubusercontent.com/Panniantong/agent-eyes/main/docs/install.md
|
||||
帮我安装 Agent Reach:https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md
|
||||
```
|
||||
|
||||
---
|
||||
@@ -15,8 +15,8 @@ Copy this to your AI Agent:
|
||||
### Step 1: Install
|
||||
|
||||
```bash
|
||||
pip install https://github.com/Panniantong/agent-eyes/archive/main.zip || pip3 install https://github.com/Panniantong/agent-eyes/archive/main.zip
|
||||
agent-eyes install --env=auto
|
||||
pip install https://github.com/Panniantong/agent-reach/archive/main.zip || pip3 install https://github.com/Panniantong/agent-reach/archive/main.zip
|
||||
agent-reach install --env=auto
|
||||
```
|
||||
|
||||
This single command does everything automatically:
|
||||
@@ -37,7 +37,7 @@ Only ask the user for items the install output says are missing.
|
||||
> "Want to unlock web search? Go to https://exa.ai → sign up (free) → send me the API key."
|
||||
|
||||
```bash
|
||||
agent-eyes configure exa-key THE_KEY
|
||||
agent-reach configure exa-key THE_KEY
|
||||
```
|
||||
|
||||
**If cookies were not auto-imported (server users):**
|
||||
@@ -45,21 +45,21 @@ agent-eyes configure exa-key THE_KEY
|
||||
> Extension: https://chromewebstore.google.com/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm
|
||||
|
||||
```bash
|
||||
agent-eyes configure twitter-cookies "PASTED_STRING"
|
||||
agent-eyes configure xhs-cookie "PASTED_STRING"
|
||||
agent-reach configure twitter-cookies "PASTED_STRING"
|
||||
agent-reach configure xhs-cookie "PASTED_STRING"
|
||||
```
|
||||
|
||||
**If on server and wants Reddit/Bilibili full access:**
|
||||
> "Reddit and Bilibili block server IPs. Get a proxy at https://webshare.io ($1/month) and send me the address."
|
||||
|
||||
```bash
|
||||
agent-eyes configure proxy http://user:pass@ip:port
|
||||
agent-reach configure proxy http://user:pass@ip:port
|
||||
```
|
||||
|
||||
### Step 3: Verify
|
||||
|
||||
```bash
|
||||
agent-eyes doctor
|
||||
agent-reach doctor
|
||||
```
|
||||
|
||||
Report what's active. Users can configure more anytime by asking.
|
||||
@@ -70,11 +70,11 @@ Report what's active. Users can configure more anytime by asking.
|
||||
|
||||
| Command | What it does |
|
||||
|---------|-------------|
|
||||
| `agent-eyes install --env=auto` | Full auto-setup |
|
||||
| `agent-eyes doctor` | Show status |
|
||||
| `agent-eyes configure exa-key KEY` | Unlock search |
|
||||
| `agent-eyes configure twitter-cookies "..."` | Unlock Twitter |
|
||||
| `agent-eyes configure xhs-cookie "..."` | Unlock XiaoHongShu |
|
||||
| `agent-eyes configure proxy URL` | Unlock Reddit + Bilibili (server) |
|
||||
| `agent-eyes read URL` | Read any URL |
|
||||
| `agent-eyes search "query"` | Search the web |
|
||||
| `agent-reach install --env=auto` | Full auto-setup |
|
||||
| `agent-reach doctor` | Show status |
|
||||
| `agent-reach configure exa-key KEY` | Unlock search |
|
||||
| `agent-reach configure twitter-cookies "..."` | Unlock Twitter |
|
||||
| `agent-reach configure xhs-cookie "..."` | Unlock XiaoHongShu |
|
||||
| `agent-reach configure proxy URL` | Unlock Reddit + Bilibili (server) |
|
||||
| `agent-reach read URL` | Read any URL |
|
||||
| `agent-reach search "query"` | Search the web |
|
||||
|
||||
+7
-7
@@ -1,5 +1,5 @@
|
||||
[project]
|
||||
name = "agent-eyes"
|
||||
name = "agent-reach"
|
||||
version = "1.0.0"
|
||||
description = "Give your AI Agent eyes to see the entire internet. Search + Read 10+ platforms."
|
||||
readme = "README.md"
|
||||
@@ -37,19 +37,19 @@ mcp = ["mcp[cli]>=1.0"]
|
||||
all = ["playwright>=1.40", "mcp[cli]>=1.0", "browser-cookie3>=0.19"]
|
||||
|
||||
[project.scripts]
|
||||
agent-eyes = "agent_eyes.cli:main"
|
||||
agent-reach = "agent_reach.cli:main"
|
||||
|
||||
[project.urls]
|
||||
Homepage = "https://github.com/Panniantong/agent-eyes"
|
||||
Repository = "https://github.com/Panniantong/agent-eyes"
|
||||
Issues = "https://github.com/Panniantong/agent-eyes/issues"
|
||||
Homepage = "https://github.com/Panniantong/agent-reach"
|
||||
Repository = "https://github.com/Panniantong/agent-reach"
|
||||
Issues = "https://github.com/Panniantong/agent-reach/issues"
|
||||
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[tool.hatch.build.targets.wheel]
|
||||
packages = ["agent_eyes"]
|
||||
packages = ["agent_reach"]
|
||||
|
||||
[tool.hatch.build.targets.wheel.force-include]
|
||||
"agent_eyes/guides" = "agent_eyes/guides"
|
||||
"agent_reach/guides" = "agent_reach/guides"
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
import pytest
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
from agent_eyes.channels import get_channel_for_url, get_channel, get_all_channels
|
||||
from agent_eyes.channels.base import ReadResult, SearchResult
|
||||
from agent_reach.channels import get_channel_for_url, get_channel, get_all_channels
|
||||
from agent_reach.channels.base import ReadResult, SearchResult
|
||||
|
||||
|
||||
class TestChannelRouting:
|
||||
@@ -74,7 +74,7 @@ class TestSearchResult:
|
||||
|
||||
|
||||
class TestGitHubChannel:
|
||||
@patch("agent_eyes.channels.github.requests.get")
|
||||
@patch("agent_reach.channels.github.requests.get")
|
||||
@pytest.mark.asyncio
|
||||
async def test_search(self, mock_get):
|
||||
mock_resp = MagicMock()
|
||||
@@ -93,10 +93,10 @@ class TestGitHubChannel:
|
||||
|
||||
|
||||
class TestExaSearch:
|
||||
@patch("agent_eyes.channels.exa_search.requests.post")
|
||||
@patch("agent_reach.channels.exa_search.requests.post")
|
||||
@pytest.mark.asyncio
|
||||
async def test_search(self, mock_post):
|
||||
from agent_eyes.config import Config
|
||||
from agent_reach.config import Config
|
||||
config = Config(config_path="/tmp/test-exa-config.yaml")
|
||||
config.set("exa_api_key", "test-key")
|
||||
|
||||
|
||||
+7
-7
@@ -1,29 +1,29 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Tests for Agent Eyes CLI."""
|
||||
"""Tests for Agent Reach CLI."""
|
||||
|
||||
import pytest
|
||||
from unittest.mock import patch
|
||||
from agent_eyes.cli import main
|
||||
from agent_reach.cli import main
|
||||
|
||||
|
||||
class TestCLI:
|
||||
def test_version(self, capsys):
|
||||
with pytest.raises(SystemExit) as exc_info:
|
||||
with patch("sys.argv", ["agent-eyes", "version"]):
|
||||
with patch("sys.argv", ["agent-reach", "version"]):
|
||||
main()
|
||||
assert exc_info.value.code == 0
|
||||
captured = capsys.readouterr()
|
||||
assert "Agent Eyes v" in captured.out
|
||||
assert "Agent Reach v" in captured.out
|
||||
|
||||
def test_no_command_shows_help(self, capsys):
|
||||
with pytest.raises(SystemExit) as exc_info:
|
||||
with patch("sys.argv", ["agent-eyes"]):
|
||||
with patch("sys.argv", ["agent-reach"]):
|
||||
main()
|
||||
assert exc_info.value.code == 0
|
||||
|
||||
def test_doctor_runs(self, capsys):
|
||||
with patch("sys.argv", ["agent-eyes", "doctor"]):
|
||||
with patch("sys.argv", ["agent-reach", "doctor"]):
|
||||
main()
|
||||
captured = capsys.readouterr()
|
||||
assert "Agent Eyes" in captured.out
|
||||
assert "Agent Reach" in captured.out
|
||||
assert "✅" in captured.out
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Tests for Agent Eyes config module."""
|
||||
"""Tests for Agent Reach config module."""
|
||||
|
||||
import os
|
||||
import tempfile
|
||||
@@ -8,7 +8,7 @@ from pathlib import Path
|
||||
import pytest
|
||||
import yaml
|
||||
|
||||
from agent_eyes.config import Config
|
||||
from agent_reach.config import Config
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
+6
-6
@@ -1,18 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Tests for AgentEyes core class."""
|
||||
"""Tests for AgentReach core class."""
|
||||
|
||||
import pytest
|
||||
from agent_eyes.config import Config
|
||||
from agent_eyes.core import AgentEyes
|
||||
from agent_reach.config import Config
|
||||
from agent_reach.core import AgentReach
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def eyes(tmp_path):
|
||||
config = Config(config_path=tmp_path / "config.yaml")
|
||||
return AgentEyes(config=config)
|
||||
return AgentReach(config=config)
|
||||
|
||||
|
||||
class TestAgentEyes:
|
||||
class TestAgentReach:
|
||||
def test_init(self, eyes):
|
||||
assert eyes.config is not None
|
||||
|
||||
@@ -33,4 +33,4 @@ class TestAgentEyes:
|
||||
def test_doctor_report(self, eyes):
|
||||
report = eyes.doctor_report()
|
||||
assert isinstance(report, str)
|
||||
assert "Agent Eyes" in report
|
||||
assert "Agent Reach" in report
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"""Tests for doctor module."""
|
||||
|
||||
import pytest
|
||||
from agent_eyes.config import Config
|
||||
from agent_eyes.doctor import check_all, format_report
|
||||
from agent_reach.config import Config
|
||||
from agent_reach.doctor import check_all, format_report
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -31,6 +31,6 @@ class TestDoctor:
|
||||
def test_format_report(self, tmp_config):
|
||||
results = check_all(tmp_config)
|
||||
report = format_report(results)
|
||||
assert "Agent Eyes" in report
|
||||
assert "Agent Reach" in report
|
||||
assert "✅" in report
|
||||
assert "渠道可用" in report
|
||||
|
||||
Reference in New Issue
Block a user