Files
agent_management/agent_templates/docs/JINA_SEARCH_AGENT_EXAMPLES.md
T
2026-01-15 17:30:48 +00:00

12 KiB

Jina Search Agent 请求调用示例

服务信息

  • 服务名称: Jina Search Agent
  • 版本: 1.0.0
  • 功能: 使用 Jina Reader API 获取网站内容
  • 默认端口: 8080

概述

Jina Search Agent 使用 Jina Reader API 提取和解析网页内容,返回纯文本格式的内容,适合用于内容分析、摘要生成等场景。


API 端点

1. 健康检查

端点: GET /health

请求示例 (curl):

curl http://localhost:8080/health

响应示例:

{
  "status": "healthy",
  "pod_name": "jina-search-agent",
  "template_type": "jina_search_agent",
  "jina_api_configured": true
}

2. 服务信息

端点: GET /

请求示例 (curl):

curl http://localhost:8080/

响应示例:

{
  "service": "Jina Search Agent",
  "version": "1.0.0",
  "description": "使用Jina Reader API获取网站内容的AI Agent",
  "pod_name": "jina-search-agent",
  "template_type": "jina_search_agent",
  "required_env": {
    "JINA_API_KEY": {
      "description": "Jina API密钥,从 https://jina.ai/ 获取",
      "required": true,
      "configured": true
    }
  },
  "optional_env": {
    "SERVICE_PORT": {
      "description": "HTTP服务端口",
      "default": "8080"
    }
  }
}

3. 搜索/提取网页内容

端点: POST /search

使用 Jina Reader API 提取指定 URL 的网页内容。

请求体:

{
  "url": "https://example.com",
  "jina_api_key": "your-jina-api-key",
  "user_id": "user123",
  "timeout": 30
}

请求示例 (curl):

curl -X POST http://localhost:8080/search \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://python.org",
    "jina_api_key": "jina_xxx",
    "user_id": "user123"
  }'

请求示例 (Python):

import requests

search_data = {
    "url": "https://www.python.org/",
    "jina_api_key": "jina_xxx",
    "user_id": "user123",
    "timeout": 30
}

response = requests.post(
    "http://localhost:8080/search",
    json=search_data
)
result = response.json()

if result["success"]:
    print(f"URL: {result['url']}")
    print(f"Content Type: {result['content_type']}")
    print(f"Content Length: {len(result['content'])}")
    print(f"\nContent Preview:\n{result['content'][:500]}...")
else:
    print(f"Error: {result.get('error')}")

响应示例:

{
  "url": "https://www.python.org/",
  "content": "Welcome to Python.org\n\nPython is a programming language that lets you work quickly and integrate systems more effectively...\n\n# Latest News\n- Python 3.12 Released\n- PyCon 2026 Announced\n...",
  "status_code": 200,
  "content_type": "text/plain",
  "success": true
}

完整使用示例

Python 完整示例:

import requests
import json

class JinaSearchClient:
    """Jina Search Agent 客户端"""
    
    def __init__(self, base_url: str, jina_api_key: str):
        self.base_url = base_url.rstrip('/')
        self.jina_api_key = jina_api_key
    
    def health_check(self):
        """健康检查"""
        response = requests.get(f"{self.base_url}/health")
        return response.json()
    
    def get_info(self):
        """获取服务信息"""
        response = requests.get(f"{self.base_url}/")
        return response.json()
    
    def fetch_content(self, url: str, user_id: str = None, timeout: int = 30):
        """提取网页内容"""
        data = {
            "url": url,
            "jina_api_key": self.jina_api_key,
            "user_id": user_id,
            "timeout": timeout
        }
        response = requests.post(f"{self.base_url}/search", json=data)
        return response.json()


# 使用示例
client = JinaSearchClient(
    base_url="http://localhost:8080",
    jina_api_key="jina_xxx"
)

# 1. 健康检查
print("Health:", client.health_check())

# 2. 获取服务信息
print("Info:", client.get_info())

# 3. 提取网页内容
urls = [
    "https://www.python.org/",
    "https://kubernetes.io/docs/",
    "https://docs.docker.com/",
    "https://github.com/",
]

for url in urls:
    print(f"\n{'='*60}")
    print(f"Fetching: {url}")
    print('='*60)
    
    result = client.fetch_content(url, user_id="user123")
    
    if result["success"]:
        print(f"Status: {result['status_code']}")
        print(f"Content Type: {result['content_type']}")
        print(f"Content Length: {len(result['content'])} chars")
        print(f"\nContent Preview:")
        print(result['content'][:300])
        print("...")
    else:
        print(f"Error: Failed to fetch content")

批量内容提取:

import requests
import concurrent.futures
from typing import List, Dict

def fetch_url(url: str, jina_api_key: str, user_id: str = None) -> Dict:
    """提取单个 URL 的内容"""
    try:
        response = requests.post(
            "http://localhost:8080/search",
            json={
                "url": url,
                "jina_api_key": jina_api_key,
                "user_id": user_id,
                "timeout": 30
            },
            timeout=60
        )
        result = response.json()
        return {
            "url": url,
            "success": result.get("success", False),
            "content": result.get("content", ""),
            "error": None
        }
    except Exception as e:
        return {
            "url": url,
            "success": False,
            "content": "",
            "error": str(e)
        }

# 批量提取
urls = [
    "https://www.python.org/",
    "https://www.docker.com/",
    "https://kubernetes.io/",
    "https://www.tensorflow.org/",
    "https://pytorch.org/"
]

jina_api_key = "jina_xxx"

# 并行提取
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
    futures = [
        executor.submit(fetch_url, url, jina_api_key, f"user-{i}")
        for i, url in enumerate(urls)
    ]
    
    results = [future.result() for future in concurrent.futures.as_completed(futures)]

# 处理结果
successful = [r for r in results if r["success"]]
failed = [r for r in results if not r["success"]]

print(f"Successful: {len(successful)}/{len(urls)}")
print(f"Failed: {len(failed)}/{len(urls)}")

for result in successful:
    print(f"\n{result['url']}")
    print(f"Content length: {len(result['content'])} chars")
    print(f"Preview: {result['content'][:100]}...")

与 LLM 结合进行内容分析:

import requests
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate

class ContentAnalyzer:
    """使用 Jina 提取内容并用 LLM 分析"""
    
    def __init__(self, jina_base_url: str, jina_api_key: str, openai_api_key: str):
        self.jina_base_url = jina_base_url
        self.jina_api_key = jina_api_key
        self.llm = ChatOpenAI(
            temperature=0,
            model="gpt-3.5-turbo",
            openai_api_key=openai_api_key
        )
    
    def fetch_content(self, url: str) -> str:
        """使用 Jina 提取内容"""
        response = requests.post(
            f"{self.jina_base_url}/search",
            json={
                "url": url,
                "jina_api_key": self.jina_api_key
            }
        )
        result = response.json()
        return result.get("content", "") if result.get("success") else ""
    
    def summarize(self, url: str) -> str:
        """提取并摘要网页内容"""
        content = self.fetch_content(url)
        
        if not content:
            return "无法提取内容"
        
        prompt = PromptTemplate(
            input_variables=["content"],
            template="请用中文总结以下网页内容,保持简洁明了:\n\n{content}\n\n摘要:"
        )
        
        # 限制内容长度
        content = content[:4000]
        
        result = self.llm.invoke(prompt.format(content=content))
        return result.content
    
    def extract_key_points(self, url: str) -> List[str]:
        """提取关键要点"""
        content = self.fetch_content(url)
        
        if not content:
            return []
        
        prompt = PromptTemplate(
            input_variables=["content"],
            template="请从以下内容中提取5个关键要点,每个要点一行:\n\n{content}\n\n关键要点:"
        )
        
        content = content[:4000]
        result = self.llm.invoke(prompt.format(content=content))
        
        # 解析要点
        points = [line.strip() for line in result.content.split('\n') if line.strip()]
        return points


# 使用示例
analyzer = ContentAnalyzer(
    jina_base_url="http://localhost:8080",
    jina_api_key="jina_xxx",
    openai_api_key="sk-xxx"
)

# 摘要网页
url = "https://www.python.org/about/"
summary = analyzer.summarize(url)
print(f"URL: {url}")
print(f"Summary: {summary}")

# 提取关键要点
key_points = analyzer.extract_key_points(url)
print("\nKey Points:")
for i, point in enumerate(key_points, 1):
    print(f"{i}. {point}")

监控和内容变更检测:

import requests
import time
import hashlib
from datetime import datetime

class ContentMonitor:
    """监控网页内容变化"""
    
    def __init__(self, jina_base_url: str, jina_api_key: str):
        self.jina_base_url = jina_base_url
        self.jina_api_key = jina_api_key
        self.cache = {}
    
    def get_content_hash(self, url: str) -> str:
        """获取内容哈希值"""
        response = requests.post(
            f"{self.jina_base_url}/search",
            json={
                "url": url,
                "jina_api_key": self.jina_api_key
            }
        )
        result = response.json()
        
        if result.get("success"):
            content = result["content"]
            return hashlib.md5(content.encode()).hexdigest()
        return ""
    
    def check_updates(self, urls: List[str]) -> Dict:
        """检查 URL 列表是否有更新"""
        updates = {}
        
        for url in urls:
            current_hash = self.get_content_hash(url)
            previous_hash = self.cache.get(url)
            
            if previous_hash is None:
                updates[url] = {"status": "new", "hash": current_hash}
            elif current_hash != previous_hash:
                updates[url] = {"status": "updated", "hash": current_hash}
            else:
                updates[url] = {"status": "unchanged", "hash": current_hash}
            
            self.cache[url] = current_hash
        
        return updates


# 使用示例
monitor = ContentMonitor(
    jina_base_url="http://localhost:8080",
    jina_api_key="jina_xxx"
)

urls_to_monitor = [
    "https://www.python.org/downloads/",
    "https://kubernetes.io/blog/",
    "https://github.com/trending"
]

# 定期检查更新
while True:
    print(f"\n[{datetime.now()}] Checking for updates...")
    updates = monitor.check_updates(urls_to_monitor)
    
    for url, info in updates.items():
        if info["status"] == "updated":
            print(f"⚠️  UPDATED: {url}")
        elif info["status"] == "new":
            print(f"🆕 NEW: {url}")
        else:
            print(f"✓ No change: {url}")
    
    # 每 5 分钟检查一次
    time.sleep(300)

环境变量配置

# 服务配置
export SERVICE_HOST="0.0.0.0"
export SERVICE_PORT="8080"
export POD_NAME="jina-search-agent"
export TEMPLATE_TYPE="jina_search_agent"

# Jina API (从请求传入,也可以预配置)
# export JINA_API_KEY="jina_xxx"

# 启动服务
python jina_search_agent.py

获取 Jina API Key

  1. 访问: https://jina.ai/
  2. 注册账号
  3. 在控制台获取 API key
  4. 免费套餐: 1,000 次请求/天

支持的网站类型

Jina Reader API 支持多种网站:

  • 新闻网站
  • 博客文章
  • 文档网站
  • GitHub 页面
  • 维基百科
  • 论文网站 (arXiv, etc.)

注意事项

  1. API Key: 从请求中传入,保证安全性
  2. 速率限制: 注意 Jina API 的速率限制
  3. 超时设置: 大型网页可能需要更长时间
  4. 内容格式: 返回纯文本格式,已清理 HTML
  5. 用户ID: 可选,用于计费回调
  6. 错误处理: 检查 success 字段确认是否成功
  7. 并发限制: 建议最多 3-5 个并发请求