Ask Abdo

A grounded AI portfolio guide that answers from current public data, finds projects, articles, and photos, and renders every destination from current data supplied by the server.
Overview
AI Systems / AI guide
Ask Abdo is a public AI guide for abdok.dev that helps visitors explore projects, articles, photography, résumé details, and professional links through a grounded chat experience. It streams answers through Vercel AI SDK and Gemini, but rebuilds trusted public evidence on every request, ignores client-supplied tool output as factual authority, and materializes every selected destination from canonical server data. The model may choose stable resource keys and follow-up prompts; the application owns the current titles, descriptions, URLs, media, and result states. Photography retrieval supports exact ID/title lookup, bounded tag/location filters, filter-only searches, and explicit public facet inventory.
Technical stack
4 stack groups
AI & Response Orchestration
4 instruments in this layerKey features
7 capability groups
Answers from Trusted Portfolio Data
4 implementation notes- 01
Generates public portfolio answers through Vercel AI SDK and Gemini, streaming text and tool events directly while appending canonical resource manifests at completion.
- 02
Rebuilds a compact public evidence packet on every request instead of trusting stale client-side tool results.
- 03
Resolves exact project and published-blog current-page context server-side from the pathname.
- 04
Keeps client history as text-only conversational context rather than authoritative evidence.
Architecture notes
11 recorded decisions
- 01
Designed a trust boundary where client messages can guide conversation but never provide authoritative project, article, resume, social, or photo evidence.
- 02
Supports optional terminal stable-key presentation in the same final model step as the streamed answer, avoiding a separate provider round trip for resource cards and suggestions.
- 03
Implemented a UI-stream transform that appends canonical resource manifests to the live message stream at completion without buffering or suppressing prose.
- 04
Added saved-chat rehydration that refreshes canonical attachment data instead of preserving stale local snapshots.
- 05
Built a model-only response suggestion pipeline with suggestions-only persistence, client-side cleanup, and no deterministic post-answer fallback generation.
- 06
Hardened the assistant prompt boundary so the model does not narrate tool calls, card registration, or UI attachment behavior inside answer prose.
- 07
Created a Batwick-driven assistant shell with a conversation-level Resources library, contextual response actions, canonical inline popovers, photo-modal actions, and route-aware starter prompts.
- 08
Added exact-ID/title photo retrieval, bounded named tag/location filters, filter-only provider avoidance, and public facet inventory while preserving the server-owned photo boundary.
- 09
Implemented immutable message editing with bounded edit history, descendant truncation confirmation, cross-tab tombstones, and generation invalidation.
- 10
Built a production-server real-model evaluation harness with parallel execution, per-prompt traces, provenance hashes, step limit checks, semantic advisories, and catalog-driven article coverage.
- 11
Added persistent per-conversation transports and authoritative backend concurrency leases (signed visitor cookie + Redis Lua scripts) enforcing two active generations, cancellation grace caps, idempotency, status reconciliation, same-tab background generation, cross-tab coordination, and refresh-safe terminal recovery.
Project status
2 status records
Core Assistant & Concurrency Implemented
10 recorded items- 01
Correctness-first portfolio assistant route with trusted evidence building, request validation, rate limiting, bounded public tools, and live UI-message stream delivery.
- 02
Optional model-owned resource presentation plus canonical materialization for projects, published articles, photos, social links, and resume resources.
- 03
Responsive assistant UI with Batwick mascot, history drawer, message rendering, suggestions, and recruiter quick actions.
- 04
Model-only response follow-ups with suggestions-only turns, shared filtering and deduplication, and separate deterministic empty-chat starters.
- 05
Saved conversation references with fresh server-side attachment rehydration.
- 06
Conversation-level Resources with newest-first deduplication, category-aware response affordances, exact-route Currently viewing treatment, canonical inline actions, and direct photo-modal opening.
- 07
Exact photo ID/title retrieval, filter-first named tag/location search, filter-only provider avoidance, and explicit public facet inventory.
- 08
Immutable message editing with bounded history, confirmed descendant truncation, cross-tab tombstones, and stale-generation invalidation.
- 09
Cross-tab background generation registry with persistent conversation hosts, signed visitor cookies, atomic Upstash Redis leases, revisioned status coordination, pending-generation recovery, terminal-result adoption, and History drawer active-generation controls.
- 10
Real-model starter evaluations with production builds, parallel runner support, observable tool traces, prompt-specific rubrics, and schema/provenance artifacts.