diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..20867045774ed1192243ac461d2546e4f1a86ce2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,23 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +gradio/demo/blocks_flipper/screenshot.gif filter=lfs diff=lfs merge=lfs -text +gradio/demo/blocks_neural_instrument_coding/sax.wav filter=lfs diff=lfs merge=lfs -text +gradio/demo/calculator/screenshot.gif filter=lfs diff=lfs merge=lfs -text +gradio/demo/chatbot_core_components/files/world.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/demo/chatbot_core_components_simple/files/world.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/demo/dataset/files/world.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/demo/hello_world_2/screenshot.gif filter=lfs diff=lfs merge=lfs -text +gradio/demo/hello_world_4/screenshot.gif filter=lfs diff=lfs merge=lfs -text +gradio/demo/image_mod/screenshot.png filter=lfs diff=lfs merge=lfs -text +gradio/demo/kitchen_sink/files/world.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/demo/sales_projections/screenshot.gif filter=lfs diff=lfs merge=lfs -text +gradio/demo/sepia_filter/screenshot.gif filter=lfs diff=lfs merge=lfs -text +gradio/demo/unispeech-speaker-verification/samples/kirsten_dunst.wav filter=lfs diff=lfs merge=lfs -text +gradio/demo/video_component/files/world.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/guides/assets/hf_demo.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/guides/cn/assets/hf_demo.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/js/component-test/src/lib/images/world.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/js/spa/test/files/file_test.ogg filter=lfs diff=lfs merge=lfs -text +gradio/js/spa/test/files/world.mp4 filter=lfs diff=lfs merge=lfs -text +gradio/test/test_files/rotated_image.jpeg filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md index fc3187dad2b64a5f6328c4917787da15b22d4c8b..6837fa40696e704644de617ade0a0f030a5a1ba7 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,6 @@ --- -title: Gtp Final -emoji: 💻 -colorFrom: yellow -colorTo: red +title: gtp-final +app_file: app.py sdk: gradio sdk_version: 4.44.0 -app_file: app.py -pinned: false --- - -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..e78eb0a87ac768e7437e2904703510c9a3670aa7 --- /dev/null +++ b/app.py @@ -0,0 +1,73 @@ +import gradio as gr +from transformers import GPT2Tokenizer, GPT2LMHeadModel +import torch + +# Carregar o tokenizer e o modelo ajustado +tokenizer = GPT2Tokenizer.from_pretrained('modelo_treinado') +model = GPT2LMHeadModel.from_pretrained('modelo_treinado') + +# Configurar o dispositivo para GPU se disponível +device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') +model.to(device) + +# Função para gerar notas de release +def gerar_nota_release(feature_description_prompt, max_new_tokens=50, num_return_sequences=1): + # Definir o template com um placeholder para a descrição da funcionalidade + template = """É hora de atualizar o seu íon Itaú. + {} +Atualize o app já e aproveite!""" + + # Formatar o template com o placeholder para o prompt + prompt = template.format(feature_description_prompt) + + # Tokenizar o prompt de entrada + inputs = tokenizer.encode(prompt, return_tensors='pt').to(device) + + # Obter o comprimento do prompt + prompt_length = inputs.shape[1] + + # Gerar texto + outputs = model.generate( + inputs, + max_new_tokens=max_new_tokens, + num_return_sequences=num_return_sequences, + no_repeat_ngram_size=2, + do_sample=True, + top_k=50, + top_p=0.95, + temperature=0.7, + eos_token_id=tokenizer.eos_token_id, + pad_token_id=tokenizer.eos_token_id, + ) + + # Decodificar e retornar o texto gerado + notas = [] + for i in range(num_return_sequences): + # Decodificar a sequência gerada + output = outputs[i] + texto_completo = tokenizer.decode(output, skip_special_tokens=True) + + # Extrair apenas a parte gerada após o prompt + texto_gerado = texto_completo[len(prompt):].strip() + + # Montar a nota de release completa + nota_release = template.format(feature_description_prompt + ' ' + texto_gerado) + notas.append(nota_release) + return notas[0] + +# Definir a função para o chat +def chat_model(feature_description): + return gerar_nota_release(feature_description) + +# Criar a interface do Gradio +chat_interface = gr.Interface( + fn=chat_model, + inputs=gr.Textbox(lines=2, placeholder="Digite a descrição da funcionalidade..."), + outputs=gr.Textbox(), + title="Chat para Geração de Notas de Release", + description="Digite uma descrição de funcionalidade e o modelo gerará uma nota de release de acordo com o modelo treinado.", +) + +# Executar a interface +if __name__ == "__main__": + chat_interface.launch(share=True) diff --git a/cached_lm_GPT2Tokenizer_128_dataset.txt b/cached_lm_GPT2Tokenizer_128_dataset.txt new file mode 100644 index 0000000000000000000000000000000000000000..4a52f7c5298ef9e010ac5cf071d154fe1b28371c Binary files /dev/null and b/cached_lm_GPT2Tokenizer_128_dataset.txt differ diff --git a/dataset.txt b/dataset.txt new file mode 100644 index 0000000000000000000000000000000000000000..c331b2c0098486b5672111944f140ec9f176cca9 --- /dev/null +++ b/dataset.txt @@ -0,0 +1,388 @@ +Já atualizou o seu íon Itaú?   +Nessa versão, fizemos ajustes e melhorias para deixar sua experiência utilizando o app ainda melhor. Atualize já e venha conferir.  + + +É hora de atualizar o seu íon Itaú. +Estamos sempre evoluindo a forma como você acompanha e investe no íon. Na aba Carteira, você gerencia seu portfólio no Itaú e em outros bancos de forma simples e prática. E agora, verifica o quanto tem disponível em conta corrente para investir. +Atualize o app já e aproveite! + +É hora de atualizar o seu íon Itaú. +Estamos sempre evoluindo a forma como você acompanha seus investimentos. Na aba Carteira, você gerencia seu portfólio no Itaú e em outros bancos de forma simples e prática. E agora, na aba Bolsa, você acompanha de forma detalhada sua posição em Renda Variável. +Atualize o app já e aproveite! + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, fizemos ajustes e corrigimos erros para aprimorar sua experiência.   +Atualize o app já!  + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, fizemos ajustes e corrigimos erros para aprimorar sua experiência.   +Atualize o app já!  + +Tá no ar mais uma atualização do seu íon Itaú. +Quer mais agilidade ao investir na Bolsa? Navegue usando nosso novo carrossel de atalhos e encontre tudo o que você precisa para operar em Renda Variável. Você ainda pode filtrar seus ativos por categorias na sessão "Meus ativos". +Além disso, agora você pode receber stories feitos para você. E mais: você também conta com notícias personalizadas. Acesse a aba Notícias e se informe sobre o que realmente importa. +Atualize o app e confira! + +Chegou mais uma atualização do íon Itaú para você. +Nesta versão, fizemos alguns ajustes e corrigimos erros para deixar a sua experiência usando o app ainda melhor.  Atualize o app já! + + +Tem atualização novinha do íon Itaú pra você. +Navegue pela aba Bolsa com mais rapidez usando nosso novo carrossel de atalhos e encontre tudo o que você precisa para operar em Renda Variável. +Agora você também conta com notícias personalizadas. Acesse a aba Notícias e se informe sobre o que realmente importa. +Atualize já e confira! + +Tem atualização novinha do íon Itaú pra você.Nessa versão, fizemos ajustes e melhorias para deixar sua experiência utilizando o app ainda melhor.  +Atualize já e confira. + +  +É hora de atualizar o seu íon Itaú. + Quer mais apoio ao investir na Bolsa? Agora você acessa cotações e índices do mercado em um carrossel pelo menu Bolsa. E pode filtrar seus ativos por categorias na sessão "Meus ativos". +Evoluímos nossa assessoria digital para trazer recomendações ainda mais personalizadas e atrativas pra você. E agora mais clientes podem ter acesso direto ao nosso time de especialistas via Whatsapp ao conferir o diagnóstico da carteira. +Atualize já! + +É hora de atualizar o seu íon Itaú. + Quer mais apoio ao investir na Bolsa? Agora você acessa cotações e índices do mercado em um carrossel pelo menu Bolsa. E pode filtrar seus ativos por categorias na sessão "Meus ativos".  +Evoluímos nossa assessoria digital para trazer recomendações ainda mais personalizadas e atrativas pra você. E agora mais clientes podem ter acesso direto ao nosso time de especialistas via Whatsapp ao conferir o diagnóstico da carteira. +Atualize já! + + +É hora de atualizar o seu íon Itaú. + Quer mais apoio ao investir na Bolsa? Agora você acessa cotações e índices do mercado em um carrossel pelo menu Bolsa. E pode filtrar seus ativos por categorias na sessão "Meus ativos". + Evoluímos nossa assessoria digital para trazer recomendações ainda mais personalizadas e atrativas pra você. E agora clientes Uniclass e Personnalité podem ter acesso direto ao nosso time de especialistas via Whatsapp ao conferir o diagnóstico da carteira. + Atualize já! + +É hora de atualizar o seu íon Itaú.   +Nesta versão, fizemos ajustes e corrigimos erros para aprimorar sua experiência.   +Atualize o app já!  + +É hora de atualizar o seu íon Itaú. + Quer mais praticidade para seguir as recomendações de nossos especialistas? Agora você pode aplicar em Tesouro Direto e resgatar seu CDB pelo fluxo de recomendação e revisão de carteira. Acesse a tela de Assessoria para conferir. + Nesta versão também repaginamos a forma como você acompanha o status do mercado. Descubra acessando a tela de Bolsa. + Atualize o app já! + + +É hora de atualizar o seu íon Itaú. + Nosso app agora está de cara nova! A nova home do íon foi desenvolvida para reunir as principais informações sobre seus investimentos em uma única tela. Acesse e confira as funcionalidades que você já conhece em um novo design. Mais fácil, rápido e prático pro seu dia a dia. + Atualize o app e aproveite! + + +Já atualizou o seu íon Itaú? Nesta versão, trazemos novos produtos em nossa vitrine: agora você pode usar o íon para investir em produtos de Crédito Privado (CRA, CRI e Debêntures) e no mercado de Opções. + Atualize o app já e confira!   + +Chegou mais uma atualização do íon Itaú para você. +Nesta versão, fizemos alguns ajustes e corrigimos erros para deixar a sua experiência usando o app ainda melhor.Atualize o app já! + +É hora de atualizar o seu íon Itaú. + Reinvestir seu dinheiro ficou ainda mais fácil! Agora nossa Assessoria Digital te avisa o momento ideal para substituir algum produto, quando seus rendimentos de Renda Fixa estão prestes a vencer e o momento mais apropriado para rebalancear sua carteira. + Nesta versão, também redesenhamos a área de Ajuda que você acessa antes de logar no app, facilitando sua comunicação com a gente. + Atualize o app já! + +É hora de atualizar o seu íon Itaú. + Quer mais apoio na hora de reinvestir seu dinheiro? Agora nossa Assessoria Digital te informa o melhor momento para substituir algum produto, rebalanceando sua carteira. Você ainda pode acompanhar quando seus produtos de Renda Fixa irão vencer. +Nesta versão, também redesenhamos a área de Ajuda que você acessa antes de logar no app, facilitando sua comunicação com a gente. +Atualize o app já! + +É hora de atualizar o seu íon Itaú. + Nesta versão, redesenhamos nossa área de Ajuda que você acessa antes de logar no app. + Quer mais apoio na hora de reinvestir seu dinheiro? Agora nossa Assessoria Digital informa para você o melhor momento para substituir algum produto de investimento. Agora você também pode acompanhar os vencimentos de Renda Fixa. Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú.Nesta versão, trazemos novos produtos em nossa vitrine: agora você pode usar o íon para investir em produtos de Crédito Privado, como CRA, CRI e Debêntures. + Também reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. + Outra novidade é que a Assessoria Digital avisa você do melhor momento para substituir algum produto, além da chegada dos vencimentos de Renda Fixa. Assim fica mais fácil reinvestir seu dinheiro.Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú.Nesta versão, trazemos novos produtos em nossa vitrine: agora você pode usar o íon para investir em produtos de Crédito Privado, como CRA, CRI e Debêntures. + Também reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática.Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú.Nesta versão, trazemos novos produtos em nossa vitrine: agora você pode usar o íon para investir em produtos de CRA, CRI, Debêntures e Opções. + Também reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática.Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú.Nesta versão, trazemos novos produtos em nossa vitrine: agora você pode usar o íon para investir em produtos de Crédito Privado (CRA, CRI e Debêntures) e no mercado de Opções. + Também reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática.Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. +Também temos novos produtos em nossa vitrine: agora você usar o íon para investir em Opções, CRA, CRI e Debêntures. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. +Também temos novos produtos em nossa vitrine: agora você pode investir Opções, CRA, CRI e Debêntures pelo íon. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. +Também temos novos produtos em nossa vitrine: agora você pode usar o íon para investir em produtos de Crédito Privado (CRA, CRI e Debêntures) e no mercado de Opções. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. +Também temos novos produtos em nossa vitrine: agora você pode investir em CRA, CRI e Debêntures pelo íon. Acesse nosso catálogo agora mesmo. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. +Também temos novos produtos em nossa vitrine: agora você pode investir em CRA, CRI e Debêntures pelo íon. Conheça nosso catálogo de produtos de crédito privado. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. +Também temos novos produtos em nossa vitrine: agora você pode investir em crédito privado. Conheça nosso catálogos de CRA, CRI e Debêntures. +Atualize o app já! + + +Tá no ar mais uma atualização do seu íon Itaú. +Agora todas suas operações na Bolsa de Valores estão em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. +Também temos novidades na vitrine de produtos: agora você conta com preço alvo, potencial de valorização e recomendação dos ativos para te auxiliar na tomada de decisão. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú. +Agora todas suas operações na Bolsa de Valores estão em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável, tornando a gestão dos seus investimentos mais prática. +Também temos novidades na vitrine de produtos: agora você conta com preço alvo, potencial de valorização e recomendação dos ativos para te auxiliar na tomada de decisão. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú. +Nesta versão, reunimos suas operações na Bolsa de Valores em um só lugar. Acesse a área de Bolsa pelo menu para acompanhar e realizar operações de compra e venda de Ações e outros produtos de Renda Variável,  tornando a gestão dos seus investimentos mais prática. +Também temos novidades na vitrine de produtos: agora você conta com preço alvo, potencial de valorização e recomendação dos ativos para te apoiar na tomada de decisão. +Atualize o app já! + +O íon Itaú está sempre melhorando por você. +Nesta versão, trouxemos ajustes e melhorias, deixando sua experiência em usar o app ainda melhor. +Atualize já e confira! + +É hora de atualizar o seu íon Itaú. +Que tal fazer o check up da sua carteira de investimentos? Com o Diagnóstico de Carteira você tem acesso a análises dos riscos e retornos de seus investimentos e ainda sugeriremos uma revisão para melhorar a performance da sua carteira.  +Atualize o app já e aproveite! + + +Tá no ar mais uma atualização do seu íon Itaú. +Já avaliou a performance dos seus investimentos? Agora você conta com o nosso Diagnóstico de Carteira. Oferecemos uma análise permanente dos riscos e retornos de seus investimentos e sugerimos uma revisão da sua carteira para melhorar seus resultados. +Atualize o app já e aproveite! + +Quer ajuda para saber como estão seus investimentos? Agora você pode contar com o Diagnóstico de Carteira! Avaliamos constantemente o risco e do retorno esperado para a sua carteira e sugerimos revisões para continuar evoluindo seus resultados. + +Tá no ar mais uma atualização fresquinha do seu íon Itaú. + A espera acabou e agora você pode contratar Tesouro Direto diretamente da nossa vitrine de produtos! Mas antes de investir, não se esqueça de validar seu perfil de investidor em nossa página de Assessoria Digital para garantir uma melhor experiência. + Nesta versão, também atualizamos a nossa Central de Notificações. Acesse e veja se você não perdeu alguma novidade por lá. + Atualize o app e aproveite já! + +Tá no ar mais uma atualização fresquinha do seu íon Itaú. + É hora de comemorar: agora você pode contratar Tesouro Direto diretamente da nossa vitrine de produtos! Mas antes de investir, não se esqueça de validar seu perfil de investidor em nossa página de Assessoria Digital para garantir a melhor experiência. + Também fizemos melhorias na nossa Central de Notificações. Acesse e confira se você não perdeu alguma novidade. + Atualize o app e aproveite já! + +É hora de atualizar o seu íon Itaú. +Vocês pediram e evoluímos a nossa assessoria digital. Agora você acompanha a projeção de rentabilidade dos produtos recomendados de forma simples e rápida. Também ficou mais fácil contratar os produtos sugeridos na recomendação e na otimização de sua carteira de investimentos. +Atualize o app já e aproveite! + + +É hora de atualizar o seu íon Itaú. +Quer otimizar sua carteira de investimentos? Agora você acompanha em nossa recomendação a projeção de rentabilidade dos produtos e pode realizar as aplicações recomendadas de forma simples e interativa. +Atualize o app já e aproveite! + +Tem atualização novinha do íon Itaú pra você. +Agora você tem acesso a uma nova experiência de Assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de rebalancear sua carteira e muito mais. +Atualize já! + +Tem atualização novinha do íon Itaú pra você. +Agora você tem acesso a uma nova experiência de Assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de rebalancear sua carteira e muito mais. +Atualize já! + +Tem atualização novinha do íon Itaú pra você. +Agora você tem acesso a uma nova experiência de Assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de rebalancear sua carteira e muito mais. +Atualize já! + +Agora você tem acesso a uma nova experiência de Assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de rebalancear sua carteira e muito mais. +Atualize já! + +Agora você tem acesso a uma nova experiência de assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de melhorar a saúde da sua carteira e muito mais. +Atualize já! + +É hora de atualizar o seu íon Itaú. +Já acompanha as notícias pelo íon? Nosso feed está com novidades! Agora temos novos trilhos para destaques, últimas notícias e as mais acessadas. +Para ficar de olho nos ativos de renda variável, agora você pode criar uma lista para acompanhar os seus preferidos. +Atualize o app já e aproveite! + + +Tá no ar mais uma atualização fresquinha do seu íon Itaú. + A espera acabou e agora você pode contratar Tesouro Direto diretamente da nossa vitrine de produtos! Mas antes de investir, não se esqueça de validar seu perfil de investidor em nossa página de Assessoria Digital para garantir uma melhor experiência. + Nesta versão, também atualizamos a nossa Central de Notificações. Acesse e veja se você não perdeu alguma novidade por lá. + Atualize o app e aproveite já! + + +Tá no ar mais uma atualização fresquinha do seu íon Itaú. + É hora de comemorar: agora você pode contratar Tesouro Direto diretamente da nossa vitrine de produtos! Mas antes de investir, não se esqueça de validar seu perfil de investidor em nossa página de Assessoria Digital para garantir a melhor experiência. + Também fizemos melhorias na nossa Central de Notificações. Acesse e confira se você não perdeu alguma novidade. + Atualize o app e aproveite já! + +É hora de atualizar o seu íon Itaú. +Vocês pediram e evoluímos a nossa assessoria digital. Agora você acompanha a projeção de rentabilidade dos produtos recomendados de forma simples e rápida. Também ficou mais fácil contratar os produtos sugeridos na recomendação e na otimização de sua carteira de investimentos. +Atualize o app já e aproveite! + + +É hora de atualizar o seu íon Itaú. +Quer otimizar sua carteira de investimentos? Agora você acompanha em nossa recomendação a projeção de rentabilidade dos produtos e pode realizar as aplicações recomendadas de forma simples e interativa. +Atualize o app já e aproveite! + + +Tem atualização novinha do íon Itaú pra você. +Agora você tem acesso a uma nova experiência de Assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de rebalancear sua carteira e muito mais. +Atualize já! + +Tem atualização novinha do íon Itaú pra você. +Agora você tem acesso a uma nova experiência de Assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de rebalancear sua carteira e muito mais. +Atualize já! + +Tem atualização novinha do íon Itaú pra você. +Agora você tem acesso a uma nova experiência de Assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de rebalancear sua carteira e muito mais. +Atualize já! + +Agora você tem acesso a uma nova experiência de Assessoria de investimentos com apenas um toque. +Reunimos nossas principais funcionalidades para você administrar sua carteira de um jeito simples e personalizado. +Acesse nossa recomendação ideal para os seus objetivos, simule o rendimento do seu saldo antes de aplicar, confira oportunidades de rebalancear sua carteira e muito mais. +Atualize já! + +É hora de atualizar o seu íon Itaú. +Já acompanha as notícias pelo íon? Nosso feed está com novidades, com novos trilhos para destaques, últimas notícias e mais acessadas. +Para ficar de olho nos ativos de renda variável, agora você pode criar uma lista para acompanhar os seus preferidos. +Atualize o app já e aproveite! + + +É hora de atualizar o seu íon Itaú. +Ainda não tem investimentos? Nesta versão, lançamos uma nova experiência criada especialmente pra você. +Já acompanha as notícias pelo íon? Agora você pode buscar por assuntos e ficar por dentro de tudo que foi publicado sobre o seu interesse. +Atualize o app já e aproveite! + + +É hora de atualizar o seu íon Itaú. +Corrigimos alguns erros e fizemos melhorias no íon Itaú. Tudo isso pra deixar a sua experiência usando o app ainda melhor. +Atualize já! + + +Chegou uma atualização novinha do íon Itaú pra você. +Nessa versão, fizemos ajustes e melhorias para deixar sua experiência utilizando o app ainda melhor. +Atualize já e venha conferir. + +Tem atualização novinha do íon Itaú pra você. +Evoluímos o cadastro na Itaú Corretora, para deixar sua experiência utilizando o app ainda melhor. +Atualize já e venha conferir! + + +Tem atualização novinha do íon Itaú pra você. +Pensando em investir na Bolsa? Evoluímos o cadastro na Itaú Corretora, para deixar sua experiência utilizando o app ainda melhor. +Atualize já e venha conferir! + + +Chegou uma atualização novinha do íon Itaú pra você. +Nessa versão, fizemos ajustes e melhorias para deixar sua experiência utilizando o app ainda melhor. +Atualize já e venha conferir. + + +É hora de atualizar o seu íon Itaú. +Quer mais apoio para evoluir seu portfólio de investimentos? Agora temos uma jornada de assessoria digital feita especialmente para sua carteira. +Busca se informar sobre alguma novidade do mercado financeiro? Agora você pode buscar pelas nossas notícias por palavras chaves. +Ainda não é investidor íon Itaú? Agora temos uma página especial para atender melhor suas necessidades. +Atualize já e aproveite! + +É hora de atualizar o seu íon Itaú. +Quer apoio para evoluir sua carteira de investimentos? Agora temos uma jornada de assessoria digital feita especialmente para sua carteira. +Quer se informar sobre um assunto específico do mercado financeiro? Agora você pode buscar pelas nossas notícias por palavras chaves. +Ainda não é investidor íon Itaú? Agora temos uma página exclusiva para atender melhor suas necessidades. +Atualize já! + + +É hora de atualizar o seu íon Itaú. +Quer apoio para montar sua carteira de investimentos? Agora temos uma jornada de assessoria digital feita especialmente para sua carteira. +Quer se informar sobre um assunto específico do mercado financeiro? Agora você pode buscar as notícias do app por palavras chaves. +Ainda não é investidor íon Itaú? Agora temos uma página exclusiva com destaques que visam atender melhor suas necessidades. +Atualize já! + +Tá na hora de você atualizar o seu íon Itaú. +Quer mais apoio na sua tomada de decisões? Agora você pode acompanhar a rentabilidade acumulada da sua carteira e comparar com benchmarks. +Quer ficar por dentro da movimentação da Bolsa? Agora você acompanha a cotação das ações em tempo real. +Quer ter uma visão rápida dos destaques do mercado? Agora você encontra as maiores altas, maiores baixas e volumes negociados de ações. +Atualize o app já! + +Tá na hora de você atualizar o seu íon Itaú. +Quer mais apoio na sua tomada de decisões? Agora você pode acompanhar a rentabilidade acumulada da sua carteira e comparar com benchmarks. +Quer seguir a movimentação da Bolsa? Agora você acompanha a cotação das ações em tempo real. +Quer ter uma visão rápida dos destaques do mercado? Agora você encontra as maiores altas, maiores baixas e volumes negociados de ações. +Atualize o app já! + +Que tal atualizar o seu íon Itaú? +Quer mais apoio na sua tomada de decisões? Agora você pode acompanhar a rentabilidade acumulada da sua carteira e comparar com benchmarks. +Quer uma visão rápida dos destaques da Bolsa no dia? Agora você encontra as maiores altas, maiores baixas e volumes negociados de ações. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon. +Quer ver nossos comunicados em um só lugar? Agora você tem acesso a nossa central de notificações. +Quer mais apoio na sua tomada de decisões? Agora você pode acompanhar a rentabilidade acumulada da sua carteira e comparar com benchmarks. +Quer uma visão rápida dos destaques da Bolsa no dia? Agora você encontra as maiores altas, maiores baixas e volumes negociados de ações. +Atualize o app já! + +Tá no ar mais uma atualização do seu íon Itaú.Quer mais apoio na sua tomada de decisões? Agora você pode acompanhar a rentabilidade acumulada de seus produtos por vários períodos e comparar com benchmarks. +Quer ficar por dentro do comportamento de grandes investidores? Agora você encontra as maiores altas, maiores baixas e volumes negociados de ações listadas na Bolsa.Atualize o app e aproveite! + +Acorda, pessoal, que hoje tem investimento! +Nessa versão, trouxemos melhorias em acessibilidade nas telas que apresentam o nosso app para novos usuários. +Também incluímos as logomarcas dos emissores de renda fixa no catálogo e no detalhamento dos títulos, facilitando a busca e diferenciação entre os produtos. +Atualize o app e desfrute já dessas novidades. + +Acorda, pessoal, que hoje tem investimento! +Nessa versão, trouxemos melhorias em acessibilidade nas telas que apresentam o nosso app para novos usuários, deixando a experiência em usar o app ainda melhor. +Atualize o app e desfrute já dessas novidades. + +Tá no ar mais uma atualização do seu íon Itaú. +Nessa versão, trouxemos melhorias em acessibilidade nas telas que apresentam o nosso app para novos usuários. +Também incluímos as logomarcas dos emissores de renda fixa no catálogo e no detalhamento dos títulos, facilitando a busca e diferenciação entre os produtos. +Atualize o app e desfrute já dessas novidades! + +Tá no ar mais uma atualização do seu íon Itaú. +Nessa versão, trouxemos melhorias em acessibilidade nas telas de onboarding para deixar sua experiência utilizando o app ainda melhor. +Também incluímos as logomarcas dos emissores de renda fixa no catálogo e no detalhamento dos títulos, facilitando a busca e diferenciação entre os produtos. +Atualize o app e desfrute já dessas novidades! + +Tá no ar mais uma atualização do seu íon Itaú. +Nessa versão, trouxemos melhorias em acessibilidade nas telas que apresentam o nosso app para novos usuários, deixando a experiência em usar o app ainda melhor. +Atualize o app e desfrute já dessas novidades! + +Tá no ar mais uma atualização do seu íon Itaú. +Nessa versão, trouxemos melhorias em acessibilidade nas telas de onboarding para deixar sua experiência utilizando o app ainda melhor. +Atualize o app e desfrute já dessas novidades! + +Já atualizou o seu íon Itaú? +Nesta versão, você encontra uma nova forma de navegar pelo app e acompanhar seus investimentos, conhecer os produtos disponíveis para investir e ficar por dentro das notícias que impactam o mercado financeiro, de forma mais rápida e fácil. +Atualize o app e aproveite esta experiência. + +Que tal atualizar o seu íon Itaú? +Quer acompanhar melhor seus investimentos? Você pediu e agora pode ver em tempo real o rendimento e a rentabilidade dos seus ativos considerando os proventos recebidos. Acompanhe também seus rendimentos por família de produtos e a rentabilidade histórica dos produtos contratados. +Que tal diversificar a sua carteira ainda mais? Agora você pode investir em CDB DI. É fácil de aplicar e você resgata quando quiser. +Atualize o app já! + + +Já atualizou o seu app?Nessa versão, corrigimos bugs e fizemos melhorias de desempenho para deixar sua experiência ao usar o íon ainda mais prazerosa.Atualize e aproveite! + +Já atualizou o seu app? +Nessa versão, fizemos ajustes e melhorias para deixar sua experiência ao usar o íon ainda mais prazerosa. +Atualize e aproveite! + +Tá no ar mais uma atualização fresquinha do seu íon Itaú. +Quer saber mais sobre um fundo ao escolher em qual investir? Agora você pode comparar o rendimento de um fundo com outros indicadores, como Ibovespa, Dólar, Euro, Poupança e IPCA – além do CDI, que já tínhamos disponibilizado. +Atualize o app agora! +Tá no ar mais uma atualização fresquinha do seu íon Itaú.Quer saber mais sobre um fundo ao escolher em qual investir? Agora você pode comparar o rendimento de um fundo com outros indicadores, como Ibovespa, Dólar, Euro, Poupança e IPCA – além do CDI, que já tínhamos disponibilizado.Atualize o app agora! \ No newline at end of file diff --git a/flagged/log.csv b/flagged/log.csv new file mode 100644 index 0000000000000000000000000000000000000000..d9fd7363f508479eb625612eec539aeff2356d14 --- /dev/null +++ b/flagged/log.csv @@ -0,0 +1,7 @@ +feature_description,output,flag,username,timestamp +ajustes na home do ion,"É hora de atualizar o seu íon Itaú. + ajustes na home do ion Agora você pode acompanhar o fluxo de investimentos em nossa Bolsa de Valores pelo menu. +Nesta versão, adicionamos novos serviços de atendimento e atendimento de necessidades. + +É o melhor do íon. Agora você vê sua posição e o valor das +Atualize o app já e aproveite!",,,2024-09-18 19:32:43.207979 diff --git a/gradio/.changeset/README.md b/gradio/.changeset/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c63edce496018ded4e2cfe04471103eb17b2c24d --- /dev/null +++ b/gradio/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/gradio/.changeset/changeset.cjs b/gradio/.changeset/changeset.cjs new file mode 100644 index 0000000000000000000000000000000000000000..fbe9faa1b893fdcc352d099ab0556463e7547d70 --- /dev/null +++ b/gradio/.changeset/changeset.cjs @@ -0,0 +1,332 @@ +const { getPackagesSync } = require("@manypkg/get-packages"); +const dependents_graph = require("@changesets/get-dependents-graph"); + +const gh = require("@changesets/get-github-info"); +const { existsSync, readFileSync, writeFileSync } = require("fs"); +const { join } = require("path"); + +const { getInfo, getInfoFromPullRequest } = gh; +const pkg_data = getPackagesSync(process.cwd()); +const { packages, rootDir } = pkg_data; +const dependents = dependents_graph.getDependentsGraph({ + packages, + root: pkg_data.rootPackage +}); + +/** + * @typedef {{packageJson: {name: string, python?: boolean}, dir: string}} Package + */ + +/** + * @typedef {{summary: string, id: string, commit: string, releases: {name: string}}} Changeset + */ + +/** + * + * @param {string} package_name The name of the package to find the directories for + * @returns {string[]} The directories for the package + */ +function find_packages_dirs(package_name) { + /** @type {string[]} */ + let package_dirs = []; + + /** @type {Package | undefined} */ + const _package = packages.find((p) => p.packageJson.name === package_name); + if (!_package) throw new Error(`Package ${package_name} not found`); + + package_dirs.push(_package.dir); + if (_package.packageJson.python) { + package_dirs.push(join(_package.dir, "..")); + } + return package_dirs; +} + +let lines = { + _handled: [] +}; + +const changelogFunctions = { + /** + * + * @param {Changeset[]} changesets The changesets that have been created + * @param {any} dependenciesUpdated The dependencies that have been updated + * @param {any} options The options passed to the changelog generator + * @returns {Promise} The release line for the dependencies + */ + getDependencyReleaseLine: async ( + changesets, + dependenciesUpdated, + options + ) => { + if (!options.repo) { + throw new Error( + 'Please provide a repo to this changelog generator like this:\n"changelog": ["@changesets/changelog-github", { "repo": "org/repo" }]' + ); + } + if (dependenciesUpdated.length === 0) return ""; + + const changesetLink = `- Updated dependencies [${( + await Promise.all( + changesets.map(async (cs) => { + if (cs.commit) { + let { links } = await getInfo({ + repo: options.repo, + commit: cs.commit + }); + return links.commit; + } + }) + ) + ) + .filter((_) => _) + .join(", ")}]:`; + + const updatedDepenenciesList = dependenciesUpdated.map( + /** + * + * @param {any} dependency The dependency that has been updated + * @returns {string} The formatted dependency + */ + (dependency) => { + const updates = dependents.get(dependency.name); + + if (updates && updates.length > 0) { + updates.forEach((update) => { + if (!lines[update]) { + lines[update] = { + dirs: find_packages_dirs(update), + current_changelog: "", + feat: [], + fix: [], + highlight: [], + previous_version: packages.find( + (p) => p.packageJson.name === update + ).packageJson.version, + dependencies: [] + }; + + const changelog_path = join( + //@ts-ignore + lines[update].dirs[1] || lines[update].dirs[0], + "CHANGELOG.md" + ); + + if (existsSync(changelog_path)) { + //@ts-ignore + lines[update].current_changelog = readFileSync( + changelog_path, + "utf-8" + ) + .replace(`# ${update}`, "") + .trim(); + } + } + lines[update].dependencies.push( + ` - ${dependency.name}@${dependency.newVersion}` + ); + }); + } + + return ` - ${dependency.name}@${dependency.newVersion}`; + } + ); + + writeFileSync( + join(rootDir, ".changeset", "_changelog.json"), + JSON.stringify(lines, null, 2) + ); + + return [changesetLink, ...updatedDepenenciesList].join("\n"); + }, + /** + * + * @param {{summary: string, id: string, commit: string, releases: {name: string}[]}} changeset The changeset that has been created + * @param {any} type The type of changeset + * @param {any} options The options passed to the changelog generator + * @returns {Promise} The release line for the changeset + */ + getReleaseLine: async (changeset, type, options) => { + if (!options || !options.repo) { + throw new Error( + 'Please provide a repo to this changelog generator like this:\n"changelog": ["@changesets/changelog-github", { "repo": "org/repo" }]' + ); + } + + let prFromSummary; + let commitFromSummary; + /** + * @type {string[]} + */ + let usersFromSummary = []; + + const replacedChangelog = changeset.summary + .replace(/^\s*(?:pr|pull|pull\s+request):\s*#?(\d+)/im, (_, pr) => { + let num = Number(pr); + if (!isNaN(num)) prFromSummary = num; + return ""; + }) + .replace(/^\s*commit:\s*([^\s]+)/im, (_, commit) => { + commitFromSummary = commit; + return ""; + }) + .replace(/^\s*(?:author|user):\s*@?([^\s]+)/gim, (_, user) => { + usersFromSummary.push(user); + return ""; + }) + .trim(); + + const [firstLine, ...futureLines] = replacedChangelog + .split("\n") + .map((l) => l.trimRight()); + + const links = await (async () => { + if (prFromSummary !== undefined) { + let { links } = await getInfoFromPullRequest({ + repo: options.repo, + pull: prFromSummary + }); + if (commitFromSummary) { + links = { + ...links, + commit: `[\`${commitFromSummary}\`](https://github.com/${options.repo}/commit/${commitFromSummary})` + }; + } + return links; + } + const commitToFetchFrom = commitFromSummary || changeset.commit; + if (commitToFetchFrom) { + let { links } = await getInfo({ + repo: options.repo, + commit: commitToFetchFrom + }); + return links; + } + return { + commit: null, + pull: null, + user: null + }; + })(); + + const user_link = /\[(@[^]+)\]/.exec(links.user); + const users = + usersFromSummary && usersFromSummary.length + ? usersFromSummary + .map((userFromSummary) => `@${userFromSummary}`) + .join(", ") + : user_link + ? user_link[1] + : links.user; + + const prefix = [ + links.pull === null ? "" : `${links.pull}`, + links.commit === null ? "" : `${links.commit}` + ] + .join(" ") + .trim(); + + const suffix = users === null ? "" : ` Thanks ${users}!`; + + /** + * @typedef {{[key: string]: string[] | {dirs: string[], current_changelog: string, feat: {summary: string}[], fix: {summary: string}[], highlight: {summary: string}[]}}} ChangesetMeta + */ + + /** + * @type { ChangesetMeta & { _handled: string[] } }} + */ + + if (lines._handled.includes(changeset.id)) { + return "done"; + } + lines._handled.push(changeset.id); + + changeset.releases.forEach((release) => { + if (!lines[release.name]) { + lines[release.name] = { + dirs: find_packages_dirs(release.name), + current_changelog: "", + feat: [], + fix: [], + highlight: [], + previous_version: packages.find( + (p) => p.packageJson.name === release.name + ).packageJson.version, + dependencies: [] + }; + } + + const changelog_path = join( + //@ts-ignore + lines[release.name].dirs[1] || lines[release.name].dirs[0], + "CHANGELOG.md" + ); + + if (existsSync(changelog_path)) { + //@ts-ignore + lines[release.name].current_changelog = readFileSync( + changelog_path, + "utf-8" + ) + .replace(`# ${release.name}`, "") + .trim(); + } + + const [, _type, summary] = changeset.summary + .trim() + .match(/^(feat|fix|highlight)\s*:\s*([^]*)/im) || [ + , + "feat", + changeset.summary + ]; + + let formatted_summary = ""; + + if (_type === "highlight") { + const [heading, ...rest] = summary.trim().split("\n"); + const _heading = `${heading} ${prefix ? `(${prefix})` : ""}`; + const _rest = rest.concat(["", suffix]); + + formatted_summary = `${_heading}\n${_rest.join("\n")}`; + } else { + formatted_summary = handle_line(summary, prefix, suffix); + } + + //@ts-ignore + lines[release.name][_type].push({ + summary: formatted_summary + }); + }); + + writeFileSync( + join(rootDir, ".changeset", "_changelog.json"), + JSON.stringify(lines, null, 2) + ); + + return `\n\n-${prefix ? `${prefix} -` : ""} ${firstLine}\n${futureLines + .map((l) => ` ${l}`) + .join("\n")}`; + } +}; + +/** + * @param {string} str The changelog entry + * @param {string} prefix The prefix to add to the first line + * @param {string} suffix The suffix to add to the last line + * @returns {string} The formatted changelog entry + */ +function handle_line(str, prefix, suffix) { + const [_s, ...lines] = str.split("\n").filter(Boolean); + + const desc = `${prefix ? `${prefix} -` : ""} ${_s.replace( + /[\s\.]$/, + "" + )}. ${suffix}`; + + if (_s.length === 1) { + return desc; + } + + return [desc, ...lines.map((l) => ` ${l}`)].join("/n"); +} + +module.exports = changelogFunctions; diff --git a/gradio/.changeset/config.json b/gradio/.changeset/config.json new file mode 100644 index 0000000000000000000000000000000000000000..be7fd9c018e5d149c81f147025caf4cd54cc4172 --- /dev/null +++ b/gradio/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", + "changelog": ["./changeset.cjs", { "repo": "gradio-app/gradio" }], + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": ["@self/spaces-test", "@self/cdn-test"] +} diff --git a/gradio/.changeset/fix_changelogs.cjs b/gradio/.changeset/fix_changelogs.cjs new file mode 100644 index 0000000000000000000000000000000000000000..a73501ce7315ab24471e033caea032c8ed317d65 --- /dev/null +++ b/gradio/.changeset/fix_changelogs.cjs @@ -0,0 +1,149 @@ +const { join } = require("path"); +const { readFileSync, existsSync, writeFileSync, unlinkSync } = require("fs"); +const { getPackagesSync } = require("@manypkg/get-packages"); + +const RE_PKG_NAME = /^[\w-]+\b/; +const pkg_meta = getPackagesSync(process.cwd()); + +/** + * @typedef {{dirs: string[], highlight: {summary: string}[], feat: {summary: string}[], fix: {summary: string}[], current_changelog: string}} ChangesetMeta + */ + +/** + * @typedef {{[key: string]: ChangesetMeta}} ChangesetMetaCollection + */ + +function run() { + if (!existsSync(join(pkg_meta.rootDir, ".changeset", "_changelog.json"))) { + console.warn("No changesets to process"); + return; + } + + /** + * @type { ChangesetMetaCollection & { _handled: string[] } }} + */ + const { _handled, ...packages } = JSON.parse( + readFileSync( + join(pkg_meta.rootDir, ".changeset", "_changelog.json"), + "utf-8" + ) + ); + + /** + * @typedef { {packageJson: {name: string, version: string, python: boolean}, dir: string} } PackageMeta + */ + + /** + * @type { {[key:string]: PackageMeta} } + */ + const all_packages = pkg_meta.packages.reduce((acc, pkg) => { + acc[pkg.packageJson.name] = /**@type {PackageMeta} */ ( + /** @type {unknown} */ (pkg) + ); + return acc; + }, /** @type {{[key:string] : PackageMeta}} */ ({})); + + for (const pkg_name in packages) { + const { dirs, highlight, feat, fix, current_changelog, dependencies } = + /**@type {ChangesetMeta} */ (packages[pkg_name]); + + if (pkg_name === "@gradio/lite") { + const target = all_packages.gradio.packageJson.version.split("."); + + const current_version = packages[pkg_name].previous_version.split("."); + + if (!packages.gradio) { + const patch = parseInt(current_version[2]) + 1; + const new_version = [target[0], target[1], patch]; + all_packages[pkg_name].packageJson.version = new_version.join("."); + } else { + if (parseInt(target[1]) > parseInt(current_version[1])) { + all_packages[pkg_name].packageJson.version = target.join("."); + } else if (parseInt(target[1]) === parseInt(current_version[1])) { + const patch = parseInt(current_version[2]) + 1; + const new_version = [target[0], target[1], patch]; + all_packages[pkg_name].packageJson.version = new_version.join("."); + } + } + + writeFileSync( + join(all_packages[pkg_name].dir, "package.json"), + JSON.stringify(all_packages[pkg_name].packageJson, null, "\t") + "\n" + ); + } + + const { version, python } = all_packages[pkg_name].packageJson; + + const highlights = highlight?.map((h) => `${h.summary}`) || []; + const features = feat?.map((f) => `- ${f.summary}`) || []; + const fixes = fix?.map((f) => `- ${f.summary}`) || []; + const deps = Array.from(new Set(dependencies?.map((d) => d.trim()))) || []; + + const release_notes = /** @type {[string[], string][]} */ ([ + [highlights, "### Highlights"], + [features, "### Features"], + [fixes, "### Fixes"], + [deps, "### Dependency updates"] + ]) + .filter(([s], i) => s.length > 0) + .map(([lines, title]) => { + if (title === "### Highlights") { + return `${title}\n\n${lines.join("\n\n")}`; + } + + return `${title}\n\n${lines.join("\n")}`; + }) + .join("\n\n"); + + const new_changelog = `# ${pkg_name} + +## ${version} + +${release_notes} + +${current_changelog.replace(`# ${pkg_name}`, "").trim()} +`.trim(); + + dirs.forEach((dir) => { + writeFileSync(join(dir, "CHANGELOG.md"), new_changelog); + }); + + if (python) { + bump_local_dependents(pkg_name, version); + } + } + + unlinkSync(join(pkg_meta.rootDir, ".changeset", "_changelog.json")); + + /** + * @param {string} pkg_to_bump The name of the package to bump + * @param {string} version The version to bump to + * @returns {void} + * */ + function bump_local_dependents(pkg_to_bump, version) { + for (const pkg_name in all_packages) { + const { + dir, + packageJson: { python } + } = all_packages[pkg_name]; + + if (!python) continue; + + const requirements_path = join(dir, "..", "requirements.txt"); + const requirements = readFileSync(requirements_path, "utf-8").split("\n"); + + const pkg_index = requirements.findIndex((line) => { + const m = line.trim().match(RE_PKG_NAME); + if (!m) return false; + return m[0] === pkg_to_bump; + }); + + if (pkg_index !== -1) { + requirements[pkg_index] = `${pkg_to_bump}==${version}`; + writeFileSync(requirements_path, requirements.join("\n")); + } + } + } +} + +run(); diff --git a/gradio/.changeset/public-webs-melt.md b/gradio/.changeset/public-webs-melt.md new file mode 100644 index 0000000000000000000000000000000000000000..9157986abeeb7aa1b693263ea68375981ca3bd24 --- /dev/null +++ b/gradio/.changeset/public-webs-melt.md @@ -0,0 +1,5 @@ +--- +"website": minor +--- + +feat:Testing CI diff --git a/gradio/.config/.prettierignore b/gradio/.config/.prettierignore new file mode 100644 index 0000000000000000000000000000000000000000..3376ed9e9d618237b3e70f046a3073196cc29074 --- /dev/null +++ b/gradio/.config/.prettierignore @@ -0,0 +1,35 @@ +**/*.md +**/js/app/public/** +**/pnpm-workspace.yaml +**/js/app/dist/** +**/js/wasm/dist/** +**/js/preview/dist/** +**/client/js/dist/** +**/js/*/dist/** +**/pnpm-lock.yaml +**/js/plot/src/Plot.svelte +**/.svelte-kit/** +**/demo/** +**/gradio/** +**/.pnpm-store/** +**/.venv/** + +/guides/** +**/.mypy_cache/** +!test-strategy.md +**/js/_space-test/** +../js/lite/src/theme.css +../js/storybook/theme.css +**/gradio_cached_examples/** +**/storybook-static/** +**/.vscode/** +sweep.yaml +**/.vercel/** +**/build/** +**/src/lib/json/**/* +**/playwright/.cache/**/* +**/theme/src/pollen.css +**/venv/** +../js/app/src/api_docs/CodeSnippet.svelte +../js/app/src/api_docs/RecordingSnippet.svelte +.changeset/pre.json \ No newline at end of file diff --git a/gradio/.config/.prettierrc.json b/gradio/.config/.prettierrc.json new file mode 100644 index 0000000000000000000000000000000000000000..d10072fc49fee4736d4b2fba82fd6f1abdaa1ff3 --- /dev/null +++ b/gradio/.config/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "useTabs": true, + "singleQuote": false, + "trailingComma": "none", + "printWidth": 80, + "plugins": ["prettier-plugin-svelte"], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/gradio/.config/basevite.config.ts b/gradio/.config/basevite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..cca6b1b2c6d44fcc6a9b1da1dd014a314d1dfe85 --- /dev/null +++ b/gradio/.config/basevite.config.ts @@ -0,0 +1,93 @@ +import { defineConfig } from "vite"; +import { svelte } from "@sveltejs/vite-plugin-svelte"; +import sveltePreprocess from "svelte-preprocess"; +// @ts-ignore +import custom_media from "postcss-custom-media"; +import global_data from "@csstools/postcss-global-data"; +// @ts-ignore +import prefixer from "postcss-prefix-selector"; +import { readFileSync } from "fs"; +import { join } from "path"; +import { fileURLToPath } from "url"; + +const __dirname = fileURLToPath(new URL(".", import.meta.url)); +const version_path = join(__dirname, "..", "gradio", "package.json"); +const theme_token_path = join( + __dirname, + "..", + "js", + "theme", + "src", + "tokens.css" +); + +const version = JSON.parse(readFileSync(version_path, { encoding: "utf-8" })) + .version.trim() + .replace(/\./g, "-"); + +//@ts-ignore +export default defineConfig(({ mode }) => { + const production = mode === "production"; + + return { + server: { + port: 9876 + }, + + build: { + sourcemap: false, + target: "esnext", + minify: production, + rollupOptions: { + external: ["virtual:component-loader"] + } + }, + define: { + BUILD_MODE: production ? JSON.stringify("prod") : JSON.stringify("dev"), + BACKEND_URL: production + ? JSON.stringify("") + : JSON.stringify("http://localhost:7860/"), + GRADIO_VERSION: JSON.stringify(version) + }, + css: { + postcss: { + plugins: [ + prefixer({ + prefix: `.gradio-container-${version}`, + // @ts-ignore + transform(prefix, selector, prefixedSelector, fileName) { + if (selector.indexOf("gradio-container") > -1) { + return prefix; + } else if ( + selector.indexOf(":root") > -1 || + selector.indexOf("dark") > -1 || + fileName.indexOf(".svelte") > -1 + ) { + return selector; + } + return prefixedSelector; + } + }), + custom_media() + ] + } + }, + plugins: [ + svelte({ + inspector: false, + compilerOptions: { + dev: !production + }, + hot: !process.env.VITEST && !production, + preprocess: sveltePreprocess({ + postcss: { + plugins: [ + global_data({ files: [theme_token_path] }), + custom_media() + ] + } + }) + }) + ] + }; +}); diff --git a/gradio/.config/copy_frontend.py b/gradio/.config/copy_frontend.py new file mode 100644 index 0000000000000000000000000000000000000000..a75f4c7479312cb3052543140764ab99d1feaa51 --- /dev/null +++ b/gradio/.config/copy_frontend.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +import shutil +import pathlib +from typing import Any + +from hatchling.builders.hooks.plugin.interface import BuildHookInterface + + +def copy_js_code(root: str | pathlib.Path): + NOT_COMPONENT = [ + "app", + "node_modules", + "storybook", + "playwright-report", + "workbench", + "tooltils", + ] + for entry in (pathlib.Path(root) / "js").iterdir(): + if ( + entry.is_dir() + and not str(entry.name).startswith("_") + and not str(entry.name) in NOT_COMPONENT + ): + + def ignore(s, names): + ignored = [] + for n in names: + if ( + n.startswith("CHANGELOG") + or n.startswith("README.md") + or n.startswith("node_modules") + or ".test." in n + or ".stories." in n + or ".spec." in n + ): + ignored.append(n) + return ignored + + shutil.copytree( + str(entry), + str(pathlib.Path("gradio") / "_frontend_code" / entry.name), + ignore=ignore, + dirs_exist_ok=True, + ) + shutil.copytree( + str(pathlib.Path(root) / "client" / "js"), + str(pathlib.Path("gradio") / "_frontend_code" / "client"), + ignore=lambda d, names: ["node_modules"], + dirs_exist_ok=True, + ) + + +class BuildHook(BuildHookInterface): + def initialize(self, version: str, build_data: dict[str, Any]) -> None: + copy_js_code(self.root) + + +if __name__ == "__main__": + copy_js_code(pathlib.Path("..").resolve()) diff --git a/gradio/.config/demos.json b/gradio/.config/demos.json new file mode 100644 index 0000000000000000000000000000000000000000..d0c5618660bc59b23b36e7ada4d49a7a50b6e023 --- /dev/null +++ b/gradio/.config/demos.json @@ -0,0 +1,34 @@ +[ + "audio_debugger", + "blocks_essay", + "blocks_group", + "blocks_js_methods", + "blocks_layout", + "blocks_multiple_event_triggers", + "blocks_update", + "calculator", + "cancel_events", + "chatbot_multimodal", + "chatinterface_streaming_echo", + "clear_components", + "code", + "fake_gan", + "fake_diffusion_with_gif", + "file_explorer_component_events", + "image_mod_default_image", + "image_editor_events", + "image_segmentation", + "interface_random_slider", + "kitchen_sink", + "kitchen_sink_random", + "matrix_transpose", + "mini_leaderboard", + "model3D", + "native_plots", + "reverse_audio", + "stt_or_tts", + "stream_audio", + "stream_frames", + "video_component", + "zip_files" +] diff --git a/gradio/.config/eslint.config.js b/gradio/.config/eslint.config.js new file mode 100644 index 0000000000000000000000000000000000000000..8e500c83820435c5dcffc2265fa8e22c071745a4 --- /dev/null +++ b/gradio/.config/eslint.config.js @@ -0,0 +1,163 @@ +import globals from "globals"; +import ts_plugin from "@typescript-eslint/eslint-plugin"; +import js_plugin from "@eslint/js"; +import jsdoc from "eslint-plugin-jsdoc"; + +import typescriptParser from "@typescript-eslint/parser"; +import sveltePlugin from "eslint-plugin-svelte"; +import svelteParser from "svelte-eslint-parser"; + +const ts_rules_disabled = Object.fromEntries( + Object.keys(ts_plugin.rules).map((rule) => [ + `@typescript-eslint/${rule}`, + "off" + ]) +); +const js_rules_disabled = Object.fromEntries( + Object.keys(js_plugin.configs.all.rules).map((rule) => [rule, "off"]) +); + +const jsdoc_rules_disabled = Object.fromEntries( + Object.keys(jsdoc.configs.recommended.rules).map((rule) => [ + `jsdoc/${rule}`, + "off" + ]) +); + +const js_rules = { + ...js_rules_disabled, + "no-console": ["error", { allow: ["warn", "error", "debug", "info"] }], + "no-constant-condition": "error", + "no-dupe-args": "error", + "no-extra-boolean-cast": "error", + "no-unexpected-multiline": "error", + "no-unreachable": "error", + "array-callback-return": "error", + complexity: "error", + "no-else-return": "error", + "no-useless-return": "error", + "no-undef": "error" +}; + +const ts_rules = { + ...ts_rules_disabled, + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/explicit-function-return-type": [ + "error", + { allowExpressions: true } + ], + "@typescript-eslint/consistent-type-exports": "error", + "@typescript-eslint/ban-types": "error", + "@typescript-eslint/array-type": "error", + "@typescript-eslint/no-inferrable-types": "error" +}; + +const jsdoc_rules = { + ...jsdoc_rules_disabled, + "jsdoc/require-param-description": "error", + "jsdoc/require-returns-description": "error" +}; + +const { browser, es2021, node } = globals; + +export default [ + { + ignores: [ + "**/.svelte-kit/**/*", + "**/node_modules/**", + "**/dist/**", + "**/.config/*", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.node-test.ts", + "js/spa/test/**/*", + "**/*vite.config.ts", + "**/_website/**/*", + "**/_spaces-test/**/*", + "**/preview/test/**/*", + "**/component-test/**/*", + "**/js/wasm/src/webworker/**/*" + ] + }, + { + files: ["**/*.js", "**/*.cjs"], + languageOptions: { + globals: { + ...browser, + ...es2021, + ...node + } + }, + + plugins: { + "eslint:recommended": js_plugin, + jsdoc + }, + rules: { ...js_rules, ...jsdoc_rules } + }, + + { + files: ["**/*.ts"], + languageOptions: { + parser: typescriptParser, + parserOptions: { + project: "./tsconfig.json", + extraFileExtensions: [".svelte"] + }, + globals: { + ...browser, + ...es2021, + ...node + } + }, + + plugins: { + "@typescript-eslint": ts_plugin, + "eslint:recommended": js_plugin, + jsdoc + }, + rules: { + ...ts_rules, + ...js_rules, + ...jsdoc_rules, + "no-undef": "off" + } + }, + { + files: ["**/client/js/**"], + languageOptions: { + parserOptions: { + project: "./client/js/tsconfig.json" + } + } + }, + { + files: ["**/*.svelte"], + languageOptions: { + parser: svelteParser, + parserOptions: { + parser: typescriptParser, + project: "./tsconfig.json", + extraFileExtensions: [".svelte"] + }, + globals: { + ...browser, + ...es2021 + } + }, + plugins: { + svelte: sveltePlugin, + "@typescript-eslint": ts_plugin, + "eslint:recommended": js_plugin, + jsdoc + }, + rules: { + ...ts_rules, + ...js_rules, + ...jsdoc_rules, + ...sveltePlugin.configs.recommended.rules, + "svelte/no-at-html-tags": "off", + "no-undef": "off" + } + } +]; diff --git a/gradio/.config/lite-builder/pyproject.toml b/gradio/.config/lite-builder/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..7ae3b01e7414bb3afb0e1e57b43a82c34b4f2060 --- /dev/null +++ b/gradio/.config/lite-builder/pyproject.toml @@ -0,0 +1,33 @@ +[build-system] +requires = ["hatchling",] +build-backend = "hatchling.build" + +[project] +name = "lite-builder" +description = "Python library for easily interacting with trained machine learning models" +license = "Apache-2.0" +version = "0.0.2" +requires-python = ">=3.8" +authors = [ + { name = "Abubakar Abid", email = "gradio-team@huggingface.co" }, + { name = "Ali Abid", email = "gradio-team@huggingface.co" }, + { name = "Ali Abdalla", email = "gradio-team@huggingface.co" }, + { name = "Dawood Khan", email = "gradio-team@huggingface.co" }, + { name = "Ahsen Khaliq", email = "gradio-team@huggingface.co" }, + { name = "Pete Allen", email = "gradio-team@huggingface.co" }, + { name = "Ömer Faruk Özdemir", email = "gradio-team@huggingface.co" }, + { name = "Freddy A Boulton", email = "gradio-team@huggingface.co" }, + { name = "Hannah Blair", email = "gradio-team@huggingface.co" }, +] +keywords = ["machine learning", "reproducibility", "visualization"] + +classifiers = [ + 'Development Status :: 5 - Production/Stable', +] + +[tool.hatch.build] +sources = ["src"] +only-packages = true + +[project.entry-points.hatch] +lite_builder = "lite_builder.hooks" diff --git a/gradio/.config/lite-builder/src/lite_builder/__init__.py b/gradio/.config/lite-builder/src/lite_builder/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/gradio/.config/lite-builder/src/lite_builder/builder.py b/gradio/.config/lite-builder/src/lite_builder/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..fe539946e5ba636964158f459de05736bd4c2eef --- /dev/null +++ b/gradio/.config/lite-builder/src/lite_builder/builder.py @@ -0,0 +1,5 @@ +from hatchling.builders.wheel import WheelBuilder + + +class LiteBuilder(WheelBuilder): + PLUGIN_NAME = 'lite' \ No newline at end of file diff --git a/gradio/.config/lite-builder/src/lite_builder/hooks.py b/gradio/.config/lite-builder/src/lite_builder/hooks.py new file mode 100644 index 0000000000000000000000000000000000000000..6f4dfa6b9daad0a2cd593b206731b45ce2eb3277 --- /dev/null +++ b/gradio/.config/lite-builder/src/lite_builder/hooks.py @@ -0,0 +1,6 @@ +from hatchling.plugin import hookimpl +from .builder import LiteBuilder + +@hookimpl +def hatch_register_builder(): + return LiteBuilder \ No newline at end of file diff --git a/gradio/.config/playwright-ct.config.ts b/gradio/.config/playwright-ct.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..f800376745938f15d896c3cc87e3fb8a2a93b7ca --- /dev/null +++ b/gradio/.config/playwright-ct.config.ts @@ -0,0 +1,41 @@ +import { defineConfig, devices } from "@playwright/experimental-ct-svelte"; +import config from "./basevite.config"; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "../", + /* The base directory, relative to the config file, for snapshot files created with toMatchSnapshot and toHaveScreenshot. */ + snapshotDir: "./__snapshots__", + /* Maximum time one test can run for. */ + timeout: 10 * 1000, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + + /* Port to use for Playwright component endpoint. */ + ctPort: 3100, + ctViteConfig: config({ mode: "development", command: "build" }) + }, + testMatch: "*.component.spec.ts", + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] } + } + ] +}); diff --git a/gradio/.config/playwright-setup.js b/gradio/.config/playwright-setup.js new file mode 100644 index 0000000000000000000000000000000000000000..038494844ae658f136a9aba371c0a77d3fc960dc --- /dev/null +++ b/gradio/.config/playwright-setup.js @@ -0,0 +1,179 @@ +import { spawn } from "node:child_process"; +import { join, basename } from "path"; +import { fileURLToPath } from "url"; +import { readdirSync, writeFileSync } from "fs"; +import net from "net"; + +import kl from "kleur"; + +const __dirname = fileURLToPath(new URL(".", import.meta.url)); +const TEST_APP_PATH = join(__dirname, "./test.py"); +const TEST_FILES_PATH = join(__dirname, "..", "js", "spa", "test"); +const ROOT = join(__dirname, ".."); + +const test_files = readdirSync(TEST_FILES_PATH) + .filter( + (f) => + f.endsWith("spec.ts") && + !f.endsWith(".skip.spec.ts") && + !f.endsWith(".component.spec.ts") && + !f.endsWith(".reload.spec.ts") + ) + .map((f) => ({ + module_name: `${basename(f, ".spec.ts")}.run`, + dir_name: basename(f, ".spec.ts") + })); + +export default async function global_setup() { + const verbose = process.env.GRADIO_TEST_VERBOSE; + + const port = await find_free_port(7860, 8860); + process.env.GRADIO_E2E_TEST_PORT = port; + + process.stdout.write(kl.yellow("\nCreating test gradio app.\n\n")); + + const test_cases = []; + // check if there is a testcase file in the same directory as the test file + // if there is, append that to the file + test_files.forEach((value) => { + const test_case_dir = join(ROOT, "demo", value.dir_name); + + readdirSync(test_case_dir) + .filter((f) => f.endsWith("_testcase.py")) + .forEach((f) => { + test_cases.push({ + module_name: `${value.dir_name}.${basename(f, ".py")}`, + dir_name: `${value.dir_name}_${basename(f, ".py")}` + }); + }); + }); + + const all_test_files = test_files.concat(test_cases); + const test_app = make_app(all_test_files, port); + process.stdout.write(kl.yellow("App created. Starting test server.\n\n")); + + process.stdout.write(kl.bgBlue(" =========================== \n")); + process.stdout.write(kl.bgBlue(" === PYTHON STARTUP LOGS === \n")); + process.stdout.write(kl.bgBlue(" =========================== \n\n")); + + writeFileSync(TEST_APP_PATH, test_app); + + const app = await spawn_gradio_app(TEST_APP_PATH, port, verbose); + + process.stdout.write( + kl.green(`\n\nServer started. Running tests on port ${port}.\n`) + ); + + return () => { + process.stdout.write(kl.green(`\nTests complete, cleaning up!\n`)); + + kill_process(app); + }; +} +const INFO_RE = /^INFO:/; + +function spawn_gradio_app(app, port, verbose) { + const PORT_RE = new RegExp(`:${port}`); + + return new Promise((res, rej) => { + const _process = spawn(`python`, [app], { + shell: true, + stdio: "pipe", + cwd: ROOT, + env: { + ...process.env, + PYTHONUNBUFFERED: "true", + GRADIO_ANALYTICS_ENABLED: "False", + GRADIO_IS_E2E_TEST: "1" + } + }); + _process.stdout.setEncoding("utf8"); + + function std_out(data) { + const _data = data.toString(); + const is_info = INFO_RE.test(_data); + + if (is_info) { + process.stdout.write(kl.yellow(_data)); + } + + if (!is_info) { + process.stdout.write(`${_data}\n`); + } + + if (PORT_RE.test(_data)) { + process.stdout.write(kl.bgBlue("\n =========== END =========== ")); + + res(_process); + + if (!verbose) { + _process.stdout.off("data", std_out); + _process.stderr.off("data", std_out); + } + } + } + + _process.stdout.on("data", std_out); + _process.stderr.on("data", std_out); + _process.on("exit", () => kill_process(_process)); + _process.on("close", () => kill_process(_process)); + _process.on("disconnect", () => kill_process(_process)); + }); +} + +function kill_process(process) { + process.kill("SIGKILL"); +} + +function make_app(demos, port) { + return ` +import uvicorn +from fastapi import FastAPI +import gradio as gr + +${demos.map((obj) => `from demo.${obj.module_name} import demo as ${obj.dir_name}`).join("\n")} + +app = FastAPI() +${demos + .map( + (obj) => + `app = gr.mount_gradio_app(app, ${obj.dir_name}, path="/${obj.dir_name}", max_file_size=${ + obj.dir_name == "upload_file_limit_test" ? "'15kb'" : "None" + })` + ) + .join("\n")} + +config = uvicorn.Config(app, port=${port}, log_level="info") +server = uvicorn.Server(config=config) +server.run()`; +} + +export async function find_free_port(start_port, end_port) { + for (let port = start_port; port < end_port; port++) { + if (await is_free_port(port)) { + return port; + } + } + + throw new Error( + `Could not find free ports: there were not enough ports available.` + ); +} + +export function is_free_port(port) { + return new Promise((accept, reject) => { + const sock = net.createConnection(port, "127.0.0.1"); + sock.once("connect", () => { + sock.end(); + accept(false); + }); + sock.once("error", (e) => { + sock.destroy(); + if (e.code === "ECONNREFUSED") { + accept(true); + } else { + reject(e); + } + }); + }); +} diff --git a/gradio/.config/playwright.config.js b/gradio/.config/playwright.config.js new file mode 100644 index 0000000000000000000000000000000000000000..739e78f32de43111aae8dadc7dc9dcc57f6b2d8c --- /dev/null +++ b/gradio/.config/playwright.config.js @@ -0,0 +1,61 @@ +import { defineConfig, devices } from "@playwright/test"; + +const base = defineConfig({ + use: { + screenshot: "only-on-failure", + trace: "retain-on-failure", + bypassCSP: true, + launchOptions: { + args: [ + "--disable-web-security", + "--use-fake-device-for-media-stream", + "--use-fake-ui-for-media-stream", + "--use-file-for-fake-audio-capture=../gradio/test_data/test_audio.wav" + ] + } + }, + expect: { timeout: 15000 }, + timeout: 30000, + testMatch: /.*\.spec\.ts/, + testDir: "..", + workers: process.env.CI ? 1 : undefined, + retries: 3 +}); + +const normal = defineConfig(base, { + globalSetup: process.env.CUSTOM_TEST ? undefined : "./playwright-setup.js", + projects: [ + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + testMatch: /.stream_(audio|video)_out\.spec\.ts/ + }, + { + name: "chrome", + use: { + ...devices["Desktop Chrome"], + permissions: ["clipboard-read", "clipboard-write", "microphone"] + }, + testIgnore: /.stream_(audio|video)_out\.spec\.ts/ + } + ] +}); + +const lite = defineConfig(base, { + webServer: { + command: "python -m http.server 8000 --directory ../js/lite", + url: "http://localhost:8000/", + reuseExistingServer: !process.env.CI + }, + testMatch: [ + "**/file_component_events.spec.ts", + "**/kitchen_sink.spec.ts", + "**/gallery_component_events.spec.ts", + "**/image_remote_url.spec.ts" // To detect the bugs on Lite fixed in https://github.com/gradio-app/gradio/pull/8011 and https://github.com/gradio-app/gradio/pull/8026 + ], + workers: 1, + retries: 3, + timeout: 60000 +}); + +export default !!process.env.GRADIO_E2E_TEST_LITE ? lite : normal; diff --git a/gradio/.config/playwright/index.html b/gradio/.config/playwright/index.html new file mode 100644 index 0000000000000000000000000000000000000000..c579603d6c6c0c44bfb07e0f30f1caf6385e7fa7 --- /dev/null +++ b/gradio/.config/playwright/index.html @@ -0,0 +1,12 @@ + + + + + + Testing Page + + +
+ + + diff --git a/gradio/.config/playwright/index.ts b/gradio/.config/playwright/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4eb7ef876cb9dc2c835c33b890dd1d8b1ad1ef0f --- /dev/null +++ b/gradio/.config/playwright/index.ts @@ -0,0 +1,2 @@ +// Import styles, initialize component theme here. +// import '../src/common.css'; diff --git a/gradio/.config/postcss.config.cjs b/gradio/.config/postcss.config.cjs new file mode 100644 index 0000000000000000000000000000000000000000..4fce5cdfd134a11624de81c92e9fd7a069328dad --- /dev/null +++ b/gradio/.config/postcss.config.cjs @@ -0,0 +1,8 @@ +const tailwindcss = require("tailwindcss"); +const autoprefixer = require("autoprefixer"); +const nested = require("tailwindcss/nesting"); +const tw_config = require("./tailwind.config.cjs"); + +module.exports = { + plugins: [nested, tailwindcss(tw_config), autoprefixer] +}; diff --git a/gradio/.config/setup_vite_tests.ts b/gradio/.config/setup_vite_tests.ts new file mode 100644 index 0000000000000000000000000000000000000000..888f5081c77893600b2465eb1c333156a8400624 --- /dev/null +++ b/gradio/.config/setup_vite_tests.ts @@ -0,0 +1,8 @@ +import type { TestingLibraryMatchers } from "@testing-library/jest-dom/matchers"; +import "@testing-library/jest-dom/vitest"; + +declare module "vitest" { + interface Assertion + extends jest.Matchers, + TestingLibraryMatchers {} +} diff --git a/gradio/.config/svelte.config.js b/gradio/.config/svelte.config.js new file mode 100644 index 0000000000000000000000000000000000000000..31ac801f20e44016fdd9daf4e4773f5d1dfcd91c --- /dev/null +++ b/gradio/.config/svelte.config.js @@ -0,0 +1,5 @@ +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +export default { + preprocess: vitePreprocess() +}; diff --git a/gradio/.config/tailwind.config.cjs b/gradio/.config/tailwind.config.cjs new file mode 100644 index 0000000000000000000000000000000000000000..785e107a6d4bb5f2a702f0e05ca00891d14a498f --- /dev/null +++ b/gradio/.config/tailwind.config.cjs @@ -0,0 +1,12 @@ +module.exports = { + content: [ + "./src/**/*.{html,js,svelte,ts}", + "**/@gradio/**/*.{html,js,svelte,ts}" + ], + + theme: { + extend: {} + }, + + plugins: [require("@tailwindcss/forms")] +}; diff --git a/gradio/.config/vitest.config.ts b/gradio/.config/vitest.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..a6baf2881decfc74f59ea80f6ab4a1b10418d2f4 --- /dev/null +++ b/gradio/.config/vitest.config.ts @@ -0,0 +1,3 @@ +import config from "../js/spa/vite.config"; + +export default config; diff --git a/gradio/.devcontainer/devcontainer.json b/gradio/.devcontainer/devcontainer.json new file mode 100644 index 0000000000000000000000000000000000000000..51ceee25f587e4550ac256447bfc8aab6e0a30a4 --- /dev/null +++ b/gradio/.devcontainer/devcontainer.json @@ -0,0 +1,41 @@ +// See https://containers.dev +{ + "name": "Python 3", + "image": "mcr.microsoft.com/devcontainers/python:1-3.9", + + // See https://containers.dev/features + "features": { + "ghcr.io/devcontainers/features/git:1": {}, + "ghcr.io/devcontainers/features/node:1": {}, + "ghcr.io/devcontainers-contrib/features/ffmpeg-apt-get:1": {} + }, + + "hostRequirements": { + "cpus": 4, + "memory": "8gb", + "storage": "32gb" + }, + + "customizations": { + "vscode": { + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance", + "ms-python.black-formatter", + "ms-toolsai.jupyter", + "esbenp.prettier-vscode", + "svelte.svelte-vscode", + "phoenisx.cssvar" + ], + "remote.autoForwardPorts": false + } + }, + + "forwardPorts": [7860, 9876], + "portsAttributes": { + "7860": { "label": "gradio port" }, + "9876": { "label": "gradio dev port" } + }, + + "postCreateCommand": "export NODE_OPTIONS=\"--max-old-space-size=8192\" && chmod +x scripts/install_gradio.sh scripts/install_test_requirements.sh scripts/build_frontend.sh && ./scripts/install_gradio.sh && ./scripts/install_test_requirements.sh && ./scripts/build_frontend.sh" +} diff --git a/gradio/.dockerignore b/gradio/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..39dc8667104a47f24826ca351a076808b76bfadd --- /dev/null +++ b/gradio/.dockerignore @@ -0,0 +1,40 @@ +# Python build +.eggs/ +gradio.egg-info/* +!gradio.egg-info/requires.txt +!gradio.egg-info/PKG-INFO +dist/ +*.pyc +__pycache__/ +*.py[cod] +*$py.class +build/ + +# JS build +gradio/templates/frontend/static +gradio/templates/frontend/cdn + +# Secrets +.env + +# Gradio run artifacts +*.db +*.sqlite3 +gradio/launches.json + +# Tests +.coverage +coverage.xml +test.txt + +# Demos +demo/tmp.zip +demo/flagged +demo/files/*.avi +demo/files/*.mp4 + +# Etc +.idea/* +.DS_Store +*.bak +workspace.code-workspace \ No newline at end of file diff --git a/gradio/.editorconfig b/gradio/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..5ae8d1e3e86216380b81836dad57d0367215c2e2 --- /dev/null +++ b/gradio/.editorconfig @@ -0,0 +1,8 @@ + +root = true + +[{js/**,client/js/**}] +end_of_line = lf +insert_final_newline = true +indent_style = tab +tab_width = 2 diff --git a/gradio/.git-blame-ignore-revs b/gradio/.git-blame-ignore-revs new file mode 100644 index 0000000000000000000000000000000000000000..8dd11aa390fe8586f4c1d39aa52a7b2aaf02dfca --- /dev/null +++ b/gradio/.git-blame-ignore-revs @@ -0,0 +1,14 @@ +# https://github.com/gradio-app/gradio/pull/4487 - refactor components.py to separate files +69f36f98535c904e7cac2b4942cecc747ed7443c +# Format the codebase +cc0cff893f9d7d472788adc2510c123967b384fe +# Switch from black to ruff +8a70e83db9c7751b46058cdd2514e6bddeef6210 +# format (#4810) +7fa5e766ce0f89f1fb84c329e62c9df9c332120a +# lint website +4bf301324b3b180fa32166ff1774312b01334c88 +# format frontend with prettier +980b9f60eb49ed81e4957debe7b23a559a4d4b51 +# Refactor component directories (#5074) +1419538ea795caa391e3de809379f10639e9e764 diff --git a/gradio/.github/ISSUE_TEMPLATE/bug_report_template.yml b/gradio/.github/ISSUE_TEMPLATE/bug_report_template.yml new file mode 100644 index 0000000000000000000000000000000000000000..6bd947c420bbb8a5a7ea25c0182f565561592e49 --- /dev/null +++ b/gradio/.github/ISSUE_TEMPLATE/bug_report_template.yml @@ -0,0 +1,69 @@ +name: "\U0001F41E Bug report" +description: Report a bug on Gradio +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! Before you get started, please [search to see](https://github.com/gradio-app/gradio/issues) if an issue already exists for the bug you encountered + - type: textarea + id: bug-description + attributes: + label: Describe the bug + description: Please provide a concise description of what the bug is, in clear English. If you intend to submit a PR for this issue, tell us in the description. + placeholder: Bug description + validations: + required: true + - type: checkboxes + attributes: + label: Have you searched existing issues? 🔎 + description: Please search to see if an issue already exists for the issue you encountered. + options: + - label: I have searched and found no existing issues + required: true + - type: textarea + id: reproduction + attributes: + label: Reproduction + description: Please provide a minimal example, with code, that can be run to reproduce the issue. Do NOT provide screenshots of code, or link to external repos or applications. Use ``` to format code blocks. + placeholder: Reproduction + value: | + ```python + import gradio as gr + + ``` + validations: + required: true + - type: textarea + id: screenshot + attributes: + label: Screenshot + description: If relevant, please include screenshot(s) of your Gradio app so that we can understand what the issue is. + - type: textarea + id: logs + attributes: + label: Logs + description: "Please include the full stacktrace of the errors you get from Python or Javascript. If you are running in a colab notebooks, you can get the logs with by setting `debug=True`, i.e: `gradio.Interface.launch(debug=True)`" + render: shell + - type: textarea + id: system-info + attributes: + label: System Info + description: Please ensure you are running the latest version of Gradio. You can get the Gradio version and all its dependencies by running `gradio environment` + render: shell + validations: + required: true + - type: dropdown + id: severity + attributes: + label: Severity + description: Select the severity of this issue + options: + - I can work around it + - Blocking usage of gradio + validations: + required: true + - type: markdown + attributes: + value: | + 📌 Please ensure that you have filled all of the required sections above, and that the reproduction you have provided is [minimal, complete, and reproducible](https://stackoverflow.com/help/minimal-reproducible-example). Incomplete issues will be closed. diff --git a/gradio/.github/ISSUE_TEMPLATE/config.yml b/gradio/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..27bba5deffde3e625324354c4e4454834945c386 --- /dev/null +++ b/gradio/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: 💡 General questions + url: https://discord.com/invite/feTf9x3ZSB + about: Have general questions about how to use Gradio? Please ask in our community Discord for quicker responses diff --git a/gradio/.github/ISSUE_TEMPLATE/feature_request.md b/gradio/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000000000000000000000000000000000..457cf80c6c66112cfc5b3e236566365098d0106c --- /dev/null +++ b/gradio/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: ⚡ Feature request +about: Suggest an improvement or new feature or a new Guide for Gradio +title: '' +labels: '' +assignees: '' + +--- +- [ ] I have searched to see if a similar issue already exists. + + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/gradio/.github/PULL_REQUEST_TEMPLATE.md b/gradio/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000000000000000000000000000000000..0a4b5fa07f0f104dbccbe374b19ef9b93dc98ad4 --- /dev/null +++ b/gradio/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ +## Description + +Please include a concise summary, in clear English, of the changes in this pull request. If it closes an issue, please mention it here. + +Closes: #(issue) + +## 🎯 PRs Should Target Issues + +Before your create a PR, please check to see if there is [an existing issue](https://github.com/gradio-app/gradio/issues) for this change. If not, please create an issue before you create this PR, unless the fix is very small. + +Not adhering to this guideline will result in the PR being closed. + +## Tests + +1. PRs will only be merged if tests pass on CI. To run the tests locally, please set up [your Gradio environment locally](https://github.com/gradio-app/gradio/blob/main/CONTRIBUTING.md) and run the tests: `bash scripts/run_all_tests.sh` + +2. You may need to run the linters: `bash scripts/format_backend.sh` and `bash scripts/format_frontend.sh` + diff --git a/gradio/.github/actions/changes/action.yml b/gradio/.github/actions/changes/action.yml new file mode 100644 index 0000000000000000000000000000000000000000..7cbe9012b59c023ec8158022c4ce889731517856 --- /dev/null +++ b/gradio/.github/actions/changes/action.yml @@ -0,0 +1,78 @@ +name: "prepare" +description: "Prepare workflow" + +inputs: + token: + description: "GitHub token" + filter: + description: "Which filter to use" + +outputs: + should_run: + description: "Whether to run the workflow" + value: ${{ steps.pr.outputs.should_run }} + pr_number: + description: "PR number" + value: ${{ steps.pr.outputs.pr_number }} + sha: + description: "SHA of the HEAD commit of the PR" + value: ${{ steps.pr.outputs.sha }} + source_repo: + description: "Source repo" + value: ${{ steps.pr.outputs.source_repo }} + source_branch: + description: "Source branch" + value: ${{ steps.pr.outputs.source_branch }} + labels: + description: "Labels on the PR" + value: ${{ steps.pr.outputs.labels }} + run_id: + description: "Run ID" + value: ${{ steps.pr.outputs.run_id }} + gradio_version: + description: "Gradio version" + value: ${{ steps.pr.outputs.gradio_version }} + +runs: + using: "composite" + steps: + - uses: actions/checkout@v4 + - uses: gradio-app/github/actions/filter-paths@main + id: changes + with: + token: ${{ inputs.token }} + filter: ${{ inputs.filter }} + - name: get gradio version + id: gradio_version + shell: bash + run: | + GRADIO_VERSION=$(curl -s https://pypi.org/pypi/gradio/json | grep -o '"version":"[^"]*"' | cut -d'"' -f4 | head -n 1) + echo "gradio_version=$GRADIO_VERSION" >> $GITHUB_OUTPUT + - name: convert to JSON + uses: gradio-app/github/actions/input-to-json@main + with: + path: output.json + sha: ${{ github.event.pull_request.head.sha || github.sha }} + source_repo: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + source_branch: ${{ github.event.pull_request.head.ref || github.ref }} + pr_number: ${{ github.event.pull_request.number || 'false'}} + should_run: ${{ steps.changes.outputs.match }} + labels: "[${{ join(github.event.pull_request.labels.*.name, ', ') }}]" + run_id: ${{ github.run_id }} + gradio_version: ${{ steps.gradio_version.outputs.gradio_version }} + - name: cat json + run: cat output.json + shell: bash + - name: upload JSON + uses: actions/upload-artifact@v4 + with: + name: changes + path: output.json + - name: set outputs + id: pr + uses: gradio-app/github/actions/json-to-output@main + with: + path: output.json + - name: echo outputs + run: echo "${{ toJson(steps.pr.outputs) }}" + shell: bash diff --git a/gradio/.github/actions/install-all-deps/action.yml b/gradio/.github/actions/install-all-deps/action.yml new file mode 100644 index 0000000000000000000000000000000000000000..38f2faedaee8a1789b466d6f3529f36b34d8aab6 --- /dev/null +++ b/gradio/.github/actions/install-all-deps/action.yml @@ -0,0 +1,92 @@ +name: "install all deps" +description: "Install all deps" + +inputs: + skip_build: + description: "Skip build" + default: "false" + build_lite: + description: "Build lite" + default: "false" + test: + description: "Test" + default: "false" + python_version: + description: "Python version" + default: "3.8" + os: + description: "OS" + default: "ubuntu-latest" +outputs: + venv_activate: + description: "Venv activate" + value: ${{ steps.venv.outputs.venv_activate }} + +runs: + using: "composite" + steps: + - name: Set venv binary path (linux) + if: ${{ inputs.os == 'ubuntu-latest' }} + shell: bash + run: | + echo "VENV_ACTIVATE=venv/bin/activate" >> $GITHUB_ENV + - name: Set venv binary path (windows) + if: ${{ inputs.os == 'windows-latest' }} + shell: bash + run: | + echo "VENV_ACTIVATE=venv\\\Scripts\\\activate" >> $GITHUB_ENV + - name: log venv binary path + id: venv + shell: bash + run: | + echo "venv_activate=$VENV_ACTIVATE" >> $GITHUB_OUTPUT + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: ${{ inputs.python_version }} + cache: pip + cache-dependency-path: | + client/python/requirements.txt + requirements.txt + test/requirements.txt + - name: Create env + shell: bash + run: | + python -m pip install --upgrade virtualenv + python -m virtualenv venv + # - uses: actions/cache@v4 + # id: cache + # with: + # path: | + # venv/* + # client/python/venv + # restore-keys: | + # gradio-lib-${{inputs.python_version}}-${{inputs.os}}-latest-pip- + # key: "gradio-lib-${{inputs.python_version}}-${{inputs.os}}-latest-pip-${{ hashFiles('client/python/requirements.txt') }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('test/requirements.txt') }}-${{ hashFiles('client/python/test/requirements.txt') }}${{ inputs.test == 'true' && '-test' || ''}}" + - name: Install ffmpeg + uses: FedericoCarboni/setup-ffmpeg@583042d32dd1cabb8bd09df03bde06080da5c87c # @v2 + - name: Install test dependencies + if: inputs.test == 'true' + # && steps.cache.outputs.cache-hit != 'true' + shell: bash + run: | + . ${{ env.VENV_ACTIVATE }} + python -m pip install -r test/requirements.txt + python -m pip install -r client/python/test/requirements.txt + - name: Install Gradio and Client Libraries Locally (Linux) + shell: bash + run: | + . ${{ env.VENV_ACTIVATE }} + python -m pip install -e client/python + python -m pip install -e ".[oauth]" + - name: install-frontend + uses: "gradio-app/gradio/.github/actions/install-frontend-deps@main" + with: + skip_build: ${{ inputs.skip_build }} + build_lite: ${{ inputs.build_lite }} + - name: generate json + shell: bash + if: inputs.os == 'ubuntu-latest' + run: | + . ${{ env.VENV_ACTIVATE }} + pip install boto3 && python js/_website/generate_jsons/generate.py diff --git a/gradio/.github/actions/install-frontend-deps/action.yml b/gradio/.github/actions/install-frontend-deps/action.yml new file mode 100644 index 0000000000000000000000000000000000000000..0e263fa86b8732231aede834d334b5950dcc72d6 --- /dev/null +++ b/gradio/.github/actions/install-frontend-deps/action.yml @@ -0,0 +1,51 @@ +name: "install frontend" +description: "Install frontend deps" + +inputs: + skip_build: + description: "Skip build" + default: "false" + build_lite: + description: "Build lite" + default: "false" + +runs: + using: "composite" + steps: + # - uses: actions/cache@v4 + # id: frontend-cache + # with: + # path: | + # gradio/templates/* + # key: gradio-lib-front-end-${{ hashFiles('js/**', 'client/js/**')}} + - name: Install pnpm + uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # @v4 + with: + version: 9.1.x + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + - name: Install deps + shell: bash + run: pnpm i --frozen-lockfile --ignore-scripts + - name: Build Css + shell: bash + run: pnpm css + - name: Build frontend + if: inputs.skip_build == 'false' + # && steps.frontend-cache.outputs.cache-hit != 'true' + shell: bash + run: pnpm build + - name: generate types + if: inputs.skip_build == 'false' || inputs.build_lite == 'true' + shell: bash + run: pnpm package + - name: Build frontend lite + if: inputs.build_lite == 'true' + shell: bash + run: | + . venv/bin/activate + python -m pip install -U build hatch packaging>=23.2 # packaging>=23.2 is needed to build Lite due to https://github.com/pypa/hatch/issues/1381 + pnpm build:lite diff --git a/gradio/.github/filters.json b/gradio/.github/filters.json new file mode 100644 index 0000000000000000000000000000000000000000..81d8e456e5cf6b91251fd6db40514b7944591357 --- /dev/null +++ b/gradio/.github/filters.json @@ -0,0 +1,51 @@ +{ + "gradio": [ + "client/python/**", + "gradio/**", + "requirements.txt", + ".github/**", + "scripts/**", + "test/**" + ], + "js": [ + "js/**", + "client/js/**", + ".github/**", + "package.json", + "pnpm-lock.yaml", + "tsconfig.json", + ".config/**" + ], + "functional": [ + ".github/**", + "client/**", + "demo/**", + "gradio/**", + "js/**", + "scripts/**", + + "globals.d.ts", + "package.json", + "pnpm-lock.yaml", + "pyproject.toml", + "requirements.txt", + ".config/**" + ], + "visual": [ + ".github/workflows/deploy-chromatic.yml", + "js!(/_website)/**", + "package.json" + ], + "website": [ + "js/_website/**", + "package.json", + "pnpm-lock.yaml", + "guides/**", + "README.md", + "CHANGELOG.md", + "gradio/**", + "client/**", + "demo/**", + ".github/deploy-website.yml" + ] +} diff --git a/gradio/.github/stale b/gradio/.github/stale new file mode 100644 index 0000000000000000000000000000000000000000..4043c63b0677f8a7fe2af8f3710125d3e6fd202f --- /dev/null +++ b/gradio/.github/stale @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 30 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/gradio/.github/workflows/comment-queue.yml b/gradio/.github/workflows/comment-queue.yml new file mode 100644 index 0000000000000000000000000000000000000000..436922bb5d8525967e248752df68f79c7c563395 --- /dev/null +++ b/gradio/.github/workflows/comment-queue.yml @@ -0,0 +1,37 @@ +name: Comment on pull request without race conditions + +on: + workflow_call: + inputs: + pr_number: + type: string + message: + required: true + type: string + tag: + required: false + type: string + default: "previews" + additional_text: + required: false + type: string + default: "" + secrets: + gh_token: + required: true + +jobs: + comment: + environment: comment_pr + concurrency: + group: ${{inputs.pr_number || inputs.tag}} + runs-on: ubuntu-latest + steps: + - name: comment on pr + uses: "gradio-app/github/actions/comment-pr@main" + with: + gh_token: ${{ secrets.gh_token }} + tag: ${{ inputs.tag }} + pr_number: ${{ inputs.pr_number}} + message: ${{ inputs.message }} + additional_text: ${{ inputs.additional_text }} diff --git a/gradio/.github/workflows/delete-stale-spaces.yml b/gradio/.github/workflows/delete-stale-spaces.yml new file mode 100644 index 0000000000000000000000000000000000000000..875c8a3b1060a1b7d15b889c08a7dc59dc1fa7d4 --- /dev/null +++ b/gradio/.github/workflows/delete-stale-spaces.yml @@ -0,0 +1,42 @@ +# safe runs from main + +name: Delete Stale Spaces + +on: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + inputs: + daysStale: + description: "How stale a space needs to be to be deleted (days)" + required: true + default: "7" + +permissions: {} + +jobs: + delete-old-spaces: + permissions: + contents: read + environment: deploy_spaces + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: "3.9" + - name: Install pip + run: python -m pip install pip wheel requests + - name: Install Hub Client Library + run: pip install huggingface-hub==0.9.1 + - name: Set daysStale + env: + DEFAULT_DAYS_STALE: "7" + DAYS_STALE: ${{ github.event.inputs.daysStale || env.DEFAULT_DAYS_STALE}} + run: echo DAYS_STALE= "$DAYS_STALE" >> $GITHUB_ENV + - name: Find and delete stale spaces + run: | + python scripts/delete_old_spaces.py $DAYS_STALE \ + gradio-pr-deploys \ + ${{ secrets.SPACES_DEPLOY_TOKEN }} diff --git a/gradio/.github/workflows/generate-changeset.yml b/gradio/.github/workflows/generate-changeset.yml new file mode 100644 index 0000000000000000000000000000000000000000..fb14971b9b4729bd33863eaf4bcc58156e713630 --- /dev/null +++ b/gradio/.github/workflows/generate-changeset.yml @@ -0,0 +1,96 @@ +name: Generate changeset +on: + workflow_run: + workflows: ["trigger-changeset"] + types: + - completed + +env: + CI: true + NODE_OPTIONS: "--max-old-space-size=4096" + +concurrency: + group: "${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}-${{ github.workflow_ref }}" + cancel-in-progress: true + +permissions: {} + +jobs: + get-pr: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + if: github.event.workflow_run.conclusion == 'success' + outputs: + found_pr: ${{ steps.pr_details.outputs.found_pr }} + pr_number: ${{ steps.pr_details.outputs.pr_number }} + source_repo: ${{ steps.pr_details.outputs.source_repo }} + source_branch: ${{ steps.pr_details.outputs.source_branch }} + steps: + - name: get pr details + id: pr_details + uses: gradio-app/github/actions/find-pr@main + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + comment-changes-start: + uses: "./.github/workflows/comment-queue.yml" + needs: get-pr + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.get-pr.outputs.pr_number }} + message: changes~pending~null + version: + permissions: + contents: read + environment: changeset + name: version + needs: get-pr + runs-on: ubuntu-latest + if: needs.get-pr.outputs.found_pr == 'true' + outputs: + skipped: ${{ steps.version.outputs.skipped }} + comment_url: ${{ steps.version.outputs.comment_url }} + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ needs.get-pr.outputs.source_repo }} + ref: ${{ needs.get-pr.outputs.source_branch }} + fetch-depth: 0 + token: ${{ secrets.COMMENT_TOKEN }} + - name: generate changeset + id: version + uses: "gradio-app/github/actions/generate-changeset@main" + with: + github_token: ${{ secrets.CHANGESET_GITHUB_TOKEN }} + main_pkg: gradio + pr_number: ${{ needs.get-pr.outputs.pr_number }} + branch_name: ${{ needs.get-pr.outputs.source_branch }} + comment-changes-skipped: + uses: "./.github/workflows/comment-queue.yml" + needs: [get-pr, version] + if: needs.version.result == 'success' && needs.version.outputs.skipped == 'true' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.get-pr.outputs.pr_number }} + message: changes~warning~https://github.com/gradio-app/gradio/actions/runs/${{github.run_id}}/ + comment-changes-success: + uses: "./.github/workflows/comment-queue.yml" + needs: [get-pr, version] + if: needs.version.result == 'success' && needs.version.outputs.skipped == 'false' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.get-pr.outputs.pr_number }} + message: changes~success~${{ needs.version.outputs.comment_url }} + comment-changes-failure: + uses: "./.github/workflows/comment-queue.yml" + needs: [get-pr, version] + if: always() && needs.version.result == 'failure' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.get-pr.outputs.pr_number }} + message: changes~failure~https://github.com/gradio-app/gradio/actions/runs/${{github.run_id}}/ diff --git a/gradio/.github/workflows/npm-previews.yml b/gradio/.github/workflows/npm-previews.yml new file mode 100644 index 0000000000000000000000000000000000000000..5ea47118938f18d5afd5fd4e382828581edc029b --- /dev/null +++ b/gradio/.github/workflows/npm-previews.yml @@ -0,0 +1,53 @@ +name: "npm" + +on: + pull_request: + +env: + CI: true + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" + NODE_OPTIONS: "--max-old-space-size=4096" + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + permissions: + contents: read + pull-requests: read + name: "changes" + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.changes.outputs.should_run }} + sha: ${{ steps.changes.outputs.sha }} + pr_number: ${{ steps.changes.outputs.pr_number }} + source_branch: ${{ steps.changes.outputs.source_branch }} + source_repo: ${{ steps.changes.outputs.source_repo }} + steps: + - uses: actions/checkout@v4 + - uses: "gradio-app/gradio/.github/actions/changes@main" + id: changes + with: + filter: "js" + token: ${{ secrets.GITHUB_TOKEN }} + preview: + permissions: + contents: read + name: npm-previews + runs-on: ubuntu-22.04 + needs: changes + if: needs.changes.outputs.should_run == 'true' + steps: + - uses: actions/checkout@v4 + - name: install dependencies + uses: "gradio-app/gradio/.github/actions/install-frontend-deps@main" + with: + skip_build: true + - name: build client + run: pnpm --filter @gradio/client --filter @gradio/wasm --filter @gradio/preview build + - name: publish npm previews + run: pnpx pkg-pr-new publish './js/*' './client/js' --comment=off diff --git a/gradio/.github/workflows/previews-build.yml b/gradio/.github/workflows/previews-build.yml new file mode 100644 index 0000000000000000000000000000000000000000..48d41460d1d6cab9403bf8edcaedecc459adcde8 --- /dev/null +++ b/gradio/.github/workflows/previews-build.yml @@ -0,0 +1,90 @@ +name: "previews-build" + +on: + workflow_dispatch: + pull_request: + +env: + CI: true + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" + NODE_OPTIONS: "--max-old-space-size=4096" + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + name: "changes" + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + outputs: + should_run: ${{ steps.changes.outputs.should_run }} + sha: ${{ steps.changes.outputs.sha }} + gradio_version: ${{ steps.changes.outputs.gradio_version }} + steps: + - uses: actions/checkout@v4 + - uses: "gradio-app/gradio/.github/actions/changes@main" + id: changes + with: + filter: "functional" + token: ${{ secrets.GITHUB_TOKEN }} + build: + permissions: + contents: read + name: "previews-build" + runs-on: ubuntu-22.04 + needs: changes + if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch' + steps: + - uses: actions/checkout@v4 + - name: install dependencies + uses: "gradio-app/gradio/.github/actions/install-all-deps@main" + with: + python_version: "3.9" + build_lite: "true" + - name: Package Lite NPM package + working-directory: js/lite + run: pnpm pack --pack-destination . + - name: Upload Lite NPM package + uses: actions/upload-artifact@v4 + with: + name: gradio-lite-${{ github.sha }} + path: js/lite/gradio-lite-*.tgz + - name: install deps + run: python -m pip install build + - name: Build pr package + run: | + python -c 'import json; j = json.load(open("gradio/package.json")); j["version"] = "${{ needs.changes.outputs.gradio_version }}"; json.dump(j, open("gradio/package.json", "w"))' + python3 -m build -w + - name: Upload Python package + uses: actions/upload-artifact@v4 + with: + name: gradio-build + path: dist/gradio-${{ needs.changes.outputs.gradio_version }}-py3-none-any.whl + - name: copy demos + uses: "gradio-app/github/actions/copy-demos@main" + with: + gradio_version: "https://gradio-pypi-previews.s3.amazonaws.com/${{ needs.changes.outputs.sha }}/gradio-${{ needs.changes.outputs.gradio_version }}-py3-none-any.whl" + gradio_client_version: "gradio-client @ git+https://github.com/gradio-app/gradio@${{ needs.changes.outputs.sha }}#subdirectory=client/python" + - name: upload demos + uses: actions/upload-artifact@v4 + with: + name: all_demos + path: demo + - name: Create JS client tarball + id: create_js_tarball + continue-on-error: true + run: | + cd client/js + tarball_name=$(npm pack) + echo "tarball_name=client/js/$tarball_name" >> $GITHUB_OUTPUT + - name: Upload JS client tarball artifact + uses: actions/upload-artifact@v4 + with: + name: js-client-tarball + path: ${{ steps.create_js_tarball.outputs.tarball_name }} diff --git a/gradio/.github/workflows/previews-deploy.yml b/gradio/.github/workflows/previews-deploy.yml new file mode 100644 index 0000000000000000000000000000000000000000..392d6e8b06f103ce4e3910841053633307c10ca2 --- /dev/null +++ b/gradio/.github/workflows/previews-deploy.yml @@ -0,0 +1,158 @@ +name: "previews-deploy" + +on: + workflow_run: + workflows: ["previews-build"] + types: + - completed + +concurrency: + group: "${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}-${{ github.workflow_ref }}" + cancel-in-progress: true + +jobs: + changes: + name: "changes" + runs-on: ubuntu-latest + if: github.event.workflow_run.conclusion == 'success' + permissions: + actions: read + outputs: + should_run: ${{ steps.json.outputs.should_run }} + sha: ${{ steps.json.outputs.sha }} + pr_number: ${{ steps.json.outputs.pr_number }} + source_branch: ${{ steps.json.outputs.source_branch }} + source_repo: ${{ steps.json.outputs.source_repo }} + labels: ${{ steps.json.outputs.labels }} + run_id: ${{ steps.json.outputs.run_id }} + gradio_version: ${{ steps.json.outputs.gradio_version }} + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: changes + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + - uses: gradio-app/github/actions/json-to-output@main + id: json + with: + path: output.json + + comment-spaces-start: + needs: changes + uses: "./.github/workflows/comment-queue.yml" + if: ${{ needs.changes.outputs.should_run == 'true' }} + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: spaces~pending~null + deploy: + name: "previews-deploy" + environment: deploy_spaces + outputs: + space_url: ${{ steps.upload-demo.outputs.SPACE_URL }} + js_tarball_url: ${{ steps.upload_js_tarball.outputs.js_tarball_url }} + needs: changes + if: ${{ (github.event.workflow_run.conclusion == 'success' && needs.changes.outputs.should_run == 'true') || github.event.workflow_run.event == 'workflow_dispatch' }} + runs-on: ubuntu-latest + permissions: + actions: read + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + - name: list artifacts + run: ls -R . + + - name: Set wheel name + id: set_wheel_name + run: | + wheel_file=$(find ./gradio-build -maxdepth 1 -type f -name "*.whl" -print -quit) + echo "wheel_name=$wheel_file" >> $GITHUB_OUTPUT + - name: Upload wheel + run: | + export AWS_ACCESS_KEY_ID=${{ secrets.PYPI_PREVIEWS_AWS_S3_ACCESS_KEY }} + export AWS_SECRET_ACCESS_KEY=${{ secrets.PYPI_PREVIEWS_AWS_S3_SECRET_ACCESS_KEY }} + export AWS_DEFAULT_REGION=us-east-1 + aws s3 cp ${{ steps.set_wheel_name.outputs.wheel_name}} s3://gradio-pypi-previews/${{ needs.changes.outputs.sha }}/ + + - name: Set tarball name + id: set_tarball_name + run: | + tar_gz_file=$(find ./js-client-tarball -maxdepth 1 -type f -name "*.tgz" -print -quit) + echo "tarball_path=$tar_gz_file" >> $GITHUB_OUTPUT + echo "tarball_name=$(basename $tar_gz_file)" >> $GITHUB_OUTPUT + - name: Upload JS Client Tarball to S3 + id: upload_js_tarball + continue-on-error: true + run: | + export AWS_ACCESS_KEY_ID=${{ secrets.NPM_PREVIEWS_AWS_S3_ACCESS_KEY }} + export AWS_SECRET_ACCESS_KEY=${{ secrets.NPM_PREVIEWS_AWS_S3_SECRET_ACCESS_KEY }} + export AWS_DEFAULT_REGION=us-east-1 + aws s3 cp ${{ steps.set_tarball_name.outputs.tarball_path }} s3://gradio-npm-previews/${{ needs.changes.outputs.sha }}/ + echo "js_tarball_url=https://gradio-npm-previews.s3.amazonaws.com/${{ needs.changes.outputs.sha }}/${{ steps.set_tarball_name.outputs.tarball_name }}" >> $GITHUB_OUTPUT + + - name: Install Hub Client Library + run: pip install huggingface-hub==0.23.2 + # temporary, but ensures the script cannot be modified in a PR + - name: Get deploy scripts + run: | + mkdir scripts + curl https://raw.githubusercontent.com/gradio-app/gradio/main/scripts/upload_demo_to_space.py -o scripts/upload_demo_to_space.py + curl https://raw.githubusercontent.com/gradio-app/gradio/main/scripts/upload_website_demos.py -o scripts/upload_website_demos.py + - name: make dirs + run: mkdir -p demo && mv all_demos/* demo/ + - name: Upload demo to spaces + if: github.event.workflow_run.event == 'pull_request' + id: upload-demo + run: | + python scripts/upload_demo_to_space.py all_demos \ + gradio-pr-deploys/pr-${{ needs.changes.outputs.pr_number }}-all-demos \ + ${{ secrets.SPACES_DEPLOY_TOKEN }} \ + --gradio-version ${{ needs.changes.outputs.gradio_version }} > url.txt + echo "SPACE_URL=$(tail -n 1 url.txt)" >> $GITHUB_OUTPUT + - name: Upload Website Demos + if: github.event.workflow_run.event == 'workflow_dispatch' + id: upload-website-demos + run: | + python scripts/upload_website_demos.py --AUTH_TOKEN ${{ secrets.WEBSITE_SPACES_DEPLOY_TOKEN }} \ + --WHEEL_URL https://gradio-pypi-previews.s3.amazonaws.com/${{ needs.changes.outputs.sha }}/ \ + --CLIENT_URL "gradio-client @ git+https://github.com/gradio-app/gradio@${{ needs.changes.outputs.sha }}#subdirectory=client/python" \ + --GRADIO_VERSION ${{ needs.changes.outputs.gradio_version }} + + comment-spaces-success: + uses: "./.github/workflows/comment-queue.yml" + needs: [deploy, changes] + if: needs.changes.outputs.should_run == 'true' && needs.deploy.result == 'success' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: spaces~success~${{ needs.deploy.outputs.space_url }} + additional_text: | + **Install Gradio from this PR** + ```bash + pip install https://gradio-pypi-previews.s3.amazonaws.com/${{ needs.changes.outputs.sha }}/gradio-${{ needs.changes.outputs.gradio_version }}-py3-none-any.whl + ``` + + **Install Gradio Python Client from this PR** + ```bash + pip install "gradio-client @ git+https://github.com/gradio-app/gradio@${{ needs.changes.outputs.sha }}#subdirectory=client/python" + ``` + + **Install Gradio JS Client from this PR** + ```bash + npm install ${{ needs.deploy.outputs.js_tarball_url }} + ``` + comment-spaces-failure: + uses: "./.github/workflows/comment-queue.yml" + needs: [deploy, changes] + if: always() && needs.deploy.result == 'failure' && needs.changes.outputs.should_run == 'true' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: spaces~failure~https://github.com/gradio-app/gradio/actions/runs/${{github.run_id}}/ diff --git a/gradio/.github/workflows/publish.yml b/gradio/.github/workflows/publish.yml new file mode 100644 index 0000000000000000000000000000000000000000..44ffcf02c7d4f57a9bb6251d439cb3be695429ce --- /dev/null +++ b/gradio/.github/workflows/publish.yml @@ -0,0 +1,78 @@ +# safe runs from main + +name: publish +on: + push: + branches: + - main + +env: + CI: true + PNPM_CACHE_FOLDER: .pnpm-store + NODE_OPTIONS: "--max-old-space-size=4096" +jobs: + version_or_publish: + runs-on: ubuntu-22.04 + environment: publish + steps: + - name: checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false + - name: install dependencies + uses: "gradio-app/gradio/.github/actions/install-all-deps@main" + with: + skip_build: "false" + - name: Build packages + run: | + . venv/bin/activate + pip install -U build hatch packaging>=23.2 # packaging>=23.2 is needed to build Lite due to https://github.com/pypa/hatch/issues/1381 + pnpm --filter @gradio/client --filter @gradio/lite --filter @gradio/preview build + + - name: create and publish versions + id: changesets + uses: changesets/action@aba318e9165b45b7948c60273e0b72fce0a64eb9 # @v1 + with: + version: pnpm ci:version + commit: "chore: update versions" + title: "chore: update versions" + publish: pnpm ci:publish + env: + NPM_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GRADIO_PAT }} + - name: add label to skip chromatic build + if: ${{ steps.changesets.outputs.pullRequestNumber != '' && steps.changesets.outputs.pullRequestNumber != 'undefined' }} + run: gh pr edit "$PR_NUMBER" --add-label "no-visual-update" + env: + PR_NUMBER: ${{ steps.changesets.outputs.pullRequestNumber }} + GITHUB_TOKEN: ${{ secrets.GRADIO_PAT }} + - name: add label to run flaky tests + if: ${{ steps.changesets.outputs.pullRequestNumber != '' && steps.changesets.outputs.pullRequestNumber != 'undefined' }} + run: gh pr edit "$PR_NUMBER" --add-label "flaky-tests" + env: + PR_NUMBER: ${{ steps.changesets.outputs.pullRequestNumber }} + GITHUB_TOKEN: ${{ secrets.GRADIO_PAT }} + - name: add label to run backend tests on Windows + if: ${{ steps.changesets.outputs.pullRequestNumber != '' && steps.changesets.outputs.pullRequestNumber != 'undefined' }} + run: gh pr edit "$PR_NUMBER" --add-label "windows-tests" + env: + PR_NUMBER: ${{ steps.changesets.outputs.pullRequestNumber }} + GITHUB_TOKEN: ${{ secrets.GRADIO_PAT }} + - name: publish to pypi + if: steps.changesets.outputs.hasChangesets != 'true' + uses: "gradio-app/github/actions/publish-pypi@main" + env: + AWS_ACCESS_KEY_ID: ${{ secrets.SDK_AWS_S3_BUCKET_ACCESS_KEY }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.SDK_AWS_S3_BUCKET_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: us-west-2 + with: + user: __token__ + passwords: | + gradio:${{ secrets.PYPI_API_TOKEN }} + gradio_client:${{ secrets.PYPI_GRADIO_CLIENT_TOKEN }} + - name: trigger spaces deploy workflow + env: + GITHUB_TOKEN: ${{ secrets.COMMENT_TOKEN }} + run: gh workflow run previews-build.yml diff --git a/gradio/.github/workflows/storybook-build.yml b/gradio/.github/workflows/storybook-build.yml new file mode 100644 index 0000000000000000000000000000000000000000..547c6d13fe7ef7a291008d20b9e1e8dbe8185602 --- /dev/null +++ b/gradio/.github/workflows/storybook-build.yml @@ -0,0 +1,68 @@ +name: "storybook-build" + +on: + pull_request: + push: + branches: + - main + - 5.0-dev + +env: + CI: true + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" + NODE_OPTIONS: "--max-old-space-size=4096" + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + permissions: + contents: read + pull-requests: read + name: "changes" + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.changes.outputs.should_run }} + sha: ${{ steps.changes.outputs.sha }} + source_branch: ${{ steps.changes.outputs.source_branch }} + source_repo: ${{ steps.changes.outputs.source_repo }} + steps: + - uses: actions/checkout@v4 + - uses: "gradio-app/gradio/.github/actions/changes@main" + id: changes + with: + filter: "visual" + token: ${{ secrets.GITHUB_TOKEN }} + build: + permissions: + contents: read + name: :storybook-build + runs-on: ubuntu-22.04 + needs: changes + if: needs.changes.outputs.should_run == 'true' + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ needs.changes.outputs.source_branch }} + repository: ${{ needs.changes.outputs.source_repo }} + - name: install dependencies + uses: "gradio-app/gradio/.github/actions/install-all-deps@main" + with: + skip_build: "true" + - name: build client + run: pnpm --filter @gradio/client build + - name: generate theme.css + run: | + . venv/bin/activate + python scripts/generate_theme.py --outfile js/storybook/theme.css + - name: build storybook + run: pnpm build-storybook --quiet + - name: upload storybook + uses: actions/upload-artifact@v4 + with: + name: storybook-static + path: storybook-static diff --git a/gradio/.github/workflows/storybook-deploy.yml b/gradio/.github/workflows/storybook-deploy.yml new file mode 100644 index 0000000000000000000000000000000000000000..9f3c5764eba5498cf1b992b7f32b2ed97dc3ecbe --- /dev/null +++ b/gradio/.github/workflows/storybook-deploy.yml @@ -0,0 +1,126 @@ +name: "storybook-deploy" + +on: + workflow_run: + workflows: ["storybook-build"] + types: + - completed + +concurrency: + group: "${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}-${{ github.workflow_ref }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + name: "changes" + runs-on: ubuntu-latest + if: github.event.workflow_run.conclusion == 'success' + permissions: + actions: read + outputs: + should_run: ${{ steps.json.outputs.should_run }} + sha: ${{ steps.json.outputs.sha }} + pr_number: ${{ steps.json.outputs.pr_number }} + source_branch: ${{ steps.json.outputs.source_branch }} + source_repo: ${{ steps.json.outputs.source_repo }} + labels: ${{ steps.json.outputs.labels }} + run_id: ${{ steps.json.outputs.run_id }} + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: changes + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + - uses: gradio-app/github/actions/json-to-output@main + id: json + with: + path: output.json + comment-chromatic-start: + uses: "./.github/workflows/comment-queue.yml" + needs: changes + if: needs.changes.outputs.should_run == 'true' || contains(needs.changes.outputs.labels, 'no-visual-update') + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: | + storybook~pending~null + update-status: + permissions: + actions: read + statuses: write + runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.should_run == 'false' || contains(needs.changes.outputs.labels, 'no-visual-update') + steps: + - name: update status + uses: gradio-app/github/actions/set-commit-status@main + with: + sha: ${{ needs.changes.outputs.sha }} + token: ${{ secrets.GITHUB_TOKEN }} + name: "UI Tests" + run_id: ${{ needs.changes.outputs.run_id }} + deploy: + permissions: + actions: read + contents: read + environment: storybook + name: "storybook-deploy" + needs: changes + if: needs.changes.outputs.should_run == 'true' && github.repository == 'gradio-app/gradio' && !contains(needs.changes.outputs.labels, 'no-visual-update') + runs-on: ubuntu-latest + outputs: + changes: ${{ steps.publish-chromatic.outputs.changeCount }} + errors: ${{ steps.publish-chromatic.outputs.errorCount }} + storybook_url: ${{ steps.publish-chromatic.outputs.storybookUrl }} + build_url: ${{ steps.publish-chromatic.outputs.buildUrl }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ needs.changes.outputs.source_branch }} + repository: ${{ needs.changes.outputs.source_repo }} + fetch-depth: 0 + - name: dowload storybook artifacts + uses: actions/download-artifact@v4 + with: + name: storybook-static + path: storybook-static + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + - name: list artifacts + run: ls -R . + - name: create dummy pkg.json + run: echo "{}" > package.json + - name: publish to chromatic + id: publish-chromatic + uses: chromaui/action@fdbe7756d4dbf493e2fbb822df73be7accd07e1c # @v11 + with: + projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + token: ${{ secrets.COMMIT_STATUS }} + onlyChanged: true + exitOnceUploaded: true + storybookBuildDir: storybook-static + + comment-chromatic-end: + uses: "./.github/workflows/comment-queue.yml" + needs: [deploy, changes] + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: | + storybook~success~${{ needs.deploy.outputs.storybook_url }} + + comment-chromatic-fail: + uses: "./.github/workflows/comment-queue.yml" + needs: [deploy, changes] + if: always() && needs.deploy.result == 'failure' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: | + storybook~failure~https://github.com/gradio-app/gradio/actions/runs/${{github.run_id}}/ diff --git a/gradio/.github/workflows/test-functional-lite.yml b/gradio/.github/workflows/test-functional-lite.yml new file mode 100644 index 0000000000000000000000000000000000000000..e996a0660825d25c74d988268326005b52a9da56 --- /dev/null +++ b/gradio/.github/workflows/test-functional-lite.yml @@ -0,0 +1,60 @@ +name: "functional-lite" + +on: + pull_request: + push: + branches: + - main + - 5.0-dev + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + permissions: + contents: read + pull-requests: read + name: "changes" + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.changes.outputs.should_run }} + sha: ${{ steps.changes.outputs.sha }} + pr_number: ${{ steps.changes.outputs.pr_number }} + source_branch: ${{ steps.changes.outputs.source_branch }} + source_repo: ${{ steps.changes.outputs.source_repo }} + steps: + - uses: actions/checkout@v4 + - uses: "gradio-app/gradio/.github/actions/changes@main" + id: changes + with: + filter: "functional" + token: ${{ secrets.GITHUB_TOKEN }} + test: + permissions: + contents: read + name: "functional-test-lite" + runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.should_run == 'true' + steps: + - uses: actions/checkout@v4 + - name: install dependencies + id: install_deps + uses: "gradio-app/gradio/.github/actions/install-all-deps@main" + with: + build_lite: true + skip_build: true + - run: pnpm exec playwright install chromium firefox + - name: Run Lite E2E tests + run: | + . venv/bin/activate + pnpm --filter @gradio/lite test:browser + - name: Get the performance result + run: | + export LITE_APP_LOAD_TIME=$(jq -r '.app_load_time' .lite-perf.json) + echo "LITE_APP_LOAD_TIME=$LITE_APP_LOAD_TIME" >> $GITHUB_ENV + cat .lite-perf.json # For debugging diff --git a/gradio/.github/workflows/test-functional.yml b/gradio/.github/workflows/test-functional.yml new file mode 100644 index 0000000000000000000000000000000000000000..f8a0cea5c103317297f8b2036dc25e0bfaecc994 --- /dev/null +++ b/gradio/.github/workflows/test-functional.yml @@ -0,0 +1,79 @@ +name: "functional" + +on: + pull_request: + push: + branches: + - main + - 5.0-dev + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + permissions: + contents: read + pull-requests: read + name: "changes" + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.changes.outputs.should_run }} + sha: ${{ steps.changes.outputs.sha }} + pr_number: ${{ steps.changes.outputs.pr_number }} + source_branch: ${{ steps.changes.outputs.source_branch }} + source_repo: ${{ steps.changes.outputs.source_repo }} + steps: + - uses: actions/checkout@v4 + - uses: "gradio-app/gradio/.github/actions/changes@main" + id: changes + with: + filter: "functional" + token: ${{ secrets.GITHUB_TOKEN }} + test: + permissions: + contents: read + name: "functional-test" + runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.should_run == 'true' + steps: + - uses: actions/checkout@v4 + - name: install dependencies + id: install_deps + uses: "gradio-app/gradio/.github/actions/install-all-deps@main" + - name: install outbreak_forecast dependencies + run: | + . venv/bin/activate + python -m pip install -r demo/outbreak_forecast/requirements.txt + python -m pip install -r demo/gradio_pdf_demo/requirements.txt + - run: pnpm exec playwright install chromium firefox + - name: run browser tests + run: | + . venv/bin/activate + CI=1 pnpm test:browser + - name: upload screenshots + uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-screenshots + path: | + ./test-results + - name: run browser component tests + run: | + . venv/bin/activate + pnpm run test:ct + - name: run reload mode test + run: | + . venv/bin/activate + pnpm test:browser:reload + - name: upload reload mode screenshots + uses: actions/upload-artifact@v4 + if: always() + with: + name: reload-mode-playwright-screenshots + path: | + ./test-results diff --git a/gradio/.github/workflows/test-hygiene.yml b/gradio/.github/workflows/test-hygiene.yml new file mode 100644 index 0000000000000000000000000000000000000000..1ef1b9b4d21c719e0838241d4625a3a1bde96262 --- /dev/null +++ b/gradio/.github/workflows/test-hygiene.yml @@ -0,0 +1,34 @@ +name: "hygiene" + +on: + pull_request: + push: + branches: + - main + - 5.0-dev + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +permissions: {} + +jobs: + test: + permissions: + contents: read + name: "hygiene-test" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Generate Notebooks + run: | + pip install nbformat && python scripts/generate_notebooks.py + - name: Print Git Status + run: echo $(git status) && echo $(git diff) + - name: Assert Notebooks Match + run: git status | grep "nothing to commit, working tree clean" + - name: Check for large files + uses: actionsdesk/lfs-warning@4b98a8a5e6c429c23c34eee02d71553bca216425 # @v3.3 + with: + filesizelimit: 5MB diff --git a/gradio/.github/workflows/test-python.yml b/gradio/.github/workflows/test-python.yml new file mode 100644 index 0000000000000000000000000000000000000000..c004a9f9b61f7215ea03c969a5112263e3fa119b --- /dev/null +++ b/gradio/.github/workflows/test-python.yml @@ -0,0 +1,78 @@ +name: "python" + +on: + pull_request: + types: [opened, synchronize, reopened, edited, labeled, unlabeled] + push: + branches: + - main + - 5.0-dev + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +env: + NODE_OPTIONS: "--max-old-space-size=4096" + HF_TOKEN: ${{ vars.HF_TOKEN }} + +permissions: {} + +jobs: + changes: + permissions: + contents: read + pull-requests: read + name: "changes" + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.changes.outputs.should_run }} + sha: ${{ steps.changes.outputs.sha }} + pr_number: ${{ steps.changes.outputs.pr_number }} + source_branch: ${{ steps.changes.outputs.source_branch }} + source_repo: ${{ steps.changes.outputs.source_repo }} + steps: + - uses: actions/checkout@v4 + - uses: "gradio-app/gradio/.github/actions/changes@main" + id: changes + with: + filter: "gradio" + token: ${{ secrets.GITHUB_TOKEN }} + test: + permissions: + contents: read + name: "test-${{ matrix.os }}-${{ matrix.test-type == 'flaky' && 'flaky' || 'not-flaky'}}" + needs: changes + if: needs.changes.outputs.should_run == 'true' + strategy: + matrix: + os: ["ubuntu-latest", "windows-latest"] + test-type: ["not flaky", "flaky"] + exclude: + - os: ${{ github.event_name == 'pull_request' && contains( github.event.pull_request.labels.*.name, 'windows-tests') && 'dummy' || 'windows-latest' }} + - test-type: ${{ github.event_name == 'pull_request' && contains( github.event.pull_request.labels.*.name, 'flaky-tests') && 'dummy' || 'flaky' }} + runs-on: ${{ matrix.os }} + continue-on-error: true + steps: + - uses: actions/checkout@v4 + - name: install dependencies + id: install_deps + uses: "gradio-app/gradio/.github/actions/install-all-deps@main" + with: + python_version: "3.8" + os: ${{ matrix.os }} + test: true + - name: Lint + if: runner.os == 'Linux' + run: | + . venv/bin/activate + ./scripts/lint_backend.sh + - name: Typecheck + if: runner.os == 'Linux' + run: | + . venv/bin/activate + ./scripts/type_check_backend.sh + - name: Run tests + run: | + . ${{steps.install_deps.outputs.venv_activate}} + python -m pytest -m "${{ matrix.test-type }}" diff --git a/gradio/.github/workflows/tests-js.yml b/gradio/.github/workflows/tests-js.yml new file mode 100644 index 0000000000000000000000000000000000000000..dfc0be10d571ab67407589d5dcf8ed033a07c6f4 --- /dev/null +++ b/gradio/.github/workflows/tests-js.yml @@ -0,0 +1,65 @@ +name: "js" + +on: + pull_request: + push: + branches: + - main + - 5.0-dev + +env: + CI: true + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" + NODE_OPTIONS: "--max-old-space-size=4096" + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + permissions: + contents: read + pull-requests: read + name: "changes" + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.changes.outputs.should_run }} + sha: ${{ steps.changes.outputs.sha }} + pr_number: ${{ steps.changes.outputs.pr_number }} + source_branch: ${{ steps.changes.outputs.source_branch }} + source_repo: ${{ steps.changes.outputs.source_repo }} + steps: + - uses: actions/checkout@v4 + - uses: "gradio-app/gradio/.github/actions/changes@main" + id: changes + with: + filter: "js" + token: ${{ secrets.GITHUB_TOKEN }} + test: + permissions: + contents: read + name: js-test + runs-on: ubuntu-22.04 + needs: changes + if: needs.changes.outputs.should_run == 'true' + steps: + - uses: actions/checkout@v4 + - name: install dependencies + uses: "gradio-app/gradio/.github/actions/install-frontend-deps@main" + - name: build client + run: pnpm --filter @gradio/client build + - name: build the wasm module + run: pnpm --filter @gradio/wasm build + - name: format check + run: pnpm format:check + - name: lint + run: pnpm lint + - name: typecheck + run: pnpm ts:check + - name: unit tests + run: pnpm test:run + - name: client tests + run: pnpm --filter @gradio/client test diff --git a/gradio/.github/workflows/trigger-changeset.yml b/gradio/.github/workflows/trigger-changeset.yml new file mode 100644 index 0000000000000000000000000000000000000000..afe4aec1edae9df45fd9604f723b66420307bd6d --- /dev/null +++ b/gradio/.github/workflows/trigger-changeset.yml @@ -0,0 +1,18 @@ +name: trigger-changeset +on: + pull_request: + types: [opened, synchronize, reopened, edited, labeled, unlabeled] + branches: + - main + - 5.0-dev + issue_comment: + types: [edited] + +permissions: {} + +jobs: + changeset: + runs-on: ubuntu-22.04 + if: github.event.sender.login != 'gradio-pr-bot' + steps: + - run: echo "Requesting changeset" diff --git a/gradio/.github/workflows/update-checks.yml b/gradio/.github/workflows/update-checks.yml new file mode 100644 index 0000000000000000000000000000000000000000..e3c54738346985cfefa250b92374a4f4e612d681 --- /dev/null +++ b/gradio/.github/workflows/update-checks.yml @@ -0,0 +1,68 @@ +name: "update-checks" + +on: + workflow_run: + workflows: ["python", "js", "functional", "functional-lite"] + types: + - completed + +concurrency: + group: "${{ github.event.workflow_run.id}}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + name: "changes" + runs-on: ubuntu-latest + permissions: + actions: read + outputs: + should_run: ${{ steps.json.outputs.should_run }} + sha: ${{ steps.json.outputs.sha }} + pr_number: ${{ steps.json.outputs.pr_number }} + source_branch: ${{ steps.json.outputs.source_branch }} + source_repo: ${{ steps.json.outputs.source_repo }} + labels: ${{ steps.json.outputs.labels }} + run_id: ${{ steps.json.outputs.run_id }} + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: changes + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + - uses: gradio-app/github/actions/json-to-output@main + id: json + with: + path: output.json + update-status: + permissions: + actions: read + statuses: write + contents: read + environment: commit_status + runs-on: ubuntu-latest + needs: changes + if: ${{ needs.changes.outputs.should_run == 'false'}} + steps: + - name: set js check name + if: github.event.workflow_run.name == 'js' + run: echo "CHECK_NAME=js / js-test (pull_request)" >> $GITHUB_ENV + - name: set python check name + if: github.event.workflow_run.name == 'python' + run: echo "CHECK_NAME=test-ubuntu-latest-not-flaky" >> $GITHUB_ENV + - name: set functional check name + if: github.event.workflow_run.name == 'functional' + run: echo "CHECK_NAME=functional / functional-test (pull_request)" >> $GITHUB_ENV + - name: set functional-lite check name + if: github.event.workflow_run.name == 'functional-lite' + run: echo "CHECK_NAME=functional-lite / functional-test-lite (pull_request)" >> $GITHUB_ENV + - name: update status + uses: gradio-app/github/actions/set-commit-status@main + with: + sha: ${{ needs.changes.outputs.sha }} + token: ${{ secrets.GITHUB_TOKEN }} + name: ${{ env.CHECK_NAME }} + run_id: ${{ needs.changes.outputs.run_id }} diff --git a/gradio/.github/workflows/website-build.yml b/gradio/.github/workflows/website-build.yml new file mode 100644 index 0000000000000000000000000000000000000000..7f56ed4938e8f0fb184d5b14c7b68ca0ade31f44 --- /dev/null +++ b/gradio/.github/workflows/website-build.yml @@ -0,0 +1,73 @@ +name: "website-build" + +on: + workflow_run: + workflows: ["docs-deploy"] + types: + - completed + +env: + CI: true + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" + NODE_OPTIONS: "--max-old-space-size=4096" + +jobs: + changes: + if: github.event.workflow_run.conclusion == 'success' + name: "changes" + runs-on: ubuntu-latest + permissions: + actions: read + outputs: + should_run: ${{ steps.json.outputs.should_run }} + sha: ${{ steps.json.outputs.sha }} + pr_number: ${{ steps.json.outputs.pr_number }} + source_branch: ${{ steps.json.outputs.source_branch }} + source_repo: ${{ steps.json.outputs.source_repo }} + labels: ${{ steps.json.outputs.labels }} + run_id: ${{ steps.json.outputs.run_id }} + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: changes + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + - uses: gradio-app/github/actions/json-to-output@main + id: json + with: + path: output.json + - uses: actions/upload-artifact@v4 + with: + path: output.json + name: changes + build: + name: "website-build" + runs-on: ubuntu-22.04 + needs: changes + if: needs.changes.outputs.should_run == 'true' || (endsWith(needs.changes.outputs.source_branch, 'main') && github.repository == 'gradio-app/gradio') + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ needs.changes.outputs.source_branch }} + repository: ${{ needs.changes.outputs.source_repo }} + - name: install dependencies + uses: "gradio-app/gradio/.github/actions/install-all-deps@main" + with: + skip_build: true + python_version: "3.10" + - name: build client + run: pnpm --filter @gradio/client build + + - name: build website + run: VERCEL=1 pnpm --filter website build + + - name: find + run: find . -type d + + - name: upload website artifacts + uses: actions/upload-artifact@v4 + with: + name: website + path: js/_website/.vercel + include-hidden-files: true diff --git a/gradio/.github/workflows/website-deploy.yml b/gradio/.github/workflows/website-deploy.yml new file mode 100644 index 0000000000000000000000000000000000000000..588358da297cf839aaae9a50ad6727105bd13bf1 --- /dev/null +++ b/gradio/.github/workflows/website-deploy.yml @@ -0,0 +1,127 @@ +name: "website-deploy" + +on: + workflow_run: + workflows: ["website-build"] + types: + - completed + +permissions: {} + +jobs: + changes: + if: github.event.workflow_run.conclusion == 'success' + name: "changes" + runs-on: ubuntu-latest + permissions: + actions: read + outputs: + should_run: ${{ steps.json.outputs.should_run }} + sha: ${{ steps.json.outputs.sha }} + pr_number: ${{ steps.json.outputs.pr_number }} + source_branch: ${{ steps.json.outputs.source_branch }} + source_repo: ${{ steps.json.outputs.source_repo }} + labels: ${{ steps.json.outputs.labels }} + run_id: ${{ steps.json.outputs.run_id }} + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: changes + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + - uses: gradio-app/github/actions/json-to-output@main + id: json + with: + path: output.json + comment-deploy-start: + needs: changes + uses: "./.github/workflows/comment-queue.yml" + if: needs.changes.outputs.should_run == 'true' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: website~pending~null + deploy: + environment: deploy_website + name: "website-deploy" + runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.should_run == 'true' || (endsWith(needs.changes.outputs.source_branch, 'main') && github.repository == 'gradio-app/gradio') + permissions: + actions: read + outputs: + vercel_url: ${{ steps.output_url.outputs.vercel_url }} + env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + steps: + - name: download website artifacts + uses: actions/download-artifact@v4 + with: + name: website + path: js/_website/.vercel + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + - name: list files + run: ls -R . + + - name: Pull Vercel Environment Information + shell: bash + if: needs.changes.outputs.pr_number != 'false' + run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_DEPLOY_TOKEN }} --cwd js/_website + + - name: Deploy Project Artifacts to Vercel + if: needs.changes.outputs.pr_number != 'false' + id: output_url + shell: bash + run: echo "vercel_url=$(vercel deploy --prebuilt --token=${{ secrets.VERCEL_DEPLOY_TOKEN }} --cwd js/_website)" >> $GITHUB_OUTPUT + + - name: Deploy Preview Website to Cloudflare Pages + if: needs.changes.outputs.pr_number != 'false' + id: cloudflare-preview + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy js/_website/.vercel/output/static --project-name=gradio-website --branch=${{ needs.changes.outputs.pr_number }} + + # production + - name: Pull Vercel Environment Information + if: needs.changes.outputs.source_repo == 'gradio-app/gradio' && needs.changes.outputs.source_branch == 'refs/heads/main' + shell: bash + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_DEPLOY_TOKEN }} --cwd js/_website + + - name: Deploy Project Artifacts to Vercel + if: needs.changes.outputs.source_repo == 'gradio-app/gradio' && needs.changes.outputs.source_branch == 'refs/heads/main' + shell: bash + run: echo "VERCEL_URL=$(vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_DEPLOY_TOKEN }} --cwd js/_website)" >> $GITHUB_ENV + + - name: Deploy Production Website to Cloudflare Pages + if: needs.changes.outputs.source_repo == 'gradio-app/gradio' && needs.changes.outputs.source_branch == 'refs/heads/main' + id: cloudflare-production + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy js/_website/.vercel/output/static --project-name=gradio-website --branch=main + + comment-deploy-success: + uses: "./.github/workflows/comment-queue.yml" + needs: [deploy, changes] + if: needs.deploy.result == 'success' && needs.changes.outputs.pr_number != 'false' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: website~success~${{needs.deploy.outputs.vercel_url}} + comment-deploy-failure: + uses: "./.github/workflows/comment-queue.yml" + needs: [deploy, changes] + if: always() && needs.deploy.result == 'failure' && needs.changes.outputs.pr_number != 'false' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: website~failure~https://github.com/gradio-app/gradio/actions/runs/${{github.run_id}}/ diff --git a/gradio/.github/workflows/website-docs-build.yml b/gradio/.github/workflows/website-docs-build.yml new file mode 100644 index 0000000000000000000000000000000000000000..d43537ef453ae433ec0f559e9e30afdd25493742 --- /dev/null +++ b/gradio/.github/workflows/website-docs-build.yml @@ -0,0 +1,67 @@ +name: "docs-build" + +on: + pull_request: + push: + branches: + - main + - 5.0-dev + +env: + CI: true + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" + NODE_OPTIONS: "--max-old-space-size=4096" + +concurrency: + group: "${{ github.event.pull_request.number }}-${{ github.ref_name }}-${{ github.workflow }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + if: github.event_name == 'pull_request' || github.event_name == 'push' + permissions: + contents: read + pull-requests: read + name: "changes" + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.changes.outputs.should_run }} + sha: ${{ steps.changes.outputs.sha }} + gradio_version: ${{ steps.changes.outputs.gradio_version }} + source_branch: ${{ steps.changes.outputs.source_branch }} + steps: + - uses: actions/checkout@v4 + - uses: "gradio-app/gradio/.github/actions/changes@main" + id: changes + with: + filter: "website" + token: ${{ secrets.GITHUB_TOKEN }} + + build: + permissions: + contents: read + name: "docs-build" + runs-on: ubuntu-22.04 + needs: changes + if: needs.changes.outputs.should_run == 'true' || (endsWith(needs.changes.outputs.source_branch, 'main') && github.repository == 'gradio-app/gradio') + steps: + - uses: actions/checkout@v4 + - name: install dependencies + uses: "gradio-app/gradio/.github/actions/install-all-deps@main" + with: + skip_build: true + python_version: "3.10" + + # generated when installing deps + - name: upload website json artifacts + uses: actions/upload-artifact@v4 + with: + name: website-json + path: js/_website/src/lib/json + - name: upload website json templates + uses: actions/upload-artifact@v4 + with: + name: website-templates + path: js/_website/src/lib/templates diff --git a/gradio/.github/workflows/website-docs-deploy.yml b/gradio/.github/workflows/website-docs-deploy.yml new file mode 100644 index 0000000000000000000000000000000000000000..614bece533aeb810a754f1e4003e52121d5291d6 --- /dev/null +++ b/gradio/.github/workflows/website-docs-deploy.yml @@ -0,0 +1,93 @@ +name: "docs-deploy" + +on: + workflow_run: + workflows: ["docs-build"] + types: + - completed + +concurrency: + group: "${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}-${{ github.workflow_ref }}" + cancel-in-progress: true + +permissions: {} + +jobs: + changes: + if: github.event.workflow_run.conclusion == 'success' + name: "changes" + runs-on: ubuntu-latest + permissions: + actions: read + outputs: + should_run: ${{ steps.json.outputs.should_run }} + sha: ${{ steps.json.outputs.sha }} + pr_number: ${{ steps.json.outputs.pr_number }} + source_branch: ${{ steps.json.outputs.source_branch }} + source_repo: ${{ steps.json.outputs.source_repo }} + labels: ${{ steps.json.outputs.labels }} + run_id: ${{ steps.json.outputs.run_id }} + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: changes + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + - uses: gradio-app/github/actions/json-to-output@main + id: json + with: + path: output.json + - uses: actions/upload-artifact@v4 + with: + path: output.json + name: changes + comment-deploy-start: + needs: changes + uses: "./.github/workflows/comment-queue.yml" + if: needs.changes.outputs.should_run == 'true' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: website~pending~null + deploy: + environment: deploy_website + name: "docs-deploy" + runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.should_run == 'true' || github.event.workflow_run.event == 'push' + permissions: + actions: read + steps: + - uses: actions/download-artifact@v4 + with: + name: website-json + path: js/_website/lib/json + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/download-artifact@v4 + with: + name: website-templates + path: js/_website/lib/templates + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: deploy json to aws + if: startsWith(needs.changes.outputs.source_branch, 'changeset-release/') && needs.changes.outputs.source_repo == 'gradio-app/gradio' + run: | + export AWS_ACCESS_KEY_ID=${{ secrets.DOCS_JSON_AWS_S3_ACCESS_KEY }} + export AWS_SECRET_ACCESS_KEY=${{ secrets.DOCS_JSON_AWS_S3_SECRET_ACCESS_KEY }} + export AWS_DEFAULT_REGION=us-west-2 + version=$(jq -r .version js/_website/lib/json/version.json) + aws s3 cp ./js/_website/lib/json/ s3://gradio-docs-json/$version/ --recursive + aws s3 cp ./js/_website/lib/templates/ s3://gradio-docs-json/$version/templates/ --recursive + comment-deploy-failure: + uses: "./.github/workflows/comment-queue.yml" + needs: [deploy, changes] + if: always() && needs.deploy.result == 'failure' && needs.changes.outputs.pr_number != 'false' + secrets: + gh_token: ${{ secrets.COMMENT_TOKEN }} + with: + pr_number: ${{ needs.changes.outputs.pr_number }} + message: website~failure~https://github.com/gradio-app/gradio/actions/runs/${{github.run_id}}/ diff --git a/gradio/.gitignore b/gradio/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..3d0813a75795ed2255fbefa7a4db3dd2e5725839 --- /dev/null +++ b/gradio/.gitignore @@ -0,0 +1,96 @@ +# Python build +.eggs/ +gradio.egg-info +dist/ +dist-lite/ +*.pyc +__pycache__/ +*.py[cod] +*$py.class +build/ +!js/build/ +!js/build/dist/ +__tmp/* +*.pyi +!gradio/stubs/**/*.pyi +py.typed +.ipynb_checkpoints/ +.python-version +=23.2 + +# JS build +gradio/templates/* +gradio/node/* +gradio/_frontend_code/* +js/gradio-preview/test/* + +# Secrets +.env + +# Gradio run artifacts +*.db +*.sqlite3 +gradio/launches.json +flagged/ +gradio_cached_examples/ +tmp.zip +gradio/hash_seed.txt + +# Tests +.coverage +coverage.xml +test.txt +**/snapshots/**/*.png +playwright-report/ +.hypothesis +.lite-perf.json + +# Demos +demo/tmp.zip +demo/files/*.avi +demo/files/*.mp4 +demo/all_demos/demos/* +demo/all_demos/requirements.txt +demo/*/config.json +demo/annotatedimage_component/*.png +demo/fake_diffusion_with_gif/*.gif +demo/cancel_events/cancel_events_output_log.txt +demo/unload_event_test/output_log.txt + +# Etc +.idea/* +.DS_Store +*.bak +workspace.code-workspace +*.h5 + +# dev containers +.pnpm-store/ + +# log files +.pnpm-debug.log + +# Local virtualenv for devs +.venv* + +# FRP +gradio/frpc_* +.vercel + +# js +node_modules +public/build/ +test-results +client/js/dist/* +client/js/test.js +.config/test.py +.svelte-kit + + +# storybook +storybook-static +build-storybook.log +js/storybook/theme.css + +# playwright +.config/playwright/.cache \ No newline at end of file diff --git a/gradio/.vscode/extensions.json b/gradio/.vscode/extensions.json new file mode 100644 index 0000000000000000000000000000000000000000..0466253f92eb68dbf532cd0ded5276f0ed516dd5 --- /dev/null +++ b/gradio/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "phoenisx.cssvar", + "esbenp.prettier-vscode", + "svelte.svelte-vscode", + "charliermarsh.ruff" + ] +} diff --git a/gradio/.vscode/settings.json b/gradio/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..0d3a8516ae88393cea99adea49dc4c8495678e3d --- /dev/null +++ b/gradio/.vscode/settings.json @@ -0,0 +1,26 @@ +{ + "python.formatting.provider": "none", + "cssvar.files": ["./js/node_modules/pollen-css/pollen.css"], + "cssvar.ignore": [], + "cssvar.disableSort": true, + "cssvar.extensions": ["js", "css", "html", "jsx", "tsx", "svelte"], + "python.analysis.extraPaths": ["./gradio/themes/utils"], + "svelte.plugin.svelte.format.enable": true, + "svelte.plugin.svelte.diagnostics.enable": false, + "svelte.enable-ts-plugin": true, + "prettier.configPath": ".config/.prettierrc.json", + "prettier.ignorePath": ".config/.prettierignore", + "python.analysis.typeCheckingMode": "basic", + "python.testing.pytestArgs": ["."], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "eslint.validate": ["javascript", "typescript", "html", "markdown", "svelte"], + "eslint.experimental.useFlatConfig": true, + "eslint.options": { + "overrideConfigFile": "./.config/eslint.config.js" + }, + "typescript.tsdk": "node_modules/typescript/lib", + "i18n-ally.localesPaths": [ + "js/spa/src/lang" + ] +} diff --git a/gradio/CHANGELOG.md b/gradio/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..0f10f128d683118887105ab0234946fbccb600ff --- /dev/null +++ b/gradio/CHANGELOG.md @@ -0,0 +1,5928 @@ +# gradio + +## 4.44.0 + +### Features + +- [#9302](https://github.com/gradio-app/gradio/pull/9302) [`ac2c015`](https://github.com/gradio-app/gradio/commit/ac2c015bd8385c3f5e346b9cfce415f1e5f54c69) - Fileformat whitelist. Thanks @aliabid94! +- [#9276](https://github.com/gradio-app/gradio/pull/9276) [`8362a10`](https://github.com/gradio-app/gradio/commit/8362a10a7e8a3c291fa0300a6f4a23a1ca997b8a) - Fix scrollbars everywhere. Thanks @aliabid94! + +### Fixes + +- [#9188](https://github.com/gradio-app/gradio/pull/9188) [`8f8e1c6`](https://github.com/gradio-app/gradio/commit/8f8e1c6a0b09b0d1985b8377d94d693cb00f8a18) - Fix multiple trigger bug when function has js. Thanks @freddyaboulton! +- [#9279](https://github.com/gradio-app/gradio/pull/9279) [`fb5845c`](https://github.com/gradio-app/gradio/commit/fb5845c3539e006235a2a52811a863ef2fefd66f) - Separate starlette.Request from PredictBody. Only set in new PredictBodyInternal object. Thanks @freddyaboulton! +- [#9267](https://github.com/gradio-app/gradio/pull/9267) [`ecf9137`](https://github.com/gradio-app/gradio/commit/ecf9137762130ab2e9f8e747feda091392b25e7a) - Add root_url to components created by gr.render. Thanks @freddyaboulton! + +## 4.43.0 + +### Features + +- [#9160](https://github.com/gradio-app/gradio/pull/9160) [`8f5a895`](https://github.com/gradio-app/gradio/commit/8f5a8950c949996f7c439b11a7aa40edda3e8562) - Fix native plot lite demos. Thanks @aliabd! +- [#9185](https://github.com/gradio-app/gradio/pull/9185) [`2daf3d1`](https://github.com/gradio-app/gradio/commit/2daf3d10f5986675f6ceb75ebb50c9d991c282bf) - Adding `maxlength` attribute handling of `textarea` and `input` HTML element for the `gr.TextBox()` component via a `max_length` parameter. Thanks @WH-Yoshi! +- [#9187](https://github.com/gradio-app/gradio/pull/9187) [`5bf00b7`](https://github.com/gradio-app/gradio/commit/5bf00b7524ebf399b48719120a49d15bb21bd65c) - make all component SSR compatible. Thanks @pngwn! +- [#9225](https://github.com/gradio-app/gradio/pull/9225) [`5f2e047`](https://github.com/gradio-app/gradio/commit/5f2e047c2ce114cebc95d5dba16c4df10fa73eb1) - Add a 'None' option to the gradio.Image component to disable image_m…. Thanks @GeeMoose! + +### Fixes + +- [#9242](https://github.com/gradio-app/gradio/pull/9242) [`d0e93d7`](https://github.com/gradio-app/gradio/commit/d0e93d70e87ea64f144e8eda7d5d49c27b6158e5) - Fix for create_or_modify_pyi read_text Windows Issue in component_meta.py. Thanks @SmirkingKitsune! +- [#9189](https://github.com/gradio-app/gradio/pull/9189) [`ab142ee`](https://github.com/gradio-app/gradio/commit/ab142ee13d19070b75b5eb03efcda7193b8993c2) - Fix serialization error in curl api. Thanks @freddyaboulton! +- [#9277](https://github.com/gradio-app/gradio/pull/9277) [`d9c4c86`](https://github.com/gradio-app/gradio/commit/d9c4c8606acf9ab36390e35ab10e43bb3191ced5) - Pin `fastapi<0.113.0` in `requirements.txt`. Thanks @abidlabs! + +## 4.42.0 + +### Features + +- [#9128](https://github.com/gradio-app/gradio/pull/9128) [`747013b`](https://github.com/gradio-app/gradio/commit/747013bbacebae6bfdda554b45e541e80b2894e0) - Allow accessing the entire row of selected values in `gr.DataFrame`. Thanks @abidlabs! +- [#8935](https://github.com/gradio-app/gradio/pull/8935) [`f6b2b97`](https://github.com/gradio-app/gradio/commit/f6b2b97d473dd81571410cccc6e1ddfcf9fa00bc) - Initialize the client with the fake host for Lite server. Thanks @whitphx! +- [#9031](https://github.com/gradio-app/gradio/pull/9031) [`04b7d32`](https://github.com/gradio-app/gradio/commit/04b7d327ec1227a693fc2dfea51b1e2729851bde) - Allow drag and replace image in `gr.Image` and Multimodal textbox. Thanks @hannahblair! +- [#8930](https://github.com/gradio-app/gradio/pull/8930) [`41d5ab9`](https://github.com/gradio-app/gradio/commit/41d5ab987ba9728753be4509490c79041655809b) - Add `placeholder` param to Image and ImageEditor to replace upload image text. Thanks @hannahblair! +- [#9023](https://github.com/gradio-app/gradio/pull/9023) [`87e3537`](https://github.com/gradio-app/gradio/commit/87e3537342017c7f19d012f0806a14bc264e09f9) - Add height param to gr.JSON. Thanks @hannahblair! +- [#9013](https://github.com/gradio-app/gradio/pull/9013) [`5350f1f`](https://github.com/gradio-app/gradio/commit/5350f1feb20cb7458d188403f319c5087052f695) - Add copy all messages button to chatbot. Thanks @hannahblair! +- [#9118](https://github.com/gradio-app/gradio/pull/9118) [`e1c404d`](https://github.com/gradio-app/gradio/commit/e1c404da1143fb52b659d03e028bdba1badf443d) - setup npm-previews of all packages. Thanks @pngwn! +- [#9102](https://github.com/gradio-app/gradio/pull/9102) [`efdc323`](https://github.com/gradio-app/gradio/commit/efdc3231a7bde38cfe45d10086d0d36a24c1b9b4) - Initial SSR refactor. Thanks @pngwn! + +### Fixes + +- [#9078](https://github.com/gradio-app/gradio/pull/9078) [`1a9d729`](https://github.com/gradio-app/gradio/commit/1a9d7297c17a3bc0493be34e8e762350ab7f0844) - Catch OSErrors in `HuggingFaceDatasetSaver._deserialize_components`. Thanks @davidberenstein1957! +- [#9088](https://github.com/gradio-app/gradio/pull/9088) [`96f8ffa`](https://github.com/gradio-app/gradio/commit/96f8ffa5eea511290f203c5d13484731e7d82387) - Set non-zero exit codes for custom component build and install commands when failures occur. Thanks @freddyaboulton! +- [#9161](https://github.com/gradio-app/gradio/pull/9161) [`173c7b8`](https://github.com/gradio-app/gradio/commit/173c7b8624371d89c40eb667bc28b9955c61b063) - Chatbot Image size and list fixes. Thanks @dawoodkhan82! +- [#9151](https://github.com/gradio-app/gradio/pull/9151) [`f1ef94a`](https://github.com/gradio-app/gradio/commit/f1ef94a435439934610497eab34201a586e418e1) - Open media type files in browser. Thanks @aliabid94! +- [#9148](https://github.com/gradio-app/gradio/pull/9148) [`8715f10`](https://github.com/gradio-app/gradio/commit/8715f103399c709717084335cfe5e971ebf9f2de) - Allow `gr.Request` to work with ZeroGPU. Thanks @abidlabs! +- [#9093](https://github.com/gradio-app/gradio/pull/9093) [`60650d8`](https://github.com/gradio-app/gradio/commit/60650d84b2cfe93fd2ebf2d2997d6c0f382d5f1a) - Reset `Dataset` page to 0 when samples change. Thanks @abidlabs! +- [#9116](https://github.com/gradio-app/gradio/pull/9116) [`ba6322e`](https://github.com/gradio-app/gradio/commit/ba6322ec2bb975f15389fe0700816bf671c6819d) - Fix image height content fit. Thanks @hannahblair! +- [#9079](https://github.com/gradio-app/gradio/pull/9079) [`d6dc384`](https://github.com/gradio-app/gradio/commit/d6dc3846fd94fe03658f0fa8219d68ddf1f7aa64) - Add more typing to event listeners. Thanks @JackismyShephard! +- [#9119](https://github.com/gradio-app/gradio/pull/9119) [`30b5d6f`](https://github.com/gradio-app/gradio/commit/30b5d6f2b75e1ff0ea03c7a6567e43a022871c9f) - Fix chatinterface multimodal bug. Thanks @freddyaboulton! +- [#8987](https://github.com/gradio-app/gradio/pull/8987) [`7b288cf`](https://github.com/gradio-app/gradio/commit/7b288cf6772ec3dc1fa603db859975e5dab90127) - Fix unexpected rendering of Dataset. Thanks @Col0ring! +- [#9089](https://github.com/gradio-app/gradio/pull/9089) [`508ac84`](https://github.com/gradio-app/gradio/commit/508ac84bc2ffbeff6daae8ae0956e14e7472c4c0) - Set orig_name in downloadbutton postprocess. Thanks @freddyaboulton! +- [#8951](https://github.com/gradio-app/gradio/pull/8951) [`6e7d9e5`](https://github.com/gradio-app/gradio/commit/6e7d9e5b848e5af8cae97a4a4f021859c423ffa4) - Deal with OAuth too many redirects. Thanks @Wauplin! + +## 4.41.0 + +### Features + +- [#8968](https://github.com/gradio-app/gradio/pull/8968) [`38b3682`](https://github.com/gradio-app/gradio/commit/38b3682c3a9b40fb4070f665d94711c43c6fe40e) - Improvements to FRP client download and usage. Thanks @abidlabs! +- [#8965](https://github.com/gradio-app/gradio/pull/8965) [`d30432e`](https://github.com/gradio-app/gradio/commit/d30432e9c6d4cc1e5cfd989a1a3ae4aba7e21290) - harden CI. Thanks @pngwn! +- [#8972](https://github.com/gradio-app/gradio/pull/8972) [`d4c503a`](https://github.com/gradio-app/gradio/commit/d4c503a471cfd202c56fbddd99d5da431a4b7478) - Type hint Correction. Thanks @sthemeow! +- [#8964](https://github.com/gradio-app/gradio/pull/8964) [`bf6bbd9`](https://github.com/gradio-app/gradio/commit/bf6bbd971acddbf78f03bea431ed7d1e0003ccf9) - Add min/max-imize button to gr.Image and gr.Gallery. Thanks @hannahblair! +- [#9059](https://github.com/gradio-app/gradio/pull/9059) [`981731a`](https://github.com/gradio-app/gradio/commit/981731acb7da3e78555abeb20f47f3a8a5f0d861) - Fix flaky tests and tests on Windows. Thanks @abidlabs! +- [#9021](https://github.com/gradio-app/gradio/pull/9021) [`360350c`](https://github.com/gradio-app/gradio/commit/360350cfc46b7dcc41d8a015b7eb6e7056cc7938) - Minor fixes. Thanks @aliabid94! +- [#9064](https://github.com/gradio-app/gradio/pull/9064) [`4ba7b23`](https://github.com/gradio-app/gradio/commit/4ba7b238e22ac042de14a6b69aa9d61536ddffba) - Improve plot guide, add double clicking to plots. Thanks @aliabid94! +- [#8975](https://github.com/gradio-app/gradio/pull/8975) [`3feea64`](https://github.com/gradio-app/gradio/commit/3feea64a65688d710184604bb44636d513bcc36a) - Prevent overflow in Model3D. Thanks @hannahblair! +- [#8967](https://github.com/gradio-app/gradio/pull/8967) [`2f89877`](https://github.com/gradio-app/gradio/commit/2f89877ac1ef9eab46115187ffe179d5da060edd) - Set `content_disposition_type` and `media_type` on downloaded files. Thanks @aliabid94! +- [#8958](https://github.com/gradio-app/gradio/pull/8958) [`4ff91a3`](https://github.com/gradio-app/gradio/commit/4ff91a3e6538872c529b604d36120dd946dc3282) - Fixes some docstrings, particularly for the `show_progress` parameter. Thanks @abidlabs! +- [#9020](https://github.com/gradio-app/gradio/pull/9020) [`08b5159`](https://github.com/gradio-app/gradio/commit/08b51590163b306fd874f543f6fcaf23ac7d2646) - Some tweaks to is_in_or_equal. Thanks @freddyaboulton! + +### Fixes + +- [#8962](https://github.com/gradio-app/gradio/pull/8962) [`c68eefb`](https://github.com/gradio-app/gradio/commit/c68eefba6c18ba9fda98220fb273726522dc3340) - fix: httpx timeouts cause gradio to fail during launch. Thanks @rsamborski! +- [#8847](https://github.com/gradio-app/gradio/pull/8847) [`4d8a473`](https://github.com/gradio-app/gradio/commit/4d8a473632e388a312aee5c705b3c1f79853441b) - Refactor Chatinterface to use Chatbot instead of gr.State variables. Thanks @freddyaboulton! +- [#9054](https://github.com/gradio-app/gradio/pull/9054) [`9fa635a`](https://github.com/gradio-app/gradio/commit/9fa635a8fd0050cc16539b9a3d11846ec71edf13) - Fix multimodal chatinterface api bug. Thanks @freddyaboulton! +- [#8847](https://github.com/gradio-app/gradio/pull/8847) [`4d8a473`](https://github.com/gradio-app/gradio/commit/4d8a473632e388a312aee5c705b3c1f79853441b) - fix: wrong named param check for js client. Thanks @freddyaboulton! +- [#9011](https://github.com/gradio-app/gradio/pull/9011) [`0978de8`](https://github.com/gradio-app/gradio/commit/0978de8104046250593806c927b416e4ffbbe293) - Passes `gr.Request` if type hint is `Request | None`. Thanks @abidlabs! +- [#9053](https://github.com/gradio-app/gradio/pull/9053) [`8b33393`](https://github.com/gradio-app/gradio/commit/8b33393586af695e4ccd07f55453df896785b089) - Fix `show_progress` in `gr.Interface`. Thanks @abidlabs! + +## 4.40.0 + +### Features + +- [#8954](https://github.com/gradio-app/gradio/pull/8954) [`5010e95`](https://github.com/gradio-app/gradio/commit/5010e9579e5fdd5c3861b144c427551c2e5ead0f) - Add `overflow: wrap` to JSON to catch overflow in xs device widths. Thanks @hannahblair! +- [#8932](https://github.com/gradio-app/gradio/pull/8932) [`600c97c`](https://github.com/gradio-app/gradio/commit/600c97c807b648bca11c2dd5dfa0a6a692756bd9) - Allow viewing JSON as list or dict with `show_indices` param. Thanks @hannahblair! +- [#8929](https://github.com/gradio-app/gradio/pull/8929) [`3539787`](https://github.com/gradio-app/gradio/commit/3539787ebb39b3d00c34707b49d5de40fdc3d69a) - Add line numbering and collapse/expand logic to gr.JSON. Thanks @hannahblair! +- [#8862](https://github.com/gradio-app/gradio/pull/8862) [`ac132e3`](https://github.com/gradio-app/gradio/commit/ac132e3cbc8dbc7bec3d607d52bef347e90feb41) - Support the use of custom authentication mechanism, timeouts, and other `httpx` parameters in Python Client. Thanks @valgai! +- [#8947](https://github.com/gradio-app/gradio/pull/8947) [`96d36d7`](https://github.com/gradio-app/gradio/commit/96d36d70ad3bee048027cfbf89533020a8aa6e63) - Restore plot label angles. Thanks @aliabid94! +- [#8948](https://github.com/gradio-app/gradio/pull/8948) [`f7fbd2c`](https://github.com/gradio-app/gradio/commit/f7fbd2c23795d97071296463779d41bd0e937164) - Bump websockets version max for gradio-client. Thanks @evanscho! +- [#8907](https://github.com/gradio-app/gradio/pull/8907) [`9b42ba8`](https://github.com/gradio-app/gradio/commit/9b42ba8f1006c05d60a62450d3036ce0d6784f86) - Update guides esp plots. Thanks @aliabid94! +- [#8888](https://github.com/gradio-app/gradio/pull/8888) [`70a0c56`](https://github.com/gradio-app/gradio/commit/70a0c5620043ae613af16008f4a683b0f238545d) - Added support for TokenClassificationPipeline. Thanks @cswamy! +- [#8950](https://github.com/gradio-app/gradio/pull/8950) [`7e997a8`](https://github.com/gradio-app/gradio/commit/7e997a85bb21cbe7eb27df5b3f31ad636435b0a1) - Fix running local app with fake OAuth. Thanks @Wauplin! +- [#8867](https://github.com/gradio-app/gradio/pull/8867) [`f8ccb5e`](https://github.com/gradio-app/gradio/commit/f8ccb5e663ed5df010f7a8e93d556bfc238d849d) - Make `update_root_in_config` atomic. Thanks @abidlabs! +- [#8900](https://github.com/gradio-app/gradio/pull/8900) [`de997e6`](https://github.com/gradio-app/gradio/commit/de997e67c9a7feb9e2eccebf92969366dbd67eba) - Adds ability to watermark videos via a `watermark` parameter in Video component. Thanks @meg-huggingface! + +### Fixes + +- [#8949](https://github.com/gradio-app/gradio/pull/8949) [`1e16f67`](https://github.com/gradio-app/gradio/commit/1e16f67ba2a02761d4b73afd723f8edc3c3124e9) - Fix check icon in gr.JSON and gr.Code. Thanks @hannahblair! +- [#8899](https://github.com/gradio-app/gradio/pull/8899) [`20444f9`](https://github.com/gradio-app/gradio/commit/20444f9b56f95240d00759f31a1b831b9eb53160) - Fix Chatbot Multimodal Examples. Thanks @dawoodkhan82! +- [#8933](https://github.com/gradio-app/gradio/pull/8933) [`5f9b8d0`](https://github.com/gradio-app/gradio/commit/5f9b8d093a17f4fcc689cbc83fd6db6c43b5174b) - Fix lazy caching. Thanks @abidlabs! +- [#8879](https://github.com/gradio-app/gradio/pull/8879) [`67c08bf`](https://github.com/gradio-app/gradio/commit/67c08bfb9e59d801081591b8a59232c32d4467cf) - Fix file uploading in iOS. Thanks @hannahblair! +- [#8905](https://github.com/gradio-app/gradio/pull/8905) [`4b14ea8`](https://github.com/gradio-app/gradio/commit/4b14ea860d5055410a3a2257974b61a5c8eaac9d) - Allow use of file extensions in gr.File in iOS. Thanks @hannahblair! +- [#8927](https://github.com/gradio-app/gradio/pull/8927) [`223688b`](https://github.com/gradio-app/gradio/commit/223688b70a7a3cf4daa92ae77f8fca7b537cc2b4) - Fix `Could not resolve "virtual:component-loader"` in gradio/utils package. Thanks @benzler! +- [#8934](https://github.com/gradio-app/gradio/pull/8934) [`8204425`](https://github.com/gradio-app/gradio/commit/8204425bfa2c08077948e59e7f5375b1b4d1e338) - Fix Json component serialization bug. Thanks @freddyaboulton! +- [#8931](https://github.com/gradio-app/gradio/pull/8931) [`4c2d37d`](https://github.com/gradio-app/gradio/commit/4c2d37db849848fd38ba733a23a5aaceeaf58faf) - Add background to gr.Code line numbers. Thanks @hannahblair! + +## 4.39.0 + +### Features + +- [#8832](https://github.com/gradio-app/gradio/pull/8832) [`e75f2ca`](https://github.com/gradio-app/gradio/commit/e75f2ca2da4f41f25459b98bedaa940c887e6a93) - Fix build for pre-release. Thanks @pngwn! +- [#8618](https://github.com/gradio-app/gradio/pull/8618) [`aa4b7a7`](https://github.com/gradio-app/gradio/commit/aa4b7a71921fd5b7ad7e3c0cce7687a8f6d284da) - Improve styling of parameter tables in the docs. Thanks @abidlabs! +- [#8745](https://github.com/gradio-app/gradio/pull/8745) [`4030f28`](https://github.com/gradio-app/gradio/commit/4030f28af6ae9f3eb94bb4e9cae83fb7016cdaad) - Allows updating the dataset of a `gr.Examples`. Thanks @abidlabs! +- [#8757](https://github.com/gradio-app/gradio/pull/8757) [`6073736`](https://github.com/gradio-app/gradio/commit/60737366517f48d1a37ffce15425783a2887f305) - Document `FileData` class in docs. Thanks @hannahblair! +- [#8846](https://github.com/gradio-app/gradio/pull/8846) [`76c1759`](https://github.com/gradio-app/gradio/commit/76c175935019833baef709a5cf401d2263ca72ee) - add space header. Thanks @pngwn! +- [#8804](https://github.com/gradio-app/gradio/pull/8804) [`1d09925`](https://github.com/gradio-app/gradio/commit/1d09925469a5f96e8d3a972a28841903fa1c7265) - Fix Lite's . Thanks @whitphx! +- [#8807](https://github.com/gradio-app/gradio/pull/8807) [`a238af4`](https://github.com/gradio-app/gradio/commit/a238af4d688c4e030e37c2ef01d5c80d6d940912) - Refactor plots to drop `altair` and use `vega.js` directly. Thanks @aliabid94! +- [#8806](https://github.com/gradio-app/gradio/pull/8806) [`a3d23b4`](https://github.com/gradio-app/gradio/commit/a3d23b43e71c22bc2b019ae96668605e744768d5) - Add `loop` parameters to `gr.Audio` and `gr.Video`. Thanks @abidlabs! +- [#8856](https://github.com/gradio-app/gradio/pull/8856) [`5622331`](https://github.com/gradio-app/gradio/commit/5622331da724eb2510c74f156a2fd140a932cc55) - Extend `pyright` to cover tests as well. Thanks @abidlabs! +- [#8851](https://github.com/gradio-app/gradio/pull/8851) [`914b193`](https://github.com/gradio-app/gradio/commit/914b1935de27c3b379ac9e759b6d10747e3b881a) - Add copy button to `gr.Markdown`. Thanks @hannahblair! +- [#8837](https://github.com/gradio-app/gradio/pull/8837) [`0d76169`](https://github.com/gradio-app/gradio/commit/0d76169e46112dffbc2e7649355706e37e0a6372) - upgrade pyright==1.1.372. Thanks @abidlabs! +- [#8816](https://github.com/gradio-app/gradio/pull/8816) [`9ee6839`](https://github.com/gradio-app/gradio/commit/9ee6839f94d23d685a800ed3a275206e0b0e48f6) - Change optionality of the `data` param in `submit` + `predict`. Thanks @hannahblair! +- [#8809](https://github.com/gradio-app/gradio/pull/8809) [`7f41567`](https://github.com/gradio-app/gradio/commit/7f41567e9cc5222c4cede3ea5321e634ea038bd1) - Use constant-time comparison when checking user provided analytics key. Thanks @abidlabs! +- [#8817](https://github.com/gradio-app/gradio/pull/8817) [`34510db`](https://github.com/gradio-app/gradio/commit/34510db468daae19ad618c347cb88a4769816fb2) - Allow HTML in alert modals. Thanks @abidlabs! +- [#8803](https://github.com/gradio-app/gradio/pull/8803) [`e1a4040`](https://github.com/gradio-app/gradio/commit/e1a404093cfaf9d8f2a92bc1d28fb6aa254848d1) - Ensure all upload components have consistent upload regions. Thanks @pngwn! +- [#8821](https://github.com/gradio-app/gradio/pull/8821) [`cea3bf9`](https://github.com/gradio-app/gradio/commit/cea3bf990057391f699bdeeabbdb62fdad9b43f5) - Fix dependency loop with statustracker and markdown. Thanks @aliabd! +- [#8774](https://github.com/gradio-app/gradio/pull/8774) [`2d179f6`](https://github.com/gradio-app/gradio/commit/2d179f647baca48362863f5144298768149860c9) - Set the default format of gr.Plot as png for Wasm mode. Thanks @whitphx! +- [#8775](https://github.com/gradio-app/gradio/pull/8775) [`e36bab7`](https://github.com/gradio-app/gradio/commit/e36bab77e5753c3b011c7e44bce2eed46fac27cc) - Refactoring loadPyodide typing. Thanks @whitphx! + +### Fixes + +- [#8854](https://github.com/gradio-app/gradio/pull/8854) [`d1f0441`](https://github.com/gradio-app/gradio/commit/d1f044145ae93e5838042d9fb25f4f17def9c774) - Use covariant container types across the codebase and add typing to our demos. Thanks @abidlabs! +- [#8818](https://github.com/gradio-app/gradio/pull/8818) [`2de9a97`](https://github.com/gradio-app/gradio/commit/2de9a97ae953cc5c58c0d33d8966e638e76f950f) - Refactoring component making the code simpler and fixing a Playground mode bug. Thanks @whitphx! +- [#8799](https://github.com/gradio-app/gradio/pull/8799) [`61bb588`](https://github.com/gradio-app/gradio/commit/61bb5883a2af50534ef6994ba4829a1a3ea00e65) - Remove Pydantic v2 patch from Lite. Thanks @whitphx! +- [#8822](https://github.com/gradio-app/gradio/pull/8822) [`3a81fb2`](https://github.com/gradio-app/gradio/commit/3a81fb2578c6f73607c4e240d228dccb69153e0a) - Latex Rendering Fix. Thanks @dawoodkhan82! +- [#8865](https://github.com/gradio-app/gradio/pull/8865) [`2f630ab`](https://github.com/gradio-app/gradio/commit/2f630abf53ec493a3ff5e827b5951b26c74b7242) - Chatbot Examples Scroll Fix. Thanks @dawoodkhan82! +- [#8820](https://github.com/gradio-app/gradio/pull/8820) [`5050b36`](https://github.com/gradio-app/gradio/commit/5050b36221e75a18d8a5d4f74a725e70768a4c4a) - fix: wrong named param check for js client. Thanks @JacobLinCool! +- [#8836](https://github.com/gradio-app/gradio/pull/8836) [`7e8c829`](https://github.com/gradio-app/gradio/commit/7e8c829aad85d3d5a31a03f4f2e41483d1e6b53e) - Add `.input()` events to `gr.Audio` and `gr.Image`. Thanks @abidlabs! +- [#8802](https://github.com/gradio-app/gradio/pull/8802) [`7b19474`](https://github.com/gradio-app/gradio/commit/7b19474cb2dd8f2c34d630f43edb0fcb0e05aa0c) - Ensure `ImageEditor` brush color can be updated with `gr.update`. Thanks @pngwn! +- [#8852](https://github.com/gradio-app/gradio/pull/8852) [`16b8200`](https://github.com/gradio-app/gradio/commit/16b820038df43905447ab7623d39d91ceb0d6238) - Fix gr.Image height inconsistencies. Thanks @hannahblair! + +## 4.38.1 + +### Features + +- [#8766](https://github.com/gradio-app/gradio/pull/8766) [`2b4636e`](https://github.com/gradio-app/gradio/commit/2b4636e75cf728846253451b7104b724609a9cd1) - Fix width of assistant's chatbot bubble. Thanks @pngwn! + +## 4.38.0 + +### Highlights + +#### Support message format in chatbot 💬 ([#8422](https://github.com/gradio-app/gradio/pull/8422) [`4221290`](https://github.com/gradio-app/gradio/commit/4221290d847041024b1faa3df5585bba0775b8b3)) + +`gr.Chatbot` and `gr.ChatInterface` now support the [Messages API](https://huggingface.co/docs/text-generation-inference/en/messages_api#messages-api), which is fully compatible with LLM API providers such as Hugging Face Text Generation Inference, OpenAI's chat completions API, and Llama.cpp server. + +Building Gradio applications around these LLM solutions is now even easier! + +`gr.Chatbot` and `gr.ChatInterface` now have a `type` parameter that can accept two values - `'tuples'` and `'messages'`. If set to `'tuples'`, the default chatbot data format is expected. If set to `'messages'`, a list of dictionaries with `content` and `role` keys is expected. See below - + +```python +def chat_greeter(msg, history): + history.append({"role": "assistant", "content": "Hello!"}) + return history +``` + +Additionally, gradio now exposes a `gr.ChatMessage` dataclass you can use for IDE type hints and auto completion. + +image + + +#### Tool use in Chatbot 🛠️ + +The Gradio Chatbot can now natively display tool usage and intermediate thoughts common in Agent and chain-of-thought workflows! + +If you are using the new "messages" format, simply add a `metadata` key with a dictionary containing a `title` key and `value`. This will display the assistant message in an expandable message box to show the result of a tool or intermediate step. + +```python +import gradio as gr +from gradio import ChatMessage +import time + +def generate_response(history): + history.append(ChatMessage(role="user", content="What is the weather in San Francisco right now?")) + yield history + time.sleep(0.25) + history.append(ChatMessage(role="assistant", + content="In order to find the current weather in San Francisco, I will need to use my weather tool.") + ) + yield history + time.sleep(0.25) + + history.append(ChatMessage(role="assistant", + content="API Error when connecting to weather service.", + metadata={"title": "💥 Error using tool 'Weather'"}) + ) + yield history + time.sleep(0.25) + + history.append(ChatMessage(role="assistant", + content="I will try again", + )) + yield history + time.sleep(0.25) + + history.append(ChatMessage(role="assistant", + content="Weather 72 degrees Fahrenheit with 20% chance of rain.", + metadata={"title": "🛠️ Used tool 'Weather'"} + )) + yield history + time.sleep(0.25) + + history.append(ChatMessage(role="assistant", + content="Now that the API succeeded I can complete my task.", + )) + yield history + time.sleep(0.25) + + history.append(ChatMessage(role="assistant", + content="It's a sunny day in San Francisco with a current temperature of 72 degrees Fahrenheit and a 20% chance of rain. Enjoy the weather!", + )) + yield history + + +with gr.Blocks() as demo: + chatbot = gr.Chatbot(type="messages") + button = gr.Button("Get San Francisco Weather") + button.click(generate_response, chatbot, chatbot) + +if __name__ == "__main__": + demo.launch() +``` + + + +![tool-box-demo](https://github.com/freddyaboulton/freddyboulton/assets/41651716/cf73ecc9-90ac-42ce-bca5-768e0cc00a48) + + Thanks @freddyaboulton! + +### Features + +- [#8683](https://github.com/gradio-app/gradio/pull/8683) [`a92c3e8`](https://github.com/gradio-app/gradio/commit/a92c3e8015c1951f995f52f9750a0364bd5d5e8d) - Warn against Falsy credentials. Thanks @Paillat-dev! +- [#8743](https://github.com/gradio-app/gradio/pull/8743) [`ee497d5`](https://github.com/gradio-app/gradio/commit/ee497d5c3c96041e5b624452596762248de114cc) - Perform CORS validation when the request has a cookie. Thanks @abidlabs! +- [#8744](https://github.com/gradio-app/gradio/pull/8744) [`b736c8d`](https://github.com/gradio-app/gradio/commit/b736c8db343087a4854f659b92732c8859fa999a) - Refactor `gr.ParamViewer` to use HTML `
` and other tweaks. Thanks @abidlabs! +- [#8665](https://github.com/gradio-app/gradio/pull/8665) [`3b8238c`](https://github.com/gradio-app/gradio/commit/3b8238c2e222a6537b19b8901198b7e369e8319a) - Add c/cpp code support. Thanks @ginazhouhuiwu! +- [#8713](https://github.com/gradio-app/gradio/pull/8713) [`e3c7079`](https://github.com/gradio-app/gradio/commit/e3c7079e380880d5759d98d180eaf688122f1c69) - Time range component. Thanks @aliabid94! +- [#8705](https://github.com/gradio-app/gradio/pull/8705) [`280a3f4`](https://github.com/gradio-app/gradio/commit/280a3f4afe0500fe67a02fafa2ac31344c3a0149) - GRADIO_ALLOWED_PATHS & GRADIO_BLOCKED_PATHS comma separated environme…. Thanks @cocktailpeanut! +- [#8733](https://github.com/gradio-app/gradio/pull/8733) [`fb0daf3`](https://github.com/gradio-app/gradio/commit/fb0daf3730ffbe6aab5ebe4210eae150729a40b1) - Improvements to `gr.Examples`: adds events as attributes and documents, them, adds `sample_labels`, and `visible` properties. Thanks @abidlabs! +- [#8750](https://github.com/gradio-app/gradio/pull/8750) [`5e36144`](https://github.com/gradio-app/gradio/commit/5e361442328cf01fa92ecdadfa420054b8da2a81) - Add guides for msg format and llm agents. Thanks @freddyaboulton! +- [#8687](https://github.com/gradio-app/gradio/pull/8687) [`bc1d45d`](https://github.com/gradio-app/gradio/commit/bc1d45d8745a677bbe2a32f8d7553fe0d4ef3fd7) - Model3D point cloud and wireframe display modes. Thanks @dawoodkhan82! + +### Fixes + +- [#8699](https://github.com/gradio-app/gradio/pull/8699) [`012da05`](https://github.com/gradio-app/gradio/commit/012da05287846d94beb0ecdc28d7fbc48c4248ff) - Ensure JS client `status_callback` functionality works and improve status messages. Thanks @hannahblair! +- [#8763](https://github.com/gradio-app/gradio/pull/8763) [`c1ecfde`](https://github.com/gradio-app/gradio/commit/c1ecfde50e55902140aafc3551968e26c1bb4cd0) - 8394 df hidden items. Thanks @pngwn! +- [#8505](https://github.com/gradio-app/gradio/pull/8505) [`2943d6d`](https://github.com/gradio-app/gradio/commit/2943d6d68847314885dc6c5c0247083116017ca0) - Add Timer component. Thanks @aliabid94! +- [#8715](https://github.com/gradio-app/gradio/pull/8715) [`a6b3c6c`](https://github.com/gradio-app/gradio/commit/a6b3c6ce4e1d06253860c72740024a9138e3a93a) - Ensure `@gradio/client`'s `submit` iterator releases as expected. Thanks @pngwn! +- [#8758](https://github.com/gradio-app/gradio/pull/8758) [`26cdd0f`](https://github.com/gradio-app/gradio/commit/26cdd0ffe049ecfe751f3831cbdb4c04c0ecf934) - Revert chatbot styling. Thanks @pngwn! +- [#8658](https://github.com/gradio-app/gradio/pull/8658) [`0482453`](https://github.com/gradio-app/gradio/commit/0482453fd5815446c8efa21bfbba0b00d6e4113d) - Chatbot LaTeX Crash Fix. Thanks @dawoodkhan82! +- [#8716](https://github.com/gradio-app/gradio/pull/8716) [`e834d30`](https://github.com/gradio-app/gradio/commit/e834d302e44f7a54565129bf2c11acf4e882a59b) - ensure `@gradio/client` always returns the correct data. Thanks @pngwn! +- [#8737](https://github.com/gradio-app/gradio/pull/8737) [`31a876d`](https://github.com/gradio-app/gradio/commit/31a876d0274d7b74a90d30148f3e9c098f486242) - Fix `Share to community` button for images. Thanks @hannahblair! +- [#8719](https://github.com/gradio-app/gradio/pull/8719) [`d15ada9`](https://github.com/gradio-app/gradio/commit/d15ada9a1c270dd86e1751b1846510a70dc48510) - Fix multimodal textbox custom components. Thanks @freddyaboulton! +- [#8714](https://github.com/gradio-app/gradio/pull/8714) [`1b5b5b0`](https://github.com/gradio-app/gradio/commit/1b5b5b0b43e69ee84f3baad2aae59ffc9c4d995a) - Bind `fetch` and `stream` in JS client. Thanks @hannahblair! +- [#8677](https://github.com/gradio-app/gradio/pull/8677) [`c946c6f`](https://github.com/gradio-app/gradio/commit/c946c6f31a34bfd888a6a16c3fb479fe34710206) - Allow supplying custom `gr.Chatbot` with events to `gr.ChatInterface`. Thanks @abidlabs! +- [#8748](https://github.com/gradio-app/gradio/pull/8748) [`a9307c6`](https://github.com/gradio-app/gradio/commit/a9307c64525c5b323e56ea6f7475faa7c3dad4a4) - Chatbot generating scroll and click fix. Thanks @freddyaboulton! +- [#8720](https://github.com/gradio-app/gradio/pull/8720) [`936c713`](https://github.com/gradio-app/gradio/commit/936c7137a99ef59efdf75bae5dd27eea2ac1f577) - Documents auth in the guides, in the view API page, and also types the Blocks.config object. Thanks @abidlabs! + +## 4.37.2 + +### Features + +- [#8632](https://github.com/gradio-app/gradio/pull/8632) [`ea6482c`](https://github.com/gradio-app/gradio/commit/ea6482cc89a883075a9008d1758e97f5ea73a9ec) - remove `chatbot_multimodal` demo from `gr.Chatbot` documentation page. Thanks @abidlabs! +- [#8649](https://github.com/gradio-app/gradio/pull/8649) [`4b6c8b1`](https://github.com/gradio-app/gradio/commit/4b6c8b1c004cee67345a7f103ba2dc8e90b82e6c) - ensure `File` objects are handled in JS client `handle_file`. Thanks @hannahblair! +- [#8604](https://github.com/gradio-app/gradio/pull/8604) [`b6fa6b5`](https://github.com/gradio-app/gradio/commit/b6fa6b543f226540247cd50748019cde59b93005) - Add docs for `.on()`, `.then()`, and `.success()`, as well as the subclasses of `gr.EventData`. Thanks @abidlabs! + +### Fixes + +- [#8655](https://github.com/gradio-app/gradio/pull/8655) [`3896398`](https://github.com/gradio-app/gradio/commit/38963984800d58bfad81bc928f2d631cb4bac773) - Ensure copy button on chatbot shows when appropriate. Thanks @pngwn! +- [#8645](https://github.com/gradio-app/gradio/pull/8645) [`9933e53`](https://github.com/gradio-app/gradio/commit/9933e538c9544c386851d90adacd148763ccc878) - Update file_explorer.py for str type `height`. Thanks @magical-l! +- [#8608](https://github.com/gradio-app/gradio/pull/8608) [`c12f82a`](https://github.com/gradio-app/gradio/commit/c12f82a36dc75ff30918dc2ce5f24e583b676f22) - Bugfix: Add a `file_count` parameter to `gr.MultimodalTextbox`. Multiple files cab be uploaded by setting `file_count="multiple"`. Default is `"single"` to preserve the previous behavior. Thanks @freddyaboulton! +- [#8631](https://github.com/gradio-app/gradio/pull/8631) [`9b8840a`](https://github.com/gradio-app/gradio/commit/9b8840ab5f712a6634b77df014083071fa253ba0) - Ensure chatbot messages are visible to screenreaders. Thanks @hannahblair! +- [#8637](https://github.com/gradio-app/gradio/pull/8637) [`c348392`](https://github.com/gradio-app/gradio/commit/c34839293f7ebad91d71caced84eea4a3790a558) - Multimodal textbox buttons alignment. Thanks @dawoodkhan82! + +## 4.37.1 + +### Fixes + +- [#8610](https://github.com/gradio-app/gradio/pull/8610) [`9204d86`](https://github.com/gradio-app/gradio/commit/9204d86ed48b4a45ed5de5ea628b756d092ce910) - Add guide on cleaning up state and file resources. Thanks @freddyaboulton! + +## 4.37.0 + +### Features + +- [#8131](https://github.com/gradio-app/gradio/pull/8131) [`bb504b4`](https://github.com/gradio-app/gradio/commit/bb504b494947a287d6386e0e7ead3860c0f15223) - Gradio components in `gr.Chatbot()`. Thanks @dawoodkhan82! +- [#8489](https://github.com/gradio-app/gradio/pull/8489) [`c2a0d05`](https://github.com/gradio-app/gradio/commit/c2a0d056d679d90631d9ccd944dadd67e7e03b7f) - Control Display of Error, Info, Warning. Thanks @freddyaboulton! +- [#8571](https://github.com/gradio-app/gradio/pull/8571) [`a77877f`](https://github.com/gradio-app/gradio/commit/a77877f62df7c610fcfac7b3b00e186a087c8ec6) - First time loading performance optimization. Thanks @baojianting! +- [#8607](https://github.com/gradio-app/gradio/pull/8607) [`c7cd0a0`](https://github.com/gradio-app/gradio/commit/c7cd0a0e9aefe0e5ee5584df676f3cc69a403059) - Ensure chatbot background is consistent with other components. Thanks @pngwn! +- [#8555](https://github.com/gradio-app/gradio/pull/8555) [`7fc7455`](https://github.com/gradio-app/gradio/commit/7fc7455553c04c52c8e25d520f3d67f1b5609637) - support html in chatbot. Thanks @pngwn! +- [#8590](https://github.com/gradio-app/gradio/pull/8590) [`65afffd`](https://github.com/gradio-app/gradio/commit/65afffd34b79ba9117e8d9506ea82477204cb57d) - Fix multimodal chat look. Thanks @aliabid94! +- [#8603](https://github.com/gradio-app/gradio/pull/8603) [`affce4c`](https://github.com/gradio-app/gradio/commit/affce4cbd9e2df14175c79da27408ccce57a74e9) - Fix resizer on altair. Thanks @aliabid94! +- [#8580](https://github.com/gradio-app/gradio/pull/8580) [`797621b`](https://github.com/gradio-app/gradio/commit/797621b81a0ab9b794e6872f8d43bf6d19a68b78) - Improved plot rendering to thematically match. Thanks @aliabid94!/n highlight:Expect visual changes in gr.Plot, gr.BarPlot, gr.LinePlot, gr.ScatterPlot, including changes to color and width sizing. +- [#8520](https://github.com/gradio-app/gradio/pull/8520) [`595ecf3`](https://github.com/gradio-app/gradio/commit/595ecf35da6cd5f9aa7d9135282d005b63fbdef1) - Add build target option to the custom component `gradio.config.js` file. Thanks @pngwn! +- [#8593](https://github.com/gradio-app/gradio/pull/8593) [`d35c290`](https://github.com/gradio-app/gradio/commit/d35c290aadcb85113ee7ceea96a7ed7dc894b1d2) - Adding more docs for using components in chatbot. Thanks @abidlabs! +- [#8609](https://github.com/gradio-app/gradio/pull/8609) [`36b2af9`](https://github.com/gradio-app/gradio/commit/36b2af9a31e43e92f61f39636b7c32001c34734d) - Changed gradio version check from print statement to warning. Thanks @gdevakumar! +- [#8600](https://github.com/gradio-app/gradio/pull/8600) [`7289c4b`](https://github.com/gradio-app/gradio/commit/7289c4b036d8a78c48f8c9e66ba998e6730e80d2) - Add credentials: include and Cookie header to prevent 401 error. Thanks @yinkiu602! +- [#8488](https://github.com/gradio-app/gradio/pull/8488) [`b03da67`](https://github.com/gradio-app/gradio/commit/b03da67d8f17c36e78b47bfad78e30c94d577828) - Minor changes to monitoring. Thanks @freddyaboulton! +- [#8569](https://github.com/gradio-app/gradio/pull/8569) [`6f99a02`](https://github.com/gradio-app/gradio/commit/6f99a028ed0071e3f588076c059d19f3ff5d85f8) - Upgrade pyodide 0.26. Thanks @whitphx! +- [#8565](https://github.com/gradio-app/gradio/pull/8565) [`fd5aab1`](https://github.com/gradio-app/gradio/commit/fd5aab10be53a4215b5eeca03cd1c99c5a30c21d) - Remove duplicated code in `routes.py`. Thanks @sadra-barikbin! +- [#8529](https://github.com/gradio-app/gradio/pull/8529) [`d43d696`](https://github.com/gradio-app/gradio/commit/d43d69648669da98a4fdf741071501e531b68d86) - feat: exception handling about file_count params of File component. Thanks @young-hun-jo! +- [#8528](https://github.com/gradio-app/gradio/pull/8528) [`2b0c157`](https://github.com/gradio-app/gradio/commit/2b0c1577b27fcf30920196f815ec7be604893b19) - Added an optional `height` and overflow scrollbar for the Markdown Component. Thanks @ShruAgarwal! +- [#8516](https://github.com/gradio-app/gradio/pull/8516) [`de6aa2b`](https://github.com/gradio-app/gradio/commit/de6aa2b67668605b65ad92842b2c798afa2c6d8a) - Add helper classes to docs. Thanks @aliabd! +- [#8522](https://github.com/gradio-app/gradio/pull/8522) [`bdaa678`](https://github.com/gradio-app/gradio/commit/bdaa678d0c0a22250b41104f32e9121f98dc7437) - add handle_file docs. Thanks @pngwn! + +### Fixes + +- [#8599](https://github.com/gradio-app/gradio/pull/8599) [`ca125b7`](https://github.com/gradio-app/gradio/commit/ca125b728a0803a5b5ed71a5189e6b68175edcad) - Fix reload mode for jupyter notebook and stateful demos. Thanks @freddyaboulton! +- [#8521](https://github.com/gradio-app/gradio/pull/8521) [`900cf25`](https://github.com/gradio-app/gradio/commit/900cf25256a5b0563860097d69aac28b6afbfd8b) - Ensure frontend functions work when they don't return a value. Thanks @pngwn! +- [#8594](https://github.com/gradio-app/gradio/pull/8594) [`530f8a0`](https://github.com/gradio-app/gradio/commit/530f8a0b056b35dabe9bdd148e1ab7c4577f017d) - chatbot component tweaks. Thanks @pngwn! +- [#8530](https://github.com/gradio-app/gradio/pull/8530) [`d429690`](https://github.com/gradio-app/gradio/commit/d429690611eacd7b19cf4609332b0c12c93a1591) - Fix request serialization for fastapi `/docs`. Thanks @zhzLuke96! +- [#8589](https://github.com/gradio-app/gradio/pull/8589) [`34430b9`](https://github.com/gradio-app/gradio/commit/34430b934dbab3bc525f56b390dbc054f76cf56c) - Handle GIFs correct in `gr.Image` preprocessing. Thanks @abidlabs! +- [#8506](https://github.com/gradio-app/gradio/pull/8506) [`7c5fec3`](https://github.com/gradio-app/gradio/commit/7c5fec3a2606b7a40f4cdc60f2553ba55fc8df99) - Use root url for monitoring url. Thanks @abidlabs! +- [#8524](https://github.com/gradio-app/gradio/pull/8524) [`546d14e`](https://github.com/gradio-app/gradio/commit/546d14e4f2773f91be7afc37355327044e7cb6e6) - add test + demo. Thanks @pngwn! +- [#8588](https://github.com/gradio-app/gradio/pull/8588) [`1e61644`](https://github.com/gradio-app/gradio/commit/1e6164462431111e8c4c698cc2c57ab0d0076ba2) - move `deploy_space_action.yaml` to correct location. Thanks @abidlabs! +- [#8543](https://github.com/gradio-app/gradio/pull/8543) [`a4433be`](https://github.com/gradio-app/gradio/commit/a4433be25c183080d397413dc8c4330cd8c2b562) - Ability to disable orange progress animation for generators by setting `show_progress='minimal'` or `show_progress='hidden'` in the event definition. This is a small visual breaking change but it aligns better with the expected behavior of the `show_progress` parameter. Also added `show_progress` to `gr.Interface` and `gr.ChatInterface`. Thanks @freddyaboulton! +- [#8579](https://github.com/gradio-app/gradio/pull/8579) [`bc5fccf`](https://github.com/gradio-app/gradio/commit/bc5fccfeee4ff6941c927c982cfbabed7b90213c) - Allow `gr.load` to work inside `gr.Blocks` automatically. Thanks @abidlabs! +- [#8573](https://github.com/gradio-app/gradio/pull/8573) [`56af40f`](https://github.com/gradio-app/gradio/commit/56af40f5e3bc4ea98bcfe6838f7ffcda1f47b63f) - Fixes the `favicon_path` working error. Thanks @ShruAgarwal! +- [#8548](https://github.com/gradio-app/gradio/pull/8548) [`7fc0f51`](https://github.com/gradio-app/gradio/commit/7fc0f5149bb8d31f3d01b4151b478070499751ee) - Fix reload mode by implementing `close` on the client. Thanks @freddyaboulton! +- [#8531](https://github.com/gradio-app/gradio/pull/8531) [`88de38e`](https://github.com/gradio-app/gradio/commit/88de38e2597bc39532be77b917f1f02b1a11647d) - Fix custom components on windows. Thanks @freddyaboulton! +- [#8581](https://github.com/gradio-app/gradio/pull/8581) [`a1c21cb`](https://github.com/gradio-app/gradio/commit/a1c21cb69a688bd38139153fe9c85a50c6ae86f2) - fix dataset update. Thanks @abidlabs! +- [#8537](https://github.com/gradio-app/gradio/pull/8537) [`81ae766`](https://github.com/gradio-app/gradio/commit/81ae7663b303ac7738bc216d9bf916f0515dd22e) - Many small fixes to website and docs. Thanks @aliabd! + +## 4.36.1 + +### Features + +- [#8491](https://github.com/gradio-app/gradio/pull/8491) [`ffd53fa`](https://github.com/gradio-app/gradio/commit/ffd53fa2dcb13d564fd07aa441d4016df8d2f155) - Remove broken guide redirect. Thanks @aliabd! +- [#8499](https://github.com/gradio-app/gradio/pull/8499) [`c5f6e77`](https://github.com/gradio-app/gradio/commit/c5f6e7722a197d4706419ade14276ddecf3196f8) - Cache break themes on change. Thanks @aliabid94! + +### Fixes + +- [#8504](https://github.com/gradio-app/gradio/pull/8504) [`2a59bab`](https://github.com/gradio-app/gradio/commit/2a59bab3bb537373e2823b2416e42b7a8370d7ec) - Fixes TabbedInterface bug where only first interface events get triggered. Thanks @freddyaboulton! + +## 4.36.0 + +### Features + +- [#8478](https://github.com/gradio-app/gradio/pull/8478) [`73e1108`](https://github.com/gradio-app/gradio/commit/73e11087a0d212c568c361e84e50fcb59d4a37b0) - Adds a monitoring dashboard to Gradio apps that can be used to view usage. Thanks @aliabid94! + +## 4.35.0 + +### Features + +- [#8481](https://github.com/gradio-app/gradio/pull/8481) [`41a4493`](https://github.com/gradio-app/gradio/commit/41a449383a34b7d6e4c83cfbf61c222fd5501206) - fix client flaky tests. Thanks @abidlabs! +- [#8483](https://github.com/gradio-app/gradio/pull/8483) [`e2271e2`](https://github.com/gradio-app/gradio/commit/e2271e207d98074bf39b02ae3c5443b2f097627d) - documentation for @gradio/client. Thanks @pngwn! +- [#8485](https://github.com/gradio-app/gradio/pull/8485) [`f8ebace`](https://github.com/gradio-app/gradio/commit/f8ebaceccef60a112603d290d10072ef4e938a6a) - Ensure all status are reported internally when calling `predict`. Thanks @pngwn! + +## 4.34.0 + +### Features + +- [#8370](https://github.com/gradio-app/gradio/pull/8370) [`48eeea4`](https://github.com/gradio-app/gradio/commit/48eeea4eaab7e24168688e3c3fbafb30e4e78d51) - Refactor Cancelling Logic To Use /cancel. Thanks @freddyaboulton! +- [#8460](https://github.com/gradio-app/gradio/pull/8460) [`8628899`](https://github.com/gradio-app/gradio/commit/86288993d9589ceb7bcc3e4d10f0adb6419d4ac5) - Support Bash in Api Recorder. Thanks @aliabd! +- [#8417](https://github.com/gradio-app/gradio/pull/8417) [`96d8de2`](https://github.com/gradio-app/gradio/commit/96d8de231270321da5f310768643363276df3204) - add delete event to `File` component. Thanks @pngwn! +- [#8444](https://github.com/gradio-app/gradio/pull/8444) [`2cd02ff`](https://github.com/gradio-app/gradio/commit/2cd02ff3b7c57cd69635d111ff25643eba30b9b0) - Remove deprecated parameters from Python Client. Thanks @abidlabs! +- [#8473](https://github.com/gradio-app/gradio/pull/8473) [`8ca93d4`](https://github.com/gradio-app/gradio/commit/8ca93d45dd9f8948cfe87fe16ef5943139e756a7) - Improve design of api recorder. Thanks @aliabd! +- [#8445](https://github.com/gradio-app/gradio/pull/8445) [`5c8915b`](https://github.com/gradio-app/gradio/commit/5c8915b11308756c3b7279864d240ea85f5a0b4a) - Add cURL to view API Page and add a dedicated Guide. Thanks @abidlabs! + +### Fixes + +- [#8477](https://github.com/gradio-app/gradio/pull/8477) [`d5a9604`](https://github.com/gradio-app/gradio/commit/d5a960493017a4890685af61d78ce7d3b3b12e6b) - Fix js client bundle. Thanks @pngwn! +- [#8451](https://github.com/gradio-app/gradio/pull/8451) [`9d2d605`](https://github.com/gradio-app/gradio/commit/9d2d6051caed5c8749a26a6fa7480a5ae6e6c4f3) - Change client submit API to be an AsyncIterable and support more platforms. Thanks @pngwn! +- [#8462](https://github.com/gradio-app/gradio/pull/8462) [`6447dfa`](https://github.com/gradio-app/gradio/commit/6447dface4d46db1c69460e8325a1928d0476a46) - Improve file handling in JS Client. Thanks @hannahblair! +- [#8439](https://github.com/gradio-app/gradio/pull/8439) [`63d36fb`](https://github.com/gradio-app/gradio/commit/63d36fbbf4bf6dc909be9a0ffc7b6bf6621d83e8) - Handle gradio apps using `state` in the JS Client. Thanks @hannahblair! + +## 4.33.0 + +### Features + +- [#8429](https://github.com/gradio-app/gradio/pull/8429) [`d393a4a`](https://github.com/gradio-app/gradio/commit/d393a4a2245675d161f03bb9e7a7a62348748581) - Fix type hints for render and on. Thanks @freddyaboulton! +- [#8377](https://github.com/gradio-app/gradio/pull/8377) [`341844f`](https://github.com/gradio-app/gradio/commit/341844f04efe0e7e512c7ca443f3f2b195a32fa7) - Click to preview images in chatbot. Thanks @dawoodkhan82! +- [#8455](https://github.com/gradio-app/gradio/pull/8455) [`a970589`](https://github.com/gradio-app/gradio/commit/a970589cf57c72650f45fbc6a82ad9c52a6e4712) - Fix multimodal textbox placeholder. Thanks @dawoodkhan82! +- [#8446](https://github.com/gradio-app/gradio/pull/8446) [`4a55157`](https://github.com/gradio-app/gradio/commit/4a55157ed9796b8a69cadae0d87a85203eab2cb3) - state.change listener with deep hash check. Thanks @aliabid94! + +### Fixes + +- [#8400](https://github.com/gradio-app/gradio/pull/8400) [`33c8081`](https://github.com/gradio-app/gradio/commit/33c8081aa967ffc6fec68e15946b9bce2e848ee2) - Handle special arguments when extracting parameter names for view API page. Thanks @abidlabs! +- [#8369](https://github.com/gradio-app/gradio/pull/8369) [`4795c6e`](https://github.com/gradio-app/gradio/commit/4795c6e9e942b5ce489e4451ef84fa75128d89d2) - Fix multimodal textbox styling for certain themes. Thanks @dawoodkhan82! +- [#8440](https://github.com/gradio-app/gradio/pull/8440) [`83bdf5c`](https://github.com/gradio-app/gradio/commit/83bdf5c4478c0c6138cc639818dd5e403ea712a0) - Add support for `numpy~=2.0`. Thanks @freddyaboulton! + +## 4.32.2 + +### Fixes + +- [#8431](https://github.com/gradio-app/gradio/pull/8431) [`9909b28`](https://github.com/gradio-app/gradio/commit/9909b28364b82b5e8bfd7d47a858a204f68b963a) - fix scrolling on spaces. Thanks @pngwn! + +## 4.32.1 + +### Features + +- [#8415](https://github.com/gradio-app/gradio/pull/8415) [`227de35`](https://github.com/gradio-app/gradio/commit/227de352982b3dcdf9384eaa28b7e9cf09afb6e8) - Fix spaces load error. Thanks @aliabid94! + +## 4.32.0 + +### Features + +- [#8401](https://github.com/gradio-app/gradio/pull/8401) [`d078621`](https://github.com/gradio-app/gradio/commit/d078621928136c09ca902d2f37594ed887c67d2e) - Add CDN installation to JS docs. Thanks @hannahblair! +- [#8243](https://github.com/gradio-app/gradio/pull/8243) [`55f664f`](https://github.com/gradio-app/gradio/commit/55f664f2979a49acc29a73cde16c6ebdfcc91db2) - Add event listener support to render blocks. Thanks @aliabid94! +- [#8398](https://github.com/gradio-app/gradio/pull/8398) [`945ac83`](https://github.com/gradio-app/gradio/commit/945ac837e779b120790814ea6f6f81bd2712f5f8) - Improve rendering. Thanks @aliabid94! +- [#8299](https://github.com/gradio-app/gradio/pull/8299) [`ab65360`](https://github.com/gradio-app/gradio/commit/ab653608045ff9462db7ad9fe63e1c60bf20e773) - Allow JS Client to work with authenticated spaces 🍪. Thanks @hannahblair! +- [#8386](https://github.com/gradio-app/gradio/pull/8386) [`e738e26`](https://github.com/gradio-app/gradio/commit/e738e26a5d0f31c60cfd24d47c11dc9d4bc2d1a6) - Include instructions on starting from someone else's custom component repository. Thanks @freddyaboulton! +- [#8363](https://github.com/gradio-app/gradio/pull/8363) [`94a1143`](https://github.com/gradio-app/gradio/commit/94a1143686733c7fe16e204764b9a3e7240ccf02) - Add allow-credentials to preflight header. Thanks @abidlabs! +- [#8403](https://github.com/gradio-app/gradio/pull/8403) [`5efd35c`](https://github.com/gradio-app/gradio/commit/5efd35c7a06d894fdcb68898bdaaf9b457e608f1) - Editable Docs. Thanks @aliabd! +- [#8355](https://github.com/gradio-app/gradio/pull/8355) [`33e8bab`](https://github.com/gradio-app/gradio/commit/33e8babb17b2094327860bc1996ab855d6c22d46) - Enable hiding the inline category in HighlightedText with a `show_inline_category` argument. Thanks @xu-song! +- [#8409](https://github.com/gradio-app/gradio/pull/8409) [`8028c33`](https://github.com/gradio-app/gradio/commit/8028c33bbc5a324a5e9e8b28906443db28683d79) - Render decorator documentation. Thanks @aliabid94! +- [#8378](https://github.com/gradio-app/gradio/pull/8378) [`3fbf2e8`](https://github.com/gradio-app/gradio/commit/3fbf2e8e7059f3bab64b0839ab7a0f9f864f0a66) - chore: update docs.py. Thanks @eltociear! + +### Fixes + +- [#8408](https://github.com/gradio-app/gradio/pull/8408) [`e86dd01`](https://github.com/gradio-app/gradio/commit/e86dd01b6e8f7bab3d3c25b84f2ad33129138af4) - Connect heartbeat if state created in render. Also fix config cleanup bug #8407. Thanks @freddyaboulton! +- [#8258](https://github.com/gradio-app/gradio/pull/8258) [`1f8e5c4`](https://github.com/gradio-app/gradio/commit/1f8e5c44e054b943052d8f24d044696ddfd01a54) - Improve URL handling in JS Client. Thanks @hannahblair! +- [#8376](https://github.com/gradio-app/gradio/pull/8376) [`aebd2e9`](https://github.com/gradio-app/gradio/commit/aebd2e952e3a19633b9b95a49f51664bc8a0c20d) - Model3D right-handed coordinate system. Thanks @dylanebert! +- [#8381](https://github.com/gradio-app/gradio/pull/8381) [`24ab22d`](https://github.com/gradio-app/gradio/commit/24ab22d26179ee3d1e5f4957067ebf8722ef2e6f) - Fix encoding error. Thanks @xu-song! +- [#8364](https://github.com/gradio-app/gradio/pull/8364) [`6a1b58c`](https://github.com/gradio-app/gradio/commit/6a1b58cf3e4796ccb695db5baae190c894b30df0) - Add `--table-text-color` var to fix body text in `Examples`. Thanks @hannahblair! +- [#8284](https://github.com/gradio-app/gradio/pull/8284) [`2d705bc`](https://github.com/gradio-app/gradio/commit/2d705bcf7475eb46822358fed21dc081a800a73d) - Add body color to `gr.Accordion`. Thanks @hannahblair! +- [#8371](https://github.com/gradio-app/gradio/pull/8371) [`a373b0e`](https://github.com/gradio-app/gradio/commit/a373b0edd36613a9a6a25a1a2893edd6533a7291) - Set orig_name in python client file uploads. Thanks @freddyaboulton! +- [#8385](https://github.com/gradio-app/gradio/pull/8385) [`97ac79b`](https://github.com/gradio-app/gradio/commit/97ac79bf563f8423604a9b0e91eac4df6833f4fc) - Fix bug in reload mode equality check. Better equality conversion for state variables. Thanks @freddyaboulton! +- [#8372](https://github.com/gradio-app/gradio/pull/8372) [`89d6a17`](https://github.com/gradio-app/gradio/commit/89d6a176b39f713dd8144a1e6df1419303412ed2) - Change z-index of status tracker. Thanks @hannahblair! + +## 4.31.5 + +### Features + +- [#8311](https://github.com/gradio-app/gradio/pull/8311) [`35905c5`](https://github.com/gradio-app/gradio/commit/35905c5c8f7acbe669486ac8f57b6955328e4783) - Cleanup markdown styling. Thanks @aliabid94! + +### Fixes + +- [#8339](https://github.com/gradio-app/gradio/pull/8339) [`4dc7fa7`](https://github.com/gradio-app/gradio/commit/4dc7fa7cd7f514224686b891299e46533edffd66) - Fix Chatbot, Dataframe, Markdown custom components. Thanks @freddyaboulton! +- [#8336](https://github.com/gradio-app/gradio/pull/8336) [`f138b41`](https://github.com/gradio-app/gradio/commit/f138b4159ea364204108de14f7597674fcc9469e) - Use Any if JsonValue cannot be imported. Thanks @freddyaboulton! +- [#8334](https://github.com/gradio-app/gradio/pull/8334) [`0236b1a`](https://github.com/gradio-app/gradio/commit/0236b1ab12149ddd11b03e1382ceb09d19ac0d48) - fix: prevent triggering gr.File.select on delete. Thanks @gtm-nayan! +- [#8341](https://github.com/gradio-app/gradio/pull/8341) [`82ba397`](https://github.com/gradio-app/gradio/commit/82ba3975921760c727875948fb7275c2f5f9ea2b) - add missing orig_name (follow up to #8334). Thanks @gtm-nayan! +- [#8322](https://github.com/gradio-app/gradio/pull/8322) [`47012a0`](https://github.com/gradio-app/gradio/commit/47012a0c4e3e8a80fcae620aaf08b16ceb343cde) - ensure the client correctly handles all binary data. Thanks @Saghen! + +## 4.31.4 + +### Features + +- [#8318](https://github.com/gradio-app/gradio/pull/8318) [`9e31697`](https://github.com/gradio-app/gradio/commit/9e31697d9435ea926a194262d9e845624df0e74e) - Added image-to-image diffusers pipeline. Thanks @cswamy! + +### Fixes + +- [#8247](https://github.com/gradio-app/gradio/pull/8247) [`8f46556`](https://github.com/gradio-app/gradio/commit/8f46556b38e35cffbadac74ff80445dceea3bcf5) - Fix api recorder. Thanks @abidlabs! + +## 4.31.3 + +### Features + +- [#8229](https://github.com/gradio-app/gradio/pull/8229) [`7c81897`](https://github.com/gradio-app/gradio/commit/7c81897076ddcd0bb05e0e4ffec35bb9a986d330) - chore(deps): update dependency esbuild to ^0.21.0. Thanks @renovate! +- [#8279](https://github.com/gradio-app/gradio/pull/8279) [`4350215`](https://github.com/gradio-app/gradio/commit/4350215348981aba6dea473884b047f096dcdf0f) - Link to troubleshooting guide in the custom component loading status. Thanks @freddyaboulton! + +### Fixes + +- [#8292](https://github.com/gradio-app/gradio/pull/8292) [`ee1e294`](https://github.com/gradio-app/gradio/commit/ee1e2942e0a1ae84a08a05464e41c8108a03fa9c) - Ensure JSON component outputs handled properly in postprocess. Thanks @freddyaboulton! +- [#8296](https://github.com/gradio-app/gradio/pull/8296) [`929d216`](https://github.com/gradio-app/gradio/commit/929d216d49aa05614bc83f0761cf7b1cd803d8fe) - always create a jwt when connecting to a space if a hf_token is present. Thanks @pngwn! + +## 4.31.2 + +### Fixes + +- [#8285](https://github.com/gradio-app/gradio/pull/8285) [`7d9d8ea`](https://github.com/gradio-app/gradio/commit/7d9d8eab50d36cbecbb84c6a0f3cc1bca7215604) - use the correct query param to pass the jwt to the heartbeat event. Thanks @pngwn! + +## 4.31.1 + +### Features + +- [#8264](https://github.com/gradio-app/gradio/pull/8264) [`a9e1a8a`](https://github.com/gradio-app/gradio/commit/a9e1a8ac5633c5336fea1c63d7f66a9883e7e6e1) - Make exceptions in the Client more specific. Thanks @abidlabs! +- [#8263](https://github.com/gradio-app/gradio/pull/8263) [`de52f0e`](https://github.com/gradio-app/gradio/commit/de52f0e5af75688713e4e96a195208576a4d64ad) - Reduce the analytics that are collected in Gradio. Thanks @abidlabs! + +### Fixes + +- [#8276](https://github.com/gradio-app/gradio/pull/8276) [`0bf3d1a`](https://github.com/gradio-app/gradio/commit/0bf3d1a992db2753c1a55452b569027190f26ef6) - Fix bug where client could not connect to apps that had self signed certificates. Thanks @freddyaboulton! +- [#8260](https://github.com/gradio-app/gradio/pull/8260) [`7e976fd`](https://github.com/gradio-app/gradio/commit/7e976fd9bf5273841915b3722d3eadfcf6c11fc3) - Send ProcessCompleted message when job is cancelled. Thanks @freddyaboulton! +- [#8261](https://github.com/gradio-app/gradio/pull/8261) [`719d596`](https://github.com/gradio-app/gradio/commit/719d5962bb7018412f073b55eb3b62d8b4e02d63) - Fix bug where status tracker was the target of pointer events. Thanks @freddyaboulton! +- [#8272](https://github.com/gradio-app/gradio/pull/8272) [`fbf4edd`](https://github.com/gradio-app/gradio/commit/fbf4edde7c896cdf4c903463e44c31ed96111b3c) - ensure client works for private spaces. Thanks @pngwn! + +## 4.31.0 + +### Features + +- [#8226](https://github.com/gradio-app/gradio/pull/8226) [`892181b`](https://github.com/gradio-app/gradio/commit/892181b4fdb13dd6048a620dd985d47bc3c26ed7) - chore(deps): update dependency @types/prismjs to v1.26.4. Thanks @renovate! +- [#8254](https://github.com/gradio-app/gradio/pull/8254) [`0a6f0a7`](https://github.com/gradio-app/gradio/commit/0a6f0a7e02199cb4094d796aafa39207d718ad22) - Fix custom component detection logic in analytics. Thanks @freddyaboulton! +- [#8244](https://github.com/gradio-app/gradio/pull/8244) [`52dac63`](https://github.com/gradio-app/gradio/commit/52dac637a379ace892e3652a411392927e46613f) - Adds `examples_per_page` to `gr.ChatInterface` and allows `clear_btn` in `gr.Interface` to be hidden. Thanks @abidlabs! +- [#8219](https://github.com/gradio-app/gradio/pull/8219) [`32d915a`](https://github.com/gradio-app/gradio/commit/32d915aad5c6d9b2f5fdcafef39e246fc1b2d852) - Apply clean_indent() to the file contents specified with tags. Thanks @whitphx! +- [#8110](https://github.com/gradio-app/gradio/pull/8110) [`5436031`](https://github.com/gradio-app/gradio/commit/5436031f92c1596282eb64e1e74d555f279e9697) - Render decorator 2. Thanks @aliabid94! +- [#8197](https://github.com/gradio-app/gradio/pull/8197) [`e09b4e8`](https://github.com/gradio-app/gradio/commit/e09b4e8216b970bc1b142a0f08e7d190b954eb35) - Add support for passing keyword args to `data` in JS client. Thanks @hannahblair! +- [#8236](https://github.com/gradio-app/gradio/pull/8236) [`bf909bd`](https://github.com/gradio-app/gradio/commit/bf909bd14532a27e119fb401003a7d94c0618ffb) - Change upload icon for MultimodalTextbox. Thanks @dawoodkhan82! + +### Fixes + +- [#8245](https://github.com/gradio-app/gradio/pull/8245) [`c562a3d`](https://github.com/gradio-app/gradio/commit/c562a3d9a440c8f94ca070bd07b8d4121d6ab7b3) - Cancel server progress from the python client. Thanks @freddyaboulton! +- [#8242](https://github.com/gradio-app/gradio/pull/8242) [`05fe491`](https://github.com/gradio-app/gradio/commit/05fe4918c0e24677a1ff86fbca4cd6f4d4ef974c) - Allow Spaces with `.success()` to be `gr.load`-ed. Thanks @abidlabs! +- [#8252](https://github.com/gradio-app/gradio/pull/8252) [`22df61a`](https://github.com/gradio-app/gradio/commit/22df61a26adf8023f6dd49c051979990e8d3879a) - Client node fix. Thanks @pngwn! +- [#8227](https://github.com/gradio-app/gradio/pull/8227) [`9ece050`](https://github.com/gradio-app/gradio/commit/9ece050a702618d3260f80506f3405a4a6dabbb9) - Fix bug where updating a component's value in reload mode would not be shown in UI. Thanks @freddyaboulton! + +## 4.29.0 + +### Highlights + +#### Support custom components in gr.load ([#8200](https://github.com/gradio-app/gradio/pull/8200) [`72039be`](https://github.com/gradio-app/gradio/commit/72039be93acda856d92ceac7f21f1ec1a054fae2)) + +It is now possible to load a demo with a custom component with `gr.load`. + +The custom component must be installed in your system and imported in your python session. + +```python +import gradio as gr +import gradio_pdf + +demo = gr.load("freddyaboulton/gradiopdf", src="spaces") + +if __name__ == "__main__": + demo.launch() +``` + +image + + Thanks @freddyaboulton! + +### Features + +- [#8121](https://github.com/gradio-app/gradio/pull/8121) [`f5b710c`](https://github.com/gradio-app/gradio/commit/f5b710c919b0ce604ea955f0d5f4faa91095ca4a) - chore(deps): update dependency eslint to v9. Thanks @renovate! +- [#8174](https://github.com/gradio-app/gradio/pull/8174) [`a81e369`](https://github.com/gradio-app/gradio/commit/a81e36967c0973012e90ec7cf03b99cf3fea88ec) - Remove hatch installation in js/app/package.json which is no longer needed. Thanks @whitphx! +- [#8209](https://github.com/gradio-app/gradio/pull/8209) [`b9afe93`](https://github.com/gradio-app/gradio/commit/b9afe93915401df5bd6737c89395c2477acfa585) - Rename `eventSource_Factory` and `fetch_implementation`. Thanks @hannahblair! +- [#8109](https://github.com/gradio-app/gradio/pull/8109) [`bed2f82`](https://github.com/gradio-app/gradio/commit/bed2f82e2297b50f7b59423a3de05af0b9910724) - Implement JS Client tests. Thanks @hannahblair! +- [#8106](https://github.com/gradio-app/gradio/pull/8106) [`d0a759f`](https://github.com/gradio-app/gradio/commit/d0a759f3df8b564e2f21421d448b24fecf287306) - Pass Error status in /dev/reload stream. Thanks @freddyaboulton! +- [#7855](https://github.com/gradio-app/gradio/pull/7855) [`611c927`](https://github.com/gradio-app/gradio/commit/611c9273a301e925b5aad93a19272dccd53c39fa) - Lite wheel optimization. Thanks @whitphx! +- [#8211](https://github.com/gradio-app/gradio/pull/8211) [`91b5cd6`](https://github.com/gradio-app/gradio/commit/91b5cd6132fb8903c92f70fce0800324836a1fc3) - remove redundant event source logic. Thanks @hannahblair! +- [#8127](https://github.com/gradio-app/gradio/pull/8127) [`24b2286`](https://github.com/gradio-app/gradio/commit/24b2286a22ed247b86ee299487174c8cea2988fe) - allow the canvas size to be set on the `ImageEditor`. Thanks @pngwn! +- [#8205](https://github.com/gradio-app/gradio/pull/8205) [`cfc272f`](https://github.com/gradio-app/gradio/commit/cfc272ff7910ffcce64a7cc9d560a020f0f6ac7d) - Set the show_api flag on Lite. Thanks @whitphx! +- [#8052](https://github.com/gradio-app/gradio/pull/8052) [`1435d1d`](https://github.com/gradio-app/gradio/commit/1435d1d2dcfd1accf742726396f2213a54ae0837) - Extend Interface.from_pipeline() to support Transformers.js.py pipelines on Lite. Thanks @whitphx! +- [#8189](https://github.com/gradio-app/gradio/pull/8189) [`68dcae5`](https://github.com/gradio-app/gradio/commit/68dcae512c0fb699304446c3b1ae2afaba1a63d2) - Use workspace version for code in _website. Thanks @aliabd! + +### Fixes + +- [#8179](https://github.com/gradio-app/gradio/pull/8179) [`6a218b4`](https://github.com/gradio-app/gradio/commit/6a218b4148095aaa0c58d8c20973ba01c8764fc2) - rework upload to be a class method + pass client into each component. Thanks @pngwn! +- [#8181](https://github.com/gradio-app/gradio/pull/8181) [`cf52ca6`](https://github.com/gradio-app/gradio/commit/cf52ca6a51320ece97f009a177792840b5fbc785) - Ensure connectivity to private HF spaces with SSE protocol. Thanks @hannahblair! +- [#8169](https://github.com/gradio-app/gradio/pull/8169) [`3a6f1a5`](https://github.com/gradio-app/gradio/commit/3a6f1a50b263e0a733f609a08019fc4d05480e1a) - Only connect to heartbeat if needed. Thanks @freddyaboulton! +- [#8118](https://github.com/gradio-app/gradio/pull/8118) [`7aca673`](https://github.com/gradio-app/gradio/commit/7aca673b38a087533524b2fd8dd3a03e0e4bacfe) - Add eventsource polyfill for Node.js and browser environments. Thanks @hannahblair! +- [#8158](https://github.com/gradio-app/gradio/pull/8158) [`5671ff1`](https://github.com/gradio-app/gradio/commit/5671ff129a3ad488b307f71fffe9566bd4f7f52a) - fix: handling SIGINT correctly in reload.py, single entrance of block_thread in blocks.py. Thanks @Tiger3018! +- [#8180](https://github.com/gradio-app/gradio/pull/8180) [`449d0e6`](https://github.com/gradio-app/gradio/commit/449d0e6e145686b4c6cc2cf80bbcd9acded603dd) - Refactor analytics to not use api.gradio.app. Thanks @freddyaboulton! +- [#8182](https://github.com/gradio-app/gradio/pull/8182) [`39791eb`](https://github.com/gradio-app/gradio/commit/39791eb186d3a4ce82c8c27979a28311c37a4067) - Convert sse calls in client from async to sync. Thanks @abidlabs! +- [#8170](https://github.com/gradio-app/gradio/pull/8170) [`08b4e61`](https://github.com/gradio-app/gradio/commit/08b4e6172340952460ae4947ff45c4bbef9ec285) - Add ETag to `/custom_component` route to control browser caching. Thanks @freddyaboulton! +- [#8194](https://github.com/gradio-app/gradio/pull/8194) [`2471f79`](https://github.com/gradio-app/gradio/commit/2471f79527ebae0838eabedd2a4adab6c7667608) - run python reload only if python file changed. Thanks @jameszhou02! +- [#8204](https://github.com/gradio-app/gradio/pull/8204) [`376dfaa`](https://github.com/gradio-app/gradio/commit/376dfaaa808866cc114eff3cf1635746c3c50c5d) - Specify the fastapi version on Lite to avoid ujson installation which is not available on Pyodide yet. Thanks @whitphx! + +## 4.28.3 + +### Fixes + +- [#8144](https://github.com/gradio-app/gradio/pull/8144) [`7ba2780`](https://github.com/gradio-app/gradio/commit/7ba2780dc096a21f790695bf9368d2b39a79e2fa) - fix missing dependencies for `@gradio/preview`. Thanks @pngwn! + +## 4.28.2 + +### Fixes + +- [#8142](https://github.com/gradio-app/gradio/pull/8142) [`44eb8ac`](https://github.com/gradio-app/gradio/commit/44eb8ac6c315ffe4f0e3f544b0664c93813b6f68) - ensure @gradio/preview dist files are published. Thanks @pngwn! + +## 4.28.1 + +### Fixes + +- [#8140](https://github.com/gradio-app/gradio/pull/8140) [`0d41b22`](https://github.com/gradio-app/gradio/commit/0d41b221dc69eb543396504a276b84a485c98901) - fix publish build. Thanks @pngwn! + +## 4.28.0 + +### Highlights + +#### Setting File Upload Limits ([#7909](https://github.com/gradio-app/gradio/pull/7909) [`2afca65`](https://github.com/gradio-app/gradio/commit/2afca6541912b37dc84f447c7ad4af21607d7c72)) + +We have added a `max_file_size` size parameter to `launch()` that limits to size of files uploaded to the server. This limit applies to each individual file. This parameter can be specified as a string or an integer (corresponding to the size in bytes). + +The following code snippet sets a max file size of 5 megabytes. + +```python +import gradio as gr + +demo = gr.Interface(lambda x: x, "image", "image") + +demo.launch(max_file_size="5mb") +# or +demo.launch(max_file_size=5 * gr.FileSize.MB) +``` + +![max_file_size_upload](https://github.com/gradio-app/gradio/assets/41651716/7547330c-a082-4901-a291-3f150a197e45) + + +#### Error states can now be cleared + +When a component encounters an error, the error state shown in the UI can now be cleared by clicking on the `x` icon in the top right of the component. This applies to all types of errors, whether it's raised in the UI or the server. + +![error_modal_calculator](https://github.com/gradio-app/gradio/assets/41651716/16cb071c-accd-45a6-9c18-0dea27d4bd98) + + Thanks @freddyaboulton! + +### Features + +- [#8092](https://github.com/gradio-app/gradio/pull/8092) [`659d3c5`](https://github.com/gradio-app/gradio/commit/659d3c51ae8591b8c90879f17b2b10d1d79cb331) - chore(deps): update dependency iframe-resizer to v4.3.11. Thanks @renovate! +- [#8067](https://github.com/gradio-app/gradio/pull/8067) [`0fb058e`](https://github.com/gradio-app/gradio/commit/0fb058ec232bfaceb24f1515d16a41fa432a1ee8) - Fix the Lite custom element parser so it doesn't add the .code option when the entrypoint file is already specified. Thanks @whitphx! +- [#8051](https://github.com/gradio-app/gradio/pull/8051) [`d665f40`](https://github.com/gradio-app/gradio/commit/d665f409704b4938d57bee6476a2d000617643c8) - Fix custom JS function caller to concat the outputs of a dep to the inputs as the arguments. Thanks @whitphx! +- [#8056](https://github.com/gradio-app/gradio/pull/8056) [`2e469a5`](https://github.com/gradio-app/gradio/commit/2e469a5f99e52a5011a010f46e47dde7bb0c7140) - Using keys to preserve values between reloads. Thanks @aliabid94! +- [#7646](https://github.com/gradio-app/gradio/pull/7646) [`450b8cc`](https://github.com/gradio-app/gradio/commit/450b8cc898f130f15caa3742f65c17b9f7a8f398) - Refactor JS Client. Thanks @hannahblair! +- [#8115](https://github.com/gradio-app/gradio/pull/8115) [`595ebf7`](https://github.com/gradio-app/gradio/commit/595ebf74c5e09ad90fca0ca8a9a312f161a981aa) - Cache an error from app.submit() and show it on frontend. Thanks @whitphx! +- [#8084](https://github.com/gradio-app/gradio/pull/8084) [`1c99570`](https://github.com/gradio-app/gradio/commit/1c99570f3cbf28f020d6e92527754dd4cae3bcdb) - Adjust `View Api` container `z-index`. Thanks @hannahblair! +- [#8107](https://github.com/gradio-app/gradio/pull/8107) [`cbf2d4e`](https://github.com/gradio-app/gradio/commit/cbf2d4ec51a2e0713c53ff678d0bc70117442ec0) - fix typo from #8105. Thanks @abidlabs! +- [#8100](https://github.com/gradio-app/gradio/pull/8100) [`cbdfbdf`](https://github.com/gradio-app/gradio/commit/cbdfbdfc973fa67665911fb5d8cb005a025b0e58) - upgrade `ruff` test dependency to `ruff==0.4.1`. Thanks @abidlabs! +- [#6787](https://github.com/gradio-app/gradio/pull/6787) [`15a7106`](https://github.com/gradio-app/gradio/commit/15a7106a36874310f5ace9cf6e32744069ca1cce) - allow custom component authors to provide custom vite plugins and svelte preprocessors. Thanks @pngwn! +- [#8080](https://github.com/gradio-app/gradio/pull/8080) [`568eeb2`](https://github.com/gradio-app/gradio/commit/568eeb26a90182519f491df34b1bc75ac67a7313) - Fix `gr.Interface.from_pipeline()` to allow audio uploads and to display classification labels correctly. Thanks @whitphx! +- [#8040](https://github.com/gradio-app/gradio/pull/8040) [`32cfa61`](https://github.com/gradio-app/gradio/commit/32cfa614d641b2358ea5d679b30497d1dfbee533) - Remove auto-created files from `gradio cc publish` and other tweaks. Thanks @freddyaboulton! +- [#8117](https://github.com/gradio-app/gradio/pull/8117) [`6864035`](https://github.com/gradio-app/gradio/commit/68640358fe186fe5822a72b7a50d9df5020944eb) - Add session hash to gr request. Thanks @freddyaboulton! +- [#8061](https://github.com/gradio-app/gradio/pull/8061) [`17e83c9`](https://github.com/gradio-app/gradio/commit/17e83c958ebb35b3e122ca486067d1bd5ce33a22) - Docs Reorg and Intro Page. Thanks @aliabd! +- [#8065](https://github.com/gradio-app/gradio/pull/8065) [`5bf61cb`](https://github.com/gradio-app/gradio/commit/5bf61cb15b7a1f8af12c87ae710df07099b5e460) - Hide the scroll bar in WaveformControls when it's not necessary. Thanks @whitphx! +- [#8130](https://github.com/gradio-app/gradio/pull/8130) [`0efd72e`](https://github.com/gradio-app/gradio/commit/0efd72e6085ebf5ec9989b659e0d2369d5a692f6) - Add Analytics for custom components. Thanks @freddyaboulton! +- [#8087](https://github.com/gradio-app/gradio/pull/8087) [`b50a67d`](https://github.com/gradio-app/gradio/commit/b50a67defe1c1ecc0dac324f6bb7aad4599e1271) - Fix `GRADIO_CACHE_EXAMPLES` environment variable to only take effect if `fn` and `outputs` parameters are provided. Thanks @abidlabs! +- [#8093](https://github.com/gradio-app/gradio/pull/8093) [`ac30e07`](https://github.com/gradio-app/gradio/commit/ac30e07f9266f84088a0b8677a259a5b64c037c5) - [HF OAuth] Logout user if oauth token has expired. Thanks @Wauplin! +- [#8063](https://github.com/gradio-app/gradio/pull/8063) [`72f4ca8`](https://github.com/gradio-app/gradio/commit/72f4ca88ab569aae47941b3fb0609e57f2e13a27) - Fix `gr.Label` styling and a11y markup. Thanks @whitphx! +- [#8105](https://github.com/gradio-app/gradio/pull/8105) [`006fa3c`](https://github.com/gradio-app/gradio/commit/006fa3c6d03f4bcb76e6628cc2052ed18dabb988) - improve the documentation for `js` parameter in `Blocks`, `Interface`, `ChatInterface`. Thanks @abidlabs! +- [#8054](https://github.com/gradio-app/gradio/pull/8054) [`176a8a4`](https://github.com/gradio-app/gradio/commit/176a8a4d713246383c760d86fcb964298ee68c6b) - Fix Label component's value change detection to avoid infinite loop dispatching the change event. Thanks @whitphx! +- [#8030](https://github.com/gradio-app/gradio/pull/8030) [`91a7a31`](https://github.com/gradio-app/gradio/commit/91a7a31cd15c6fb7b249d124b874d3e63831d09b) - Store configs per session in the backend. Thanks @aliabid94! + +### Fixes + +- [#8077](https://github.com/gradio-app/gradio/pull/8077) [`d7461aa`](https://github.com/gradio-app/gradio/commit/d7461aab51b08bc899048230c0f79cf38a1b5ff2) - Fix an encoding issue in gradio/components/code.py. Thanks @3210448723! +- [#8075](https://github.com/gradio-app/gradio/pull/8075) [`5d9db89`](https://github.com/gradio-app/gradio/commit/5d9db89aa6a377d7b56b3075a5d6b73f767b319f) - Fix causing Hot Reload (#8070). Thanks @zolgear! +- [#8041](https://github.com/gradio-app/gradio/pull/8041) [`937c858`](https://github.com/gradio-app/gradio/commit/937c8583714216e926606b251bc9225271bdc5a7) - Use orjson to serialize dict including np.array. Thanks @whitphx! +- [#8097](https://github.com/gradio-app/gradio/pull/8097) [`487db7b`](https://github.com/gradio-app/gradio/commit/487db7b5d57e1a1350494efdf37c121cbf627780) - Respect `auth_dependency` parameter in `launch()`. Thanks @abidlabs! +- [#8133](https://github.com/gradio-app/gradio/pull/8133) [`0a42e96`](https://github.com/gradio-app/gradio/commit/0a42e96537ab11b4dc441c5c2780938be7faf464) - Allow users to template the `ImageEditor` when using custom components. Thanks @pngwn! +- [#8066](https://github.com/gradio-app/gradio/pull/8066) [`624f9b9`](https://github.com/gradio-app/gradio/commit/624f9b9477f74a581a6c14119234f9efdfcda398) - make gradio dev tools a local dependency rather than bundling. Thanks @pngwn! + +## 4.27.0 + +### Highlights + +#### Refreshed `ImageEditor` + +The `ImageEditor` component has been refreshed to make it more user-friendly and reliable. + +This release contains a host of improvements to the `ImageEditor` component, that will be of particular interest to those building real-time image editing applications or complex image processing pipelines: + +- Cleaner and more compact interface. +- New option to hide the layer controls for a more minimal UI. +- Improved stability when updating the sources programmatically. +- Improved support for `input`, `upload`, `change` and `apply` events. +- Support for realtime drawing via the `change` event. +- Many bug fixes! + +![output](https://github.com/gradio-app/gradio/assets/12937446/826dde7d-942b-4e1f-9a3e-aa4dc1f74402) + +### Features + +- [#7998](https://github.com/gradio-app/gradio/pull/7998) [`06bdf0e`](https://github.com/gradio-app/gradio/commit/06bdf0eddf59bf79b6b4d1268fc9290955ef2490) - Restore chatbot formatting. Thanks @aliabid94! +- [#7986](https://github.com/gradio-app/gradio/pull/7986) [`05f935c`](https://github.com/gradio-app/gradio/commit/05f935c8d8e5bb7133affc50da8443cad0d4986d) - GRADIO_SHARE Environment Variable. Thanks @cocktailpeanut! +- [#8062](https://github.com/gradio-app/gradio/pull/8062) [`cecd6e4`](https://github.com/gradio-app/gradio/commit/cecd6e4c4accb3ef220284dc54a87510b3503ec9) - Update dependency iframe-resizer to v4.3.10. Thanks @renovate! +- [#8042](https://github.com/gradio-app/gradio/pull/8042) [`92139f3`](https://github.com/gradio-app/gradio/commit/92139f3d7d6b832b649ff1f6c10c87e6fb522cde) - refresh the `ImageEditor` UI. Thanks @pngwn! +- [#8000](https://github.com/gradio-app/gradio/pull/8000) [`a0c2848`](https://github.com/gradio-app/gradio/commit/a0c2848ab510623b29e215f543e935e275ca35c6) - Fix internal server error in HF OAuth workflow. Thanks @Wauplin! +- [#7887](https://github.com/gradio-app/gradio/pull/7887) [`5f0248e`](https://github.com/gradio-app/gradio/commit/5f0248e797af087c7fd0ad35ea7f2bd778a7cc41) - When authenticating with HF OAuth, stay in same tab. Thanks @Wauplin! +- [#8059](https://github.com/gradio-app/gradio/pull/8059) [`074ce38`](https://github.com/gradio-app/gradio/commit/074ce3805ada6ba829c17da3af5f186d9f5f9865) - ensure the `ImageEditor` works correctly with layers and `change` events. Thanks @pngwn! +- [#7845](https://github.com/gradio-app/gradio/pull/7845) [`dbb7373`](https://github.com/gradio-app/gradio/commit/dbb7373dde69d4ed2741942b5a1898f8620cec24) - ensure `ImageEditor` events work as expected. Thanks @pngwn! +- [#7975](https://github.com/gradio-app/gradio/pull/7975) [`c9ddd84`](https://github.com/gradio-app/gradio/commit/c9ddd847d6c57d5efc4e887180d219f2a0b5b98d) - Update the Lite custom element parser. Thanks @whitphx! +- [#8012](https://github.com/gradio-app/gradio/pull/8012) [`299c87c`](https://github.com/gradio-app/gradio/commit/299c87c47717b42387ac323b4c7f6fcab9097b1c) - Document that show_copy_button in gr.Textbox is not visible when show_label=False. Thanks @lappemic! + +### Fixes + +- [#8025](https://github.com/gradio-app/gradio/pull/8025) [`55ef4a5`](https://github.com/gradio-app/gradio/commit/55ef4a52c3d600344d8cf1a667f3f352c52c8e57) - Fixes Chatbot Image Sizing. Thanks @dawoodkhan82! +- [#8014](https://github.com/gradio-app/gradio/pull/8014) [`e10ec6a`](https://github.com/gradio-app/gradio/commit/e10ec6a6124cecb2454266609b951d4768675e50) - Fix multimode interface double box on file upload. Thanks @TALLEC-Scott! +- [#8028](https://github.com/gradio-app/gradio/pull/8028) [`6fafce0`](https://github.com/gradio-app/gradio/commit/6fafce06704ab8f2cd5fe6fbdb58b842e144e44d) - ensure maps are correctly shallow cloned when updating state. Thanks @pngwn! +- [#7974](https://github.com/gradio-app/gradio/pull/7974) [`79e0aa8`](https://github.com/gradio-app/gradio/commit/79e0aa81c94e755faa6e85d76ac5d5a666313e6a) - Fix heartbeat in the js client to be Lite compatible. Thanks @whitphx! +- [#8002](https://github.com/gradio-app/gradio/pull/8002) [`8903415`](https://github.com/gradio-app/gradio/commit/8903415e49b1526d31ff454b2235ea238e319c2c) - Add show_progress prop to Upload Component to bring back upload progress animation. Thanks @freddyaboulton! +- [#8046](https://github.com/gradio-app/gradio/pull/8046) [`d6c289b`](https://github.com/gradio-app/gradio/commit/d6c289b34668f0011676737ee8edb4cb62b0620a) - round [x, y, w, h] before cropping to avoid unexpected interpolation on pixel values. Thanks @ernestchu! +- [#8011](https://github.com/gradio-app/gradio/pull/8011) [`f17d1a0`](https://github.com/gradio-app/gradio/commit/f17d1a0a6fa61869dc78fb12fb153f6b7abaa5f5) - Add an explicit dependency of `urllib3~=2.0` and update `processing_utils.save_url_to_cache` to use `urllib3` for Lite support. Thanks @whitphx! +- [#7981](https://github.com/gradio-app/gradio/pull/7981) [`c1df2f8`](https://github.com/gradio-app/gradio/commit/c1df2f818ce285a8e7871d43b76c4959beb00956) - Fix example loading for custom components. Thanks @freddyaboulton! +- [#8026](https://github.com/gradio-app/gradio/pull/8026) [`522daf7`](https://github.com/gradio-app/gradio/commit/522daf787a8427b92ed769ccea3c71a490cbca29) - Patch `async_save_url_to_cache` for Lite. Thanks @whitphx! +- [#7959](https://github.com/gradio-app/gradio/pull/7959) [`2a5cb97`](https://github.com/gradio-app/gradio/commit/2a5cb978240960fd8b150a1eae6ae8328a5c0c59) - ensure `ImageEditor` always draws at the correct position. Thanks @hrrbay! +- [#8050](https://github.com/gradio-app/gradio/pull/8050) [`0424c75`](https://github.com/gradio-app/gradio/commit/0424c759d8a790529406229c52f47cb469e78d3e) - Update `typer` to drop `[all]` as it is no longer needed. Thanks @joennlae! + +## 4.26.0 + +### Features + +- [#7811](https://github.com/gradio-app/gradio/pull/7811) [`b43055b`](https://github.com/gradio-app/gradio/commit/b43055b297dfe1aa56fda4cd722d878f7297a1b5) - Lite playground design changes. Thanks @aliabd! +- [#7850](https://github.com/gradio-app/gradio/pull/7850) [`2bae1cf`](https://github.com/gradio-app/gradio/commit/2bae1cfbd41ed8ae3eea031a64899611a22a1821) - Adds an "API Recorder" to the view API page, some internal methods have been made async. Thanks @abidlabs! +- [#7936](https://github.com/gradio-app/gradio/pull/7936) [`b165193`](https://github.com/gradio-app/gradio/commit/b165193902985b77a732ed703423ebebeaf0da27) - Restore Markdown formatting for Chatbots, MarkdownCode. Thanks @aliabid94! +- [#7912](https://github.com/gradio-app/gradio/pull/7912) [`a4782f7`](https://github.com/gradio-app/gradio/commit/a4782f7a09ed69ebfa9953b029bd4ffa1c60220a) - Allow displaying gr.Code examples by their filename if value is a tuple. Thanks @freddyaboulton! +- [#7938](https://github.com/gradio-app/gradio/pull/7938) [`8250a1a`](https://github.com/gradio-app/gradio/commit/8250a1a0dfb8219943beef500ddf29e0fcc4e38d) - Handle the case of multiple headers when constructing root url. Thanks @abidlabs! +- [#7932](https://github.com/gradio-app/gradio/pull/7932) [`b78129d`](https://github.com/gradio-app/gradio/commit/b78129d90fc800e6987226114adc2f062dc403ec) - Use asyncio.Event to stop stream in heartbeat route. Thanks @freddyaboulton! +- [#7961](https://github.com/gradio-app/gradio/pull/7961) [`eae97c2`](https://github.com/gradio-app/gradio/commit/eae97c29ce8bb81670e1ee0533efa02afa38cc23) - Fix task bug in python 3.9. Thanks @freddyaboulton! +- [#7967](https://github.com/gradio-app/gradio/pull/7967) [`1a7851c`](https://github.com/gradio-app/gradio/commit/1a7851c5125b7dd2bccf9f3f1ead38be5da2c9ad) - Fix handling of single font name in theme. Thanks @sd109! + +### Fixes + +- [#7963](https://github.com/gradio-app/gradio/pull/7963) [`1eb4c20`](https://github.com/gradio-app/gradio/commit/1eb4c2012065c678d722477f3555ec45a9e78c14) - ensure kwargs are always in sync across the whole application. Thanks @pngwn! +- [#7916](https://github.com/gradio-app/gradio/pull/7916) [`7c9a964`](https://github.com/gradio-app/gradio/commit/7c9a964ac6b9c2231c7439758e87b4fac56db99f) - Fix programmatic tab selection. Thanks @aliabid94! +- [#7754](https://github.com/gradio-app/gradio/pull/7754) [`057d171`](https://github.com/gradio-app/gradio/commit/057d171c717737a522b55b0d66962f9c62dd87c3) - Correctly handle device selection in `Image` and `ImageEditor`. Thanks @hannahblair! +- [#7756](https://github.com/gradio-app/gradio/pull/7756) [`b729f10`](https://github.com/gradio-app/gradio/commit/b729f10321b571e7de418596d1cf605773b0b8e6) - Bugfix: Fix color and size keys in theme builder app. Thanks @shubhamofbce! +- [#7918](https://github.com/gradio-app/gradio/pull/7918) [`be46ab1`](https://github.com/gradio-app/gradio/commit/be46ab1213b32a40e4ac1c399499d69eaf6ec0f1) - ensure entire dropdown is clickable. Thanks @dawoodkhan82! +- [#7966](https://github.com/gradio-app/gradio/pull/7966) [`bad3836`](https://github.com/gradio-app/gradio/commit/bad383645ec659433086b174f1ec5a7e2669d43b) - Adding hint `list[list]` for example parameter. Thanks @WH-Yoshi! +- [#7817](https://github.com/gradio-app/gradio/pull/7817) [`867ff16`](https://github.com/gradio-app/gradio/commit/867ff16cd47ceb5bbf076503538a262b6fe64638) - Trigger the "clear" event of Image Editor. Thanks @uebian! +- [#7935](https://github.com/gradio-app/gradio/pull/7935) [`919afff`](https://github.com/gradio-app/gradio/commit/919afffcee87bee25a6905c488484936df92189d) - Adds a Guide on deploying Gradio apps with Docker. Thanks @abidlabs! +- [#7915](https://github.com/gradio-app/gradio/pull/7915) [`efd9524`](https://github.com/gradio-app/gradio/commit/efd95245081f5657b1d13f34038205fc8791c1f7) - Fix gr.CheckboxGroup change event. Thanks @freddyaboulton! +- [#7926](https://github.com/gradio-app/gradio/pull/7926) [`9666854`](https://github.com/gradio-app/gradio/commit/966685479078f59430b3bced7e6068eb8157c003) - Fixes streaming event race condition. Thanks @aliabid94! + +## 4.25.0 + +### Highlights + +#### Automatically delete state after user has disconnected from the webpage ([#7829](https://github.com/gradio-app/gradio/pull/7829) [`6a4bf7a`](https://github.com/gradio-app/gradio/commit/6a4bf7abe29059dbdc6a342e0366fdaa2e4120ee)) + +Gradio now automatically deletes `gr.State` variables stored in the server's RAM when users close their browser tab. +The deletion will happen 60 minutes after the server detected a disconnect from the user's browser. +If the user connects again in that timeframe, their state will not be deleted. + +Additionally, Gradio now includes a `Blocks.unload()` event, allowing you to run arbitrary cleanup functions when users disconnect (this does not have a 60 minute delay). +You can think of the `unload` event as the opposite of the `load` event. + + +```python +with gr.Blocks() as demo: + gr.Markdown( +"""# State Cleanup Demo +🖼️ Images are saved in a user-specific directory and deleted when the users closes the page via demo.unload. +""") + with gr.Row(): + with gr.Column(scale=1): + with gr.Row(): + img = gr.Image(label="Generated Image", height=300, width=300) + with gr.Row(): + gen = gr.Button(value="Generate") + with gr.Row(): + history = gr.Gallery(label="Previous Generations", height=500, columns=10) + state = gr.State(value=[], delete_callback=lambda v: print("STATE DELETED")) + + demo.load(generate_random_img, [state], [img, state, history]) + gen.click(generate_random_img, [state], [img, state, history]) + demo.unload(delete_directory) + + +demo.launch(auth=lambda user,pwd: True, + auth_message="Enter any username and password to continue") +``` + + Thanks @freddyaboulton! + +### Features + +- [#7863](https://github.com/gradio-app/gradio/pull/7863) [`024b44c`](https://github.com/gradio-app/gradio/commit/024b44c553e73f1d6c00d4c8cf12ae38181a454d) - Add support for lazy caching of examples, as well as add `GRADIO_CACHE_EXAMPLES` env variable. Thanks @abidlabs! +- [#7892](https://github.com/gradio-app/gradio/pull/7892) [`c7933ff`](https://github.com/gradio-app/gradio/commit/c7933ffedb3e2b952152f7d3ce49de2e2da5cc07) - Suppress printing "Running on local URL:" when quiet is set. Thanks @dnoliver! +- [#7869](https://github.com/gradio-app/gradio/pull/7869) [`b9dbcf7`](https://github.com/gradio-app/gradio/commit/b9dbcf7aa22fe9a19edbc0c52d46a973d8d57ad4) - Make buttons in `gr.ChatInterface` more mobile-friendly. Thanks @abidlabs! +- [#7875](https://github.com/gradio-app/gradio/pull/7875) [`e6d051d`](https://github.com/gradio-app/gradio/commit/e6d051dc8a497fdd6b4cfbd57efd4c8015b97a66) - Paste Images into MultimodalTextbox. Thanks @abidlabs! +- [#7893](https://github.com/gradio-app/gradio/pull/7893) [`f42d3e2`](https://github.com/gradio-app/gradio/commit/f42d3e29c7b8cdedd7aea75cffce81857db28eeb) - Make internal event handlers of gr.Interface and gr.ChatInterface async. Thanks @freddyaboulton! + +### Fixes + +- [#7886](https://github.com/gradio-app/gradio/pull/7886) [`ccdab9b`](https://github.com/gradio-app/gradio/commit/ccdab9b7e729c438649075d7d54afc9a91183677) - logout route deleting cookie fix. Thanks @MichaelPerger! +- [#7888](https://github.com/gradio-app/gradio/pull/7888) [`946487c`](https://github.com/gradio-app/gradio/commit/946487cf8e477cbf8d6fad4e772ff574a21782c3) - Cache view_api info in server and python client. Thanks @freddyaboulton! +- [#7881](https://github.com/gradio-app/gradio/pull/7881) [`5e66e01`](https://github.com/gradio-app/gradio/commit/5e66e01abc4e2e90bd51f0cb9a41e05157cb0df4) - Fix audio streaming out. Thanks @aliabid94! +- [#7865](https://github.com/gradio-app/gradio/pull/7865) [`7bbc3b6`](https://github.com/gradio-app/gradio/commit/7bbc3b62bf85af2d2230e5f7539efb7f1f0007a1) - JS functions break entire app if there's no input, fixed. Thanks @aliabid94! + +## 4.24.0 + +### Features + +- [#7849](https://github.com/gradio-app/gradio/pull/7849) [`7af3cd7`](https://github.com/gradio-app/gradio/commit/7af3cd7ccb8cc556fd2b290af0bed1c7ec07d174) - Adds a `placeholder` argument to `gr.Chatbot`. Thanks @abidlabs! +- [#7835](https://github.com/gradio-app/gradio/pull/7835) [`ee804b2`](https://github.com/gradio-app/gradio/commit/ee804b2d567b4381ef90b1f035d42fe6bb2506bc) - Stop running iterators when js client disconnects. Thanks @freddyaboulton! +- [#7852](https://github.com/gradio-app/gradio/pull/7852) [`72661e3`](https://github.com/gradio-app/gradio/commit/72661e3391a432ccd77fb3100e69fbdf95093931) - Revert the minify setting in vite.config.js which was mistakingly introduced in #6261. Thanks @whitphx! +- [#7818](https://github.com/gradio-app/gradio/pull/7818) [`1a7c8d3`](https://github.com/gradio-app/gradio/commit/1a7c8d32239d1e304e9f9063d7e2301c4f081b54) - Stop importing gradio.ipython_ext in Wasm mode. Thanks @whitphx! +- [#7830](https://github.com/gradio-app/gradio/pull/7830) [`75a2bf7`](https://github.com/gradio-app/gradio/commit/75a2bf745dee3b9e9521dbcf5b74af8bd53ba12f) - Add guide on Client state and and fix default values of components. Thanks @abidlabs! +- [#7823](https://github.com/gradio-app/gradio/pull/7823) [`e0a8b7f`](https://github.com/gradio-app/gradio/commit/e0a8b7fa2c60591f7fc6861707f65bf85f4ad27f) - Exclude `typer` from the requirements list for Wasm env and fix `gradio.cli` not to be imported. Thanks @whitphx! +- [#7851](https://github.com/gradio-app/gradio/pull/7851) [`e3b1236`](https://github.com/gradio-app/gradio/commit/e3b12369b71e2e3b6b25225f4414d1a28d9faf7d) - Lazy-import pandas. Thanks @whitphx! +- [#7840](https://github.com/gradio-app/gradio/pull/7840) [`ecf5c52`](https://github.com/gradio-app/gradio/commit/ecf5c524c23f76119e5b2e17f7a592555fa6557b) - Fix gradio/components/dataframe.py not to import `pandas.io`. Thanks @whitphx! +- [#7801](https://github.com/gradio-app/gradio/pull/7801) [`05db0c4`](https://github.com/gradio-app/gradio/commit/05db0c4a59b7a2c4f6297b5007946f5c7b8df1b1) - Refactor CORS Middleware to be much faster. Thanks @abidlabs! +- [#7810](https://github.com/gradio-app/gradio/pull/7810) [`425fd1c`](https://github.com/gradio-app/gradio/commit/425fd1ca9d83daf58fd95f3a1e3d566d06064ac3) - Benchmark fix test. Thanks @aliabid94! + +### Fixes + +- [#7795](https://github.com/gradio-app/gradio/pull/7795) [`1c257f5`](https://github.com/gradio-app/gradio/commit/1c257f5ebce06e61cd17fc3c0463757f8bc88930) - Bugfix: `..` in filename throwing error while loading in output. Thanks @shubhamofbce! +- [#7862](https://github.com/gradio-app/gradio/pull/7862) [`0e125d7`](https://github.com/gradio-app/gradio/commit/0e125d7befe436509af6a41b5c92de0ac6d6057c) - Trigger click event from `gr.DownloadButton` even when no file is present. Thanks @abidlabs! +- [#7848](https://github.com/gradio-app/gradio/pull/7848) [`8d7b3ca`](https://github.com/gradio-app/gradio/commit/8d7b3caebd8f95b1372f8412cadbb5862766c365) - Multimodal Textbox Loading + other fixes. Thanks @dawoodkhan82! + +## 4.23.0 + +### Features + +- [#7782](https://github.com/gradio-app/gradio/pull/7782) [`2c8cd0a`](https://github.com/gradio-app/gradio/commit/2c8cd0a73d5c113853ff96ee2da57be12774a238) - Lazy-import altair. Thanks @whitphx! +- [#7800](https://github.com/gradio-app/gradio/pull/7800) [`b0a3ea9`](https://github.com/gradio-app/gradio/commit/b0a3ea951c06d4f3ff2755b567629fe988a3e30d) - Small fix to client.view_api() in the case of default file values. Thanks @abidlabs! +- [#7684](https://github.com/gradio-app/gradio/pull/7684) [`755157f`](https://github.com/gradio-app/gradio/commit/755157f99c2961f2e5caeaa9b76d248b4225ea8f) - Do not reload code inside gr.NO_RELOAD context. Thanks @freddyaboulton! +- [#7770](https://github.com/gradio-app/gradio/pull/7770) [`dd3e363`](https://github.com/gradio-app/gradio/commit/dd3e363261ae63823fb1672443ff2d31c63d656f) - Fail CI if lint or typecheck fails. Thanks @abidlabs! +- [#7796](https://github.com/gradio-app/gradio/pull/7796) [`aad209f`](https://github.com/gradio-app/gradio/commit/aad209f0c0faa0bf3e39d0c8624f972118b32830) - Decrease latency: do not run pre and postprocess in threadpool. Thanks @freddyaboulton! +- [#7744](https://github.com/gradio-app/gradio/pull/7744) [`d831040`](https://github.com/gradio-app/gradio/commit/d8310400326adbf8d036333f4f1b7df68b7043f6) - Remove Ruff and Uvicorn in Wasm env. Thanks @whitphx! +- [#7732](https://github.com/gradio-app/gradio/pull/7732) [`2efb05e`](https://github.com/gradio-app/gradio/commit/2efb05ed99a8a3575aab0a6c14a8d8b91f4e9ed7) - Adds support for kwargs and default arguments in the python client, and improves how parameter information is displayed in the "view API" page. Thanks @abidlabs! +- [#7661](https://github.com/gradio-app/gradio/pull/7661) [`c62a57e`](https://github.com/gradio-app/gradio/commit/c62a57e7f8f2f6dad0110d06e915c48e7f628073) - Convert Docs Demos to Lite. Thanks @aliabd! +- [#7814](https://github.com/gradio-app/gradio/pull/7814) [`f7df92f`](https://github.com/gradio-app/gradio/commit/f7df92f3f3ff4bb1300ed6d6eb1828615a728acd) - Improve UX of non-interactive slider. Thanks @Pythongor! +- [#7789](https://github.com/gradio-app/gradio/pull/7789) [`ff6bf3e`](https://github.com/gradio-app/gradio/commit/ff6bf3ec8f418a7222ca80240c75a1735202e5cc) - Remove the aiohttp mock from the Wasm worker as it's removed in https://github.com/gradio-app/gradio/pull/5244. Thanks @whitphx! + +### Fixes + +- [#7783](https://github.com/gradio-app/gradio/pull/7783) [`43ae23f`](https://github.com/gradio-app/gradio/commit/43ae23f092927af2defa8104ee476da012a7b4fa) - Fix accidental bug that prevented custom textboxes from being passed to chatinterface. Thanks @freddyaboulton! +- [#7762](https://github.com/gradio-app/gradio/pull/7762) [`e78bca4`](https://github.com/gradio-app/gradio/commit/e78bca4f3789b5b229f6e5f402a1028c7b3bad33) - Trigger input event for Radio even when radio is output component. Thanks @freddyaboulton! +- [#7787](https://github.com/gradio-app/gradio/pull/7787) [`781678b`](https://github.com/gradio-app/gradio/commit/781678b3ac0e44ea1401ff55af3e98b474cf36ec) - Fix root url resolution from `x_forwarded_host` headers. Thanks @abidlabs! +- [#7794](https://github.com/gradio-app/gradio/pull/7794) [`cf98c7e`](https://github.com/gradio-app/gradio/commit/cf98c7ed18c0211b89e8eed81a5fb61c34b705c3) - Adds trigger_mode to gr.on. Use it to set trigger_model="always_last" for live interfaces. Thanks @freddyaboulton! +- [#7761](https://github.com/gradio-app/gradio/pull/7761) [`ca42748`](https://github.com/gradio-app/gradio/commit/ca42748590536e1d940b44ec7c9b6ea402905707) - Ensure `paginate` updates when samples value changes in `Dataset`. Thanks @hannahblair! + +## 4.22.0 + +### Features + +- [#7743](https://github.com/gradio-app/gradio/pull/7743) [`a2badf1`](https://github.com/gradio-app/gradio/commit/a2badf151e3f4b1b5ac80621ee189870a71893c5) - Migrate to Storybook 8. Thanks @hannahblair! +- [#7680](https://github.com/gradio-app/gradio/pull/7680) [`853d945`](https://github.com/gradio-app/gradio/commit/853d945e75c93a4b380b57dc6408f91d0f2e648f) - Add format parameter to gr.Image, gr.Gallery, gr.AnnotatedImage, gr.Plot to control format to save image files in. Thanks @dfl! +- [#7691](https://github.com/gradio-app/gradio/pull/7691) [`84f81fe`](https://github.com/gradio-app/gradio/commit/84f81fec9287b041203a141bbf2852720f7d199c) - Closing stream from the backend. Thanks @aliabid94! +- [#7420](https://github.com/gradio-app/gradio/pull/7420) [`15da39f`](https://github.com/gradio-app/gradio/commit/15da39fca01d09a30cf47e7e72d7efa5052f61f8) - Multimodal Textbox (Chat Input Component). Thanks @dawoodkhan82! +- [#7712](https://github.com/gradio-app/gradio/pull/7712) [`aca4892`](https://github.com/gradio-app/gradio/commit/aca4892ea591d089e3121ffd144ad6767e0bad71) - More fixes for `gr.load()` as well as a tweaking the `__str__` and `__repr__` methods of components. Thanks @abidlabs! +- [#7660](https://github.com/gradio-app/gradio/pull/7660) [`f739bef`](https://github.com/gradio-app/gradio/commit/f739bef6c70a2b012dd896456709eae5ee4de7d5) - Add Playground to Lite Custom Element. Thanks @aliabd! +- [#7710](https://github.com/gradio-app/gradio/pull/7710) [`0a3870d`](https://github.com/gradio-app/gradio/commit/0a3870d52b5efc64b2d1f9a8c7314a3a8b48b90a) - Call handle_darkmode() even if `window.__gradio_mode__ === "website"` but enforce the light theme. Thanks @whitphx! +- [#7572](https://github.com/gradio-app/gradio/pull/7572) [`7d3c868`](https://github.com/gradio-app/gradio/commit/7d3c868d0a67fe7cba6df412bd5f34ec8a5d289d) - Detailed error message for wasm_utils.get_registered_app(). Thanks @whitphx! +- [#7734](https://github.com/gradio-app/gradio/pull/7734) [`04857bc`](https://github.com/gradio-app/gradio/commit/04857bc524569fad426604046d5a522c3e87ca56) - Add `allowed_paths`, `blocked_paths`, `show_error`, and `favicon_path` parameters to `gr.mount_gradio_app`. Thanks @abidlabs! +- [#7667](https://github.com/gradio-app/gradio/pull/7667) [`aba4470`](https://github.com/gradio-app/gradio/commit/aba44707af20b78a7b87f5f7bd3f189d971afc71) - Add `auth`, `auth_message`, and `root_path` parameters to `mount_gradio_app`. Thanks @abidlabs! + +### Fixes + +- [#7716](https://github.com/gradio-app/gradio/pull/7716) [`188b86b`](https://github.com/gradio-app/gradio/commit/188b86b76669a411ee70233e16bf181786a5909c) - Add support for object-detection models in `gr.load()`. Thanks @abidlabs! +- [#7564](https://github.com/gradio-app/gradio/pull/7564) [`5d1e8da`](https://github.com/gradio-app/gradio/commit/5d1e8dae5ac23f605c3b5f41dbe18751dff380a0) - batch UI updates on a per frame basis. Thanks @pngwn! +- [#7718](https://github.com/gradio-app/gradio/pull/7718) [`6390d0b`](https://github.com/gradio-app/gradio/commit/6390d0bf6c2be0aefa56102dd029f25161bfebc3) - Add support for python client connecting to gradio apps running with self-signed SSL certificates. Thanks @abidlabs! +- [#7697](https://github.com/gradio-app/gradio/pull/7697) [`a1c24db`](https://github.com/gradio-app/gradio/commit/a1c24dbf2ecace4db8692b7ed434f1ebfc4de75a) - Fix OAuth + fix OAuth documentation + undocument logout button. Thanks @Wauplin! +- [#7623](https://github.com/gradio-app/gradio/pull/7623) [`c9aba8d`](https://github.com/gradio-app/gradio/commit/c9aba8d8a5886ef6456479154a14c69188c20413) - Fixes: gr.Markdown is not updated properly when it has an image tag. Thanks @dawoodkhan82! +- [#7704](https://github.com/gradio-app/gradio/pull/7704) [`95c6bc8`](https://github.com/gradio-app/gradio/commit/95c6bc897be14e28a568242ea31516bfe2df13e8) - Fix flagged files and ensure that flagging_mode="auto" saves output components as well. Thanks @abidlabs! +- [#7706](https://github.com/gradio-app/gradio/pull/7706) [`bc61ff6`](https://github.com/gradio-app/gradio/commit/bc61ff6b1603eedf3111f1b5c3d2751629902d98) - Several fixes to `gr.load`. Thanks @abidlabs! +- [#7733](https://github.com/gradio-app/gradio/pull/7733) [`7f9b291`](https://github.com/gradio-app/gradio/commit/7f9b291922751f92e6296aa6b138124c546ba497) - Cast button value as string in postprocess. Thanks @heaversm! +- [#7691](https://github.com/gradio-app/gradio/pull/7691) [`84f81fe`](https://github.com/gradio-app/gradio/commit/84f81fec9287b041203a141bbf2852720f7d199c) - Fix race condition between state updates and loading_status updates. Thanks @aliabid94! +- [#7709](https://github.com/gradio-app/gradio/pull/7709) [`f67759d`](https://github.com/gradio-app/gradio/commit/f67759dcee665cfd7c44f102f36ab23128ee2c2c) - Fix wasm_proxied_mount_css to not reuse an existing style element. Thanks @whitphx! +- [#7703](https://github.com/gradio-app/gradio/pull/7703) [`598ad7b`](https://github.com/gradio-app/gradio/commit/598ad7baf722181a25200e9a8ba858bae39c7d82) - fix dev mode. Thanks @pngwn! +- [#7707](https://github.com/gradio-app/gradio/pull/7707) [`28342a2`](https://github.com/gradio-app/gradio/commit/28342a204001c98b86628635582fcf54aa0855aa) - Fix httpx timeout issues. Thanks @freddyaboulton! + +## 4.21.0 + +### Features + +- [#7577](https://github.com/gradio-app/gradio/pull/7577) [`7c66a29`](https://github.com/gradio-app/gradio/commit/7c66a29dea0e4e56106d95d93972225b886a9df3) - Fix the Lite custom element to initialize the app in the connected callback and dispose the app in the disconnected callback. Thanks @whitphx! +- [#7620](https://github.com/gradio-app/gradio/pull/7620) [`1a4b089`](https://github.com/gradio-app/gradio/commit/1a4b089e78d1efff47b4606daebde02e9b246ed4) - Refactor `example_inputs()`, separating its logic into two separate methods: `example_payload()` and `example_value()`. Thanks @abidlabs! +- [#7265](https://github.com/gradio-app/gradio/pull/7265) [`6ebf0ce`](https://github.com/gradio-app/gradio/commit/6ebf0cedf5b357a14a8f5a0a9add849924f59ab0) - Add support for diffuser pipelines in gr.Interface.from_pipeline(). Thanks @shubhamofbce! +- [#7650](https://github.com/gradio-app/gradio/pull/7650) [`048364c`](https://github.com/gradio-app/gradio/commit/048364c6b0ffe790086c5e2fee5fab1c63c167a0) - downgrade contourpy. Thanks @abidlabs! +- [#7571](https://github.com/gradio-app/gradio/pull/7571) [`2edba13`](https://github.com/gradio-app/gradio/commit/2edba133e2a3b58b953ac0894d486faf2819beeb) - Fix `CrossOriginWorkerMaker` to cache the blob URL. Thanks @whitphx! + +### Fixes + +- [#7643](https://github.com/gradio-app/gradio/pull/7643) [`9482c7a`](https://github.com/gradio-app/gradio/commit/9482c7a3d2d7b6abd81b786100ddc385133095a5) - fix: redundant meta tags that are unwanted. Thanks @qkdxorjs1002! +- [#7628](https://github.com/gradio-app/gradio/pull/7628) [`ba8cc48`](https://github.com/gradio-app/gradio/commit/ba8cc48b136e701717c0c5d15ce410b4f8bf6a21) - feature detect CSSStylesheet. Thanks @pngwn! +- [#7575](https://github.com/gradio-app/gradio/pull/7575) [`d0688b3`](https://github.com/gradio-app/gradio/commit/d0688b3c25feabb4fc7dfa0ab86086b3af7eb337) - Files should now be supplied as `file(...)` in the Client, and some fixes to `gr.load()` as well. Thanks @abidlabs! +- [#7624](https://github.com/gradio-app/gradio/pull/7624) [`a22f3e0`](https://github.com/gradio-app/gradio/commit/a22f3e062d8d30f630e0cf8e373ad7cb0f99330f) - Fixing root path issue with subpath being repeated twice. Thanks @abidlabs! +- [#7638](https://github.com/gradio-app/gradio/pull/7638) [`b3b0ea3`](https://github.com/gradio-app/gradio/commit/b3b0ea3e111ef8a3cdd82ecc310a4accc6af6120) - Add --python-path, --pip-path, --gradio-path CLI arguments to let custom component developers control which executable is used. Thanks @freddyaboulton! +- [#7618](https://github.com/gradio-app/gradio/pull/7618) [`0ae1e44`](https://github.com/gradio-app/gradio/commit/0ae1e4486c06e06bb7a4bad45d58d14f1f8d1b94) - Control which files get moved to cache with gr.set_static_paths. Thanks @freddyaboulton! +- [#7641](https://github.com/gradio-app/gradio/pull/7641) [`cb3999e`](https://github.com/gradio-app/gradio/commit/cb3999eec707609d5371ef3bad1152f55ed35b2f) - Use `x-forwarded-host` header to determine the root url, and let users provide a full `root_path` to override the automatically determined root url. Thanks @abidlabs! + +## 4.20.1 + +### Features + +- [#7625](https://github.com/gradio-app/gradio/pull/7625) [`8181695`](https://github.com/gradio-app/gradio/commit/8181695e70187e8bc2bf7518697098c8d1b9843d) - image upload fix. Thanks [@dawoodkhan82](https://github.com/dawoodkhan82)! + +## 4.20.0 + +### Features + +- [#7557](https://github.com/gradio-app/gradio/pull/7557) [`4d5789e`](https://github.com/gradio-app/gradio/commit/4d5789e905b5915f3d03fae2ac1d38a54c3e67ea) - Allow mounted Gradio apps to work with external / arbitrary authentication providers. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7614](https://github.com/gradio-app/gradio/pull/7614) [`355ed66`](https://github.com/gradio-app/gradio/commit/355ed666d9f6da018e8a03cdc6e367d00e6b10fb) - Fix the `root_url` logic for streaming files. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7119](https://github.com/gradio-app/gradio/pull/7119) [`9c6de6d`](https://github.com/gradio-app/gradio/commit/9c6de6d85092c1c9378d7f81e5ec734221536812) - Upgrade Pyodide to 0.25.0. Thanks [@whitphx](https://github.com/whitphx)! +- [#7447](https://github.com/gradio-app/gradio/pull/7447) [`a57e34e`](https://github.com/gradio-app/gradio/commit/a57e34ef87d24f40f09380b7b71a052f120a19fe) - Add delete_cache parameter to gr.Blocks to delete files created by app on shutdown. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7547](https://github.com/gradio-app/gradio/pull/7547) [`98aa808`](https://github.com/gradio-app/gradio/commit/98aa8082dd228dd481e05c888adb2e91b04f8f48) - Add `/logout` functionality for Gradio auth. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7407](https://github.com/gradio-app/gradio/pull/7407) [`375bfd2`](https://github.com/gradio-app/gradio/commit/375bfd28d2def576b4e1c12e0a60127b7419e826) - Fix server_messages.py to use the patched BaseModel class for Wasm env. Thanks [@aliabid94](https://github.com/aliabid94)! +- [#7516](https://github.com/gradio-app/gradio/pull/7516) [`3645da5`](https://github.com/gradio-app/gradio/commit/3645da5f1e5539668cad75071a82fdd78f50263c) - Fix incorrect relative mouse coordinates for `Gallery` preview overlay. Thanks [@MMP0](https://github.com/MMP0)! +- [#7528](https://github.com/gradio-app/gradio/pull/7528) [`eda33b3`](https://github.com/gradio-app/gradio/commit/eda33b3763897a542acf298e523fa493dc655aee) - Refactors `get_fetchable_url_or_file()` to remove it from the frontend. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7340](https://github.com/gradio-app/gradio/pull/7340) [`4b0d589`](https://github.com/gradio-app/gradio/commit/4b0d58933057432758a54169a360eb352903d6b4) - chore(deps): update all non-major dependencies. Thanks [@renovate](https://github.com/apps/renovate)! +- [#7345](https://github.com/gradio-app/gradio/pull/7345) [`561579d`](https://github.com/gradio-app/gradio/commit/561579d9b7b860c5cb3f8131e0dced0c8114463f) - fix-tests. Thanks [@pngwn](https://github.com/pngwn)! +- [#7518](https://github.com/gradio-app/gradio/pull/7518) [`bd2c695`](https://github.com/gradio-app/gradio/commit/bd2c69532801f9a0626cd1192de158bde6068b9a) - Adds a `gr.DownloadButton` component. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7598](https://github.com/gradio-app/gradio/pull/7598) [`d3384cb`](https://github.com/gradio-app/gradio/commit/d3384cb926ca9bab7ccbf910547ec8a0c361531f) - Prevent additional paths that can trigger credential leakage on Windows. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7544](https://github.com/gradio-app/gradio/pull/7544) [`f84720c`](https://github.com/gradio-app/gradio/commit/f84720cd76e5bf3321f06383642bdb246a9a36e2) - Prevent paths beginning with `//` or `\\`. Thanks [@abidlabs](https://github.com/abidlabs)! + +### Fixes + +- [#7565](https://github.com/gradio-app/gradio/pull/7565) [`1c22123`](https://github.com/gradio-app/gradio/commit/1c22123268da5f7fcf6e7c74ee0bf6b225c7aa11) - Fixes method to resolve the `root` URLs. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7559](https://github.com/gradio-app/gradio/pull/7559) [`26356a6`](https://github.com/gradio-app/gradio/commit/26356a623c4196f48ca236d973a597831743cdb8) - Fixes: Invalid file_type breaks drag and drop. Thanks [@dawoodkhan82](https://github.com/dawoodkhan82)! +- [#7555](https://github.com/gradio-app/gradio/pull/7555) [`fc4c2db`](https://github.com/gradio-app/gradio/commit/fc4c2dbd994c49e37296978da1cb85e424080d1c) - Allow Python Client to upload/download files when connecting to Gradio apps with auth enabled. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7510](https://github.com/gradio-app/gradio/pull/7510) [`08c2d49`](https://github.com/gradio-app/gradio/commit/08c2d491ecac83268ad20f05769ef7e1335089e2) - when adding custom head html, ensure there are no duplicate meta tags. Thanks [@qkdxorjs1002](https://github.com/qkdxorjs1002)! +- [#7545](https://github.com/gradio-app/gradio/pull/7545) [`1fa2e91`](https://github.com/gradio-app/gradio/commit/1fa2e914ca4663a47743cc34acdf98c7fcc469c8) - Fixes `auth_message` so that it correctly renders HTML. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7599](https://github.com/gradio-app/gradio/pull/7599) [`f26aba0`](https://github.com/gradio-app/gradio/commit/f26aba00a71a5b4eff60c37580c8d25f9bc048da) - Prevent audio speeding up when trimming. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7567](https://github.com/gradio-app/gradio/pull/7567) [`e340894`](https://github.com/gradio-app/gradio/commit/e340894b1cf2f44dd45e597fd8d9e547f408fbb3) - Quick fix: custom dropdown value. Thanks [@dawoodkhan82](https://github.com/dawoodkhan82)! + +## 4.19.2 + +### Features + +- [#7495](https://github.com/gradio-app/gradio/pull/7495) [`ddd4d3e`](https://github.com/gradio-app/gradio/commit/ddd4d3e4d3883fb7540d1df240fb08202fc77705) - Enable Ruff S101. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7443](https://github.com/gradio-app/gradio/pull/7443) [`b7a97f2`](https://github.com/gradio-app/gradio/commit/b7a97f29b84a72678a717db03d2932ed6caae6ce) - Update `httpx` to `httpx>=0.24.1` in `requirements.txt`. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7465](https://github.com/gradio-app/gradio/pull/7465) [`16fbe9c`](https://github.com/gradio-app/gradio/commit/16fbe9cd0cffa9f2a824a0165beb43446114eec7) - Prevent components from working with non-uploaded files. Thanks [@aliabid94](https://github.com/aliabid94)! +- [#7503](https://github.com/gradio-app/gradio/pull/7503) [`84802ee`](https://github.com/gradio-app/gradio/commit/84802ee6a4806c25287344dce581f9548a99834a) - Tighten CORS rules. Thanks [@abidlabs](https://github.com/abidlabs)! + +### Fixes + +- [#7466](https://github.com/gradio-app/gradio/pull/7466) [`98a2719`](https://github.com/gradio-app/gradio/commit/98a2719bfb9c64338caf9009891b6c6b0b33ea89) - Fix z-index layer of orange generating border. Thanks [@daviirodrig](https://github.com/daviirodrig)! +- [#7507](https://github.com/gradio-app/gradio/pull/7507) [`9c36572`](https://github.com/gradio-app/gradio/commit/9c36572e32aeec6e6352a861dfea6ee0f9a15e79) - Quick fix: File height overflow. Thanks [@dawoodkhan82](https://github.com/dawoodkhan82)! +- [#7495](https://github.com/gradio-app/gradio/pull/7495) [`ddd4d3e`](https://github.com/gradio-app/gradio/commit/ddd4d3e4d3883fb7540d1df240fb08202fc77705) - ensure Dataframe headers are aligned with content when scrolling. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7470](https://github.com/gradio-app/gradio/pull/7470) [`ba3ec13`](https://github.com/gradio-app/gradio/commit/ba3ec1300e81e64be7389d759b89284c66473158) - Tab select fix. Thanks [@aliabid94](https://github.com/aliabid94)! +- [#7505](https://github.com/gradio-app/gradio/pull/7505) [`b186767`](https://github.com/gradio-app/gradio/commit/b18676774448f44a2ef3a9490224703254cffa7c) - Fix `Gallery` preview overlay and backdrop. Thanks [@MMP0](https://github.com/MMP0)! +- [#7511](https://github.com/gradio-app/gradio/pull/7511) [`33f68cb`](https://github.com/gradio-app/gradio/commit/33f68cb6c22897f7996b6c84b0e528c47fae00b5) - Fix Canvas3D/Canvas3DGS async imports. Thanks [@whitphx](https://github.com/whitphx)! + +## 4.19.1 + +### Features + +- [#7453](https://github.com/gradio-app/gradio/pull/7453) [`ba747ad`](https://github.com/gradio-app/gradio/commit/ba747adb87e1937c0a791186eee3997d034363e6) - Make fix in #7444 (Block /file= filepaths that could expose credentials on Windows) more general. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7416](https://github.com/gradio-app/gradio/pull/7416) [`c88290d`](https://github.com/gradio-app/gradio/commit/c88290d90a81811911361e26fa9523c9b13db527) - WIP: Optimize /file route. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7440](https://github.com/gradio-app/gradio/pull/7440) [`e329f1f`](https://github.com/gradio-app/gradio/commit/e329f1fd38935213fe0e73962e8cbd5d3af6e87b) - Prevent timing attacks to guess Gradio passwords. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7425](https://github.com/gradio-app/gradio/pull/7425) [`3e4e680`](https://github.com/gradio-app/gradio/commit/3e4e680a52ba5a73c108ef1b328dacd7b6e4b566) - Fixes to the `.key_up()` method to make it usable for a dynamic dropdown autocomplete. Thanks [@abidlabs](https://github.com/abidlabs)! + +### Fixes + +- [#7444](https://github.com/gradio-app/gradio/pull/7444) [`4faf8a7`](https://github.com/gradio-app/gradio/commit/4faf8a7e86bfe811ef3d90ac5abdbd41409fafb1) - Block `/file=` filepaths that could expose credentials on Windows. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7441](https://github.com/gradio-app/gradio/pull/7441) [`f52cab6`](https://github.com/gradio-app/gradio/commit/f52cab634b94638d7f4625d40bf3d9afbe68040b) - Dispatch change event for file explorer. Thanks [@aliabid94](https://github.com/aliabid94)! +- [#7327](https://github.com/gradio-app/gradio/pull/7327) [`fb1f6be`](https://github.com/gradio-app/gradio/commit/fb1f6befad12106faafd94d221c1ed0e50b0a037) - Run pre/post processing in threadpool. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7431](https://github.com/gradio-app/gradio/pull/7431) [`6b8a7e5`](https://github.com/gradio-app/gradio/commit/6b8a7e5d36887cdfcfbfec1536a915128df0d6b2) - Ensure `gr.Dropdown` can have an empty initial value. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#6991](https://github.com/gradio-app/gradio/pull/6991) [`f191786`](https://github.com/gradio-app/gradio/commit/f1917867916647d383b8d7ce15e0c17f2abbdec1) - Improve responsiveness of `gr.Audio()` controls. Thanks [@hannahblair](https://github.com/hannahblair)! + +## 4.19.0 + +### Features + +- [#7406](https://github.com/gradio-app/gradio/pull/7406) [`3e886d8`](https://github.com/gradio-app/gradio/commit/3e886d8f0ac55c416dae51c1c2661e16eb34718e) - Model3D Gaussian Splatting. Thanks [@dylanebert](https://github.com/dylanebert)! + +### Fixes + +- [#7402](https://github.com/gradio-app/gradio/pull/7402) [`fa8225d`](https://github.com/gradio-app/gradio/commit/fa8225d24d86c0ec9a48cadee78dcc11b7084584) - Use updated component in `postprocess()`. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7361](https://github.com/gradio-app/gradio/pull/7361) [`17fb116`](https://github.com/gradio-app/gradio/commit/17fb116492f951ab66e3a39b5fdfb598f5446b6f) - Fixes gr.Markdown() does not render spaces around links correctly. Thanks [@dawoodkhan82](https://github.com/dawoodkhan82)! +- [#7337](https://github.com/gradio-app/gradio/pull/7337) [`65437ce`](https://github.com/gradio-app/gradio/commit/65437ce832f806da316aa074539b6263e1d8b7ac) - Improve File Explorer performance. Thanks [@aliabid94](https://github.com/aliabid94)! +- [#7410](https://github.com/gradio-app/gradio/pull/7410) [`c2dfc59`](https://github.com/gradio-app/gradio/commit/c2dfc592a4988efd5a96a062eec3fb4906f71748) - remove static while pending behaviour. Thanks [@pngwn](https://github.com/pngwn)! +- [#7389](https://github.com/gradio-app/gradio/pull/7389) [`b5c74ff`](https://github.com/gradio-app/gradio/commit/b5c74ffadbee351b2d5d79e578246f5343255508) - Fix HTTPX package crash for some values of "article" parameter in the interface. Thanks [@YuryYakhno](https://github.com/YuryYakhno)! +- [#7415](https://github.com/gradio-app/gradio/pull/7415) [`4ab399f`](https://github.com/gradio-app/gradio/commit/4ab399f40a300f267231f1b2dbe2a07494322d4d) - Allow config to include non-pickle-able values. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7404](https://github.com/gradio-app/gradio/pull/7404) [`065c5b1`](https://github.com/gradio-app/gradio/commit/065c5b163c4badb9d9cbd06d627fb4ba086003e7) - Add `.key_up` event listener to `gr.Dropdown()`. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7417](https://github.com/gradio-app/gradio/pull/7417) [`314ccfa`](https://github.com/gradio-app/gradio/commit/314ccfa781810e777a944ff6d832dbd4b043631a) - Fix File Explorer interactivity. Thanks [@aliabid94](https://github.com/aliabid94)! +- [#7401](https://github.com/gradio-app/gradio/pull/7401) [`dff4109`](https://github.com/gradio-app/gradio/commit/dff410955e41145848376784c03fe28ba1c4fd85) - Retain dropdown value if choices have been changed. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7411](https://github.com/gradio-app/gradio/pull/7411) [`32b317f`](https://github.com/gradio-app/gradio/commit/32b317f24e3d43f26684bb9f3964f31efd0ea556) - Set `root` correctly for Gradio apps that are deployed behind reverse proxies. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7395](https://github.com/gradio-app/gradio/pull/7395) [`46b4568`](https://github.com/gradio-app/gradio/commit/46b45683e1ea9eb40013121a8de5bee7aa98bf0b) - Allow applying `@media`, `@keyframes` and `@import` in custom CSS. Thanks [@hannahblair](https://github.com/hannahblair)! + +## 4.18.0 + +### Features + +- [#7299](https://github.com/gradio-app/gradio/pull/7299) [`f35f615`](https://github.com/gradio-app/gradio/commit/f35f615e33a5dd90bfeb106b6f5dca689849fcef) - Added remove button for every file in file preview, to remove individual file in gr.File(). Thanks [@shubhamofbce](https://github.com/shubhamofbce)! +- [#7183](https://github.com/gradio-app/gradio/pull/7183) [`49d9c48`](https://github.com/gradio-app/gradio/commit/49d9c48537aa706bf72628e3640389470138bdc6) - [WIP] Refactor file normalization to be in the backend and remove it from the frontend of each component. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7333](https://github.com/gradio-app/gradio/pull/7333) [`7e9b206`](https://github.com/gradio-app/gradio/commit/7e9b206a149740a421e03c8adb64978a5070f28f) - Stop using deprecated pydantic config class and filter gradio warnings from tests. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7377](https://github.com/gradio-app/gradio/pull/7377) [`6dfd40f`](https://github.com/gradio-app/gradio/commit/6dfd40fc6b2fa461490d2370ab91fcda7e07c0da) - Make set_documentation_group a no-op. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7328](https://github.com/gradio-app/gradio/pull/7328) [`c1a7ea7`](https://github.com/gradio-app/gradio/commit/c1a7ea7c0c294aa970624f02225717c12bcf9b58) - Add SQL Support for gr.Code. Thanks [@aersam](https://github.com/aersam)! +- [#7369](https://github.com/gradio-app/gradio/pull/7369) [`7b10d97`](https://github.com/gradio-app/gradio/commit/7b10d97b0f928fde6a71a94460fb8ca784e7a31d) - Remove the `@gradio/wasm` dependency from `@gradio/gallery` that is not used. Thanks [@whitphx](https://github.com/whitphx)! +- [#7334](https://github.com/gradio-app/gradio/pull/7334) [`b95d0d0`](https://github.com/gradio-app/gradio/commit/b95d0d043c739926af986e573200af92732bbc01) - Allow setting custom headers in Python Client. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7365](https://github.com/gradio-app/gradio/pull/7365) [`1e68561`](https://github.com/gradio-app/gradio/commit/1e68561167cd240d053444db091b297a3129cebb) - Update Pydantic patch for Lite that emulates PydanticV2 API using V1. Thanks [@whitphx](https://github.com/whitphx)! +- [#6890](https://github.com/gradio-app/gradio/pull/6890) [`cccab27`](https://github.com/gradio-app/gradio/commit/cccab27fe8b6ae6860b3fff68694fa33060e18a7) - E2E tests for Lite. Thanks [@whitphx](https://github.com/whitphx)! + +### Fixes + +- [#7354](https://github.com/gradio-app/gradio/pull/7354) [`a7fa47a`](https://github.com/gradio-app/gradio/commit/a7fa47a175fbcf0fd6573ca19334a3a55b55bb24) - ensure Dataframes in background tabs are visible when the tab is selected. Thanks [@pngwn](https://github.com/pngwn)! +- [#7355](https://github.com/gradio-app/gradio/pull/7355) [`2244059`](https://github.com/gradio-app/gradio/commit/2244059cdbacb713530a3b760205c5464c05491c) - Ensure CSS `.dark` rule selectors are applied. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7375](https://github.com/gradio-app/gradio/pull/7375) [`4dc9ffb`](https://github.com/gradio-app/gradio/commit/4dc9ffbf70e2233c5b18ed3f722c1189a310a036) - Store `gr.Accordion`'s `open` value. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7374](https://github.com/gradio-app/gradio/pull/7374) [`7f19ba2`](https://github.com/gradio-app/gradio/commit/7f19ba272c5a46d7f2c11ad5c9f0ab15d4e27083) - Stop caching root url. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7350](https://github.com/gradio-app/gradio/pull/7350) [`7302a6e`](https://github.com/gradio-app/gradio/commit/7302a6e151dac553c17833be64d4639ee4cf97aa) - Fix `gr.load` for file-based Spaces. Thanks [@abidlabs](https://github.com/abidlabs)! + +## 4.17.0 + +### Features + +- [#7129](https://github.com/gradio-app/gradio/pull/7129) [`ccdaec4`](https://github.com/gradio-app/gradio/commit/ccdaec45002d0a9d6016e8e2078b843a1ff9172b) - Add a `simpleimage` template for custom components. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7313](https://github.com/gradio-app/gradio/pull/7313) [`edfd05d`](https://github.com/gradio-app/gradio/commit/edfd05d18d20542d350d883d5e7f84d2774ad99e) - Expand chatinterface to full window height. Thanks [@aliabid94](https://github.com/aliabid94)! +- [#7292](https://github.com/gradio-app/gradio/pull/7292) [`aa97a5e`](https://github.com/gradio-app/gradio/commit/aa97a5e33a04ef8a0309b6ec3b2df4caaa26173e) - Improvements to API Docs. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7205](https://github.com/gradio-app/gradio/pull/7205) [`e418edd`](https://github.com/gradio-app/gradio/commit/e418edd011d06df519c778b9a50573288d5bf30f) - Fix SimpleImage package json. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7222](https://github.com/gradio-app/gradio/pull/7222) [`5181957`](https://github.com/gradio-app/gradio/commit/51819577068addde8fab1f4d4cfe691f20396f3f) - Add mobile Chromatic tests. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7298](https://github.com/gradio-app/gradio/pull/7298) [`e5344ba`](https://github.com/gradio-app/gradio/commit/e5344ba0cd63d21dbb525330bbc07ca2eca57832) - chore(deps): update dependency marked to v12. Thanks [@renovate](https://github.com/apps/renovate)! +- [#7206](https://github.com/gradio-app/gradio/pull/7206) [`572e360`](https://github.com/gradio-app/gradio/commit/572e360fff4a03c335b86e1a7517a44cb6af2bcd) - Upload tweak. Thanks [@pngwn](https://github.com/pngwn)! +- [#7062](https://github.com/gradio-app/gradio/pull/7062) [`0fddd0f`](https://github.com/gradio-app/gradio/commit/0fddd0f971761bff3ef6ccc7ab9deb1891cd80d0) - Determine documentation group automatically. Thanks [@akx](https://github.com/akx)! +- [#7102](https://github.com/gradio-app/gradio/pull/7102) [`68a54a7`](https://github.com/gradio-app/gradio/commit/68a54a7a310d8d7072fdae930bf1cfdf12c45a7f) - Improve chatbot streaming performance with diffs. Thanks [@aliabid94](https://github.com/aliabid94)!/n Note that this PR changes the API format for generator functions, which would be a breaking change for any clients reading the EventStream directly +- [#7208](https://github.com/gradio-app/gradio/pull/7208) [`efacc7d`](https://github.com/gradio-app/gradio/commit/efacc7d5cb0d1c6448cbec82abfc00ad6da05b3f) - Ensure `open` reactivity in Accordion. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7228](https://github.com/gradio-app/gradio/pull/7228) [`2e6672c`](https://github.com/gradio-app/gradio/commit/2e6672c815e39fd6af78353e66661100b9102cd4) - Allow start/pause of streaming image input. Only access the webcam while it's needed. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7236](https://github.com/gradio-app/gradio/pull/7236) [`dec6a71`](https://github.com/gradio-app/gradio/commit/dec6a715d6219b00bd0151dd7c13bb2bc99c86da) - Fix PIL imports. Thanks [@akx](https://github.com/akx)! +- [#7274](https://github.com/gradio-app/gradio/pull/7274) [`fdd1521`](https://github.com/gradio-app/gradio/commit/fdd15213c24b9cbc58bbc1b6beb4af7c18f48557) - chore: Change time format (thanks @jjshoots for the independent contribution). Thanks [@arian81](https://github.com/arian81)! +- [#7116](https://github.com/gradio-app/gradio/pull/7116) [`3c8c4ac`](https://github.com/gradio-app/gradio/commit/3c8c4ac2db284e1cb503c397205a79a6dcc27e23) - Document the `gr.ParamViewer` component, and fix component preprocessing/postprocessing docstrings. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7157](https://github.com/gradio-app/gradio/pull/7157) [`46919c5`](https://github.com/gradio-app/gradio/commit/46919c5a4721ca2b0e17e38dc8c641f7ef336bcc) - Defer importing matplotlib. Thanks [@akx](https://github.com/akx)! +- [#7332](https://github.com/gradio-app/gradio/pull/7332) [`8bb0ce2`](https://github.com/gradio-app/gradio/commit/8bb0ce2e40abc4da3c782d5bc5ef5ac0f31f966f) - Hotfix for: `stt_or_tts` demo. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7309](https://github.com/gradio-app/gradio/pull/7309) [`200e251`](https://github.com/gradio-app/gradio/commit/200e2518e4d449aa82819a8d119e912bd1d95c15) - Add `gr.Image` interaction test + `gr.ImageEditor` interaction test improvement. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7319](https://github.com/gradio-app/gradio/pull/7319) [`87d5105`](https://github.com/gradio-app/gradio/commit/87d510580e7061c00848b70613c74838d9c71de7) - Handle httpx.InvalidURL when setting non-URL article strings. Thanks [@nopperl](https://github.com/nopperl)! +- [#7154](https://github.com/gradio-app/gradio/pull/7154) [`aab2a75`](https://github.com/gradio-app/gradio/commit/aab2a75f0610dd7ed0b481264c6b9f01cfe92094) - Allow selecting texts in dataframe cells. Thanks [@shubhamofbce](https://github.com/shubhamofbce)! +- [#7061](https://github.com/gradio-app/gradio/pull/7061) [`05d8a3c`](https://github.com/gradio-app/gradio/commit/05d8a3c8030b733bd47250f5db6f89f230f9a707) - Update ruff to 0.1.13, enable more rules, fix issues. Thanks [@akx](https://github.com/akx)! +- [#7315](https://github.com/gradio-app/gradio/pull/7315) [`b3a9c83`](https://github.com/gradio-app/gradio/commit/b3a9c830955a5ded8528d6118aaf1b6e019857a2) - Lite: Wasm-compatible Model3D. Thanks [@whitphx](https://github.com/whitphx)! +- [#7059](https://github.com/gradio-app/gradio/pull/7059) [`7ea8336`](https://github.com/gradio-app/gradio/commit/7ea8336709726dbe14dd00303fe2db3fe27f0502) - Remove flag_dir from read_from_flag(). Thanks [@akx](https://github.com/akx)! +- [#7229](https://github.com/gradio-app/gradio/pull/7229) [`6a7e98b`](https://github.com/gradio-app/gradio/commit/6a7e98bfefdc9530f0390f0d780edc5a35266d56) - Fix hyphen-bug in gradio cc publish. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7225](https://github.com/gradio-app/gradio/pull/7225) [`60078df`](https://github.com/gradio-app/gradio/commit/60078df07f38c0ef90ef2ba90f8e3272b92c9e3d) - Fix test requirements to be compatible with python 3.11. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7256](https://github.com/gradio-app/gradio/pull/7256) [`09257ef`](https://github.com/gradio-app/gradio/commit/09257ef1f1307e2886418f6dd93dcffdf010c32b) - Fix ci cache. Thanks [@pngwn](https://github.com/pngwn)! +- [#7240](https://github.com/gradio-app/gradio/pull/7240) [`1893756`](https://github.com/gradio-app/gradio/commit/18937564ab8906710549d5bccc48f7188c836f38) - Small cleanups of `Code` component. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7295](https://github.com/gradio-app/gradio/pull/7295) [`aea14c4`](https://github.com/gradio-app/gradio/commit/aea14c44961be8b0e732e05799df8104d7b906ed) - Refactor Inference API and rename it to Serverless Inference Endpoints. Thanks [@abidlabs](https://github.com/abidlabs)! + +### Fixes + +- [#7117](https://github.com/gradio-app/gradio/pull/7117) [`24157a3`](https://github.com/gradio-app/gradio/commit/24157a36028b3f606194bd9977634318650b2d46) - add background color based on the OS mode. Thanks [@aileenvl](https://github.com/aileenvl)! +- [#7192](https://github.com/gradio-app/gradio/pull/7192) [`8dd6f4b`](https://github.com/gradio-app/gradio/commit/8dd6f4bc1901792f05cd59e86df7b1dbab692739) - Handle the case where examples is `null` for all components. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7283](https://github.com/gradio-app/gradio/pull/7283) [`757dba6`](https://github.com/gradio-app/gradio/commit/757dba66baf624eae11ff076f0e8d6bfc2314630) - Add `show_label` check to `gr.Dataframe`. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7190](https://github.com/gradio-app/gradio/pull/7190) [`2d51a9d`](https://github.com/gradio-app/gradio/commit/2d51a9dbd97167aa7a2b3aa672142c1a5137e898) - Add missing parameters and docstrings for `gr.TabbedInterface`. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7178](https://github.com/gradio-app/gradio/pull/7178) [`9f23b0b`](https://github.com/gradio-app/gradio/commit/9f23b0bc54b4ef63c056b309370df52ec2c2a43c) - Optimize client view_api method. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7158](https://github.com/gradio-app/gradio/pull/7158) [`ded5256`](https://github.com/gradio-app/gradio/commit/ded5256c4a39a84155b9c3d7f4e8e7060d798186) - Fix audio recording events not dispatching. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7325](https://github.com/gradio-app/gradio/pull/7325) [`733ca26`](https://github.com/gradio-app/gradio/commit/733ca266bb1ba9049ed7309b8f0614199682e173) - Ensure examples Images displays as expected. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7276](https://github.com/gradio-app/gradio/pull/7276) [`a3aa22f`](https://github.com/gradio-app/gradio/commit/a3aa22f6f0bc664646bb409844899bc8810e421e) - Adjust Value to Fix .Label Display. Thanks [@codydh](https://github.com/codydh)! +- [#7286](https://github.com/gradio-app/gradio/pull/7286) [`0d36ac0`](https://github.com/gradio-app/gradio/commit/0d36ac05aa54e53f0ea61f5b129af59ab55f3224) - Fixes issue with datatype setting in gr.Dataframe. Setting no longer dependent on col_count. Thanks [@cswamy](https://github.com/cswamy)! +- [#7290](https://github.com/gradio-app/gradio/pull/7290) [`db27df3`](https://github.com/gradio-app/gradio/commit/db27df36d2ea42dd20f275e9b9d6fe15f1a960f8) - Escape triple quotes when creating `space.py` for custom components. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7141](https://github.com/gradio-app/gradio/pull/7141) [`c3e61e4`](https://github.com/gradio-app/gradio/commit/c3e61e4f70696a71aede67b65d28447eb67daf16) - Few File component drag and drop. Thanks [@dawoodkhan82](https://github.com/dawoodkhan82)! +- [#7221](https://github.com/gradio-app/gradio/pull/7221) [`cae05c0`](https://github.com/gradio-app/gradio/commit/cae05c05ecde56c4d92c6b5ed8d13353505cbd14) - Fix single file upload display. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7207](https://github.com/gradio-app/gradio/pull/7207) [`e3217b4`](https://github.com/gradio-app/gradio/commit/e3217b41862925a6a05f44070ac2bdabbeee6769) - Amend audio waveform colour. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7322](https://github.com/gradio-app/gradio/pull/7322) [`b25e95e`](https://github.com/gradio-app/gradio/commit/b25e95e164e80d66203ef71ce6bdb67ceb6b24df) - Fix `processing_utils.save_url_to_cache()` to follow redirects when accessing the URL. Thanks [@whitphx](https://github.com/whitphx)! +- [#7294](https://github.com/gradio-app/gradio/pull/7294) [`d7095c4`](https://github.com/gradio-app/gradio/commit/d7095c4699658f2acc5af7557dd455e8655954f4) - Number example fix. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7219](https://github.com/gradio-app/gradio/pull/7219) [`faead14`](https://github.com/gradio-app/gradio/commit/faead1403cdba6415912a6ad512291ac63b04173) - Show label in interactive image editor. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7220](https://github.com/gradio-app/gradio/pull/7220) [`3b8dfc6`](https://github.com/gradio-app/gradio/commit/3b8dfc684dc0eb0544d06300fa546b23f587c63f) - Add `visible` check to Tab. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7257](https://github.com/gradio-app/gradio/pull/7257) [`daaaf95`](https://github.com/gradio-app/gradio/commit/daaaf9593e9b2094bf59f3f5e01244ffb8a01bb1) - Fixes issues related to `gr.Dataframe` receiving an empty dataframe. Thanks [@cswamy](https://github.com/cswamy)! + +## 4.16.0 + +### Features + +- [#7124](https://github.com/gradio-app/gradio/pull/7124) [`21a16c6`](https://github.com/gradio-app/gradio/commit/21a16c60e8f34b870bd2aae9af07713eb1307252) - add params to `gr.Interface` and `gr.ChatInterface`. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7139](https://github.com/gradio-app/gradio/pull/7139) [`6abad53`](https://github.com/gradio-app/gradio/commit/6abad536778517a2ab9f5fc75d52afc576f01218) - Added polars dataframe support with demo. Thanks [@cswamy](https://github.com/cswamy)! +- [#7084](https://github.com/gradio-app/gradio/pull/7084) [`94aa271`](https://github.com/gradio-app/gradio/commit/94aa271ab11fc3426a7e143ebaa757eb30c9911d) - Improve rapid generation performance via UI throttling. Thanks [@aliabid94](https://github.com/aliabid94)! +- [#7104](https://github.com/gradio-app/gradio/pull/7104) [`bc2cdc1`](https://github.com/gradio-app/gradio/commit/bc2cdc1df95b38025486cf76df4a494b66d98585) - Allow download button for interactive Audio and Video components. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7109](https://github.com/gradio-app/gradio/pull/7109) [`125a832`](https://github.com/gradio-app/gradio/commit/125a832ab7ee2b5affa574e8b32c88f430cc6663) - generate docs when running `gradio cc build`. Thanks [@pngwn](https://github.com/pngwn)! +- [#7148](https://github.com/gradio-app/gradio/pull/7148) [`c60ad4d`](https://github.com/gradio-app/gradio/commit/c60ad4d34ab5b56a89bf6796822977e51e7a4a32) - Use Gallery as input component. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7049](https://github.com/gradio-app/gradio/pull/7049) [`1718c4a`](https://github.com/gradio-app/gradio/commit/1718c4aeb23a88ef02b17b30a1d1cb72e413e04a) - add STL 3D model support. Thanks [@Mon-ius](https://github.com/Mon-ius)! +- [#7159](https://github.com/gradio-app/gradio/pull/7159) [`6ee22dc`](https://github.com/gradio-app/gradio/commit/6ee22dc6a8f6419e127a0f650e58c87a31bc59c9) - Ensure `gradio cc publish` uploads the documentation space, if it exists. Thanks [@pngwn](https://github.com/pngwn)! +- [#7034](https://github.com/gradio-app/gradio/pull/7034) [`82fe73d`](https://github.com/gradio-app/gradio/commit/82fe73d04297ac4e2c3ef42edc62bab4300bf915) - Redirect with query params after oauth. Thanks [@Wauplin](https://github.com/Wauplin)! +- [#7063](https://github.com/gradio-app/gradio/pull/7063) [`2cdcf4a`](https://github.com/gradio-app/gradio/commit/2cdcf4a890202a55673588c16f27b327d27915b6) - Single oauth button. Thanks [@Wauplin](https://github.com/Wauplin)! + +### Fixes + +- [#7126](https://github.com/gradio-app/gradio/pull/7126) [`5727b92`](https://github.com/gradio-app/gradio/commit/5727b92abc8a00a675bfc0a921b38de771af947b) - Allow buttons to take null value. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7112](https://github.com/gradio-app/gradio/pull/7112) [`217bfe3`](https://github.com/gradio-app/gradio/commit/217bfe39ca6a0de885824f16be4a707e7f032d57) - Support audio data in `np.int8` format in the `gr.Audio` component. Thanks [@Ram-Pasupula](https://github.com/Ram-Pasupula)! +- [#7029](https://github.com/gradio-app/gradio/pull/7029) [`ac73555`](https://github.com/gradio-app/gradio/commit/ac735551bb2ccc288b2bbf10b008b6c3d9e65132) - Run before_fn and after_fn for each generator iteration. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7131](https://github.com/gradio-app/gradio/pull/7131) [`7d53aa1`](https://github.com/gradio-app/gradio/commit/7d53aa13a304d056d1973b8e86c6f89ff84cbd28) - Miscellaneous doc fixes. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7138](https://github.com/gradio-app/gradio/pull/7138) [`ca8753b`](https://github.com/gradio-app/gradio/commit/ca8753bb3d829d0077f758ba8d0ddc866ff74d3d) - Fixes: Chatbot crashes when given empty url following http:// or https://. Thanks [@dawoodkhan82](https://github.com/dawoodkhan82)! +- [#7115](https://github.com/gradio-app/gradio/pull/7115) [`cb90b3d`](https://github.com/gradio-app/gradio/commit/cb90b3d5d6a291270e047e10f9173cbc03678e1c) - Programmatically determine max wheel version to push to spaces. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7107](https://github.com/gradio-app/gradio/pull/7107) [`80f8fbf`](https://github.com/gradio-app/gradio/commit/80f8fbf0e8900627b9c2575bbd7c68fad8108544) - Add logic to handle non-interactive or hidden tabs. Thanks [@hannahblair](https://github.com/hannahblair)! +- [#7142](https://github.com/gradio-app/gradio/pull/7142) [`b961652`](https://github.com/gradio-app/gradio/commit/b9616528ab099aab0adc7027bce4655111f7366c) - Remove kwargs from template components. Thanks [@freddyaboulton](https://github.com/freddyaboulton)! +- [#7125](https://github.com/gradio-app/gradio/pull/7125) [`45f725f`](https://github.com/gradio-app/gradio/commit/45f725f8d0dc7813b3d2e768ca9582d6ad878d6f) - un-disable output components after exception is raised. Thanks [@abidlabs](https://github.com/abidlabs)! +- [#7081](https://github.com/gradio-app/gradio/pull/7081) [`44c53d9`](https://github.com/gradio-app/gradio/commit/44c53d9bde7cab605b7dbd16331683d13cae029e) - Fix dropdown refocusing due to `