Skip to content

Commit

Permalink
example: add generative ui example (#2769)
Browse files Browse the repository at this point in the history
  • Loading branch information
mscolnick authored Nov 1, 2024
1 parent e8bc70c commit 09023e2
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 0 deletions.
2 changes: 2 additions & 0 deletions examples/ai/chat/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ These examples show how to make chatbots with marimo, using [`mo.ui.chat`](https
- `openai_example.py` shows how to make a chatbot powered by OpenAI models.
- `anthropic_example.py` shows how to make a chatbot powered by Anthropic models.
- `gemini.py` shows how to make a chatbot powered by Google models like Gemini.
- `groq_example.py` shows how to make a chatbot powered by Groq models.
- `mlx_chat.py` shows a simple chatbot using local on-device models with Apple's [MLX](https://github.com/ml-explore/mlx), a machine learning framework from Apple that is similar to JAX and PyTorch. This specific example uses the [mlx-lm](https://github.com/ml-explore/mlx-examples/tree/main/llms) library. Note that Apple Silicon chips are required for using MLX.
- `llm_datasette.py` shows how to make a chatbot powered by Simon W's LLM library.
- `dagger_code_interpreter.py` shows how to make a basic code-interpreter chatbot powered by Dagger containers.
- `recipe_bot.py` shows how to make a chatbot that can parse recipes from images.
- `simplemind_example.py` shows how to integrate [simplemind](https://github.com/kennethreitz/simplemind).
- `generative_ui.py` shows how to make a chatbot that can generate UI code.

Chatbot's in marimo are _reactive_: when the chatbot responds with a message,
all other cells referencing the chatbot are automatically run or marked
Expand Down
95 changes: 95 additions & 0 deletions examples/ai/chat/generative_ui.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "ell-ai==0.0.14",
# "marimo",
# "openai==1.53.0",
# "polars==1.12.0",
# ]
# ///

import marimo

__generated_with = "0.9.14"
app = marimo.App(width="medium")


@app.cell
def __():
import polars as pl
import marimo as mo
import os

has_api_key = os.environ.get("OPENAI_API_KEY") is not None
mo.stop(
not has_api_key,
mo.md("Please set the `OPENAI_API_KEY` environment variable").callout(),
)

# Grab a dataset
df = pl.read_csv("hf://datasets/scikit-learn/Fish/Fish.csv")
return df, has_api_key, mo, os, pl


@app.cell
def __(df, mo):
import ell


@ell.tool()
def chart_data(x_encoding: str, y_encoding: str, color: str):
"""Generate an altair chart"""
import altair as alt

return (
alt.Chart(df)
.mark_circle()
.encode(x=x_encoding, y=y_encoding, color=color)
.properties(width=500)
)


@ell.tool()
def filter_dataset(sql_query: str):
"""
Filter a polars dataframe using SQL. Please only use fields from the schema.
When referring to the table in SQL, call it 'data'.
"""
filtered = df.sql(sql_query, table_name="data")
return mo.ui.table(
filtered,
label=f"```sql\n{sql_query}\n```",
selection=None,
show_column_summaries=False,
)
return chart_data, ell, filter_dataset


@app.cell
def __(chart_data, df, ell, filter_dataset, mo):
@ell.complex(model="gpt-4o", tools=[chart_data, filter_dataset])
def analyze_dataset(prompt: str) -> str:
"""You are a data scientist that can analyze a dataset"""
return f"I have a dataset with schema: {df.schema}. \n{prompt}"


def my_model(messages):
response = analyze_dataset(messages)
if response.tool_calls:
return response.tool_calls[0]()
return response.text


mo.ui.chat(
my_model,
prompts=[
"Can you chart two columns of your choosing?",
"Can you find the min, max of all numeric fields?",
"What is the sum of {{column}}?",
],
)
return analyze_dataset, my_model


if __name__ == "__main__":
app.run()
File renamed without changes.
7 changes: 7 additions & 0 deletions examples/ai/chat/recipe_bot.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "marimo",
# "openai==1.53.0",
# ]
# ///
import marimo

__generated_with = "0.9.10"
Expand Down

0 comments on commit 09023e2

Please sign in to comment.