migrate fern

This commit is contained in:
Kian Jones
2025-09-09 09:31:59 -07:00
parent 0c5f5dadb8
commit 1881fcc89d
339 changed files with 50713 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

BIN
fern/assets/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

145
fern/assets/leaderboard.css Normal file
View File

@@ -0,0 +1,145 @@
/* ────────────────────────────────────────────────────────────────
assets/leaderboard.css (namespaced so it never leaks styles)
──────────────────────────────────────────────────────────────── */
/* hide rows that dont match search */
#letta-leaderboard tr.hidden { display: none !important; }
/* clickable, sortable headers */
#letta-leaderboard thead th[data-key] {
cursor: pointer;
user-select: none;
position: relative;
}
#letta-leaderboard thead th.asc::after,
#letta-leaderboard thead th.desc::after {
position: absolute;
right: 6px;
top: 50%;
transform: translateY(-50%);
font-size: 10px;
line-height: 1;
}
#letta-leaderboard thead th.asc::after { content: "▲"; }
#letta-leaderboard thead th.desc::after { content: "▼"; }
/* bar-chart cells */
#letta-leaderboard .bar-cell {
position: relative;
padding: 8px;
overflow: hidden;
}
#letta-leaderboard .bar-viz {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
height: 36px;
z-index: 1;
max-width: 100%;
border-radius: 0;
}
#letta-leaderboard .bar-cell span.value {
position: absolute;
left: 5px;
top: 50%;
transform: translateY(-50%);
background: rgba(255, 255, 255, 0.7);
padding: 0 4px;
font-size: 14px;
z-index: 2;
border-radius: 0;
}
#letta-leaderboard .bar-cell span.warn {
position: absolute;
right: 5px;
top: 50%;
transform: translateY(-50%);
font-size: 15px;
line-height: 1;
color: #dc3545;
cursor: help;
z-index: 2;
}
/* bar colours */
#letta-leaderboard .avg .bar-viz { background: rgba(40, 167, 69, 0.35); } /* green */
#letta-leaderboard .cost-ok .bar-viz { background: rgba(255, 193, 7, 0.35); } /* amber */
#letta-leaderboard .cost-high .bar-viz { background: rgba(220, 53, 69, 0.35); } /* red */
/* faint ruler + right border */
#letta-leaderboard .bar-cell::before {
content: "";
position: absolute;
top: 50%;
left: 0;
width: 100%;
height: 8px;
transform: translateY(-50%);
pointer-events: none;
background: repeating-linear-gradient(
90deg,
rgba(170, 170, 170, 0.5) 0 1px,
transparent 1px 25%
);
}
#letta-leaderboard .bar-cell::after {
content: "";
position: absolute;
top: 50%;
right: 0;
width: 1px;
height: 8px;
background: rgba(170, 170, 170, 0.5);
transform: translateY(-50%);
pointer-events: none;
}
/* table layout tweaks */
#letta-leaderboard tbody tr { height: 50px; }
#letta-leaderboard .metric { width: 32%; }
#letta-leaderboard table { table-layout: fixed; }
/* search box */
#letta-leaderboard #lb-search,
#letta-leaderboard #lb-search:focus {
border-radius: 0 !important;
outline: none;
}
/* ───────────────────────────────
Dark-mode overrides
(everything else inherits)
───────────────────────────────*/
:is(.dark) #letta-leaderboard {
/* 1. Bar-fill colours — a hair brighter & less transparent */
.avg .bar-viz { background: rgba(56, 189, 98 , .55); } /* green */
.cost-ok .bar-viz { background: rgba(255, 213, 90 , .55); } /* amber */
.cost-high .bar-viz { background: rgba(255, 99 ,132 , .55); } /* red */
/* 2. Ruler + right-edge -- subtle light lines instead of grey */
.bar-cell::before {
background: repeating-linear-gradient(
90deg,
rgba(255,255,255,.12) 0 1px,
transparent 1px 25%
);
}
.bar-cell::after { background: rgba(255,255,255,.12); }
/* 3. Value pill dark background so it doesnt glow */
.bar-cell span.value {
background: rgba(0,0,0,.65);
color: #fff;
}
/* 4. Header text & sort glyphs lighten slightly */
thead th { color:#e2e2e2; }
thead th::after { color:#e2e2e2; }
}
/* 5. Header row background */
:is(.dark) #letta-leaderboard thead {
background:#1a1a1a !important; /* pick any dark tone */
}

153
fern/assets/leaderboard.js Normal file
View File

@@ -0,0 +1,153 @@
/* ──────────────────────────────────────────────────────────
assets/leaderboard.js
Load via docs.yml → js: - path: assets/leaderboard.js
(strategy: lazyOnload is fine)
────────────────────────────────────────────────────────── */
import yaml from 'https://cdn.jsdelivr.net/npm/js-yaml@4.1.0/+esm';
console.log('🏁 leaderboard.js loaded on', location.pathname);
const COST_CAP = 20;
/* ---------- helpers ---------- */
const pct = (v) => Number(v).toPrecision(3) + '%';
const cost = (v) => '$' + Number(v).toFixed(2);
const ready = (cb) =>
document.readyState === 'loading'
? document.addEventListener('DOMContentLoaded', cb)
: cb();
/* ---------- main ---------- */
ready(async () => {
// const host = document.getElementById('letta-leaderboard');
// if (!host) {
// console.warn('LB-script: #letta-leaderboard not found - bailing out.');
// return;
// }
/* ---- wait for the leaderboard container to appear (SPA nav safe) ---- */
const host = await new Promise((resolve, reject) => {
const el = document.getElementById('letta-leaderboard');
if (el) return resolve(el); // SSR / hard refresh path
const obs = new MutationObserver(() => {
const found = document.getElementById('letta-leaderboard');
if (found) {
obs.disconnect();
resolve(found); // CSR navigation path
}
});
obs.observe(document.body, { childList: true, subtree: true });
setTimeout(() => {
obs.disconnect();
reject(new Error('#letta-leaderboard never appeared'));
}, 5000); // safety timeout
}).catch((err) => {
console.warn('LB-script:', err.message);
return null;
});
if (!host) return; // still no luck → give up
/* ----- figure out URL of data.yaml ----- */
// const path = location.pathname.endsWith('/')
// ? location.pathname
// : location.pathname.replace(/[^/]*$/, ''); // strip file/slug
// const dataUrl = `${location.origin}${path}data.yaml`;
// const dataUrl = `${location.origin}/leaderboard/data.yaml`; // one-liner, always right
// const dataUrl = `${location.origin}/assets/leaderboard.yaml`;
// const dataUrl = `./assets/leaderboard.yaml`; // one-liner, always right
// const dataUrl = `${location.origin}/data.yaml`; // one-liner, always right
// const dataUrl = 'https://raw.githubusercontent.com/letta-ai/letta-leaderboard/main/data/letta_memory_leaderboard.yaml';
const dataUrl =
'https://cdn.jsdelivr.net/gh/letta-ai/letta-leaderboard@latest/data/letta_memory_leaderboard.yaml';
console.log('LB-script: fetching', dataUrl);
/* ----- fetch & parse YAML ----- */
let rows;
try {
const resp = await fetch(dataUrl);
console.log(`LB-script: status ${resp.status}`);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
rows = yaml.load(await resp.text());
} catch (err) {
console.error('LB-script: failed to load YAML →', err);
return;
}
/* ----- wire up table ----- */
const dir = Object.create(null);
const tbody = document.getElementById('lb-body');
const searchI = document.getElementById('lb-search');
const headers = document.querySelectorAll('#lb-table thead th[data-key]');
searchI.value = ''; // clear any persisted filter
const render = () => {
const q = searchI.value.toLowerCase();
tbody.innerHTML = rows
.map((r) => {
const over = r.total_cost > COST_CAP;
const barW = over ? '100%' : (r.total_cost / COST_CAP) * 100 + '%';
const costCls = over ? 'cost-high' : 'cost-ok';
const warnIcon = over
? `<span class="warn" title="Cost exceeds $${COST_CAP} cap - bar is clipped to full width">⚠</span>`
: '';
return `
<tr class="${q && !r.model.toLowerCase().includes(q) ? 'hidden' : ''}">
<td style="padding:8px">${r.model}</td>
<td class="bar-cell avg metric">
<div class="bar-viz" style="width:${r.average}%"></div>
<span class="value">${pct(r.average)}</span>
</td>
<td class="bar-cell ${costCls} metric">
<div class="bar-viz" style="width:${barW}"></div>
<span class="value">${cost(r.total_cost)}</span>
${warnIcon}
</td>
</tr>`;
})
.join('');
};
const setIndicator = (activeKey) => {
headers.forEach((h) => {
h.classList.remove('asc', 'desc');
if (h.dataset.key === activeKey) h.classList.add(dir[activeKey]);
});
};
/* initial sort ↓ */
dir.average = 'desc';
rows.sort((a, b) => b.average - a.average);
setIndicator('average');
render();
/* search */
searchI.addEventListener('input', render);
/* column sorting */
headers.forEach((th) => {
const key = th.dataset.key;
th.addEventListener('click', () => {
const asc = dir[key] === 'desc';
dir[key] = asc ? 'asc' : 'desc';
rows.sort((a, b) => {
const va = a[key],
vb = b[key];
const cmp =
typeof va === 'number'
? va - vb
: String(va).localeCompare(String(vb));
return asc ? cmp : -cmp;
});
setIndicator(key);
render();
});
});
});

16
fern/assets/logo-dark.svg Normal file
View File

@@ -0,0 +1,16 @@
<svg width="75" height="22" viewBox="0 0 75 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_80_2)">
<path d="M13.2017 8.80036H8.80133V13.2002H13.2017V8.80036Z" fill="white"/>
<path d="M17.6019 2.99742V0H4.40033V2.99742C4.40033 3.77228 3.77267 4.39988 2.99773 4.39988H0V17.6001H2.99773C3.77267 17.6001 4.40033 18.2277 4.40033 19.0026V22H17.6019V19.0026C17.6019 18.2277 18.2296 17.6001 19.0045 17.6001H22.0023V4.39988H19.0045C18.2296 4.39988 17.6019 3.77228 17.6019 2.99742ZM17.6019 16.1971C17.6019 16.9719 16.9743 17.5995 16.1993 17.5995H5.80355C5.0286 17.5995 4.40094 16.9719 4.40094 16.1971V5.80234C4.40094 5.02747 5.0286 4.39988 5.80355 4.39988H16.1993C16.9743 4.39988 17.6019 5.02747 17.6019 5.80234V16.1971Z" fill="white"/>
<path d="M34.9429 4.39986H33.0025V17.5995H41.6265V15.7326H34.9429V4.39986Z" fill="white"/>
<path d="M47.221 8.28637H46.531C44.4567 8.28637 42.3641 9.55806 42.3641 12.3984V13.7789C42.3641 16.3534 43.8541 17.8909 46.3495 17.8909H47.4031C49.5085 17.8909 51.0065 16.6516 51.3139 14.6558L51.3408 14.4798H49.3423L49.3093 14.5886C49.0135 15.5676 48.2404 16.024 46.8763 16.024C45.1058 16.024 44.2703 15.2376 44.2501 13.5503H51.3878V12.3984C51.3878 9.55806 49.2952 8.28637 47.221 8.28637ZM44.3076 11.9004C44.5056 10.6623 45.2628 10.1533 46.8757 10.1533C48.4885 10.1533 49.2451 10.6623 49.4431 11.9004H44.3076Z" fill="white"/>
<path d="M55.2595 4.39986H53.3197V8.28642H52.0302V10.1533H53.3197V13.851C53.3197 17.1124 55.3042 17.5995 56.4874 17.5995H57.7115V15.7326H57.0142C55.768 15.7326 55.2595 15.1032 55.2595 13.5608V10.1539H57.7115V8.28703H55.2595V4.39986Z" fill="white"/>
<path d="M61.815 4.39986H59.8751V8.28642H58.5856V10.1533H59.8751V13.851C59.8751 17.1124 61.8596 17.5995 63.0428 17.5995H64.2669V15.7326H63.5696C62.3234 15.7326 61.815 15.1032 61.815 13.5608V10.1539H64.2669V8.28703H61.815V4.39986Z" fill="white"/>
<path d="M74.2617 15.7326C73.8772 15.7326 73.7061 15.5724 73.7061 15.2131V12.0348C73.7061 8.77341 71.7217 8.28637 70.5385 8.28637H68.7588C67.2199 8.28637 65.5728 9.41323 65.5728 11.0907V11.2435H67.5126V11.0907C67.5126 10.5737 68.1452 10.1539 68.922 10.1539H70.0117C71.4039 10.1539 71.7046 10.655 71.7602 11.7739H68.958C66.7915 11.7739 65.3363 12.9301 65.3363 14.6509V14.8507C65.3363 15.7594 65.6889 17.8732 68.958 17.8732C69.7929 17.8732 71.2517 17.7272 72.0364 16.7959C72.5119 17.6007 73.5136 17.6007 74.2617 17.6007H74.4144V15.7338H74.2617V15.7326ZM71.7657 14.7407C71.7657 15.7778 70.1192 16.0045 69.4842 16.0045C67.6367 16.0045 67.2755 15.5541 67.2755 14.7768C67.2755 13.9139 68.0395 13.4581 69.4842 13.4581H71.7657V14.7407Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_80_2">
<rect width="75" height="22" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,9 @@
<svg aria-hidden="true" fill="none" height="100%" preserveaspectratio="xMidYMid meet" role="img" viewBox="0 0 75 22" width="100%" xmlns="http://www.w3.org/2000/svg">
<path d="M13.2017 8.80036H8.80133V13.2002H13.2017V8.80036Z" fill="currentColor"></path>
<path d="M17.6019 2.99742V0H4.40033V2.99742C4.40033 3.77228 3.77267 4.39988 2.99773 4.39988H0V17.6001H2.99773C3.77267 17.6001 4.40033 18.2277 4.40033 19.0026V22H17.6019V19.0026C17.6019 18.2277 18.2296 17.6001 19.0045 17.6001H22.0023V4.39988H19.0045C18.2296 4.39988 17.6019 3.77228 17.6019 2.99742ZM17.6019 16.1971C17.6019 16.9719 16.9743 17.5995 16.1993 17.5995H5.80355C5.0286 17.5995 4.40094 16.9719 4.40094 16.1971V5.80234C4.40094 5.02747 5.0286 4.39988 5.80355 4.39988H16.1993C16.9743 4.39988 17.6019 5.02747 17.6019 5.80234V16.1971Z" fill="currentColor"></path>
<path d="M34.9429 4.39986H33.0025V17.5995H41.6265V15.7326H34.9429V4.39986Z" fill="currentColor"></path>
<path d="M47.221 8.28637H46.531C44.4567 8.28637 42.3641 9.55806 42.3641 12.3984V13.7789C42.3641 16.3534 43.8541 17.8909 46.3495 17.8909H47.4031C49.5085 17.8909 51.0065 16.6516 51.3139 14.6558L51.3408 14.4798H49.3423L49.3093 14.5886C49.0135 15.5676 48.2404 16.024 46.8763 16.024C45.1058 16.024 44.2703 15.2376 44.2501 13.5503H51.3878V12.3984C51.3878 9.55806 49.2952 8.28637 47.221 8.28637ZM44.3076 11.9004C44.5056 10.6623 45.2628 10.1533 46.8757 10.1533C48.4885 10.1533 49.2451 10.6623 49.4431 11.9004H44.3076Z" fill="currentColor"></path>
<path d="M55.2595 4.39986H53.3197V8.28642H52.0302V10.1533H53.3197V13.851C53.3197 17.1124 55.3042 17.5995 56.4874 17.5995H57.7115V15.7326H57.0142C55.768 15.7326 55.2595 15.1032 55.2595 13.5608V10.1539H57.7115V8.28703H55.2595V4.39986Z" fill="currentColor"></path>
<path d="M61.815 4.39986H59.8751V8.28642H58.5856V10.1533H59.8751V13.851C59.8751 17.1124 61.8596 17.5995 63.0428 17.5995H64.2669V15.7326H63.5696C62.3234 15.7326 61.815 15.1032 61.815 13.5608V10.1539H64.2669V8.28703H61.815V4.39986Z" fill="currentColor"></path>
<path d="M74.2617 15.7326C73.8772 15.7326 73.7061 15.5724 73.7061 15.2131V12.0348C73.7061 8.77341 71.7217 8.28637 70.5385 8.28637H68.7588C67.2199 8.28637 65.5728 9.41323 65.5728 11.0907V11.2435H67.5126V11.0907C67.5126 10.5737 68.1452 10.1539 68.922 10.1539H70.0117C71.4039 10.1539 71.7046 10.655 71.7602 11.7739H68.958C66.7915 11.7739 65.3363 12.9301 65.3363 14.6509V14.8507C65.3363 15.7594 65.6889 17.8732 68.958 17.8732C69.7929 17.8732 71.2517 17.7272 72.0364 16.7959C72.5119 17.6007 73.5136 17.6007 74.2617 17.6007H74.4144V15.7338H74.2617V15.7326ZM71.7657 14.7407C71.7657 15.7778 70.1192 16.0045 69.4842 16.0045C67.6367 16.0045 67.2755 15.5541 67.2755 14.7768C67.2755 13.9139 68.0395 13.4581 69.4842 13.4581H71.7657V14.7407Z" fill="currentColor"></path>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

307
fern/assets/styles.css Normal file
View File

@@ -0,0 +1,307 @@
/* .fern-header-container * {
font-weight: 600;
} */
/* Remove rounded corners across the docs site */
:root {
--radius: 0px;
}
/* Override styles related to soft borders */
.fern-button {
border-radius: 0 !important;
}
.fern-collapsible-card {
border-radius: 0 !important;
}
.fern-api-property-meta code {
border-radius: 0 !important;
}
.fern-docs-badge {
border-radius: 0 !important;
}
.bg-accent-highlight {
border-radius: 0 !important;
}
.fern-scroll-area {
border-radius: 0 !important;
}
.fern-dropdown-item {
border-radius: 0 !important;
}
.fern-anchor-icon {
border-radius: 0 !important;
}
.fern-search-bar {
border-radius: 0 !important;
}
.keyboard-shortcut-hint {
border-radius: 0 !important;
}
.fern-search-button {
border-radius: 0 !important;
}
code:not(.code-block) {
border-radius: 0 !important;
}
.fern-accordion {
border-radius: 0 !important;
}
.fern-table-root,
.fern-table,
.fern-table thead,
.fern-table tbody,
.fern-table tr,
.fern-table th,
.fern-table td {
border-radius: 0 !important;
}
/* [data-radix-scroll-area-viewport] {
border-radius: 0 !important;
}
[data-radix-popper-content-wrapper] {
border-radius: 0 !important;
} */
[data-radix-popper-content-wrapper],
[data-radix-popper-content-wrapper] > * {
border-radius: 0 !important;
}
.rounded-xl,
.rounded-lg,
.rounded-md,
.rounded-sm,
.fern-sidebar-link {
border-radius: 0px !important;
}
:is(.light) .code-block-line-content span[style*="color: rgb(194, 195, 197);"] {
color: #8e8e8e !important;
}
/* Different opacity for active items in the sidebar */
/* Light mode */
:is(.light) .fern-sidebar-link-container[data-state="active"] .fern-sidebar-link {
background-color: rgba(7, 7, 172, 0.04);
}
:is(.light) body#fern-docs .fern-sidebar-link[data-state="active"] {
background-color: rgba(7, 7, 172, 0.04);
}
:is(.light) .fern-sidebar-link-container[data-state="active"] .fern-sidebar-link-text {
color: #0707ac;
}
:is(.light) body#fern-docs .fern-sidebar-link[data-state="active"] span {
color: #0707ac;
}
/* Dark mode */
:is(.dark) .fern-sidebar-link-container[data-state="active"] .fern-sidebar-link {
background-color: rgba(255, 187, 173, 0.08); /* #FFBBAD */
}
:is(.dark) body#fern-docs .fern-sidebar-link[data-state="active"] {
background-color: rgba(255, 187, 173, 0.08); /* #FFBBAD */
}
:is(.dark) .fern-sidebar-link-container[data-state="active"] .fern-sidebar-link-text {
color: #FF5533;
}
:is(.dark) body#fern-docs .fern-sidebar-link[data-state="active"] span {
color: #FF5533;
}
/* Make uppercase sidebar heading */
.fern-sidebar-heading .fern-sidebar-heading-content,
.fern-breadcrumb-item {
/* font-family: var(--typography-code-font-family); */
font-weight: 600;
/* letter-spacing: 0.05em; */
text-transform: uppercase;
/* color: var(--gray-12); */
font-size: 0.8rem;
/* text-decoration: none; */
}
/* .fern-theme-default.fern-container .fern-header-tabs .fern-header-tab-button .fern-header-container * {
font-size: 1rem;
} */
.t-muted.whitespace-nowrap.text-xs,
.inline-flex.items-baseline.gap-1 {
display: none !important;
}
/* @supports (overscroll-behavior: none) {
html, body {
overscroll-behavior: none;
}
} */
/* dark/light mode toggle for images */
:is(.dark) img.dark {
display: block;
}
:is(.dark) img.light {
display: none;
}
:is(.light) img.light {
display: block;
}
:is(.light) img.dark {
display: none;
}
/* Landing page styles */
.landing-page {
margin-inline: auto;
min-width: calc(var(--spacing) * 0);
padding-inline: var(--page-padding);
max-width: calc(var(--spacing-page-width) + var(--spacing-page-padding)*2);
.letta-header {
padding-top: 7rem !important;
padding-bottom: 7rem !important;
position: relative !important;
}
.letta-header-bg {
background-color: #f6f6f6 !important;
width: 100vw;
position: absolute;
top: 0%;
bottom: 0%;
left: 50%;
transform: translate(-50%);
z-index: -1;
}
.hero-image-container {
width: var(--page-width);
position: relative;
}
.hero-image {
position: absolute !important;
right: 0 !important;
top: 50% !important;
transform: translateY(-50%) !important;
height: 100% !important;
max-height: 400px !important;
z-index: 0 !important;
opacity: 0.5 !important;
width: fit-content;
pointer-events: none !important;
}
.hero-image.dark {
display: none !important;
}
.letta-header h1 {
font-size: 4.0rem !important;
line-height: 1.1 !important;
font-weight: 300 !important;
font-family: Roobert, sans-serif !important; /* Use regular Roobert instead of Medium */
}
.letta-header p {
font-size: 1.25rem !important;
line-height: 1.3 !important;
font-weight: 400 !important;
}
.letta-header a {
border-bottom: 1px solid rgba(255,255,255,0.5) !important;
font-size: 0.5rem !important;
font-weight: normal !important;
}
.letta-header a:hover {
border-bottom-color: white !important;
}
.fern-main .landingbody {
max-width: 1195px !important;
margin-left: auto !important;
margin-right: auto !important;
}
#fern-sidebar {
display: none !important;
}
@media (max-width: 1504px) {
.hero-image-container {
width: 100vw !important;
}
}
/* Tablet viewport breakpoint */
@media (max-width: 1024px) {
.letta-header {
padding-top: 4rem !important;
padding-bottom: 4rem !important;
}
.letta-header h1 {
font-size: 3rem !important;
}
.letta-header p {
font-size: 1.1rem !important;
}
.hero-image-container {
display: none !important;
}
}
/* Mobile viewport breakpoint */
@media (max-width: 640px) {
.letta-header {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.letta-header h1 {
font-size: 2.5rem !important;
}
.letta-header p {
font-size: 1rem !important;
}
.letta-header .max-w-4xl {
padding-left: 1rem !important;
padding-right: 1rem !important;
}
.landingbody {
padding-left: 1rem !important;
padding-right: 1rem !important;
}
}
}
:is(.dark) .landing-page .letta-header-bg {
background-color: #151515 !important;
}
:is(.dark) .landing-page.hero-image.light {
display: none !important;
}
:is(.dark) .landing-page .hero-image.dark {
display: block !important;
}

View File

@@ -0,0 +1,72 @@
## Consistency Across Messages APIs
<Note> These are the final changes from our API overhaul, which means they are not backwards compatible to prior versions of our APIs and SDKs. Upgrading may require changes to your code. </Note>
### Flattened `UserMessage` content
The content field on `UserMessage` objects returned by our Messages endpoints have been simplified to flat strings containing raw message text, rather than JSON strings with message text nested inside.
#### Before:
```python
{
"id": "message-dea2ceab-0863-44ea-86dc-70cf02c05946",
"date": "2025-01-28T01:18:18+00:00",
"message_type": "user_message",
"content": "{\n \"type\": \"user_message\",\n \"message\": \"Hello, how are you?\",\n \"time\": \"2025-01-28 01:18:18 AM UTC+0000\"\n}"
}
```
#### After:
```python
{
"id": "message-dea2ceab-0863-44ea-86dc-70cf02c05946",
"date": "2025-01-28T01:18:18+00:00",
"message_type": "user_message",
"content": "Hello, how are you?"
}
```
### Top-level `use_assistant_message` parameter defaults to True
All message related APIs now include a top-level `use_assistant_message` parameter, which defaults to `True` if not specified. This parameter controls whether the endpoint should parse specific tool call arguments (default `send_message`) as AssistantMessage objects rather than ToolCallMessage objects.
#### Before:
```python
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreate(
role="user",
content="call the big_return function",
),
],
config=LettaRequestConfig(use_assistant_message=False),
)
```
#### After:
```python
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreate(
role="user",
content="call the big_return function",
),
],
use_assistant_message=False,
)
```
Previously, the `List Messages` endpoint defaulted to False internally, so this change may cause unexpected behavior in your code. To fix this, you can set the `use_assistant_message` parameter to `False` in your request.
```python
messages = client.agents.messages.list(
limit=10,
use_assistant_message=False,
)
```
### Consistent message return type
All message related APIs return `LettaMessage` objects now, which are simplified versions of `Message` objects stored in the database backend. Previously, our `List Messages` endpoint returned `Message` objects by default, which is no longer an option.

View File

@@ -0,0 +1,22 @@
### Tool rules improvements
ToolRule objects no longer should specify a `type` at instantiation, as this field is now immutable.
#### Before:
```python
rule = InitToolRule(
tool_name="secret_message",
type="run_first"
)
```
#### After:
```python
rule = InitToolRule(tool_name="secret_message")
```
Letta also now supports smarter retry behavior for tool rules in the case of unrecoverable failures.
### New API routes to query agent steps
The [`List Steps`](https://docs.letta.com/api-reference/steps/list-steps) and [`Retrieve Step`](https://docs.letta.com/api-reference/steps/retrieve-step) routes have been added to enable querying for additional metadata around agent execution.

View File

@@ -0,0 +1,42 @@
### Query tools by name
The `List Tools` API now supports querying by tool name.
```python
send_message_tool_id = client.agents.tools.list(tool_name="secret_message")[0].id
```
### Authorization header now supports password
For self-deployed instances of Letta that are password-protected, the `Authorization` header now supports parsing passwords in addition to API keys. `X-BARE-PASSWORD` will still be supported as legacy, but will be deprecated in a future release.
#### Before:
```sh
curl --request POST \
--url https://MYSERVER.up.railway.app/v1/agents/ \
--header 'X-BARE-PASSWORD: password banana' \
--header 'Content-Type: application/json' \
--data '{
...
}'
```
#### After:
```sh
curl --request POST \
--url https://MYSERVER.up.railway.app/v1/agents/ \
--header 'AUTHORIZATION: Bearer banana' \
--header 'Content-Type: application/json' \
--data '{
...
}'
```
Password can now be passed via the `token` field when initializing the Letta client:
```python
client = LettaClient(
base_url="https://MYSERVER.up.railway.app",
token="banana",
)
```

View File

@@ -0,0 +1,11 @@
## Agents API Improvements
<Note> These APIs are only available for Letta Cloud. </Note>
### Agent Search
The [`/v1/agents/search`](https://docs.letta.com/api-reference/agents/search) API has been updated to support pagination via `after` query parameter
### Agent Creation from Template
The [`/v1/templates/`](https://docs.letta.com/api-reference/templates/createagentsfromtemplate) creation API has been updated to support adding `tags` at creation time

View File

@@ -0,0 +1,3 @@
## Temperature and Max Tokens Supported via LLM Config
These values are now configurable when creating and modifying agents via [`llm_config`](https://docs.letta.com/api-reference/agents/modify#request.body.llm_config) parameter for subsequent LLM requests.

View File

@@ -0,0 +1,9 @@
## New Features
### Google Vertex support
Google Vertex is now a supported endpoint type for Letta agents.
### Option to disable message persistence for a given agent
Letta agents now have an optional `message_buffer_autoclear` flag. If set to True (default False), the message history will not be persisted in-context between requests (though the agent will still have access to core, archival, and recall memory).

View File

@@ -0,0 +1,113 @@
## Project Slug Moved to Request Header
<Note> Projects are only available for Letta Cloud. </Note>
Project slug can now be specified via request header `X-Project` for agent creation. The existing `project` parameter will soon be deprecated.
#### Before
<CodeBlocks>
```curl title="curl"
curl -X POST https://app.letta.com/v1/agents \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-d '{
"project":"YOUR_PROJECT_SLUG"
"model":"gpt-4o-mini",
"embedding":"openai/text-embedding-3-small"
"memory_blocks": [
{
"label": "human",
"value": "name: Caren"
}
],
}'
```
```python title="python"
from letta_client import CreateBlock, Letta
client = Letta(
token="YOUR_API_KEY",
)
agent = client.agents.create(
project="YOUR_PROJECT_SLUG",
model="gpt-4o-mini",
embedding="openai/text-embedding-3-small"
memory_blocks=[
CreateBlock(
"label": "human",
"value": "name: Caren"
),
],
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agent = await client.agents.create({
project: "YOUR_PROJECT_SLUG",
model: "gpt-4o-mini",
embedding: "openai/text-embedding-3-small"
memory_blocks: [
{
label: "human",
value: "name: Caren"
},
],
});
```
</CodeBlocks>
#### After
<CodeBlocks>
```curl title="curl"
curl -X POST https://app.letta.com/v1/agents \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'X-Project: YOUR_PROJECT_SLUG' \
-d '{
"model":"gpt-4o-mini",
"embedding":"openai/text-embedding-3-small"
"memory_blocks": [
{
"label": "human",
"value": "name: Caren"
}
],
}'
```
```python title="python"
from letta_client import CreateBlock, Letta
client = Letta(
token="YOUR_API_KEY",
)
agent = client.agents.create(
x_project="YOUR_PROJECT_SLUG",
model="gpt-4o-mini",
embedding="openai/text-embedding-3-small"
memory_blocks=[
CreateBlock(
"label": "human",
"value": "name: Caren"
),
],
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agent = await client.agents.create({
x_project: "YOUR_PROJECT_SLUG",
model: "gpt-4o-mini",
embedding: "openai/text-embedding-3-small"
memory_blocks: [
{
label: "human",
value: "name: Caren"
},
],
});
```
</CodeBlocks>

View File

@@ -0,0 +1,7 @@
## New Identities Feature
We've added a new Identities feature that helps you manage users in your multi-user Letta application. Each Identity can represent a user or organization in your system and store their metadata.
You can associate an Identity with one or more agents, making it easy to track which agents belong to which users. Agents can also be associated with multiple identities, enabling shared access across different users. This release includes full CRUD (Create, Read, Update, Delete) operations for managing Identities through our API.
For more information on usage, visit our [Identities documentation](/api-reference/identities) and [usage guide](/guides/agents/multi-user).

View File

@@ -0,0 +1,85 @@
## Core Memory and Archival Memory SDK APIs Renamed to Blocks and Passages
<Note> This is a breaking SDK change and is not backwards compatible. </Note>
Given the confusion around our advanced functionality for managing memory, we've renamed the Core Memory SDK API to `blocks` and the Archival Memory SDK API to `passages` so that our API naming reflects the unit of memory stored. This change only affects our SDK, and does not affect Letta's Rest API.
#### Before
<CodeBlocks>
```python title="python"
from letta_client import CreateBlock, Letta
client = Letta(
token="YOUR_API_KEY",
)
agent = client.agents.create(
model="gpt-4o-mini",
embedding="openai/text-embedding-3-small"
memory_blocks=[
CreateBlock(
"label": "human",
"value": "name: Caren"
),
],
)
blocks = client.agents.core_memory.list_blocks(agent_id=agent.id)
client.agents.core_memory.detach_block(agent_id=agent.id, block_id=blocks[0].id)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agent = await client.agents.create({
model: "gpt-4o-mini",
embedding: "openai/text-embedding-3-small"
memory_blocks: [
{
label: "human",
value: "name: Caren"
},
],
});
const blocks = await client.agents.coreMemory.listBlocks(agent.id);
await client.agents.coreMemory.detachBlock(agent.id, blocks[0].id);
```
</CodeBlocks>
#### After
<CodeBlocks>
```python title="python"
from letta_client import CreateBlock, Letta
client = Letta(
token="YOUR_API_KEY",
)
agent = client.agents.create(
model="gpt-4o-mini",
embedding="openai/text-embedding-3-small"
memory_blocks=[
CreateBlock(
"label": "human",
"value": "name: Caren"
),
],
)
blocks = client.agents.blocks.list(agent_id=agent.id)
client.agents.blocks.detach(agent_id=agent.id, block_id=blocks[0].id)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agent = await client.agents.create({
model: "gpt-4o-mini",
embedding: "openai/text-embedding-3-small"
memory_blocks: [
{
label: "human",
value: "name: Caren"
},
],
});
const blocks = client.agents.blocks.list(agent.id)
await client.agents.blocks.detach(agent.id, blocks[0].id)
```
</CodeBlocks>

View File

@@ -0,0 +1,3 @@
## xAI / Grok Now Supported
We've added xAI support in the latest SDK version. To enable xAI models, set your `XAI_API_KEY` as an environment variable: `export XAI_API_KEY="..."`.

View File

@@ -0,0 +1,28 @@
## Added Modify Passage API
We've introduced a new API endpoint that allows you to modify existing passages within agent memory.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
client.agents.modify_passage(
agent_id="AGENT_ID",
memory_id="MEMORY_ID",
text="Updated passage content"
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
await client.agents.modifyPassage({
agent_id: "AGENT_ID",
memory_id: "MEMORY_ID",
text: "Updated passage content"
});
```
</CodeBlocks>

View File

@@ -0,0 +1,77 @@
## Enhanced Tool Definitions with Complex Schemas
### Complex Schema Support for Tool Arguments
You can now use complex Pydantic schemas to define arguments for tools, enabling better type safety and validation for your tool inputs.
```python
from pydantic import BaseModel
from typing import List, Optional
class ItemData(BaseModel):
name: str
sku: str
price: float
description: Optional[str] = None
class InventoryEntry(BaseModel):
item: ItemData
location: str
current_stock: int
minimum_stock: int = 5
class InventoryEntryData(BaseModel):
data: InventoryEntry
quantity_change: int
```
## Tool Creation from Function with Complex Schema
Use the args_schema parameter to specify a Pydantic model for tool arguments when creating tools from functions.
```python
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
def manage_inventory_mock(data: InventoryEntry, quantity_change: int) -> bool:
"""
Implementation of the manage_inventory tool
"""
print(f"Updated inventory for {data.item.name} with a quantity change of {quantity_change}")
return True
tool_from_func = client.tools.upsert_from_function(
func=manage_inventory_mock,
args_schema=InventoryEntryData,
)
```
### BaseTool Class Extension
For more complex tool implementations, you can also extend the `BaseTool` class to create custom tools with full control over the implementation.
```python
from letta_client import BaseTool
from typing import Type, List
from pydantic import BaseModel
class ManageInventoryTool(BaseTool):
name: str = "manage_inventory"
args_schema: Type[BaseModel] = InventoryEntryData
description: str = "Update inventory catalogue with a new data entry"
tags: List[str] = ["inventory", "shop"]
def run(self, data: InventoryEntry, quantity_change: int) -> bool:
"""
Implementation of the manage_inventory tool
"""
# implementation
print(f"Updated inventory for {data.item.name} with a quantity change of {quantity_change}")
return True
custom_tool = client.tools.add(
tool=ManageInventoryTool(),
)
```

View File

@@ -0,0 +1,29 @@
## Added List Run Steps API
We've introduced a new API endpoint that allows you to list all steps associated with a specific run. This feature makes it easier to track and analyze the sequence of steps performed during a run.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
steps = client.runs.list_run_steps(
run_id="RUN_ID",
)
for step in steps:
print(f"Step ID: {step.id}, Tokens: {step.total_tokens}")
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const steps = await client.runs.listRunSteps({
run_id: "RUN_ID",
});
steps.forEach(step => {
console.log(`Step ID: ${step.id}, Tokens: ${step.total_tokens}`);
});
```
</CodeBlocks>

View File

@@ -0,0 +1,60 @@
## Agent Serialization: Download and Upload APIs
We've added new APIs that allow you to download an agent's serialized JSON representation and upload it to recreate the agent in the system. These features enable easy agent backup, transfer between environments, and version control of agent configurations.
### Import Agent Serialized
Import a serialized agent file and recreate the agent in the system.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
agent = client.agents.import_agent_serialized(
file=open("/path/to/agent/file.af", "rb"),
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
import * as fs from 'fs';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agent = await client.agents.importAgentSerialized({
file: fs.createReadStream("/path/to/your/file"),
});
```
</CodeBlocks>
### Export Agent Serialized
Export the serialized JSON representation of an agent, formatted with indentation.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
agent_json = client.agents.export_agent_serialized(
agent_id="AGENT_ID",
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agentJson = await client.agents.exportAgentSerialized({
agent_id: "AGENT_ID",
});
```
</CodeBlocks>
## Use Cases
- Environment Migration: Transfer agents between local, desktop, and cloud environments
- Version Control: Save agent configurations before making significant changes
- Templating: Create template agents that can be quickly deployed for different use cases
- Sharing: Share agent configurations with team members or across organizations

View File

@@ -0,0 +1,32 @@
## Message Modification API
We've added a new API endpoint that allows you to modify existing messages in an agent's conversation history. This feature is particularly useful for editing message history to refine agent behavior without starting a new conversation.
<CodeBlocks>
```python title="python"
from letta_client import Letta, UpdateSystemMessage
client = Letta(
token="YOUR_API_KEY",
)
client.agents.messages.modify(
agent_id="AGENT_ID",
message_id="MESSAGE_ID",
request=UpdateSystemMessage(
content="The agent should prioritize brevity in responses.",
),
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
await client.agents.messages.modify({
agent_id: "AGENT_ID",
message_id: "MESSAGE_ID",
request: {
content: "The agent should prioritize brevity in responses."
}
});
```
</CodeBlocks>

View File

@@ -0,0 +1,51 @@
## Identity Support for Memory Blocks
Memory blocks can now be associated with specific identities, allowing for better organization and retrieval of contextual information about various entities in your agent's knowledge base.
### Adding Blocks to an Identity
<CodeBlocks>
```python title="python"
from letta_client import Letta, CreateBlock
client = Letta(
token="YOUR_API_KEY",
)
client.agents.identities.modify(
identity_id="IDENTITY_ID",
block_ids=["BLOCK_ID"],
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
await client.agents.identities.modify({
identity_id: "IDENTITY_ID",
block_ids: ["BLOCK_ID"],
});
```
</CodeBlocks>
### Querying Blocks by Identity
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
client.agents.blocks.list(
identity_id="IDENTITY_ID",
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
await client.agents.blocks.list({
identity_id: "IDENTITY_ID",
});
```
</CodeBlocks>

View File

@@ -0,0 +1,3 @@
## MCP Now Supported
We've added MCP support in the latest SDK version. For full documentation on how to enable MCP with Letta, visit [our MCP guide](/guides/mcp/setup).

View File

@@ -0,0 +1,24 @@
## New `include_relationships` Parameter for List Agents API
You can now leverage a more customized, lightweight response from the list agents API by setting the `include_relationships` parameter to which fields you'd like to fetch in the response.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
agents = client.agents.list(
include_relationships=["identities", "blocks", "tools"],
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agents = await client.agents.list({
include_relationships: ["identities", "blocks", "tools"],
});
```
</CodeBlocks>

View File

@@ -0,0 +1,28 @@
## Message `content` field extended to include Multi-modal content parts
The `content` field on `UserMessage` and `AssistantMessage` objects returned by our Messages endpoints has been extended to support multi-modal content parts, in anticipation of allowing you to send and receive messages with text, images, and other media.
### Before:
```curl
{
"id": "message-dea2ceab-0863-44ea-86dc-70cf02c05946",
"date": "2025-01-28T01:18:18+00:00",
"message_type": "user_message",
"content": "Hello, how are you?"
}
```
### After:
```curl
{
"id": "message-dea2ceab-0863-44ea-86dc-70cf02c05946",
"date": "2025-01-28T01:18:18+00:00",
"message_type": "user_message",
"content": [
{
"type": "text",
"text": "Hello, how are you?"
}
]
}
```

View File

@@ -0,0 +1,3 @@
## `Embedding` model info now specified directly on Source
The `Source` object returned by our Sources endpoints now stores embedding related fields, to specify the embedding model and chunk size used to generate the source.

View File

@@ -0,0 +1,39 @@
## Max invocation count tool rule
A new tool rule has been introduced for configuring a max step count per tool rule.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
client.agents.create(
model="openai/gpt-4o-mini",
embedding="openai/text-embedding-3-small",
tool_rules=[
MaxCountPerStepToolRule(
tool_name="manage_inventory",
max_count_limit=10
)
]
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agent = await client.agents.create({
model: "openai/gpt-4o-mini",
embedding: "openai/text-embedding-3-small",
tool_rules: [
{
type: "max_count_per_step",
tool_name: "manage_inventory",
max_count_limit: 10
}
]
});
```
</CodeBlocks>

View File

@@ -0,0 +1,11 @@
## Output messages added to Steps API
The `Step` object returned by our Steps endpoints now includes a `steps_messages` field, which contains a list of messages generated by the step.
## Order parameter added to List Agents and List Passages APIs
The `List Agents` and `List Passages` endpoints now support an `ascending` parameter to sort the results based on creation timestamp.
## Filter parameters added List Passages API
The `List Passages` endpoint now supports filter parameters to filter the results including `after`, `before`, and `search` for filtering by text.

View File

@@ -0,0 +1,30 @@
## New fields to support reasoning models
The `LlmConfig` object now includes a `enable_reasoner` field, enables toggling on thinking steps for reasoning models like Sonnet 3.7. This change also includes support for specifying this along with `max_reasoning_tokens` in the agent creation API.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
agent = client.agents.create(
model="claude/sonnet-3-7",
enable_reasoner=True,
max_reasoning_tokens=10000,
max_tokens=100000
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agent = await client.agents.create({
model: "claude/sonnet-3-7",
enable_reasoner: true,
max_reasoning_tokens: 10000,
max_tokens: 100000
});
```
</CodeBlocks>

View File

@@ -0,0 +1,28 @@
## Modify Agent API now supports `model` and `embedding` fields
The `Modify Agent` API now supports `model` and `embedding` fields to update the model and embedding used by the agent using the handles rather than specifying the entire configs.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
client.agents.modify(
agent_id="AGENT_ID",
model="openai/gpt-4o-mini",
embedding="openai/text-embedding-3-small",
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
await client.agents.modify({
agent_id: "AGENT_ID",
model: "openai/gpt-4o-mini",
embedding: "openai/text-embedding-3-small",
});
```
</CodeBlocks>

View File

@@ -0,0 +1,26 @@
## New `strip_messages` field in Import Agent API
The `Import Agent` API now supports a new `strip_messages` field to remove messages from the agent's conversation history when importing a serialized agent file.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
client.agents.import_agent_serialized(
file=open("/path/to/agent/file.af", "rb"),
strip_messages=True,
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
await client.agents.importAgentSerialized({
file: fs.createReadStream("/path/to/your/file"),
strip_messages: true,
});
```
</CodeBlocks>

View File

@@ -0,0 +1,41 @@
## Add new `otid` field to Message API
The `Message` object returned by our Messages endpoints now includes an offline threading id field, a unique identifier set at creation time, which can be used by the client to deduplicate messages.
### Before:
<CodeBlocks>
```python title="python"
from letta_client import Letta, MessageCreate
import uuid
client = Letta(
token="YOUR_API_KEY",
)
messages = client.agents.messages.create(
agent_id="AGENT_ID",
messages=[
MessageCreate(
role="user",
content="Hello, how are you?"
otid=uuid.uuid4(),
)
]
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
import { v4 as uuid } from 'uuid';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const messages = await client.agents.messages.create({
agent_id: "AGENT_ID",
messages: [
{
role: "user",
content: "Hello, how are you?",
otid: uuid.v4(),
},
],
});
```
</CodeBlocks>

View File

@@ -0,0 +1,24 @@
## Runs API can now be filtered by Agent ID
The Runs API now supports filtering by `agent_id` to retrieve all runs and all active runs associated with a specific agent.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
runs = client.runs.list_active_runs(
agent_id="AGENT_ID",
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const runs = await client.runs.listActiveRuns({
agent_id: "AGENT_ID",
});
```
</CodeBlocks>

View File

@@ -0,0 +1,39 @@
## New Parent Tool Rule
A new tool rule has been introduced for configuring a parent tool rule, which only allows a target tool to be called after a parent tool has been run.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
agent = client.agents.create(
model="openai/gpt-4o-mini",
embedding="openai/text-embedding-3-small",
tool_rules=[
ParentToolRule(
tool_name="parent_tool",
children=["child_tool"]
)
]
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agent = await client.agents.create({
model: "openai/gpt-4o-mini",
embedding: "openai/text-embedding-3-small",
tool_rules: [
{
type: "parent",
tool_name: "parent_tool",
children: ["child_tool"]
}
]
});
```
</CodeBlocks>

View File

@@ -0,0 +1,48 @@
# New Upsert Properties API for Identities
The `Upsert Properties` API has been added to the Identities endpoint, allowing you to update or create properties for an identity.
<CodeBlocks>
```python title="python"
from letta_client import IdentityProperty, Letta
client = Letta(
token="YOUR_TOKEN",
)
client.identities.upsert_properties(
identity_id="IDENTITY_ID",
request=[
IdentityProperty(
key="name",
value="Caren",
type="string",
),
IdentityProperty(
key="email",
value="caren@example.com",
type="string",
)
],
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
await client.identities.upsertProperties({
identity_id: "IDENTITY_ID",
properties: [
{
key: "name",
value: "Caren",
type: "string",
},
{
key: "email",
value: "caren@example.com",
type: "string",
},
],
});
```
</CodeBlocks>

View File

@@ -0,0 +1,42 @@
## New `reasoning_effort` field added to LLMConfig
The `reasoning_effort` field has been added to the `LLMConfig` object to control the amount of reasoning the model should perform, to support OpenAI's o1 and o3 reasoning models.
## New `sender_id` parameter added to Message model
The `Message` object now includes a `sender_id` field, which is the ID of the sender of the message, which can be either an identity ID or an agent ID. The `sender_id` is expected to be passed in at message creation time.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
messages = client.agents.messages.create(
agent_id="AGENT_ID",
messages=[
MessageCreate(
role="user",
content="Hello, how are you?",
sender_id="IDENTITY_ID",
)
]
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const messages = await client.agents.messages.create({
agent_id: "AGENT_ID",
messages: [
{
role: "user",
content: "Hello, how are you?",
sender_id: "IDENTITY_ID",
},
],
});
```
</CodeBlocks>

View File

@@ -0,0 +1,24 @@
## New List Agent Groups API added
The `List Agent Groups` API has been added to the Agents endpoint, allowing you to retrieve all multi-agent groups associated with a specific agent.
<CodeBlocks>
```python title="python"
from letta_client import Letta
client = Letta(
token="YOUR_API_KEY",
)
agent_groups = client.agents.list_agent_groups(
agent_id="AGENT_ID",
)
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({
token: "YOUR_API_KEY",
});
const agentGroups = await client.agents.listAgentGroups({
agent_id: "AGENT_ID",
});
```
</CodeBlocks>

View File

@@ -0,0 +1,5 @@
## New Batch message creation API
A series of new `Batch` endpoints has been introduced to support batch message creation, allowing you to perform multiple LLM requests in a single API call. These APIs leverage provider batch APIs under the hood, which can be more cost-effective than making multiple API calls.
New endpoints can be found here: [Batch Messages](https://docs.letta.com/api-reference/messages/batch)

View File

@@ -0,0 +1,7 @@
# New Projects Endpoint
<Note> These APIs are only available for Letta Cloud. </Note>
A new `Projects` endpoint has been added to the API, allowing you to manage projects and their associated templates.
The new endpoints can be found here: [Projects](https://docs.letta.com/api-reference/projects)

View File

@@ -0,0 +1,31 @@
## SDK Method Name Changes
In an effort to keep our SDK method names consistent with our conventions, we have renamed the following methods:
### Before and After
| SDK Method Name | Before | After |
| --- | --- | --- |
| List Tags | `client.tags.list_tags` | `client.tags.list` |
| Export Agent | `client.agents.export_agent_serialized` | `client.agents.export` |
| Import Agent | `client.agents.import_agent_serialized` | `client.agents.import` |
| Modify Agent Passage | `client.agents.modify_passage` | `client.agents.passages.modify` |
| Reset Agent Messages | `client.agents.reset_messages` | `client.agents.messages.reset` |
| List Agent Groups | `client.agents.list_agent_groups` | `client.agents.groups.list` |
| Reset Group Messages | `client.groups.reset_messages` | `client.groups.messages.reset` |
| Upsert Identity Properties | `client.identities.upsert_identity_properties` | `client.identities.properties.upsert` |
| Retrieve Source by Name | `client.sources.get_by_name` | `client.sources.retrieve_by_name` |
| List Models | `client.models.list_llms` | `client.models.list` |
| List Embeddings | `client.models.list_embedding_models` | `client.embeddings.list` |
| List Agents for Block | `client.blocks.list_agents_for_block` | `client.blocks.agents.list` |
| List Providers | `client.providers.list_providers` | `client.providers.list` |
| Create Provider | `client.providers.create_providers` | `client.providers.create` |
| Modify Provider | `client.providers.modify_providers` | `client.providers.modify` |
| Delete Provider | `client.providers.delete_providers` | `client.providers.delete` |
| List Runs | `client.runs.list_runs` | `client.runs.list` |
| List Active Runs | `client.runs.list_active_runs` | `client.runs.list_active` |
| Retrieve Run | `client.runs.retrieve_run` | `client.runs.retrieve` |
| Delete Run | `client.runs.delete_run` | `client.runs.delete` |
| List Run Messages | `client.runs.list_run_messages` | `client.runs.messages.list` |
| List Run Steps | `client.runs.list_run_steps` | `client.runs.steps.list` |
| Retrieve Run Usage | `client.runs.retrieve_run_usage` | `client.runs.usage.retrieve` |

688
fern/docs.yml Normal file
View File

@@ -0,0 +1,688 @@
instances:
- url: https://letta.docs.buildwithfern.com
custom-domain: https://docs.letta.com
title: Letta
experimental:
openapi-parser-v3: true
tabs:
docs:
display-name: Documentation
slug: documentation
ade:
display-name: ADE Guide
slug: ade
cloud:
display-name: Letta Cloud
skip-slug: true
selfhosted:
display-name: Self-Hosting
skip-slug: true
ref:
display-name: API Reference
skip-slug: true
cookbooks:
display-name: Cookbooks
icon: fa-sharp fa-light fa-books
skip-slug: true
github:
display-name: GitHub
icon: fa-brands fa-github
href: https://github.com/letta-ai/letta
discord:
display-name: Discord
icon: fa-brands fa-discord
href: https://discord.gg/letta
community:
display-name: Developer Community
icon: fa-sharp fa-light fa-user-astronaut
skip-slug: true
install:
display-name: Download
icon: fa-sharp fa-light fa-download
skip-slug: true
showcase:
display-name: Examples
skip-slug: true
leaderboard:
display-name: Leaderboard
skip-slug: true
landing-page:
page: home
path: pages/index.mdx
navigation:
- tab: docs
layout:
- link: Chat on Discord
icon: fa-brands fa-discord
href: https://discord.gg/letta
- link: Developer Forum
icon: fa-sharp fa-light fa-comments
href: https://forum.letta.com
- link: DeepLearning.AI Course
icon: fa-sharp fa-light fa-building-columns
href: https://www.deeplearning.ai/short-courses/llms-as-operating-systems-agent-memory/?utm_campaign=memgpt-launch&utm_content=331638345&utm_medium=social&utm_source=docs&hss_channel=tw-992153930095251456
- section: Get Started
contents:
- page: Letta Overview
path: pages/getting-started/letta_platform.mdx
- page: Quickstart
path: pages/getting-started/quickstart.mdx
- page: Prompts for Vibecoding
path: pages/getting-started/prompts.mdx
#- section: Supported Frameworks
# contents:
# - page: TypeScript (Node.js)
# path: pages/getting-started/ade.mdx
# - page: Python
# path: pages/getting-started/ade.mdx
# - page: Vercel AI SDK
# path: pages/frameworks/vercel.mdx
# - page: React
# path: pages/frameworks/react.mdx
# - page: Next.js
# path: pages/frameworks/next.mdx
# - page: Flask
# path: pages/frameworks/flask.mdx
# - page: Mastra
# path: pages/frameworks/mastra.mdx
- section: Stateful Agents
contents:
- page: Overview
path: pages/agents/overview.mdx
- section: Agent Architectures
path: pages/agents/architectures.mdx
contents:
- page: MemGPT Agents
path: pages/agents/memgpt_agents.mdx
- page: Sleep-time Agents
path: pages/agents/sleep_time_agents.mdx
- page: Low-latency (voice) Agents
path: pages/agents/low_latency_agents.mdx
- page: ReAct Agents
path: pages/agents/react_agents.mdx
- page: Workflows
path: pages/agents/workflows.mdx
- page: Stateful Workflows
path: pages/agents/stateful_workflows.mdx
- page: Context Hierarchy
path: pages/agents/context_hierarchy.mdx
- page: Heartbeats
path: pages/agents/heartbeats.mdx
- section: Memory
path: pages/agents/memory.mdx
contents:
- page: Memory Blocks
path: pages/agents/memory_blocks.mdx
- page: Agentic Context Engineering
path: pages/agents/context_engineering.mdx
- page: Filesystem
path: pages/agents/filesystem.mdx
- page: Streaming Responses
path: pages/agents/streaming.mdx
- page: Long-Running Executions
path: pages/agents/long_running.mdx
- page: JSON Mode & Structured Output
path: pages/agents/json_mode.mdx
- page: Human-in-the-Loop
path: pages/agents/human_in_the_loop.mdx
- page: Multi-Modal
path: pages/agents/multimodal.mdx
- section: Multi-Agent
path: pages/agents/multiagent.mdx
contents:
- page: Custom Multi-Agent Tools
path: pages/agents/multiagent_custom.mdx
- page: Multi-Agent Shared Memory
path: pages/agents/multiagent_memory.mdx
- page: Groups
path: pages/agents/groups.mdx
- page: Multi-User (Identities)
path: pages/agents/multiuser.mdx
- page: Agent File (.af)
path: pages/agents/agentfile.mdx
- page: Scheduling
path: pages/agents/scheduling.mdx
- section: Voice Agents
path: pages/voice/voice.mdx
contents:
- page: Connecting to LiveKit Agents
path: pages/voice/voice_livekit.mdx
- page: Connecting to Vapi
path: pages/voice/voice_vapi.mdx
- section: Tool Use
contents:
- page: Overview
path: pages/agents/tools.mdx
- page: Pre-built Tools
path: pages/agents/prebuilt_tools.mdx
- page: Custom Tools
path: pages/agents/custom_tools.mdx
- page: Tool Rules
path: pages/agents/tool_rules.mdx
- page: Tool Variables
path: pages/agents/tool_variables.mdx
- page: Composio Integration
path: pages/agents/composio.mdx
hidden: true
- section: Model Context Protocol
path: pages/mcp/overview.mdx
contents:
- page: Connecting Letta to MCP
path: pages/mcp/setup.mdx
- page: Remote (SSE/HTTP) Servers
path: pages/mcp/sse.mdx
- page: Local (stdio) Servers
path: pages/mcp/stdio.mdx
#- section: Tool Execution
# contents:
# - page: Overview
# path: pages/tool_execution/overview.mdx
# - section: Model Context Protocol
# contents:
# - page: What is MCP?
# path: pages/mcp/overview.mdx
# - section: Connecting Letta to MCP
# path: pages/mcp/setup.mdx
# contents:
# - page: Remote (SSE/HTTP) Servers
# path: pages/mcp/sse.mdx
# - page: Local (stdio) Servers
# path: pages/mcp/stdio.mdx
#- section: Deploying a Letta Server
# contents:
# - page: Letta Docker Image
# path: pages/server/docker.mdx
# - section: Connecting Model Providers
# contents:
# - page: OpenAI
# path: pages/models/openai.mdx
# - page: OpenAI proxy
# path: pages/models/openai_proxy.mdx
# - page: Anthropic
# path: pages/models/anthropic.mdx
# - page: DeepSeek
# path: pages/models/deepseek.mdx
# - page: AWS Bedrock
# path: pages/models/aws_bedrock.mdx
# - page: Groq
# path: pages/models/groq.mdx
# - page: xAI (Grok)
# path: pages/models/xai.mdx
# - page: Together
# path: pages/models/together.mdx
# - page: Google AI / Gemini
# path: pages/models/google.mdx
# - page: Google Vertex
# path: pages/models/google_vertex.mdx
# - page: Azure OpenAI
# path: pages/models/azure.mdx
# - page: Ollama
# path: pages/models/ollama.mdx
# - page: LM Studio
# path: pages/models/lmstudio.mdx
# - page: vLLM
# path: pages/models/vllm.mdx
# - section: Remote Hosting
# path: pages/deployment/remote.mdx
# contents:
# - page: Deploy on Railway
# path: pages/deployment/railway.mdx
# - section: Alternate Install Methods
# contents:
# - page: Using pip
# path: pages/server/pip.mdx
# - page: Installing from Source
# path: pages/server/source.mdx
#- section: Agent Templates
# contents:
# - page: Introduction to Templates
# path: pages/cloud/templates.mdx
# - page: Memory Variables
# path: pages/cloud/variables.mdx
# - page: Versioning
# path: pages/cloud/versions.mdx
- section: Key Concepts
contents:
- page: Letta concepts
path: pages/concepts/letta.mdx
- page: MemGPT concepts
path: pages/concepts/memgpt.mdx
- section: Additional Resources
contents:
- page: Letta Desktop Troubleshooting
path: pages/desktop/troubleshooting.mdx
- page: ADE Troubleshooting
path: pages/agent-development-environment/troubleshooting.mdx
- tab: ade
layout:
- link: Chat on Discord
icon: fa-brands fa-discord
href: https://discord.gg/letta
- link: Developer Forum
icon: fa-sharp fa-light fa-comments
href: https://forum.letta.com
- link: DeepLearning.AI Course
icon: fa-sharp fa-light fa-building-columns
href: https://www.deeplearning.ai/short-courses/llms-as-operating-systems-agent-memory/?utm_campaign=memgpt-launch&utm_content=331638345&utm_medium=social&utm_source=docs&hss_channel=tw-992153930095251456
- section: ADE Guide
contents:
- page: ADE Overview
path: pages/ade-guide/overview.mdx
- section: Getting Started
path: pages/ade-guide/setup.mdx
contents:
- page: Access from your browser
icon: fa-sharp fa-light fa-browser
path: pages/ade-guide/web.mdx
- page: Download Letta Desktop
icon: fa-sharp fa-light fa-download
path: pages/desktop/install.mdx
- section: ADE Components
contents:
- page: Agent Simulator
icon: fa-sharp fa-light fa-alien-8bit
path: pages/ade-guide/simulator.mdx
- page: Context Window Viewer
icon: fa-sharp fa-light fa-eye
path: pages/ade-guide/context_window_viewer.mdx
- page: Core Memory
icon: fa-sharp fa-light fa-brain
path: pages/ade-guide/core_memory.mdx
- page: Archival Memory
icon: fa-sharp fa-light fa-box-archive
path: pages/ade-guide/archival_memory.mdx
- page: Data Sources
icon: fa-sharp fa-light fa-database
path: pages/ade-guide/data_sources.mdx
- page: Tools
icon: fa-sharp fa-light fa-wrench
path: pages/ade-guide/tools.mdx
- page: Settings
icon: fa-sharp fa-light fa-gear
path: pages/ade-guide/settings.mdx
- tab: selfhosted
layout:
- link: Chat on Discord
icon: fa-brands fa-discord
href: https://discord.gg/letta
- link: Developer Forum
icon: fa-sharp fa-light fa-comments
href: https://forum.letta.com
- link: DeepLearning.AI Course
icon: fa-sharp fa-light fa-building-columns
href: https://www.deeplearning.ai/short-courses/llms-as-operating-systems-agent-memory/?utm_campaign=memgpt-launch&utm_content=331638345&utm_medium=social&utm_source=docs&hss_channel=tw-992153930095251456
#- page: Install Letta Desktop
# icon: fa-sharp fa-light fa-download
# path: pages/install.mdx
- section: Self-Hosting
contents:
- page: Overview
path: pages/selfhosting/overview.mdx
- page: Tool Execution
path: pages/tool_execution/local_tool_execution.mdx
- page: Tracing & Telemetry
path: pages/deployment/telemetry.mdx
- section: Deployment
path: pages/deployment/remote.mdx
contents:
- page: Railway
path: pages/deployment/railway.mdx
#- page: Deploying with Docker
# icon: fa-brands fa-docker
# path: pages/server/docker.mdx
#- page: Install Letta via pip
# icon: fa-brands fa-python
# path: pages/server/pip.mdx
- section: Connecting Model Providers
contents:
- page: Supported Models
path: pages/selfhosting/supported-models.mdx
- page: OpenAI
path: pages/models/openai.mdx
- page: Anthropic
path: pages/models/anthropic.mdx
- page: Gemini (Google AI)
path: pages/models/google.mdx
- page: LM Studio
path: pages/models/lmstudio.mdx
- section: See More Providers
icon: fa-sharp fa-light fa-caret-down
contents:
- page: OpenAI proxy
path: pages/models/openai_proxy.mdx
- page: DeepSeek
path: pages/models/deepseek.mdx
- page: AWS Bedrock
path: pages/models/aws_bedrock.mdx
- page: Groq
path: pages/models/groq.mdx
- page: xAI (Grok)
path: pages/models/xai.mdx
- page: Together
path: pages/models/together.mdx
- page: Google Vertex
path: pages/models/google_vertex.mdx
- page: Azure OpenAI
path: pages/models/azure.mdx
- page: Ollama
path: pages/models/ollama.mdx
- page: vLLM
path: pages/models/vllm.mdx
#- section: Remote Deployments
# contents:
# - page: Overview
# path: pages/deployment/remote.mdx
# - page: Example - Deploy on Railway
# path: pages/deployment/railway.mdx
- section: Advanced
contents:
#- page: Install with pip
# path: pages/server/pip.mdx
- page: Database Configuration
path: pages/selfhosting/postgres.mdx
- page: Performance
path: pages/selfhosting/performance.mdx
- page: pgadmin
path: pages/selfhosting/pgadmin.mdx
- page: Installing from Source
path: pages/server/source.mdx
- tab: cloud
layout:
- link: Chat on Discord
icon: fa-brands fa-discord
href: https://discord.gg/letta
- link: Developer Forum
icon: fa-sharp fa-light fa-comments
href: https://forum.letta.com
- link: DeepLearning.AI Course
icon: fa-sharp fa-light fa-building-columns
href: https://www.deeplearning.ai/short-courses/llms-as-operating-systems-agent-memory/?utm_campaign=memgpt-launch&utm_content=331638345&utm_medium=social&utm_source=docs&hss_channel=tw-992153930095251456
- section: Get started
contents:
- page: Overview
path: pages/cloud/overview.mdx
#- page: Quickstart
# path: pages/getting-started/quickstart_cloud.mdx
- page: Get a Letta Cloud API key
path: pages/cloud/api_key.mdx
- section: Account
contents:
- page: Plans & Pricing
path: pages/cloud/pricing.mdx
# - page: Available Models
# path: pages/cloud/models.mdx
- page: Custom API Keys
path: pages/cloud/api_keys.mdx
- page: Role-Based Access Control
path: pages/cloud/rbac.mdx
- section: Deploying Agents
contents:
- page: Agent Templates Overview
path: pages/cloud/templates.mdx
- page: Template Versioning
path: pages/cloud/versions.mdx
- page: Memory Variables
path: pages/cloud/variables.mdx
- page: Client-Side Access Tokens
path: pages/cloud/client-side-tokens.mdx
# - page: Deploying via the SDK
# path: pages/cloud/variables.mdx
# - page: Deploying via the ADE
# path: pages/cloud/versions.mdx
- section: Observability
contents:
- page: Overview
path: pages/cloud/observability.mdx
- page: Monitoring
path: pages/cloud/monitoring.mdx
- page: Responses & Tracing
path: pages/cloud/responses.mdx
- tab: ref
layout:
- link: Chat on Discord
icon: fa-brands fa-discord
href: https://discord.gg/letta
- link: Developer Forum
icon: fa-sharp fa-light fa-comments
href: https://forum.letta.com
- link: DeepLearning.AI Course
icon: fa-sharp fa-light fa-building-columns
href: https://www.deeplearning.ai/short-courses/llms-as-operating-systems-agent-memory/?utm_campaign=memgpt-launch&utm_content=331638345&utm_medium=social&utm_source=docs&hss_channel=tw-992153930095251456
- section: API Reference
contents:
- page: API and SDK Overview
path: pages/api/about.mdx
- changelog: ./changelog
title: Changelog
slug: changelog
- api: API Reference
display-errors: true
paginated: true
flattened: true
snippets:
typescript: "@letta-ai/letta-client"
python: letta-client
layout:
- agents
- tab: showcase
layout:
- link: Chat on Discord
icon: fa-brands fa-discord
href: https://discord.gg/letta
- link: Developer Forum
icon: fa-sharp fa-light fa-comments
href: https://forum.letta.com
- link: DeepLearning.AI Course
icon: fa-sharp fa-light fa-building-columns
href: https://www.deeplearning.ai/short-courses/llms-as-operating-systems-agent-memory/?utm_campaign=memgpt-launch&utm_content=331638345&utm_medium=social&utm_source=docs&hss_channel=tw-992153930095251456
- section: Examples
contents:
- page: Overview
path: pages/cookbooks_simple.mdx
- section: Multi-Agent
contents:
- page: Async Multi-Agent
path: pages/tutorials/multiagent_async.mdx
- tab: leaderboard
layout:
- link: Chat on Discord
icon: fa-brands fa-discord
href: https://discord.gg/letta
- link: Developer Forum
icon: fa-sharp fa-light fa-comments
href: https://forum.letta.com
- link: DeepLearning.AI Course
icon: fa-sharp fa-light fa-building-columns
href: https://www.deeplearning.ai/short-courses/llms-as-operating-systems-agent-memory/?utm_campaign=memgpt-launch&utm_content=331638345&utm_medium=social&utm_source=docs&hss_channel=tw-992153930095251456
- section: Letta Leaderboard
contents:
- page: Overview
path: pages/leaderboard/overview.mdx
# - page: Benchmark Information
# path: pages/leaderboard/benchmarks.mdx
- page: Contributing Results
path: pages/leaderboard/contributing.mdx
# - tab: cookbooks
# layout:
# - section: Cookbooks
# path: pages/cookbooks.mdx
# contents:
# - section: Multi-Agent
# contents:
# - page: Async Multi-Agent
# path: pages/tutorials/multiagent_async.mdx
# - tab: community
# layout:
# - page: Developer Community
# path: pages/community.mdx
colors:
accent-primary:
light: '#0707ac'
dark: '#FF5533'
background:
light: '#ffffffff'
dark: '#0d0d0d'
card-background:
light: '#f6f6f6ff'
dark: '#151515'
header-background:
light: '#fbfbfbff'
dark: '#000000ff'
border:
light: '#eef0f2ff'
dark: '#202020'
css:
- assets/styles.css
- assets/leaderboard.css
js:
- path: assets/leaderboard.js
strategy: lazyOnload
# strategy: afterInteractive
favicon: assets/favicon.png
logo:
href: /
light: assets/logo-light.svg
dark: assets/logo-dark.svg
navbar-links:
- type: github
value: https://github.com/letta-ai/letta
- type: filled
text: Launch ADE
href: https://app.letta.com
rounded: false
layout:
page-width: 1504px
tabs-placement: header
searchbar-placement: header
typography:
bodyFont:
name: ManropeRegularBody
paths:
- path: assets/fonts/manrope/Manrope-Regular.ttf
weight: 400
style: normal
- path: assets/fonts/manrope/Manrope-Medium.ttf
weight: 500 900
style: normal
headingsFont:
name: RoobertMediumHeading
path: assets/fonts/roobert/RoobertMedium.woff2
codeFont:
name: FiraCode
paths:
- path: assets/fonts/fira-code/FiraCode-Regular.ttf
weight: 400
style: normal
- path: assets/fonts/fira-code/FiraCode-Medium.ttf
weight: 500 900
style: normal
redirects:
- source: "/install"
destination: "/guides/ade/desktop"
- source: "/desktop"
destination: "/guides/ade/desktop"
- source: "/quickstart/desktop"
destination: "/guides/ade/desktop"
- source: "/quickstart/docker"
destination: "/guides/selfhosting"
- source: "/guides/server/pip"
destination: "/guides/selfhosting"
- source: "/quickstart/cloud"
destination: "/cloud/quickstart"
- source: "/guides/server/docker"
destination: "/guides/selfhosting"
- source: "/agent-development-environment"
destination: "/guides/ade/overview"
- source: "/guides/ade/usage"
destination: "/guides/ade/overview"
- source: "/guides/agents/mcp"
destination: "/guides/mcp/overview"
- source: "/guides/mcp/sse"
destination: "/guides/mcp/remote"
- source: "/guides/mcp/stdio"
destination: "/guides/mcp/local"
- source: "/guides/server/quickstart"
destination: "/quickstart"
- source: "/agent-development-environment/troubleshooting"
destination: "/guides/ade/troubleshooting"
- source: "/models/openai"
destination: "/guides/server/providers/openai"
- source: "/models/openai_proxy"
destination: "/guides/server/providers/openai-proxy"
- source: "/models/anthropic"
destination: "/guides/server/providers/anthropic"
- source: "/models/aws_bedrock"
destination: "/guides/server/providers/aws_bedrock"
- source: "/models/groq"
destination: "/guides/server/providers/groq"
- source: "/models/together"
destination: "/guides/server/providers/together"
- source: "/models/google"
destination: "/guides/server/providers/google"
- source: "/models/google_vertex"
destination: "/guides/server/providers/google_vertex"
- source: "/models/deepseek"
destination: "/guides/server/providers/deepseek"
- source: "/models/ollama"
destination: "/guides/server/providers/ollama"
- source: "/models/vllm"
destination: "/guides/server/providers/vllm"
- source: "/models/azure"
destination: "/guides/server/providers/azure"
- source: "/server/docker"
destination: "/guides/server/docker"
- source: "/server/pip"
destination: "/guides/server/pip"
- source: "/agents/tools"
destination: "/guides/agents/tools"
- source: "/concepts"
destination: "/concepts/letta"
- source: "/introduction"
destination: "/letta-platform"
- source: "/advanced/memory_management"
destination: "/guides/agents/memory"
- source: "/changelog"
destination: "/api-reference/changelog"
- source: "/api-changelog"
destination: "/api-reference/changelog"
- source: "/quickstart/cloud"
destination: "/quickstart"
- source: "/guides/cloud"
destination: "/guides/cloud/overview"
- source: "/guides/ade"
destination: "/guides/ade/overview"
- source: "/cloud/quickstart"
destination: "/guides/cloud/quickstart"
- source: "/letta-platform"
destination: "/overview"
- source: "/guides/agents/sleep-time-agents"
destination: "/guides/agents/architectures/sleeptime"
- source: "/guides/agents/sources"
destination: "/guides/agents/filesystem"
- source: "/guides/desktop/install"
destination: "/guides/ade/desktop"
- source: "/api-reference/agents/cancel-agent-run"
destination: "/api-reference/agents/messages/cancel"
- source: "/api-reference/messages/cancel-batch-run"
destination: "/api-reference/batches/cancel"

View File

@@ -0,0 +1,60 @@
from letta_client import Letta
client = Letta(base_url="http://localhost:8283")
# list available models
models = client.models.list_llms()
for model in models:
print(f"Provider {model.model_endpoint_type} model {model.model}: {model.handle}")
# list available embedding models
embedding_models = client.models.list_embedding_models()
for model in embedding_models:
print(f"Provider {model.handle}")
# openai
openai_agent = client.agents.create(
model="openai/gpt-4o-mini",
embedding="openai/text-embedding-3-small",
# optional configuration
context_window_limit=16000,
embedding_chunk_size=300,
)
# Azure OpenAI
azure_openai_agent = client.agents.create(
model="azure/gpt-4o-mini",
embedding="azure/text-embedding-3-small",
# optional configuration
context_window_limit=16000,
embedding_chunk_size=300,
)
# anthropic
anthropic_agent = client.agents.create(
model="anthropic/claude-3-5-sonnet-20241022",
# note: anthropic does not support embeddings so you will need another provider
embedding="openai/text-embedding-3-small",
# optional configuration
context_window_limit=16000,
embedding_chunk_size=300,
)
# Groq
groq_agent = client.agents.create(
model="groq/llama-3.3-70b-versatile",
# note: groq does not support embeddings so you will need another provider
embedding="openai/text-embedding-3-small",
# optional configuration
context_window_limit=16000,
embedding_chunk_size=300,
)
# Ollama
ollama_agent = client.agents.create(
model="ollama/thewindmom/hermes-3-llama-3.1-8b:latest",
embedding="ollama/mxbai-embed-large:latest",
# optional configuration
context_window_limit=16000,
embedding_chunk_size=300,
)

View File

@@ -0,0 +1,30 @@
"""
Example of using composio tools in Letta
Make sure you set `COMPOSIO_API_KEY` environment variable or run `composio login` to authenticate with Composio.
"""
from composio import Action
from letta_client import Letta
client = Letta(base_url="http://localhost:8283")
# add a composio tool
tool = client.tools.add_composio_tool(composio_action_name=Action.GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER.name)
# create an agent with the tool
agent = client.agents.create(
name="file_editing_agent",
memory_blocks=[{"label": "persona", "value": "I am a helpful assistant"}],
model="anthropic/claude-3-5-sonnet-20241022",
embedding="openai/text-embedding-3-small",
tool_ids=[tool.id],
)
print("Agent tools", [tool.name for tool in agent.tools])
# message the agent
response = client.agents.messages.create(
agent_id=agent.id, messages=[{"role": "user", "content": "Star the github repo `letta` by `letta-ai`"}]
)
for message in response.messages:
print(message)

View File

@@ -0,0 +1,56 @@
import time
from letta_client import Letta
client = Letta(base_url="http://localhost:8283")
# get available embedding models
embedding_configs = client.models.list_embedding_models()
# clear existing sources
if len(client.sources.list()) > 0:
for source in client.sources.list():
if source.name == "my_source":
client.sources.delete(source.id)
# create a source
# TODO: pass in embedding
source = client.sources.create(name="my_source", embedding_config=embedding_configs[0])
# list sources
sources = client.sources.list()
# write a dummy file
with open("dummy.txt", "w") as f:
f.write("Remember that the user is a redhead")
# upload a file into the source
job = client.sources.files.upload(source_id=source.id, file=open("dummy.txt", "rb"))
# wait until the job is completed
while True:
job = client.jobs.retrieve(job.id)
if job.status == "completed":
break
elif job.status == "failed":
raise ValueError(f"Job failed: {job.metadata}")
print(f"Job status: {job.status}")
time.sleep(1)
# list files in the source
files = client.sources.files.list(source_id=source.id)
print(f"Files in source: {files}")
# list passages in the source
passages = client.sources.passages.list(source_id=source.id)
print(f"Passages in source: {passages}")
# attach the source to an agent
agent = client.agents.create(
name="my_agent",
memory_blocks=[],
model="anthropic/claude-3-5-sonnet-20241022",
embedding=embedding_configs[0].handle,
tags=["worker"],
)
client.agents.sources.attach(agent_id=agent.id, source_id=source.id)

44
fern/examples/memory.py Normal file
View File

@@ -0,0 +1,44 @@
from letta_client import Letta
client = Letta(base_url="http://localhost:8283")
agent = client.agents.create(
name="memory_agent",
memory_blocks=[
{"label": "persona", "value": "I am a memory agent"},
{"label": "human", "value": "Name: Bob", "limit": 10000},
],
model="anthropic/claude-3-5-sonnet-20241022",
embedding="openai/text-embedding-3-small",
tags=["worker"],
)
# create a persisted block, which can be attached to agents
block = client.blocks.create(
label="organization",
value="Organization: Letta",
limit=4000,
)
# create an agent with both a shared block and its own blocks
shared_block_agent = client.agents.create(
name="shared_block_agent",
memory_blocks=[block.id],
model="anthropic/claude-3-5-sonnet-20241022",
embedding="openai/text-embedding-3-small",
tags=["worker"],
)
# list the agents blocks
blocks = client.agents.core_memory.list_blocks(shared_block_agent.id)
for block in blocks:
print(block)
# update the block (via ID)
block = client.blocks.modify(block.id, limit=10000)
# update the block (via label)
block = client.agents.core_memory.modify_block(
agent_id=shared_block_agent.id, block_label="organization", value="Organization: Letta", limit=10000
)

View File

@@ -0,0 +1,53 @@
from letta_client import Letta
client = Letta(base_url="http://localhost:8283")
try:
# create a supervisor agent
supervisor_agent = client.agents.create(
name="supervisor_agent",
memory_blocks=[
{"label": "persona", "value": "I am the supervisor, and I can communicate with worker agents with the tag `worker`"}
],
model="anthropic/claude-3-5-sonnet-20241022",
embedding="openai/text-embedding-3-small",
tags=["supervisor"],
tools=["send_message_to_agents_matching_all_tags"],
)
print(f"Created agent {supervisor_agent.name} with ID {supervisor_agent.id}")
def get_name() -> str:
"""Get the name of the worker agent."""
return "Bob"
tool = client.tools.upsert_from_function(func=get_name)
print(f"Created tool {tool.name} with ID {tool.id}")
# create a worker agent
worker_agent = client.agents.create(
name="worker_agent",
memory_blocks=[{"label": "persona", "value": f"I am the worker, my supervisor agent has ID {supervisor_agent.id}"}],
model="anthropic/claude-3-5-sonnet-20241022",
embedding="openai/text-embedding-3-small",
tool_ids=[tool.id],
tags=["worker"],
tools=["send_message_to_agents_matching_all_tags"],
)
print(f"Created agent {worker_agent.name} with ID {worker_agent.id}")
# send a message to the supervisor agent
response = client.agents.messages.create(
agent_id=worker_agent.id,
messages=[{"role": "user", "content": "Ask the worker agents what their name is, then tell me with send_message"}],
)
print(response.messages)
print(response.usage)
except Exception as e:
print(e)
# cleanup
agents = client.agents.list(tags=["worker", "supervisor"])
for agent in agents:
client.agents.delete(agent.id)
print(f"Deleted agent {agent.name} with ID {agent.id}")

View File

@@ -0,0 +1,34 @@
"""
This example shows how to create agents with tool rules, which restrict
what tool the agent can execute at a given step.
Note that by default, agents can execute any tool. As agents become more
powerful, they will not need as much guidance from the developer.
Last tested with letta-client version: 0.1.22
"""
from letta_client import ChildToolRule, InitToolRule, Letta, TerminalToolRule
client = Letta(base_url="http://localhost:8283")
# always search archival memory first
search_agent = client.agents.create(
name="search_agent",
memory_blocks=[],
model="anthropic/claude-3-5-sonnet-20241022",
embedding="openai/text-embedding-3-small",
tags=["worker"],
tool_rules=[
InitToolRule(tool_name="archival_memory_search"),
ChildToolRule(tool_name="archival_memory_search", children=["send_message"]),
# TerminalToolRule(tool_name="send_message", type="TerminalToolRule"),
TerminalToolRule(tool_name="send_message"),
],
)
response = client.agents.messages.create(
agent_id=search_agent.id,
messages=[{"role": "user", "content": "do something"}],
)
for message in response.messages:
print(message)

4
fern/fern.config.json Normal file
View File

@@ -0,0 +1,4 @@
{
"organization": "letta",
"version": "0.65.37"
}

53
fern/generators.yml Normal file
View File

@@ -0,0 +1,53 @@
auth-schemes:
token:
header: Authorization
prefix: Bearer
type: optional<string>
api:
auth: token
headers:
X-Project:
type: optional<string>
name: project
specs:
- openapi: openapi.json
overrides: openapi-overrides.yml
settings:
title-as-schema-name: false
prefer-undiscriminated-unions-with-literals: true
groups:
python-sdk:
generators:
- name: fernapi/fern-python-sdk
version: 4.25.6
output:
location: pypi
package-name: letta-client
token: ${PYPI_TOKEN}
github:
repository: letta-ai/letta-python
config:
package_name: letta_client
pydantic_config:
skip_validation: true
client:
class_name: LettaBase
filename: base_client.py
exported_class_name: Letta
exported_filename: client.py
ts-sdk:
generators:
- name: fernapi/fern-typescript-node-sdk
version: 0.51.7
output:
location: npm
package-name: "@letta-ai/letta-client"
token: ${NPM_TOKEN}
github:
repository: "letta-ai/letta-node"
config:
namespaceExport: Letta
allowCustomFetcher: true
skipResponseValidation: true
includeApiReference: true
smart-casing: true

BIN
fern/images/ade-mm-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

BIN
fern/images/ade-mm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

BIN
fern/images/ade_mcp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 864 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 971 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

161
fern/images/hero-dark.svg Normal file
View File

@@ -0,0 +1,161 @@
<svg width="700" height="320" viewBox="0 0 700 320" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2862_30)">
<rect width="700" height="320" rx="16" fill="url(#paint0_linear_2862_30)"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="white"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="url(#paint1_radial_2862_30)"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="black" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="url(#paint2_linear_2862_30)" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M311.72 247.034C283.108 246.887 258.409 231.208 246.538 201.531C234.656 171.825 238.271 134.702 253.583 101.377C282.195 101.524 306.894 117.203 318.765 146.88C330.647 176.586 327.031 213.709 311.72 247.034Z" stroke="url(#paint3_linear_2862_30)" stroke-opacity="0.05" stroke-width="0.530516"/>
<path d="M305.839 247.174C343.92 237.419 377.154 210.619 393.585 171.64C410.017 132.661 405.98 90.1988 386.347 56.1934C348.266 65.9477 315.032 92.7486 298.601 131.728C282.169 170.706 286.206 213.168 305.839 247.174Z" fill="white"/>
<path d="M305.839 247.174C343.92 237.419 377.154 210.619 393.585 171.64C410.017 132.661 405.98 90.1988 386.347 56.1934C348.266 65.9477 315.032 92.7486 298.601 131.728C282.169 170.706 286.206 213.168 305.839 247.174Z" fill="url(#paint4_radial_2862_30)"/>
<path d="M393.341 171.537C376.971 210.369 343.89 237.091 305.969 246.867C286.462 212.959 282.476 170.663 298.845 131.831C315.215 92.9978 348.295 66.2765 386.217 56.5004C405.724 90.4077 409.71 132.704 393.341 171.537Z" stroke="url(#paint5_linear_2862_30)" stroke-opacity="0.05" stroke-width="0.530516"/>
<path d="M305.686 246.995C329.749 266.114 361.965 272.832 393.67 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.045 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="white"/>
<path d="M305.686 246.995C329.749 266.114 361.965 272.832 393.67 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.045 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="url(#paint6_radial_2862_30)"/>
<path d="M305.686 246.995C329.749 266.114 361.965 272.832 393.67 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.045 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="black" fill-opacity="0.2" style="mix-blend-mode:hard-light"/>
<path d="M305.686 246.995C329.749 266.114 361.965 272.832 393.67 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.045 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="url(#paint7_linear_2862_30)" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M393.586 261.878C362.034 272.529 329.98 265.88 306.002 246.907C317.534 215.919 341.57 190.327 373.13 179.673C404.681 169.023 436.735 175.671 460.714 194.644C449.181 225.632 425.145 251.224 393.586 261.878Z" stroke="url(#paint8_linear_2862_30)" stroke-opacity="0.05" stroke-width="0.530516"/>
<g opacity="0.8" filter="url(#filter0_f_2862_30)">
<circle cx="660" cy="-60" r="160" fill="#18E244" fill-opacity="0.4"/>
</g>
<g opacity="0.8" filter="url(#filter1_f_2862_30)">
<circle cx="20" cy="213" r="160" fill="#18CAE2" fill-opacity="0.33"/>
</g>
<g opacity="0.8" filter="url(#filter2_f_2862_30)">
<circle cx="660" cy="480" r="160" fill="#18E2B2" fill-opacity="0.52"/>
</g>
<g opacity="0.8" filter="url(#filter3_f_2862_30)">
<circle cx="20" cy="413" r="160" fill="#4018E2" fill-opacity="0.22"/>
</g>
<path opacity="0.2" d="M0 50H700" stroke="url(#paint9_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.1" d="M0 82H700" stroke="url(#paint10_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.2" d="M239 0L239 320" stroke="url(#paint11_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.1" d="M271 0L271 320" stroke="url(#paint12_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.2" d="M461 0L461 320" stroke="url(#paint13_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.1" d="M429 0L429 320" stroke="url(#paint14_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.2" d="M0 271H700" stroke="url(#paint15_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.1" d="M0 239H700" stroke="url(#paint16_radial_2862_30)" stroke-dasharray="4 4"/>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M0 160H700" stroke="url(#paint17_linear_2862_30)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.2">
<path d="M511 -1L189 321" stroke="url(#paint18_linear_2862_30)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.2">
<path d="M511 321L189 -1" stroke="url(#paint19_linear_2862_30)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<circle cx="350" cy="160" r="111" stroke="white"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<circle cx="350" cy="160" r="79" stroke="white"/>
</g>
</g>
<defs>
<filter id="filter0_f_2862_30" x="260" y="-460" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_30"/>
</filter>
<filter id="filter1_f_2862_30" x="-380" y="-187" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_30"/>
</filter>
<filter id="filter2_f_2862_30" x="260" y="80" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_30"/>
</filter>
<filter id="filter3_f_2862_30" x="-380" y="13" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_30"/>
</filter>
<linearGradient id="paint0_linear_2862_30" x1="1.04308e-05" y1="320" x2="710.784" y2="26.0793" gradientUnits="userSpaceOnUse">
<stop stop-color="#18E299" stop-opacity="0.09"/>
<stop offset="0.729167" stop-color="#0D9373" stop-opacity="0.08"/>
</linearGradient>
<radialGradient id="paint1_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(208.697 189.703) rotate(-10.029) scale(169.097 167.466)">
<stop stop-color="#00B0BB"/>
<stop offset="1" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint2_linear_2862_30" x1="306.587" y1="93.5598" x2="252.341" y2="224.228" gradientUnits="userSpaceOnUse">
<stop stop-color="#18E299"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint3_linear_2862_30" x1="311.84" y1="123.717" x2="253.579" y2="224.761" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint4_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(313.407 243.64) rotate(-75.7542) scale(203.632 223.902)">
<stop stop-color="#00BBBB"/>
<stop offset="0.712616" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint5_linear_2862_30" x1="308.586" y1="102.284" x2="383.487" y2="201.169" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint6_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(311.446 249.925) rotate(-20.3524) scale(174.776 163.096)">
<stop stop-color="#00B0BB"/>
<stop offset="1" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint7_linear_2862_30" x1="395.842" y1="169.781" x2="332.121" y2="263.82" gradientUnits="userSpaceOnUse">
<stop stop-color="#00B1BC"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint8_linear_2862_30" x1="395.842" y1="169.781" x2="370.99" y2="271.799" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint9_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(350 50) scale(398.125 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint10_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(350 82) scale(398.125 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint11_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(239 160) rotate(90) scale(182 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint12_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(271 160) rotate(90) scale(182 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint13_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(461 160) rotate(90) scale(182 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint14_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(429 160) rotate(90) scale(182 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint15_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(350 271) scale(398.125 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint16_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(350 239) scale(398.125 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint17_linear_2862_30" x1="0" y1="160" x2="700" y2="160" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.1"/>
<stop offset="0.5" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="paint18_linear_2862_30" x1="511" y1="-1" x2="189" y2="321" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.1"/>
<stop offset="0.5" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="paint19_linear_2862_30" x1="511" y1="321" x2="189" y2="-0.999997" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.1"/>
<stop offset="0.5" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
</linearGradient>
<clipPath id="clip0_2862_30">
<rect width="700" height="320" rx="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

155
fern/images/hero-light.svg Normal file
View File

@@ -0,0 +1,155 @@
<svg width="700" height="320" viewBox="0 0 700 320" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2862_278)">
<rect width="700" height="320" rx="16" fill="url(#paint0_linear_2862_278)"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="white"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="url(#paint1_radial_2862_278)"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="black" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="url(#paint2_linear_2862_278)" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M311.72 247.034C283.108 246.887 258.409 231.208 246.538 201.531C234.656 171.825 238.271 134.702 253.583 101.377C282.195 101.524 306.894 117.203 318.765 146.88C330.647 176.586 327.031 213.709 311.72 247.034Z" stroke="url(#paint3_linear_2862_278)" stroke-opacity="0.05" stroke-width="0.530516"/>
<path d="M305.839 247.174C343.92 237.419 377.154 210.619 393.585 171.64C410.017 132.661 405.98 90.1988 386.347 56.1934C348.266 65.9477 315.032 92.7486 298.601 131.728C282.169 170.706 286.206 213.168 305.839 247.174Z" fill="white"/>
<path d="M305.839 247.174C343.92 237.419 377.154 210.619 393.585 171.64C410.017 132.661 405.98 90.1988 386.347 56.1934C348.266 65.9477 315.032 92.7486 298.601 131.728C282.169 170.706 286.206 213.168 305.839 247.174Z" fill="url(#paint4_radial_2862_278)"/>
<path d="M393.341 171.537C376.971 210.369 343.89 237.091 305.969 246.867C286.462 212.959 282.476 170.663 298.845 131.831C315.215 92.9978 348.295 66.2765 386.217 56.5004C405.724 90.4077 409.71 132.704 393.341 171.537Z" stroke="url(#paint5_linear_2862_278)" stroke-opacity="0.05" stroke-width="0.530516"/>
<path d="M305.686 246.995C329.75 266.114 361.965 272.832 393.671 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.046 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="white"/>
<path d="M305.686 246.995C329.75 266.114 361.965 272.832 393.671 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.046 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="url(#paint6_radial_2862_278)"/>
<path d="M305.686 246.995C329.75 266.114 361.965 272.832 393.671 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.046 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="black" fill-opacity="0.2" style="mix-blend-mode:hard-light"/>
<path d="M305.686 246.995C329.75 266.114 361.965 272.832 393.671 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.046 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="url(#paint7_linear_2862_278)" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M393.586 261.878C362.035 272.529 329.981 265.88 306.002 246.907C317.535 215.919 341.571 190.327 373.13 179.673C404.682 169.023 436.736 175.671 460.715 194.644C449.182 225.632 425.146 251.224 393.586 261.878Z" stroke="url(#paint8_linear_2862_278)" stroke-opacity="0.05" stroke-width="0.530516"/>
<g opacity="0.8" filter="url(#filter0_f_2862_278)">
<circle cx="660" cy="-60" r="160" fill="#18E299" fill-opacity="0.4"/>
</g>
<g opacity="0.8" filter="url(#filter1_f_2862_278)">
<circle cx="20" cy="213" r="160" fill="#18E299" fill-opacity="0.33"/>
</g>
<g opacity="0.8" filter="url(#filter2_f_2862_278)">
<circle cx="660" cy="480" r="160" fill="#18E299" fill-opacity="0.52"/>
</g>
<g opacity="0.8" filter="url(#filter3_f_2862_278)">
<circle cx="20" cy="413" r="160" fill="#18E299" fill-opacity="0.22"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M0 50H700" stroke="black" stroke-dasharray="4 4"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M0 82H700" stroke="black" stroke-dasharray="4 4"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M239 0L239 320" stroke="black" stroke-dasharray="4 4"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M271 0L271 320" stroke="black" stroke-dasharray="4 4"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M461 0L461 320" stroke="black" stroke-dasharray="4 4"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M350 0L350 320" stroke="url(#paint9_linear_2862_278)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M429 0L429 320" stroke="black" stroke-dasharray="4 4"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M0 271H700" stroke="black" stroke-dasharray="4 4"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M0 239H700" stroke="black" stroke-dasharray="4 4"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M0 160H700" stroke="url(#paint10_linear_2862_278)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M511 -1L189 321" stroke="url(#paint11_linear_2862_278)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M511 321L189 -1" stroke="url(#paint12_linear_2862_278)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.05">
<circle cx="350" cy="160" r="111" stroke="black"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.05">
<circle cx="350" cy="160" r="79" stroke="black"/>
</g>
</g>
<defs>
<filter id="filter0_f_2862_278" x="260" y="-460" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_278"/>
</filter>
<filter id="filter1_f_2862_278" x="-380" y="-187" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_278"/>
</filter>
<filter id="filter2_f_2862_278" x="260" y="80" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_278"/>
</filter>
<filter id="filter3_f_2862_278" x="-380" y="13" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_278"/>
</filter>
<linearGradient id="paint0_linear_2862_278" x1="1.04308e-05" y1="320" x2="710.784" y2="26.0793" gradientUnits="userSpaceOnUse">
<stop stop-color="#18E299" stop-opacity="0.09"/>
<stop offset="0.729167" stop-color="#0D9373" stop-opacity="0.08"/>
</linearGradient>
<radialGradient id="paint1_radial_2862_278" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(208.697 189.703) rotate(-10.029) scale(169.097 167.466)">
<stop stop-color="#00B0BB"/>
<stop offset="1" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint2_linear_2862_278" x1="306.587" y1="93.5598" x2="252.341" y2="224.228" gradientUnits="userSpaceOnUse">
<stop stop-color="#18E299"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint3_linear_2862_278" x1="311.84" y1="123.717" x2="253.579" y2="224.761" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint4_radial_2862_278" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(313.407 243.64) rotate(-75.7542) scale(203.632 223.902)">
<stop stop-color="#00BBBB"/>
<stop offset="0.712616" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint5_linear_2862_278" x1="308.586" y1="102.284" x2="383.487" y2="201.169" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint6_radial_2862_278" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(311.447 249.925) rotate(-20.3524) scale(174.776 163.096)">
<stop stop-color="#00B0BB"/>
<stop offset="1" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint7_linear_2862_278" x1="395.843" y1="169.781" x2="332.121" y2="263.82" gradientUnits="userSpaceOnUse">
<stop stop-color="#00B1BC"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint8_linear_2862_278" x1="395.843" y1="169.781" x2="370.991" y2="271.799" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint9_linear_2862_278" x1="350" y1="0" x2="350" y2="320" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="0.0001" stop-opacity="0.3"/>
<stop offset="0.333333"/>
<stop offset="0.666667"/>
<stop offset="1" stop-opacity="0.3"/>
</linearGradient>
<linearGradient id="paint10_linear_2862_278" x1="0" y1="160" x2="700" y2="160" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0.1"/>
<stop offset="0.5"/>
<stop offset="1" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="paint11_linear_2862_278" x1="511" y1="-1" x2="189" y2="321" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0.1"/>
<stop offset="0.5"/>
<stop offset="1" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="paint12_linear_2862_278" x1="511" y1="321" x2="189" y2="-0.999997" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0.1"/>
<stop offset="0.5"/>
<stop offset="1" stop-opacity="0.1"/>
</linearGradient>
<clipPath id="clip0_2862_278">
<rect width="700" height="320" rx="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,88 @@
<svg width="1666" height="1031" viewBox="0 0 1666 1031" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M900.29 1029.82C1249.26 1029.82 1532.16 859.523 1532.16 649.45C1532.16 439.377 1249.26 269.08 900.29 269.08C551.318 269.08 268.42 439.377 268.42 649.45C268.42 859.523 551.318 1029.82 900.29 1029.82Z" stroke="#C9CDD1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 1013.79C1132.4 1013.79 1320.57 902.488 1320.57 765.19C1320.57 627.892 1132.4 516.59 900.29 516.59C668.176 516.59 480.01 627.892 480.01 765.19C480.01 902.488 668.176 1013.79 900.29 1013.79Z" stroke="#C9CDD1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 581C1022.8 581 1122.11 516.735 1122.11 437.46C1122.11 358.185 1022.8 293.92 900.29 293.92C777.782 293.92 678.47 358.185 678.47 437.46C678.47 516.735 777.782 581 900.29 581Z" stroke="#C9CDD1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 997.63C1022.8 997.63 1122.11 936.781 1122.11 861.72C1122.11 786.659 1022.8 725.81 900.29 725.81C777.782 725.81 678.47 786.659 678.47 861.72C678.47 936.781 777.782 997.63 900.29 997.63Z" stroke="#C9CDD1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1239.23 579L1239.19 592.26C1239.33 541.7 1205.96 491.05 1139.14 452.48C1006.35 375.82 791.76 375.82 659.83 452.48C594.29 490.57 561.48 540.41 561.34 590.33L561.38 577.07C561.52 527.15 594.33 477.31 659.87 439.22C791.8 362.55 1006.4 362.55 1139.18 439.22C1206 477.8 1239.37 528.44 1239.23 579Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1156.36 429.23C1298.7 511.41 1299.44 644.65 1158.03 726.83C1016.62 809.01 786.59 809.01 644.26 726.83C501.92 644.65 501.17 511.41 642.58 429.23C783.99 347.05 1014.02 347.05 1156.36 429.23ZM661.43 716.85C794.22 793.51 1008.81 793.51 1140.74 716.85C1272.67 640.18 1271.97 515.88 1139.18 439.21C1006.39 362.55 791.8 362.55 659.87 439.21C527.94 515.88 528.64 640.18 661.43 716.85Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1263.6 579.07L1263.56 592.33C1263.41 645.84 1228.24 699.27 1157.99 740.09C1016.58 822.27 786.55 822.27 644.22 740.09C572.59 698.74 536.82 644.45 536.97 590.25L537.01 576.99C536.86 631.19 572.63 685.47 644.26 726.83C786.6 809.01 1016.62 809.01 1158.03 726.83C1228.28 686 1263.45 632.57 1263.6 579.07Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M919.03 371.73L918.05 423.08L891.14 422.85L892.12 371.51L919.03 371.73Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M919.03 371.73L918.91 411.52L917.94 462.87L918.05 423.08L919.03 371.73Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M918.05 423.08L917.94 462.87L891.03 462.64L891.14 422.85L918.05 423.08Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M814.12 378.81L843.52 427.31L818.13 432.43L788.73 383.94L814.12 378.81Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M843.52 427.31L843.4 467.11L818.02 472.23L818.13 432.43L843.52 427.31Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M818.13 432.43L818.02 472.23L788.62 423.73L788.73 383.94L818.13 432.43Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M719.84 406.26L776.06 446.07L755.26 455.91L699.03 416.11L719.84 406.26Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M776.06 446.07L775.95 485.86L755.15 495.7L755.26 455.91L776.06 446.07Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M755.26 455.91L755.15 495.7L698.92 455.9L699.03 416.11L755.26 455.91Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M693.11 516.59L688.14 531.9L601.02 522.26L605.98 506.95L693.11 516.59Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M693.11 516.59L693 556.38L688.03 571.69L688.14 531.9L693.11 516.59Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M688.14 531.9L688.03 571.69L600.91 562.05L601.02 522.26L688.14 531.9Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M687.61 559.86L691.99 575.24L604.53 583.44L600.15 568.05L687.61 559.86Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M691.99 575.24L691.88 615.03L604.41 623.23L604.53 583.44L691.99 575.24Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M604.53 583.44L604.41 623.23L600.03 607.84L600.15 568.05L604.53 583.44Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M708 601.65L721.2 615.26L643.94 640.29L630.74 626.69L708 601.65Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M721.2 615.26L721.08 655.05L643.83 680.09L643.94 640.29L721.2 615.26Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M643.94 640.29L643.83 680.09L630.63 666.48L630.74 626.69L643.94 640.29Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1021.91 385.87L990.67 433.86L965.49 428.32L996.72 380.33L1021.91 385.87Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1021.91 385.87L1021.8 425.66L990.56 473.65L990.67 433.86L1021.91 385.87Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M990.67 433.86L990.56 473.65L965.37 468.11L965.49 428.32L990.67 433.86Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1110.35 419.52L1052.63 458.37L1032.2 448.19L1089.93 409.33L1110.35 419.52Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1110.35 419.52L1110.24 459.31L1052.51 498.17L1052.63 458.37L1110.35 419.52Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1052.63 458.37L1052.51 498.17L1032.09 487.98L1032.2 448.19L1052.63 458.37Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M772.23 647.12L714.51 685.98L694.08 675.79L751.81 636.93L772.23 647.12Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M772.23 647.12L772.12 686.91L714.39 725.77L714.51 685.98L772.23 647.12Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M714.51 685.98L714.39 725.77L693.97 715.58L694.08 675.79L714.51 685.98Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M838.95 666.98L807.71 714.98L782.53 709.44L813.76 661.44L838.95 666.98Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M838.95 666.98L838.84 706.77L807.6 754.77L807.71 714.98L838.95 666.98Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M807.71 714.98L807.6 754.77L782.41 749.23L782.53 709.44L807.71 714.98Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1199.91 511.87L1204.29 527.26L1116.83 535.45L1112.45 520.06L1199.91 511.87Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1204.29 527.26L1204.18 567.05L1116.71 575.24L1116.83 535.45L1204.29 527.26Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1116.83 535.45L1116.71 575.24L1112.33 559.85L1112.45 520.06L1116.83 535.45Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1203.42 573.04L1198.45 588.35L1111.33 578.71L1116.29 563.4L1203.42 573.04Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1203.42 573.04L1203.31 612.83L1198.34 628.14L1198.45 588.35L1203.42 573.04Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1198.45 588.35L1198.34 628.14L1111.21 618.5L1111.33 578.71L1198.45 588.35Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1170.6 631.15L1156.88 644.54L1080.61 618.23L1094.32 604.85L1170.6 631.15Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1170.6 631.15L1170.49 670.94L1156.77 684.33L1156.88 644.54L1170.6 631.15Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1156.88 644.54L1156.77 684.33L1080.49 658.02L1080.61 618.23L1156.88 644.54Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1049.18 639.39L1105.41 679.19L1084.6 689.04L1028.37 649.24L1049.18 639.39Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1105.41 679.19L1105.29 718.98L1084.49 728.83L1084.6 689.04L1105.41 679.19Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1084.6 689.04L1084.49 728.83L1028.26 689.03L1028.37 649.24L1084.6 689.04Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M986.31 662.87L1015.71 711.37L990.32 716.49L960.92 667.99L986.31 662.87Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1015.71 711.37L1015.59 751.16L990.2 756.28L990.32 716.49L1015.71 711.37Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M990.32 716.49L990.2 756.28L960.81 707.78L960.92 667.99L990.32 716.49Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1013.1 546.16L1013.06 559.42C1013.11 542.59 1002 525.74 979.76 512.9C935.57 487.39 864.16 487.39 820.25 512.9C798.44 525.57 787.52 542.16 787.47 558.77L787.51 545.51C787.56 528.9 798.47 512.31 820.29 499.64C864.19 474.13 935.61 474.13 979.8 499.64C1002.04 512.48 1013.14 529.33 1013.1 546.16Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1022.65 474.74C1090.66 514 1091.01 577.66 1023.45 616.93C955.88 656.19 845.98 656.2 777.98 616.93C709.97 577.67 709.61 514.01 777.18 474.74C844.74 435.48 954.65 435.47 1022.65 474.74ZM820.82 592.03C865.01 617.54 936.42 617.54 980.33 592.03C1024.23 566.52 1024 525.15 979.81 499.64C935.62 474.13 864.21 474.13 820.3 499.64C776.4 525.15 776.63 566.52 820.82 592.03Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1073.89 546.33L1073.85 559.59C1073.78 585.16 1056.98 610.68 1023.41 630.19C955.84 669.45 845.94 669.46 777.94 630.19C743.72 610.43 726.63 584.5 726.7 558.6L726.74 545.34C726.67 571.24 743.76 597.17 777.98 616.93C845.99 656.19 955.89 656.19 1023.45 616.93C1057.01 597.42 1073.82 571.9 1073.89 546.33Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M953.35 489.09L953.24 528.88C953.22 536.72 948.06 544.55 937.77 550.53C917.05 562.57 883.34 562.57 862.48 550.53C851.99 544.47 846.74 536.52 846.77 528.58L846.88 488.79C846.86 496.73 852.1 504.68 862.59 510.74C883.45 522.78 917.16 522.78 937.88 510.74C948.17 504.76 953.33 496.93 953.35 489.09Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M937.63 467.14C958.49 479.18 958.6 498.71 937.88 510.75C917.16 522.79 883.45 522.79 862.59 510.75C841.73 498.71 841.63 479.18 862.35 467.14C883.07 455.1 916.78 455.1 937.63 467.14Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 827.53C1132.4 827.53 1320.57 705.769 1320.57 555.57C1320.57 405.371 1132.4 283.61 900.29 283.61C668.176 283.61 480.01 405.371 480.01 555.57C480.01 705.769 668.176 827.53 900.29 827.53Z" stroke="#C9CDD1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 935.63C1196.82 935.63 1437.2 788.35 1437.2 606.67C1437.2 424.99 1196.82 277.71 900.29 277.71C603.763 277.71 363.38 424.99 363.38 606.67C363.38 788.35 603.763 935.63 900.29 935.63Z" stroke="#C9CDD1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1157.37 397.29H1005.5" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1005.61 399.55C1006.86 399.55 1007.87 398.538 1007.87 397.29C1007.87 396.042 1006.86 395.03 1005.61 395.03C1004.36 395.03 1003.35 396.042 1003.35 397.29C1003.35 398.538 1004.36 399.55 1005.61 399.55Z" fill="#C9CDD1"/>
<path d="M1073.89 287.78L1073.85 301.04C1073.78 326.61 1056.98 352.13 1023.41 371.64C955.84 410.9 845.94 410.91 777.94 371.64C743.72 351.88 726.63 325.95 726.7 300.05L726.74 286.79C726.67 312.69 743.76 338.62 777.98 358.38C845.99 397.64 955.89 397.64 1023.45 358.38C1057.01 338.87 1073.82 313.35 1073.89 287.78Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1022.65 216.19C1090.66 255.45 1091.01 319.11 1023.45 358.38C955.88 397.64 845.98 397.65 777.98 358.38C709.97 319.12 709.61 255.46 777.18 216.19C844.74 176.93 954.65 176.92 1022.65 216.19Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1052.51 267.53L1052.48 279.16C1052.42 301.58 1037.68 323.96 1008.25 341.07C949 375.5 852.63 375.5 793 341.07C762.99 323.74 748 301 748.07 278.29L748.1 266.66C748.04 289.37 763.02 312.11 793.03 329.44C852.66 363.87 949.03 363.87 1008.28 329.44C1037.71 312.34 1052.45 289.95 1052.51 267.53Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1007.58 204.76C1067.21 239.19 1067.53 295.01 1008.28 329.44C949.03 363.87 852.66 363.87 793.03 329.44C733.4 295.01 733.08 239.19 792.33 204.76C851.57 170.33 947.95 170.33 1007.58 204.76Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 587.21V493.96" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M902.55 494.08C902.55 492.83 901.54 491.82 900.29 491.82C899.04 491.82 898.03 492.83 898.03 494.08C898.03 495.33 899.04 496.34 900.29 496.34C901.54 496.34 902.55 495.33 902.55 494.08Z" fill="#C9CDD1"/>
<path d="M1422.45 377.03H1154.83V417.56H1422.45V377.03Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M978.03 572H822.6V612.53H978.03V572Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 88.72V250.28" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M901.158 252.257C902.311 251.78 902.859 250.458 902.381 249.305C901.903 248.151 900.581 247.604 899.428 248.081C898.275 248.559 897.728 249.881 898.205 251.034C898.683 252.187 900.005 252.735 901.158 252.257Z" fill="#C9CDD1"/>
<path d="M1034.1 57H766.48V97.53H1034.1V57Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M859.507 85.4102L865.007 71.4102H866.927L872.427 85.4102H870.267L868.927 81.8502H863.007L861.667 85.4102H859.507ZM863.687 80.0302H868.247L865.967 74.0102L863.687 80.0302ZM880.481 85.5702C877.081 85.5702 873.901 83.1702 873.901 78.4102C873.901 73.6502 877.101 71.2502 880.761 71.2502C884.101 71.2502 886.581 73.1702 886.881 75.9502H884.641C884.341 74.2302 882.841 73.0902 880.741 73.0902C878.041 73.0902 876.021 75.0102 876.021 78.4102C876.021 81.8902 878.041 83.7302 880.761 83.7302C883.021 83.7302 884.821 82.4302 884.821 80.8102C884.821 80.1302 884.501 79.7702 883.861 79.7702H880.841V78.0902H884.501C885.921 78.0902 886.821 78.9702 886.821 80.4102V85.4102H884.921V83.4302C884.261 84.5702 882.641 85.5702 880.481 85.5702ZM890.524 85.4102V71.4102H899.504V73.2502H892.604V77.2702H898.184V79.1102H892.604V83.5702H899.724V85.4102H890.524ZM903.067 85.4102V71.4102H905.387L912.127 82.1902V71.4102H914.207V85.4102H911.907L905.147 74.6502V85.4102H903.067ZM921.403 85.4102V73.2502H917.023V71.4102H927.863V73.2502H923.483V85.4102H921.403ZM934.803 85.5702C931.483 85.5702 929.583 83.6702 929.423 80.7702H931.443C931.603 82.5702 932.663 83.7302 934.803 83.7302C936.563 83.7302 937.803 83.0502 937.803 81.5302C937.803 78.0302 929.843 80.3302 929.843 75.0702C929.843 72.7902 931.823 71.2502 934.643 71.2502C937.503 71.2502 939.463 72.9102 939.643 75.4702H937.623C937.483 74.0302 936.363 73.0902 934.643 73.0902C932.963 73.0902 931.943 73.8502 931.943 75.0502C931.943 78.5702 939.923 76.0302 939.923 81.5102C939.923 84.0702 937.803 85.5702 934.803 85.5702Z" fill="#C9CDD1"/>
<path d="M881.754 599.41V585.41H883.834V597.57H890.654V599.41H881.754ZM893.477 599.41V585.41H895.557V597.57H902.377V599.41H893.477ZM905.2 599.41V585.41H907.76L912.22 596.57L916.68 585.41H919.24V599.41H917.24V588.99L913.06 599.41H911.38L907.18 588.99V599.41H905.2Z" fill="#C9CDD1"/>
<path d="M1259.12 405.41V393.25H1254.74V391.41H1265.58V393.25H1261.2V405.41H1259.12ZM1273.88 405.57C1269.88 405.57 1266.92 402.53 1266.92 398.41C1266.92 394.29 1269.88 391.25 1273.88 391.25C1277.86 391.25 1280.82 394.29 1280.82 398.41C1280.82 402.53 1277.86 405.57 1273.88 405.57ZM1273.86 403.73C1276.66 403.73 1278.7 401.47 1278.7 398.41C1278.7 395.35 1276.66 393.09 1273.86 393.09C1271.08 393.09 1269.04 395.35 1269.04 398.41C1269.04 401.47 1271.08 403.73 1273.86 403.73ZM1290.47 405.57C1286.47 405.57 1283.51 402.53 1283.51 398.41C1283.51 394.29 1286.47 391.25 1290.47 391.25C1294.45 391.25 1297.41 394.29 1297.41 398.41C1297.41 402.53 1294.45 405.57 1290.47 405.57ZM1290.45 403.73C1293.25 403.73 1295.29 401.47 1295.29 398.41C1295.29 395.35 1293.25 393.09 1290.45 393.09C1287.67 393.09 1285.63 395.35 1285.63 398.41C1285.63 401.47 1287.67 403.73 1290.45 403.73ZM1300.86 405.41V391.41H1302.94V403.57H1309.76V405.41H1300.86ZM1316.59 405.57C1313.27 405.57 1311.37 403.67 1311.21 400.77H1313.23C1313.39 402.57 1314.45 403.73 1316.59 403.73C1318.35 403.73 1319.59 403.05 1319.59 401.53C1319.59 398.03 1311.63 400.33 1311.63 395.07C1311.63 392.79 1313.61 391.25 1316.43 391.25C1319.29 391.25 1321.25 392.91 1321.43 395.47H1319.41C1319.27 394.03 1318.15 393.09 1316.43 393.09C1314.75 393.09 1313.73 393.85 1313.73 395.05C1313.73 398.57 1321.71 396.03 1321.71 401.51C1321.71 404.07 1319.59 405.57 1316.59 405.57Z" fill="#C9CDD1"/>
<path d="M1404.03 608.41V594.41H1406.59L1411.05 605.57L1415.51 594.41H1418.07V608.41H1416.07V597.99L1411.89 608.41H1410.21L1406.01 597.99V608.41H1404.03ZM1422.28 608.41V594.41H1431.26V596.25H1424.36V600.27H1429.94V602.11H1424.36V606.57H1431.48V608.41H1422.28ZM1434.82 608.41V594.41H1437.38L1441.84 605.57L1446.3 594.41H1448.86V608.41H1446.86V597.99L1442.68 608.41H1441L1436.8 597.99V608.41H1434.82ZM1459.27 608.57C1455.27 608.57 1452.31 605.53 1452.31 601.41C1452.31 597.29 1455.27 594.25 1459.27 594.25C1463.25 594.25 1466.21 597.29 1466.21 601.41C1466.21 605.53 1463.25 608.57 1459.27 608.57ZM1459.25 606.73C1462.05 606.73 1464.09 604.47 1464.09 601.41C1464.09 598.35 1462.05 596.09 1459.25 596.09C1456.47 596.09 1454.43 598.35 1454.43 601.41C1454.43 604.47 1456.47 606.73 1459.25 606.73ZM1469.65 608.41V594.41H1475.13C1477.95 594.41 1479.67 595.89 1479.67 598.29C1479.67 599.99 1478.85 601.11 1477.59 601.75C1478.63 602.35 1479.27 603.47 1479.37 604.83L1479.65 608.41H1477.59L1477.31 605.01C1477.23 603.77 1476.43 602.89 1475.23 602.89H1471.73V608.41H1469.65ZM1475.07 601.05C1476.89 601.05 1477.59 599.87 1477.59 598.61C1477.59 597.33 1476.89 596.21 1475.07 596.21H1471.73V601.05H1475.07ZM1486.36 608.41V602.57L1481.46 594.41H1483.76L1487.4 600.59L1491.04 594.41H1493.34L1488.44 602.57V608.41H1486.36Z" fill="#C9CDD1"/>
<path d="M1475.61 644.406H1388.41V731.603H1475.61V644.406Z" fill="#C9CDD1"/>
<path d="M1562.79 529.403V470H1301.2V529.403C1301.2 544.76 1288.76 557.198 1273.4 557.198H1214V818.802H1273.4C1288.76 818.802 1301.2 831.24 1301.2 846.597V906H1562.8V846.597C1562.8 831.24 1575.24 818.802 1590.6 818.802H1650V557.198H1590.6C1575.24 557.198 1562.8 544.76 1562.8 529.403H1562.79ZM1562.79 790.996C1562.79 806.353 1550.35 818.79 1535 818.79H1328.99C1313.64 818.79 1301.2 806.353 1301.2 790.996V584.992C1301.2 569.635 1313.64 557.198 1328.99 557.198H1535C1550.35 557.198 1562.79 569.635 1562.79 584.992V790.996Z" fill="#C9CDD1"/>
<path d="M1314.02 602.22H1175.1" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1175.21 604.48C1176.46 604.48 1177.47 603.468 1177.47 602.22C1177.47 600.972 1176.46 599.96 1175.21 599.96C1173.96 599.96 1172.95 600.972 1172.95 602.22C1172.95 603.468 1173.96 604.48 1175.21 604.48Z" fill="#C9CDD1"/>
<path d="M485.98 602.22H630.47" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M630.36 604.47C631.61 604.47 632.62 603.46 632.62 602.21C632.62 600.96 631.61 599.95 630.36 599.95C629.11 599.95 628.1 600.96 628.1 602.21C628.1 603.46 629.11 604.47 630.36 604.47Z" fill="#C9CDD1"/>
<path d="M485.98 581.95H218.36V622.48H485.98V581.95Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1581.64 580.33H1314.02V620.86H1581.64V580.33Z" stroke="#C9CDD1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M257.811 610.41V596.41H263.231C266.111 596.41 267.811 598.15 267.811 600.63C267.811 603.11 266.111 604.85 263.231 604.85H259.891V610.41H257.811ZM263.171 603.05C264.971 603.05 265.671 601.91 265.671 600.63C265.671 599.35 264.971 598.21 263.171 598.21H259.891V603.05H263.171ZM270.862 610.41V596.41H279.842V598.25H272.942V602.27H278.522V604.11H272.942V608.57H280.062V610.41H270.862ZM283.405 610.41V596.41H288.885C291.705 596.41 293.425 597.89 293.425 600.29C293.425 601.99 292.605 603.11 291.345 603.75C292.385 604.35 293.025 605.47 293.125 606.83L293.405 610.41H291.345L291.065 607.01C290.985 605.77 290.185 604.89 288.985 604.89H285.485V610.41H283.405ZM288.825 603.05C290.645 603.05 291.345 601.87 291.345 600.61C291.345 599.33 290.645 598.21 288.825 598.21H285.485V603.05H288.825ZM301.699 610.57C298.379 610.57 296.479 608.67 296.319 605.77H298.339C298.499 607.57 299.559 608.73 301.699 608.73C303.459 608.73 304.699 608.05 304.699 606.53C304.699 603.03 296.739 605.33 296.739 600.07C296.739 597.79 298.719 596.25 301.539 596.25C304.399 596.25 306.359 597.91 306.539 600.47H304.519C304.379 599.03 303.259 598.09 301.539 598.09C299.859 598.09 298.839 598.85 298.839 600.05C298.839 603.57 306.819 601.03 306.819 606.51C306.819 609.07 304.699 610.57 301.699 610.57ZM316.39 610.57C312.39 610.57 309.43 607.53 309.43 603.41C309.43 599.29 312.39 596.25 316.39 596.25C320.37 596.25 323.33 599.29 323.33 603.41C323.33 607.53 320.37 610.57 316.39 610.57ZM316.37 608.73C319.17 608.73 321.21 606.47 321.21 603.41C321.21 600.35 319.17 598.09 316.37 598.09C313.59 598.09 311.55 600.35 311.55 603.41C311.55 606.47 313.59 608.73 316.37 608.73ZM326.776 610.41V596.41H329.096L335.836 607.19V596.41H337.916V610.41H335.616L328.856 599.65V610.41H326.776ZM340.712 610.41L346.212 596.41H348.132L353.632 610.41H351.472L350.132 606.85H344.212L342.872 610.41H340.712ZM344.892 605.03H349.452L347.172 599.01L344.892 605.03ZM356.432 610.41V596.41H358.512V608.57H365.332V610.41H356.432ZM368.155 610.41V596.41H370.235V610.41H368.155ZM373.388 610.41V608.59L381.628 598.23H373.808V596.41H383.988V598.23L375.748 608.59H383.988V610.41H373.388ZM385.923 610.41L391.423 596.41H393.343L398.843 610.41H396.683L395.343 606.85H389.423L388.083 610.41H385.923ZM390.103 605.03H394.663L392.383 599.01L390.103 605.03ZM402.905 610.41V598.25H398.525V596.41H409.365V598.25H404.985V610.41H402.905ZM412.194 610.41V596.41H414.274V610.41H412.194ZM424.667 610.57C420.667 610.57 417.707 607.53 417.707 603.41C417.707 599.29 420.667 596.25 424.667 596.25C428.647 596.25 431.607 599.29 431.607 603.41C431.607 607.53 428.647 610.57 424.667 610.57ZM424.647 608.73C427.447 608.73 429.487 606.47 429.487 603.41C429.487 600.35 427.447 598.09 424.647 598.09C421.867 598.09 419.827 600.35 419.827 603.41C419.827 606.47 421.867 608.73 424.647 608.73ZM435.053 610.41V596.41H437.373L444.113 607.19V596.41H446.193V610.41H443.893L437.133 599.65V610.41H435.053Z" fill="#C9CDD1"/>
<path d="M1404.03 608.41V594.41H1406.59L1411.05 605.57L1415.51 594.41H1418.07V608.41H1416.07V597.99L1411.89 608.41H1410.21L1406.01 597.99V608.41H1404.03ZM1422.28 608.41V594.41H1431.26V596.25H1424.36V600.27H1429.94V602.11H1424.36V606.57H1431.48V608.41H1422.28ZM1434.82 608.41V594.41H1437.38L1441.84 605.57L1446.3 594.41H1448.86V608.41H1446.86V597.99L1442.68 608.41H1441L1436.8 597.99V608.41H1434.82ZM1459.27 608.57C1455.27 608.57 1452.31 605.53 1452.31 601.41C1452.31 597.29 1455.27 594.25 1459.27 594.25C1463.25 594.25 1466.21 597.29 1466.21 601.41C1466.21 605.53 1463.25 608.57 1459.27 608.57ZM1459.25 606.73C1462.05 606.73 1464.09 604.47 1464.09 601.41C1464.09 598.35 1462.05 596.09 1459.25 596.09C1456.47 596.09 1454.43 598.35 1454.43 601.41C1454.43 604.47 1456.47 606.73 1459.25 606.73ZM1469.65 608.41V594.41H1475.13C1477.95 594.41 1479.67 595.89 1479.67 598.29C1479.67 599.99 1478.85 601.11 1477.59 601.75C1478.63 602.35 1479.27 603.47 1479.37 604.83L1479.65 608.41H1477.59L1477.31 605.01C1477.23 603.77 1476.43 602.89 1475.23 602.89H1471.73V608.41H1469.65ZM1475.07 601.05C1476.89 601.05 1477.59 599.87 1477.59 598.61C1477.59 597.33 1476.89 596.21 1475.07 596.21H1471.73V601.05H1475.07ZM1486.36 608.41V602.57L1481.46 594.41H1483.76L1487.4 600.59L1491.04 594.41H1493.34L1488.44 602.57V608.41H1486.36Z" fill="#C9CDD1"/>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -0,0 +1,87 @@
<svg width="1666" height="1031" viewBox="0 0 1666 1031" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M900.29 1029.82C1249.26 1029.82 1532.16 859.523 1532.16 649.45C1532.16 439.377 1249.26 269.08 900.29 269.08C551.318 269.08 268.42 439.377 268.42 649.45C268.42 859.523 551.318 1029.82 900.29 1029.82Z" stroke="#202020" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 1013.79C1132.4 1013.79 1320.57 902.488 1320.57 765.19C1320.57 627.892 1132.4 516.59 900.29 516.59C668.176 516.59 480.01 627.892 480.01 765.19C480.01 902.488 668.176 1013.79 900.29 1013.79Z" stroke="#202020" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 581C1022.8 581 1122.11 516.735 1122.11 437.46C1122.11 358.185 1022.8 293.92 900.29 293.92C777.782 293.92 678.47 358.185 678.47 437.46C678.47 516.735 777.782 581 900.29 581Z" stroke="#202020" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 997.63C1022.8 997.63 1122.11 936.781 1122.11 861.72C1122.11 786.659 1022.8 725.81 900.29 725.81C777.782 725.81 678.47 786.659 678.47 861.72C678.47 936.781 777.782 997.63 900.29 997.63Z" stroke="#202020" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1239.23 579L1239.19 592.26C1239.33 541.7 1205.96 491.05 1139.14 452.48C1006.35 375.82 791.76 375.82 659.83 452.48C594.29 490.57 561.48 540.41 561.34 590.33L561.38 577.07C561.52 527.15 594.33 477.31 659.87 439.22C791.8 362.55 1006.4 362.55 1139.18 439.22C1206 477.8 1239.37 528.44 1239.23 579Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1156.36 429.23C1298.7 511.41 1299.44 644.65 1158.03 726.83C1016.62 809.01 786.59 809.01 644.26 726.83C501.92 644.65 501.17 511.41 642.58 429.23C783.99 347.05 1014.02 347.05 1156.36 429.23ZM661.43 716.85C794.22 793.51 1008.81 793.51 1140.74 716.85C1272.67 640.18 1271.97 515.88 1139.18 439.21C1006.39 362.55 791.8 362.55 659.87 439.21C527.94 515.88 528.64 640.18 661.43 716.85Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1263.6 579.07L1263.56 592.33C1263.41 645.84 1228.24 699.27 1157.99 740.09C1016.58 822.27 786.55 822.27 644.22 740.09C572.59 698.74 536.82 644.45 536.97 590.25L537.01 576.99C536.86 631.19 572.63 685.47 644.26 726.83C786.6 809.01 1016.62 809.01 1158.03 726.83C1228.28 686 1263.45 632.57 1263.6 579.07Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M919.03 371.73L918.05 423.08L891.14 422.85L892.12 371.51L919.03 371.73Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M919.03 371.73L918.91 411.52L917.94 462.87L918.05 423.08L919.03 371.73Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M918.05 423.08L917.94 462.87L891.03 462.64L891.14 422.85L918.05 423.08Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M814.12 378.81L843.52 427.31L818.13 432.43L788.729 383.94L814.12 378.81Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M843.52 427.31L843.4 467.11L818.02 472.23L818.13 432.43L843.52 427.31Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M818.13 432.43L818.02 472.23L788.62 423.73L788.73 383.94L818.13 432.43Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M719.84 406.26L776.06 446.07L755.26 455.91L699.03 416.11L719.84 406.26Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M776.06 446.07L775.95 485.86L755.15 495.7L755.26 455.91L776.06 446.07Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M755.26 455.91L755.15 495.7L698.92 455.9L699.03 416.11L755.26 455.91Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M693.109 516.59L688.14 531.9L601.02 522.26L605.979 506.95L693.109 516.59Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M693.11 516.59L693 556.38L688.03 571.69L688.14 531.9L693.11 516.59Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M688.14 531.9L688.03 571.69L600.91 562.05L601.02 522.26L688.14 531.9Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M687.61 559.86L691.99 575.24L604.53 583.44L600.15 568.05L687.61 559.86Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M691.99 575.24L691.88 615.03L604.41 623.23L604.53 583.44L691.99 575.24Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M604.53 583.44L604.41 623.23L600.03 607.84L600.15 568.05L604.53 583.44Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M708 601.65L721.2 615.26L643.94 640.29L630.74 626.69L708 601.65Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M721.2 615.26L721.08 655.05L643.83 680.09L643.94 640.29L721.2 615.26Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M643.94 640.29L643.83 680.09L630.63 666.48L630.74 626.69L643.94 640.29Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1021.91 385.87L990.67 433.86L965.49 428.32L996.72 380.33L1021.91 385.87Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1021.91 385.87L1021.8 425.66L990.56 473.65L990.67 433.86L1021.91 385.87Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M990.67 433.86L990.56 473.65L965.37 468.11L965.49 428.32L990.67 433.86Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1110.35 419.52L1052.63 458.37L1032.2 448.19L1089.93 409.33L1110.35 419.52Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1110.35 419.52L1110.24 459.31L1052.51 498.17L1052.63 458.37L1110.35 419.52Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1052.63 458.37L1052.51 498.17L1032.09 487.98L1032.2 448.19L1052.63 458.37Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M772.23 647.12L714.51 685.98L694.08 675.79L751.81 636.93L772.23 647.12Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M772.23 647.12L772.12 686.91L714.39 725.77L714.51 685.98L772.23 647.12Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M714.51 685.98L714.39 725.77L693.97 715.58L694.08 675.79L714.51 685.98Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M838.95 666.98L807.71 714.98L782.53 709.44L813.76 661.44L838.95 666.98Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M838.95 666.98L838.84 706.77L807.6 754.77L807.71 714.98L838.95 666.98Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M807.71 714.98L807.6 754.77L782.41 749.23L782.53 709.44L807.71 714.98Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1199.91 511.87L1204.29 527.26L1116.83 535.45L1112.45 520.06L1199.91 511.87Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1204.29 527.26L1204.18 567.05L1116.71 575.24L1116.83 535.45L1204.29 527.26Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1116.83 535.45L1116.71 575.24L1112.33 559.85L1112.45 520.06L1116.83 535.45Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1203.42 573.04L1198.45 588.35L1111.33 578.71L1116.29 563.4L1203.42 573.04Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1203.42 573.04L1203.31 612.83L1198.34 628.14L1198.45 588.35L1203.42 573.04Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1198.45 588.35L1198.34 628.14L1111.21 618.5L1111.33 578.71L1198.45 588.35Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1170.6 631.15L1156.88 644.54L1080.61 618.23L1094.32 604.85L1170.6 631.15Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1170.6 631.15L1170.49 670.94L1156.77 684.33L1156.88 644.54L1170.6 631.15Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1156.88 644.54L1156.77 684.33L1080.49 658.02L1080.61 618.23L1156.88 644.54Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1049.18 639.39L1105.41 679.19L1084.6 689.04L1028.37 649.24L1049.18 639.39Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1105.41 679.19L1105.29 718.98L1084.49 728.83L1084.6 689.04L1105.41 679.19Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1084.6 689.04L1084.49 728.83L1028.26 689.03L1028.37 649.24L1084.6 689.04Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M986.31 662.87L1015.71 711.37L990.319 716.49L960.919 667.99L986.31 662.87Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1015.71 711.37L1015.59 751.16L990.2 756.28L990.32 716.49L1015.71 711.37Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M990.32 716.49L990.2 756.28L960.81 707.78L960.92 667.99L990.32 716.49Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1013.1 546.16L1013.06 559.42C1013.11 542.59 1002 525.74 979.76 512.9C935.57 487.39 864.16 487.39 820.25 512.9C798.44 525.57 787.52 542.16 787.47 558.77L787.51 545.51C787.56 528.9 798.47 512.31 820.29 499.64C864.19 474.13 935.61 474.13 979.8 499.64C1002.04 512.48 1013.14 529.33 1013.1 546.16Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1022.65 474.74C1090.66 514 1091.01 577.66 1023.45 616.93C955.88 656.19 845.98 656.2 777.98 616.93C709.97 577.67 709.61 514.01 777.18 474.74C844.74 435.48 954.65 435.47 1022.65 474.74ZM820.82 592.03C865.01 617.54 936.42 617.54 980.33 592.03C1024.23 566.52 1024 525.15 979.81 499.64C935.62 474.13 864.21 474.13 820.3 499.64C776.4 525.15 776.63 566.52 820.82 592.03Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1073.89 546.33L1073.85 559.59C1073.78 585.16 1056.98 610.68 1023.41 630.19C955.84 669.45 845.94 669.46 777.94 630.19C743.72 610.43 726.63 584.5 726.7 558.6L726.74 545.34C726.67 571.24 743.76 597.17 777.98 616.93C845.99 656.19 955.89 656.19 1023.45 616.93C1057.01 597.42 1073.82 571.9 1073.89 546.33Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M953.35 489.09L953.24 528.88C953.22 536.72 948.06 544.55 937.77 550.53C917.05 562.57 883.34 562.57 862.48 550.53C851.99 544.47 846.74 536.52 846.77 528.58L846.88 488.79C846.86 496.73 852.1 504.68 862.59 510.74C883.45 522.78 917.16 522.78 937.88 510.74C948.17 504.76 953.33 496.93 953.35 489.09Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M937.63 467.14C958.49 479.18 958.6 498.71 937.88 510.75C917.16 522.79 883.45 522.79 862.59 510.75C841.73 498.71 841.63 479.18 862.35 467.14C883.07 455.1 916.78 455.1 937.63 467.14Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 827.53C1132.4 827.53 1320.57 705.769 1320.57 555.57C1320.57 405.371 1132.4 283.61 900.29 283.61C668.176 283.61 480.01 405.371 480.01 555.57C480.01 705.769 668.176 827.53 900.29 827.53Z" stroke="#202020" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 935.63C1196.82 935.63 1437.2 788.35 1437.2 606.67C1437.2 424.99 1196.82 277.71 900.29 277.71C603.763 277.71 363.38 424.99 363.38 606.67C363.38 788.35 603.763 935.63 900.29 935.63Z" stroke="#202020" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1157.37 397.29H1005.5" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1005.61 399.55C1006.86 399.55 1007.87 398.538 1007.87 397.29C1007.87 396.042 1006.86 395.03 1005.61 395.03C1004.36 395.03 1003.35 396.042 1003.35 397.29C1003.35 398.538 1004.36 399.55 1005.61 399.55Z" fill="#202020"/>
<path d="M1073.89 287.78L1073.85 301.04C1073.78 326.61 1056.98 352.13 1023.41 371.64C955.84 410.9 845.94 410.91 777.94 371.64C743.72 351.88 726.63 325.95 726.7 300.05L726.74 286.79C726.67 312.69 743.76 338.62 777.98 358.38C845.99 397.64 955.89 397.64 1023.45 358.38C1057.01 338.87 1073.82 313.35 1073.89 287.78Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1022.65 216.19C1090.66 255.45 1091.01 319.11 1023.45 358.38C955.88 397.64 845.98 397.65 777.98 358.38C709.97 319.12 709.61 255.46 777.18 216.19C844.74 176.93 954.65 176.92 1022.65 216.19Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1052.51 267.53L1052.48 279.16C1052.42 301.58 1037.68 323.96 1008.25 341.07C949 375.5 852.63 375.5 793 341.07C762.99 323.74 748 301 748.07 278.29L748.1 266.66C748.04 289.37 763.02 312.11 793.03 329.44C852.66 363.87 949.03 363.87 1008.28 329.44C1037.71 312.34 1052.45 289.95 1052.51 267.53Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1007.58 204.76C1067.21 239.19 1067.53 295.01 1008.28 329.44C949.03 363.87 852.66 363.87 793.03 329.44C733.4 295.01 733.08 239.19 792.33 204.76C851.57 170.33 947.95 170.33 1007.58 204.76Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 587.21V493.96" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M902.55 494.08C902.55 492.83 901.54 491.82 900.29 491.82C899.04 491.82 898.03 492.83 898.03 494.08C898.03 495.33 899.04 496.34 900.29 496.34C901.54 496.34 902.55 495.33 902.55 494.08Z" fill="#202020"/>
<path d="M1422.45 377.03H1154.83V417.56H1422.45V377.03Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M978.03 572H822.6V612.53H978.03V572Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M900.29 88.72V250.28" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M901.158 252.257C902.311 251.78 902.859 250.458 902.381 249.305C901.903 248.151 900.581 247.604 899.428 248.081C898.275 248.559 897.728 249.881 898.205 251.034C898.683 252.187 900.005 252.735 901.158 252.257Z" fill="#202020"/>
<path d="M1034.1 57H766.48V97.53H1034.1V57Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M859.507 85.4102L865.007 71.4102H866.927L872.427 85.4102H870.267L868.927 81.8502H863.007L861.667 85.4102H859.507ZM863.687 80.0302H868.247L865.967 74.0102L863.687 80.0302ZM880.481 85.5702C877.081 85.5702 873.901 83.1702 873.901 78.4102C873.901 73.6502 877.101 71.2502 880.761 71.2502C884.101 71.2502 886.581 73.1702 886.881 75.9502H884.641C884.341 74.2302 882.841 73.0902 880.741 73.0902C878.041 73.0902 876.021 75.0102 876.021 78.4102C876.021 81.8902 878.041 83.7302 880.761 83.7302C883.021 83.7302 884.821 82.4302 884.821 80.8102C884.821 80.1302 884.501 79.7702 883.861 79.7702H880.841V78.0902H884.501C885.921 78.0902 886.821 78.9702 886.821 80.4102V85.4102H884.921V83.4302C884.261 84.5702 882.641 85.5702 880.481 85.5702ZM890.524 85.4102V71.4102H899.504V73.2502H892.604V77.2702H898.184V79.1102H892.604V83.5702H899.724V85.4102H890.524ZM903.067 85.4102V71.4102H905.387L912.127 82.1902V71.4102H914.207V85.4102H911.907L905.147 74.6502V85.4102H903.067ZM921.403 85.4102V73.2502H917.023V71.4102H927.863V73.2502H923.483V85.4102H921.403ZM934.803 85.5702C931.483 85.5702 929.583 83.6702 929.423 80.7702H931.443C931.603 82.5702 932.663 83.7302 934.803 83.7302C936.563 83.7302 937.803 83.0502 937.803 81.5302C937.803 78.0302 929.843 80.3302 929.843 75.0702C929.843 72.7902 931.823 71.2502 934.643 71.2502C937.503 71.2502 939.463 72.9102 939.643 75.4702H937.623C937.483 74.0302 936.363 73.0902 934.643 73.0902C932.963 73.0902 931.943 73.8502 931.943 75.0502C931.943 78.5702 939.923 76.0302 939.923 81.5102C939.923 84.0702 937.803 85.5702 934.803 85.5702Z" fill="#202020"/>
<path d="M881.754 599.41V585.41H883.834V597.57H890.654V599.41H881.754ZM893.477 599.41V585.41H895.557V597.57H902.377V599.41H893.477ZM905.2 599.41V585.41H907.76L912.22 596.57L916.68 585.41H919.24V599.41H917.24V588.99L913.06 599.41H911.38L907.18 588.99V599.41H905.2Z" fill="#202020"/>
<path d="M1259.12 405.41V393.25H1254.74V391.41H1265.58V393.25H1261.2V405.41H1259.12ZM1273.88 405.57C1269.88 405.57 1266.92 402.53 1266.92 398.41C1266.92 394.29 1269.88 391.25 1273.88 391.25C1277.86 391.25 1280.82 394.29 1280.82 398.41C1280.82 402.53 1277.86 405.57 1273.88 405.57ZM1273.86 403.73C1276.66 403.73 1278.7 401.47 1278.7 398.41C1278.7 395.35 1276.66 393.09 1273.86 393.09C1271.08 393.09 1269.04 395.35 1269.04 398.41C1269.04 401.47 1271.08 403.73 1273.86 403.73ZM1290.47 405.57C1286.47 405.57 1283.51 402.53 1283.51 398.41C1283.51 394.29 1286.47 391.25 1290.47 391.25C1294.45 391.25 1297.41 394.29 1297.41 398.41C1297.41 402.53 1294.45 405.57 1290.47 405.57ZM1290.45 403.73C1293.25 403.73 1295.29 401.47 1295.29 398.41C1295.29 395.35 1293.25 393.09 1290.45 393.09C1287.67 393.09 1285.63 395.35 1285.63 398.41C1285.63 401.47 1287.67 403.73 1290.45 403.73ZM1300.86 405.41V391.41H1302.94V403.57H1309.76V405.41H1300.86ZM1316.59 405.57C1313.27 405.57 1311.37 403.67 1311.21 400.77H1313.23C1313.39 402.57 1314.45 403.73 1316.59 403.73C1318.35 403.73 1319.59 403.05 1319.59 401.53C1319.59 398.03 1311.63 400.33 1311.63 395.07C1311.63 392.79 1313.61 391.25 1316.43 391.25C1319.29 391.25 1321.25 392.91 1321.43 395.47H1319.41C1319.27 394.03 1318.15 393.09 1316.43 393.09C1314.75 393.09 1313.73 393.85 1313.73 395.05C1313.73 398.57 1321.71 396.03 1321.71 401.51C1321.71 404.07 1319.59 405.57 1316.59 405.57Z" fill="#202020"/>
<path d="M1475.61 644.406H1388.41V731.603H1475.61V644.406Z" fill="#202020"/>
<path d="M1562.79 529.403V470H1301.2V529.403C1301.2 544.76 1288.76 557.198 1273.4 557.198H1214V818.802H1273.4C1288.76 818.802 1301.2 831.24 1301.2 846.597V906H1562.8V846.597C1562.8 831.24 1575.24 818.802 1590.6 818.802H1650V557.198H1590.6C1575.24 557.198 1562.8 544.76 1562.8 529.403H1562.79ZM1562.79 790.996C1562.79 806.353 1550.35 818.79 1535 818.79H1328.99C1313.64 818.79 1301.2 806.353 1301.2 790.996V584.992C1301.2 569.635 1313.64 557.198 1328.99 557.198H1535C1550.35 557.198 1562.79 569.635 1562.79 584.992V790.996Z" fill="#202020"/>
<path d="M1314.02 602.22H1175.1" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1175.21 604.48C1176.46 604.48 1177.47 603.468 1177.47 602.22C1177.47 600.972 1176.46 599.96 1175.21 599.96C1173.96 599.96 1172.95 600.972 1172.95 602.22C1172.95 603.468 1173.96 604.48 1175.21 604.48Z" fill="#202020"/>
<path d="M485.98 602.22H630.47" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M630.36 604.47C631.61 604.47 632.62 603.46 632.62 602.21C632.62 600.96 631.61 599.95 630.36 599.95C629.11 599.95 628.1 600.96 628.1 602.21C628.1 603.46 629.11 604.47 630.36 604.47Z" fill="#202020"/>
<path d="M485.98 581.95H218.36V622.48H485.98V581.95Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1581.64 580.33H1314.02V620.86H1581.64V580.33Z" stroke="#202020" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M257.811 610.41V596.41H263.231C266.111 596.41 267.811 598.15 267.811 600.63C267.811 603.11 266.111 604.85 263.231 604.85H259.891V610.41H257.811ZM263.171 603.05C264.971 603.05 265.671 601.91 265.671 600.63C265.671 599.35 264.971 598.21 263.171 598.21H259.891V603.05H263.171ZM270.862 610.41V596.41H279.842V598.25H272.942V602.27H278.522V604.11H272.942V608.57H280.062V610.41H270.862ZM283.405 610.41V596.41H288.885C291.705 596.41 293.425 597.89 293.425 600.29C293.425 601.99 292.605 603.11 291.345 603.75C292.385 604.35 293.025 605.47 293.125 606.83L293.405 610.41H291.345L291.065 607.01C290.985 605.77 290.185 604.89 288.985 604.89H285.485V610.41H283.405ZM288.825 603.05C290.645 603.05 291.345 601.87 291.345 600.61C291.345 599.33 290.645 598.21 288.825 598.21H285.485V603.05H288.825ZM301.699 610.57C298.379 610.57 296.479 608.67 296.319 605.77H298.339C298.499 607.57 299.559 608.73 301.699 608.73C303.459 608.73 304.699 608.05 304.699 606.53C304.699 603.03 296.739 605.33 296.739 600.07C296.739 597.79 298.719 596.25 301.539 596.25C304.399 596.25 306.359 597.91 306.539 600.47H304.519C304.379 599.03 303.259 598.09 301.539 598.09C299.859 598.09 298.839 598.85 298.839 600.05C298.839 603.57 306.819 601.03 306.819 606.51C306.819 609.07 304.699 610.57 301.699 610.57ZM316.39 610.57C312.39 610.57 309.43 607.53 309.43 603.41C309.43 599.29 312.39 596.25 316.39 596.25C320.37 596.25 323.33 599.29 323.33 603.41C323.33 607.53 320.37 610.57 316.39 610.57ZM316.37 608.73C319.17 608.73 321.21 606.47 321.21 603.41C321.21 600.35 319.17 598.09 316.37 598.09C313.59 598.09 311.55 600.35 311.55 603.41C311.55 606.47 313.59 608.73 316.37 608.73ZM326.776 610.41V596.41H329.096L335.836 607.19V596.41H337.916V610.41H335.616L328.856 599.65V610.41H326.776ZM340.712 610.41L346.212 596.41H348.132L353.632 610.41H351.472L350.132 606.85H344.212L342.872 610.41H340.712ZM344.892 605.03H349.452L347.172 599.01L344.892 605.03ZM356.432 610.41V596.41H358.512V608.57H365.332V610.41H356.432ZM368.155 610.41V596.41H370.235V610.41H368.155ZM373.388 610.41V608.59L381.628 598.23H373.808V596.41H383.988V598.23L375.748 608.59H383.988V610.41H373.388ZM385.923 610.41L391.423 596.41H393.343L398.843 610.41H396.683L395.343 606.85H389.423L388.083 610.41H385.923ZM390.103 605.03H394.663L392.383 599.01L390.103 605.03ZM402.905 610.41V598.25H398.525V596.41H409.365V598.25H404.985V610.41H402.905ZM412.194 610.41V596.41H414.274V610.41H412.194ZM424.667 610.57C420.667 610.57 417.707 607.53 417.707 603.41C417.707 599.29 420.667 596.25 424.667 596.25C428.647 596.25 431.607 599.29 431.607 603.41C431.607 607.53 428.647 610.57 424.667 610.57ZM424.647 608.73C427.447 608.73 429.487 606.47 429.487 603.41C429.487 600.35 427.447 598.09 424.647 598.09C421.867 598.09 419.827 600.35 419.827 603.41C419.827 606.47 421.867 608.73 424.647 608.73ZM435.053 610.41V596.41H437.373L444.113 607.19V596.41H446.193V610.41H443.893L437.133 599.65V610.41H435.053Z" fill="#202020"/>
<path d="M1404.03 608.41V594.41H1406.59L1411.05 605.57L1415.51 594.41H1418.07V608.41H1416.07V597.99L1411.89 608.41H1410.21L1406.01 597.99V608.41H1404.03ZM1422.28 608.41V594.41H1431.26V596.25H1424.36V600.27H1429.94V602.11H1424.36V606.57H1431.48V608.41H1422.28ZM1434.82 608.41V594.41H1437.38L1441.84 605.57L1446.3 594.41H1448.86V608.41H1446.86V597.99L1442.68 608.41H1441L1436.8 597.99V608.41H1434.82ZM1459.27 608.57C1455.27 608.57 1452.31 605.53 1452.31 601.41C1452.31 597.29 1455.27 594.25 1459.27 594.25C1463.25 594.25 1466.21 597.29 1466.21 601.41C1466.21 605.53 1463.25 608.57 1459.27 608.57ZM1459.25 606.73C1462.05 606.73 1464.09 604.47 1464.09 601.41C1464.09 598.35 1462.05 596.09 1459.25 596.09C1456.47 596.09 1454.43 598.35 1454.43 601.41C1454.43 604.47 1456.47 606.73 1459.25 606.73ZM1469.65 608.41V594.41H1475.13C1477.95 594.41 1479.67 595.89 1479.67 598.29C1479.67 599.99 1478.85 601.11 1477.59 601.75C1478.63 602.35 1479.27 603.47 1479.37 604.83L1479.65 608.41H1477.59L1477.31 605.01C1477.23 603.77 1476.43 602.89 1475.23 602.89H1471.73V608.41H1469.65ZM1475.07 601.05C1476.89 601.05 1477.59 599.87 1477.59 598.61C1477.59 597.33 1476.89 596.21 1475.07 596.21H1471.73V601.05H1475.07ZM1486.36 608.41V602.57L1481.46 594.41H1483.76L1487.4 600.59L1491.04 594.41H1493.34L1488.44 602.57V608.41H1486.36Z" fill="#202020"/>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

BIN
fern/images/hero_dark.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

BIN
fern/images/hero_light.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Some files were not shown because too many files have changed in this diff Show More