Initial commit: LangChain evolution tutorial deck (132 slides)
- Cover, TOC, 5 dividers, 3 recap slides - 5 sections (chains, langgraph, deepagents, openswe, ecosystem) - design-system.js with theme tokens + 9 helper functions - research/: timeline + sources + per-tech notes - final-compile.js + merge.js for rebuild pipeline - output/: langchain-evolution.pptx (2.3 MB) + langchain-evolution.pdf (1.1 MB) + 7 sample previews
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* slides/07-sandbox-providers.js
|
||||
* ----------------------------------------------------------------------------
|
||||
* Slide 07 -- Sandbox providers: comparison
|
||||
* Table of Modal / Daytona / Runloop / LangSmith.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
const { helpers, layouts } = require('../../design-system');
|
||||
|
||||
function buildSandboxProviders(pres, theme) {
|
||||
const slide = pres.addSlide();
|
||||
helpers.slideBase(slide, pres, theme);
|
||||
helpers.addHeader(slide, pres, theme, {
|
||||
eyebrow: 'STAGE 4',
|
||||
sectionNumber: 4,
|
||||
title: 'Sandbox-провайдеры',
|
||||
});
|
||||
|
||||
// Comparison table card
|
||||
const x = 0.5;
|
||||
const y = layouts.CONTENT_TOP;
|
||||
const w = 9.0;
|
||||
const h = 3.55;
|
||||
|
||||
slide.addShape(pres.ShapeType.roundRect, {
|
||||
x: x, y: y, w: w, h: h,
|
||||
fill: { color: theme.palette.bg.elevated },
|
||||
line: { color: theme.palette.border.subtle, width: 1 },
|
||||
rectRadius: 0.08,
|
||||
});
|
||||
|
||||
// Table headers
|
||||
const cols = [
|
||||
{ label: 'Provider', w: 1.6 },
|
||||
{ label: 'Setup', w: 1.9 },
|
||||
{ label: 'Pricing model', w: 1.7 },
|
||||
{ label: 'Persistent state', w: 1.6 },
|
||||
{ label: 'Best for', w: 2.2 },
|
||||
];
|
||||
|
||||
const headerY = y + 0.1;
|
||||
let cx = x + 0.15;
|
||||
cols.forEach(function (c) {
|
||||
slide.addShape(pres.ShapeType.rect, {
|
||||
x: cx, y: headerY, w: c.w, h: 0.32,
|
||||
fill: { color: theme.palette.bg.code },
|
||||
line: { color: theme.palette.border.subtle, width: 0.5 },
|
||||
});
|
||||
slide.addText(c.label, {
|
||||
x: cx + 0.05, y: headerY, w: c.w - 0.1, h: 0.32,
|
||||
fontFace: helpers.withFallback(theme.fonts.ui),
|
||||
fontSize: theme.sizes.caption,
|
||||
color: theme.palette.accent.tertiary,
|
||||
bold: true,
|
||||
charSpacing: 2,
|
||||
valign: 'middle',
|
||||
});
|
||||
cx += c.w;
|
||||
});
|
||||
|
||||
const rows = [
|
||||
['ModalBackend', 'token_id + token_secret', 'per-second + GB-s', 'yes (volume)', 'Python-first, GPU-доступный'],
|
||||
['DaytonaBackend','api_key', 'per-session', 'yes (volume)', 'default в README'],
|
||||
['RunloopBackend','api_key', 'per-second', 'yes (volume)', 'dev-цикл, snapshot/restart'],
|
||||
['LangSmithBackend','LANGSMITH_API_KEY', 'через LangSmith', 'через LS', 'уже платите за LangSmith'],
|
||||
];
|
||||
|
||||
const rowH = 0.7;
|
||||
rows.forEach(function (row, idx) {
|
||||
const ry = headerY + 0.32 + idx * rowH;
|
||||
cx = x + 0.15;
|
||||
row.forEach(function (cell, cidx) {
|
||||
slide.addShape(pres.ShapeType.rect, {
|
||||
x: cx, y: ry, w: cols[cidx].w, h: rowH,
|
||||
fill: { color: idx % 2 === 0
|
||||
? theme.palette.bg.primary
|
||||
: theme.palette.bg.overlay },
|
||||
line: { color: theme.palette.border.subtle, width: 0.4 },
|
||||
});
|
||||
slide.addText(cell, {
|
||||
x: cx + 0.05, y: ry, w: cols[cidx].w - 0.1, h: rowH,
|
||||
fontFace: helpers.withFallback(theme.fonts.code),
|
||||
fontSize: 9,
|
||||
color: theme.palette.text.primary,
|
||||
valign: 'middle',
|
||||
});
|
||||
cx += cols[cidx].w;
|
||||
});
|
||||
});
|
||||
|
||||
helpers.addPageNumber(slide, pres, theme, 7);
|
||||
helpers.addSourceLine(slide, pres, theme, {
|
||||
source: 'research/per-tech/openswe.md: 78-89, 139-145',
|
||||
});
|
||||
return slide;
|
||||
}
|
||||
|
||||
module.exports = { buildSandboxProviders };
|
||||
Reference in New Issue
Block a user