## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----setup--------------------------------------------------------------------
# library(GitAI)

## -----------------------------------------------------------------------------
# my_project <- initialize_project("gitai-demo") |>
#   set_database(
#     provider  = "Pinecone",
#     index     = "gitai"
#   ) |>
#   set_llm(seed = 1014, api_args = list(temperature = 0))

## -----------------------------------------------------------------------------
# my_project <- my_project |>
#   set_github_repos(
#     repos = c(
#       "r-world-devs/GitStats",
#       "r-world-devs/GitAI",
#       "r-world-devs/cohortBuilder",
#       "r-world-devs/shinyCohortBuilder",
#       "r-world-devs/shinyQueryBuilder",
#       "r-world-devs/queryBuilder",
#       "r-world-devs/shinyGizmo",
#       "r-world-devs/shinyTimelines",
#       "openpharma/DataFakeR"
#     ),
#     orgs = c(
#       "insightsengineering",
#       "openpharma",
#       "pharmaverse",
#       "tidymodels",
#       "r-lib",
#       "rstudio",
#       "tidyverse"
#     )
#   ) |>
#   add_files(c(
#     "DESCRIPTION",
#     "*.md",
#     "*.Rmd"
#   ))

## -----------------------------------------------------------------------------
# my_project <- my_project |>
#   set_prompt(r"(
#     Write up to ten paragraphs of summary for a project based on given input.
#     Be precise and to the point in your answers.
#     Mention core functionality and all main features of the project.
#     If available, mention brifly the technology used in the project
#     (like R, Python, etc).
#     If available, mention brifly if a project is an R package, shiny app,
#     or other type of tool.
#   )")

## -----------------------------------------------------------------------------
# ellmer:::chat_perform_value
# custom_function <- function(provider, req) {
# 
#   req <- req |>
#     httr2::req_timeout(60 * 10) |>
#     httr2::req_retry(
#       max_tries = 10,
#       retry_on_failure = TRUE
#     )
# 
#   req |>
#     httr2::req_perform() |>
#     httr2::resp_body_json()
# }
# unlockBinding("chat_perform_value", asNamespace("ellmer"))
# assign("chat_perform_value", custom_function, envir = asNamespace("ellmer"))
# lockBinding("chat_perform_value", asNamespace("ellmer"))

## -----------------------------------------------------------------------------
# results <- process_repos(my_project)

## -----------------------------------------------------------------------------
# my_project <- initialize_project("gitai-demo") |>
#   set_database(
#     provider  = "Pinecone",
#     index     = "gitai"
#   ) |>
#   set_llm(seed = 1014, api_args = list(temperature = 0))
# 
# my_project |>
#   find_records(
#     "How can I create fake data based on SQL tables?",
#     top_k = 1
#   ) |>
#   purrr::walk(~ cat(
#     .x$metadata$text |>
#       stringr::str_sub(end = 1000) |>
#       stringr::str_wrap(width = 80) |>
#       paste0("...")
#   ))
# #> DataFakeR is an R package designed to generate fake data for relational
# #> databases while preserving the structure and constraints of the original data.
# #> The package is particularly useful for developers and data scientists who need
# #> to create realistic datasets for testing, development, or demonstration purposes
# #> without exposing sensitive information. The current version, 0.1.3, includes
# #> several enhancements and bug fixes, making it a robust tool for data simulation.
# #> The core functionality of DataFakeR revolves around its ability to read a
# #> schema description in YAML format, which defines the structure of the database
# #> tables, including columns, data types, constraints, and relationships. Users can
# #> source this schema from an existing database or define it manually. The package
# #> supports various data types, including character, numeric, integer, logical,
# #> and date, allowing for a wide range of data generation scenarios. One of the
# #> standout features of DataFakeR is its support for determinist...

## -----------------------------------------------------------------------------
# library(shiny)
# library(shinychat)
# library(GitAI)
# 
# gitai <- initialize_project("gitai-demo") |>
#   set_database(index = "gitai") |>
#   set_llm(seed = 1014, api_args = list(temperature = 0)) |>
#   set_prompt(r"(
#     As a helpful assistant, answer user question
#     using only the provided input.
#     Use only provided with the query known input
#     that is most relevent to the user's query.
#     Do not use any other information
#     apart from the input provided with the query.
#     Be concise but provide all important information.
#     Also awalys provide link to mentioned git repositories
#     with visible full URL for example: https://github.com/some_repository.
#     Do not mask it with any other text.
#     )")
# 
# ui <- bslib::page_fluid(
#   bslib::layout_sidebar(
#     sidebar = shiny::sliderInput(
#       "top_k",
#       "Use top K results",
#       step = 1,
#       min = 1,
#       max = 10,
#       value = 5
#     ),
# 
#     chat_ui("chat")
#   )
# )
# 
# server <- function(input, output, session) {
# 
#   user_chatbot <- gitai$llm$clone()
# 
#   shiny::observeEvent(input$chat_user_input, {
# 
#     query <- input$chat_user_input
# 
#     stream <- user_chatbot$stream_async(
#       paste(
#         "User query:", query, "\n\n",
#         "Known input provided for the answer:\n\n",
#         gitai$db$find_records(query = query, top_k = input$top_k)
#       )
#     )
#     chat_append("chat", stream)
#   })
# }
# 
# shinyApp(ui, server)