Source code for camel.loaders.jina_url_reader
# =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
# Licensed under the Apache License, Version 2.0 (the “License”);
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an “AS IS” BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
import os
from typing import Any, Optional
from warnings import warn
from camel.types.enums import JinaReturnFormat
JINA_ENDPOINT = "https://r.jina.ai/"
[docs]
class JinaURLReader:
r"""URL Reader provided by Jina AI. The output is cleaner and more
LLM-friendly than the URL Reader of UnstructuredIO. Can be configured to
replace the UnstructuredIO URL Reader in the pipeline.
Args:
api_key (Optional[str], optional): The API key for Jina AI. If not
provided, the reader will have a lower rate limit. Defaults to
None.
return_format (ReturnFormat, optional): The level of detail
of the returned content, which is optimized for LLMs. For
now screenshots are not supported. Defaults to
ReturnFormat.DEFAULT.
json_response (bool, optional): Whether to return the response
in JSON format. Defaults to False.
timeout (int, optional): The maximum time in seconds to wait for
the page to be rendered. Defaults to 30.
**kwargs (Any): Additional keyword arguments, including proxies,
cookies, etc. It should align with the HTTP Header field and
value pairs listed in the reference.
References:
https://jina.ai/reader
"""
def __init__(
self,
api_key: Optional[str] = None,
return_format: JinaReturnFormat = JinaReturnFormat.DEFAULT,
json_response: bool = False,
timeout: int = 30,
**kwargs: Any,
) -> None:
api_key = api_key or os.getenv('JINA_API_KEY')
if not api_key:
warn(
"JINA_API_KEY not set. This will result in a low rate limit "
"of Jina URL Reader. Get API key here: https://jina.ai/reader."
)
# if the following field not provided, it will be None
api_field = f"Bearer {api_key}" if api_key else None
json_field = "application/json" if json_response else None
raw_headers = {
"Authorization": api_field,
"X-Return-Format": return_format.value,
"Accept": json_field,
"X-Timeout": str(timeout),
**kwargs,
}
# eliminate None values
self._headers = {k: v for k, v in raw_headers.items() if v}
[docs]
def read_content(self, url: str) -> str:
r"""Reads the content of a URL and returns it as a string with
given form.
Args:
url (str): The URL to read.
Returns:
str: The content of the URL.
"""
import requests
full_url = f"{JINA_ENDPOINT}{url}"
try:
resp = requests.get(full_url, headers=self._headers)
resp.raise_for_status()
except Exception as e:
raise ValueError(f"Failed to read content from {url}: {e}") from e
return resp.text