Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions .github/workflows/docs-deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Deploy Docs

on:
push:
branches: [main, docs/temp-site]
paths:
- "docs/stable/**"
- "docs/docs.json"
- "apps/docs-site/**"
- ".github/workflows/docs-deploy.yml"
pull_request:
paths:
- "docs/stable/**"
- "docs/docs.json"
- "apps/docs-site/**"
- ".github/workflows/docs-deploy.yml"
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: ./.github/actions/setup
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: mise run docs-site:build
env:
BASE_PATH: /adk
- uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
with:
path: apps/docs-site/out

deploy:
if: github.event_name != 'pull_request'
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- id: deployment
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
69 changes: 39 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,51 +1,60 @@
# Kagenti Agent Development Kit
# Kagenti ADK

**The developer toolkit for getting agents into production.**

[![GitHub Release](https://img.shields.io/github/v/release/kagenti/adk)](https://github.com/kagenti/adk/releases/latest)
[![License](https://img.shields.io/github/license/kagenti/adk)](LICENSE)
[![Discord](https://img.shields.io/badge/Discord-Join%20us-5865F2?logo=discord&logoColor=white)](https://discord.gg/aJ92dNDzqB)

> 🚧 This project is under active development and not yet ready for use.
[Documentation](https://kagenti.github.io/adk) · [Discord](https://discord.gg/aJ92dNDzqB) · [Contributing](./CONTRIBUTING.md)

---

## What is Kagenti ADK?
Kagenti ADK (Agent Development Kit) takes agents built with any framework or custom code and turns them into A2A-compliant services.

> [!WARNING]
> This project is under active development and not yet ready for production use.

Kagenti ADK (Agent Development Kit) takes agents built with any framework or custom code and turns them into [A2A](https://a2a-protocol.org/)-compliant services.
## What's in the kit

It provides:
| Component | Description |
|---|---|
| **CLI** | Scaffold projects, run agents locally, and deploy |
| **Python SDK** | Wrap your agent with A2A, inject runtime services via dependency injection |
| **TypeScript Client SDK** | Build applications that talk to your agents |
| **Server** | Self-hostable runtime with everything below built in |

- A **Python SDK** to expose your agent over A2A and connect it to the runtime services below
- A **TypeScript client SDK** to build applications that talk to your agents
- A **CLI** to scaffold projects, run agents, and deploy
- A **server** with built-in runtime services your agents use:
- **LLM proxy** — single API for 15+ providers (OpenAI, Anthropic, watsonx.ai, Bedrock, Ollama, and more)
- **MCP connectors** — connect agents to external tools and APIs via the [Model Context Protocol](https://modelcontextprotocol.io/)
- **Database (PostgreSQL)** — agent state, conversation history, and configuration
- **Vector search (pgvector)** — embeddings and similarity search for RAG workflows
- **File storage (SeaweedFS)** — S3-compatible upload, download, and storage
- **Document extraction (Docling)** — text extraction from PDFs, CSVs, and other formats
- **Authentication (Keycloak)** — identity and access management
- **Observability (Phoenix)** — LLM tracing and agent debugging
- **End user web UI** — chat interface for interacting with your agents
### Runtime services

## Status
| Service | What it does |
|---|---|
| **LLM proxy** | Single API for 15+ providers — OpenAI, Anthropic, watsonx.ai, Bedrock, Ollama |
| **MCP connectors** | Connect agents to external tools via [Model Context Protocol](https://modelcontextprotocol.io/) |
| **PostgreSQL** | Agent state, conversation history, and configuration |
| **Vector search** | pgvector for embeddings and similarity search |
| **File storage** | S3-compatible upload/download via SeaweedFS |
| **Document extraction** | Text extraction from PDFs, CSVs, and more via Docling |
| **Authentication** | Identity and access management via Keycloak |
| **Observability** | LLM tracing and agent debugging via Phoenix |
| **Web UI** | Built-in chat interface for testing your agents |

This project is under active development. Documentation, packages, and an initial release are coming soon.
## Quick start

## Contributing
```bash
sh -c "$(curl -LsSf https://raw.githubusercontent.com/kagenti/adk/main/install.sh)"
```

We welcome contributions! See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
## Get involved

## Contact
We'd love to hear from you — whether you have questions, feedback, or want to contribute.

To reach the maintainer team, email **kagenti-maintainers@googlegroups.com** or join us on [Discord](https://discord.gg/aJ92dNDzqB).
| | |
|---|---|
| **Discord** | [Join the community](https://discord.gg/aJ92dNDzqB) |
| **Email** | kagenti-maintainers@googlegroups.com |
| **Contributing** | [Read the guide](./CONTRIBUTING.md) |
| **Issues** | [Report a bug or request a feature](https://github.com/kagenti/adk/issues) |

## License

[Apache 2.0](./LICENSE)

## QR Code for Kagenti.io

This QR Code links to <http://kagenti.io>

![Kagenti.io QR Code](./docs/stable/images/Kagenti.QRcode.png)
2 changes: 2 additions & 0 deletions apps/docs-site/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.next/
out/
25 changes: 25 additions & 0 deletions apps/docs-site/next.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/**
* Copyright 2025 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import type { NextConfig } from "next";

const nextConfig: NextConfig = {
output: "export",
basePath: process.env.BASE_PATH || "",
images: { unoptimized: true },
};

export default nextConfig;
23 changes: 23 additions & 0 deletions apps/docs-site/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "@kagenti/docs-site",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "next dev --port 3334",
"build": "next build",
"start": "next start"
},
"dependencies": {
"gray-matter": "^4.0.3",
"next": "^15.3.0",
"next-mdx-remote": "^5.0.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"remark-gfm": "^4.0.0"
},
"devDependencies": {
"@types/node": "^22.0.0",
"@types/react": "^19.0.0",
"typescript": "^5.7.0"
}
}
115 changes: 115 additions & 0 deletions apps/docs-site/src/app/[version]/[...slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/**
* Copyright 2025 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import Link from "next/link";
import { notFound } from "next/navigation";
import { MDXRemote } from "next-mdx-remote/rsc";
import remarkGfm from "remark-gfm";
import { getAllPages, getPage, getNavGroups } from "@/lib/docs";
import { mintlifyComponents } from "@/components/mintlify";

export function generateStaticParams() {
return getAllPages()
.filter(({ version }) => version === "stable")
.map(({ version, slug }) => ({
version,
slug,
}));
}

function Sidebar({
version,
currentSlug,
}: {
version: string;
currentSlug: string;
}) {
const groups = getNavGroups(version);

return (
<nav className="sidebar">
<div className="sidebar-header">Kagenti ADK</div>
{groups.map((group) => (
<div key={group.group}>
<div className="nav-group-title">{group.group}</div>
{group.pages.map((page) => {
if (typeof page !== "string") return null;
const parts = page.split("/");
const slug = parts.slice(1).join("/");
const label = parts[parts.length - 1]
.replace(/-/g, " ")
.replace(/\b\w/g, (c) => c.toUpperCase());
return (
<Link
key={page}
href={`/${page}`}
className={`nav-link${slug === currentSlug ? " active" : ""}`}
>
{label}
</Link>
);
})}
</div>
))}
</nav>
);
}

export default async function DocPage({
params,
}: {
params: Promise<{ version: string; slug: string[] }>;
}) {
const { version, slug } = await params;
const page = getPage(version, slug);

if (!page) {
notFound();
}

// Strip embedme comments and HTML style string attributes (MDX requires object syntax)
const cleanContent = page.content
.replace(/\{\/\*\s*<!--\s*embedme\s+[^>]+-->\s*\*\/\}/g, "")
.replace(/\sstyle="[^"]*"/g, "");

return (
<div className="layout">
<Sidebar version={version} currentSlug={slug.join("/")} />
<main className="main-content">
<div className="callout callout-warning" style={{ marginBottom: "1.5rem" }}>
<div className="callout-content">
This documentation is under construction. Content may be incomplete or undergoing change.
</div>
</div>
<h1 className="page-title">{page.title}</h1>
{page.description && (
<p className="page-description">{page.description}</p>
)}
<div className="prose">
<MDXRemote
source={cleanContent}
components={mintlifyComponents}
options={{
mdxOptions: {
remarkPlugins: [remarkGfm],
},
}}
/>
</div>
</main>
</div>
);
}
Loading
Loading