From c43baf04016a830bb7152977fca8f49a3ecd0b5d Mon Sep 17 00:00:00 2001 From: harold Date: Wed, 29 Jan 2025 23:42:08 +0500 Subject: [PATCH] add alpha --- ai_test.py | 20 +++------- poetry.lock | 34 +++++++++++++++- pyproject.toml | 3 +- src/advatroniks.session-journal | Bin 0 -> 53864 bytes src/core/common/constants.py | 2 +- src/core/common/promt.py | 58 +++++++++++++++++++++++++++ src/core/database/__init__.py | 6 ++- src/core/database/chats.py | 8 +++- src/core/database/tg_messages.py | 18 +++++++++ src/core/database/users.py | 15 +++++-- src/core/settings/base.py | 4 +- src/main.py | 66 ++++++++++++++++++++++++++++--- 12 files changed, 203 insertions(+), 31 deletions(-) create mode 100644 src/advatroniks.session-journal create mode 100644 src/core/common/promt.py create mode 100644 src/core/database/tg_messages.py diff --git a/ai_test.py b/ai_test.py index 0c5ebf9..2bf8968 100644 --- a/ai_test.py +++ b/ai_test.py @@ -2,6 +2,7 @@ import asyncio from groq import AsyncGroq +from src.core.common.promt import ROLE, ANALYTIC_PROMT from src.core.settings.base import settings # Убедитесь, что переменная окружения GROQ_API_KEY установлена @@ -11,23 +12,14 @@ client = AsyncGroq( ) -async def create_request(): - +async def create_request_ai(messages: list): chat_completion = await client.chat.completions.create( - messages=[ - { - "role": "system", - "content": "you are a helpful assistant." - }, - { - "role": "user", - "content": "Explain the importance of fast language models", - } - ], + messages=messages, model="llama-3.3-70b-versatile", + temperature=2, ) print(chat_completion.choices[0].message.content) -if __name__ == "__main__": - asyncio.run(create_request()) \ No newline at end of file +# if __name__ == "__main__": +# asyncio.run(create_request()) \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 0d497fb..e0663e3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -34,6 +34,19 @@ doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] +[[package]] +name = "async-timeout" +version = "5.0.1" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_full_version < \"3.11.3\"" +files = [ + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, +] + [[package]] name = "certifi" version = "2024.12.14" @@ -466,6 +479,25 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "redis" +version = "5.2.1" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, + {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} + +[package.extras] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] + [[package]] name = "sniffio" version = "1.3.1" @@ -655,4 +687,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = ">=3.11, <4.0" -content-hash = "b2defdffca356c862f69d5256e5602faa6f263c4c58f57090bb58fa2dccdbaeb" +content-hash = "c9de7a98768d02152241f4e8000d6186de1c0059ba9dba65dca76ee5a6b60ee2" diff --git a/pyproject.toml b/pyproject.toml index d78cb2d..cb33a37 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,8 @@ dependencies = [ "httpx (>=0.28.1,<0.29.0)", "groq (>=0.15.0,<0.16.0)", "sqlalchemy (>=2.0.37,<3.0.0)", - "pydantic-settings (>=2.7.1,<3.0.0)" + "pydantic-settings (>=2.7.1,<3.0.0)", + "redis (>=5.2.1,<6.0.0)" ] diff --git a/src/advatroniks.session-journal b/src/advatroniks.session-journal new file mode 100644 index 0000000000000000000000000000000000000000..8e006a4a9f6ed4920156944fa50d2346cdf2850e GIT binary patch literal 53864 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

?+GT>VEPQSI^TbcFkx3&C8ua&v@VQqS?GhO>8 zn5OL1mc3S>hE|ku0VcGhq951Z?)$X8)>?Y49{ov?4WG|m#ElK$S{CJ1dH-e#S!ofW z#T!0mpNOYL3g#YFg+v(Ul@@8=i8N=!yAul@(B_;izdNGUN9B>S%@I1}hF3Xj&@nh% z>v+Ok!^bZ5)Q{um)pmBg?E~*@h)4cb9>5wCri(xKWu1J>YSa8J8j<9q_j~T`_YOX zf1KKaR@AJSI(_u6ubyQq>e!D~bmz{TQ?#PK{;p5ATutg-T2ZTuLXiuP8qgvcx!Myy z6)dYzTBKbsTIBZC=g(-7)p0W*B zFPt(!5xDi`(zwla`y0oWZE-wH@9RqL<1 zhf*%4vs3)c(=U}RWnDo_9l!R^S6V7V)VqE){^i56r8>Q#rH+pK2mP%>T`5}+U2vbR z4=Y=0*nC>*$UnFLp`|LmH0`ex<=e7ssrWF;tRpi{heIjoa~bXGEGgR}TN-WA!p-@6Xp34t%AFgmih5Uixu)-FMN{tWokuImJaunF*MM@j%U0B5 z8!a_CZ;zUmQmxc%ZpR_n{S) z=YQYmmOOY;*@{BTlZw`VNK3)_RD>yBk*uh>~CluDca2QAgMaQ+V$#CbQ% zmhyi{*)Z>EQ8g$9Z0N;2w3r!&ma=^&}CkLDyaB{%O0VfBX9B^{L$pI$^{y%bn zpZV(0Ne4)%uub67_^YN(juESbuOyfGnGcs;B44pYQt_KBqAllLgxwN@2Jf0za{U5 zPpCn8{PZ_-Z~D;lB#qQdGS!17&^jIE`Drf>z8pyN1}pAtxESQEqEf#Svxx3s& zZXdT125t zUew6}CkLDyaB{%O0VfBX9B^{L$pI$^oE&g+z{vq82mZHmzzwwmf+t^DoS+9_aLK%c zdx}@ma_=bk-+EbRWljz_IpE}glLJl;I62_tfRh7G4mdgBH+>2vk^iH literal 0 HcmV?d00001 diff --git a/src/core/common/constants.py b/src/core/common/constants.py index a0379bc..c82d8ed 100644 --- a/src/core/common/constants.py +++ b/src/core/common/constants.py @@ -1,7 +1,7 @@ from enum import Enum from pathlib import Path -PATH_TO_BASE_FOLDER = Path(__file__).resolve().parents[1] +PATH_TO_BASE_FOLDER = Path(__file__).resolve().parents[3] LOG_DEFAULT_FORMAT = "[%(asctime)s.%(msecs)03d] %(module)10s:%(lineno)-3d %(levelname)-7s - %(message)s" diff --git a/src/core/common/promt.py b/src/core/common/promt.py new file mode 100644 index 0000000..6d5adc9 --- /dev/null +++ b/src/core/common/promt.py @@ -0,0 +1,58 @@ +ROLE = """ +Ты специалист по поиску клиентов в компании, которая занимается разработкой любого софта +на заказ. +""" + +ANALYTIC_PROMT = """ +Ты получаешь json с такими полями +{ + "messages": [ + { + "message_id": integer, + "user_id": integer, + "chat_id": integer, + "text": string, + "date": datetime + } + ] +} +messages - это срез диалога в чате телеграмма. +пользователи могут общаться на абсолютно разные темы. +Твоя задача: +Прочитать эти сообщения, понять тему текущего среза диалога. +И если ты поймешь, что мы можем какому то пользователю предложить свои услуги +например (написать интернет магазин, мобильное приложение или любой другой айти продукт) +то выведи в таком виде ответ. + +ВАЖНО: Если ты уверен на 100 процентов, что они заинтересованы в подобных услугах и им +можно предложить, то верни. + +{ + "user_id": integer, + "chat_id": integer, + "reason": string +} + +поле reason: Кратко(до 100 симоволов) почему ты решил, что это потенциальный клиент. + +Если ты хотя бы чуть чуть не уверен, то верни вот такой json +{ + "user_id": None, + "chat_id": None, + "reason": None, +} + +ВАЖНО: Ты должен вернуть ТОЛЬКО JSON и не словом больше. Иначе я разорюсь. + +""" + +BASE_MESSAGE = [ + { + "role": "system", + "content": ROLE.replace("\n", '') + }, + { + "role": "user", + "content": ANALYTIC_PROMT.replace("\n", ''), + } +] diff --git a/src/core/database/__init__.py b/src/core/database/__init__.py index 400e6f4..f88eba6 100644 --- a/src/core/database/__init__.py +++ b/src/core/database/__init__.py @@ -1,6 +1,10 @@ __all__ = [ "Base", + "TgMessage", + "TgChat", ] -from .base import Base \ No newline at end of file +from .base import Base +from .tg_messages import TgMessage +from .chats import TgChat \ No newline at end of file diff --git a/src/core/database/chats.py b/src/core/database/chats.py index 4323a8a..3c71c07 100644 --- a/src/core/database/chats.py +++ b/src/core/database/chats.py @@ -1,5 +1,9 @@ +from sqlalchemy.orm import Mapped + from src.core.database import Base -class Chat(Base): - pass \ No newline at end of file +class TgChat(Base): + telegram_chat_id: Mapped[int] + chat_type: Mapped[str] + title: Mapped[str] \ No newline at end of file diff --git a/src/core/database/tg_messages.py b/src/core/database/tg_messages.py new file mode 100644 index 0000000..108edd6 --- /dev/null +++ b/src/core/database/tg_messages.py @@ -0,0 +1,18 @@ +from datetime import datetime + +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped, mapped_column + +from src.core.database import Base + + + +class TgMessage(Base): + text: Mapped[str] + message_time: Mapped[datetime] + user_id: Mapped[int] = mapped_column( + ForeignKey("users.telegram_id"), + ) + chat_id: Mapped[int] = mapped_column( + ForeignKey("chats.telegram_chat_id"), + ) diff --git a/src/core/database/users.py b/src/core/database/users.py index af1f6e9..183e71e 100644 --- a/src/core/database/users.py +++ b/src/core/database/users.py @@ -1,9 +1,16 @@ -from sqlalchemy.orm import Mapped +from sqlalchemy import BigInteger +from sqlalchemy.orm import Mapped, mapped_column from src.core.database.base import Base class User(Base): - telegram_id: Mapped[int] - nickname: Mapped[str] - \ No newline at end of file + telegram_id: Mapped[int] = mapped_column( + BigInteger, + primary_key=True, + unique=True, + ) + username: Mapped[str] + first_name: Mapped[str | None] + last_name: Mapped[str | None] + diff --git a/src/core/settings/base.py b/src/core/settings/base.py index 312f2f0..4a570fa 100644 --- a/src/core/settings/base.py +++ b/src/core/settings/base.py @@ -6,6 +6,8 @@ from src.core.settings.database import DatabaseSettings from src.core.settings.groq import GroqSettings +print(EnvFileLocation.PRODUCTION) + class Settings(BaseSettings): model_config = SettingsConfigDict( case_sensitive=True, @@ -13,7 +15,7 @@ class Settings(BaseSettings): env_prefix=PydanticEnvPrefixEnum.APP.value, env_file=( EnvFileLocation.PRODUCTION, - EnvFileLocation.TESTING, + # EnvFileLocation.TESTING, ) ) diff --git a/src/main.py b/src/main.py index 7fa8f9e..f65c47f 100644 --- a/src/main.py +++ b/src/main.py @@ -1,6 +1,12 @@ +import json + from pyrogram import Client, filters +from pyrogram.enums import ChatType from pyrogram.types import Message +from ai_test import create_request_ai +from src.core.common.promt import BASE_MESSAGE + api_id = 17718565 api_hash = "72f93973f4227415572f039d4f847082" @@ -10,18 +16,66 @@ app = Client( api_hash=api_hash, ) +DATA = dict() + @app.on_message(filters.all) # Используем фильтр для сообщений из всех чатов -def listen_messages(client: Client, message: Message): - print(message.chat) +async def listen_messages(client: Client, message: Message): + # print(message.chat) chat_title = message.chat.title or message.chat.first_name or message.chat.username sender = message.from_user.first_name if message.from_user else "Система/Бот" text = message.text or "[не текстовое сообщение]" - print(f"Сообщение из чата: {chat_title}") - print(f"Отправитель: {sender}") - print(f"Текст: {text}") - print("-" * 40) + + + if message.chat.type not in [ChatType.PRIVATE, ChatType.BOT] and message.from_user: + if DATA.get(message.chat.id): + DATA[message.chat.id].append( + { + "message_id": message.id, + "user_id": message.from_user.id, + "chat_id": message.chat.id, + "text": message.text, + "date": message.date.strftime("%d/%m/%Y:%H:%M:%S"), + } + ) + else: + DATA[message.chat.id] = [ + { + "message_id": message.id, + "user_id": message.from_user.id, + "chat_id": message.chat.id, + "text": message.text, + "date": message.date.strftime("%d/%m/%Y:%H:%M:%S"), + } + ] + print(len(DATA[message.chat.id])) + + # print(chat_title, '|', len(DATA[message.chat.id])) + # print(len(DATA[message.chat.id])) + counter = 0 + + for key, value in DATA.items(): + if len(value) == 20 and counter == 0: + extend_message = { + "role": "user", + "content": json.dumps({ + "messages": value + }) + } + BASE_MESSAGE.append(extend_message) + await create_request_ai( + messages=BASE_MESSAGE + ) + + for _ in value: + print(_) + counter += 1 + + # print(f"Сообщение из чата: {chat_title}") + # print(f"Отправитель: {sender}") + # print(f"Текст: {text}") + # print("-" * 40) # Запуск клиента if __name__ == "__main__":