PageSourceSearch

https://query.farm/vgi/docs/

html query.farm collected 2026-09-25 21:22:42 UTC 55,340 bytes, 692 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en" dir="ltr" data-theme="dark" data-has-sidebar class="astro-vdxcvpsm">
3	<head>
4		<meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>VGI Documentation</title><link rel="canonical" href="https://query.farm/vgi/docs/"/><link rel="sitemap" href="/sitemap-index.xml"/>
4<script>
5            if (!/^(localhost|127\.0\.0\.1|\[::1\])$/.test(location.hostname)) {
6              window.dataLayer = window.dataLayer || [];
7              window.gtag = function gtag(){ dataLayer.push(arguments); };
8              gtag('js', new Date());
9              gtag('config', 'G-EZ01WJETLF');
10
11              var gaTag = document.createElement('script');
12              gaTag.async = true;
13              gaTag.src = 'https://www.googletagmanager.com/gtag/js?id=G-EZ01WJETLF';
14              document.head.appendChild(gaTag);
15            }
16          </script>
16<link rel="icon" href="/favicon.ico" sizes="32x32"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v7.2.9"/><meta name="generator" content="Starlight v0.41.1"/><meta property="og:title" content="VGI Documentation"/><meta property="og:type" content="article"/><meta property="og:url" content="https://query.farm/vgi/docs/"/><meta property="og:locale" content="en"/><meta property="og:description" content="Extend DuckDB with out-of-process functions written in Python, Go, TypeScript, Rust, Java, or C#. Start with the shared Concepts, then pick your SDK."/><meta property="og:site_name" content="VGI Documentation"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="Extend DuckDB with out-of-process functions written in Python, Go, TypeScript, Rust, Java, or C#. Start with the shared Concepts, then pick your SDK."/><meta property="og:image" content="https://query.farm/og/vgi-docs/concepts.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:image" content="https://query.farm/og/vgi-docs/concepts.png"/>
17		
18		
18<script>
19  // Seed a light default for first-time visitors, before Starlight's provider
20  // reads storage. An existing choice (including 'auto') is never overwritten.
21  (() => {
22    try {
23      const KEY = 'starlight-theme';
24      if (!localStorage.getItem(KEY)) localStorage.setItem(KEY, 'light');
25    } catch {
26      /* storage unavailable (private mode, embedded) — fall through to Starlight's default */
27    }
28  })();
29</script>
29
30
31
32<script>
33	window.StarlightThemeProvider = (() => {
34		const storedTheme =
35			typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
36		const theme =
37			storedTheme ||
38			(window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
39		document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';
40		return {
41			updatePickers(theme = storedTheme || 'auto') {
42				document.querySelectorAll('starlight-theme-select').forEach((picker) => {
43					const select = picker.querySelector('select');
44					if (select) select.value = theme;
45					/** @type {HTMLTemplateElement | null} */
46					const tmpl = document.querySelector(`#theme-icons`);
47					const newIcon = tmpl && tmpl.content.querySelector('.' + theme);
48					if (newIcon) {
49						const oldIcon = picker.querySelector('svg.label-icon');
50						if (oldIcon) {
51							oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);
52						}
53					}
54				});
55			},
56		};
57	})();
58</script>
58
59
60<template id="theme-icons">
61	<svg aria-hidden="true" class="light astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg>
62	<svg aria-hidden="true" class="dark astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg>
63	<svg aria-hidden="true" class="auto astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg>
64</template>
65		<link rel="stylesheet" href="/_astro/print.ehPL0gv-.css" media="print">
66	<link rel="stylesheet" href="/_astro/StrataSun.CKBBGMFt.css">
67<link rel="stylesheet" href="/_astro/index.CiDEKtS1.css">
68<style>@layer starlight.components{.card-grid:where(.astro-lmor3ela){grid-template-columns:100%;gap:1rem;display:grid}.card-grid:where(.astro-lmor3ela)>*{margin-top:0!important}@media (width>=50rem){.card-grid:where(.astro-lmor3ela){grid-template-columns:1fr 1fr;gap:1.5rem}.stagger:where(.astro-lmor3ela){--stagger-height:5rem;padding-bottom:var(--stagger-height)}.stagger:where(.astro-lmor3ela)>:nth-child(2n){transform:translateY(var(--stagger-height))}}.sl-link-card:where(.astro-vodiqeol){border:1px solid var(--sl-color-gray-5);box-shadow:var(--sl-shadow-sm);border-radius:.5rem;grid-template-columns:1fr auto;gap:.5rem;padding:1rem;display:grid;position:relative}a:where(.astro-vodiqeol){line-height:var(--sl-line-height-headings);text-decoration:none}a:where(.astro-vodiqeol):before{content:"";position:absolute;inset:0}.stack:where(.astro-vodiqeol){flex-direction:column;gap:.5rem}.title:where(.astro-vodiqeol){color:var(--sl-color-white);font-weight:600;font-size:var(--sl-text-lg)}.description:where(.astro-vodiqeol){color:var(--sl-color-gray-3);line-height:1.5}.icon:where(.astro-vodiqeol){color:var(--sl-color-gray-3)}.sl-link-card:where(.astro-vodiqeol):hover{background:var(--sl-color-gray-7,var(--sl-color-gray-6));border-color:var(--sl-color-gray-2)}.sl-link-card:where(.astro-vodiqeol):hover .icon:where(.astro-vodiqeol){color:var(--sl-color-white)}}
69@layer starlight.components{svg:where(.astro-n5k4ipy7){color:var(--sl-icon-color);font-size:var(--sl-icon-size,1em);width:1em;height:1em}}
70@layer starlight.components{.sl-link-button:where(.astro-hlbqph7b){font-size:var(--sl-text-sm);outline-offset:.25rem;border:1px solid #0000;border-radius:999rem;align-items:center;gap:.5em;padding:.4375rem 1.125rem;line-height:1.1875;text-decoration:none;display:inline-flex}.sl-link-button:where(.astro-hlbqph7b).primary{background:var(--sl-color-text-accent);border-color:var(--sl-color-text-accent);color:var(--sl-color-black)}.sl-link-button:where(.astro-hlbqph7b).primary:hover{color:var(--sl-color-black)}.sl-link-button:where(.astro-hlbqph7b).secondary{border-color:inherit;color:var(--sl-color-white)}.sl-link-button:where(.astro-hlbqph7b).minimal{color:var(--sl-color-white);padding-inline:0}.sl-link-button:where(.astro-hlbqph7b) svg{flex-shrink:0}@media (width>=50rem){.sl-link-button:where(.astro-hlbqph7b){font-size:var(--sl-text-base);padding:.9375rem 1.25rem}}.sl-markdown-content .sl-link-button:where(.astro-hlbqph7b){margin-inline-end:1rem}.sl-markdown-content .sl-link-button:where(.astro-hlbqph7b):not(:where(p *)){margin-block:1rem}}
71</style>
71<script type="module" src="/_astro/page.LAbJoB63.js"></script>
71<style>.docs-home-concepts:where(.astro-pzzfkzcl){border:1px solid var(--qf-accent);background:var(--qf-accent-tint-soft);color:inherit;border-radius:12px;align-items:flex-start;gap:.9rem;margin:1.75rem 0 1.25rem;padding:1.1rem 1.25rem;text-decoration:none;transition:transform .2s,box-shadow .2s;display:flex}.docs-home-concepts:where(.astro-pzzfkzcl):hover{box-shadow:0 16px 34px -26px var(--qf-shadow);transform:translateY(-2px)}.docs-home-concepts__icon:where(.astro-pzzfkzcl){width:1.6rem;height:1.6rem;color:var(--qf-accent);flex:none;margin-top:.15rem}.docs-home-concepts__body:where(.astro-pzzfkzcl){display:block}.docs-home-concepts__title:where(.astro-pzzfkzcl){font-family:var(--qf-font-display);letter-spacing:-.018em;color:var(--qf-ink);font-size:1.15rem;font-weight:600;display:block}.docs-home-concepts__blurb:where(.astro-pzzfkzcl){color:var(--qf-ink-2);margin-top:.2rem;font-size:.9rem;line-height:1.5;display:block}.docs-home-grid:where(.astro-pzzfkzcl){grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:.6rem;margin:0 0 1.5rem;padding:0;list-style:none;display:grid}.docs-home-card:where(.astro-pzzfkzcl){border:1px solid var(--qf-rule);background:var(--qf-surface);height:100%;color:inherit;border-radius:10px;align-items:center;gap:.6rem;padding:.7rem .9rem;text-decoration:none;transition:border-color .2s,transform .2s,box-shadow .2s;display:flex}.docs-home-card:where(.astro-pzzfkzcl):hover{border-color:var(--qf-accent);box-shadow:0 16px 34px -26px var(--qf-shadow);transform:translateY(-2px)}.docs-home-card__icon:where(.astro-pzzfkzcl){width:1.3rem;height:1.3rem;color:var(--qf-ink-2);flex:none}.docs-home-card:where(.astro-pzzfkzcl):hover .docs-home-card__icon:where(.astro-pzzfkzcl){color:var(--qf-accent)}.docs-home-card__title:where(.astro-pzzfkzcl){font-family:var(--qf-font-display);letter-spacing:-.018em;color:var(--qf-ink);font-size:1.02rem;font-weight:600}
72</style></head>
73	<body class="astro-vdxcvpsm">
74		<a href="#_top" class="astro-vxeigawq">Skip to content</a>
75		<div class="page sl-flex astro-gqpr5s5a">
76	<header class="header astro-gqpr5s5a"><div class="qf-docs-nav astro-ktgj4fl6" data-pagefind-ignore>
77  <div class="section-container qf-docs-nav__inner astro-ktgj4fl6">
78    <a class="qf-lock astro-ktgj4fl6" href="/" aria-label="Query.Farm home">
79      <svg class="qf-mark qf-mark--settle astro-ktgj4fl6 astro-25oqwejs" viewBox="0 0 64 64" width="30" height="30" style="width:30px;height:30px" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg">
80  <rect class="qf-band qf-band-1 astro-25oqwejs" x="0" y="0" width="64" height="16" fill="#f0c877"></rect><rect class="qf-band qf-band-2 astro-25oqwejs" x="0" y="16" width="64" height="16" fill="#d9a441"></rect><rect class="qf-band qf-band-3 astro-25oqwejs" x="0" y="32" width="64" height="16" fill="#a9762e"></rect><rect class="qf-band qf-band-4 astro-25oqwejs" x="0" y="48" width="64" height="16" fill="#7a5230"></rect>
81</svg>
82      <span class="qf-wordmark-text astro-ktgj4fl6">Query<span class="dot astro-ktgj4fl6">.</span>Farm</span>
83    </a>
84
85    <nav class="qf-links astro-ktgj4fl6" aria-label="Site">
86      <div class="qf-link-wrap astro-ktgj4fl6">
87              <a href="/products" aria-current="page" class="astro-ktgj4fl6">
88                Products
89              </a>
90              <div class="qf-panel-anchor astro-ktgj4fl6">
91                  <div class="qf-panel astro-ktgj4fl6">
92                    <p class="qf-panel__label astro-ktgj4fl6">The data farm</p>
93                    <ul class="qf-panel__grid astro-ktgj4fl6">
94                      <li class="astro-ktgj4fl6">
95                          <a class="qf-panel__item astro-ktgj4fl6" href="/products/extensions">
96                            <span class="qf-panel__icon astro-ktgj4fl6">
97                              <img src="/images/duckdb-icon.svg" alt="" width="16" height="16" class="astro-ktgj4fl6">
98                              
99                            </span>
100                            <span class="qf-panel__text astro-ktgj4fl6">
101                              <span class="qf-panel__name astro-ktgj4fl6">
102                                Extensions
103                                
104                              </span>
105                              <span class="qf-panel__outcome astro-ktgj4fl6">Connect systems and add SQL capabilities.</span>
106                            </span>
107                          </a>
108                        </li><li class="astro-ktgj4fl6">
109                          <a class="qf-panel__item astro-ktgj4fl6" href="/products/orchard">
110                            <span class="qf-panel__icon astro-ktgj4fl6">
111                              
112                              <span aria-hidden="true" class="astro-ktgj4fl6">🌳</span>
113                            </span>
114                            <span class="qf-panel__text astro-ktgj4fl6">
115                              <span class="qf-panel__name astro-ktgj4fl6">
116                                Orchard
117                                <span class="qf-panel__pill qf-panel__pill--preview astro-ktgj4fl6">
118                                    Preview
119                                  </span>
120                              </span>
121                              <span class="qf-panel__outcome astro-ktgj4fl6">Discover, subscribe to, and reuse connectors.</span>
122                            </span>
123                          </a>
124                        </li><li class="astro-ktgj4fl6">
125                          <a class="qf-panel__item astro-ktgj4fl6" href="/vgi">
126                            <span class="qf-panel__icon astro-ktgj4fl6">
127                              <img src="/vgi/vgi-logo.png" alt="" width="16" height="16" class="astro-ktgj4fl6">
128                              
129                            </span>
130                            <span class="qf-panel__text astro-ktgj4fl6">
131                              <span class="qf-panel__name astro-ktgj4fl6">
132                                VGI
133                                
134                              </span>
135                              <span class="qf-panel__outcome astro-ktgj4fl6">Run custom or reusable workers from SQL.</span>
136                            </span>
137                          </a>
138                        </li><li class="astro-ktgj4fl6">
139                          <a class="qf-panel__item astro-ktgj4fl6" href="/products/rowfence">
140                            <span class="qf-panel__icon astro-ktgj4fl6">
141                              <img src="/rowfence/rowfence-icon.svg" alt="" width="16" height="16" class="astro-ktgj4fl6">
142                              
143                            </span>
144                            <span class="qf-panel__text astro-ktgj4fl6">
145                              <span class="qf-panel__name astro-ktgj4fl6">
146                                Rowfence
147                                <span class="qf-panel__pill qf-panel__pill--preview astro-ktgj4fl6">
148                                    Preview
149                                  </span>
150                              </span>
151                              <span class="qf-panel__outcome astro-ktgj4fl6">Enforce row, column, and function access.</span>
152                            </span>
153                          </a>
154                        </li><li class="astro-ktgj4fl6">
155                          <a class="qf-panel__item astro-ktgj4fl6" href="/products/haybarn">
156                            <span class="qf-panel__icon astro-ktgj4fl6">
157                              <img src="/products/haybarn/haybarn-mark.svg" alt="" width="16" height="16" class="astro-ktgj4fl6">
158                              
159                            </span>
160                            <span class="qf-panel__text astro-ktgj4fl6">
161                              <span class="qf-panel__name astro-ktgj4fl6">
162                                Haybarn
163                                
164                              </span>
165                              <span class="qf-panel__outcome astro-ktgj4fl6">Bring DuckDB into the enterprise.</span>
166                            </span>
167                          </a>
168                        </li><li class="astro-ktgj4fl6">
169                          <a class="qf-panel__item astro-ktgj4fl6" href="/products/cupola">
170                            <span class="qf-panel__icon astro-ktgj4fl6">
171                              <img src="/cupola/cupola-mark.svg" alt="" width="16" height="16" class="astro-ktgj4fl6">
172                              
173                            </span>
174                            <span class="qf-panel__text astro-ktgj4fl6">
175                              <span class="qf-panel__name astro-ktgj4fl6">
176                                Cupola
177                                
178                              </span>
179                              <span class="qf-panel__outcome astro-ktgj4fl6">Browse and query workers in the browser.</span>
180                            </span>
181                          </a>
182                        </li>
183                    </ul>
184                    <a class="qf-panel__more astro-ktgj4fl6" href="/products">See how it all fits together →</a>
185                  </div>
186                </div>
187            </div><div class="qf-link-wrap astro-ktgj4fl6">
188              <a href="/consulting" class="astro-ktgj4fl6">
189                Consulting
190              </a>
191              
192            </div><div class="qf-link-wrap astro-ktgj4fl6">
193              <a href="/blog" class="astro-ktgj4fl6">
194                Blog
195              </a>
196              
197            </div>
198    </nav>
199
200    <div class="qf-nav-right astro-ktgj4fl6">
201      <!-- Trigger -->
202<button id="site-search-open" type="button" aria-label="Search Query Farm" aria-controls="site-search-modal" aria-expanded="false" class="inline-flex items-center gap-2 rounded-lg border border-soil-300 bg-white/70 px-3 py-1.5 text-sm text-soil-600 transition-colors hover:border-sun-400 hover:text-soil-900 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-link">
203  <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
204    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-4.35-4.35M11 18a7 7 0 100-14 7 7 0 000 14z"></path>
205  </svg>
206  <span class="hidden sm:inline">Search</span>
207  <kbd class="hidden md:inline rounded border border-soil-300 bg-soil-50 px-1.5 text-[11px] font-mono text-soil-500">⌘K</kbd>
208</button>
209
210<!-- Modal -->
211<div id="site-search-modal" class="fixed inset-0 z-[100] hidden" role="dialog" aria-modal="true" aria-labelledby="site-search-title" tabindex="-1">
212  <div data-search-close class="absolute inset-0 bg-soil-900/40 backdrop-blur-sm"></div>
213  <div class="relative mx-auto mt-[10vh] w-[92%] max-w-2xl overflow-hidden rounded-2xl border border-soil-300 bg-[#fffdf7] shadow-2xl">
214    <div class="flex items-center gap-3 border-b border-soil-200 px-4">
215      <svg class="w-5 h-5 text-soil-400 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
216        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-4.35-4.35M11 18a7 7 0 100-14 7 7 0 000 14z"></path>
217      </svg>
218      <input id="site-search-input" type="search" autocomplete="off" placeholder="Search extensions, functions, docs…" class="flex-1 bg-transparent py-4 text-base text-soil-900 placeholder-soil-400 focus:outline-none" aria-label="Search the site">
219      <button data-search-close type="button" aria-label="Close search" class="rounded p-1 text-soil-400 hover:text-soil-700">
220        <kbd class="rounded border border-soil-300 bg-soil-50 px-1.5 py-0.5 text-[11px] font-mono">Esc</kbd>
221      </button>
222    </div>
223    <div id="site-search-results" class="max-h-[55vh] overflow-y-auto p-2"></div>
224    <p id="site-search-title" class="sr-only">Search Query.Farm</p>
225    <p id="site-search-status" class="px-4 py-6 text-center text-sm text-soil-500" role="status" aria-live="polite"></p>
226    <div class="flex items-center gap-2 border-t border-soil-200 bg-soil-50 px-4 py-2.5 text-xs text-soil-600">
227      <label class="inline-flex items-center gap-2 cursor-pointer select-none">
228        <input id="site-search-functions" type="checkbox" class="h-3.5 w-3.5 rounded border-soil-400 text-field-700 focus:ring-link">
229        <span>Also search function names</span>
230      </label>
231    </div>
232  </div>
233</div>
234
235<script>
236  (function () {
237    const openBtn = document.getElementById('site-search-open');
238    const modal = document.getElementById('site-search-modal');
239    const input = document.getElementById('site-search-input');
240    const resultsEl = document.getElementById('site-search-results');
241    const statusEl = document.getElementById('site-search-status');
242    const fnToggle = document.getElementById('site-search-functions');
243    if (!openBtn || !modal || !input || !resultsEl || !statusEl) return;
244
245    const esc = (s) => String(s ?? '').replace(/[&<>"]/g, (c) =>
246      ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]));
247
248    let pf = null; // null=not loaded, 'none'=unavailable
249    async function ensurePagefind() {
250      if (pf) return pf;
251      try {
252        const mod = await import('/pagefind/pagefind.js');
253        await mod.init();
254        pf = mod;
255      } catch (e) {
256        pf = 'none';
257      }
258      return pf;
259    }
260
261    function setStatus(msg) {
262      statusEl.textContent = msg || '';
263      statusEl.hidden = !msg;
264    }
265
266    function openModal() {
267      document.getElementById('haybarn-search')?.close();
268      modal.classList.remove('hidden');
269      openBtn.setAttribute('aria-expanded', 'true');
270      document.documentElement.style.overflow = 'hidden';
271      input.focus();
272      ensurePagefind().then((p) => {
273        if (p === 'none') setStatus('Search is available on the published site.');
274        else if (!input.value) setStatus('Type to search the docs and extensions.');
275      });
276    }
277    function closeModal() {
278      modal.classList.add('hidden');
279      openBtn.setAttribute('aria-expanded', 'false');
280      document.documentElement.style.overflow = '';
281      openBtn.focus();
282    }
283
284    openBtn.addEventListener('click', openModal);
285    modal.querySelectorAll('[data-search-close]').forEach((el) => el.addEventListener('click', closeModal));
286    document.addEventListener('keydown', (e) => {
287      if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k' && !document.getElementById('haybarn-search')) { e.preventDefault(); openModal(); }
288      else if (e.key === 'Escape' && !modal.classList.contains('hidden')) closeModal();
289      else if (e.key === 'Tab' && !modal.classList.contains('hidden')) {
290        const focusable = Array.from(modal.querySelectorAll('button, input, a[href]'))
291          .filter((el) => !el.hasAttribute('disabled'));
292        const first = focusable[0];
293        const last = focusable[focusable.length - 1];
294        if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last?.focus(); }
295        else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first?.focus(); }
296      }
297    });
298
299    let timer;
300    input.addEventListener('input', () => {
301      clearTimeout(timer);
302      timer = setTimeout(runSearch, 140);
303    });
304    // Re-run immediately when the "function names" toggle flips.
305    fnToggle?.addEventListener('change', runSearch);
306
307    async function runSearch() {
308      const q = input.value.trim();
309      if (!q) { resultsEl.innerHTML = ''; setStatus('Type to search the docs and extensions.'); return; }
310      const p = await ensurePagefind();
311      if (p === 'none') { resultsEl.innerHTML = ''; setStatus('Search is available on the published site.'); return; }
312      // Default to pages only (extensions, docs); include the 700+ function
313      // records only when the user opts in.
314      const opts = { filters: { kind: fnToggle && fnToggle.checked ? { any: ['page', 'function'] } : 'page' } };
315      const search = await p.search(q, opts);
316      const top = await Promise.all(search.results.slice(0, 8).map((r) => r.data()));
317      if (!top.length) { resultsEl.innerHTML = ''; setStatus(`No results for “${esc(q)}”.`); return; }
318      setStatus('');
319      resultsEl.innerHTML = top.map((d) => {
320        const title = esc((d.meta && d.meta.title) || d.url);
321        const tag = d.meta && d.meta.extension
322          ? `<span class="ml-2 shrink-0 rounded-full border border-sun-400/60 bg-sun-400/10 px-2 py-0.5 text-[11px] font-medium text-sun-700">${esc(d.meta.extension)}</span>`
323          : '';
324        return `<a href="${esc(d.url)}" class="block rounded-lg px-3 py-2 transition-colors hover:bg-soil-100">
325          <div class="flex items-center justify-between gap-2">
326            <span class="font-semibold text-soil-900 truncate">${title}</span>${tag}
327          </div>
328          <p class="mt-0.5 text-sm text-soil-700 line-clamp-2 [&_mark]:bg-sun-200 [&_mark]:text-soil-900 [&_mark]:rounded">${d.excerpt || ''}</p>
329        </a>`;
330      }).join('');
331    }
332  })();
333</script>
333
334      <starlight-theme-select>
335	
336	<label style="--sl-select-width: 6.25em" class="astro-r2p65idu">
337	<span class="sr-only astro-r2p65idu">Select theme</span>
338	<svg aria-hidden="true" class="icon label-icon astro-r2p65idu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg>
339	<select autocomplete="off" class="astro-r2p65idu">
340		<option value="dark" class="astro-r2p65idu">Dark</option><option value="light" class="astro-r2p65idu">Light</option><option value="auto" selected class="astro-r2p65idu">Auto</option>
341	</select>
342	<svg aria-hidden="true" class="icon caret astro-r2p65idu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg>
343</label>
344</starlight-theme-select>
345
346
347<script>
348	StarlightThemeProvider.updatePickers();
349</script>
349
350
351<script type="module">var e=`starlight-theme`,t=e=>e===`auto`||e===`dark`||e===`light`?e:`auto`,n=()=>t(typeof localStorage<`u`&&localStorage.getItem(e));function r(t){typeof localStorage<`u`&&localStorage.setItem(e,t===`light`||t===`dark`?t:``)}var i=()=>matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;function a(e){StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e===`auto`?i():e,r(e)}matchMedia(`(prefers-color-scheme: light)`).addEventListener(`change`,()=>{n()===`auto`&&a(`auto`)});var o=class extends HTMLElement{constructor(){super(),a(n()),this.querySelector(`select`)?.addEventListener(`change`,e=>{e.currentTarget instanceof HTMLSelectElement&&a(t(e.currentTarget.value))})}};customElements.define(`starlight-theme-select`,o);</script>
351
352      <a class="qf-cta astro-ktgj4fl6" href="/company/schedule">Talk with Us</a>
353    </div>
354  </div>
355</div>
356
357<div class="vgi-docs-subnav astro-wsdyau2x" data-pagefind-ignore>
358  <div class="section-container vgi-docs-subnav__inner astro-wsdyau2x">
359  <nav class="vgi-docs-subnav__bar astro-wsdyau2x" aria-label="Breadcrumb">
360    <a href="/vgi/docs/" class="brand astro-wsdyau2x" aria-current="page">
361      <img src="/vgi/vgi-logo.png" alt="" width="30" height="30" class="astro-wsdyau2x">
362      <span class="astro-wsdyau2x">VGI&nbsp;Docs</span>
363    </a>
364    
365  </nav>
366
367  <a href="https://github.com/Query-farm/vgi" target="_blank" rel="noopener noreferrer" aria-label="VGI on GitHub" title="View source on GitHub" class="gh astro-wsdyau2x">
368    <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" class="astro-wsdyau2x">
369      <path d="M12 .5C5.73.5.66 5.57.66 11.85c0 5.02 3.26 9.28 7.78 10.78.57.1.78-.25.78-.55v-2.1c-3.17.69-3.84-1.36-3.84-1.36-.52-1.32-1.27-1.67-1.27-1.67-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.18 1.76 1.18 1.02 1.75 2.67 1.25 3.32.95.1-.74.4-1.25.72-1.54-2.53-.29-5.19-1.27-5.19-5.64 0-1.25.45-2.27 1.18-3.07-.12-.29-.51-1.45.11-3.02 0 0 .96-.31 3.15 1.17a10.9 10.9 0 0 1 2.87-.39c.97 0 1.95.13 2.87.39 2.18-1.48 3.14-1.17 3.14-1.17.63 1.57.24 2.73.12 3.02.74.8 1.18 1.82 1.18 3.07 0 4.38-2.67 5.35-5.21 5.63.41.36.78 1.07.78 2.15v3.19c0 .31.21.66.79.55 4.51-1.5 7.77-5.76 7.77-10.78C23.34 5.57 18.27.5 12 .5z" class="astro-wsdyau2x"></path>
370    </svg>
371  </a>
372  </div>
373</div></header>
374	<nav class="sidebar print:hidden astro-gqpr5s5a" aria-label="Main">
375				<starlight-menu-button class="print:hidden astro-vvx7mffu">
376	<button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-vvx7mffu">
377		<svg aria-hidden="true" class="open-menu astro-vvx7mffu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg>
378		<svg aria-hidden="true" class="close-menu astro-vvx7mffu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="m13.41 12 6.3-6.29a1.004 1.004 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 0 1.42.998.998 0 0 0 1.42 0l6.29-6.3 6.29 6.3a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.42L13.41 12Z"/></svg>
379	</button>
380</starlight-menu-button>
381
382<script type="module">var e=class extends HTMLElement{btn=this.querySelector(`button`);constructor(){super(),this.btn.addEventListener(`click`,()=>this.toggleExpanded());let e=this.closest(`nav`);e&&e.addEventListener(`keyup`,e=>this.closeOnEscape(e))}setExpanded(e){this.setAttribute(`aria-expanded`,String(e)),document.body.toggleAttribute(`data-mobile-menu-expanded`,e)}toggleExpanded(){this.setExpanded(this.getAttribute(`aria-expanded`)!==`true`)}closeOnEscape(e){e.code===`Escape`&&(this.setExpanded(!1),this.btn.focus())}};customElements.define(`starlight-menu-button`,e);</script>
382
383				<div id="starlight__sidebar" class="sidebar-pane astro-gqpr5s5a">
384					<div class="sidebar-content sl-flex astro-gqpr5s5a">
385						<nav class="vgi-lang-switch" aria-label="SDK language">
386  <a class="vgi-lang-switch__home" href="/vgi/docs/">
387    <svg width="1em" height="1em" viewBox="0 0 256 256" data-icon="ph:books-bold">
388  
389  
390  <symbol id="ai:ph:books-bold"><path fill="currentColor" d="m235.57 193.73l-33.19-157.8a20 20 0 0 0-23.76-15.48l-46.81 10.06a19.82 19.82 0 0 0-11 6.65A20 20 0 0 0 104 28H56a20 20 0 0 0-20 20v160a20 20 0 0 0 20 20h48a20 20 0 0 0 20-20V90.25l25.62 121.82A20 20 0 0 0 169.15 228a20.3 20.3 0 0 0 4.23-.45l46.81-10.06a20.1 20.1 0 0 0 15.38-23.76M148.19 88.65l39-8.38l2.53 12l-39 8.38Zm7.46 35.5l39-8.38l9.16 43.58l-39 8.38Zm24.06-79.39l2.53 12l-39 8.38l-2.53-12ZM60 88h40v80H60Zm40-36v12H60V52ZM60 204v-12h40v12Zm112.29-.76l-2.53-12l39-8.38l2.53 12Z"/></symbol><use href="#ai:ph:books-bold"></use>
391      
392</svg>
393    <span>All VGI documentation</span>
394  </a>
395  <ul class="vgi-lang-switch__grid">
396    <li>
397          <a href="/vgi/docs/csharp/" class="vgi-lang-chip">
398            <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:csharp">
399  
400  
401  <use href="#ai:simple-icons:csharp"></use>
402      
403</svg>
404            <span>C#</span>
405          </a>
406        </li><li>
407          <a href="/vgi/docs/go/" class="vgi-lang-chip">
408            <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:go">
409  
410  
411  <use href="#ai:simple-icons:go"></use>
412      
413</svg>
414            <span>Go</span>
415          </a>
416        </li><li>
417          <a href="/vgi/docs/java/" class="vgi-lang-chip">
418            <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:openjdk">
419  
420  
421  <use href="#ai:simple-icons:openjdk"></use>
422      
423</svg>
424            <span>Java</span>
425          </a>
426        </li><li>
427          <a href="/vgi/docs/python/" class="vgi-lang-chip">
428            <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:python">
429  
430  
431  <use href="#ai:simple-icons:python"></use>
432      
433</svg>
434            <span>Python</span>
435          </a>
436        </li><li>
437          <a href="/vgi/docs/rust/" class="vgi-lang-chip">
438            <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:rust">
439  
440  
441  <use href="#ai:simple-icons:rust"></use>
442      
443</svg>
444            <span>Rust</span>
445          </a>
446        </li><li>
447          <a href="/vgi/docs/typescript/" class="vgi-lang-chip">
448            <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:typescript">
449  
450  
451  <use href="#ai:simple-icons:typescript"></use>
452      
453</svg>
454            <span>TypeScript</span>
455          </a>
456        </li>
457  </ul>
458</nav>
459
460<sl-sidebar-state-persist data-hash="0g4lojx" class="astro-f5yvicm7">
461	
461<script aria-hidden="true">
462		(() => {
463			try {
464				if (!matchMedia('(min-width: 50em)').matches) return;
465				/** @type {HTMLElement | null} */
466				const target = document.querySelector('sl-sidebar-state-persist');
467				const state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0');
468				if (!target || !state || target.dataset.hash !== state.hash) return;
469				window._starlightScrollRestore = state.scroll;
470				customElements.define(
471					'sl-sidebar-restore',
472					class SidebarRestore extends HTMLElement {
473						connectedCallback() {
474							try {
475								const idx = parseInt(this.dataset.index || '');
476								const details = this.closest('details');
477								if (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx];
478							} catch {}
479						}
480					}
481				);
482			} catch {}
483		})();
484	</script>
484
485  <ul class="top-level astro-ojxuodky">
486	<li class="astro-ojxuodky">
487				<details open class="astro-ojxuodky">
488						<summary class="astro-ojxuodky">
489							<span class="group-label astro-ojxuodky">
490								<span class="large astro-ojxuodky">Concepts</span>
491								
492							</span>
493							<svg aria-hidden="true" class="caret astro-ojxuodky astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg>
494						</summary>
495						<sl-sidebar-restore data-index="0"></sl-sidebar-restore>
496						<ul class="astro-ojxuodky">
497	<li class="astro-ojxuodky">
498				<a href="/vgi/docs/concepts/" class="astro-ojxuodky">
499						<span class="astro-ojxuodky">Overview</span>
500						
501					</a>
502			</li><li class="astro-ojxuodky">
503				<a href="/vgi/docs/concepts/lifecycle/" class="astro-ojxuodky">
504						<span class="astro-ojxuodky">Function lifecycle</span>
505						
506					</a>
507			</li><li class="astro-ojxuodky">
508				<a href="/vgi/docs/concepts/argument-serialization/" class="astro-ojxuodky">
509						<span class="astro-ojxuodky">Argument serialization</span>
510						
511					</a>
512			</li>
513</ul>
514					</details>
515			</li>
516</ul>
517
518
519	
519<script aria-hidden="true">
520		(() => {
521			const scroller = document.getElementById('starlight__sidebar');
522			if (!window._starlightScrollRestore || !scroller) return;
523			scroller.scrollTop = window._starlightScrollRestore;
524			delete window._starlightScrollRestore;
525		})();
526	</script>
526</sl-sidebar-state-persist>
527
528<div class="md:sl-hidden">
529  <div class="mobile-preferences sl-flex astro-b5gddk54">
530	<div class="social-icons astro-b5gddk54">
531		
532	</div>
533	<starlight-theme-select>
534	
535	<label style="--sl-select-width: 6.25em" class="astro-r2p65idu">
536	<span class="sr-only astro-r2p65idu">Select theme</span>
537	<svg aria-hidden="true" class="icon label-icon astro-r2p65idu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg>
538	<select autocomplete="off" class="astro-r2p65idu">
539		<option value="dark" class="astro-r2p65idu">Dark</option><option value="light" class="astro-r2p65idu">Light</option><option value="auto" selected class="astro-r2p65idu">Auto</option>
540	</select>
541	<svg aria-hidden="true" class="icon caret astro-r2p65idu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg>
542</label>
543</starlight-theme-select>
544
545
546<script>
547	StarlightThemeProvider.updatePickers();
548</script>
548
549
550
551	
552
553<script type="module">var e=class extends HTMLElement{constructor(){super();let e=this.querySelector(`select`);e&&(e.addEventListener(`change`,e=>{e.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=e.currentTarget.value)}),window.addEventListener(`pageshow`,t=>{if(!t.persisted)return;let n=e.querySelector(`option[selected]`)?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}};customElements.define(`starlight-lang-select`,e);</script>
553
554</div>
555</div>
556					</div>
557				</div>
558			</nav>
559	<div class="main-frame astro-gqpr5s5a">
560			
561			
561<script type="module">var e=document.getElementById(`starlight__sidebar`),t=e?.querySelector(`sl-sidebar-state-persist`),n=`sl-sidebar-state`,r=()=>{let r=[],i=t?.dataset.hash||``;try{let e=sessionStorage.getItem(n),t=JSON.parse(e||`{}`);Array.isArray(t.open)&&t.hash===i&&(r=t.open)}catch{}return{hash:i,open:r,scroll:e?.scrollTop||0}},i=e=>{try{sessionStorage.setItem(n,JSON.stringify(e))}catch{}},a=()=>i(r()),o=(e,t)=>{let n=r();n.open[t]=e,i(n)};t?.addEventListener(`click`,e=>{if(!(e.target instanceof Element))return;let t=e.target.closest(`summary`)?.closest(`details`);if(!t)return;let n=t.querySelector(`sl-sidebar-restore`),r=parseInt(n?.dataset.index||``);isNaN(r)||o(!t.open,r)}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&a()}),addEventListener(`pageHide`,a);</script>
561<div class="lg:sl-flex astro-abfeecmu">
562	
563	<div class="main-pane astro-abfeecmu">
564				
565				<main data-pagefind-body class="astro-vdxcvpsm" lang="en" dir="ltr">
566					
567					
568					
569								<div class="content-panel astro-oil7k7jf">
570	<div class="sl-container astro-oil7k7jf">
571									<h1 id="_top" class="astro-2sm4b3ln">VGI Documentation</h1>
572									</div>
573</div>
574								<div class="content-panel astro-oil7k7jf">
575	<div class="sl-container astro-oil7k7jf">
576									<div class="sl-markdown-content">
577										<p><strong>VGI</strong> — the Vector Gateway Interface — lets you add functions, tables and catalogs to DuckDB from an
578ordinary separate program, in whatever language you like. No native extension to compile, no DuckDB
579release cadence to wait on. Data crosses the boundary as Apache Arrow record batches.</p>
580<p>Every SDK implements the same protocol, so the <strong>Concepts</strong> pages are written once and shared. Read
581them first if you want the model before the syntax; otherwise jump straight into a language.</p>
582<a class="docs-home-concepts astro-pzzfkzcl" href="/vgi/docs/concepts/">
583  <svg width="1em" height="1em" viewBox="0 0 256 256" class="docs-home-concepts__icon astro-pzzfkzcl" data-icon="ph:compass-bold">
584  
585  
586  <symbol id="ai:ph:compass-bold"><path fill="currentColor" d="M128 20a108 108 0 1 0 108 108A108.12 108.12 0 0 0 128 20m0 192a84 84 0 1 1 84-84a84.09 84.09 0 0 1-84 84m35.27-135l-56 24a12 12 0 0 0-6.3 6.3l-24 56A12 12 0 0 0 92.73 179l56-24a12 12 0 0 0 6.3-6.3l24-56A12 12 0 0 0 163.27 77m-28.41 57.89l-24 10.29l10.29-24l24-10.29Z"/></symbol><use href="#ai:ph:compass-bold"></use>
587      
588</svg>
589  <span class="docs-home-concepts__body astro-pzzfkzcl">
590    <span class="docs-home-concepts__title astro-pzzfkzcl">Concepts</span>
591    <span class="docs-home-concepts__blurb astro-pzzfkzcl">The protocol, the worker model, and the five function shapes — whichever SDK you use.</span>
592  </span>
593</a>
594
595<ul class="docs-home-grid astro-pzzfkzcl">
596  <li class="astro-pzzfkzcl">
597        <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/csharp/">
598          <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:csharp">
599  
600  
601  <symbol id="ai:simple-icons:csharp"><path fill="currentColor" d="M1.194 7.543v8.913c0 1.103.588 2.122 1.544 2.674l7.718 4.456a3.09 3.09 0 0 0 3.088 0l7.718-4.456a3.09 3.09 0 0 0 1.544-2.674V7.543a3.08 3.08 0 0 0-1.544-2.673L13.544.414a3.09 3.09 0 0 0-3.088 0L2.738 4.87a3.09 3.09 0 0 0-1.544 2.673m5.403 2.914v3.087a.77.77 0 0 0 .772.772a.773.773 0 0 0 .772-.772a.773.773 0 0 1 1.317-.546a.78.78 0 0 1 .226.546a2.314 2.314 0 1 1-4.631 0v-3.087c0-.615.244-1.203.679-1.637a2.31 2.31 0 0 1 3.274 0c.434.434.678 1.023.678 1.637a.77.77 0 0 1-.226.545a.767.767 0 0 1-1.091 0a.77.77 0 0 1-.226-.545a.77.77 0 0 0-.772-.772a.77.77 0 0 0-.772.772m12.35 3.087a.77.77 0 0 1-.772.772h-.772v.772a.773.773 0 0 1-1.544 0v-.772h-1.544v.772a.773.773 0 0 1-1.317.546a.78.78 0 0 1-.226-.546v-.772H12a.771.771 0 1 1 0-1.544h.772v-1.543H12a.77.77 0 1 1 0-1.544h.772v-.772a.773.773 0 0 1 1.317-.546a.78.78 0 0 1 .226.546v.772h1.544v-.772a.773.773 0 0 1 1.544 0v.772h.772a.772.772 0 0 1 0 1.544h-.772v1.543h.772a.776.776 0 0 1 .772.772m-3.088-2.315h-1.544v1.543h1.544z"/></symbol><use href="#ai:simple-icons:csharp"></use>
602      
603</svg>
604          <span class="docs-home-card__title astro-pzzfkzcl">C#</span>
605        </a>
606      </li><li class="astro-pzzfkzcl">
607        <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/go/">
608          <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:go">
609  
610  
611  <symbol id="ai:simple-icons:go"><path fill="currentColor" d="M1.811 10.231c-.047 0-.058-.023-.035-.059l.246-.315c.023-.035.081-.058.128-.058h4.172c.046 0 .058.035.035.07l-.199.303c-.023.036-.082.07-.117.07zM.047 11.306c-.047 0-.059-.023-.035-.058l.245-.316c.023-.035.082-.058.129-.058h5.328c.047 0 .07.035.058.07l-.093.28c-.012.047-.058.07-.105.07zm2.828 1.075c-.047 0-.059-.035-.035-.07l.163-.292c.023-.035.07-.07.117-.07h2.337c.047 0 .07.035.07.082l-.023.28c0 .047-.047.082-.082.082zm12.129-2.36c-.736.187-1.239.327-1.963.514c-.176.046-.187.058-.34-.117c-.174-.199-.303-.327-.548-.444c-.737-.362-1.45-.257-2.115.175c-.795.514-1.204 1.274-1.192 2.22c.011.935.654 1.706 1.577 1.835c.795.105 1.46-.175 1.987-.77c.105-.13.198-.27.315-.434H10.47c-.245 0-.304-.152-.222-.35c.152-.362.432-.97.596-1.274a.32.32 0 0 1 .292-.187h4.253c-.023.316-.023.631-.07.947a5 5 0 0 1-.958 2.29c-.841 1.11-1.94 1.8-3.33 1.986c-1.145.152-2.209-.07-3.143-.77c-.865-.655-1.356-1.52-1.484-2.595c-.152-1.274.222-2.419.993-3.424c.83-1.086 1.928-1.776 3.272-2.02c1.098-.2 2.15-.07 3.096.571c.62.41 1.063.97 1.356 1.648c.07.105.023.164-.117.2m3.868 6.461c-1.064-.024-2.034-.328-2.852-1.029a3.67 3.67 0 0 1-1.262-2.255c-.21-1.32.152-2.489.947-3.529c.853-1.122 1.881-1.706 3.272-1.95c1.192-.21 2.314-.095 3.33.595c.923.63 1.496 1.484 1.648 2.605c.198 1.578-.257 2.863-1.344 3.962c-.771.783-1.718 1.273-2.805 1.495c-.315.06-.63.07-.934.106m2.78-4.72c-.011-.153-.011-.27-.034-.387c-.21-1.157-1.274-1.81-2.384-1.554c-1.087.245-1.788.935-2.045 2.033c-.21.912.234 1.835 1.075 2.21c.643.28 1.285.244 1.905-.07c.923-.48 1.425-1.228 1.484-2.233z"/></symbol><use href="#ai:simple-icons:go"></use>
612      
613</svg>
614          <span class="docs-home-card__title astro-pzzfkzcl">Go</span>
615        </a>
616      </li><li class="astro-pzzfkzcl">
617        <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/java/">
618          <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:openjdk">
619  
620  
621  <symbol id="ai:simple-icons:openjdk"><path fill="currentColor" d="M11.915 0L11.7.215C9.515 2.4 7.47 6.39 6.046 10.483c-1.064 1.024-3.633 2.81-3.711 3.551c-.093.87 1.746 2.611 1.55 3.235c-.198.625-1.304 1.408-1.014 1.939c.1.188.823.011 1.277-.491a13.4 13.4 0 0 0-.017 2.14c.076.906.27 1.668.643 2.232c.372.563.956.911 1.667.911c.397 0 .727-.114 1.024-.264c.298-.149.571-.33.91-.5c.68-.34 1.634-.666 3.53-.604c1.903.062 2.872.39 3.559.704s1.15.664 1.925.664c.767 0 1.395-.336 1.807-.9c.412-.563.631-1.33.72-2.24c.06-.623.055-1.32 0-2.066c.454.45 1.117.604 1.213.424c.29-.53-.816-1.314-1.013-1.937c-.198-.624 1.642-2.366 1.549-3.236c-.08-.748-2.707-2.568-3.748-3.586C16.428 6.374 14.308 2.394 12.13.215zm.175 6.038a2.95 2.95 0 0 1 2.943 2.942a2.95 2.95 0 0 1-2.943 2.943A2.95 2.95 0 0 1 9.148 8.98a2.95 2.95 0 0 1 2.942-2.942M8.685 7.983a3.5 3.5 0 0 0-.145.997c0 1.951 1.6 3.55 3.55 3.55s3.55-1.598 3.55-3.55q-.002-.495-.132-.951q.502.143.915.336a43 43 0 0 1 2.042 5.829c.678 2.545 1.01 4.92.846 6.607c-.082.844-.29 1.51-.606 1.94c-.315.431-.713.651-1.315.651c-.593 0-.932-.27-1.673-.61c-.741-.338-1.825-.694-3.792-.758c-1.974-.064-3.073.293-3.821.669c-.375.188-.659.373-.911.5s-.466.2-.752.2c-.53 0-.876-.209-1.16-.64c-.285-.43-.474-1.101-.545-1.948c-.141-1.693.176-4.069.823-6.614a43 43 0 0 1 1.934-5.783c.348-.167.749-.31 1.192-.425m-3.382 4.362a.2.2 0 0 1 .13.031c-.166.56-.323 1.116-.463 1.665a34 34 0 0 0-.547 2.555a4 4 0 0 0-.2-.39c-.58-1.012-.914-1.642-1.16-2.08c.315-.24 1.679-1.755 2.24-1.781m13.394.01c.562.027 1.926 1.543 2.24 1.783c-.246.438-.58 1.068-1.16 2.08a4 4 0 0 0-.163.309a32 32 0 0 0-.562-2.49a41 41 0 0 0-.482-1.652a.2.2 0 0 1 .127-.03"/></symbol><use href="#ai:simple-icons:openjdk"></use>
622      
623</svg>
624          <span class="docs-home-card__title astro-pzzfkzcl">Java</span>
625        </a>
626      </li><li class="astro-pzzfkzcl">
627        <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/python/">
628          <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:python">
629  
630  
631  <symbol id="ai:simple-icons:python"><path fill="currentColor" d="m14.25.18l.9.2l.73.26l.59.3l.45.32l.34.34l.25.34l.16.33l.1.3l.04.26l.02.2l-.01.13V8.5l-.05.63l-.13.55l-.21.46l-.26.38l-.3.31l-.33.25l-.35.19l-.35.14l-.33.1l-.3.07l-.26.04l-.21.02H8.77l-.69.05l-.59.14l-.5.22l-.41.27l-.33.32l-.27.35l-.2.36l-.15.37l-.1.35l-.07.32l-.04.27l-.02.21v3.06H3.17l-.21-.03l-.28-.07l-.32-.12l-.35-.18l-.36-.26l-.36-.36l-.35-.46l-.32-.59l-.28-.73l-.21-.88l-.14-1.05l-.05-1.23l.06-1.22l.16-1.04l.24-.87l.32-.71l.36-.57l.4-.44l.42-.33l.42-.24l.4-.16l.36-.1l.32-.05l.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75l-.02-.37l.05-.34l.11-.31l.17-.28l.25-.26l.31-.23l.38-.2l.44-.18l.51-.15l.58-.12l.64-.1l.71-.06l.77-.04l.84-.02l1.27.05zm-6.3 1.98l-.23.33l-.08.41l.08.41l.23.34l.33.22l.41.09l.41-.09l.33-.22l.23-.34l.08-.41l-.08-.41l-.23-.33l-.33-.22l-.41-.09l-.41.09zm13.09 3.95l.28.06l.32.12l.35.18l.36.27l.36.35l.35.47l.32.59l.28.73l.21.88l.14 1.04l.05 1.23l-.06 1.23l-.16 1.04l-.24.86l-.32.71l-.36.57l-.4.45l-.42.33l-.42.24l-.4.16l-.36.09l-.32.05l-.24.02l-.16-.01h-8.22v.82h5.84l.01 2.76l.02.36l-.05.34l-.11.31l-.17.29l-.25.25l-.31.24l-.38.2l-.44.17l-.51.15l-.58.13l-.64.09l-.71.07l-.77.04l-.84.01l-1.27-.04l-1.07-.14l-.9-.2l-.73-.25l-.59-.3l-.45-.33l-.34-.34l-.25-.34l-.16-.33l-.1-.3l-.04-.25l-.02-.2l.01-.13v-5.34l.05-.64l.13-.54l.21-.46l.26-.38l.3-.32l.33-.24l.35-.2l.35-.14l.33-.1l.3-.06l.26-.04l.21-.02l.13-.01h5.84l.69-.05l.59-.14l.5-.21l.41-.28l.33-.32l.27-.35l.2-.36l.15-.36l.1-.35l.07-.32l.04-.28l.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33l-.08.41l.08.41l.23.33l.33.23l.41.08l.41-.08l.33-.23l.23-.33l.08-.41l-.08-.41l-.23-.33l-.33-.23l-.41-.08l-.41.08z"/></symbol><use href="#ai:simple-icons:python"></use>
632      
633</svg>
634          <span class="docs-home-card__title astro-pzzfkzcl">Python</span>
635        </a>
636      </li><li class="astro-pzzfkzcl">
637        <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/rust/">
638          <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:rust">
639  
640  
641  <symbol id="ai:simple-icons:rust"><path fill="currentColor" d="m23.835 11.703l-1.008-.623l-.028-.294l.866-.807a.348.348 0 0 0-.116-.578l-1.106-.414a9 9 0 0 0-.087-.285l.69-.96a.346.346 0 0 0-.226-.544l-1.166-.19a9 9 0 0 0-.14-.261l.49-1.076a.34.34 0 0 0-.028-.336a.35.35 0 0 0-.3-.154l-1.185.041a7 7 0 0 0-.188-.227l.273-1.153a.347.347 0 0 0-.417-.417l-1.153.273l-.228-.188l.041-1.184a.344.344 0 0 0-.49-.328l-1.076.49l-.262-.14l-.19-1.167a.348.348 0 0 0-.545-.226l-.96.69a9 9 0 0 0-.285-.086L14.597.453a.348.348 0 0 0-.578-.116l-.807.867a9 9 0 0 0-.294-.028L12.295.168a.346.346 0 0 0-.59 0l-.623 1.008l-.294.028L9.98.337a.346.346 0 0 0-.578.116l-.414 1.106l-.285.086l-.959-.69a.348.348 0 0 0-.545.226l-.19 1.167a9 9 0 0 0-.262.14l-1.076-.49a.346.346 0 0 0-.49.328l.041 1.184a8 8 0 0 0-.228.187l-1.153-.272a.347.347 0 0 0-.417.417l.271 1.153l-.186.227l-1.184-.042a.346.346 0 0 0-.328.49l.49 1.077a9 9 0 0 0-.14.262l-1.166.19a.348.348 0 0 0-.226.544l.69.958l-.087.286l-1.106.414a.348.348 0 0 0-.116.578l.866.807a9 9 0 0 0-.028.294l-1.008.623a.344.344 0 0 0 0 .59l1.008.623q.012.147.028.294l-.866.807a.346.346 0 0 0 .116.578l1.106.415q.042.144.087.285l-.69.959a.345.345 0 0 0 .227.544l1.166.19q.069.132.14.262l-.49 1.076a.346.346 0 0 0 .328.49l1.183-.041q.093.115.187.227l-.27 1.154a.346.346 0 0 0 .416.417l1.153-.272q.113.096.228.187l-.041 1.184a.344.344 0 0 0 .49.327l1.076-.49q.13.073.262.14l.19 1.167a.348.348 0 0 0 .545.227l.959-.69a9 9 0 0 0 .285.086l.414 1.107a.345.345 0 0 0 .578.115l.808-.865l.294.03l.623 1.006a.347.347 0 0 0 .59 0l.623-1.007q.148-.013.294-.03l.807.866a.348.348 0 0 0 .578-.115l.414-1.107a9 9 0 0 0 .285-.087l.959.69a.345.345 0 0 0 .545-.226l.19-1.166l.262-.14l1.076.49a.347.347 0 0 0 .49-.328l-.041-1.184a7 7 0 0 0 .227-.187l1.153.272a.347.347 0 0 0 .417-.416l-.272-1.155q.095-.112.187-.227l1.184.041a.344.344 0 0 0 .328-.49l-.49-1.076q.072-.13.141-.262l1.166-.19a.348.348 0 0 0 .226-.544l-.69-.959l.087-.285l1.106-.414a.346.346 0 0 0 .116-.579l-.866-.807q.016-.147.028-.294l1.008-.624a.344.344 0 0 0 0-.589zm-6.742 8.355a.714.714 0 0 1 .299-1.396a.714.714 0 1 1-.3 1.396zm-.342-2.314a.65.65 0 0 0-.771.5l-.358 1.669a8.7 8.7 0 0 1-3.619.78a8.7 8.7 0 0 1-3.695-.815L7.95 18.21a.65.65 0 0 0-.772-.5l-1.473.317a9 9 0 0 1-.761-.898h7.167c.081 0 .136-.014.136-.088v-2.536c0-.074-.054-.088-.136-.088h-2.096v-1.608h2.268c.206 0 1.106.059 1.393 1.209c.09.353.288 1.504.424 1.873c.134.413.683 1.238 1.268 1.238h3.572a1 1 0 0 0 .13-.013a9 9 0 0 1-.813.952zm-9.914 2.28a.714.714 0 1 1-.3-1.396a.714.714 0 0 1 .3 1.396M4.117 8.997a.714.714 0 1 1-1.303.58a.714.714 0 0 1 1.304-.58m-.834 1.981l1.534-.682a.65.65 0 0 0 .33-.858l-.316-.715h1.244v5.602H3.567a8.8 8.8 0 0 1-.284-3.348zm6.734-.543V8.784h2.96c.153 0 1.08.177 1.08.87c0 .574-.712.78-1.296.78zm10.757 1.486q0 .329-.024.651h-.9c-.09 0-.127.059-.127.148v.413c0 .973-.548 1.184-1.03 1.238c-.457.052-.964-.191-1.027-.472c-.27-1.518-.72-1.843-1.43-2.403c.882-.56 1.799-1.386 1.799-2.492c0-1.193-.82-1.945-1.377-2.315c-.783-.516-1.65-.62-1.883-.62H5.468a8.77 8.77 0 0 1 4.907-2.77l1.098 1.152a.65.65 0 0 0 .918.02l1.227-1.173a8.78 8.78 0 0 1 6.004 4.276l-.84 1.898a.65.65 0 0 0 .33.859l1.618.718q.042.43.042.872zm-9.3-9.6a.713.713 0 1 1 .984 1.032a.714.714 0 0 1-.984-1.031m8.339 6.71a.71.71 0 0 1 .939-.362a.714.714 0 1 1-.94.364z"/></symbol><use href="#ai:simple-icons:rust"></use>
642      
643</svg>
644          <span class="docs-home-card__title astro-pzzfkzcl">Rust</span>
645        </a>
646      </li><li class="astro-pzzfkzcl">
647        <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/typescript/">
648          <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:typescript">
649  
650  
651  <symbol id="ai:simple-icons:typescript">
651<path fill="currentColor" d="M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75q.918 0 1.627.111a6.4 6.4 0 0 1 1.306.34v2.458a4 4 0 0 0-.643-.361a5 5 0 0 0-.717-.26a5.5 5.5 0 0 0-1.426-.2q-.45 0-.819.086a2.1 2.1 0 0 0-.623.242q-.254.156-.393.374a.9.9 0 0 0-.14.49q0 .294.156.529q.156.234.443.444c.287.21.423.276.696.41q.41.203.926.416q.705.296 1.266.628q.561.333.963.753q.402.418.614.957q.213.538.214 1.253q0 .986-.373 1.656a3 3 0 0 1-1.012 1.085a4.4 4.4 0 0 1-1.487.596q-.85.18-1.79.18a10 10 0 0 1-1.84-.164a5.5 5.5 0 0 1-1.512-.493v-2.63a5.03 5.03 0 0 0 3.237 1.2q.5 0 .872-.09q.373-.09.623-.25q.249-.162.373-.38a1.02 1.02 0 0 0-.074-1.089a2.1 2.1 0 0 0-.537-.5a5.6 5.6 0 0 0-.807-.444a28 28 0 0 0-1.007-.436q-1.377-.575-2.053-1.405t-.676-2.005q0-.92.369-1.582q.368-.662 1.004-1.089a4.5 4.5 0 0 1 1.47-.629a7.5 7.5 0 0 1 1.77-.201m-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z"/></symbol><use href="#ai:simple-icons:typescript"></use>
652      
653</svg>
654          <span class="docs-home-card__title astro-pzzfkzcl">TypeScript</span>
655        </a>
656      </li>
657</ul>
658<p>Still deciding? <strong><a href="/vgi/languages">Language SDKs</a></strong> compares them side by side — install command,
659feature parity, repository, and the RPC layer underneath each one.</p>
660<div class="sl-heading-wrapper level-h2"><h2 id="elsewhere-on-the-site">Elsewhere on the site</h2><a class="sl-anchor-link" href="#elsewhere-on-the-site"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore="true">Section titled “Elsewhere on the site”</span></a></div>
661<ul>
662<li><strong><a href="/vgi">VGI overview</a></strong> — what it is and who it’s for.</li>
663<li><strong><a href="/vgi/architecture">Architecture</a></strong> — the engineering case: why out-of-process, what it costs in
664latency, how it compares to native C++ extensions, Airport and ADBC.</li>
665<li><strong><a href="/vgi/getting-started">Getting started</a></strong> — install the extension and attach your first worker.</li>
666<li><strong><a href="https://vgi-rpc.query.farm/">vgi-rpc</a></strong> — the transport-agnostic RPC layer underneath, and its
667<a href="https://vgi-rpc.query.farm/wire-protocol">wire-protocol specification</a>.</li>
668</ul>
669									</div>
670									<footer class="sl-flex astro-xhxjzfa7">
671	<div class="meta sl-flex astro-xhxjzfa7">
672		
673		
674	</div>
675	<div class="pagination-links print:hidden astro-jgq3vlii" dir="ltr">
676	
677	
678</div>
679
680	
681</footer>
682								</div>
683</div>
684							
685				</main>
686			</div>
687</div>
688		</div>
689</div>
690	
690<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"d9c4ac386e3b4b41a12fa582343aca1e","r":1,"spa":2}' crossorigin="anonymous"></script>
690
691</body>
692</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.