Kodduu Python
1.08K subscribers
311 photos
28 videos
186 links
Научись программировать на Python на интересных примерах

Самый быстрый курс https://stepik.org/a/187914
Самый нескучный курс https://stepik.org/a/185238

Во вопросам сотрудничества: @AlexErf
Download Telegram
📱 Авто-ресайз изображений под соцсети


from PIL import Image

SIZES = {
"instagram_post": (1080, 1080),
"instagram_story": (1080, 1920),
"telegram": (1280, 720),
"vk": (1200, 628),
}

def resize_for_social(input_path, output_dir):
img = Image.open(input_path)
for name, size in SIZES.items():
out_path = f"{output_dir}/{name}.jpg"
img_resized = img.copy()
img_resized.thumbnail(size)
img_resized.save(out_path, "JPEG", quality=90)
print(f" {name}: {out_path}")

if __name__ == "__main__":
resize_for_social("input.jpg", "./out")


📌 Что делает:
Создаёт версии картинки в нужных размерах для Instagram, Telegram и VK.

🛠


pip install pillow


Подпишись 👉🏻 @KodduuPython 🤖
🔥1
🖼️ Конвертация PNG → JPEG с удалением прозрачности


from PIL import Image
import os

def png_to_jpg(src, dst):
img = Image.open(src).convert("RGB") # убираем альфу
img.save(dst, "JPEG", quality=90)
print(f" {src} → {dst}")

if __name__ == "__main__":
for f in os.listdir("./images"):
if f.endswith(".png"):
png_to_jpg(f"./images/{f}", f"./images/{f[:-4]}.jpg")


📌 Что делает:
Массово конвертирует PNG-файлы в JPEG, автоматически убирая прозрачность (заменяет на белый фон).

🛠


pip install pillow


Подпишись 👉🏻 @KodduuPython 🤖
👍1
🌦️ Прогноз погоды на сегодня


import requests

API_KEY = "your_openweathermap_api_key"
CITY = "Moscow"
URL = f"http://api.openweathermap.org/data/2.5/weather?q={CITY}&appid={API_KEY}&units=metric&lang=ru"

def get_weather():
res = requests.get(URL)
if res.status_code == 200:
data = res.json()
print(f"Погода в {CITY}: {data['weather'][0]['description'].capitalize()}, {data['main']['temp']}°C")
else:
print("Ошибка при получении данных")

if __name__ == "__main__":
get_weather()


📌 Получает текущую погоду в указанном городе через OpenWeatherMap API.

🛠


pip install requests


Подпишись 👉🏻 @KodduuPython 🤖
🔥2
📬 Авто-рассылка поздравлений с Днём рождения


import smtplib
from email.mime.text import MIMEText

BIRTHDAYS = {
"alice@example.com": "Alice",
"bob@example.com": "Bob"
}

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
EMAIL = "your_email@gmail.com"
PASSWORD = "your_password"

def send_birthday_email(to_email, name):
msg = MIMEText(f"С днём рождения, {name}! 🎉")
msg["Subject"] = "Поздравление 🎂"
msg["From"] = EMAIL
msg["To"] = to_email

with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL, PASSWORD)
server.send_message(msg)
print(f" Отправлено: {name}")

if __name__ == "__main__":
for email, name in BIRTHDAYS.items():
send_birthday_email(email, name)


📌 Отправляет простое поздравление на почту всем из списка.

🛠


pip install secure-smtplib


Подпишись 👉🏻 @KodduuPython 🤖
📝 Быстрое извлечение текста из PDF


import sys
from PyPDF2 import PdfReader

def extract_text(pdf_path):
reader = PdfReader(pdf_path)
for i, page in enumerate(reader.pages, 1):
text = page.extract_text()
print(f"--- Страница {i} ---\n{text}\n")

if __name__ == "__main__":
extract_text(sys.argv[1])


📌 Извлекает и печатает текст из PDF — удобно для быстрых проверок документов.

🛠


pip install PyPDF2


Подпишись 👉🏻 @KodduuPython 🤖
👍2
Forwarded from AIGENTTO
LLM нападет на человечество

Вокруг пугают тем, что ИИ нападет на человечество. И есть уже эксперименты, где LLM принимает аморальные решения для достижения поставленной цели.
Но как всегда слона (большую проблему) в лавке и не заметили, реальная проблема — это использование ИИ людьми для незаконных действий.

Мошенники всех мастей уже на пике технологий. Ко мне лично уже приходили аватары на Zoom-собеседование, и HR не заметил, что это не люди 😎

Принимать голосовые или видеозвонки от неизвестных в наше время — это уже достаточно высокая угроза. Текст имеет значительно меньшее влияние.

Возможен и видеозвонок от того, кого вы знаете, тогда лучше перезвонить самому.

Короче, нужно перейти на минимальное доверие ко всем видео/голосовым входящим. Сейчас уже даже сделки с недвижимостью совершаются без созвонов, чата достаточно.

Текст будет единственным валидным способом коммуникации в будущем, до тех пор, пока Elon Musk, не внедрил всем в мозг нейролинк 🧠

Подпишись 👉🏻 @aigentto 🤖
2
🔑 Генератор надёжных паролей


import secrets
import string

def generate_password(length=16):
alphabet = string.ascii_letters + string.digits + string.punctuation
return ''.join(secrets.choice(alphabet) for _ in range(length))

if __name__ == "__main__":
print("Ваш новый пароль:", generate_password())


📌 Создаёт криптостойкий пароль для учётных записей или сервисов.

🛠
Без зависимостей.

Подпишись 👉🏻 @KodduuPython 🤖
👍3
👀 Авто-сортировщик файлов в реальном времени


import time, shutil, pathlib
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

DOWNLOADS = pathlib.Path.home() / "Downloads"
TARGETS = {
"Images": [".jpg", ".jpeg", ".png", ".gif"],
"Docs": [".pdf", ".docx", ".txt"],
"Archives": [".zip", ".rar", ".tar", ".gz"],
"Music": [".mp3", ".wav"],
}

class SortHandler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory:
file = pathlib.Path(event.src_path)
ext = file.suffix.lower()
for folder, exts in TARGETS.items():
if ext in exts:
dest = DOWNLOADS / folder
dest.mkdir(exist_ok=True)
shutil.move(str(file), dest / file.name)
print(f"📦 {file.name} → {folder}")
break

if __name__ == "__main__":
observer = Observer()
observer.schedule(SortHandler(), str(DOWNLOADS), recursive=False)
observer.start()
print("👀 Следим за папкой Downloads...")
try:
while True: time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()


📌 Теперь скрипт в фоне следит за папкой Downloads и сразу раскладывает новые файлы по папкам.

🛠


pip install watchdog


Подпишись 👉🏻 @KodduuPython 🤖
🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Анимация «волны»


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()
x = np.linspace(0, 4*np.pi, 400)
line, = ax.plot(x, np.sin(x), lw=2)
ax.set_ylim(-1.2, 1.2)

def update(frame):
line.set_ydata(np.sin(x + frame/10))
return line,

ani = animation.FuncAnimation(fig, update, frames=200, interval=30, blit=True)
plt.show()


📌 Простая анимация синусоиды, которая движется как волна

🛠


pip install matplotlib numpy


Подпишись 👉🏻 @KodduuPython 🤖
This media is not supported in your browser
VIEW IN TELEGRAM
🕹 ZX Spectrum loading screen



pygame.init()
pygame.mixer.quit() # сбросим микшер
pygame.mixer.init(frequency=22050, size=-16, channels=1) # моно

W, H = 600, 400
screen = pygame.display.set_mode((W, H))
clock = pygame.time.Clock()

def beep(freq=800, dur=50):
sample_rate = 22050
n = int(sample_rate * dur / 1000)
arr = (np.sin(2*np.pi*np.arange(n)*freq/sample_rate)*32767).astype(np.int16)
sound = pygame.sndarray.make_sound(arr)
sound.play()
pygame.time.delay(dur)

colors = [(255,0,0),(0,255,0),(0,0,255),(255,255,0),(255,0,255),(0,255,255)]

for _ in range(120):
for e in pygame.event.get():
if e.type == pygame.QUIT: sys.exit()
rect_h = random.randint(5, 30)
y = random.randint(0, H-rect_h)
color = random.choice(colors)
pygame.draw.rect(screen, color, (0, y, W, rect_h))
pygame.display.flip()
beep(random.randint(300, 1200), 40)
time.sleep(0.02)

time.sleep(1)


Подпишись 👉🏻 @KodduuPython 🤖
Forwarded from AIGENTTO
Хрупкость всех agentic систем

Во всех мультиагентных системах есть одно хрупкое место — это протокол общения между агентами или роутинг между ними.

По сути, можно сделать жёсткий роутинг прямо в коде. Можно сделать условный роутинг тоже в коде. А можно настроить гибкий роутинг во фреймворках AutoGen, LangChain. Но даже в гибких вариантах это определённая договорённость (правила общения).

Хрупкость в том, что агенты используют LLM, которая может вернуть не совсем то, что ожидается, и да, конечно, они должны валидировать то, что им возвращает LLM, а потом передавать данные следующему агенту в строго определённом формате. Любое изменение кода, промтов и прочего может поломать цепочку. Неожиданный ответ LLM может поломать цепочку. Изменения API вендоров могут поломать одного агента и поломать цепочку.

Это всё норма в мире технологий прошлого, где не было LLM. Но сейчас строгость протоколов и форматов становится скорее не плюсом, а минусом. Ведь если каждый первый агент и почти каждое API сейчас начинают использовать LLM в своей работе, то зачем ограничивать это жёсткими протоколами? LLM всегда поймёт другую LLM в свободном формате (ок, не всегда, но в 99% случаев — поймёт).

Поэтому мир будет двигаться от строго определённых протоколов к гибким и даже к отсутствию протоколов.

Мы провели эксперимент — попробовали загнать множество разных агентов в пространство без протоколов и дали им возможность общаться на человеческом языке, и они отлично справляются. Агенты читают этот общий чат и публикуют свои результаты и наблюдения обратно. В этом, казалось бы, мусоре сообщений возникает чёткое общение и выполнение целей агентов. Без роутинга, без протокола.

Более детально про результаты нашего эксперимента скоро будет статья на habr.

Подпишись 👉🏻 @aigentto 🤖
🤖 Простой ИИ-агент для чата с OpenAI


import openai

openai.api_key = "YOUR_OPENAI_API_KEY"

def chat_agent(prompt, model="gpt-3.5-turbo"):
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "system", "content": "Ты полезный помощник."},
{"role": "user", "content": prompt}]
)
return response.choices[0].message.content

if __name__ == "__main__":
while True:
user_input = input("Вы: ")
if user_input.lower() in ["выход", "exit", "quit"]:
break
answer = chat_agent(user_input)
print("ИИ:", answer)


📌 Чат-бот, который отвечает на вопросы пользователя через OpenAI API.

🛠


pip install openai


Подпишись 👉🏻 @KodduuPython 🤖
🏨 ИИ-агент для бронирования отелей


import openai

openai.api_key = "YOUR_OPENAI_API_KEY"

def hotel_booking_agent(user_request, model="gpt-3.5-turbo"):
system_msg = (
"Ты агент по бронированию отелей. "
"Помоги пользователю найти подходящий отель, "
"уточни город, даты, бюджет и предпочтения, "
"предложи список вариантов с краткой информацией."
)
response = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "system", "content": system_msg},
{"role": "user", "content": user_request}
]
)
return response.choices[0].message.content

if __name__ == "__main__":
while True:
request = input("Пользователь: ")
if request.lower() in ["выход", "exit", "quit"]:
break
answer = hotel_booking_agent(request)
print("ИИ:", answer)


📌 Агент уточняет детали бронирования и предлагает варианты отелей на основе запроса пользователя.

🛠


pip install openai


Подпишись 👉🏻 @KodduuPython 🤖
🤖 ИИ-агент «Помощник программиста»


import openai

openai.api_key = "YOUR_OPENAI_API_KEY"

def dev_assistant(prompt, model="gpt-3.5-turbo"):
system_msg = (
"Ты ИИ-помощник для программиста. "
"Отвечай кратко, давай готовые примеры кода на Python, "
"поясняй ошибки и оптимизации."
)
response = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "system", "content": system_msg},
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content

if __name__ == "__main__":
while True:
user_input = input("Вы: ")
if user_input.lower() in ["выход", "exit", "quit"]:
break
answer = dev_assistant(user_input)
print("ИИ:", answer)


📌 Агент отвечает конкретно как помощник программиста: даёт код, исправляет ошибки, даёт оптимизации.

🛠


pip install openai


Подпишись 👉🏻 @KodduuPython 🤖
🔥1
🌐 ИИ-агент для парсинга сайтов и извлечения данных


import requests
from bs4 import BeautifulSoup
import openai

openai.api_key = "YOUR_OPENAI_API_KEY"

def web_parser_agent(url, query, model="gpt-3.5-turbo"):
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
text = soup.get_text(separator="\n")

prompt = (
f"Вот текст с сайта:\n{text[:4000]}\n\n"
f"Извлеки нужную информацию по запросу: {query}"
)

response = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "system", "content": "Ты агент для извлечения информации с веб-страниц."},
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content

if __name__ == "__main__":
url = input("URL: ")
query = input("Что извлечь: ")
result = web_parser_agent(url, query)
print("Результат:\n", result)


📌 Агент скачивает страницу, извлекает текст и с помощью ИИ ищет нужную информацию по запросу.

🛠


pip install requests beautifulsoup4 openai


Подпишись 👉🏻 @KodduuPython 🤖
LLM-валидатор ответов через логические гейты


import openai

openai.api_key = "YOUR_OPENAI_API_KEY"

def validate_response(prompt, validation_rules, model="gpt-3.5-turbo"):
"""
prompt: запрос к LLM
validation_rules: список правил, которые ответ должен пройти
"""
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
answer = response.choices[0].message.content

results = {}
for rule_name, rule_check in validation_rules.items():
results[rule_name] = rule_check(answer)

return answer, results

# Пример правил в виде функций
validation_rules = {
"contains_number": lambda text: any(c.isdigit() for c in text),
"mentions_python": lambda text: "python" in text.lower(),
}

if __name__ == "__main__":
prompt = "Напиши пример кода на Python, который считает сумму чисел от 1 до 10"
answer, gates = validate_response(prompt, validation_rules)
print("Ответ LLM:\n", answer)
print("Результаты валидации:", gates)


📌 Простейшая схема «гейтов» для проверки ответов LLM: каждый гейт — это функция, возвращающая True/False.

🛠


pip install openai


Подпишись 👉🏻 @KodduuPython 🤖
🚦 Многоступенчатая валидация ответа LLM (гейты)


import openai, json

openai.api_key = "YOUR_OPENAI_API_KEY"

def multi_gate_agent(prompt, model="gpt-3.5-turbo"):
# Сначала получаем ответ от LLM
answer = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}]
).choices[0].message.content

# Проверяем ответ через "гейты"
gates = {
"toxic_check": "Проверь, содержит ли текст оскорбления или токсичность. Ответь JSON {'toxic': true/false}",
"fact_check": f"Проверь фактическую корректность ответа: {answer}. Верни JSON {{'valid': true/false}}",
"style_check": "Проверь, написан ли текст в вежливом стиле. Ответь JSON {'polite': true/false}"
}

results = {}
for name, gate_prompt in gates.items():
resp = openai.ChatCompletion.create(
model=model,
messages=[{"role": "system", "content": "Ты валидатор."},
{"role": "user", "content": gate_prompt}]
).choices[0].message.content
try:
results[name] = json.loads(resp)
except:
results[name] = {"error": resp}

return answer, results

if __name__ == "__main__":
user_q = "Напиши что-нибудь про Марс"
ans, validation = multi_gate_agent(user_q)
print("Ответ LLM:\n", ans)
print("\nРезультаты валидации:\n", validation)


📌 Агент проходит через несколько «гейтов»: токсичность, факты, стиль. Каждый возвращает JSON.

🛠


pip install openai


Подпишись 👉🏻 @KodduuPython 🤖
📧 ИИ-агент для сортировки писем по категориям


import openai

openai.api_key = "YOUR_OPENAI_API_KEY"

def mail_sorting_agent(email_text, model="gpt-3.5-turbo"):
system_msg = (
"Ты агент для классификации писем. "
"Категории: ['Работа', 'Финансы', 'Реклама', 'Личное', 'Другое']. "
"Верни JSON с ключами: {'category': '...', 'reason': '...'}."
)
response = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "system", "content": system_msg},
{"role": "user", "content": email_text}
]
)
return response.choices[0].message.content

if __name__ == "__main__":
sample_email = "Здравствуйте, пришлите, пожалуйста, счёт за услуги за август."
result = mail_sorting_agent(sample_email)
print("Результат классификации:\n", result)


📌 Агент автоматически раскладывает письма по папкам: «Работа», «Финансы», «Реклама» и т.д.

🛠


pip install openai


Подпишись 👉🏻 @KodduuPython 🤖
📄 ИИ-агент для анализа резюме кандидатов


import openai

openai.api_key = "YOUR_OPENAI_API_KEY"

def resume_analysis_agent(resume_text, model="gpt-3.5-turbo"):
system_msg = (
"Ты HR-агент. Твоя задача — проанализировать резюме кандидата. "
"Выдели ключевые навыки, опыт, уровень английского и дай краткий вывод. "
"Верни JSON с ключами: {'skills': [...], 'experience': '...', 'english': '...', 'summary': '...'}"
)
response = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "system", "content": system_msg},
{"role": "user", "content": resume_text}
]
)
return response.choices[0].message.content

if __name__ == "__main__":
sample_resume = """
Иван Иванов, Python-разработчик.
Опыт: 5 лет. Django, FastAPI, PostgreSQL, Docker, AWS.
Английский — Upper-Intermediate.
Работал над highload-системами.
"""
result = resume_analysis_agent(sample_resume)
print("Результат анализа:\n", result)


📌 Агент автоматически извлекает навыки, опыт и делает краткий HR-вывод по резюме.

🛠


pip install openai


Подпишись 👉🏻 @KodduuPython 🤖
Forwarded from AIGENTTO
LLM спасет локальный debug

Раньше, когда я писал на C/C++, я всегда делал локальный пошаговый debug с отсмотром всех переменных для понимания, где может быть проблема. Сейчас почти никто так не делает, тем более что это все усложняется необходимостью написания большого числа заглушек для такого дебага.

Это был очень мощный инструмент, НО сейчас есть LLM, и простое скармливание кода с просьбой дебагинга находит 90% потенциальных проблем 👏

Подпишись 👉🏻 @aigentto 🤖
Возьмём асинхронный веб-краулер с очередью задач, который собирает заголовки страниц с сайта.


import asyncio
import aiohttp
from aiohttp import ClientTimeout
from bs4 import BeautifulSoup

class AsyncCrawler:
def __init__(self, urls, concurrency=5):
self.urls = asyncio.Queue()
for u in urls:
self.urls.put_nowait(u)
self.concurrency = concurrency

async def fetch(self, session, url):
try:
async with session.get(url, timeout=ClientTimeout(total=10)) as resp:
html = await resp.text()
soup = BeautifulSoup(html, "html.parser")
title = soup.title.string.strip() if soup.title else "Нет заголовка"
print(f"{url} → {title}")
except Exception as e:
print(f"{url} ошибка: {e}")

async def worker(self):
async with aiohttp.ClientSession() as session:
while not self.urls.empty():
url = await self.urls.get()
await self.fetch(session, url)
self.urls.task_done()

async def run(self):
tasks = [asyncio.create_task(self.worker()) for _ in range(self.concurrency)]
await self.urls.join()
for t in tasks:
t.cancel()

if __name__ == "__main__":
urls = [
"https://www.python.org",
"https://www.djangoproject.com",
"https://fastapi.tiangolo.com",
"https://pypi.org"
]
crawler = AsyncCrawler(urls, concurrency=3)
asyncio.run(crawler.run())


📌 Этот асинхронный краулер умеет:

* работать с очередью asyncio.Queue
* ограничивать количество конкурентных воркеров
* парсить HTML и доставать <title>
* обрабатывать таймауты и ошибки

🛠


pip install aiohttp beautifulsoup4


Подпишись 👉🏻 @KodduuPython 🤖