feat: comprehensive SEO — meta tags, OG, Twitter cards, JSON-LD, sitemap, robots, llms.txt

Adds metadataBase, full OpenGraph + Twitter card tags, keywords,
JSON-LD structured data (SoftwareApplication + Organization),
sitemap.ts, robots.ts with AI crawler directives, and llms.txt
for AI agent discoverability.
This commit is contained in:
Vectry
2026-02-10 02:21:16 +00:00
parent d91fdfc81a
commit 145b1669e7
5 changed files with 175 additions and 2 deletions

50
apps/web/public/llms.txt Normal file
View File

@@ -0,0 +1,50 @@
# AgentLens
> AgentLens is an open-source agent observability platform that traces AI agent decisions, not just API calls. It captures why agents choose specific tools, routes, or strategies — providing visibility into the reasoning behind every action.
AgentLens helps engineering teams debug, monitor, and improve AI agent applications in production. Unlike traditional LLM observability tools that only trace API calls, AgentLens captures the decision-making process: tool selection rationale, routing logic, retry strategies, and planning steps. It includes a real-time dashboard with decision tree visualization, cost analytics, and token tracking.
## Getting Started
- [GitHub Repository](https://gitea.repi.fun/repi/agentlens): Source code, issues, and contribution guide
- [PyPI Package](https://pypi.org/project/vectry-agentlens/): Install with `pip install vectry-agentlens`
- [Dashboard](https://agentlens.vectry.tech/dashboard): Live demo dashboard with sample traces
## Python SDK
- [Basic Usage](https://gitea.repi.fun/repi/agentlens/src/branch/main/examples/basic_agent.py): Minimal SDK usage with trace context and decision logging
- [OpenAI Integration](https://gitea.repi.fun/repi/agentlens/src/branch/main/examples/openai_agent.py): Wrap OpenAI client for automatic LLM call tracing
- [Multi-Agent Example](https://gitea.repi.fun/repi/agentlens/src/branch/main/examples/multi_agent.py): Nested multi-agent workflow tracing
- [Function Calling](https://gitea.repi.fun/repi/agentlens/src/branch/main/examples/moonshot_real_test.py): Real LLM test with tool/function calling
## Key Concepts
- **Traces**: Top-level containers for agent execution sessions, with tags and metadata
- **Spans**: Individual operations within a trace (LLM calls, tool calls, chain steps)
- **Decision Points**: The core differentiator — captures what was chosen, what alternatives existed, and why
- **Decision Types**: TOOL_SELECTION, ROUTING, RETRY, ESCALATION, MEMORY_RETRIEVAL, PLANNING, CUSTOM
## API
- POST /api/traces: Batch ingest traces from SDK (Bearer token auth)
- GET /api/traces: List traces with pagination, search, filters, and sorting
- GET /api/traces/:id: Get single trace with all spans, decisions, and events
- GET /api/traces/stream: Server-Sent Events for real-time trace updates
- GET /api/health: Health check endpoint
## Integrations
- **OpenAI**: `wrap_openai(client)` auto-instruments all chat completions, streaming, and tool calls
- **LangChain**: `AgentLensCallbackHandler` captures chains, agents, tools, and LLM calls
- **Any Python Code**: `@trace` decorator and `log_decision()` for custom instrumentation
## Self-Hosting
- Docker Compose deployment with PostgreSQL and Redis
- Single `docker compose up -d` to run
- Environment variables: DATABASE_URL, REDIS_URL, AGENTLENS_API_KEY
## Optional
- [Company Website](https://vectry.tech): Built by Vectry, an engineering-first AI consultancy
- [CodeBoard](https://codeboard.vectry.tech): Sister product — understand any codebase in 5 minutes

View File

@@ -5,8 +5,63 @@ import "./globals.css";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "AgentLens",
description: "Agent observability that traces decisions, not just API calls",
metadataBase: new URL("https://agentlens.vectry.tech"),
title: {
default: "AgentLens — Agent Observability Platform",
template: "%s | AgentLens",
},
description:
"Open-source agent observability that traces decisions, not just API calls. Monitor AI agent reasoning, tool selection, and routing in real-time.",
keywords: [
"agent observability",
"AI monitoring",
"LLM tracing",
"agent decisions",
"AI debugging",
"tool selection tracing",
"multi-agent observability",
"open source",
],
authors: [{ name: "Vectry" }],
creator: "Vectry",
openGraph: {
type: "website",
locale: "en_US",
url: "https://agentlens.vectry.tech",
siteName: "AgentLens",
title: "AgentLens — Agent Observability Platform",
description:
"Open-source agent observability that traces decisions, not just API calls. Monitor AI agent reasoning, tool selection, and routing in real-time.",
images: [
{
url: "/og-image.png",
width: 1200,
height: 630,
alt: "AgentLens — Agent Observability Platform",
},
],
},
twitter: {
card: "summary_large_image",
title: "AgentLens — Agent Observability Platform",
description:
"Open-source agent observability that traces decisions, not just API calls. Monitor AI agent reasoning, tool selection, and routing in real-time.",
images: ["/og-image.png"],
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-video-preview": -1,
"max-image-preview": "large",
"max-snippet": -1,
},
},
alternates: {
canonical: "https://agentlens.vectry.tech",
},
};
export default function RootLayout({

View File

@@ -20,6 +20,43 @@ import {
export default function HomePage() {
return (
<div className="min-h-screen bg-neutral-950">
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
"@context": "https://schema.org",
"@type": "SoftwareApplication",
name: "AgentLens",
applicationCategory: "DeveloperApplication",
operatingSystem: "Web",
url: "https://agentlens.vectry.tech",
description:
"Open-source agent observability platform that traces AI agent decisions, not just API calls.",
offers: { "@type": "Offer", price: "0", priceCurrency: "USD" },
featureList: [
"Agent Decision Tracing",
"Real-time Dashboard",
"OpenAI Integration",
"LangChain Integration",
"Self-hosting Support",
"Python SDK",
],
}),
}}
/>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
"@context": "https://schema.org",
"@type": "Organization",
name: "Vectry",
url: "https://vectry.tech",
logo: "https://vectry.tech/static/img/logo-icon.png",
sameAs: ["https://gitea.repi.fun/repi/agentlens"],
}),
}}
/>
{/* Hero Section */}
<section className="relative overflow-hidden border-b border-neutral-800/50">
<div className="absolute inset-0 bg-gradient-to-b from-emerald-500/5 via-transparent to-transparent" />

View File

@@ -0,0 +1,22 @@
import { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [
{ userAgent: "GPTBot", allow: "/" },
{ userAgent: "ChatGPT-User", allow: "/" },
{ userAgent: "ClaudeBot", allow: "/" },
{ userAgent: "PerplexityBot", allow: "/" },
{ userAgent: "Applebot-Extended", allow: "/" },
{ userAgent: "CCBot", disallow: "/" },
{ userAgent: "Google-Extended", disallow: "/" },
{ userAgent: "Bytespider", disallow: "/" },
{
userAgent: "*",
allow: "/",
disallow: ["/api/", "/dashboard/"],
},
],
sitemap: "https://agentlens.vectry.tech/sitemap.xml",
};
}

View File

@@ -0,0 +1,9 @@
import { MetadataRoute } from "next";
export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = "https://agentlens.vectry.tech";
return [
{ url: baseUrl, lastModified: new Date(), changeFrequency: "weekly", priority: 1.0 },
{ url: `${baseUrl}/dashboard`, lastModified: new Date(), changeFrequency: "daily", priority: 0.8 },
];
}