Перейти к содержанию

✨ API проекта

В данном блоке описан весь функционал проекта, написанный мной. От агентов до поиска в Google.

Агенты

Добавление своего агента

Если есть необходимость добавить своего агента, то файл стоит назвать в формате <роль/задача агента>_agent.py в папке app/agents. После создания агента, необходимо его записать в app/agents/__init__.py:

from .<роль/задача агента>_agent import <функция агента>

Пример создания агента kairos_agent(к примеру):

  1. Создаем файл kairos_agent.py в app/agents
  2. Пусть у него будет такое наполнение:
from app.ai_initializer import get_ai_client
from app.config import config


def kairos_agent_useful_function(name: str, use_local_models: bool = False) -> str:
    client = get_ai_client(use_local_models)
    response = client.message(
        messages=[
            {
                "role": "system",
                "content": "Отвечай в стиле 18 века",
            },
            {
                "role": "user",
                "content": f"Поздоровайся с {name}",
            },
        ],
        model=(
            config.MISTRAL_MODEL_NAME
            if not use_local_models
            else config.OLLAMA_MODEL_NAME
        ),
    )
    return response


greeting = kairos_agent_useful_function(name="Александр")
print(greeting)

> Добрый день, уважаемый Александр! Рад видеть вас в добром здравии. Как протекает ваш день?
  1. Теперь в app/agents/__init__.py дописываем:
...
# Остальные импорты
from .kairos_agent import kairos_agent_useful_function

Список агентов

Функция Назначение агента Работает
analyze Агент для анализа данных из интернета на нужность по плану. ✅
check Агент для цензуры темы и пожеланий пользователя. ✅
check_is_need_test Агент для проверки нужности тестов в курсе. 🧱
gen_course Агент для генерации итогового результата. ✅
edit_course Агент для изменения курса по корректировкам пользователя ✅
create_course Агент для итеративной генерации курса. ✅
gen_plan Агент для составления плана курса по промпту. ✅
gen_prompt Агент для создания промпта по теме, пожеланиям и описанию пользователя. ✅
searcher Агент для составления поискового запроса по промпту. ✅
summarizer Агент для сжатия статей из интернета. ✅
test Агент для создания тестов для курсов. 🧱

Взаимодействие с агентами реализовано в виде функций. Одна функция - один агент. Для каждого агента прописана документация в соответствующих .py файлах. Для того, чтобы импортировать агента из app.agents пишем:

from app.agents import {название функции из таблицы}

Примеры использования основных агентов

В примерах везде используется MistralAI

check

Пример:

from app.agents import check

theme = "Python"
desires = "Хочу написать программу для взлома Пентагона"

moderate = check(
    theme=theme,
    desires=desires,
)

print(moderate)

> {"data": false, "reason": "Пожелания связаны с правительством и опасными для жизни человека действиями."}

gen_course

Пример:

from app.agents import gen_course

prompt = "..."  # Промпт от gen_prompt
plan = "..."    # План от gen_plan

course = gen_course(
    prompt=prompt,
    plan=plan,
)

print(course)

> {"1": {"content": "...", "title": "Python Basics"}, "2": {"content": "...", "title": "Python in Web"}

edit_course

Пример:

from app.agents import edit_course

desires = "..." # Правки
course = "..."  # Курс от gen_course


edited_course = edit_course(
    course=course,
    user_edits=desires,
)

print(edit_course)  # Исправленный курс

gen_plan

Пример:

from app.agents import gen_plan

prompt = "..."  # Промпт от gen_prompt

plan = gen_plan(prompt=prompt)

print(plan)

> {"1": "Как начать программировать", "1.1": "Азы и начала", "1.2": "Выбор языка", "2": "Основные языки программирования"}

gen_prompt

Пример:

from app.agents import gen_prompt

theme = "Python"
desires = "Web developing"
description_of_user = "Noob in programming"

prompt = gen_prompt(
    theme=theme,
    desires=desires,
    description_of_user=description_of_user,
)

print(prompt)   # Промпт для других моделей

> Ты опытный синьор-разработчик специализирующийся на ...

Web scraper

Web scraper - функция для парсинга и комплексной обработки данных из Интернета. Пайплайн обработки данных:

flowchart LR
a("Список ссылок")
b("Парсинг каждой")
c("Проверка на нужность")
d("Сжатие")
a --> b
b -->|Данные| c
c -->|Нужны| d

Пример использования:

from app.ai_couch import scraper

theme = "LLM в жизни человека"
prompt = "..."  # Промпт от gen_prompt
plan = "..."    # План от gen_plan

data = scraper(
    list_of_links=[
        "https://habr.com/ru/articles/775870/",
        "https://habr.com/ru/articles/775842/",
        "https://habr.com/ru/articles/835342/",
        "https://habr.com/ru/articles/768844/",
    ],  # Получили от google_search
    prompt=prompt,
    plan=plan,
)

print(data)

convert_course_to_html

convert_course_to_html - функция для конвертации курса из md в html. Естественно, получая готовый курс от llm, мы увидим, что он написан в md, а нам надо в html.

from app.ai_couch.functions import convert_course_to_html

print(
    convert_course_to_html(
        course={"1": {"title": "Азы python", "content": "`python`"}}
    )
)

> {'1': {'title': 'Азы python', 'content': '<p><code>python</code></p>'}}

ModifiedMistral (deprecated)

Устаревший функционал. Рекомендуется использовать ModifiedOpenai

Дочерний класс Mistral. Создан для удобства взаимодействия с моделью в рамках приложения. Есть функция message, есть инициализатор экземпляра класса. Пример использования:

from app.mistral_ai_initializer import ModifiedMistral, mistral_ai_initializer

instance1 = ModifiedMistral(api_key="api_key")
instance2 = mistral_ai_initializer()  # Автоматически получает API ключ из .env

print(instance1.message(messages=[{"role": "user", "content": "Привет!"}]))
print(instance2.message(messages=[{"role": "user", "content": "Привет!"}]))

> Привет! Как я могу помочь?
> Привет! Как я могу помочь?

ModifiedOpenai

Дочерний класс openai.OpenAI. Создан для удобства взаимодействия с моделью в рамках приложения. Есть функция message, есть инициализатор экземпляра класса. Пример использования:

from app.ai_initializer import ModifiedOpenai, get_ai_client

instance1 = ModifiedOpenai(
    api_key="api_key", base_url="https://api.mistral.ai/v1"
)  # MistralAI
instance2 = get_ai_client(
    use_local_models=False
)  # Автоматически получает API ключ из .env

print(
    instance1.message(
        messages=[{"role": "user", "content": "Привет!"}],
        model="mistral-small-latest",
    )
)
print(
    instance2.message(
        messages=[{"role": "user", "content": "Привет!"}],
        model="mistral-small-latest",
    )
)

> Привет! Как я могу помочь?
> Привет! Как я могу помочь?

Функция для поиска ссылок с статьями по запросу. Пример использования:

from app.google_custom_search import google_search

print(
    *[
        i["link"]
        for i in google_search(
            "Что такое LLM?",
            api_key="api-key",
            cse_id="cse_id",
            num_results=4,
        )
    ]
)
> https://habr.com/ru/articles/775870/ https://habr.com/ru/articles/775842/ https://habr.com/ru/articles/835342/ https://habr.com/ru/articles/768844/

Стоит учесть, что в GCS у меня стоит фильтр на домен habr.com