First of all, it's Brazilian Portuguese, not Spanish.
There is no english README (apart from the tl;dr part below). Sorry about that, either learn brazilian portuguese or wait for the translation. Millions of people in the internet have been reading in english everyday for decades even though that's not their mother language. You're smart, you can do it too. If you can't, at least you can exercise your patience ;)
Main script uses a mix of MVC design and influence from the python
frameworks in use's "way to do it (tm)" and resides at src/iacecil
directory (iacecil
package).
Plugins are supposed to work as independent scripts and reside at
src/plugins directory (plugins
package).
Configuration files and local modules / packages are supposed to reside at instance/ directory.
The doc/ directory is supposed to be helpful and have the documentation on everything. But we all know that it is impossible. If you don't agree that 100% of github repositories can only be understood by it's creator, you're not coding for long enough. That said, I'm an easy to reach person and I can answer any questions with attention if you manage to reach me.
Esta é um chatbot que funciona em múltiplas plataformas baseado em plugins e escrito em Python.
O projeto original era a Paloma que era uma chatbot de IRC, e posteriormente se tornou bouncer para várias plataformas. Após isto, a Paloma virou MateBot que é um bot de telegram e discord. O escopo do projeto foi ampliado e se tornou a IA Cecil (ia.cecil), uma inteligência artificial controlada (???) por programação, com uma rede neural simples e acesso a algoritmos de aprendizado de máquina.
Não me pergunte o por quê do nome. Se não for óbvio, eu não quero responder.
Toda vez que eu estou entediado, eu escrevo mais um pouco de código aqui. Isto acontece desde 2011 (calendário gregoriano).
Se este projeto virar um produto de uma startup, a culpa não é minha. Se este projeto virar uma obra coletiva de tecnocracia, a culpa não é minha. Se este projeto virar uma inteligência artificial que cause um grande impacto na história da humanidade, a culpa não é minha. Na altamente improvável eventualidade de a culpa ser minha, eu espero ser avisado a tempo de botar a culpa em quem eu quiser (já que é minha, eu faço o que eu quero).
1199 text files.
532 unique files.
1033 files ignored.
github.com/AlDanial/cloc v 1.90 T=167.99 s (1.3 files/s, 186.1 lines/s)
--------------------------------------------------------------------------------
Language files blank comment code
--------------------------------------------------------------------------------
Python 177 1810 7242 19152
HTML 22 19 78 1338
Markdown 3 343 0 1210
XML 2 0 0 22
JavaScript 4 4 19 5
Bourne Again Shell 1 0 0 4
CSS 3 0 10 3
TOML 1 0 0 3
--------------------------------------------------------------------------------
SUM: 213 2176 7349 21737
--------------------------------------------------------------------------------
Ver também o arquivo CHANGES.TXT
Nível de automata: combinational logic
- Bot deve responder comandos com valores pré definidos
- Bot pode ter personalidade fixa configurada previamente e que vai perdurar durante todo o seu funcionamento
- Novas funcionalidades podem ser acrescentadas através de plugins
- Funcionalidades podem ser ativadas ou desativadas de acordo com personalidade ou finalidade do bot
- Sistema de log para depuração
Funcionalidades presentes em forks ou versão v0.0.14.0
- Conversão de valores [coinmarketcap] (cryptoforex)
- Integração com bancos de dados externos [velivery] (vegga)
- Envio de SMS e realização de ligações telefônicas [totalvoice] (vegga)
- Sistema auxiliar para produção de alimentos [cr1pt0_almoco]
- Integração com ESP32 e monitoramento climático (climobike)
- Controle de atividades de trabalho [workrave] (gê)
Funcionalidades presentes em forks ou versão v0.1.0.0
- Geração de QR Code (matebot)
- Geração de números aleatórios (matebot)
- Cálculo de hash de textos (matebot)
- Recepção de novos usuários em grupos no Telegram (matebot)
- Salvar URLs na Wayback Machine (matebot)
- Download de vídeos do Youtube (matebot)
Nível de automata: finite-state machine
- Bot deve responder comandos de acordo com regras fixas e variáveis conforme aprendizado prévio
- Bot deve ter personalidade configurada no estado inicial que pode variar e humor que deve variar
- Funcionalidades podem ser ativadas ou desativadas de acordo com mudança de personalidade, humor ou evento de aprendizado
- Sistema de coleta de dados para machine learning
- Bot deve funcionar no Telegram e no Discord
- Faz questionários para usuários e armazena as informações em banco de dados
- Usa dados obtidos para tomar decisões e adicionar pessoas em grupos de acordo com critérios estabelecidos
- Cria perfil de pessoas através de análise de respostas
- Otimiza perfil de pessoas através de análise de comportamento
- Traduzir este README
- Translate the README back to English, Pedro Bó
- Usar dicionários em todos os retornos de funções
- Melhorar o empacotamento dos plugins
- Migrar de telepot para python-telegram-bot tag v0.1.0.0a
- Acrescentar também código para usar com aiogram tag v0.1.3.0
- Tratar as exceções corretamente, principalmente as informativas
- Exceções informativas para quem está tentando instalar o bot do zero suficientemente tratadas e suficientemente informativas com commit 367613a
- Usar Exception Handling do python-telegram-bot
- Arquivos para usar com Heroku
- Arquivos para usar com Docker
- Documentar o roadmap com issues, milestones e projetos do github
- Issues feitas durante uma Terça Sem Fim
Nível de automata: finite-state machine
Em fase de planejamento, código fechado.
Este software ainda não está no pypi.org, então:
pip install -e git+https://github.com/iuriguilherme/iacecil.git@stable#egg=iacecil
python -m iacecil production
Se vossa excelência quiserdes usar o código deste bot pra fazer o vosso próprio, vós deveis:
Para mais informações, veja o arquivo LICENSE.md.
...e incidentalmente, Github, Gitlab ou Notabug - que são coisas completamente diferentes de git.
Para mexer no código agora mesmo no Linux:
user@home:~$ git clone https://github.com/iuriguilherme/iacecil.git
user@home:~$ cd iacecil
user@home:~/iacecil$ pyenv exec python -m pip install --user --upgrade pip pipenv
user@home:~/iacecil$ pipenv install -e .
user@home:~/iacecil$ pipenv run test
Se algum dos passos acima não der certo, usardes o vosso próprio método pessoal (virtualenv, virtualenvwrapper, poetry, etc.)
Eu criei um grupo novo para quem quiser conversar sobre, usar, testar, desenvolver e acompanhar o processo de desenvolvimento, teste e uso da bot: https://t.me/joinchat/CwFUFkf-dKW34FPBjEJs9Q
Grupo só para testar bots (pode gerar o caos): https://t.me/joinchat/CwFUFhbgApLHBMLoNnkiRg
Grupo para testar o plugin de logs: https://t.me/joinchat/CwFUFhy2NQRi_9Cc60v_aA
Pra testar o plugin de logs, coloque o bot neste grupo e use o chat_id
-481703172
no arquivo de configuração (bot.users['special']['log'])
Este bot foi testado com Python 3.10; Se vós não tiverdes Python, instale!
Estamos usando FastAPI, Quart, Aiogram, Flask, Python Telegram Bot, discordPy, NLTK, web3, youtube-dl, ZODB, sympy, numpy, matplotlib, mpmath, apscheduler, aiohttp, pandas, openai, furhat, colorama, amazon boto3, então é necessário instalá-los para rodar o bot.
Alguns plugins que tratam arquivos de áudio e de vídeo usam o pacote python-ffmpeg que por sua vez usa o ffmpeg do sistema. Instruções para instalar ffmpeg em cada sistema fogem do escopo deste arquivo.
Ritual de instalação:
O jeito que eu faço é com pipenv, inclusive está incluso o Pipfile no repositório:
user@home:~/iacecil$ python3.10 -m ensurepip
user@home:~/iacecil$ python3.10 -m pip install --user --upgrade pip pipenv
user@home:~/iacecil$ pipenv install
Quem não quiser usar pipenv pode usar virtualenvwrapper, virtualenv,
poetry, ou outro método de preferência se souber o que está fazendo. Um
arquivo requirements.txt
é mantido atualizado no repositório.
user@home:~/iacecil$ pyenv exec python -m venv iacecilenv
user@home:~/iacecil$ ./iacecilenv/bin/activate
(iacecilenv) pip install -r requirements.txt
...ou coisa parecida.
TODO: Fazer instruções para usar sem pipenv, para poetry, etc.
AVISO: As instruções estão desatualizadas. O fluxo atual é usar um arquivo _bots.py com uma lista assim:
./instance/_bots.py
bots = [
"testebot",
"outrobot",
]
E o diretório instance/ fica parecido com isto:
instance/
_bots.py
bots/
__init__.py
testebot.py
outrobot.py
zodb/
personalidades/
__init__.py
teste/
__init__.py
outro.py
O arquivo testbot.py
deve ser parecido com isto:
instance/bots/testbot.py
from pydantic import BaseSettings
try:
from .default import DefaultBotConfig
except Exception as e:
logger.exception(e)
from iacecil.config import DefaultBotConfig
default_config = DefaultBotConfig()
class BotConfig(BaseSettings):
coinmarketcap: dict = default_config.coinmarketcap
discord: dict = default_config.discord
donate: dict = default_config.donate
furhat: dict = default_config.furhat
info: dict = default_config.info
jobs: list = default_config.jobs
quart: dict = default_config.quart
serpapi: dict = default_config.serpapi
tecido: dict = default_config.tecido
timezone: str = default_config.timezone
tropixel: dict = default_config.tropixel
web3: dict = default_config.web3
personalidade: str = "cryptoforex"
plugins: dict = dict(
enable = [
"admin",
"cryptoforex",
"donate",
"feedback",
"qr",
"web3_wrapper",
"natural",
"default",
], # enable
disable = [
"echo",
"bomdia",
"greatful",
"totalvoice",
"portaria",
"archive",
"calendar",
"hashes",
"mate_matica",
"storify",
"tts",
"ytdl",
"tropixel",
"welcome",
"garimpo",
"tracker",
], # disable
telegram: dict = dict(
default_config.telegram.copy(),
token = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
) # telegram
Este exemplo vai fazer um bot de telegram parecido com o cryptoforexbot.
Tokens de bot de telegram são obtidas com o @BotFather
Existe um programa para usar um robô furhat (ou SDK) integrado com chatGPT. Depois de configurar o software segundo o passo anterior, lembrando de incluir o dicionário de configuração furhat e openai:
from pydantic import BaseSettings
try:
from .default import DefaultBotConfig
except Exception as e:
logger.exception(e)
from iacecil.config import DefaultBotConfig
default_config = DefaultBotConfig()
class BotConfig(BaseSettings):
furhat: dict = {
'bot': "f1",
'address': "127.0.0.1", # Furhat RemoteAPI ou SDK
'voice': "Camila-Neural",
'mask': "adult",
'character': "Kione",
'language': "pt-BR",
}
openai: dict = {
'api_keys': [
'sk-1234567890abcdefABCDEF',
], # api_keys
} # openai
O programa roda com esse controlador:
python -m iacecil fpersonas
Para usar a versão com Flask (ou Quart), é necessário também renomear o
arquivo doc/default_env
para .env
. Ou criar um arquivo .env
com
as variáveis FLASK_APP e FLASK_ENV (ou QUART_APP /
QUART_ENV). Caso estes arquivos não existam, as configurações
padrão serão usadas.
Na configuração padrão do Quart, a aplicação é servida com um arquivo
Unix Socket uvicorn.sock
. Para usar uma porta e um endereço TCP/IP,
basta manter a configuração das portas e mudar config.socket
para
None
.
TODO: Testar o método acima pra ter certeza de que é verdade
No diretório principal da iacecil:
Para rodar com pipenv, assumindo que a configuração já está correta:
user@home:~/iacecil$ pipenv run test
Depois de instalado como pacote editável:
python -m iacecil
Exemplo de arquivo para usar com systemd:
[Unit]
Description=IACecil daemon
After=network.target nss-lookup.target
[Service]
Type=simple
ExecStart=/home/user/.local/bin/pipenv run prod
## Sem pipenv:
#ExecStart=/home/user/.local/bin/python -m iacecil production
WorkingDirectory=/home/user/iacecil/
Restart=on-failure
[Install]
WantedBy=multi-user.target
O python em ExecStart deve ser o mesmo python usado para instalar as dependências.
Em um sistema Debian, este arquivo deveria estar em
${HOME}/.config/systemd/user/iacecil.service
.
Habilitando o serviço na inicialização do sistema e iniciando agora:
user@home:~$ systemctl --user daemon-reload
user@home:~$ systemctl --user enable iacecil.service
user@home:~$ systemctl --user -l start iacecil.service
Para ver se está funcionando:
user@home:~$ systemctl --user -l status iacecil.service
Parar:
user@home:~$ systemctl --user stop iacecil.service
Remover da inicialização:
user@home:~$ systemctl --user disable iacecil.service
Reiniciar:
user@home:~$ systemctl --user -l restart iacecil.service
Para o caso de usar systemd como root, o arquivo de configuração deve
estar em /lib/systemd/system/iacecil.service
, e os comandos devem ser
utilizados sem o --user
, como por exemplo:
root@home:/root# systemctl -l restart iacecil.service
Mas eu não recomendo esta abordagem.
Também é possível usar cron para verificar se o bot está no ar periodicamente:
user@home:~$ crontab -e
Adicione uma linha como por exemplo esta na crontab:
*/10 * * * * /usr/lib/systemctl --user is-active iacecil.service || /usr/lib/systemctl --user restart iacecil.service
Isto vai verificar se o bot está no ar a cada 10 minutos, e reiniciar o serviço caso esteja fora do ar.
AVISO: O dockerfile foi criado para uma versão antiga do software, ainda não foi adaptado para a versão atual.
FIXME: Adaptar o dockerfile e remover este aviso
Adicione seu token em BOTFATHER_TOKEN
no arquivo
doc/default_config.py
e depois rode os comandos abaixo na raiz do
projeto
docker build -t iacecil -f Dockfile .
docker run -d --name iacecil iacecil
docker inspect iacecil | grep IPAddress
Após esses comandos você terá o IP do seu container pegue esse IP e
acesse via CURL IP:5000
Copyleft 2012-2023 Iuri Guilherme https://iuri.neocities.org/
Este programa é um software livre; você pode redistribuí-lo e/ou
modificá-lo sob os termos da Licença Pública Geral GNU como publicada
pela Free Software Foundation; na versão 3 da Licença, ou
(a seu critério) qualquer versão posterior.
Este programa é distribuído na esperança de que possa ser útil,
mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO
a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
Licença Pública Geral GNU para mais detalhes.
Você deve ter recebido uma cópia da Licença Pública Geral GNU junto
com este programa (veja o arquivo LICENSE.md).
Se não, veja http://www.gnu.org/licenses/.