DuckDuckGo Chat AI client
Project description
🦆 Duck Chat
Библиотека для программного взаимодействия с AI-моделями через DuckDuckGo AI Chat
Эта библиотека предоставляет Python API для работы с DuckDuckGo AI Chat и включает встроенный сервис для запуска локального HTTP-сервера. Теперь вы можете использовать мощные AI-модели напрямую в своем коде или через REST API.
🚀 Ключевые возможности
- Прямой доступ к AI-моделям DuckDuckGo через Python API
- Встроенный FastAPI-сервер для удобной интеграции с любыми приложениями
- Автоматическое управление заголовками запросов (через Playwright)
- Поддержка изображений в запросах
- Web-поиск в ответах моделей
- Совместимость с различными AI-моделями (GPT-4o, Claude, Llama и др.)
📦 Установка
Установка основной библиотеки:
pip install git+https://github.com/paranoik1/duck-chat-api
Установка с дополнительными зависимостями для API-сервиса:
pip install "duck-chat-api[api-service]"
Установка для разработки:
git clone https://github.com/paranoik1/duck-local-chat-api
cd duck-local-chat-api
poetry install --with api-service,dev
Важно: Для работы с API-сервисом необходимы системные зависимости:
sudo apt install xvfb
💻 Использование библиотеки
Базовое использование:
import asyncio
from duck_chat_api import DuckChat, ModelType
from duck_chat_api.utils.headers import get_headers
async def main():
headers = await get_headers()
async with DuckChat(headers, model=ModelType.Gpt4OMini) as chat:
async for part in chat.ask_question("Привет! Кто ты?"):
if hasattr(part, 'text'):
print(part.text, end="", flush=True)
print()
asyncio.run(main())
Расширенное использование с параметрами:
import asyncio
from duck_chat_api import DuckChat, PartText, PartImage
from duck_chat_api.utils.headers import get_headers
import base64
async def chat_with_image():
headers = await get_headers()
async with DuckChat(headers, model="gpt-4o-mini") as chat:
# Подготовка изображения
with open("image.jpg", "rb") as img_file:
image_data = base64.b64encode(img_file.read()).decode()
# Формирование запроса с изображением
query = [
PartText.create("Что изображено на картинке?"),
PartImage.create(image_data)
]
# Отправка запроса с включенным веб-поиском
async for part in chat.ask_question(query, web_search=True):
if hasattr(part, 'text'):
print(part.text, end="", flush=True)
print()
asyncio.run(chat_with_image())
Важно: Библиотека рассчитана на самостоятельное управление заголовками запросов. Пользователи должны самостоятельно получать (
get_headers()или другими методами) и обновлять заголовки (chat.set_headers(headers)).
🌐 Запуск API-сервиса
Через CLI:
duck-api-service --host 0.0.0.0 --port 8000 --log-level info
Программно:
from duck_chat_api.service import app
import uvicorn
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
После запуска сервиса доступны эндпоинты:
POST /chat— отправка запроса к AI-моделиGET /docs— интерактивная документация Swagger UIGET /redoc— альтернативная документация ReDoc
Пример запроса к API:
curl -X POST http://localhost:8000/chat \
-F "content=Что на этой картинке?" \
-F "model=gpt-4o-mini" \
-F "web_search=true" \
-F "file=@/path/to/image.jpg"
🖥️ Архитектура библиотеки
duck_chat_api/
├── __init__.py # Основные импорты
├── api.py # Класс DuckChat для взаимодействия с API
├── event.py # Обработка событий от DuckDuckGo
├── exceptions.py # Пользовательские исключения
├── model_type.py # Типы поддерживаемых моделей
├── parts.py # Структуры данных для частей сообщений
├── request_data.py # Формирование запросов к API
├── service/ # Модуль для запуска API-сервиса
│ ├── __main__.py # Точка входа для CLI
│ ├── headers_manager.py# Управление заголовками запросов
│ ├── service.py # FastAPI приложение
│ └── utils.py # Вспомогательные функции
└── utils/ # Утилиты для работы с заголовками и моделями
├── headers.py # Получение валидных заголовков через Playwright
└── models.py # Парсинг доступных моделей
🔧 Доступные модели
Библиотека автоматически определяет доступные модели при запуске. Основные поддерживаемые модели:
gpt-4o-minigpt-5-miniclaude-3-5-haiku-latestmeta-llama/Llama-4-Scout-17B-16E-Instructmistralai/Mistral-Small-24B-Instruct-2501openai/gpt-oss-120b
Для получения актуального списка моделей используйте:
from duck_chat_api.utils.models import get_models_page_html, parse_models
from duck_chat_api.service.utils import generate_models
import asyncio
from pprint import pprint
async def print_models():
html = await get_models_page_html()
models = parse_models(html)
pprint(models)
# ИЛИ же
models = await generate_models()
pprint(models)
asyncio.run(print_models())
🧩 Работа с частями сообщений (Parts)
Библиотека duck_chat_api использует концепцию "частей сообщений" (parts) для гибкого формирования запросов и обработки ответов. Все части сообщений наследуются от базового класса Part и имеют специфическую структуру.
Доступные типы частей сообщений
Part (базовый класс)
- Абстрактный базовый класс для всех типов частей
- Содержит поле
typeдля идентификации типа части - Атрибут
IS_SAVEопределяет, нужно ли сохранять часть в истории диалога
PartText
- Представляет текстовую часть сообщения
- Создание:
PartText.create("Ваш текст здесь") - Поля:
text: содержимое текста
PartImage
- Представляет изображение в запросе
- Создание:
PartImage.create(base64_encoded_image, mime_type="image/jpeg") - Поля:
mime_type: MIME-тип изображения (по умолчаниюimage/webp)image: изображение в формате data URL (data:{mime_type};base64,{base64})
PartTool
- Используется моделью для вызова инструментов (автоматически)
- Не предназначен для ручного создания в запросах
- Представляет либо вызов инструмента, либо результат его выполнения
- Поля:
tool_call_id: идентификатор вызоваstate: состояние (callилиresult)tool_arguments,tool_name: параметры вызова (приstate=call)result: результат выполнения (приstate=result)
PartSource
- Представляет источники информации в ответах модели
- Не сохраняется в истории диалога (
IS_SAVE = False) - Поля:
source: объект с информацией об источнике
Правила использования
| Тип части | Можно использовать в запросе | Может вернуться в ответе | Примечание |
|---|---|---|---|
PartText |
✅ | ✅ | Основной тип для текстовых запросов и ответов |
PartImage |
✅ | ❌ | Только для отправки изображений в запросах |
PartTool |
❌ | ✅ | Автоматически обрабатывается моделью |
PartSource |
❌ | ✅ | Источники информации в результатах поиска |
Примеры использования
import asyncio
from duck_chat_api import DuckChat, PartText, PartImage, PartSource
from duck_chat_api.utils.headers import get_headers
import base64
async def chat_with_image():
# Получение валидных заголовков для запросов к API
headers = await get_headers()
async with DuckChat(headers, model="gpt-4o-mini") as chat:
# Подготовка изображения
with open("image.jpg", "rb") as img_file:
image_data = base64.b64encode(img_file.read()).decode()
# Формирование запроса с изображением
query = [
PartText.create("Что изображено на картинке?"),
PartImage.create(image_data)
]
# Отправка запроса с включенным веб-поиском
async for part in chat.ask_question(query, web_search=True):
if isinstance(part, PartText):
print(part.text, end="", flush=True)
elif isinstance(part, PartSource):
print("\n" + part.source.title + ": " + part.source.url)
elif isinstance(part, PartTool):
if part.state == "call" and part.tool_name == "WebSearch":
print("\n[Выполняется поиск в интернете...]")
print()
asyncio.run(chat_with_image())
Важно: при создании запросов вы можете использовать только PartText и PartImage. Все остальные типы частей (PartTool, PartSource) генерируются автоматически моделью при формировании ответа и не должны создаваться вручную в запросах.
⚠️ Ограничения и требования
- Только Linux (если получение заголовков требуется в headless режиме) (из-за зависимости
xvfbwrapper) - Python 3.13+ (требуется для всех функций библиотеки)
- Chromium должен быть установлен в системе
- Срок действия заголовков ограничен (обычно 5-10 запросов)
- Не предназначен для массового использования (следуйте правилам duck.ai)
- Некоторые модели могут требовать аккаунта DuckDuckGo Pro (не поддерживается проектом)
🙏 Благодарности
- mrgick/duck_chat — за основу реализации
- patchright — за решение по обходу проверок на ботов
- FastAPI и Playwright — за отличные инструменты
🦆 Утки не возвращаются, но API — да.
Пользуйтесь с умом и соблюдайте правила использования DuckDuckGo AI.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file duck_chat_api-0.2.1.tar.gz.
File metadata
- Download URL: duck_chat_api-0.2.1.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
278524824b39c9485f4adb059404230197da8da5a7b73f54d6241cd2710c768f
|
|
| MD5 |
075c4f686390205b4fa6e98b078a1e3e
|
|
| BLAKE2b-256 |
0faa5df0a84b43d1ebcc435520348f33bdc97822f8de6f148e9f48e6f826c61e
|
File details
Details for the file duck_chat_api-0.2.1-py3-none-any.whl.
File metadata
- Download URL: duck_chat_api-0.2.1-py3-none-any.whl
- Upload date:
- Size: 17.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6fa47c9d395886ac9777281c5d2fb11ec18b95cb09d677e2c279afea2bce64d
|
|
| MD5 |
3b0c72285a9b5971b52d1159a76efe5f
|
|
| BLAKE2b-256 |
0900504349ca4d723fd5de601722dd10f1b19ec25e12d4f6a16a2a41f33a80d9
|