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:
50
apps/web/public/llms.txt
Normal file
50
apps/web/public/llms.txt
Normal 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
|
||||||
@@ -5,8 +5,63 @@ import "./globals.css";
|
|||||||
const inter = Inter({ subsets: ["latin"] });
|
const inter = Inter({ subsets: ["latin"] });
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "AgentLens",
|
metadataBase: new URL("https://agentlens.vectry.tech"),
|
||||||
description: "Agent observability that traces decisions, not just API calls",
|
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({
|
export default function RootLayout({
|
||||||
|
|||||||
@@ -20,6 +20,43 @@ import {
|
|||||||
export default function HomePage() {
|
export default function HomePage() {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-neutral-950">
|
<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 */}
|
{/* Hero Section */}
|
||||||
<section className="relative overflow-hidden border-b border-neutral-800/50">
|
<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" />
|
<div className="absolute inset-0 bg-gradient-to-b from-emerald-500/5 via-transparent to-transparent" />
|
||||||
|
|||||||
22
apps/web/src/app/robots.ts
Normal file
22
apps/web/src/app/robots.ts
Normal 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",
|
||||||
|
};
|
||||||
|
}
|
||||||
9
apps/web/src/app/sitemap.ts
Normal file
9
apps/web/src/app/sitemap.ts
Normal 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 },
|
||||||
|
];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user