Recursos adicionais do Streamlit in Snowflake

Este tópico descreve os recursos adicionais do Streamlit in Snowflake.

UI personalizada no Streamlit in Snowflake

A UI personalizada permite a customização da aparência e do comportamento, bem como de funcionalidades front-end dos aplicativos Streamlit in Snowflake. Este recurso oferece suporte ao seguinte:

Nota

A UI personalizada possui algumas restrições relacionadas à Política de segurança de conteúdo (CSP). Para obter mais informações, consulte Limitações ao carregar recursos externos no Streamlit in Snowflake.

Para começar a personalizar seu aplicativo Streamlit in Snowflake, basta chamar st.components.v1.html ou st.markdown com unsafe_allow_html=True. O HTML fornecido é adicionado ao front-end do aplicativo no navegador do usuário.

Nota

Você deve especificar o HTML em linha ou carregar o HTML em uma cadeia de caracteres. Você não pode passar um URL ou um caminho de arquivo diretamente para o comando a ser executado ou incorporado.

Consulte os seguintes exemplos para personalizar seus aplicativos Streamlit in Snowflake:

  • Personalize a cor de fundo da barra lateral:

    st.markdown("""
      <style>
        [data-testid=stSidebar] {
          background-color: #94d3e6;
        }
      </style>
    """, unsafe_allow_html=True)
    
    Copy
  • Adicione um logotipo de aplicativo com streamlit-extras:

    Certifique-se de instalar o pacote streamlit-extras antes de executar.

    from streamlit_extras.app_logo import add_logo
    add_logo("./Logo.png", height=60)
    
    Copy
  • Defina a largura da barra lateral programaticamente:

    import streamlit.components.v1 as components
    
    components.html("""
      <script>
        window.parent.document.querySelector('[data-testid="stSidebar"]').style.width = "300px";
      </script>
    """, height=0)
    
    Copy
  • Crie uma análise de dados exploratória de DataFrame no navegador (EDA) com ydata-profiling:

    import streamlit as st
    import streamlit.components.v1 as components
    from sklearn.datasets import load_iris
    from ydata_profiling import ProfileReport
    
    st.set_page_config(layout="wide")
    df = load_iris(as_frame=True).data
    html = ProfileReport(df).to_html()
    components.html(html, height=500, scrolling=True)
    
    Copy

Acesso à rede externa no Streamlit in Snowflake

É possível criar acesso seguro a locais de rede específicos externos ao Snowflake e usar esse acesso de dentro do código do aplicativo Streamlit. É possível habilitar o acesso por meio de uma integração de acesso externo.

Para permitir que um aplicativo Streamlit use uma integração de acesso externo, você pode executar o comando CREATE STREAMLIT ou ALTER STREAMLIT e definir o parâmetro EXTERNAL_ACCESS_INTEGRATIONS para incluir essa integração.

Com uma integração de acesso externo, você pode usar bibliotecas Python que acessam locais externos, como requests ou urllib, e usar bibliotecas de terceiros que exigem acesso a um local de rede.

Para obter mais informações, consulte Visão geral do acesso à rede externa.

Exemplo: Acesse a API OpenAI

O exemplo a seguir mostra como criar uma integração de acesso externo para uma solicitação de saída para a API OpenAI. Este exemplo inclui a configuração da integração de segurança e a concessão dos privilégios necessários.

  1. Para criar uma regra de rede que represente o local da rede externa e as restrições de acesso, use o comando CREATE NETWORK RULE conforme mostrado no exemplo a seguir:

    CREATE OR REPLACE NETWORK RULE network_rules
      MODE = EGRESS
      TYPE = HOST_PORT
      VALUE_LIST = ('api.openai.com');
    
    Copy

    Para obter mais informações, consulte Criação de uma regra de rede para representar o local da rede externa.

  2. Para criar um segredo que represente as credenciais necessárias para autenticação com o local de rede externa, use o comando CREATE SECRET, conforme mostrado no exemplo a seguir:

    CREATE OR REPLACE SECRET openai_key
      TYPE = GENERIC_STRING
      SECRET_STRING = '<any_string>';
    
    Copy

    Para obter mais informações, consulte Criação de um segredo para representar credenciais.

  3. Para criar uma integração de acesso externo, execute o comando CREATE EXTERNAL ACCESS INTEGRATION, configuração ALLOWED_NETWORK_RULES como a regra de rede que você criou e ALLOWED_AUTHENTICATION_SECRETS como o segredo que você criou:

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION openai_access_int
      ALLOWED_NETWORK_RULES = (network_rules)
      ALLOWED_AUTHENTICATION_SECRETS = (openai_key)
      ENABLED = TRUE;
    
    Copy
  4. Para conceder os privilégios necessários para usar os objetos SECRET e INTEGRATION para acesso externo ao criador do aplicativo Streamlit, use o comando GRANT <privilégios>, conforme mostrado no exemplo a seguir:

    GRANT READ ON SECRET openai_key TO ROLE streamlit_app_creator_role;
    GRANT USAGE ON INTEGRATION openai_access_int TO ROLE streamlit_app_creator_role;
    
    Copy
  5. Para permitir que o aplicativo Streamlit use a integração, execute o comando ALTER STREAMLIT, configurando a propriedade EXTERNAL_ACCESS_INTEGRATIONS para a integração, conforme mostrado no exemplo a seguir:

    USE ROLE streamlit_app_creator_role;
    
    ALTER STREAMLIT streamlit_db.streamlit_schema.streamlit_app
      SET EXTERNAL_ACCESS_INTEGRATIONS = (openai_access_int)
      SECRETS = ('my_openai_key' = streamlit_db.streamlit_schema.openai_key);
    
    Copy

    Nota

    Você também pode definir um novo objeto Streamlit para usar uma integração de acesso externo especificando o parâmetro EXTERNAL_ACCESS_INTEGRATIONS ao executar o comando CREATE STREAMLIT, conforme mostrado no exemplo a seguir:

    CREATE STREAMLIT streamlit_db.streamlit_schema.streamlit_app
      ROOT_LOCATION = '<stage_path_and_root_directory>'
      MAIN_FILE = '<path_to_main_file_in_root_directory>'
      EXTERNAL_ACCESS_INTEGRATIONS = (openai_access_int)
      SECRETS = ('my_openai_key' = streamlit_db.streamlit_schema.openai_key);
    
    Copy
  6. No código do aplicativo Streamlit, chame a API externa, conforme mostrado no exemplo a seguir:

    from openai import OpenAI
    import streamlit as st
    import _snowflake
    
    st.title(":speech_balloon: Simple chat app using an external LLM")
    st.write("This app shows how to call an external LLM to build a simple chat application.")
    
    # Use the _snowflake library to access secrets
    secret = _snowflake.get_generic_secret_string('my_openai_key')
    client = OpenAI(api_key=secret)
    
    # ...
    # code to use API
    # ...
    
    Copy

Temporizador de sono personalizado para um aplicativo Streamlit

Você pode definir um temporizador personalizado para um aplicativo Streamlit suspender automaticamente. Para definir o temporizador de sono personalizado, crie um arquivo de configuração config.toml dentro da pasta .streamlit no caminho especificado pelo parâmetro ROOT_LOCATION do objeto STREAMLIT.

Por exemplo, se você quiser que o aplicativo Streamlit seja suspenso automaticamente após 8 minutos, adicione o seguinte ao arquivo config.toml:

[snowflake]
[snowflake.sleep]
streamlitSleepTimeoutMinutes = 8
Copy

Carregue o arquivo config.toml no local do estágio, conforme mostrado no exemplo a seguir:

PUT file:///<path_to_your_root_folder>/my_app/config.toml @streamlit_db.streamlit_schema.streamlit_stage/.streamlit/ overwrite=true auto_compress=false;
Copy

Para obter mais informações sobre como trabalhar com arquivos Streamlit, consulte Criação e implementação de aplicativos Streamlit usando SQL.

Nota

Você pode definir o streamlitSleepTimeoutMinutes para qualquer valor entre 5 a 240 minutos.

Se você não criar o arquivo de configuração para especificar o temporizador, o tempo padrão de suspensão automática será de 15 minutos.

Funções de contexto e políticas de acesso a linhas no Streamlit in Snowflake

Para usar funções de contexto, como CURRENT_USER e dados de tabelas com políticas de acesso a linhas em um aplicativo Streamlit in Snowflake, um usuário com a função ACCOUNTADMIN deve conceder o privilégio global READ SESSION à função de proprietário do aplicativo Streamlit, conforme mostrado no exemplo a seguir:

USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
Copy

Nota

Em um aplicativo Streamlit in Snowflake, é possível usar políticas de acesso a linhas que usam CURRENT_ROLE. Os aplicativos Streamlit in Snowflake são executados com direitos de proprietário, portanto, usar CURRENT_ROLE dentro de um aplicativo Streamlit sempre retorna a função de proprietário do aplicativo. Para obter mais informações, consulte Noções básicas sobre os direitos do proprietário e aplicativos Streamlit in Snowflake.

Exemplo: Como acessar dados em uma tabela com a política de acesso a linhas usando CURRENT_USER

É possível usar um aplicativo Streamlit in Snowflake para controlar o acesso a linhas em uma tabela protegida por uma política de acesso a linhas. Especifique a função CURRENT_USER no corpo da política de acesso a linhas e adicione a política de acesso a linhas à tabela.

O exemplo a seguir demonstra como controlar o acesso a uma tabela protegida por uma política de acesso a linhas em um aplicativo Streamlit in Snowflake.

  1. Criar uma tabela e inserir dados:

    CREATE TABLE row_access_policy_test_table (
        id INT,
        some_data VARCHAR(100),
        the_owner VARCHAR(50)
    );
    
    INSERT INTO row_access_policy_test_table (id, some_data, the_owner)
    VALUES
        (4, 'Some information 4', 'ALICE'),
        (5, 'Some information 5', 'FRANK'),
        (6, 'Some information 6', 'ALICE');
    
    Copy
  2. Crie uma política de acesso a linhas:

    CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy
    AS (the_owner VARCHAR) RETURNS BOOLEAN ->
        the_owner = CURRENT_USER();
    
    Copy
  3. Adicione a política de acesso a linhas à tabela:

    ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
    
    Copy
  4. Criar um aplicativo Streamlit.

  5. Conceda o privilégio global READ SESSION à função de proprietário do aplicativo Streamlit:

    GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
    
    Copy
  6. Adicione o seguinte código ao seu aplicativo Streamlit:

    # Import Python packages
    import streamlit as st
    from snowflake.snowpark.context import get_active_session
    
    st.title("CURRENT_USER() + Row Access Policy in SiS Demo :balloon:")
    st.write(
            """You can access `CURRENT_USER()` and data from tables with row access policies
            in Streamlit in Snowflake apps
            """)
    
    # Get the current credentials
    session = get_active_session()
    
    st.header('Demo')
    
    st.subheader('Credentials')
    sql = "SELECT CURRENT_USER();"
    df = session.sql(sql).collect()
    st.write(df)
    
    st.subheader('Row Access on a Table')
    sql = "SELECT * FROM st_db.st_schema.row_access_policy_test_table;"
    df = session.sql(sql).collect()
    
    st.write(df)
    
    Copy