Ich habe neulich ein Produkt entwickelt, das meiner Meinung nach perfekt für KI-bezogene Anwendungsfälle geeignet sein könnte. Geistvon ghost.construct, beschreibt sich selbst als „die erste Datenbank, die für Agenten erstellt wurde“.

Ghost ist eine „Agent-First“-Postgres-Datenbankplattform, mit der Entwickler und KI-Agenten problemlos ganze Datenbanken erstellen, forken, prüfen, abfragen, manipulieren und löschen können.

Es gibt auch ein sehr großzügiges kostenloses Nutzungskontingent.

Die Entwickler, die es entwickelt haben, hatten eine einfache Idee: Wenn Agenten Software program erstellen, Migrationen testen, Schemata prüfen, SQL ausführen und mit Daten experimentieren wollen, dann brauchen sie Datenbanken, die ebenso verfügbar und programmierbar sind wie Code-Sandboxen. Da passt Ghost hinein.

Wenn Sie eine Ghost-Datenbank erstellen oder bestehende aufteilen, befinden sich diese Datenbanken in der Cloud-Infrastruktur von Ghost und nicht auf Ihrem lokalen System. Ghost ist besonders nützlich für Checks, Prototyping, Agenten-Workflows, Zweigstellendatenbanken, Migrationsexperimente und Einweg-Datenbankumgebungen.

Herkömmliche verwaltete Datenbanken basieren auf einer langlebigen Produktionsinfrastruktur. Sie erstellen eine Instanz, konfigurieren das Netzwerk, verwalten Anmeldeinformationen, verbinden Anwendungen und behandeln die Datenbank dann als etwas Wertvolles und Zerbrechliches. Ghost behält die Leistungsfähigkeit von Postgres bei, fügt aber einen Workflow hinzu, der der modernen Agentenentwicklung viel näher kommt: Erstellen Sie eine Datenbank bei Bedarf, forken Sie sie, wenn Sie eine isolierte Kopie benötigen, führen Sie SQL dafür aus, überprüfen Sie das Schema, probieren Sie verschiedene Tabellenkonfigurationen aus und werfen Sie sie weg, wenn Sie fertig sind.

Dadurch eignet sich Ghost besonders intestine für KI-Instruments wie Codex und Claude Code. Diese Instruments können über Code nachdenken, Migrationen schreiben, Abfragen debuggen, Seed-Daten generieren, Protokolle überprüfen und MCP-Instruments verwenden. Der integrierte MCP-Server von Ghost bietet Codex direkte Datenbankverwaltungsfunktionen, anstatt den Agenten dazu zu zwingen, sich auf vage Anweisungen, kopierte Verbindungszeichenfolgen oder manuelle Dashboard-Arbeiten zu verlassen.

Im Relaxation dieses Artikels erkläre ich Ihnen, wie Sie Ghost auf Ihrem lokalen System installieren. Anschließend schauen wir uns vier konkrete Beispiele für die Verwendung von Ghost mit dem Codex-Agenten und seiner eigenen CLI an.

Bitte beachten Sie, dass ich weder mit dem Unternehmen oder Workforce hinter Ghost noch mit dem Ghost-Produkt selbst verbunden bin.

Voraussetzungen

Ich gehe davon aus, dass auf Ihrem System bereits einer der von Ghost unterstützten Codierungsagenten installiert ist. Dazu gehören:

Claude Code
Codex
Cursor
Gemini CLI
Google Antigravity
Kiro CLI
VS Code
Windsurf

Sie benötigen außerdem ein GitHub-Konto, dem Sie Ghost beim Anmelden Zugriff gewähren müssen.

Ghost installieren

Unter Linux, WSL unter Home windows oder macOS können Sie den folgenden Curl-Befehl verwenden.

$ curl -fsSL https://set up.ghost.construct | sh

Wenn Sie wie ich Home windows verwenden, können Sie diesen Befehl von einem PowerShell-Terminal aus verwenden.

PS C:Usersthoma> irm https://set up.ghost.construct/set up.ps1 | iex

Dann lauf,

PS C:Usersthoma> ghost login

Opening browser for authentication...
Discovered house: nj5scy2orp
Efficiently logged in as (electronic mail protected)

Ihnen wird ein Bildschirm wie dieser angezeigt. Autorisieren Sie Ghost, fortzufahren.

Nachdem Sie sich korrekt angemeldet haben, sollten Sie als Nächstes den Ghost MCP-Server Ihrem bevorzugten Programmieragenten zur Verfügung stellen. In meinem Fall verwende ich Codex.

Geben Sie Folgendes in die Befehlszeile ein und wählen Sie Ihren Agenten aus der angezeigten Liste aus.

PS C:Usersthoma> ghost mcp set up

Choose an MCP consumer to configure:
  1. Claude Code
> 2. Codex
  3. Cursor
  4. Gemini CLI
  5. Google Antigravity
  6. Kiro CLI
  7. VS Code
  8. Windsurf

Typing: 2
Efficiently put in Ghost MCP server configuration for codex
Configuration file: C:Usersthoma.codexconfig.toml

Subsequent steps:
   1. Restart codex to load the brand new configuration
   2. The Ghost MCP server can be accessible as 'ghost'

PS C:Usersthoma>

Überprüfen Sie, ob Ihr Setup in Ordnung ist

  • Geben Sie Folgendes ein, um zu überprüfen, ob der Ghost MCP korrekt installiert ist.
PS C:Usersthoma> ghost mcp listing

TYPE    NAME
immediate  design-postgis-tables
immediate  design-postgres-tables
immediate  find-hypertable-candidates
immediate  migrate-postgres-tables-to-hypertables
immediate  pgvector-semantic-search
immediate  postgres
immediate  postgres-hybrid-text-search
immediate  setup-timescaledb-hypertables
software    ghost_connect
software    ghost_create
software    ghost_create_dedicated
software    ghost_delete
software    ghost_feedback
software    ghost_fork
software    ghost_fork_dedicated
software    ghost_list
software    ghost_login
software    ghost_logs
software    ghost_password
software    ghost_pause
software    ghost_rename
software    ghost_resume
software    ghost_schema
software    ghost_sql
software    ghost_status
software    search_docs
software    view_skill

Überprüfen Sie, ob Ihr Agent den Ghost MCP-Server verwenden kann. Sie sollten eine ähnliche Ausgabe sehen (für Codex).

PS C:Usersthoma> codex mcp listing

Title   Command                                                Args       Env  Cwd  Standing   Auth
ghost  C:UsersthomaAppDataLocalProgramsGhostghost.exe  mcp begin  -    -    enabled  Unsupported

Vorausgesetzt, alles ist in Ordnung, können wir mit weiteren Beispielen für die Verwendung von Ghost über seine CLI und Agenten über seinen MCP-Server fortfahren.

Beispiel 1 – Erstellen einer Verkaufsdatendatenbank

Öffnen Sie Ihren Codierungsagenten und geben Sie Folgendes ein.

Codex> Create a ghost database known as sales_data that shops 10,000 dummy gross sales 
data. Within the database, create whichever tables are appropriate for such 
information. Don't embody any indexes, main or international keys for now.

Ich habe diese Ausgabe von Codex erhalten.

Labored for 1m 32s
Created a contemporary Ghost database named sales_data.

It accommodates 10,000 dummy gross sales order data and supporting tables:

clients           1,000
merchandise            150
sales_reps          30
sales_orders        10,000
sales_order_items   30,000
Per your instruction, I didn't create any:

main keys
international keys
indexes

Verification confirmed there aren't any main key constraints, no international key 
constraints, and no indexes on the gross sales tables.

Wie Sie sehen, dauerte dies auf meinem System etwas mehr als eineinhalb Minuten, was eine ziemlich beeindruckende Statistik für das ist, was erreicht wurde.

Beispiel 2 – Verwendung der Ghost-CLI

Nachdem wir nun eine Datenbank zum Spielen haben, probieren wir einige der Ghost-CLI-Befehle aus. Beachten Sie, dass diese Befehle normalerweise nicht verwendet werden müssen, da wir alles, was ich Ihnen gleich zeigen werde, über Codex und das Ghost MCP tun können, aber es ist auf jeden Fall nützlich zu wissen, wie.

PS C:Usersthoma> ghost listing

ID          NAME        STATUS   STORAGE
sip3qcs40a  sales_data  operating  211MiB
  • Sehen Sie sich die Datenbanktabellen und die Struktur an
PS C:Usersthoma> ghost schema sales_data

DATABASE: sales_data (sip3qcs40a)

TABLE: clients
  customer_id    BIGINT GENERATED ALWAYS AS IDENTITY
  customer_name  TEXT NOT NULL
  electronic mail          TEXT NOT NULL
  country_code   TEXT NOT NULL CHECK ((size(country_code) = 2))
  section        TEXT NOT NULL CHECK ((section = ANY (ARRAY('shopper'::textual content, 'small_business'::textual content, 'enterprise'::textual content))))
  created_at     TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()

TABLE: merchandise
  product_id    BIGINT GENERATED ALWAYS AS IDENTITY
  sku           TEXT NOT NULL
  product_name  TEXT NOT NULL
  class      TEXT NOT NULL CHECK ((class = ANY (ARRAY('software program'::textual content, '{hardware}'::textual content, 'companies'::textual content, 'coaching'::textual content, 'assist'::textual content))))
  base_price    NUMERIC(10,2) NOT NULL CHECK ((base_price > (0)::numeric))
  lively        BOOLEAN NOT NULL DEFAULT true

TABLE: sales_order_items
  sales_order_item_id  BIGINT GENERATED ALWAYS AS IDENTITY
  sales_order_id       BIGINT NOT NULL
  product_id           BIGINT NOT NULL
  amount             INTEGER NOT NULL CHECK (((amount >= 1) AND (amount <= 6)))
  unit_price           NUMERIC(10,2) NOT NULL CHECK ((unit_price > (0)::numeric))
  discount_amount      NUMERIC(10,2) NOT NULL DEFAULT 0 CHECK ((discount_amount >= (0)::numeric))
  line_total           NUMERIC(12,2) NOT NULL CHECK ((line_total >= (0)::numeric))

TABLE: sales_orders
  sales_order_id   BIGINT GENERATED ALWAYS AS IDENTITY
  customer_id      BIGINT NOT NULL
  sales_rep_id     BIGINT NOT NULL
  order_status     TEXT NOT NULL CHECK ((order_status = ANY (ARRAY('pending'::textual content, 'accomplished'::textual content, 'shipped'::textual content, 'cancelled'::textual content, 'refunded'::textual content))))
  ordered_at       TIMESTAMP WITH TIME ZONE NOT NULL
  payment_method   TEXT NOT NULL CHECK ((payment_method = ANY (ARRAY('card'::textual content, 'bank_transfer'::textual content, 'paypal'::textual content, 'bill'::textual content))))
  currency_code    TEXT NOT NULL DEFAULT 'USD'::textual content CHECK ((currency_code = 'USD'::textual content))
  subtotal_amount  NUMERIC(12,2) NOT NULL DEFAULT 0 CHECK ((subtotal_amount >= (0)::numeric))
  tax_amount       NUMERIC(12,2) NOT NULL DEFAULT 0 CHECK ((tax_amount >= (0)::numeric))
  shipping_amount  NUMERIC(12,2) NOT NULL DEFAULT 0 CHECK ((shipping_amount >= (0)::numeric))
  total_amount     NUMERIC(12,2) NOT NULL DEFAULT 0 CHECK ((total_amount >= (0)::numeric))

TABLE: sales_reps
  sales_rep_id  BIGINT GENERATED ALWAYS AS IDENTITY
  rep_name      TEXT NOT NULL
  area        TEXT NOT NULL CHECK ((area = ANY (ARRAY('north_america'::textual content, 'europe'::textual content, 'asia_pacific'::textual content, 'latin_america'::textual content))))
  hired_at      DATE NOT NULL

VIEW: pg_buffercache
  bufferid          INTEGER
  relfilenode       OID
  reltablespace     OID
  reldatabase       OID
  relforknumber     SMALLINT
  relblocknumber    BIGINT
  isdirty           BOOLEAN
  usagecount        SMALLINT
  pinning_backends  INTEGER

VIEW: pg_buffercache_numa
  bufferid     INTEGER
  os_page_num  BIGINT
  numa_node    INTEGER
  • Wählen Sie einige Daten aus der Tabelle sales_order aus
PS C:Usersthoma> ghost sql sales_data "SELECT * FROM sales_orders LIMIT 10;"

 sales_order_id │ customer_id │ sales_rep_id │ order_status │ ordered_at                    │ payment_method │ currency_code │ subtotal_amount │ tax_amount │ shipping_amount │ total_amount
────────────────┼─────────────┼──────────────┼──────────────┼───────────────────────────────┼────────────────┼───────────────┼─────────────────┼────────────┼─────────────────┼──────────────
 1              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 1796.88         │ 143.75     │ 0.00            │ 1940.63
 2              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 1622.63         │ 129.81     │ 0.00            │ 1752.44
 3              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 1867.25         │ 149.38     │ 0.00            │ 2016.63
 4              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 606.02          │ 48.48      │ 0.00            │ 654.50
 5              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 1450.11         │ 116.01     │ 0.00            │ 1566.12
 6              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 1227.85         │ 98.23      │ 0.00            │ 1326.08
 7              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 7086.55         │ 566.92     │ 0.00            │ 7653.47
 8              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 696.92          │ 55.75      │ 0.00            │ 752.67
 9              │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 1063.73         │ 85.10      │ 0.00            │ 1148.83
 10             │ 8           │ 9            │ accomplished    │ 2024-05-21 05:08:34.332998+00 │ paypal         │ USD           │ 2489.06         │ 199.12     │ 0.00            │ 2688.18
(10 rows)
  • Befürchten Sie, dass Ihr Agent Ihre Datenbank zerstört? Ganz einfach: Stellen Sie Ihr System einfach auf schreibgeschützt ein
PS C:Usersthoma> ghost config set read_only true

Now in Codex,

Codex> delete from sales_order_items the place sales_order_item_id = 12

Labored for 5s
The DELETE was blocked, as anticipated:

ERROR: can not execute DELETE in a read-only transaction (SQLSTATE 25006)

Es gibt eine ganze Reihe nützlicher Befehle, die Sie mit der Ghost-CLI verwenden können. Für eine vollständige Liste geben Sie ein Geist – Hilfe in Ihre Befehlszeile.

Aber wie ich bereits sagte, ist einer der Hauptgründe für die Verwendung von Ghost, dass wir Datenbanken mithilfe unseres KI-Agenten manipulieren können. Sehen wir uns das in Aktion an.

Beispiel 3 – Verwendung des Ghost MCP mit unserem Agenten.

Wir haben bereits in Beispiel 1 gesehen, wie schnell und einfach es warfare, mit Codex eine Datenbank zu erstellen, aber zeigen wir, wie einfach es ist, mit Datenbanken mithilfe eines Agenten zu experimentieren.

  • Fügen Sie 500.000 Datensätze zur Tabelle sales_order_items hinzu
Codex> Add 500,000 dummy gross sales order data to the sales_order_items desk


Added 500,000 dummy rows to sales_data.sales_order_items.

Ultimate counts:

sales_orders        10,000
merchandise            150
sales_order_items   530,000

I additionally recalculated the ten,000 order totals from the expanded line-item desk.

Totals now:

Subtotal sum:      1,530,141,808.73
Tax sum:             124,981,128.08
Complete gross sales:       1,639,903,892.69
Avg order worth:         163,990.39

Confirmed the tables nonetheless have 0 indexes.
  • Wählen Sie einige Daten aus der Tabelle sales_order_id aus
Codex> Retrieve the sales_order_items report for 
sales_order_items_id = 519932 and inform me how lengthy it took to retrieve

Report discovered:

sales_order_item_id: 519932
sales_order_id:      9932
product_id:          15
amount:            3
unit_price:          91.47
discount_amount:     0.00
line_total:          274.41
Timing:

Database execution time:     25.833 ms
Ghost MCP end-to-end time:  146.733 ms
As a result of there aren't any indexes, Postgres used a sequential scan and filtered via 529,999 rows to seek out the report.
  • Nun zur Leistungsoptimierung
Codex> Fork 3 duplicate sales-data databases in parallel, naming them 
sales_data-1, and many others.... Utilizing differering methods in every fork, tune the 
database in order that the above question runs extra rapidly. Output your leads to 
an ascii desk with database identify, tuning technique and database execution time.


I am going to create three forks concurrently, then apply a distinct lookup technique 
to every fork: a plain btree index, a masking btree index, and a bodily 
clustered desk plus index. Then I am going to measure the identical EXPLAIN ANALYZE 
execution time on every.

Used Ghost

Solely the supply sales_data exists, so there aren't any fork-name collisions. 
I am launching the three fork/tune/measure staff now; every employee waits solely 
for its personal fork earlier than tuning it.

Labored for 2m 40s

Created and tuned three forked databases in parallel.

Baseline on untuned sales_data was beforehand 25.833 ms with a sequential scan.

+--------------+---------------------------------------------------------------+--------------------------+
| Database     | Tuning technique                                               | Database execution time  |
+--------------+---------------------------------------------------------------+--------------------------+
| sales_data-1 | Btree index on sales_order_item_id                            | 0.131 ms                 |
| sales_data-2 | Masking btree index together with all projected question columns    | 0.143 ms                 |
| sales_data-3 | Hash index on sales_order_item_id for equality lookup         | 0.158 ms                 |
+--------------+---------------------------------------------------------------+--------------------------+

Finest end result: sales_data-1 with a typical btree index at 0.131 ms.

Wie Sie sehen können, warfare die Beschleunigung nach der Optimierung erwartungsgemäß ziemlich erheblich. Dennoch ist eine Verbesserung der Abfragelaufzeit um den Faktor 200 nicht allzu schlecht.

Beispiel 4 – Erstellen einer Dashboard-App für unsere Datenbank

Dieses Beispiel zeigt, wie einfach es ist, eine mit Codierungsagenten erstellte App mit einer mit Codierungsagenten erstellten Datenbank zu kombinieren.

Codex> Use your efficiency tuning findings to improve the sales_data 
database. Then assemble a dashboard utilizing javascript and HTML for the 
database. The dashboard needs to be dynamic. I need to have the ability to filter on information 
and the dashboard ought to solely present information that's contained in the database.


I am going to flip this right into a small reside dashboard app: an Categorical backend with 
read-only Postgres queries, and a browser UI that fetches filtered information 
from /api/dashboard. I am going to maintain the database URL in an atmosphere file 
reasonably than placing credentials within the HTML.

Ran 3 instructions
The workspace already has pg; I am going to add specific and dotenv, then fetch a 
read-only Ghost connection string for the app.

Ran 1 command, used Ghost
I am going to keep away from placing the database password into the HTML. The server will get a 
read-only connection from the Ghost CLI at startup if DATABASE_URL will not be 
set, and all browser requests will undergo parameterized API endpoints.

Ran & 'C:UsersthomaAppDataLocalProgramsGhostghost.exe' join --read-only sales_data
The read-only Ghost connection string works and consists of sslmode=require 
plus Ghost's protected read-only choice. I am including the backend and changing 
the HTML with a reside API-driven dashboard.

The backend API is in place. I am changing the dashboard HTML with a 
frontend that calls /api/choices and /api/dashboard each time filters change.

Created 1 file
The reside frontend and backend are written. I am beginning the server now and 
checking the API endpoints earlier than I hand you the URL.

The server is now operating on port 5101. I am verifying the browser HTML and a 
filtered API name towards the reside database.

Labored for 7m 28s
Executed. The dashboard is now a reside browser app backed by the Ghost sales_data 
database.

Run/open it right here:

http://localhost:5101/sales_dashboard.html

What modified:

Added server.js with an Categorical API.
Up to date sales_dashboard.html so filters name the API and redraw charts/tables.
Up to date package deal.json with npm begin.
The backend will get a Ghost read-only connection by way of ghost join --read-only sales_data.
Browser JavaScript by no means sees the database password.

Als ich auf den HTML-Hyperlink klickte, erhielt ich ein dynamisches Dashboard, das genau auf verschiedene Filterwerte reagierte.

Bild vom Autor

Zusammenfassung

Hoffentlich habe ich Ihnen genug von den Funktionen der Ghost-Datenbank gezeigt, um Ihren Appetit zu wecken, mehr über dieses nützliche Produkt zu erfahren.

Bemerkenswert ist die Leichtigkeit und Geschwindigkeit, mit der sich mit diesem Device Postgres-Datenbanken erstellen, zerstören, kopieren und bearbeiten lassen.

Was mir an Ghost am besten gefällt, ist die einfache Ausführung von Was-wäre-wenn-Szenarien mit echten Datenbanken. Benötigen Sie zum Ausprobieren neue Kopien einer vorhandenen Datenbank? Es ist ein Kinderspiel. Sie können Indizes und Primärschlüssel zerlegen und ändern oder materialisierte Ansichten erstellen, indem Sie einfach in einfachem Englisch beschreiben, was Sie wollen, und zwar mit Ihren bevorzugten Agenten-Codierungstools, mit einem Fallback auf eine CLI, wenn Sie es wirklich brauchen.

Wie ich in meinem letzten Beispiel gezeigt habe, ist es aufgrund der guten Zusammenarbeit von Ghost mit Agenten-Codierungstools ziemlich einfach, diese Agenten Code erstellen zu lassen, der sich intestine in Ghost-Datenbanken integrieren lässt, um nützliche Apps wie Dashboards und andere Arten von SaaS-Anwendungen zu erstellen.

Obwohl Sie vielleicht eine Pause einlegen möchten, bevor Sie Produktionsdaten auf Ghost speichern, ist es eine großartige Plattform für Proofs of Idea und allgemeine Experimente. Und sobald Sie eine Datenbankstruktur haben, mit der Sie mit Ghost zufrieden sind, sollte die Replikation dieser Struktur in Ihrer Produktionsdatenbank problemlos sein.

Weitere Informationen zur Verwendung von Ghost und eine vollständige Dokumentation finden Sie auf der offiziellen Homepage unten.

https://ghost.construct/docs/#introduction

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert