From da7ec70c803f311e94f15e11cbdd3ad7ebab8b2d Mon Sep 17 00:00:00 2001
From: khuyentran1401
Date: Fri, 30 May 2025 18:31:42 -0500
Subject: [PATCH 1/2] merge with main and move file
---
.../gpr_optimization.py | 21 ++---
public/GPR_Optimization.html | 82 -------------------
public/index.html | 16 +++-
public/llm/diffbot_llm.html | 82 +++++++++++++++++++
public/llm/lchain_deepseek.html | 82 +++++++++++++++++++
public/llm/lchain_ollama.html | 82 +++++++++++++++++++
public/temp.html | 82 -------------------
public/temp/temp.html | 82 -------------------
8 files changed, 269 insertions(+), 260 deletions(-)
rename GPR_Optimization.py => machine-learning/gpr_optimization.py (89%)
delete mode 100644 public/GPR_Optimization.html
create mode 100644 public/llm/diffbot_llm.html
create mode 100644 public/llm/lchain_deepseek.html
create mode 100644 public/llm/lchain_ollama.html
delete mode 100644 public/temp.html
delete mode 100644 public/temp/temp.html
diff --git a/GPR_Optimization.py b/machine-learning/gpr_optimization.py
similarity index 89%
rename from GPR_Optimization.py
rename to machine-learning/gpr_optimization.py
index 7d6f814e..8723efc3 100644
--- a/GPR_Optimization.py
+++ b/machine-learning/gpr_optimization.py
@@ -17,10 +17,11 @@
@app.cell
def _():
- import numpy as np
import matplotlib.pyplot as plt
+ import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
- from sklearn.gaussian_process.kernels import Matern, WhiteKernel, ConstantKernel as C
+ from sklearn.gaussian_process.kernels import ConstantKernel as C
+ from sklearn.gaussian_process.kernels import Matern, WhiteKernel
def black_box_function(x):
return - (np.sin(3*x) + 0.5 * x)
@@ -81,10 +82,10 @@ def _(X, X_sample, gpr, plt, y, y_sample):
# Plot the result
plt.figure(figsize=(10, 5))
- plt.plot(X, y, 'k--', label="True function")
- plt.plot(X, mu, 'b-', label="GPR mean")
+ plt.plot(X, y, "k--", label="True function")
+ plt.plot(X, mu, "b-", label="GPR mean")
plt.fill_between(X.ravel(), mu - std, mu + std, alpha=0.3, label="Uncertainty")
- plt.scatter(X_sample, y_sample, c='red', label="Samples")
+ plt.scatter(X_sample, y_sample, c="red", label="Samples")
plt.legend()
plt.title("Gaussian Process Fit")
plt.xlabel("x")
@@ -101,7 +102,7 @@ def expected_improvement(X, X_sample, y_sample, model, xi=0.01):
mu, std = model.predict(X, return_std=True)
mu_sample_opt = np.min(y_sample)
- with np.errstate(divide='warn'):
+ with np.errstate(divide="warn"):
imp = mu_sample_opt - mu - xi # because we are minimizing
Z = imp / std
ei = imp * norm.cdf(Z) + std * norm.pdf(Z)
@@ -118,7 +119,7 @@ def _(X, X_sample, expected_improvement, gpr, np, plt, y_sample):
plt.figure(figsize=(10, 4))
plt.plot(X, ei, label="Expected Improvement")
- plt.axvline(X[np.argmax(ei)], color='r', linestyle='--', label="Next sample point")
+ plt.axvline(X[np.argmax(ei)], color="r", linestyle="--", label="Next sample point")
plt.title("Acquisition Function (Expected Improvement)")
plt.xlabel("x")
plt.ylabel("EI(x)")
@@ -135,7 +136,7 @@ def bayesian_optimization(n_iter=10):
X_sample = np.array([[1.0], [2.5], [4.0]])
y_sample = black_box_function(X_sample)
- for i in range(n_iter):
+ for _ in range(n_iter):
gpr.fit(X_sample, y_sample)
ei = expected_improvement(X, X_sample, y_sample, gpr)
x_next = X[np.argmax(ei)].reshape(-1, 1)
@@ -161,8 +162,8 @@ def _(bayesian_optimization):
@app.cell
def _(X, X_opt, black_box_function, plt, y_opt):
# Plot final sampled points
- plt.plot(X, black_box_function(X), 'k--', label="True function")
- plt.scatter(X_opt, y_opt, c='red', label="Sampled Points")
+ plt.plot(X, black_box_function(X), "k--", label="True function")
+ plt.scatter(X_opt, y_opt, c="red", label="Sampled Points")
plt.title("Bayesian Optimization with Gaussian Process")
plt.xlabel("x")
plt.ylabel("f(x)")
diff --git a/public/GPR_Optimization.html b/public/GPR_Optimization.html
deleted file mode 100644
index 6bb3dc95..00000000
--- a/public/GPR_Optimization.html
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- GPR_Optimization.py
-
-
-
-
-
- GPR Optimization
-
-
-
-
-
-
-
-
-
- import%20marimo%0A%0A__generated_with%20%3D%20%220.13.7%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20from%20sklearn.gaussian_process%20import%20GaussianProcessRegressor%0A%20%20%20%20from%20sklearn.gaussian_process.kernels%20import%20Matern%2C%20WhiteKernel%2C%20ConstantKernel%20as%20C%0A%0A%20%20%20%20def%20black_box_function(x)%3A%0A%20%20%20%20%20%20%20%20return%20-%20(np.sin(3*x)%20%2B%200.5%20*%20x)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20C%2C%0A%20%20%20%20%20%20%20%20GaussianProcessRegressor%2C%0A%20%20%20%20%20%20%20%20Matern%2C%0A%20%20%20%20%20%20%20%20WhiteKernel%2C%0A%20%20%20%20%20%20%20%20black_box_function%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20plt%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(black_box_function%2C%20np%2C%20plt)%3A%0A%20%20%20%20X%20%3D%20np.linspace(0%2C%205.5%2C%201000).reshape(-1%2C%201)%0A%20%20%20%20y%20%3D%20black_box_function(X)%0A%20%20%20%20plt.plot(X%2C%20y)%0A%20%20%20%20plt.title(%22Black-box%20function%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22f(x)%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20X%2C%20y%0A%0A%0A%40app.cell%0Adef%20_(black_box_function%2C%20np)%3A%0A%20%20%20%20X_grid%20%3D%20np.linspace(0%2C%202%2C%20100).reshape(-1%2C%201)%0A%20%20%20%20y_grid%20%3D%20black_box_function(X_grid)%0A%20%20%20%20x_best%20%3D%20X_grid%5Bnp.argmax(y_grid)%5D%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(black_box_function%2C%20np)%3A%0A%20%20%20%20%23%20Initial%20sample%20points%20(simulate%20prior%20evaluations)%0A%20%20%20%20X_sample%20%3D%20np.array(%5B%5B1.0%5D%2C%20%5B3.0%5D%2C%20%5B5.5%5D%5D)%0A%20%20%20%20y_sample%20%3D%20black_box_function(X_sample)%0A%20%20%20%20return%20X_sample%2C%20y_sample%0A%0A%0A%40app.cell%0Adef%20_(C%2C%20GaussianProcessRegressor%2C%20Matern%2C%20WhiteKernel%2C%20X_sample%2C%20y_sample)%3A%0A%20%20%20%20%23%20Define%20the%20kernel%0A%20%20%20%20kernel%20%3D%20C(1.0)%20*%20Matern(length_scale%3D1.0%2C%20nu%3D2.5)%20%2B%20WhiteKernel(noise_level%3D1e-5%2C%20noise_level_bounds%3D(1e-10%2C%201e1))%0A%0A%20%20%20%20%23%20Create%20and%20fit%20the%20Gaussian%20Process%20model%0A%20%20%20%20gpr%20%3D%20GaussianProcessRegressor(kernel%3Dkernel%2C%20alpha%3D0.0)%0A%20%20%20%20gpr.fit(X_sample%2C%20y_sample)%0A%20%20%20%20return%20(gpr%2C)%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20X_sample%2C%20gpr%2C%20plt%2C%20y%2C%20y_sample)%3A%0A%20%20%20%20%23%20Predict%20across%20the%20domain%0A%20%20%20%20mu%2C%20std%20%3D%20gpr.predict(X%2C%20return_std%3DTrue)%0A%0A%20%20%20%20%23%20Plot%20the%20result%0A%20%20%20%20plt.figure(figsize%3D(10%2C%205))%0A%20%20%20%20plt.plot(X%2C%20y%2C%20'k--'%2C%20label%3D%22True%20function%22)%0A%20%20%20%20plt.plot(X%2C%20mu%2C%20'b-'%2C%20label%3D%22GPR%20mean%22)%0A%20%20%20%20plt.fill_between(X.ravel()%2C%20mu%20-%20std%2C%20mu%20%2B%20std%2C%20alpha%3D0.3%2C%20label%3D%22Uncertainty%22)%0A%20%20%20%20plt.scatter(X_sample%2C%20y_sample%2C%20c%3D'red'%2C%20label%3D%22Samples%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.title(%22Gaussian%20Process%20Fit%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22f(x)%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20from%20scipy.stats%20import%20norm%0A%0A%20%20%20%20def%20expected_improvement(X%2C%20X_sample%2C%20y_sample%2C%20model%2C%20xi%3D0.01)%3A%0A%20%20%20%20%20%20%20%20mu%2C%20std%20%3D%20model.predict(X%2C%20return_std%3DTrue)%0A%20%20%20%20%20%20%20%20mu_sample_opt%20%3D%20np.min(y_sample)%0A%0A%20%20%20%20%20%20%20%20with%20np.errstate(divide%3D'warn')%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20imp%20%3D%20mu_sample_opt%20-%20mu%20-%20xi%20%20%23%20because%20we%20are%20minimizing%0A%20%20%20%20%20%20%20%20%20%20%20%20Z%20%3D%20imp%20%2F%20std%0A%20%20%20%20%20%20%20%20%20%20%20%20ei%20%3D%20imp%20*%20norm.cdf(Z)%20%2B%20std%20*%20norm.pdf(Z)%0A%20%20%20%20%20%20%20%20%20%20%20%20ei%5Bstd%20%3D%3D%200.0%5D%20%3D%200.0%0A%0A%20%20%20%20%20%20%20%20return%20ei%0A%0A%20%20%20%20return%20(expected_improvement%2C)%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20X_sample%2C%20expected_improvement%2C%20gpr%2C%20np%2C%20plt%2C%20y_sample)%3A%0A%20%20%20%20ei%20%3D%20expected_improvement(X%2C%20X_sample%2C%20y_sample%2C%20gpr)%0A%0A%20%20%20%20plt.figure(figsize%3D(10%2C%204))%0A%20%20%20%20plt.plot(X%2C%20ei%2C%20label%3D%22Expected%20Improvement%22)%0A%20%20%20%20plt.axvline(X%5Bnp.argmax(ei)%5D%2C%20color%3D'r'%2C%20linestyle%3D'--'%2C%20label%3D%22Next%20sample%20point%22)%0A%20%20%20%20plt.title(%22Acquisition%20Function%20(Expected%20Improvement)%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22EI(x)%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20black_box_function%2C%20expected_improvement%2C%20gpr%2C%20np)%3A%0A%20%20%20%20def%20bayesian_optimization(n_iter%3D10)%3A%0A%20%20%20%20%20%20%20%20%23%20Initial%20data%0A%20%20%20%20%20%20%20%20X_sample%20%3D%20np.array(%5B%5B1.0%5D%2C%20%5B2.5%5D%2C%20%5B4.0%5D%5D)%0A%20%20%20%20%20%20%20%20y_sample%20%3D%20black_box_function(X_sample)%0A%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(n_iter)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20gpr.fit(X_sample%2C%20y_sample)%0A%20%20%20%20%20%20%20%20%20%20%20%20ei%20%3D%20expected_improvement(X%2C%20X_sample%2C%20y_sample%2C%20gpr)%0A%20%20%20%20%20%20%20%20%20%20%20%20x_next%20%3D%20X%5Bnp.argmax(ei)%5D.reshape(-1%2C%201)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Evaluate%20the%20function%20at%20the%20new%20point%0A%20%20%20%20%20%20%20%20%20%20%20%20y_next%20%3D%20black_box_function(x_next)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20the%20new%20sample%20to%20our%20dataset%0A%20%20%20%20%20%20%20%20%20%20%20%20X_sample%20%3D%20np.vstack((X_sample%2C%20x_next))%0A%20%20%20%20%20%20%20%20%20%20%20%20y_sample%20%3D%20np.append(y_sample%2C%20y_next)%0A%20%20%20%20%20%20%20%20return%20X_sample%2C%20y_sample%0A%0A%20%20%20%20return%20(bayesian_optimization%2C)%0A%0A%0A%40app.cell%0Adef%20_(bayesian_optimization)%3A%0A%20%20%20%20X_opt%2C%20y_opt%20%3D%20bayesian_optimization(n_iter%3D10)%0A%0A%20%20%20%20return%20X_opt%2C%20y_opt%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20X_opt%2C%20black_box_function%2C%20plt%2C%20y_opt)%3A%0A%20%20%20%20%23%20Plot%20final%20sampled%20points%0A%20%20%20%20plt.plot(X%2C%20black_box_function(X)%2C%20'k--'%2C%20label%3D%22True%20function%22)%0A%20%20%20%20plt.scatter(X_opt%2C%20y_opt%2C%20c%3D'red'%2C%20label%3D%22Sampled%20Points%22)%0A%20%20%20%20plt.title(%22Bayesian%20Optimization%20with%20Gaussian%20Process%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22f(x)%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
-
-
-5b6ca0cf371431f4cf60ff4f6e7e10e8c3b01c3e27a72f0ca92acba39db1f941
-
-
diff --git a/public/index.html b/public/index.html
index 6c8c1cd4..b5373537 100644
--- a/public/index.html
+++ b/public/index.html
@@ -86,12 +86,20 @@ pyspark parametrize
View the notebook
- pydantic ai examples
- View the notebook
+ diffbot llm
+ View the notebook
+
+
+ lchain deepseek
+ View the notebook
- temp
- View the notebook
+ lchain ollama
+ View the notebook
+
+
+ pydantic ai examples
+ View the notebook
+
+
+
+ import%20marimo%0A%0A__generated_with%20%3D%20%220.13.7%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Getting%20started%20with%20Diffbot%20LLM%0A%0A%20%20%20%20%60%60%60%0A%20%20%20%20touch%20.env%20%20%23%20Create%20a%20.env%20file%0A%20%20%20%20echo%20%22DIFFBOT_API_TOKEN%3Dyour-token-here%22%20%3E%3E%20.env%20%20%23%20Add%20your%20token%20to%20a%20.env%20file%0A%20%20%20%20%60%60%60%0A%20%20%20%20%23%23%23%20Your%20first%20query%20with%20citations%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20os%0A%0A%20%20%20%20from%20openai%20import%20OpenAI%0A%0A%20%20%20%20DIFFBOT_API_TOKEN%20%3D%20os.getenv(%22DIFFBOT_API_TOKEN%22)%0A%0A%20%20%20%20diffbot_client%20%3D%20OpenAI(%0A%20%20%20%20%20%20%20%20base_url%3D%22https%3A%2F%2Fllm.diffbot.com%2Frag%2Fv1%22%2C%0A%20%20%20%20%20%20%20%20api_key%3DDIFFBOT_API_TOKEN%2C%0A%20%20%20%20)%0A%0A%20%20%20%20completion%20%3D%20diffbot_client.chat.completions.create(%0A%20%20%20%20%20%20%20%20model%3D%22diffbot-small-xl%22%2C%0A%20%20%20%20%20%20%20%20messages%3D%5B%7B%22role%22%3A%20%22user%22%2C%20%22content%22%3A%20%22What%20is%20GraphRAG%3F%22%7D%5D%2C%0A%20%20%20%20)%0A%0A%20%20%20%20print(completion.choices%5B0%5D.message.content)%0A%20%20%20%20return%20DIFFBOT_API_TOKEN%2C%20OpenAI%0A%0A%0A%40app.cell%0Adef%20_(DIFFBOT_API_TOKEN%2C%20OpenAI)%3A%0A%20%20%20%20def%20query_model(query_text%2C%20model%2C%20base_url%3DNone%2C%20api_key%3DNone)%3A%0A%20%20%20%20%20%20%20%20client_args%20%3D%20%7B%7D%0A%20%20%20%20%20%20%20%20if%20base_url%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20client_args%5B%22base_url%22%5D%20%3D%20base_url%0A%20%20%20%20%20%20%20%20if%20api_key%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20client_args%5B%22api_key%22%5D%20%3D%20api_key%0A%0A%20%20%20%20%20%20%20%20client%20%3D%20OpenAI(**client_args)%0A%20%20%20%20%20%20%20%20return%20client.chat.completions.create(%0A%20%20%20%20%20%20%20%20%20%20%20%20model%3Dmodel%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20messages%3D%5B%7B%22role%22%3A%20%22user%22%2C%20%22content%22%3A%20query_text%7D%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%0A%20%20%20%20def%20query_diffbot(query_text%2C%20model%3D%22diffbot-small-xl%22)%3A%0A%20%20%20%20%20%20%20%20return%20query_model(%0A%20%20%20%20%20%20%20%20%20%20%20%20query_text%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20model%3Dmodel%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20base_url%3D%22https%3A%2F%2Fllm.diffbot.com%2Frag%2Fv1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20api_key%3DDIFFBOT_API_TOKEN%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%0A%20%20%20%20def%20query_openai(query_text%2C%20model%3D%22o4-mini%22)%3A%0A%20%20%20%20%20%20%20%20return%20query_model(query_text%2C%20model%3Dmodel)%0A%0A%0A%20%20%20%20def%20print_response(response)%3A%0A%20%20%20%20%20%20%20%20print(response.choices%5B0%5D.message.content)%0A%20%20%20%20return%20print_response%2C%20query_diffbot%2C%20query_openai%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_diffbot)%3A%0A%20%20%20%20diffbot_completion%20%3D%20query_diffbot(%22What%20is%20GraphRAG%3F%22)%0A%20%20%20%20print_response(diffbot_completion)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_openai)%3A%0A%20%20%20%20openai_completion%20%3D%20query_openai(%22What%20is%20GraphRAG%3F%22)%0A%20%20%20%20print_response(openai_completion)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_diffbot)%3A%0A%20%20%20%20diffbot_completion_1%20%3D%20query_diffbot(%22What%20is%20the%20weather%20in%20Tokyo%3F%22)%0A%20%20%20%20print_response(diffbot_completion_1)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_openai)%3A%0A%20%20%20%20openai_completion_1%20%3D%20query_openai(%22What%20is%20the%20weather%20in%20Tokyo%3F%22)%0A%20%20%20%20print_response(openai_completion_1)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_diffbot)%3A%0A%20%20%20%20diffbot_completion_2%20%3D%20query_diffbot(%0A%20%20%20%20%20%20%20%20%22Find%20me%20the%20information%20on%20the%20upcoming%20hackathon%20organized%20by%20HuggingFace%22%0A%20%20%20%20)%0A%20%20%20%20print_response(diffbot_completion_2)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_openai)%3A%0A%20%20%20%20completion_openai_2%20%3D%20query_openai(%22Find%20me%20the%20information%20on%20the%20upcoming%20hackathon%20organized%20by%20HuggingFace%22)%0A%0A%20%20%20%20print_response(completion_openai_2)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_diffbot)%3A%0A%20%20%20%20diffbot_completion_3%20%3D%20query_diffbot(%22Find%20the%20square%20root%20of%2012394890235%22)%0A%20%20%20%20print_response(diffbot_completion_3)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_openai)%3A%0A%20%20%20%20openai_completion_3%20%3D%20query_openai(%22Find%20the%20square%20root%20of%2012394890235%22)%0A%20%20%20%20print_response(openai_completion_3)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_diffbot)%3A%0A%20%20%20%20_image_url%20%3D%20%22https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2F4%2F4f%2FBlack_hole_-_Messier_87_crop_max_res.jpg%2F960px-Black_hole_-_Messier_87_crop_max_res.jpg%22%0A%0A%20%20%20%20diffbot_completion_4%20%3D%20query_diffbot(f%22Describe%20this%20image%20to%20me%3A%20%7B_image_url%7D%22)%0A%20%20%20%20print_response(diffbot_completion_4)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_response%2C%20query_openai)%3A%0A%20%20%20%20_image_url%20%3D%20%22https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2F4%2F4f%2FBlack_hole_-_Messier_87_crop_max_res.jpg%2F960px-Black_hole_-_Messier_87_crop_max_res.jpg%22%0A%0A%20%20%20%20openai_completion_4%20%3D%20query_openai(f%22Describe%20this%20image%20to%20me%3A%20%7B_image_url%7D%22)%0A%20%20%20%20print_response(openai_completion_4)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(query_diffbot)%3A%0A%20%20%20%20_image_url%20%3D%20%22https%3A%2F%2Fcodecut.ai%2Fwp-content%2Fuploads%2F2025%2F05%2Fcodecut-home-image.png%22%0A%20%20%20%20diffbot_completion_5%20%3D%20query_diffbot(f%22Describe%20this%20image%20to%20me%3A%20%7B_image_url%7D%22)%0A%20%20%20%20print(diffbot_completion_5.choices%5B0%5D.message.content)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(query_openai)%3A%0A%20%20%20%20_image_url%20%3D%20%22https%3A%2F%2Fcodecut.ai%2Fwp-content%2Fuploads%2F2025%2F05%2Fcodecut-home-image.png%22%0A%0A%20%20%20%20openai_completion_5%20%3D%20query_openai(f%22Describe%20this%20image%20to%20me%3A%20%7B_image_url%7D%22)%0A%20%20%20%20print(openai_completion_5.choices%5B0%5D.message.content)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Self-hosting%20for%20privacy%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20If%20your%20use-case%20involves%20high-stakes%20sensitive%20information%20like%20financial%20or%20medical%20databases%2C%20you%20can%20get%20all%20the%20benefits%20of%20the%20Serverless%20API%20locally%20by%20running%20a%20couple%20of%20Docker%20commands%3A%0A%0A%20%20%20%20For%20the%208B%20model%2C%20much%20smaller%20in%20disk%20size%3A%0A%0A%20%20%20%20%60%60%60bash%0A%20%20%20%20docker%20run%20--runtime%20nvidia%20--gpus%20all%20-p%208001%3A8001%20--ipc%3Dhost%20-e%20VLLM_OPTIONS%3D%22--model%20diffbot%2FLlama-3.1-Diffbot-Small-2412%20--served-model-name%20diffbot-small%20--enable-prefix-caching%22%20%20docker.io%2Fdiffbot%2Fdiffbot-llm-inference%3Alatest%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20For%20the%20larger%2070B%20model%20with%20full%20capabilities%3A%0A%0A%20%20%20%20%60%60%60bash%0A%20%20%20%20docker%20run%20--runtime%20nvidia%20--gpus%20all%20-p%208001%3A8001%20--ipc%3Dhost%20-e%20VLLM_OPTIONS%3D%22--model%20diffbot%2FLlama-3.3-Diffbot-Small-XL-2412%20--served-model-name%20diffbot-small-xl%20--enable-prefix-caching%20--quantization%20fp8%20--tensor-parallel-size%202%22%20%20docker.io%2Fdiffbot%2Fdiffbot-llm-inference%3Alatest%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20Once%20the%20application%20starts%20up%20successfully%20and%20you%20see%20a%20message%20like%20the%20following%3A%0A%0A%20%20%20%20%60%60%60plaintext%0A%20%20%20%20INFO%3A%20%20Application%20startup%20complete.%0A%20%20%20%20INFO%3A%20%20Uvicorn%20running%20on%20http%3A%2F%2F0.0.0.0%3A8000%20(Press%20CTRL%2BC%20to%20quit)%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20You%20can%20run%20all%20the%20examples%20above%20by%20replacing%20the%20base%20URL%20with%20the%20endpoint%20%60http%3A%2F%2Flocalhost%3A8001%2Frag%2Fv1%60.%0A%0A%20%20%20%20However%2C%20do%20note%20that%20these%20models%20require%20high-end%20GPUs%20like%20A100%20and%20H100s%20to%20run%20at%20full%20precision.%20If%20you%20don't%20have%20the%20right%20hardware%2C%20consider%20using%20%5BRunPod.io%5D(https%3A%2F%2Frunpod.io)%20which%20cost%3A%0A%0A%20%20%20%20-%20%245.98%2Fhr%20for%20dual%20H100%20GPU%20setup%20(total%20160%20GB%20VRAM)%0A%20%20%20%20-%20%241.89%2Fhr%20for%20a%20single%20A100%20GPU%20setup%20(80%20GB%20VRAM)%0A%0A%20%20%20%20!%5B%5D(images%2Frunpod-instances.png)%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Building%20real-world%20applications%20with%20Diffbot%20and%20LangChain%0A%0A%20%20%20%20%23%23%23%20LangChain%20%2B%20Diffbot%20basics%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(DIFFBOT_API_TOKEN)%3A%0A%20%20%20%20from%20langchain_openai%20import%20ChatOpenAI%0A%0A%20%20%20%20llm%20%3D%20ChatOpenAI(%0A%20%20%20%20%20%20%20%20model%3D%22diffbot-small-xl%22%2C%0A%20%20%20%20%20%20%20%20temperature%3D0%2C%0A%20%20%20%20%20%20%20%20max_tokens%3DNone%2C%0A%20%20%20%20%20%20%20%20timeout%3DNone%2C%0A%20%20%20%20%20%20%20%20base_url%3D%22https%3A%2F%2Fllm.diffbot.com%2Frag%2Fv1%22%2C%0A%20%20%20%20%20%20%20%20api_key%3DDIFFBOT_API_TOKEN%2C%0A%20%20%20%20)%0A%20%20%20%20return%20ChatOpenAI%2C%20llm%0A%0A%0A%40app.cell%0Adef%20_(llm)%3A%0A%20%20%20%20messages%20%3D%20%5B%0A%20%20%20%20%20%20%20%20(%22system%22%2C%20%22You%20are%20a%20data%20scientist%20who%20writes%20efficient%20Python%20code.%22)%2C%0A%20%20%20%20%20%20%20%20(%22human%22%2C%20%22Given%20a%20DataFrame%20with%20columns%20'product'%20and%20'sales'%2C%20calculates%20the%20total%20sales%20for%20each%20product.%22)%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20ai_msg%20%3D%20llm.invoke(messages)%0A%20%20%20%20print(ai_msg.content)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(llm)%3A%0A%20%20%20%20from%20langchain_core.prompts%20import%20ChatPromptTemplate%0A%0A%20%20%20%20prompt%20%3D%20ChatPromptTemplate.from_messages(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22system%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22You%20are%20a%20data%20scientist%20who%20writes%20efficient%20%7Blanguage%7D%20code%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22human%22%2C%20%22%7Binput%7D%22)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20chain%20%3D%20prompt%20%7C%20llm%0A%20%20%20%20_result%20%3D%20chain.invoke(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22language%22%3A%20%22SQL%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22input%22%3A%20%22Given%20a%20table%20with%20columns%20'product'%20and%20'sales'%2C%20calculates%20the%20total%20sales%20for%20each%20product.%22%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20print(_result.content)%0A%20%20%20%20return%20(ChatPromptTemplate%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Building%20a%20RAG%20application%20with%20Diffbot%20and%20LangChain%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ChatOpenAI%2C%20ChatPromptTemplate)%3A%0A%20%20%20%20import%20json%0A%20%20%20%20from%20typing%20import%20Dict%2C%20List%0A%0A%20%20%20%20from%20langchain_core.output_parsers%20import%20StrOutputParser%0A%0A%20%20%20%20class%20ResearchAssistant%3A%0A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20diffbot_api_key%3A%20str)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.llm%20%3D%20ChatOpenAI(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20model%3D%22diffbot-small-xl%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20temperature%3D0.3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20base_url%3D%22https%3A%2F%2Fllm.diffbot.com%2Frag%2Fv1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20api_key%3Ddiffbot_api_key%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.setup_chains()%0A%0A%20%20%20%20%20%20%20%20def%20setup_chains(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.topic_extraction_prompt%20%3D%20ChatPromptTemplate.from_template(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Analyze%20the%20following%20document%20and%20extract%203-5%20main%20topics%20or%20entities%20that%20would%20benefit%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20from%20current%20information.%20Return%20as%20a%20JSON%20list%20of%20topics.%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Document%3A%20%7Bdocument%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Topics%20(JSON%20format)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.research_prompt%20%3D%20ChatPromptTemplate.from_template(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Provide%20comprehensive%2C%20current%20information%20about%3A%20%7Btopic%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Context%20from%20document%3A%20%7Bcontext%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Include%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201.%20Current%20status%20and%20recent%20developments%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%202.%20Key%20statistics%20or%20data%20points%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%203.%20Recent%20news%20or%20updates%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%204.%20Relevant%20industry%20trends%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Ensure%20all%20facts%20are%20cited%20with%20sources.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.report_prompt%20%3D%20ChatPromptTemplate.from_template(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Create%20a%20comprehensive%20research%20report%20based%20on%20the%20document%20analysis%20and%20current%20research.%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Original%20Document%20Summary%3A%20%7Bdocument_summary%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Research%20Findings%3A%20%7Bresearch_findings%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Generate%20a%20well-structured%20report%20that%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201.%20Summarizes%20the%20original%20document's%20main%20points%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%202.%20Provides%20current%20context%20for%20each%20major%20topic%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%203.%20Identifies%20any%20outdated%20information%20in%20the%20document%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%204.%20Suggests%20areas%20for%20further%20investigation%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Include%20proper%20citations%20throughout.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20def%20extract_topics(self%2C%20document%3A%20str)%20-%3E%20List%5Bstr%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Extract%20main%20topics%20from%20the%20document%20for%20research.%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20chain%20%3D%20self.topic_extraction_prompt%20%7C%20self.llm%20%7C%20StrOutputParser()%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_result%20%3D%20chain.invoke(%7B%22document%22%3A%20document%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20topics%20%3D%20json.loads(_result.strip())%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20topics%20if%20isinstance(topics%2C%20list)%20else%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20(json.JSONDecodeError%2C%20Exception)%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Error%20extracting%20topics%3A%20%7Be%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20def%20research_topic(self%2C%20topic%3A%20str%2C%20context%3A%20str)%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Research%20current%20information%20about%20a%20specific%20topic.%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20chain%20%3D%20self.research_prompt%20%7C%20self.llm%20%7C%20StrOutputParser()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20chain.invoke(%7B%22topic%22%3A%20topic%2C%20%22context%22%3A%20context%7D)%0A%0A%20%20%20%20%20%20%20%20def%20generate_report(self%2C%20document%3A%20str%2C%20research_findings%3A%20List%5BDict%5D)%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Generate%20comprehensive%20report%20with%20current%20information.%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20summary_prompt%20%3D%20ChatPromptTemplate.from_template(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Provide%20a%20concise%20summary%20of%20this%20document%3A%20%7Bdocument%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20summary_chain%20%3D%20summary_prompt%20%7C%20self.llm%20%7C%20StrOutputParser()%0A%20%20%20%20%20%20%20%20%20%20%20%20document_summary%20%3D%20summary_chain.invoke(%7B%22document%22%3A%20document%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20findings_text%20%3D%20%22%5Cn%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22**%7Bfinding%5B'topic'%5D%7D%3A**%5Cn%7Bfinding%5B'research'%5D%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20finding%20in%20research_findings%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20report_chain%20%3D%20self.report_prompt%20%7C%20self.llm%20%7C%20StrOutputParser()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20report_chain.invoke(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22document_summary%22%3A%20document_summary%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22research_findings%22%3A%20findings_text%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20def%20analyze_document(self%2C%20document%3A%20str)%20-%3E%20Dict%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Complete%20document%20analysis%20with%20current%20research.%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22Extracting%20topics%20from%20document...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20topics%20%3D%20self.extract_topics(document)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20topics%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%22error%22%3A%20%22Could%20not%20extract%20topics%20from%20document%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Researching%20%7Blen(topics)%7D%20topics...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20research_findings%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20topic%20in%20topics%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20-%20Researching%3A%20%7Btopic%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20research%20%3D%20self.research_topic(topic%2C%20document)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20research_findings.append(%7B%22topic%22%3A%20topic%2C%20%22research%22%3A%20research%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22Generating%20comprehensive%20report...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20final_report%20%3D%20self.generate_report(document%2C%20research_findings)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22topics%22%3A%20topics%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22research_findings%22%3A%20research_findings%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22final_report%22%3A%20final_report%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22status%22%3A%20%22completed%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20return%20(ResearchAssistant%2C)%0A%0A%0A%40app.cell%0Adef%20_(DIFFBOT_API_TOKEN%2C%20ResearchAssistant)%3A%0A%20%20%20%20assistant%20%3D%20ResearchAssistant(DIFFBOT_API_TOKEN)%0A%20%20%20%20sample_document%20%3D%20%22%22%22%0A%20%20%20%20%20%20%20%20Artificial%20Intelligence%20has%20made%20significant%20progress%20in%20natural%20language%20processing.%0A%20%20%20%20%20%20%20%20Companies%20like%20OpenAI%20and%20Google%20have%20released%20powerful%20language%20models.%0A%20%20%20%20%20%20%20%20The%20field%20of%20machine%20learning%20continues%20to%20evolve%20with%20new%20architectures%20and%20techniques.%0A%20%20%20%20%20%20%20%20Investment%20in%20AI%20startups%20reached%20%2425%20billion%20in%202023.%0A%20%20%20%20%22%22%22%0A%20%20%20%20_result%20%3D%20assistant.analyze_document(sample_document)%0A%20%20%20%20print(_result%5B%22final_report%22%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
+
+
+b5bcdf9cf66566e17a715df758bd512a086afb76539ec77e27c1345acf7fc1b1
+
diff --git a/public/llm/diffbot_llm.html b/public/llm/diffbot_llm.html
new file mode 100644
index 00000000..b073304c
--- /dev/null
+++ b/public/llm/diffbot_llm.html
@@ -0,0 +1,82 @@
+
+
+