# behavioralflow
PT-BR
**BehavioralFlow** é fruto de um hobby onde eu busquei simular princípios básicos da Análise do Comportamento (AC), ciência que estuda o comportamento dos organismos. Consegui simular alguns dos conceitos básicos da AC (como reforçamento, punição, variação e discriminação de estímulos) e deixei alguns de fora (pelo menos nessa versão). Como resultado, percebi que acabei criando um algoritmo de aprendizagem por reforço, então decidi transformá-lo nesta biblioteca e compartilhar.
A biblioteca contém uma classe chamada Aprendente (simula o organismo capaz de aprender como agir). Os objetos instanciados com essa classe são capazes de aprender por reforçamento e podem levar em consideração o contexto (também chamado de antecedente em AC). Ou seja, eles aprendem o que devem fazer de acordo com o contexto fornecido. Além disso, podem criar sequências de ações básicas para criar ações novas.
EN-US
**BehavioralFlow** is the result of a hobby where I sought to simulate basic principles of Behavior Analysis (BA), the science that studies the behavior of organisms. I managed to simulate some of the basic BA concepts (such as reinforcement, punishment, variation, and stimulus discrimination) and left some out (at least in this version). As a result, I realized that I had created a reinforcement learning algorithm, so I decided to turn it into this library and share it.
The library contains a class called Aprendente (which simulates an organism capable of learning how to act). Objects instantiated with this class can learn through reinforcement and can consider the context (also called antecedent in BA). In other words, they learn what they should do according to the given context. Additionally, they can create sequences of basic actions to form new actions.
PT-BR
## Como usar a biblioteca
### Como criar um agente que aprende
Ao instaciar um Aprendente você deve passar como parâmetro obrigatório um dicionário contendo as ações básicas desse Aprendente.
As chaves desse dicionário obrigatoriamente devem ser tuplas (preferencialmente com apenas um ítem do tipo String) que serão os 'nomes' das ações.
Já os valores obrigatoriamente devem ser listas de dois ítens do tipo int >= 0.
O primeiro será o custo daquela ação (algo como a dificuldade que um organismo tem para realizar uma ação, ou energia gasta para realizar essa ação, quanto maior esse custo menor as chances dessa ação ser realizada).
O segundo int será um 'fator de probabilidade' quanto maior esse número em relação aos fatores das outras ações, maior as chances dessa ação acontecer. Se todas as ações tiverem o mesmo fator e mesmo custo terão a mesma chance de acontecer.
EXEMPLO:
from behavioralflow.core import Aprendente
acoes_do_exemplo1 = {
("ação_1",): [2, 5], # custo = 2, fator de probabilidade = 5
("ação_2",): [1, 3]
}
agente = Aprendente(acoes_do_exemplo1)
Existem 2 parametros opcionais ao se instanciar um Aprendente.
O primeiro é um booleano (por padrão ele é False), que se refere à capacidade do organismo de realizar a simulação de variação comportamental. Nesse caso se refere à capacidade de combinar ações básica passadas no primeiro parâmetro para criar novas ações. Isso pode acontecer quando uma ação ocorre e não é reforçada.
O segundo parametro opcional é um float x, tal que 1 < x > 0. Esse parametro se refere à probabilidade do Aprendente variar o comportamento a cada vez que não é reforçado, por padrão esse valor é 0.25
EN-US
## How to Use the Library
### How to Create a Learning Agent
When instantiating an Aprendente, you must pass a required dictionary containing the basic actions of this Aprendente.
The keys of this dictionary must be tuples (preferably with only one item of type String) that will be the 'names' of the actions.
The values must be lists of two items of type int >= 0. The first is the cost of that action (something like the difficulty an organism has in performing an action, or energy spent to perform it; the higher this cost, the lower the chance of this action being performed). The second int will be a 'probability factor'; the higher this number in relation to the factors of other actions, the higher the chances of this action occurring. If all actions have the same factor and cost, they will have the same probability of occurring.
EXAMPLE:
from behavioralflow.core import Aprendente
actions_example = {
("action_1",): [2, 5], # cost = 2, probability factor = 5
("action_2",): [1, 3]
}
agent = Aprendente(actions_example)
There are two optional parameters when instantiating an Aprendente.
The first is a boolean (default is False), which refers to the organism's ability to simulate behavioral variation. In this case, it refers to the ability to combine basic actions passed in the first parameter to create new actions. This can happen when an action occurs and is not reinforced.
The second optional parameter is a float x, such that 1 < x > 0. This parameter refers to the probability of the Aprendente varying its behavior each time it is not reinforced. By default, this value is 0.25.
PT-BR
### Como fazer o agente realizar ações e como reforçar ou punir
Para que o Aprendente emita alguma ação você deve usar o método 'Aprendente.proxima_acao()', esse método precisa de um parâmentro que será usado como antecedente ou contexto, esse parâmetro deve ser uma tupla, a quantidade e tipo dos iténs ficam a seu critério.
contexto = ("contexto_exemplo",)
acao = agente.proxima_acao(contexto)
print(f"Ação emitida: {acao}")
Quando o aprendente executar uma ação que deva acontecer mais vezes você deve usar o método 'Apredente.reforcar()'. Esse método possui 2 parâmetro opcionais.
O primeiro deve ser um int e é a magnitude do reforçamento, por padrão é 1, quanto maior mais reforçada a ação será, ou seja, mais aumenta a probabilidade daquela ação ocorrer.
Se o valor desse parâmetro for < 0 então a ação será punida, ou seja, a probabilidade séra diminuída. Se o fator chegar a ser igual ou menor que o custo a ação não aconterá mais, portanto não poderá ser reforçada.
O segundo parâmetro é a ação a ser reforçada, por padrão ele irá reforçar a última ação definida.
if acao = acao_desejada_nesse_contexto:
agente.reforcar()
elif acao = acao_indesejada
agente.reforcar(-1)
EN-US
### How to make the agent perform actions and how to reinforce or punish
For the Aprendente to emit an action, you must use the method 'Aprendente.proxima_acao()'. This method requires a parameter that will be used as an antecedent or context. This parameter must be a tuple, and the number and type of items are up to you.
context = ("example_context",)
action = agent.proxima_acao(context)
print(f"Emitted action: {action}")
When the Aprendente performs an action that should occur more frequently, you should use the 'Aprendente.reforcar()' method. This method has two optional parameters.
The first must be an int and represents the magnitude of reinforcement. By default, it is 1. The higher the value, the more reinforced the action will be, meaning the probability of that action occurring increases.
If this parameter's value is < 0, the action will be punished, reducing its probability. If the factor reaches or falls below the cost, the action will no longer occur and thus cannot be reinforced.
The second parameter is the action to be reinforced. By default, it reinforces the last defined action.
if action == desired_action_in_this_context:
agent.reforcar()
elif action == undesired_action:
agent.reforcar(-1)
PT-BR
### Sugestão de uso
Minha sugestão para usar essa biblioteca é que seu código tenha um loop onde
1) o antecedente/contexto que será passado como parâmetro será definido.
2) a proxima ação será definida usando .proxima_acao(antecedente).
3) a ação que foi definida será executada, para isso eu chamo outra função e passo a ação definida como parâmetro.
4) após a ação ser executada pode-se reforçada ou punida de acordo com o objetivo do seu projeto (por exemplo, reforçar se o agente conseguir prever algum dado de acordo com o contexto)
5) reiniciar o loop
Confira o arquivo 'exemplo.py' para ver um caso prático em que o agente aprende uma sequência esperada de ações.
para isso eu usei a ação anterior do agente como contexto e reforcei se a proxima ação correspondesse à sequência que eu gostaria e punia caso não.
No fim da interação o agente está executando as ações na sequência esperada, usando como contexto a ação executada anteriormente para escolher a próxima.
when True:
antecedente = definir_antecedente()
acao = agente.proxima_acao(antecedente)
resultado_da_acao = executar_acao(acao)
if resultado_da_acao = resultado_positivo:
agente.reforcar()
EN-US
### Usage Suggestion
My suggestion for using this library is that your code has a loop where:
The antecedent/context to be passed as a parameter is defined.
The next action is determined using .proxima_acao(antecedente).
The defined action is executed by calling another function and passing the defined action as a parameter.
After the action is executed, it can be reinforced or punished according to your project's objective (e.g., reinforcing if the agent manages to predict some data according to the context).
Restart the loop.
Check the 'exemplo.py' file for a practical case where the agent learns an expected sequence of actions. To do this, I used the agent's previous action as context and reinforced if the next action matched the sequence I wanted and punished if it did not. By the end of the interaction, the agent is executing actions in the expected sequence, using the previously executed action as context to choose the next one.
while True:
antecedente = definir_antecedente()
acao = agente.proxima_acao(antecedente)
resultado_da_acao = executar_acao(acao)
if resultado_da_acao == resultado_positivo:
agente.reforcar()
PT-BR
## Instalação
Para instalar a biblioteca, use o `pip`:
pip install behavioralflow
EN-US
## Installation
To install the library, use pip:
pip install behavioralflow
Raw data
{
"_id": null,
"home_page": "https://github.com/varejad/behavioral_flow",
"name": "behavioralflow",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "behavior analysis reinforcement learning psychology simulation",
"author": "Ademilson",
"author_email": "junior18ademilson@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/1e/26/56d6f41d2f1cbe45d01733bfea8f12bd9fd5c537e697c080ceefcd3f0fd4/behavioralflow-1.0.0.tar.gz",
"platform": null,
"description": "# behavioralflow\r\n\r\nPT-BR\r\n\r\n**BehavioralFlow** \u00e9 fruto de um hobby onde eu busquei simular princ\u00edpios b\u00e1sicos da An\u00e1lise do Comportamento (AC), ci\u00eancia que estuda o comportamento dos organismos. Consegui simular alguns dos conceitos b\u00e1sicos da AC (como refor\u00e7amento, puni\u00e7\u00e3o, varia\u00e7\u00e3o e discrimina\u00e7\u00e3o de est\u00edmulos) e deixei alguns de fora (pelo menos nessa vers\u00e3o). Como resultado, percebi que acabei criando um algoritmo de aprendizagem por refor\u00e7o, ent\u00e3o decidi transform\u00e1-lo nesta biblioteca e compartilhar.\r\n\r\nA biblioteca cont\u00e9m uma classe chamada Aprendente (simula o organismo capaz de aprender como agir). Os objetos instanciados com essa classe s\u00e3o capazes de aprender por refor\u00e7amento e podem levar em considera\u00e7\u00e3o o contexto (tamb\u00e9m chamado de antecedente em AC). Ou seja, eles aprendem o que devem fazer de acordo com o contexto fornecido. Al\u00e9m disso, podem criar sequ\u00eancias de a\u00e7\u00f5es b\u00e1sicas para criar a\u00e7\u00f5es novas.\r\n\r\nEN-US\r\n\r\n**BehavioralFlow** is the result of a hobby where I sought to simulate basic principles of Behavior Analysis (BA), the science that studies the behavior of organisms. I managed to simulate some of the basic BA concepts (such as reinforcement, punishment, variation, and stimulus discrimination) and left some out (at least in this version). As a result, I realized that I had created a reinforcement learning algorithm, so I decided to turn it into this library and share it.\r\n\r\nThe library contains a class called Aprendente (which simulates an organism capable of learning how to act). Objects instantiated with this class can learn through reinforcement and can consider the context (also called antecedent in BA). In other words, they learn what they should do according to the given context. Additionally, they can create sequences of basic actions to form new actions.\r\n\r\n\r\nPT-BR\r\n\r\n## Como usar a biblioteca\r\n\r\n### Como criar um agente que aprende\r\n\r\nAo instaciar um Aprendente voc\u00ea deve passar como par\u00e2metro obrigat\u00f3rio um dicion\u00e1rio contendo as a\u00e7\u00f5es b\u00e1sicas desse Aprendente.\r\n\r\nAs chaves desse dicion\u00e1rio obrigatoriamente devem ser tuplas (preferencialmente com apenas um \u00edtem do tipo String) que ser\u00e3o os 'nomes' das a\u00e7\u00f5es.\r\n\r\nJ\u00e1 os valores obrigatoriamente devem ser listas de dois \u00edtens do tipo int >= 0.\r\nO primeiro ser\u00e1 o custo daquela a\u00e7\u00e3o (algo como a dificuldade que um organismo tem para realizar uma a\u00e7\u00e3o, ou energia gasta para realizar essa a\u00e7\u00e3o, quanto maior esse custo menor as chances dessa a\u00e7\u00e3o ser realizada).\r\nO segundo int ser\u00e1 um 'fator de probabilidade' quanto maior esse n\u00famero em rela\u00e7\u00e3o aos fatores das outras a\u00e7\u00f5es, maior as chances dessa a\u00e7\u00e3o acontecer. Se todas as a\u00e7\u00f5es tiverem o mesmo fator e mesmo custo ter\u00e3o a mesma chance de acontecer.\r\n\r\nEXEMPLO:\r\n \r\n from behavioralflow.core import Aprendente\r\n\r\n acoes_do_exemplo1 = {\r\n (\"a\u00e7\u00e3o_1\",): [2, 5], # custo = 2, fator de probabilidade = 5\r\n (\"a\u00e7\u00e3o_2\",): [1, 3]\r\n }\r\n\r\n agente = Aprendente(acoes_do_exemplo1)\r\n\r\n\r\nExistem 2 parametros opcionais ao se instanciar um Aprendente.\r\nO primeiro \u00e9 um booleano (por padr\u00e3o ele \u00e9 False), que se refere \u00e0 capacidade do organismo de realizar a simula\u00e7\u00e3o de varia\u00e7\u00e3o comportamental. Nesse caso se refere \u00e0 capacidade de combinar a\u00e7\u00f5es b\u00e1sica passadas no primeiro par\u00e2metro para criar novas a\u00e7\u00f5es. Isso pode acontecer quando uma a\u00e7\u00e3o ocorre e n\u00e3o \u00e9 refor\u00e7ada.\r\nO segundo parametro opcional \u00e9 um float x, tal que 1 < x > 0. Esse parametro se refere \u00e0 probabilidade do Aprendente variar o comportamento a cada vez que n\u00e3o \u00e9 refor\u00e7ado, por padr\u00e3o esse valor \u00e9 0.25\r\n\r\n\r\nEN-US\r\n\r\n## How to Use the Library\r\n\r\n### How to Create a Learning Agent\r\n\r\nWhen instantiating an Aprendente, you must pass a required dictionary containing the basic actions of this Aprendente.\r\n\r\nThe keys of this dictionary must be tuples (preferably with only one item of type String) that will be the 'names' of the actions.\r\n\r\nThe values must be lists of two items of type int >= 0. The first is the cost of that action (something like the difficulty an organism has in performing an action, or energy spent to perform it; the higher this cost, the lower the chance of this action being performed). The second int will be a 'probability factor'; the higher this number in relation to the factors of other actions, the higher the chances of this action occurring. If all actions have the same factor and cost, they will have the same probability of occurring.\r\n\r\nEXAMPLE:\r\n\r\nfrom behavioralflow.core import Aprendente\r\n\r\nactions_example = {\r\n (\"action_1\",): [2, 5], # cost = 2, probability factor = 5\r\n (\"action_2\",): [1, 3]\r\n}\r\n\r\nagent = Aprendente(actions_example)\r\n\r\n\r\nThere are two optional parameters when instantiating an Aprendente.\r\nThe first is a boolean (default is False), which refers to the organism's ability to simulate behavioral variation. In this case, it refers to the ability to combine basic actions passed in the first parameter to create new actions. This can happen when an action occurs and is not reinforced.\r\nThe second optional parameter is a float x, such that 1 < x > 0. This parameter refers to the probability of the Aprendente varying its behavior each time it is not reinforced. By default, this value is 0.25.\r\n\r\n\r\nPT-BR\r\n\r\n### Como fazer o agente realizar a\u00e7\u00f5es e como refor\u00e7ar ou punir\r\nPara que o Aprendente emita alguma a\u00e7\u00e3o voc\u00ea deve usar o m\u00e9todo 'Aprendente.proxima_acao()', esse m\u00e9todo precisa de um par\u00e2mentro que ser\u00e1 usado como antecedente ou contexto, esse par\u00e2metro deve ser uma tupla, a quantidade e tipo dos it\u00e9ns ficam a seu crit\u00e9rio.\r\n\r\n contexto = (\"contexto_exemplo\",)\r\n acao = agente.proxima_acao(contexto)\r\n print(f\"A\u00e7\u00e3o emitida: {acao}\")\r\n\r\n\r\nQuando o aprendente executar uma a\u00e7\u00e3o que deva acontecer mais vezes voc\u00ea deve usar o m\u00e9todo 'Apredente.reforcar()'. Esse m\u00e9todo possui 2 par\u00e2metro opcionais.\r\nO primeiro deve ser um int e \u00e9 a magnitude do refor\u00e7amento, por padr\u00e3o \u00e9 1, quanto maior mais refor\u00e7ada a a\u00e7\u00e3o ser\u00e1, ou seja, mais aumenta a probabilidade daquela a\u00e7\u00e3o ocorrer.\r\nSe o valor desse par\u00e2metro for < 0 ent\u00e3o a a\u00e7\u00e3o ser\u00e1 punida, ou seja, a probabilidade s\u00e9ra diminu\u00edda. Se o fator chegar a ser igual ou menor que o custo a a\u00e7\u00e3o n\u00e3o aconter\u00e1 mais, portanto n\u00e3o poder\u00e1 ser refor\u00e7ada.\r\nO segundo par\u00e2metro \u00e9 a a\u00e7\u00e3o a ser refor\u00e7ada, por padr\u00e3o ele ir\u00e1 refor\u00e7ar a \u00faltima a\u00e7\u00e3o definida.\r\n\r\n if acao = acao_desejada_nesse_contexto:\r\n agente.reforcar()\r\n elif acao = acao_indesejada\r\n agente.reforcar(-1)\r\n\r\n\r\nEN-US\r\n\r\n### How to make the agent perform actions and how to reinforce or punish\r\n\r\nFor the Aprendente to emit an action, you must use the method 'Aprendente.proxima_acao()'. This method requires a parameter that will be used as an antecedent or context. This parameter must be a tuple, and the number and type of items are up to you.\r\n\r\ncontext = (\"example_context\",)\r\naction = agent.proxima_acao(context)\r\nprint(f\"Emitted action: {action}\")\r\n\r\nWhen the Aprendente performs an action that should occur more frequently, you should use the 'Aprendente.reforcar()' method. This method has two optional parameters.\r\nThe first must be an int and represents the magnitude of reinforcement. By default, it is 1. The higher the value, the more reinforced the action will be, meaning the probability of that action occurring increases.\r\nIf this parameter's value is < 0, the action will be punished, reducing its probability. If the factor reaches or falls below the cost, the action will no longer occur and thus cannot be reinforced.\r\nThe second parameter is the action to be reinforced. By default, it reinforces the last defined action.\r\n\r\nif action == desired_action_in_this_context:\r\n agent.reforcar()\r\nelif action == undesired_action:\r\n agent.reforcar(-1)\r\n\r\nPT-BR\r\n\r\n### Sugest\u00e3o de uso\r\n\r\nMinha sugest\u00e3o para usar essa biblioteca \u00e9 que seu c\u00f3digo tenha um loop onde \r\n1) o antecedente/contexto que ser\u00e1 passado como par\u00e2metro ser\u00e1 definido.\r\n2) a proxima a\u00e7\u00e3o ser\u00e1 definida usando .proxima_acao(antecedente).\r\n3) a a\u00e7\u00e3o que foi definida ser\u00e1 executada, para isso eu chamo outra fun\u00e7\u00e3o e passo a a\u00e7\u00e3o definida como par\u00e2metro.\r\n4) ap\u00f3s a a\u00e7\u00e3o ser executada pode-se refor\u00e7ada ou punida de acordo com o objetivo do seu projeto (por exemplo, refor\u00e7ar se o agente conseguir prever algum dado de acordo com o contexto)\r\n5) reiniciar o loop\r\n\r\nConfira o arquivo 'exemplo.py' para ver um caso pr\u00e1tico em que o agente aprende uma sequ\u00eancia esperada de a\u00e7\u00f5es.\r\npara isso eu usei a a\u00e7\u00e3o anterior do agente como contexto e reforcei se a proxima a\u00e7\u00e3o correspondesse \u00e0 sequ\u00eancia que eu gostaria e punia caso n\u00e3o.\r\nNo fim da intera\u00e7\u00e3o o agente est\u00e1 executando as a\u00e7\u00f5es na sequ\u00eancia esperada, usando como contexto a a\u00e7\u00e3o executada anteriormente para escolher a pr\u00f3xima.\r\n\r\n when True:\r\n antecedente = definir_antecedente()\r\n\r\n acao = agente.proxima_acao(antecedente)\r\n\r\n resultado_da_acao = executar_acao(acao)\r\n\r\n if resultado_da_acao = resultado_positivo:\r\n agente.reforcar()\r\n\r\n\r\nEN-US\r\n\r\n### Usage Suggestion\r\n\r\nMy suggestion for using this library is that your code has a loop where:\r\n\r\nThe antecedent/context to be passed as a parameter is defined.\r\n\r\nThe next action is determined using .proxima_acao(antecedente).\r\n\r\nThe defined action is executed by calling another function and passing the defined action as a parameter.\r\n\r\nAfter the action is executed, it can be reinforced or punished according to your project's objective (e.g., reinforcing if the agent manages to predict some data according to the context).\r\n\r\nRestart the loop.\r\n\r\nCheck the 'exemplo.py' file for a practical case where the agent learns an expected sequence of actions. To do this, I used the agent's previous action as context and reinforced if the next action matched the sequence I wanted and punished if it did not. By the end of the interaction, the agent is executing actions in the expected sequence, using the previously executed action as context to choose the next one.\r\n\r\nwhile True:\r\n antecedente = definir_antecedente()\r\n\r\n acao = agente.proxima_acao(antecedente)\r\n\r\n resultado_da_acao = executar_acao(acao)\r\n\r\n if resultado_da_acao == resultado_positivo:\r\n agente.reforcar()\r\n\r\nPT-BR\r\n\r\n## Instala\u00e7\u00e3o\r\n\r\nPara instalar a biblioteca, use o `pip`:\r\n\r\npip install behavioralflow\r\n\r\n\r\nEN-US\r\n\r\n## Installation\r\n\r\nTo install the library, use pip:\r\n\r\npip install behavioralflow\r\n\r\n",
"bugtrack_url": null,
"license": "Apache License 2.0",
"summary": "Uma biblioteca para simular alguns princ\u00edpios comportamentais b\u00e1sicos, como refor\u00e7amento.",
"version": "1.0.0",
"project_urls": {
"Homepage": "https://github.com/varejad/behavioral_flow"
},
"split_keywords": [
"behavior",
"analysis",
"reinforcement",
"learning",
"psychology",
"simulation"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "fb682d0335e0b5aa2a92e540c26cba0fea172327a5616592484786b01d30f2fd",
"md5": "142fd60de0d295f0794a218378741003",
"sha256": "80de5ec461cddc04d0aab6856b2d6376b982abdef8f22b9cf87cf3fa3cfd5333"
},
"downloads": -1,
"filename": "behavioralflow-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "142fd60de0d295f0794a218378741003",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 12626,
"upload_time": "2025-10-26T14:32:30",
"upload_time_iso_8601": "2025-10-26T14:32:30.773147Z",
"url": "https://files.pythonhosted.org/packages/fb/68/2d0335e0b5aa2a92e540c26cba0fea172327a5616592484786b01d30f2fd/behavioralflow-1.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1e2656d6f41d2f1cbe45d01733bfea8f12bd9fd5c537e697c080ceefcd3f0fd4",
"md5": "fb0764bb42e7ad2f2ab1eabc5fb02068",
"sha256": "67bd7d612fb86337094e4dabee301f84381558096f219a439da681076a06a015"
},
"downloads": -1,
"filename": "behavioralflow-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "fb0764bb42e7ad2f2ab1eabc5fb02068",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 12638,
"upload_time": "2025-10-26T14:32:32",
"upload_time_iso_8601": "2025-10-26T14:32:32.128510Z",
"url": "https://files.pythonhosted.org/packages/1e/26/56d6f41d2f1cbe45d01733bfea8f12bd9fd5c537e697c080ceefcd3f0fd4/behavioralflow-1.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-26 14:32:32",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "varejad",
"github_project": "behavioral_flow",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "behavioralflow"
}