Public
Edited
Mar 23, 2024
2 forks
Importers
13 stars
Insert cell
Insert cell
Insert cell
viewof showExample = Inputs.button("View an example")
Insert cell
md`Earliest timestamp: ${new Date(
earliest * 1000
)}, latest timestamp: ${new Date(
latest * 1000
)}, gap between them: ${gap_minutes} minutes`
Insert cell
viewof include_timestamps = Inputs.toggle({
label: "Include timestamps",
value: true
})
Insert cell
Insert cell
Insert cell
transcript = JSON.parse(input || "{}")
Insert cell
markdown = {
if (!transcript.title) {
return "";
}
let lines = [];
lines.push("# " + transcript.title);
lines.push("\n" + formatDate(transcript.create_time));
const bits = Object.values(transcript.mapping)
.map((item) => {
if (!item.message) {
return null;
}
const author =
{ user: "Prompt", assistant: "ChatGPT" }[item.message.author.role] ||
item.message.author.role;
if (item.message.content.content_type == "text") {
let ts = "";
if (include_timestamps) {
ts = " " + formatDate(item.message.create_time);
}
return (
`\n\n**${author}**${ts}:\n\n` +
item.message.content.parts.join("\n") +
"\n\n\n---\n\n"
);
}
if (item.message.content.content_type == "code") {
return (
`\n\n**Generated code**: ` +
"\n```python\n" +
item.message.content.text +
"\n```\n\n---\n\n"
);
}
if (item.message.content.content_type == "execution_output") {
return (
`\n\n**Execution output**: ` +
"\n```\n" +
item.message.content.text +
"\n```\n\n---\n\n"
);
}
})
.filter((n) => n);

const s = lines.join("\n") + bits.join("\n");
return s.replace(/(\n{2,})/g, "\n\n");
}
Insert cell
function formatDate(d) {
return new Date(d * 1000).toLocaleString("en-US", {
year: "numeric",
month: "long",
day: "numeric",
hour: "numeric",
minute: "2-digit",
second: "2-digit"
});
}
Insert cell
example = {
return {
title: "River Crossing Puzzle",
create_time: 1680818539.7645,
update_time: 1680818592,
mapping: {
"f00a9737-def8-4828-b8d3-4e9ca6de42c9": {
id: "f00a9737-def8-4828-b8d3-4e9ca6de42c9",
message: {
id: "f00a9737-def8-4828-b8d3-4e9ca6de42c9",
author: {
role: "system",
metadata: {}
},
create_time: 1680818539.7645,
content: {
text: "You are ChatGPT, a large language model trained by OpenAI.\nMath Rendering: ChatGPT should render math expressions using LaTeX within \\(...\\) for inline equations and \\[...\\] for block equations. Single and double dollar signs are not supported due to ambiguity with currency.\nKnowledge cutoff: 2021-09\nCurrent date: 2023-04-06",
tools_section: {
python:
"When you send a message containing Python code to python, it will be executed in a\nstateful Jupyter notebook environment. python will respond with the output of the execution or time out after 120.0\nseconds. The drive at '/mnt/data' can be used to save and persist user files. Internet access for this session is disabled. Do not make external web requests or API calls as they will fail."
},
content_type: "system_message"
},
end_turn: true,
weight: 1,
metadata: {},
recipient: "all"
},
parent: "0162e6ea-1604-49de-a14e-5de37c0957ef",
children: ["4bc552b5-aed8-4fa5-8d28-cf5b60af40c2"]
},
"0162e6ea-1604-49de-a14e-5de37c0957ef": {
id: "0162e6ea-1604-49de-a14e-5de37c0957ef",
children: ["f00a9737-def8-4828-b8d3-4e9ca6de42c9"]
},
"4bc552b5-aed8-4fa5-8d28-cf5b60af40c2": {
id: "4bc552b5-aed8-4fa5-8d28-cf5b60af40c2",
message: {
id: "4bc552b5-aed8-4fa5-8d28-cf5b60af40c2",
author: {
role: "user",
metadata: {}
},
create_time: 1680818539.765184,
content: {
content_type: "text",
parts: [
"A man with a boat needs to cross the river. He can only take one thing at a time besides himself. He needs to take the zelpug, a sphang and a cnurdle across the river.\n\nRule A: zelpug cannot be left alone with sphang\nRule B: sphang cannot be left alone with cnurdle\nRule C: cnurdle cannot be left alone with zelpug\n\nHow can the man solve this puzzle and get all three things across the river? Is it possible?\n\nAt each step, show the items on each side of the river and for each side of the river list each rule and say if it is being obeyed\n\nUse Python to solve this"
]
},
weight: 1,
metadata: {
timestamp_: "absolute"
},
recipient: "all"
},
parent: "f00a9737-def8-4828-b8d3-4e9ca6de42c9",
children: ["9ba497c8-f200-4cb3-965d-91a35a94d6ad"]
},
"9ba497c8-f200-4cb3-965d-91a35a94d6ad": {
id: "9ba497c8-f200-4cb3-965d-91a35a94d6ad",
message: {
id: "9ba497c8-f200-4cb3-965d-91a35a94d6ad",
author: {
role: "assistant",
metadata: {}
},
create_time: 1680818590.62839,
content: {
content_type: "text",
parts: [
"To solve this problem, we can implement a depth-first search (DFS) algorithm to explore all possible states of the riverbanks until we find a solution. We'll keep track of the states of the riverbanks at each step, and we'll recursively explore each valid move the man can make. If we reach a state where all three items are on the opposite side of the river, we've found a solution.\n\nTo represent the state of the riverbanks, we'll use two sets: one for the starting side and one for the ending side. Each set will contain the items that are currently on that side of the river. The man's position will also be tracked as a boolean variable (True for starting side, False for ending side).\n\nWe'll start by implementing a function that checks whether the current state of the riverbanks violates any of the three rules. If it does, the function will return False; otherwise, it will return True. The rules are as follows:\n- Rule A: zelpug cannot be left alone with sphang\n- Rule B: sphang cannot be left alone with cnurdle\n- Rule C: cnurdle cannot be left alone with zelpug\n\nWe'll then use this function in our DFS algorithm to determine whether a move is valid. If a move doesn't violate any rules, we'll proceed to explore the next state. To avoid infinite loops, we'll keep track of visited states and avoid revisiting them.\n\nFinally, we'll implement the DFS algorithm and run it from the initial state to find the solution."
]
},
end_turn: false,
weight: 1,
metadata: {
model_slug: "text-davinci-002-code",
finish_details: {
type: "stop",
stop: "<|im_end|>"
},
timestamp_: "absolute"
},
recipient: "all"
},
parent: "4bc552b5-aed8-4fa5-8d28-cf5b60af40c2",
children: ["4b861a00-c1ff-4b6c-ab6f-3de5243713c3"]
},
"4b861a00-c1ff-4b6c-ab6f-3de5243713c3": {
id: "4b861a00-c1ff-4b6c-ab6f-3de5243713c3",
message: {
id: "4b861a00-c1ff-4b6c-ab6f-3de5243713c3",
author: {
role: "assistant",
metadata: {}
},
create_time: 1680818590.628847,
content: {
content_type: "code",
language: "unknown",
text: 'from typing import List, Tuple, Set\r\n\r\ndef is_valid_state(side: Set[str]) -> bool:\r\n # Check if the current state of the riverbank violates any rules\r\n if "zelpug" in side and "sphang" in side and "cnurdle" not in side:\r\n return False # Rule A violated\r\n if "sphang" in side and "cnurdle" in side and "zelpug" not in side:\r\n return False # Rule B violated\r\n if "cnurdle" in side and "zelpug" in side and "sphang" not in side:\r\n return False # Rule C violated\r\n return True\r\n\r\ndef dfs(\r\n start_side: Set[str], end_side: Set[str], man_pos: bool, visited: Set[Tuple[Set[str], Set[str], bool]],\r\n steps: List[Tuple[Set[str], Set[str], bool]]\r\n) -> bool:\r\n # If all items are on the ending side, we found a solution\r\n if len(end_side) == 3:\r\n return True\r\n\r\n # Mark the current state as visited\r\n visited.add((frozenset(start_side), frozenset(end_side), man_pos))\r\n\r\n # Check valid moves\r\n if man_pos: # Man is on the starting side\r\n for item in start_side:\r\n # Try to move the item to the ending side\r\n next_start_side = start_side - {item}\r\n next_end_side = end_side | {item}\r\n if (\r\n is_valid_state(next_start_side) and is_valid_state(next_end_side) and\r\n (frozenset(next_start_side), frozenset(next_end_side), False) not in visited\r\n ):\r\n steps.append((next_start_side, next_end_side, False))\r\n # Recursively explore the next state\r\n if dfs(next_start_side, next_end_side, False, visited, steps):\r\n return True\r\n # Backtrack\r\n steps.pop()\r\n else: # Man is on the ending side\r\n for item in end_side:\r\n # Try to move the item to the starting side\r\n next_start_side = start_side | {item}\r\n next_end_side = end_side - {item}\r\n if (\r\n is_valid_state(next_start_side) and is_valid_state(next_end_side) and\r\n (frozenset(next_start_side), frozenset(next_end_side), True) not in visited\r\n ):\r\n steps.append((next_start_side, next_end_side, True))\r\n # Recursively explore the next state\r\n if dfs(next_start_side, next_end_side, True, visited, steps):\r\n return True\r\n # Backtrack\r\n steps.pop()\r\n\r\n return False\r\n\r\n# Initial state\r\nstart_side = {"zelpug", "sphang", "cnurdle"}\r\nend_side = set()\r\nman_pos = True # Man is initially on the starting side\r\nvisited = set()\r\nsteps = [(start_side, end_side, man_pos)]\r\n\r\n# Run DFS to find the solution\r\nfound_solution = dfs(start_side, end_side, man_pos, visited, steps)\r\nsteps if found_solution else "No solution found"'
},
end_turn: false,
weight: 1,
metadata: {
model_slug: "text-davinci-002-code",
finish_details: {
type: "stop",
stop: "<|im_end|>"
},
timestamp_: "absolute"
},
recipient: "python"
},
parent: "9ba497c8-f200-4cb3-965d-91a35a94d6ad",
children: ["84b35367-7e45-43f4-a677-55805b66ea37"]
},
"84b35367-7e45-43f4-a677-55805b66ea37": {
id: "84b35367-7e45-43f4-a677-55805b66ea37",
message: {
id: "84b35367-7e45-43f4-a677-55805b66ea37",
author: {
role: "tool",
name: "python",
metadata: {}
},
create_time: 1680818590.629172,
update_time: 1680818583.161209,
content: {
content_type: "execution_output",
text: "'No solution found'"
},
weight: 1,
metadata: {
aggregate_result: {
status: "success",
run_id: "83501796-1024-41e9-8d9b-958af9c6d941",
start_time: 1680818583.0820127,
update_time: 1680818583.1603963,
code: 'from typing import List, Tuple, Set\r\n\r\ndef is_valid_state(side: Set[str]) -> bool:\r\n # Check if the current state of the riverbank violates any rules\r\n if "zelpug" in side and "sphang" in side and "cnurdle" not in side:\r\n return False # Rule A violated\r\n if "sphang" in side and "cnurdle" in side and "zelpug" not in side:\r\n return False # Rule B violated\r\n if "cnurdle" in side and "zelpug" in side and "sphang" not in side:\r\n return False # Rule C violated\r\n return True\r\n\r\ndef dfs(\r\n start_side: Set[str], end_side: Set[str], man_pos: bool, visited: Set[Tuple[Set[str], Set[str], bool]],\r\n steps: List[Tuple[Set[str], Set[str], bool]]\r\n) -> bool:\r\n # If all items are on the ending side, we found a solution\r\n if len(end_side) == 3:\r\n return True\r\n\r\n # Mark the current state as visited\r\n visited.add((frozenset(start_side), frozenset(end_side), man_pos))\r\n\r\n # Check valid moves\r\n if man_pos: # Man is on the starting side\r\n for item in start_side:\r\n # Try to move the item to the ending side\r\n next_start_side = start_side - {item}\r\n next_end_side = end_side | {item}\r\n if (\r\n is_valid_state(next_start_side) and is_valid_state(next_end_side) and\r\n (frozenset(next_start_side), frozenset(next_end_side), False) not in visited\r\n ):\r\n steps.append((next_start_side, next_end_side, False))\r\n # Recursively explore the next state\r\n if dfs(next_start_side, next_end_side, False, visited, steps):\r\n return True\r\n # Backtrack\r\n steps.pop()\r\n else: # Man is on the ending side\r\n for item in end_side:\r\n # Try to move the item to the starting side\r\n next_start_side = start_side | {item}\r\n next_end_side = end_side - {item}\r\n if (\r\n is_valid_state(next_start_side) and is_valid_state(next_end_side) and\r\n (frozenset(next_start_side), frozenset(next_end_side), True) not in visited\r\n ):\r\n steps.append((next_start_side, next_end_side, True))\r\n # Recursively explore the next state\r\n if dfs(next_start_side, next_end_side, True, visited, steps):\r\n return True\r\n # Backtrack\r\n steps.pop()\r\n\r\n return False\r\n\r\n# Initial state\r\nstart_side = {"zelpug", "sphang", "cnurdle"}\r\nend_side = set()\r\nman_pos = True # Man is initially on the starting side\r\nvisited = set()\r\nsteps = [(start_side, end_side, man_pos)]\r\n\r\n# Run DFS to find the solution\r\nfound_solution = dfs(start_side, end_side, man_pos, visited, steps)\r\nsteps if found_solution else "No solution found"',
end_time: 1680818583.1603963,
final_expression_output: "'No solution found'",
messages: [],
jupyter_messages: [
{
header: {
msg_id: "3cee3bdc-58ea88d555f8a01263e11003_10_13",
msg_type: "status",
username: "username",
session: "3cee3bdc-58ea88d555f8a01263e11003",
date: "2023-04-06T22:03:03.088701+00:00",
version: "5.3"
},
msg_id: "3cee3bdc-58ea88d555f8a01263e11003_10_13",
msg_type: "status",
parent_header: {
msg_id: "78332853-3a5254f6d930e91e5d284be8_5_1",
msg_type: "execute_request",
username: "username",
session: "78332853-3a5254f6d930e91e5d284be8",
date: "2023-04-06T22:03:03.086384+00:00",
version: "5.3"
},
metadata: {},
content: {
execution_state: "busy"
},
buffers: []
},
{
header: {
msg_id: "3cee3bdc-58ea88d555f8a01263e11003_10_14",
msg_type: "execute_input",
username: "username",
session: "3cee3bdc-58ea88d555f8a01263e11003",
date: "2023-04-06T22:03:03.089872+00:00",
version: "5.3"
},
msg_id: "3cee3bdc-58ea88d555f8a01263e11003_10_14",
msg_type: "execute_input",
parent_header: {
msg_id: "78332853-3a5254f6d930e91e5d284be8_5_1",
msg_type: "execute_request",
username: "username",
session: "78332853-3a5254f6d930e91e5d284be8",
date: "2023-04-06T22:03:03.086384+00:00",
version: "5.3"
},
metadata: {},
content: {
code: 'from typing import List, Tuple, Set\r\n\r\ndef is_valid_state(side: Set[str]) -> bool:\r\n # Check if the current state of the riverbank violates any rules\r\n if "zelpug" in side and "sphang" in side and "cnurdle" not in side:\r\n return False # Rule A violated\r\n if "sphang" in side and "cnurdle" in side and "zelpug" not in side:\r\n return False # Rule B violated\r\n if "cnurdle" in side and "zelpug" in side and "sphang" not in side:\r\n return False # Rule C violated\r\n return True\r\n\r\ndef dfs(\r\n start_side: Set[str], end_side: Set[str], man_pos: bool, visited: Set[Tuple[Set[str], Set[str], bool]],\r\n steps: List[Tuple[Set[str], Set[str], bool]]\r\n) -> bool:\r\n # If all items are on the ending side, we found a solution\r\n if len(end_side) == 3:\r\n return True\r\n\r\n # Mark the current state as visited\r\n visited.add((frozenset(start_side), frozenset(end_side), man_pos))\r\n\r\n # Check valid moves\r\n if man_pos: # Man is on the starting side\r\n for item in start_side:\r\n # Try to move the item to the ending side\r\n next_start_side = start_side - {item}\r\n next_end_side = end_side | {item}\r\n if (\r\n is_valid_state(next_start_side) and is_valid_state(next_end_side) and\r\n (frozenset(next_start_side), frozenset(next_end_side), False) not in visited\r\n ):\r\n steps.append((next_start_side, next_end_side, False))\r\n # Recursively explore the next state\r\n if dfs(next_start_side, next_end_side, False, visited, steps):\r\n return True\r\n # Backtrack\r\n steps.pop()\r\n else: # Man is on the ending side\r\n for item in end_side:\r\n # Try to move the item to the starting side\r\n next_start_side = start_side | {item}\r\n next_end_side = end_side - {item}\r\n if (\r\n is_valid_state(next_start_side) and is_valid_state(next_end_side) and\r\n (frozenset(next_start_side), frozenset(next_end_side), True) not in visited\r\n ):\r\n steps.append((next_start_side, next_end_side, True))\r\n # Recursively explore the next state\r\n if dfs(next_start_side, next_end_side, True, visited, steps):\r\n return True\r\n # Backtrack\r\n steps.pop()\r\n\r\n return False\r\n\r\n# Initial state\r\nstart_side = {"zelpug", "sphang", "cnurdle"}\r\nend_side = set()\r\nman_pos = True # Man is initially on the starting side\r\nvisited = set()\r\nsteps = [(start_side, end_side, man_pos)]\r\n\r\n# Run DFS to find the solution\r\nfound_solution = dfs(start_side, end_side, man_pos, visited, steps)\r\nsteps if found_solution else "No solution found"',
execution_count: 1
},
buffers: []
},
{
header: {
msg_id: "3cee3bdc-58ea88d555f8a01263e11003_10_15",
msg_type: "execute_result",
username: "username",
session: "3cee3bdc-58ea88d555f8a01263e11003",
date: "2023-04-06T22:03:03.107975+00:00",
version: "5.3"
},
msg_id: "3cee3bdc-58ea88d555f8a01263e11003_10_15",
msg_type: "execute_result",
parent_header: {
msg_id: "78332853-3a5254f6d930e91e5d284be8_5_1",
msg_type: "execute_request",
username: "username",
session: "78332853-3a5254f6d930e91e5d284be8",
date: "2023-04-06T22:03:03.086384+00:00",
version: "5.3"
},
metadata: {},
content: {
data: {
"text/plain": "'No solution found'"
},
metadata: {},
execution_count: 1
},
buffers: []
},
{
header: {
msg_id: "3cee3bdc-58ea88d555f8a01263e11003_10_17",
msg_type: "status",
username: "username",
session: "3cee3bdc-58ea88d555f8a01263e11003",
date: "2023-04-06T22:03:03.117721+00:00",
version: "5.3"
},
msg_id: "3cee3bdc-58ea88d555f8a01263e11003_10_17",
msg_type: "status",
parent_header: {
msg_id: "78332853-3a5254f6d930e91e5d284be8_5_1",
msg_type: "execute_request",
username: "username",
session: "78332853-3a5254f6d930e91e5d284be8",
date: "2023-04-06T22:03:03.086384+00:00",
version: "5.3"
},
metadata: {},
content: {
execution_state: "idle"
},
buffers: []
}
]
},
model_slug: "text-davinci-002-code",
timestamp_: "absolute"
},
recipient: "all"
},
parent: "4b861a00-c1ff-4b6c-ab6f-3de5243713c3",
children: ["3e07a897-750b-4ebf-a491-b66117142169"]
},
"3e07a897-750b-4ebf-a491-b66117142169": {
id: "3e07a897-750b-4ebf-a491-b66117142169",
message: {
id: "3e07a897-750b-4ebf-a491-b66117142169",
author: {
role: "assistant",
metadata: {}
},
create_time: 1680818590.629483,
content: {
content_type: "text",
parts: [
"Based on the depth-first search algorithm, there is no solution to this puzzle. It's impossible for the man to take the zelpug, sphang, and cnurdle across the river while obeying all three rules (Rule A, Rule B, and Rule C). Therefore, the man cannot solve this puzzle and get all three things across the river."
]
},
end_turn: true,
weight: 1,
metadata: {
model_slug: "text-davinci-002-code",
finish_details: {
type: "stop",
stop: "<|diff_marker|>"
},
timestamp_: "absolute"
},
recipient: "all"
},
parent: "84b35367-7e45-43f4-a677-55805b66ea37",
children: []
}
},
moderation_results: [],
current_node: "3e07a897-750b-4ebf-a491-b66117142169"
};
}
Insert cell
message_create_times = Object.values(transcript.mapping)
.filter((m) => m.message && m.message.create_time)
.map((m) => m.message.create_time)
Insert cell
earliest = message_create_times.sort()[0]
Insert cell
latest = message_create_times.sort()[message_create_times.length - 1]
Insert cell
gap = latest - earliest
Insert cell
gap_minutes = Math.round(gap / 60)
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more