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"] });
|
||||
|
||||
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({
|
||||
|
||||
@@ -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" />
|
||||
|
||||
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