🔥 Пылающий текст в терминале — ASCII-огонь, как в Doom
Динамическое пламя под вашим текстом. Терминал — в огне! 🔥🔥🔥
📌 Что делает:
— Генерирует эффект горящего ASCII-пламени прямо под вашим текстом
— Вдохновлён огнём из классических демо-сцен и игр (🔥 как в Doom)
— Легко изменить ширину, текст и стиль огня
🛠 Никаких зависимостей — только стандартная библиотека
⚙️ Работает в терминале с ANSI (Linux/macOS/WSL/Windows Terminal)
📎 Залипательно, лампово и безумно кастомизируемо!
Подпишись 👉🏻 @KodduuPython 🤖
Динамическое пламя под вашим текстом. Терминал — в огне! 🔥🔥🔥
import os
import sys
import time
import random
WIDTH = 80
HEIGHT = 30
FIRE_CHARS = " .:-=+*#%@"
TEXT = "HELLO, PYTHON!" # 🔥 поменяй под себя
fire = [[0 for _ in range(WIDTH)] for _ in range(HEIGHT)]
def ignite():
for x in range(WIDTH):
fire[HEIGHT - 1][x] = random.randint(4, 9)
def propagate():
for y in range(HEIGHT - 1, 0, -1):
for x in range(WIDTH):
src = fire[y][x]
dst = max(0, src - random.randint(0, 2))
dx = random.randint(-1, 1)
if 0 <= x + dx < WIDTH:
fire[y - 1][x + dx] = dst
def draw():
os.system("clear")
mid = (WIDTH - len(TEXT)) // 2
print(" " * mid + TEXT + "\n")
for y in range(HEIGHT - 1):
line = "".join(FIRE_CHARS[fire[y][x]] for x in range(WIDTH))
print(line)
try:
while True:
ignite()
propagate()
draw()
time.sleep(0.05)
except KeyboardInterrupt:
print("\033[0m\033[2J")
📌 Что делает:
— Генерирует эффект горящего ASCII-пламени прямо под вашим текстом
— Вдохновлён огнём из классических демо-сцен и игр (🔥 как в Doom)
— Легко изменить ширину, текст и стиль огня
🛠 Никаких зависимостей — только стандартная библиотека
⚙️ Работает в терминале с ANSI (Linux/macOS/WSL/Windows Terminal)
📎 Залипательно, лампово и безумно кастомизируемо!
Подпишись 👉🏻 @KodduuPython 🤖
👍1
🧠 Генератор абстрактных нейросетевых паттернов в PNG
Красивые, псевдоорганические текстуры — будто сгенерированы нейросетью или взяты из sci-fi интерфейса 🧬
📌 Что делает:
— Генерирует PNG с абстрактным шумом, напоминающим мозг, ИИ, sci-fi интерфейс
— Полезно для фонов, генерации арта, визуального наполнения интерфейсов
— Каждый запуск даёт уникальный результат
— Можно модифицировать фильтры или цветовую палитру
🛠
Файл сохраняется в
Подпишись 👉🏻 @KodduuPython 🤖
Красивые, псевдоорганические текстуры — будто сгенерированы нейросетью или взяты из sci-fi интерфейса 🧬
from PIL import Image, ImageFilter
import random
import numpy as np
W, H = 512, 512
def generate_noise(seed=None):
if seed:
random.seed(seed)
base = np.random.rand(H, W) * 255
for _ in range(4): # несколько проходов размытия
base = Image.fromarray(base.astype("uint8")).filter(ImageFilter.GaussianBlur(4))
base = np.array(base)
base = 255 * (base - base.min()) / (base.ptp()) # нормализация
return Image.fromarray(base.astype("uint8")).convert("L")
if __name__ == "__main__":
img = generate_noise()
img.save("neuro_texture.png")
print("✅ Сохранено: neuro_texture.png")
📌 Что делает:
— Генерирует PNG с абстрактным шумом, напоминающим мозг, ИИ, sci-fi интерфейс
— Полезно для фонов, генерации арта, визуального наполнения интерфейсов
— Каждый запуск даёт уникальный результат
— Можно модифицировать фильтры или цветовую палитру
🛠
pip install pillow numpyФайл сохраняется в
neuro_texture.png — можно открыть в любом просмотрщике изображений.Подпишись 👉🏻 @KodduuPython 🤖
🎙️ Аутентичный экран загрузки ZX Spectrum — с шумом и полосами
Вот как *действительно* выглядела загрузка игр с кассеты: шум, хаос, полосы! Прямо как в 1984 🧨📼
📌 Что делает:
— Симулирует *настоящий* загрузочный экран ZX Spectrum:
белый шум, мерцающие полосы, артефакты и надпись
— Можно вставить как заставку в ретро-игру или CLI-интерфейс
🛠 Стандартная библиотека. Работает в ANSI-терминалах (Linux, macOS, Windows Terminal)
🧠 Вдохновлено реальным поведением спектрумов при загрузке игр с аудиокассет
Подпишись 👉🏻 @KodduuPython 🤖
Вот как *действительно* выглядела загрузка игр с кассеты: шум, хаос, полосы! Прямо как в 1984 🧨📼
import os
import random
import time
import sys
WIDTH = 40
HEIGHT = 24
NOISE_CHARS = [" ", "░", "▒", "▓", "█"]
def clear(): print("\033[2J\033[H", end="")
def draw_noise_frame():
for _ in range(HEIGHT):
line = "".join(random.choice(NOISE_CHARS) for _ in range(WIDTH))
print(line)
sys.stdout.flush()
def draw_color_bars():
for _ in range(HEIGHT):
color = random.randint(41, 47)
print(f"\033[{color}m{' ' * WIDTH}\033[0m")
sys.stdout.flush()
try:
clear()
for _ in range(5):
draw_noise_frame()
time.sleep(0.08)
clear()
draw_color_bars()
time.sleep(0.08)
clear()
print("\n\033[1;32mLOAD \"\" ...\033[0m")
time.sleep(1)
print("\033[1;34mRUN\n\033[0m")
except KeyboardInterrupt:
print("\033[0m")
📌 Что делает:
— Симулирует *настоящий* загрузочный экран ZX Spectrum:
белый шум, мерцающие полосы, артефакты и надпись
LOAD ""...— Можно вставить как заставку в ретро-игру или CLI-интерфейс
🛠 Стандартная библиотека. Работает в ANSI-терминалах (Linux, macOS, Windows Terminal)
🧠 Вдохновлено реальным поведением спектрумов при загрузке игр с аудиокассет
Подпишись 👉🏻 @KodduuPython 🤖
❤4🤔1
👾 Ретро-игра «Змейка» в терминале — классика на Python
Минимализм, управление стрелками, и ностальгия по 80-м прямо в консоли! 🐍
📌 Что делает:
— Полноценная змейка с управлением стрелками и стенами в терминале
— Использует модуль
— Классика, проверенная временем и работающая на всех Unix-подобных системах и Windows 10+
🛠
Запускай в терминале, получай ностальгию и кайф от ретро!
Подпишись 👉🏻 @KodduuPython 🤖
Минимализм, управление стрелками, и ностальгия по 80-м прямо в консоли! 🐍
import curses
import random
def main(stdscr):
curses.curs_set(0)
sh, sw = stdscr.getmaxyx()
w = curses.newwin(sh, sw, 0, 0)
w.keypad(1)
w.timeout(100)
snk_x = sw//4
snk_y = sh//2
snake = [[snk_y, snk_x],
[snk_y, snk_x-1],
[snk_y, snk_x-2]]
food = [random.randint(1, sh-2), random.randint(1, sw-2)]
w.addch(food[0], food[1], curses.ACS_PI)
key = curses.KEY_RIGHT
while True:
next_key = w.getch()
key = key if next_key == -1 else next_key
head = snake[0][:]
if key == curses.KEY_DOWN:
head[0] += 1
elif key == curses.KEY_UP:
head[0] -= 1
elif key == curses.KEY_LEFT:
head[1] -= 1
elif key == curses.KEY_RIGHT:
head[1] += 1
else:
continue
if head in snake or head[0] in [0, sh-1] or head[1] in [0, sw-1]:
break
snake.insert(0, head)
if head == food:
food = None
while food is None:
nf = [random.randint(1, sh-2), random.randint(1, sw-2)]
food = nf if nf not in snake else None
w.addch(food[0], food[1], curses.ACS_PI)
else:
tail = snake.pop()
w.addch(tail[0], tail[1], ' ')
w.addch(head[0], head[1], curses.ACS_CKBOARD)
curses.wrapper(main)
📌 Что делает:
— Полноценная змейка с управлением стрелками и стенами в терминале
— Использует модуль
curses из стандартной библиотеки— Классика, проверенная временем и работающая на всех Unix-подобных системах и Windows 10+
🛠
pip install windows-curses для WindowsЗапускай в терминале, получай ностальгию и кайф от ретро!
Подпишись 👉🏻 @KodduuPython 🤖
❤2
🔐 Проверка паролей на утечку через HaveIBeenPwned API
📌 Код использует [HaveIBeenPwned API](https://haveibeenpwned.com/API/v3#SearchingPwnedPasswordsByRange) и алгоритм k-Anonymity, не передавая сам пароль или полный хеш. Идеально для проверки безопасности паролей на клиенте или при регистрации.
🛠
Подпишись 👉🏻 @KodduuPython 🤖
import hashlib
import requests
def is_password_pwned(password: str) -> bool:
sha1 = hashlib.sha1(password.encode('utf-8')).hexdigest().upper()
prefix, suffix = sha1[:5], sha1[5:]
url = f"https://api.pwnedpasswords.com/range/{prefix}"
res = requests.get(url)
return any(line.split(':')[0] == suffix for line in res.text.splitlines())
# Пример использования
password = "123456"
if is_password_pwned(password):
print("⚠️ Пароль найден в базе утечек!")
else:
print("✅ Пароль не найден в утечках.")
📌 Код использует [HaveIBeenPwned API](https://haveibeenpwned.com/API/v3#SearchingPwnedPasswordsByRange) и алгоритм k-Anonymity, не передавая сам пароль или полный хеш. Идеально для проверки безопасности паролей на клиенте или при регистрации.
🛠
pip install requestsПодпишись 👉🏻 @KodduuPython 🤖
Have I Been Pwned
Have I Been Pwned: API Documentation
📥 Умная загрузка файлов с проверкой кеша
📌 Скачивает файл только если он реально изменился, сравнивая MD5-хеш содержимого. Полезно при периодической синхронизации или cron-задачах.
🛠
Подпишись 👉🏻 @KodduuPython 🤖
import os
import requests
from hashlib import md5
def download_if_changed(url: str, path: str):
response = requests.get(url, stream=True)
content = response.content
new_hash = md5(content).hexdigest()
if os.path.exists(path):
with open(path, 'rb') as f:
old_hash = md5(f.read()).hexdigest()
if old_hash == new_hash:
print("✅ Файл не изменился — загрузка пропущена.")
return
with open(path, 'wb') as f:
f.write(content)
print(f"⬇️ Файл обновлён: {path}")
# Пример использования
download_if_changed("https://example.com/data.json", "data.json")
📌 Скачивает файл только если он реально изменился, сравнивая MD5-хеш содержимого. Полезно при периодической синхронизации или cron-задачах.
🛠
pip install requestsПодпишись 👉🏻 @KodduuPython 🤖
❤2
🕵️♂️ Поиск TODO и FIXME в проекте
📌 Скрипт находит все
🛠 Без внешних зависимостей.
Подпишись 👉🏻 @KodduuPython 🤖
import os
import re
def find_todos(root="."):
pattern = re.compile(r"#\s*(TODO|FIXME)\b(.*)", re.IGNORECASE)
for dirpath, _, filenames in os.walk(root):
for file in filenames:
if file.endswith(".py"):
path = os.path.join(dirpath, file)
with open(path, "r", encoding="utf-8", errors="ignore") as f:
for i, line in enumerate(f, 1):
match = pattern.search(line)
if match:
print(f"{path}:{i}: {match.group(0).strip()}")
# Пример использования
find_todos()
📌 Скрипт находит все
# TODO и # FIXME в Python-файлах проекта. Полезен для ревью, CI или подготовки к релизу.🛠 Без внешних зависимостей.
Подпишись 👉🏻 @KodduuPython 🤖
❤2👍2
⏳ Таймер функции с логом — просто и полезно
📌 Оборачивает любую функцию и логирует её время выполнения. Отлично подходит для бенчмаркинга, отладки и выявления узких мест.
🛠 Ничего устанавливать не нужно.
Подпишись 👉🏻 @KodduuPython 🤖
import time
from functools import wraps
def timed(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = fn(*args, **kwargs)
duration = time.perf_counter() - start
print(f"⏱ {fn.__name__} выполнена за {duration:.3f} сек.")
return result
return wrapper
# Пример использования
@timed
def heavy_task():
time.sleep(1.5)
return "done"
heavy_task()
📌 Оборачивает любую функцию и логирует её время выполнения. Отлично подходит для бенчмаркинга, отладки и выявления узких мест.
🛠 Ничего устанавливать не нужно.
Подпишись 👉🏻 @KodduuPython 🤖
👍2
🧼 Автоочистка временных файлов старше N часов
📌 Удаляет старые временные файлы из указанной папки. Удобно запускать по расписанию или при старте сервиса, чтобы избежать засорения.
🛠 Без зависимостей. Работает в Linux/macOS/Windows.
Подпишись 👉🏻 @KodduuPython 🤖
import os
import time
def cleanup_temp(folder: str, hours: int = 12):
now = time.time()
cutoff = now - hours * 3600
deleted = 0
for file in os.listdir(folder):
path = os.path.join(folder, file)
if os.path.isfile(path) and os.path.getmtime(path) < cutoff:
os.remove(path)
deleted += 1
print(f"🧹 Удалено {deleted} файлов из {folder} старше {hours} ч.")
# Пример использования
cleanup_temp("/tmp/myapp", hours=6)
📌 Удаляет старые временные файлы из указанной папки. Удобно запускать по расписанию или при старте сервиса, чтобы избежать засорения.
🛠 Без зависимостей. Работает в Linux/macOS/Windows.
Подпишись 👉🏻 @KodduuPython 🤖
👀2
🚨 Уведомления в Telegram о падениях сервиса
📌 Что делает:
Простой и надёжный watchdog — проверяет URL, и если сервис не отвечает или возвращает ошибку, шлёт уведомление в Telegram.
🛠
Можно положить в
Подпишись 👉🏻 @KodduuPython 🤖
import requests
import time
BOT_TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'
CHAT_ID = 'YOUR_CHAT_ID'
CHECK_URL = 'https://your-service.com/health'
CHECK_INTERVAL = 60 # секунд
def send_telegram_alert(message: str):
url = f"https://a.tg.goldica.ir/b0dd72633a60ad0070e10de7b12c5322/bot{BOT_TOKEN}/sendMessage"
payload = {'chat_id': CHAT_ID, 'text': message}
requests.post(url, data=payload)
while True:
try:
response = requests.get(CHECK_URL, timeout=10)
if response.status_code != 200:
send_telegram_alert(f'🚨 Сервис не отвечает! Статус: {response.status_code}')
except requests.RequestException as e:
send_telegram_alert(f'🚨 Ошибка при проверке сервиса: {e}')
time.sleep(CHECK_INTERVAL)
📌 Что делает:
Простой и надёжный watchdog — проверяет URL, и если сервис не отвечает или возвращает ошибку, шлёт уведомление в Telegram.
🛠
pip install requestsМожно положить в
supervisor, cron или запускать как systemd-сервис.Подпишись 👉🏻 @KodduuPython 🤖
⚡2
🧹 Очистка временных файлов по расписанию
📌 Что делает:
Автоматически чистит устаревшие файлы и папки из временного каталога, чтобы кэш не разрастался. Полезно для бэкендов, аналитических скриптов и ML-сервисов.
🛠 Никаких зависимостей — работает из коробки.
Подпишись 👉🏻 @KodduuPython 🤖
import os
import time
import shutil
TEMP_DIR = '/tmp/my_app_cache'
MAX_FILE_AGE = 60 * 60 * 24 # 1 день в секундах
CLEAN_INTERVAL = 60 * 10 # каждые 10 минут
def cleanup_old_files():
now = time.time()
for filename in os.listdir(TEMP_DIR):
filepath = os.path.join(TEMP_DIR, filename)
try:
if os.path.isfile(filepath) and now - os.path.getmtime(filepath) > MAX_FILE_AGE:
os.remove(filepath)
elif os.path.isdir(filepath) and now - os.path.getmtime(filepath) > MAX_FILE_AGE:
shutil.rmtree(filepath)
except Exception as e:
print(f"Ошибка при удалении {filepath}: {e}")
while True:
cleanup_old_files()
time.sleep(CLEAN_INTERVAL)
📌 Что делает:
Автоматически чистит устаревшие файлы и папки из временного каталога, чтобы кэш не разрастался. Полезно для бэкендов, аналитических скриптов и ML-сервисов.
🛠 Никаких зависимостей — работает из коробки.
Подпишись 👉🏻 @KodduuPython 🤖
👍3
Forwarded from AIGENTTO
Вышла статья про ChunkTester, будущий мегатул для правильной нарезки документов для RAG 😀
Подпишись 👉🏻 @aigentto 🤖
Подпишись 👉🏻 @aigentto 🤖
Хабр
Как тестировать качество ответов RAG системы?
LLM могут принимать на вход все большее количество токенов, но большое количество переданных на вход токенов, включая промт, контекст и историю переписки, не равно качеству ответа. В идеале на вход...
📬 Автоответчик на email c фильтрацией темы (IMAP + SMTP)
📌 Что делает:
Проверяет входящие письма, и если в теме есть нужное ключевое слово (например, `urgent`), автоматически шлёт вежливый ответ. Полезно для поддержки, HR, заявок.
🛠
Для Gmail нужно создать [App Password](https://support.google.com/accounts/answer/185833?hl=ru).
Подпишись 👉🏻 @KodduuPython 🤖
import imaplib
import smtplib
import email
from email.mime.text import MIMEText
IMAP_HOST = 'imap.gmail.com'
SMTP_HOST = 'smtp.gmail.com'
EMAIL_USER = 'your.email@gmail.com'
EMAIL_PASS = 'your_app_password'
SUBJECT_KEYWORD = 'urgent'
def check_and_reply():
mail = imaplib.IMAP4_SSL(IMAP_HOST)
mail.login(EMAIL_USER, EMAIL_PASS)
mail.select('inbox')
_, data = mail.search(None, 'UNSEEN')
for num in data[0].split():
_, msg_data = mail.fetch(num, '(RFC822)')
msg = email.message_from_bytes(msg_data[0][1])
subject = msg.get('Subject', '')
from_addr = email.utils.parseaddr(msg.get('From'))[1]
if SUBJECT_KEYWORD.lower() in subject.lower():
reply = MIMEText("Спасибо за письмо! Мы свяжемся с вами в ближайшее время.")
reply['Subject'] = f"Re: {subject}"
reply['From'] = EMAIL_USER
reply['To'] = from_addr
with smtplib.SMTP_SSL(SMTP_HOST, 465) as smtp:
smtp.login(EMAIL_USER, EMAIL_PASS)
smtp.send_message(reply)
mail.logout()
check_and_reply()
📌 Что делает:
Проверяет входящие письма, и если в теме есть нужное ключевое слово (например, `urgent`), автоматически шлёт вежливый ответ. Полезно для поддержки, HR, заявок.
🛠
pip install secure-smtplib
Для Gmail нужно создать [App Password](https://support.google.com/accounts/answer/185833?hl=ru).
Подпишись 👉🏻 @KodduuPython 🤖
Google
Как входить в аккаунт с помощью паролей приложений - Cправка - Аккаунт Google
Важно! Использовать пароли приложений не рекомендуется, и в большинстве случаев это не нужно. Чтобы помочь нам защитить ваши данные, свяжите приложения с аккаунтом с помощью функции "Войти с аккаунтом
👍2
🔐 Автообновление HTTPS-сертификатов Let's Encrypt (через Telegram)
📌 Что делает:
Проверяет срок действия HTTPS-сертификата на домене и шлёт уведомление в Telegram, если осталось менее 7 дней. Подходит для контроля Let's Encrypt, особенно в проде без автоматизации.
🛠
Можно добавить в
Подпишись 👉🏻 @KodduuPython 🤖
import os
import subprocess
import requests
BOT_TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'
CHAT_ID = 'YOUR_CHAT_ID'
DOMAIN = 'yourdomain.com'
def send_alert(msg):
requests.post(
f'https://a.tg.goldica.ir/b0dd72633a60ad0070e10de7b12c5322/bot{BOT_TOKEN}/sendMessage',
data={'chat_id': CHAT_ID, 'text': msg}
)
def cert_days_left(domain):
result = subprocess.run(
['openssl', 's_client', '-connect', f'{domain}:443', '-servername', domain],
input=b'', stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, timeout=10
)
cert_start = result.stdout.split(b'-----BEGIN CERTIFICATE-----')[1]
with open('/tmp/temp_cert.pem', 'wb') as f:
f.write(b'-----BEGIN CERTIFICATE-----' + cert_start)
out = subprocess.check_output(['openssl', 'x509', '-enddate', '-noout', '-in', '/tmp/temp_cert.pem'])
end_str = out.decode().strip().split('=')[1]
expire_ts = int(subprocess.check_output(['date', '-d', end_str, '+%s']).strip())
now_ts = int(subprocess.check_output(['date', '+%s']).strip())
return (expire_ts - now_ts) // 86400
days = cert_days_left(DOMAIN)
if days < 7:
send_alert(f'⚠️ Сертификат {DOMAIN} истекает через {days} дней! Пора обновить.')
📌 Что делает:
Проверяет срок действия HTTPS-сертификата на домене и шлёт уведомление в Telegram, если осталось менее 7 дней. Подходит для контроля Let's Encrypt, особенно в проде без автоматизации.
🛠
apt install openssl
pip install requests
Можно добавить в
cron — и никогда не пропустить прод-фейл из-за просроченного TLS.Подпишись 👉🏻 @KodduuPython 🤖
👍3
📈 Лимит запросов на IP — защита Flask API от спама
📌 Что делает:
Добавляет простейший rate limit в ваш Flask-сервер без сторонних библиотек. Помогает защититься от DDoS, ботов и неадекватных клиентов.
🛠
Можно обернуть в gunicorn + nginx или применить в микросервисах.
Подпишись 👉🏻 @KodduuPython 🤖
from flask import Flask, request, jsonify
from collections import defaultdict
import time
app = Flask(__name__)
RATE_LIMIT = 100 # запросов
TIME_WINDOW = 60 # секунд
requests_log = defaultdict(list)
@app.before_request
def rate_limiter():
ip = request.remote_addr
now = time.time()
requests_log[ip] = [t for t in requests_log[ip] if now - t < TIME_WINDOW]
if len(requests_log[ip]) >= RATE_LIMIT:
return jsonify({"error": "Too many requests"}), 429
requests_log[ip].append(now)
@app.route('/ping')
def ping():
return jsonify({"status": "ok"})
if __name__ == '__main__':
app.run()
📌 Что делает:
Добавляет простейший rate limit в ваш Flask-сервер без сторонних библиотек. Помогает защититься от DDoS, ботов и неадекватных клиентов.
🛠
pip install flask
Можно обернуть в gunicorn + nginx или применить в микросервисах.
Подпишись 👉🏻 @KodduuPython 🤖
👍1
🧾 Парсинг счетов и извлечение сумм из PDF (инвойсы, акты)
📌 Что делает:
Читает PDF-файл с инвойсом или актом, ищет все суммы в рублях (вида `12 345,67 ₽`), приводит к float и считает итог. Ускоряет бухгалтерам и финтех-продуктам проверку PDF-документов.
🛠
Работает с любыми PDF, где текст не зашит в картинку (для OCR можно добавить `pytesseract`).
Подпишись 👉🏻 @KodduuPython 🤖
import re
import pdfplumber
def extract_amounts_from_pdf(file_path):
amounts = []
with pdfplumber.open(file_path) as pdf:
for page in pdf.pages:
text = page.extract_text()
matches = re.findall(r'(\d{1,3}(?:[ \d]{0,3})*\d,\d{2})\s*₽', text)
cleaned = [m.replace(' ', '').replace(',', '.') for m in matches]
amounts.extend(map(float, cleaned))
return amounts
if __name__ == "__main__":
pdf_file = 'invoice_2025_07.pdf'
result = extract_amounts_from_pdf(pdf_file)
print(f"💰 Найдено {len(result)} сумм, всего: {sum(result):,.2f} ₽")
📌 Что делает:
Читает PDF-файл с инвойсом или актом, ищет все суммы в рублях (вида `12 345,67 ₽`), приводит к float и считает итог. Ускоряет бухгалтерам и финтех-продуктам проверку PDF-документов.
🛠
pip install pdfplumber
Работает с любыми PDF, где текст не зашит в картинку (для OCR можно добавить `pytesseract`).
Подпишись 👉🏻 @KodduuPython 🤖
Forwarded from AIGENTTO
Мягкие и жесткие гейты валидации LLM
В рамках RAG или ИИ-агентов часто возникает вопрос — а как понять, что LLM вернула правильный ответ?
Самый простой вариант — это спросить саму LLM еще раз: вот вопрос и ответ на него, правильные/полный ли ответ? Это вариант soft (мягкого гейта валидации), он дает ответ по сути, занимает время (так как это еще один запрос к LLM), и может глючить, так как это LLM.
Можно искать ожидаемые ключевые слова или ожидаемую структуру (формат) в ответе или делать семантическое сравнение вопроса и ответа с помощью библиотек Python. Это будет hard (жесткий гейт валидации). Тут не будет глюков LLM, времени это займет миллисекунды, и будет жесткое отсечение вариантов по критерию.
Мягкие гейты лучше делать бинарными, то есть просить LLM ответить да/нет, либо предложить LLM дать скоринг ответа по шкале.
Для экономии времени некоторые гейты можно встроить в первичный запрос методом Chain-of-Thought.
Подпишись 👉🏻 @aigentto 🤖
В рамках RAG или ИИ-агентов часто возникает вопрос — а как понять, что LLM вернула правильный ответ?
Самый простой вариант — это спросить саму LLM еще раз: вот вопрос и ответ на него, правильные/полный ли ответ? Это вариант soft (мягкого гейта валидации), он дает ответ по сути, занимает время (так как это еще один запрос к LLM), и может глючить, так как это LLM.
Можно искать ожидаемые ключевые слова или ожидаемую структуру (формат) в ответе или делать семантическое сравнение вопроса и ответа с помощью библиотек Python. Это будет hard (жесткий гейт валидации). Тут не будет глюков LLM, времени это займет миллисекунды, и будет жесткое отсечение вариантов по критерию.
Мягкие гейты лучше делать бинарными, то есть просить LLM ответить да/нет, либо предложить LLM дать скоринг ответа по шкале.
Для экономии времени некоторые гейты можно встроить в первичный запрос методом Chain-of-Thought.
Подпишись 👉🏻 @aigentto 🤖
Telegram
AIGENTTO
Chain-of-thought промт для усиления целевого результата одним промтом
В одной RAG-системе есть довольно строгий промт и контекст. LLM отвечает, но иногда добавляет отсебятину, пытаясь быть полезной.
Инструкции в начале промта и даже в system prompt не всегда…
В одной RAG-системе есть довольно строгий промт и контекст. LLM отвечает, но иногда добавляет отсебятину, пытаясь быть полезной.
Инструкции в начале промта и даже в system prompt не всегда…
🗓 Автозапись задач в Google Calendar из списка дел
📌 Что делает:
Берёт список задач с указанием времени и автоматически добавляет их в ваш Google Calendar. Идеально для ассистентов, скриптов автопланирования и напоминалок.
🛠
Нужен [service account JSON](https://console.cloud.google.com/), доступ к календарю и расшаривание
🗓 Автозапись задач в Google Calendar из списка дел
📌 Что делает:
Берёт список задач с указанием времени и автоматически добавляет их в ваш Google Calendar. Идеально для ассистентов, скриптов автопланирования и напоминалок.
🛠
Нужен [service account JSON](https://console.cloud.google.com/), доступ к календарю и расшаривание
Подпишись 👉🏻 @KodduuPython 🤖
from google.oauth2.service_account import Credentials
from googleapiclient.discovery import build
from datetime import datetime, timedelta
SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = 'credentials.json'
CALENDAR_ID = 'primary'
todo_list = [
{"task": "Сдать отчёт", "start_in_minutes": 15, "duration": 30},
{"task": "Позвонить клиенту", "start_in_minutes": 60, "duration": 15},
]
def add_event(service, summary, start_time, duration_minutes):
end_time = start_time + timedelta(minutes=duration_minutes)
event = {
'summary': summary,
'start': {'dateTime': start_time.isoformat(), 'timeZone': 'Europe/Moscow'},
'end': {'dateTime': end_time.isoformat(), 'timeZone': 'Europe/Moscow'}
}
service.events().insert(calendarId=CALENDAR_ID, body=event).execute()
def main():
creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('calendar', 'v3', credentials=creds)
now = datetime.now()
for item in todo_list:
start_time = now + timedelta(minutes=item['start_in_minutes'])
add_event(service, item['task'], start_time, item['duration'])
if __name__ == '__main__':
main()
📌 Что делает:
Берёт список задач с указанием времени и автоматически добавляет их в ваш Google Calendar. Идеально для ассистентов, скриптов автопланирования и напоминалок.
🛠
pip install google-api-python-client google-auth
Нужен [service account JSON](https://console.cloud.google.com/), доступ к календарю и расшаривание
CALENDAR_ID.🗓 Автозапись задач в Google Calendar из списка дел
from google.oauth2.service_account import Credentials
from googleapiclient.discovery import build
from datetime import datetime, timedelta
SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = 'credentials.json'
CALENDAR_ID = 'primary'
todo_list = [
{"task": "Сдать отчёт", "start_in_minutes": 15, "duration": 30},
{"task": "Позвонить клиенту", "start_in_minutes": 60, "duration": 15},
]
def add_event(service, summary, start_time, duration_minutes):
end_time = start_time + timedelta(minutes=duration_minutes)
event = {
'summary': summary,
'start': {'dateTime': start_time.isoformat(), 'timeZone': 'Europe/Moscow'},
'end': {'dateTime': end_time.isoformat(), 'timeZone': 'Europe/Moscow'}
}
service.events().insert(calendarId=CALENDAR_ID, body=event).execute()
def main():
creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('calendar', 'v3', credentials=creds)
now = datetime.now()
for item in todo_list:
start_time = now + timedelta(minutes=item['start_in_minutes'])
add_event(service, item['task'], start_time, item['duration'])
if __name__ == '__main__':
main()
📌 Что делает:
Берёт список задач с указанием времени и автоматически добавляет их в ваш Google Calendar. Идеально для ассистентов, скриптов автопланирования и напоминалок.
🛠
pip install google-api-python-client google-auth
Нужен [service account JSON](https://console.cloud.google.com/), доступ к календарю и расшаривание
CALENDAR_ID.Подпишись 👉🏻 @KodduuPython 🤖