This is an old revision of the document!
(venv1) ~/ai$ pip install yandex-ai-studio-sdk (venv1) ~/ai$ export API_KEY=AQVN3_tpBw9JigLSI1107j0xhkgREwzwD2VCZx5FzA (venv1) ~/ai$ export FOLDER_ID=b1gg4j6ru4esprat3uu7
(venv1) root@server:~/ai# cat agent_rand_hello.py
import os
import sys
import random
from yandex_ai_studio_sdk import AIStudio
sdk = AIStudio(
folder_id=os.getenv("FOLDER_ID"),
auth=os.getenv("API_KEY")
)
# 2. Локальная Python-функция
def get_random_lucky_number() -> int:
return random.randint(1, 100)
# Регистрируем инструмент через метод sdk.tools.function
lucky_number_tool = sdk.tools.function(
parameters={
"type": "object",
"properties": {}
},
name="get_random_lucky_number",
description="Используй эту функцию, когда пользователь просит назвать его счастливое число."
)
# 3. Инициализируем модель через chat.completions
model = sdk.chat.completions("yandexgpt").configure(
temperature=0.3,
tools=[lucky_number_tool]
)
# Начальный запрос пользователя
messages = [
{"role": "user", "content": "Привет! Назови мое счастливое число на сегодня и пожелай удачи разнообразно."}
]
#messages = [
# {"role": "user", "content": "Привет! Пожелай удачи разнообразно."}
#]
print("Отправка первого запроса агенту...")
response = model.run(messages)
# Извлекаем первый вариант ответа из кортежа
choice = response.choices[0]
if hasattr(choice, 'tool_calls') and choice.tool_calls:
print(f"-> Агент запросил вызов инструмента.")
formatted_tool_calls = []
for call in choice.tool_calls:
if call.function.name == "get_random_lucky_number":
tool_result = get_random_lucky_number()
print(f"-> Результат локальной функции: {tool_result}")
# Простой подход: добавляем результат как ответ пользователя
messages.append({
"role": "user",
"content": f"Результат выполнения функции get_random_lucky_number: {tool_result}"
})
# Отправляем обновленную историю обратно модели
print("Отправка результата выполнения функции обратно агенту...")
# В run() передаем только messages, tools уже настроены
final_response = model.run(messages=messages)
print("\nИтоговый ответ AI агента:")
print(final_response.choices[0].text)
else:
print("\nОтвет модели:")
print(choice.text)
(venv1) root@server:~/ai# cat agent_email_or_cal.py
import os
import sys
#import random
import re
import json
from yandex_ai_studio_sdk import AIStudio
sdk = AIStudio(
folder_id=os.getenv("FOLDER_ID"),
auth=os.getenv("API_KEY")
)
# Функция для интеграции с календарем
def add_to_calendar(task_title: str):
"""
Ваша кастомная функция для добавления события в календарь.
"""
print(f"[Вызов функции]: Успешно добавлено в календарь: '{task_title}'")
# Примеры для тестирования (раскомментируйте нужный для проверки):
user_request = "Привет! Слушай, отправь пожалуйста письмо Ивану с отчетом."
#user_request = "Напомни мне завтра в 15:00 созвониться с коллегами по проекту."
# Расширяем системный промт для обработки двух типов команд
system_prompt = (
"Ты — ассистент, который анализирует команды пользователя и классифицирует их.\n"
"Определи, что просит сделать пользователь. Ответь строго в формате JSON.\n"
"Схема ответа JSON должна содержать следующие поля:\n"
"- 'intent': строка, может принимать значения: 'send_email', 'add_calendar' или 'unknown'.\n"
"- 'recipient_name': имя получателя (строка), если intent == 'send_email', иначе null.\n"
"- 'calendar_task': текст напоминания (строка), если intent == 'add_calendar', иначе null."
)
messages = [
{"role": "system", "text": system_prompt},
{"role": "user", "text": user_request}
]
# Вызываем модель YandexGPT
model = sdk.chat.completions("yandexgpt").configure(
temperature=0.3
)
response = model.run(messages)
match = re.search(r"\{.*\}", response.choices[0].text, re.DOTALL)
result_text = match.group(0)
#print(result_text)
#sys.exit()
try:
# Парсим JSON-ответ от модели
data = json.loads(result_text)
intent = data.get("intent")
# Сценарий 1: Отправка письма
if intent == "send_email":
recipient = data.get("recipient_name")
if recipient:
print(f"Обнаружена команда отправки письма. Получатель: {recipient}")
else:
print("Обнаружена команда отправки письма, но имя получателя не указано.")
# Сценарий 2: Добавление в календарь
elif intent == "add_calendar":
task = data.get("calendar_task")
if task:
print("Обнаружена команда календаря. Вызываю функцию...")
add_to_calendar(task)
else:
print("Обнаружена команда календаря, но текст напоминания пуст.")
# Сценарий 3: Команда не распознана
else:
print("Команда не распознана или не требует автоматических действий.")
except json.JSONDecodeError:
print("Ошибка парсинга ответа модели:", result_text)
(venv1) root@server:~/ai# cat agent_email_or_cal_2.py
import os
import sys
import re
import json
from yandex_ai_studio_sdk import AIStudio
sdk = AIStudio(
folder_id=os.getenv("FOLDER_ID"),
auth=os.getenv("OAUTH_TOKEN")
)
# Функция-заглушка для отправки письма
def send_email(recipient_name: str, subject: str, body: str):
"""
Заглушка для отправки письма.
В реальном проекте здесь был бы код для отправки через SMTP или API почтового сервиса.
"""
print("\n" + "="*50)
print(f"[ОТПРАВКА ПИСЬМА]")
print(f"Получатель: {recipient_name}")
print(f"Тема: {subject}")
print(f"Тело письма:\n{body}")
print("="*50 + "\n")
print("[Заглушка] Письмо успешно отправлено (симуляция)")
# Функция для интеграции с календарем
def add_to_calendar(task_title: str):
"""
Ваша кастомная функция для добавления события в календарь.
"""
print(f"[Вызов функции]: Успешно добавлено в календарь: '{task_title}'")
# Функция для определения интента (что хочет пользователь)
def detect_intent(user_request: str):
"""
Первый этап: определяем намерение пользователя.
"""
system_prompt_intent = (
"Ты — ассистент, который анализирует команды пользователя и классифицирует их.\n"
"Определи, что просит сделать пользователь. Ответь строго в формате JSON.\n"
"Схема ответа JSON должна содержать только одно поле:\n"
"- 'intent': строка, может принимать значения: 'send_email', 'add_calendar' или 'unknown'.\n"
"\nПримеры:\n"
"Запрос: 'Отправь письмо Ивану с отчетом' -> {\"intent\": \"send_email\"}\n"
"Запрос: 'Напомни мне завтра в 15:00 созвониться' -> {\"intent\": \"add_calendar\"}\n"
"Запрос: 'Какая сегодня погода?' -> {\"intent\": \"unknown\"}"
)
messages = [
{"role": "system", "text": system_prompt_intent},
{"role": "user", "text": user_request}
]
model = sdk.chat.completions("yandexgpt").configure(temperature=0.1)
response = model.run(messages)
match = re.search(r"\{.*\}", response.choices[0].text, re.DOTALL)
if match:
try:
data = json.loads(match.group(0))
return data.get("intent", "unknown")
except json.JSONDecodeError:
return "unknown"
return "unknown"
# Функция для обработки отправки письма
def process_email(user_request: str):
"""
Второй этап: если определили, что нужно отправить письмо,
запрашиваем у модели составление темы и тела.
"""
system_prompt_email = (
"Ты — ассистент, который помогает составлять деловые письма.\n"
"Проанализируй запрос пользователя и составь письмо.\n"
"Ответь строго в формате JSON со следующими полями:\n"
"- 'recipient_name': имя получателя (строка). Извлеки из запроса.\n"
"- 'subject': тема письма (строка). Составь краткую и понятную тему.\n"
"- 'body': тело письма (строка). Напиши вежливое, содержательное письмо.\n"
"\nПравила:\n"
"- Тема должна быть краткой и отражать суть письма (максимум 5-7 слов)\n"
"- Тело письма должно быть вежливым, структурированным и соответствовать запросу\n"
"- Используй стандартный деловой тон\n"
"- Если в запросе не указано имя получателя, используй 'Уважаемый коллега'\n"
"\nПример:\n"
"Запрос: 'Отправь Ивану отчет по продажам за май'\n"
"Ответ: {\"recipient_name\": \"Иван\", \"subject\": \"Отчет по продажам за май\", \"body\": \"Здравствуйте, Иван!\\n\\nНаправляю вам отчет по продажам за май месяц. В отчете вы найдете детальную информацию по каждому региону и сравнительный анализ с прошлым месяцем.\\n\\nС уважением,\\nАссистент\"}"
)
messages = [
{"role": "system", "text": system_prompt_email},
{"role": "user", "text": user_request}
]
model = sdk.chat.completions("yandexgpt").configure(temperature=0.3)
response = model.run(messages)
match = re.search(r"\{.*\}", response.choices[0].text, re.DOTALL)
if match:
try:
data = json.loads(match.group(0))
return data
except json.JSONDecodeError:
return None
return None
# Функция для обработки добавления в календарь
def process_calendar(user_request: str):
"""
Второй этап: если определили, что нужно добавить в календарь,
запрашиваем у модели составление напоминания.
"""
system_prompt_calendar = (
"Ты — ассистент, который помогает создавать напоминания для календаря.\n"
"Проанализируй запрос пользователя и составь четкое напоминание.\n"
"Ответь строго в формате JSON с одним полем:\n"
"- 'calendar_task': текст напоминания (строка). Составь конкретное, понятное описание события.\n"
"\nПравила:\n"
"- Напоминание должно быть четким и конкретным\n"
"- Включай дату и время, если они указаны в запросе\n"
"- Формулируй как действие, которое нужно выполнить\n"
"\nПример:\n"
"Запрос: 'Напомни мне завтра в 15:00 созвониться с коллегами по проекту'\n"
"Ответ: {\"calendar_task\": \"Завтра в 15:00 созвониться с коллегами по проекту\"}"
)
messages = [
{"role": "system", "text": system_prompt_calendar},
{"role": "user", "text": user_request}
]
model = sdk.chat.completions("yandexgpt").configure(temperature=0.2)
response = model.run(messages)
match = re.search(r"\{.*\}", response.choices[0].text, re.DOTALL)
if match:
try:
data = json.loads(match.group(0))
return data
except json.JSONDecodeError:
return None
return None
# Основная логика
def main():
# Примеры для тестирования
#user_request = "Привет! Слушай, отправь пожалуйста письмо Ивану с отчетом по продажам за май."
user_request = "Напомни мне завтра в двенадцать созвониться с коллегами по проекту."
print(f"Запрос пользователя: {user_request}\n")
print("Обработка запроса...\n")
# Шаг 1: Определяем намерение
intent = detect_intent(user_request)
print(f"Определенное намерение: {intent}")
# Шаг 2: Обрабатываем в зависимости от намерения
if intent == "send_email":
print("\nСоставляю письмо...")
email_data = process_email(user_request)
if email_data:
recipient = email_data.get("recipient_name")
subject = email_data.get("subject")
body = email_data.get("body")
if subject and body:
print(f"✓ Письмо составлено успешно")
print(f" Получатель: {recipient}")
print(f" Тема: {subject}")
# Отправляем письмо
send_email(recipient, subject, body)
else:
print("✗ Не удалось составить письмо: недостаточно данных")
else:
print("✗ Ошибка при составлении письма")
elif intent == "add_calendar":
print("\nСоставляю напоминание...")
calendar_data = process_calendar(user_request)
if calendar_data:
task = calendar_data.get("calendar_task")
if task:
print(f"✓ Напоминание составлено: {task}")
add_to_calendar(task)
else:
print("✗ Не удалось составить напоминание")
else:
print("✗ Ошибка при составлении напоминания")
else:
print("\nКоманда не распознана. Я не могу обработать этот запрос.")
if __name__ == "__main__":
main()