---
title: "Simple chat with LLMR"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Simple chat with LLMR}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r}
knitr::opts_chunk$set(
  collapse = TRUE, comment = "#>",
  eval = identical(tolower(Sys.getenv("LLMR_RUN_VIGNETTES", "false")), "true")
)
```

This vignette shows basic chat usage with four models across two open providers:
- DeepSeek: deepseek-chat
- DeepSeek: deepseek-reasoner
- Groq: llama-3.1-8b-instant
- Groq: openai/gpt-oss-20b

You will need API keys in these environment variables: DEEPSEEK_API_KEY, GROQ_API_KEY.

To run these examples locally, set a local flag:
- Sys.setenv(LLMR_RUN_VIGNETTES = "true")
- or add LLMR_RUN_VIGNETTES=true to ~/.Renviron

## DeepSeek: deepseek-chat
```{r}
library(LLMR)

cfg_ds <- llm_config(
  provider = "deepseek",
  model    = "deepseek-chat"
)

chat_ds <- chat_session(cfg_ds, system = "Be concise.")
chat_ds$send("Say a warm hello in one short sentence.")
chat_ds$send("Now say it in Esperanto.")
```

## DeepSeek: deepseek-reasoner
```{r}
cfg_reason <- llm_config(
  provider = "deepseek",
  model    = "deepseek-reasoner"
)

chat_reason <- chat_session(cfg_reason, system = "Be concise.")
chat_reason$send("Name one interesting fact about honey bees.")
```

## Groq: llama-3.1-8b-instant
```{r}
cfg_groq1 <- llm_config(
  provider = "groq",
  model    = "llama-3.1-8b-instant"
)

chat_groq1 <- chat_session(cfg_groq1, system = "Be concise.")
chat_groq1$send("Give me a single-sentence fun fact about volcanoes.")
```

## Groq: openai/gpt-oss-20b
```{r}
cfg_groq2 <- llm_config(
  provider = "groq",
  model    = "openai/gpt-oss-20b"
)

chat_groq2 <- chat_session(cfg_groq2, system = "Be concise.")
chat_groq2$send("Share a short fun fact about octopuses.")
```

## Using the chat history

Chat sessions remember context automatically:

```{r}
chat_ds$send("What did I ask you to do in my first message?")
# The model can reference the earlier "Say a warm hello" request
```

## Inspect the full conversation

```{r}
# View all messages
as.data.frame(chat_ds)

# Get summary statistics
summary(chat_ds)
```

## Structured chat in one call (DeepSeek example)
```{r}
schema <- list(
  type = "object",
  properties = list(
    answer     = list(type = "string"),
    confidence = list(type = "number")
  ),
  required = list("answer", "confidence"),
  additionalProperties = FALSE
)

chat_ds$send_structured(
  "Return an answer and a confidence score (0-1) about: Why is the sky blue?",
  schema
)
```
