diff --git a/README.md b/README.md
index 115ed647..8b1ede05 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
# 🕷️ ScrapeGraphAI: You Only Scrape Once
[English](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/README.md) | [中文](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/docs/chinese.md) | [日本語](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/docs/japanese.md)
+| [코리아노](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/docs/korean.md)
+| [русский](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/docs/russian.md)
+
[](https://pepy.tech/project/scrapegraphai)
[](https://github.com/pylint-dev/pylint)
diff --git a/docs/korean.md b/docs/korean.md
new file mode 100644
index 00000000..40c88e06
--- /dev/null
+++ b/docs/korean.md
@@ -0,0 +1,210 @@
+# 🕷️ ScrapeGraphAI: 한 번만 스크래핑하세요
+
+
+ScrapeGraphAI는 웹 사이트와 로컬 문서(XML, HTML, JSON 등)에 대한 스크래핑 파이프라인을 만들기 위해 LLM 및 직접 그래프 로직을 사용하는 파이썬 웹 스크래핑 라이브러리입니다.
+
+추출하려는 정보를 말하기만 하면 라이브러리가 알아서 처리해 줍니다!
+
+
+
+
+
+## 🚀 빠른 설치
+
+Scrapegraph-ai에 대한 참조 페이지는 PyPI의 공식 페이지에서 확인할 수 있습니다: pypi.
+
+bash
+Copia codice
+pip install scrapegraphai
+참고: 다른 라이브러리와의 충돌을 피하기 위해 라이브러리를 가상 환경에 설치하는 것이 좋습니다 🐱
+
+## 🔍 데모
+
+공식 Streamlit 데모:
+
+
+
+Google Colab을 사용하여 웹에서 직접 사용해 보세요:
+
+
+
+## 📖 문서
+
+ScrapeGraphAI에 대한 문서는 여기에서 찾을 수 있습니다.
+
+또한 Docusaurus를 여기에서 확인해 보세요.
+
+## 💻 사용법
+
+웹 사이트(또는 로컬 파일)에서 정보를 추출하는 데 사용할 수 있는 세 가지 주요 스크래핑 파이프라인이 있습니다:
+
+SmartScraperGraph: 사용자 프롬프트와 입력 소스만 필요한 단일 페이지 스크래퍼;
+SearchGraph: 검색 엔진의 상위 n개의 검색 결과에서 정보를 추출하는 다중 페이지 스크래퍼;
+SpeechGraph: 웹 사이트에서 정보를 추출하고 오디오 파일을 생성하는 단일 페이지 스크래퍼.
+SmartScraperMultiGraph: 단일 프롬프트를 사용하여 여러 페이지를 스크래핑하는 스크래퍼
+OpenAI, Groq, Azure, Gemini와 같은 API를 통해 다양한 LLM을 사용할 수 있으며, Ollama를 사용하여 로컬 모델을 사용할 수도 있습니다.
+
+사례 1: 로컬 모델을 사용하는 SmartScraper
+Ollama를 설치하고 ollama pull 명령을 사용하여 모델을 다운로드하세요.
+
+```python
+from scrapegraphai.graphs import SmartScraperGraph
+
+graph_config = {
+ "llm": {
+ "model": "ollama/mistral",
+ "temperature": 0,
+ "format": "json", # Ollama는 형식을 명시적으로 지정해야 합니다
+ "base_url": "http://localhost:11434", # Ollama URL 설정
+ },
+ "embeddings": {
+ "model": "ollama/nomic-embed-text",
+ "base_url": "http://localhost:11434", # Ollama URL 설정
+ },
+ "verbose": True,
+}
+
+smart_scraper_graph = SmartScraperGraph(
+ prompt="프로젝트와 설명을 모두 나열하세요",
+ # 이미 다운로드된 HTML 코드가 있는 문자열도 허용
+ source="https://perinim.github.io/projects",
+ config=graph_config
+)
+
+result = smart_scraper_graph.run()
+print(result)
+```
+
+출력은 다음과 같이 프로젝트와 설명의 목록이 될 것입니다:
+
+```python
+{'projects': [{'title': 'Rotary Pendulum RL', 'description': 'RL 알고리즘을 사용하여 실제 회전 진자를 제어하는 오픈 소스 프로젝트'}, {'title': 'DQN Implementation from scratch', 'description': '간단한 및 이중 진자를 훈련하기 위한 딥 Q-네트워크 알고리즘 개발'}, ...]}
+사례 2: 혼합 모델을 사용하는 SearchGraph
+우리는 LLM에 Groq를 사용하고, 임베딩에 Ollama를 사용합니다.
+```
+
+```python
+from scrapegraphai.graphs import SearchGraph
+
+# 그래프 구성 정의
+graph_config = {
+ "llm": {
+ "model": "groq/gemma-7b-it",
+ "api_key": "GROQ_API_KEY",
+ "temperature": 0
+ },
+ "embeddings": {
+ "model": "ollama/nomic-embed-text",
+ "base_url": "http://localhost:11434", # Ollama URL 임의 설정
+ },
+ "max_results": 5,
+}
+
+# SearchGraph 인스턴스 생성
+search_graph = SearchGraph(
+ prompt="Chioggia의 전통 레시피를 모두 나열하세요",
+ config=graph_config
+)
+
+# 그래프 실행
+result = search_graph.run()
+print(result)
+출력은 다음과 같이 레시피 목록이 될 것입니다:
+```
+
+```python
+{'recipes': [{'name': 'Sarde in Saòre'}, {'name': 'Bigoli in salsa'}, {'name': 'Seppie in umido'}, {'name': 'Moleche frite'}, {'name': 'Risotto alla pescatora'}, {'name': 'Broeto'}, {'name': 'Bibarasse in Cassopipa'}, {'name': 'Risi e bisi'}, {'name': 'Smegiassa Ciosota'}]}
+사례 3: OpenAI를 사용하는 SpeechGraph
+OpenAI API 키와 모델 이름만 전달하면 됩니다.
+```
+
+```python
+from scrapegraphai.graphs import SpeechGraph
+
+graph_config = {
+ "llm": {
+ "api_key": "OPENAI_API_KEY",
+ "model": "gpt-3.5-turbo",
+ },
+ "tts_model": {
+ "api_key": "OPENAI_API_KEY",
+ "model": "tts-1",
+ "voice": "alloy"
+ },
+ "output_path": "audio_summary.mp3",
+}
+
+# ************************************************
+# SpeechGraph 인스턴스를 생성하고 실행합니다.
+# ************************************************
+
+speech_graph = SpeechGraph(
+ prompt="프로젝트에 대한 자세한 오디오 요약을 만드세요.",
+ source="https://perinim.github.io/projects/",
+ config=graph_config,
+)
+
+result = speech_graph.run()
+print(result)
+```
+
+출력은 페이지의 프로젝트 요약이 포함된 오디오 파일이 될 것입니다.
+
+후원사
+
+
+
+## 🤝 기여
+
+기여를 환영하며, 개선 사항을 논의하고 제안 사항을 주고받기 위해 우리의 Discord 서버에 참여하세요!
+
+기여 가이드라인을 참조하십시오.
+
+## 📈 로드맵
+
+프로젝트 로드맵을 여기에서 확인하세요! 🚀
+
+로드맵을 더 인터랙티브하게 시각화하고 싶으신가요? markdown 내용을 편집기에 복사하여 markmap 시각화를 확인하세요!
+
+## ️ 기여자들
+
+
+
+## 🎓 인용
+
+우리의 라이브러리를 연구 목적으로 사용한 경우 다음과 같이 인용해 주세요:
+
+text
+Copia codice
+ @misc{scrapegraph-ai,
+ author = {Marco Perini, Lorenzo Padoan, Marco Vinciguerra},
+ title = {Scrapegraph-ai},
+ year = {2024},
+ url = {https://github.com/VinciGit00/Scrapegraph-ai},
+ note = {대규모 언어 모델을 활용한 Python 스크레이핑 라이브러리}
+ }
+저자들
+
+
+
+
+연락처
+Marco Vinciguerra
+Marco Perini
+Lorenzo Padoan
+
+## 📜 라이선스
+
+ScrapeGraphAI는 MIT License로 라이선스가 부여되었습니다. 자세한 내용은 LICENSE 파일을 참조하세요.
+
+감사의 말
+
+프로젝트에 기여한 모든 분들과 오픈 소스 커뮤니티에 감사드립니다.
+ScrapeGraphAI는 데이터 탐색 및 연구 목적으로만 사용되어야 합니다. 우리는 라이브러리의 오용에 대해 책임을 지지 않습니다.
\ No newline at end of file
diff --git a/docs/russian.md b/docs/russian.md
new file mode 100644
index 00000000..d3c8d24b
--- /dev/null
+++ b/docs/russian.md
@@ -0,0 +1,200 @@
+# 🕷️ ScrapeGraphAI: Вы скрейпите только один раз
+
+ScrapeGraphAI - это библиотека для веб-скрейпинга на Python, которая использует LLM и прямую графовую логику для создания скрейпинговых пайплайнов для веб-сайтов и локальных документов (XML, HTML, JSON и т.д.).
+
+Просто укажите, какую информацию вы хотите извлечь, и библиотека сделает это за вас!
+
+
+
+
+
+## 🚀 Быстрая установка
+
+Референсная страница для Scrapegraph-ai доступна на официальной странице PyPI: pypi.
+
+bash
+Copia codice
+pip install scrapegraphai
+Примечание: рекомендуется устанавливать библиотеку в виртуальную среду, чтобы избежать конфликтов с другими библиотеками 🐱
+
+## 🔍 Демонстрация
+
+Официальная демонстрация на Streamlit:
+
+
+
+Попробуйте ее прямо в интернете, используя Google Colab:
+
+## 📖 Документация
+
+Документация для ScrapeGraphAI доступна здесь.
+
+Посмотрите также Docusaurus здесь.
+
+## 💻 Использование
+
+Существует три основных скрейпинговых пайплайна, которые можно использовать для извлечения информации с веб-сайта (или локального файла):
+
+SmartScraperGraph: скрейпер одной страницы, которому требуется только пользовательский запрос и источник ввода;
+SearchGraph: многопользовательский скрейпер, который извлекает информацию из топ n результатов поиска поисковой системы;
+SpeechGraph: скрейпер одной страницы, который извлекает информацию с веб-сайта и генерирует аудиофайл.
+SmartScraperMultiGraph: скрейпер нескольких страниц по одному запросу.
+Можно использовать различные LLM через API, такие как OpenAI, Groq, Azure и Gemini, или локальные модели, используя Ollama.
+
+Пример 1: SmartScraper с использованием локальных моделей
+Не забудьте установить Ollama и загрузить модели, используя команду ollama pull.
+
+```python
+from scrapegraphai.graphs import SmartScraperGraph
+
+graph_config = {
+ "llm": {
+ "model": "ollama/mistral",
+ "temperature": 0,
+ "format": "json", # Ollama требует явного указания формата
+ "base_url": "http://localhost:11434", # укажите URL Ollama
+ },
+ "embeddings": {
+ "model": "ollama/nomic-embed-text",
+ "base_url": "http://localhost:11434", # укажите URL Ollama
+ },
+ "verbose": True,
+}
+
+smart_scraper_graph = SmartScraperGraph(
+ prompt="Перечислите все проекты с их описаниями",
+ # также принимает строку с уже загруженным HTML-кодом
+ source="https://perinim.github.io/projects",
+ config=graph_config
+)
+
+result = smart_scraper_graph.run()
+print(result)
+```
+Выходные данные будут представлять собой список проектов с их описаниями, например:
+
+```python
+{'projects': [{'title': 'Rotary Pendulum RL', 'description': 'Open Source проект, направленный на управление реальным роторным маятником с использованием алгоритмов RL'}, {'title': 'DQN Implementation from scratch', 'description': 'Разработан алгоритм Deep Q-Network для обучения простого и двойного маятника'}, ...]}
+```
+Пример 2: SearchGraph с использованием смешанных моделей
+Мы используем Groq для LLM и Ollama для встраивания.
+
+python
+Copia codice
+from scrapegraphai.graphs import SearchGraph
+
+# Определите конфигурацию для графа
+graph_config = {
+ "llm": {
+ "model": "groq/gemma-7b-it",
+ "api_key": "GROQ_API_KEY",
+ "temperature": 0
+ },
+ "embeddings": {
+ "model": "ollama/nomic-embed-text",
+ "base_url": "http://localhost:11434", # укажите URL Ollama произвольно
+ },
+ "max_results": 5,
+}
+
+# Создайте экземпляр SearchGraph
+search_graph = SearchGraph(
+ prompt="Перечислите все традиционные рецепты из Кьоджи",
+ config=graph_config
+)
+
+# Запустите граф
+result = search_graph.run()
+print(result)
+Выходные данные будут представлять собой список рецептов, например:
+
+```python
+{'recipes': [{'name': 'Sarde in Saòre'}, {'name': 'Bigoli in salsa'}, {'name': 'Seppie in umido'}, {'name': 'Moleche frite'}, {'name': 'Risotto alla pescatora'}, {'name': 'Broeto'}, {'name': 'Bibarasse in Cassopipa'}, {'name': 'Risi e bisi'}, {'name': 'Smegiassa Ciosota'}]}
+Пример 3: SpeechGraph с использованием OpenAI
+Вам просто нужно передать ключ API OpenAI и название модели.
+
+python
+Copia codice
+from scrapegraphai.graphs import SpeechGraph
+
+graph_config = {
+ "llm": {
+ "api_key": "OPENAI_API_KEY",
+ "model": "gpt-3.5-turbo",
+ },
+ "tts_model": {
+ "api_key": "OPENAI_API_KEY",
+ "model": "tts-1",
+ "voice": "alloy"
+ },
+ "output_path": "audio_summary.mp3",
+}
+
+# ************************************************
+# Создайте экземпляр SpeechGraph и запустите его
+# ************************************************
+
+speech_graph = SpeechGraph(
+ prompt="Сделайте подробное аудиорезюме проектов.",
+ source="https://perinim.github.io/projects/",
+ config=graph_config,
+)
+
+result = speech_graph.run()
+print(result)
+```
+Выходные данные будут представлять собой аудиофайл с резюме проектов на странице.
+
+## Спонсоры
+
+
+
+## 🤝 Участие
+
+Не стесняйтесь вносить свой вклад и присоединяйтесь к нашему серверу Discord, чтобы обсудить с нами улучшения и дать нам предложения!
+
+Пожалуйста, ознакомьтесь с руководством по участию.
+
+## 📈 Дорожная карта
+
+Посмотрите дорожную карту проекта здесь! 🚀
+
+Хотите визуализировать дорожную карту более интерактивно? Посмотрите визуализацию markmap, скопировав содержимое markdown в редактор!
+
+## 🎓 Цитаты
+
+Если вы использовали нашу библиотеку для научных исследований, пожалуйста, укажите нас в следующем виде:
+
+text
+Copia codice
+ @misc{scrapegraph-ai,
+ author = {Марко Перини, Лоренцо Падоан, Марко Винчигуэрра},
+ title = {Scrapegraph-ai},
+ year = {2024},
+ url = {https://github.com/VinciGit00/Scrapegraph-ai},
+ note = {Библиотека на Python для скрейпинга с использованием больших языковых моделей}
+ }
+## Авторы
+
+
+
+
+Контактная информация
+Марко Винчигуэрра
+Марко Перини
+Лоренцо Падоан
+📜 Лицензия
+
+ScrapeGraphAI лицензирован под MIT License. Подробнее см. в файле LICENSE.
+
+## Благодарности
+
+Мы хотели бы поблагодарить всех участников проекта и сообщество с открытым исходным кодом за их поддержку.
+ScrapeGraphAI предназначен только для исследования данных и научных целей. Мы не несем ответственности за неправильное использование библиотеки.
\ No newline at end of file
diff --git a/scrapegraphai/graphs/abstract_graph.py b/scrapegraphai/graphs/abstract_graph.py
index b5f3a681..49a6cb5f 100644
--- a/scrapegraphai/graphs/abstract_graph.py
+++ b/scrapegraphai/graphs/abstract_graph.py
@@ -333,40 +333,41 @@ def _create_embedder(self, embedder_config: dict) -> object:
Raises:
KeyError: If the model is not supported.
"""
+ embedder_params = {**embedder_config}
if "model_instance" in embedder_config:
- return embedder_config["model_instance"]
+ return embedder_params["model_instance"]
# Instantiate the embedding model based on the model name
- if "openai" in embedder_config["model"]:
- return OpenAIEmbeddings(api_key=embedder_config["api_key"])
- elif "azure" in embedder_config["model"]:
+ if "openai" in embedder_params["model"]:
+ return OpenAIEmbeddings(api_key=embedder_params["api_key"])
+ elif "azure" in embedder_params["model"]:
return AzureOpenAIEmbeddings()
- elif "ollama" in embedder_config["model"]:
- embedder_config["model"] = embedder_config["model"].split("ollama/")[-1]
+ elif "ollama" in embedder_params["model"]:
+ embedder_params["model"] = embedder_params["model"].split("ollama/")[-1]
try:
- models_tokens["ollama"][embedder_config["model"]]
+ models_tokens["ollama"][embedder_params["model"]]
except KeyError as exc:
raise KeyError("Model not supported") from exc
- return OllamaEmbeddings(**embedder_config)
- elif "hugging_face" in embedder_config["model"]:
+ return OllamaEmbeddings(**embedder_params)
+ elif "hugging_face" in embedder_params["model"]:
try:
- models_tokens["hugging_face"][embedder_config["model"]]
+ models_tokens["hugging_face"][embedder_params["model"]]
except KeyError as exc:
raise KeyError("Model not supported") from exc
- return HuggingFaceHubEmbeddings(model=embedder_config["model"])
- elif "gemini" in embedder_config["model"]:
+ return HuggingFaceHubEmbeddings(model=embedder_params["model"])
+ elif "gemini" in embedder_params["model"]:
try:
- models_tokens["gemini"][embedder_config["model"]]
+ models_tokens["gemini"][embedder_params["model"]]
except KeyError as exc:
raise KeyError("Model not supported") from exc
- return GoogleGenerativeAIEmbeddings(model=embedder_config["model"])
- elif "bedrock" in embedder_config["model"]:
- embedder_config["model"] = embedder_config["model"].split("/")[-1]
- client = embedder_config.get("client", None)
+ return GoogleGenerativeAIEmbeddings(model=embedder_params["model"])
+ elif "bedrock" in embedder_params["model"]:
+ embedder_params["model"] = embedder_params["model"].split("/")[-1]
+ client = embedder_params.get("client", None)
try:
- models_tokens["bedrock"][embedder_config["model"]]
+ models_tokens["bedrock"][embedder_params["model"]]
except KeyError as exc:
raise KeyError("Model not supported") from exc
- return BedrockEmbeddings(client=client, model_id=embedder_config["model"])
+ return BedrockEmbeddings(client=client, model_id=embedder_params["model"])
else:
raise ValueError("Model provided by the configuration not supported")