|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import marimo |
|
|
|
__generated_with = "0.9.20" |
|
app = marimo.App(width="medium") |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(): |
|
import os |
|
import textwrap |
|
|
|
import ell |
|
import marimo as mo |
|
import openai |
|
|
|
return ell, mo, openai, os, textwrap |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
# Creating a code interpreter |
|
|
|
This example shows how to create a code-interpreter in a few lines of code. |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo, os): |
|
api_key = mo.ui.text( |
|
label="OpenAI API key", |
|
kind="password", |
|
value=os.environ.get("OPENAI_API_KEY", ""), |
|
) |
|
api_key |
|
return (api_key,) |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(api_key, openai): |
|
client = openai.Client(api_key=api_key.value) |
|
model = "gpt-4-turbo" |
|
return client, model |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(): |
|
|
|
def exec_with_result(script, globals=None, locals=None): |
|
"""Execute a script and return the value of the last expression""" |
|
import ast |
|
|
|
stmts = list(ast.iter_child_nodes(ast.parse(script))) |
|
if not stmts: |
|
return None |
|
if isinstance(stmts[-1], ast.Expr): |
|
|
|
|
|
if len(stmts) > 1: |
|
exec( |
|
compile(ast.Module(body=stmts[:-1]), filename="<ast>", mode="exec"), |
|
globals, |
|
locals, |
|
) |
|
|
|
return eval( |
|
compile( |
|
ast.Expression(body=stmts[-1].value), |
|
filename="<ast>", |
|
mode="eval", |
|
), |
|
globals, |
|
locals, |
|
) |
|
else: |
|
|
|
return exec(script, globals, locals) |
|
|
|
return (exec_with_result,) |
|
|
|
|
|
@app.cell |
|
def __(ell, exec_with_result, mo): |
|
def code_fence(code): |
|
return f"```python\n\n{code}\n\n```" |
|
|
|
@ell.tool() |
|
def execute_code(code: str): |
|
""" |
|
Execute python. The last line should be the result, don't use print(). |
|
Please make sure it is safe before executing. |
|
""" |
|
with mo.capture_stdout() as out: |
|
result = exec_with_result(code) |
|
output = out.getvalue() |
|
results = [ |
|
"**Code**", |
|
code_fence(code), |
|
"**Result**", |
|
code_fence(result if result is not None else output), |
|
] |
|
return mo.md("\n\n".join(results)) |
|
|
|
return code_fence, execute_code |
|
|
|
|
|
@app.cell |
|
def __(client, ell, execute_code, mo, model): |
|
@ell.complex(model=model, tools=[execute_code], client=client) |
|
def custom_chatbot(messages, config) -> str: |
|
"""You are data scientist with access to writing python code.""" |
|
return [ |
|
ell.user(message.content) |
|
if message.role == "user" |
|
else ell.assistant(message.content) |
|
for message in messages |
|
] |
|
|
|
def my_model(messages, config): |
|
response = custom_chatbot(messages, config) |
|
if response.tool_calls: |
|
return response.tool_calls[0]() |
|
return mo.md(response.text) |
|
|
|
return custom_chatbot, my_model |
|
|
|
|
|
@app.cell |
|
def __(mo, my_model): |
|
numbers = [x for x in range(1, 10)] |
|
|
|
mo.ui.chat( |
|
my_model, |
|
prompts=[ |
|
"What is the square root of {{number}}?", |
|
f"Can you sum this list using python: {numbers}", |
|
], |
|
) |
|
return (numbers,) |
|
|
|
|
|
if __name__ == "__main__": |
|
app.run() |
|
|