Compare commits
121 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c4f4a8d83 | |||
| 620c63cd19 | |||
| cb51ad90ea | |||
| 359fd33041 | |||
| efb7e1b868 | |||
| 98ba1e71bd | |||
| fd4b09d375 | |||
| 7c90e1b6b4 | |||
| 21ba0a80d1 | |||
| 9df9a8fc1d | |||
| 60b185ff53 | |||
| ca75c81bc0 | |||
| 691c5bcaf1 | |||
| 9ab998c5d5 | |||
| 938b417028 | |||
| fa60fc66ae | |||
| 5607ed2fec | |||
| f57ad6150e | |||
| 2486bd8f41 | |||
| e2a0876ddd | |||
| a75d899a57 | |||
| 809a6e7eea | |||
| da6eb6474b | |||
| cd83f8ee4f | |||
| 534d5505cb | |||
| eb87b96518 | |||
| 9510d45046 | |||
| 9b5b012fdf | |||
| a5a75f618d | |||
| 051faddefd | |||
| 9f22aae57c | |||
| e9a111d9d3 | |||
| bb7622e4d4 | |||
| 06f632b2cb | |||
| 76b925e62a | |||
| 0493f679a4 | |||
| 0e0a627c9a | |||
| 4ba2cfe7ab | |||
| c1578a19d9 | |||
| ae49ff4e15 | |||
| a75af835a5 | |||
| 7c7cd34908 | |||
| f651891196 | |||
| 04714c886f | |||
| cf28574f51 | |||
| 24d065f054 | |||
| b8719586e3 | |||
| 07a40aca49 | |||
| 33b562938d | |||
| 723b41c23c | |||
| 4c38c1be0b | |||
| 0dde0ca27f | |||
| f3e0d07f48 | |||
| 1364e8eeed | |||
| 96fc69cc61 | |||
| 3b7736f763 | |||
| a7a7afe66e | |||
| c646ee2eca | |||
| 5729bd92fd | |||
| e0e52cf879 | |||
| 6f75306c17 | |||
| 94cb4ad810 | |||
| 1ea4014746 | |||
| 6a9a7b1458 | |||
| 1c168cd531 | |||
| 62cba5236d | |||
| d265e96420 | |||
| d30bbf799f | |||
| 53fd00a7c3 | |||
| 83f2848d47 | |||
| 313071e9cd | |||
| 5f6782038a | |||
| fe08d0451b | |||
| 59c5e5c3d4 | |||
| ee697fb1b3 | |||
| cf3320a4ea | |||
| f2ed69f2f8 | |||
| 3489e7de84 | |||
| 468bda594e | |||
| 6f3a31caf6 | |||
| 63e9846e97 | |||
| b7382b0d24 | |||
| 2a8241328d | |||
| 0b20ff9f17 | |||
| 1fc26046e3 | |||
| b17d439d6d | |||
| 040160c360 | |||
| 981811efd1 | |||
| d563b45a27 | |||
| 2774e80234 | |||
| 449274ca5a | |||
| 78037a664c | |||
| 1d9e3b1000 | |||
| df83e32107 | |||
| f7b4e94231 | |||
| 4c07a2655d | |||
| 5c0c8b2ec4 | |||
| e5e18688a6 | |||
| b6fb10eba8 | |||
| df441e28f4 | |||
| a4e05ec7ab | |||
| 96f72ad86e | |||
| f3556c011c | |||
| ebc510582b | |||
| f3bfdc29e3 | |||
| 6cce3b12ea | |||
| 0273e9739a | |||
| 7c8b883448 | |||
| c2bb418542 | |||
| ed6acbead0 | |||
| 976cce40d7 | |||
| e4fd4158bb | |||
| 31d5dffcef | |||
| d12edee802 | |||
| ac41ed3aae | |||
| d8c1159032 | |||
| c856c5becb | |||
| 50e6b57be0 | |||
| 8b7fdba544 | |||
| 22ae8d0166 | |||
| 23bcc379a8 |
@@ -0,0 +1,46 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ""
|
||||
labels: bug
|
||||
assignees: ""
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Code to reproduce the behavior:
|
||||
|
||||
```ts
|
||||
// paste the code here
|
||||
```
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
|
||||
- OS: [e.g. macOS, Linux]
|
||||
- JS Runtime / Framework / Bundler (select all applicable)
|
||||
- [ ] Node.js
|
||||
- [ ] Deno
|
||||
- [ ] Bun
|
||||
- [ ] Next.js
|
||||
- [ ] ESBuild
|
||||
- [ ] Rollup
|
||||
- [ ] Webpack
|
||||
- [ ] Turbopack
|
||||
- [ ] Vite
|
||||
- [ ] Waku
|
||||
- [ ] Edge Runtime
|
||||
- [ ] AWS Lambda
|
||||
- [ ] Cloudflare Worker
|
||||
- [ ] Others (please elaborate on this)
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
@@ -25,4 +25,4 @@ jobs:
|
||||
run: pnpm run build
|
||||
|
||||
- name: Pre Release
|
||||
run: pnpx pkg-pr-new publish ./packages/*
|
||||
run: pnpx pkg-pr-new publish ./packages/* ./packages/providers/*
|
||||
|
||||
@@ -89,13 +89,7 @@ jobs:
|
||||
- name: Run Type Check
|
||||
run: pnpm run type-check
|
||||
- name: Run Circular Dependency Check
|
||||
run: pnpm dlx turbo run circular-check
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: typecheck-build-dist
|
||||
path: ./packages/llamaindex/dist
|
||||
if-no-files-found: error
|
||||
run: pnpm run circular-check
|
||||
e2e-llamaindex-examples:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -142,27 +136,36 @@ jobs:
|
||||
run: pnpm run build
|
||||
- name: Copy examples
|
||||
run: rsync -rv --exclude=node_modules ./examples ${{ runner.temp }}
|
||||
- name: Pack @llamaindex/cloud
|
||||
run: pnpm pack --pack-destination ${{ runner.temp }}
|
||||
working-directory: packages/cloud
|
||||
- name: Pack @llamaindex/openai
|
||||
run: pnpm pack --pack-destination ${{ runner.temp }}
|
||||
working-directory: packages/llm/openai
|
||||
- name: Pack @llamaindex/groq
|
||||
run: pnpm pack --pack-destination ${{ runner.temp }}
|
||||
working-directory: packages/llm/groq
|
||||
- name: Pack @llamaindex/core
|
||||
run: pnpm pack --pack-destination ${{ runner.temp }}
|
||||
working-directory: packages/core
|
||||
- name: Pack @llamaindex/env
|
||||
run: pnpm pack --pack-destination ${{ runner.temp }}
|
||||
working-directory: packages/env
|
||||
- name: Pack llamaindex
|
||||
run: pnpm pack --pack-destination ${{ runner.temp }}
|
||||
working-directory: packages/llamaindex
|
||||
- name: Pack packages
|
||||
run: |
|
||||
for dir in packages/*; do
|
||||
if [ -d "$dir" ] && [ -f "$dir/package.json" ] && [[ ! "$dir" =~ autotool ]]; then
|
||||
echo "Packing $dir"
|
||||
pnpm pack --pack-destination ${{ runner.temp }} -C $dir
|
||||
else
|
||||
echo "Skipping $dir, no package.json found"
|
||||
fi
|
||||
done
|
||||
- name: Pack provider packages
|
||||
run: |
|
||||
for dir in packages/providers/*; do
|
||||
if [ -d "$dir" ] && [ -f "$dir/package.json" ]; then
|
||||
echo "Packing $dir"
|
||||
pnpm pack --pack-destination ${{ runner.temp }} -C $dir
|
||||
else
|
||||
echo "Skipping $dir, no package.json found"
|
||||
fi
|
||||
done
|
||||
- name: Install
|
||||
run: npm add ${{ runner.temp }}/*.tgz
|
||||
working-directory: ${{ runner.temp }}/examples
|
||||
- name: Run Type Check
|
||||
run: npx tsc --project ./tsconfig.json
|
||||
working-directory: ${{ runner.temp }}/examples
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: build-dist
|
||||
path: |
|
||||
${{ runner.temp }}/*.tgz
|
||||
if-no-files-found: error
|
||||
|
||||
@@ -4,3 +4,6 @@ pnpm-lock.yaml
|
||||
lib/
|
||||
dist/
|
||||
.docusaurus/
|
||||
.source/
|
||||
# prttier doesn't support mdx3 we are using
|
||||
*.mdx
|
||||
|
||||
@@ -13,5 +13,6 @@
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
}
|
||||
},
|
||||
"prettier.prettierPath": "./node_modules/prettier"
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
LlamaIndex is a data framework for your LLM application.
|
||||
|
||||
Use your own data with large language models (LLMs, OpenAI ChatGPT and others) in Typescript and Javascript.
|
||||
Use your own data with large language models (LLMs, OpenAI ChatGPT and others) in JS runtime environments with TypeScript support.
|
||||
|
||||
Documentation: https://ts.llamaindex.ai/
|
||||
|
||||
@@ -19,17 +19,36 @@ Try examples online:
|
||||
|
||||
LlamaIndex.TS aims to be a lightweight, easy to use set of libraries to help you integrate large language models into your applications with your own data.
|
||||
|
||||
## Multiple JS Environment Support
|
||||
## Compatibility
|
||||
|
||||
### Multiple JS Environment Support
|
||||
|
||||
LlamaIndex.TS supports multiple JS environments, including:
|
||||
|
||||
- Node.js (18, 20, 22) ✅
|
||||
- Deno ✅
|
||||
- Bun ✅
|
||||
- React Server Components (Next.js) ✅
|
||||
- Nitro ✅
|
||||
- Vercel Edge Runtime ✅ (with some limitations)
|
||||
- Cloudflare Workers ✅ (with some limitations)
|
||||
|
||||
For now, browser support is limited due to the lack of support for [AsyncLocalStorage-like APIs](https://github.com/tc39/proposal-async-context)
|
||||
|
||||
### Supported LLMs:
|
||||
|
||||
- OpenAI LLms
|
||||
- Anthropic LLms
|
||||
- Groq LLMs
|
||||
- Llama2, Llama3, Llama3.1 LLMs
|
||||
- MistralAI LLMs
|
||||
- Fireworks LLMs
|
||||
- DeepSeek LLMs
|
||||
- ReplicateAI LLMs
|
||||
- TogetherAI LLMs
|
||||
- HuggingFace LLms
|
||||
- DeepInfra LLMs
|
||||
- Gemini LLMs
|
||||
|
||||
## Getting started
|
||||
|
||||
```shell
|
||||
@@ -77,7 +96,7 @@ See more about [moduleResolution](https://www.typescriptlang.org/docs/handbook/m
|
||||
### Node.js
|
||||
|
||||
```ts
|
||||
import fs from "fs/promises";
|
||||
import fs from "node:fs/promises";
|
||||
import { Document, VectorStoreIndex } from "llamaindex";
|
||||
|
||||
async function main() {
|
||||
@@ -111,9 +130,9 @@ main();
|
||||
node --import tsx ./main.ts
|
||||
```
|
||||
|
||||
### React Server Component (Next.js, Waku, Redwood.JS...)
|
||||
### Next.js
|
||||
|
||||
First, you will need to add a llamaindex plugin to your Next.js project.
|
||||
You will need to add a llamaindex plugin to your Next.js project.
|
||||
|
||||
```js
|
||||
// next.config.js
|
||||
@@ -124,20 +143,18 @@ module.exports = withLlamaIndex({
|
||||
});
|
||||
```
|
||||
|
||||
You can combine `ai` with `llamaindex` in Next.js with RSC (React Server Components).
|
||||
### React Server Actions
|
||||
|
||||
You can combine `ai` with `llamaindex` in Next.js, Waku or Redwood.js with RSC (React Server Components).
|
||||
|
||||
```tsx
|
||||
// src/apps/page.tsx
|
||||
"use client";
|
||||
import { chatWithAgent } from "@/actions";
|
||||
import type { JSX } from "react";
|
||||
import { useFormState } from "react-dom";
|
||||
|
||||
// You can use the Edge runtime in Next.js by adding this line:
|
||||
// export const runtime = "edge";
|
||||
import { useActionState } from "react";
|
||||
|
||||
export default function Home() {
|
||||
const [ui, action] = useFormState<JSX.Element | null>(async () => {
|
||||
const [ui, action] = useActionState<JSX.Element | null>(async () => {
|
||||
return chatWithAgent("hello!", []);
|
||||
}, null);
|
||||
return (
|
||||
@@ -167,11 +184,13 @@ export async function chatWithAgent(
|
||||
// ... adding your tools here
|
||||
],
|
||||
});
|
||||
const responseStream = await agent.chat({
|
||||
stream: true,
|
||||
message: question,
|
||||
chatHistory: prevMessages,
|
||||
});
|
||||
const responseStream = await agent.chat(
|
||||
{
|
||||
message: question,
|
||||
chatHistory: prevMessages,
|
||||
},
|
||||
true,
|
||||
);
|
||||
const uiStream = createStreamableUI(<div>loading...</div>);
|
||||
responseStream
|
||||
.pipeTo(
|
||||
@@ -189,6 +208,48 @@ export async function chatWithAgent(
|
||||
}
|
||||
```
|
||||
|
||||
### Cloudflare Workers
|
||||
|
||||
> [!TIP]
|
||||
> Some modules are not supported in Cloudflare Workers which require Node.js APIs.
|
||||
|
||||
```ts
|
||||
// add `OPENAI_API_KEY` to the `.dev.vars` file
|
||||
interface Env {
|
||||
OPENAI_API_KEY: string;
|
||||
}
|
||||
|
||||
export default {
|
||||
async fetch(
|
||||
request: Request,
|
||||
env: Env,
|
||||
ctx: ExecutionContext,
|
||||
): Promise<Response> {
|
||||
const { OpenAIAgent, OpenAI } = await import("@llamaindex/openai");
|
||||
const text = await request.text();
|
||||
const agent = new OpenAIAgent({
|
||||
llm: new OpenAI({
|
||||
apiKey: env.OPENAI_API_KEY,
|
||||
}),
|
||||
tools: [],
|
||||
});
|
||||
const responseStream = await agent.chat({
|
||||
stream: true,
|
||||
message: text,
|
||||
});
|
||||
const textEncoder = new TextEncoder();
|
||||
const response = responseStream.pipeThrough<Uint8Array>(
|
||||
new TransformStream({
|
||||
transform: (chunk, controller) => {
|
||||
controller.enqueue(textEncoder.encode(chunk.delta));
|
||||
},
|
||||
}),
|
||||
);
|
||||
return new Response(response);
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
### Vite
|
||||
|
||||
We have some wasm dependencies for better performance. You can use `vite-plugin-wasm` to load them.
|
||||
@@ -204,29 +265,9 @@ export default {
|
||||
};
|
||||
```
|
||||
|
||||
## Playground
|
||||
### Tips when using in non-Node.js environments
|
||||
|
||||
Check out our NextJS playground at https://llama-playground.vercel.app/. The source is available at https://github.com/run-llama/ts-playground
|
||||
|
||||
## Core concepts for getting started:
|
||||
|
||||
- [Document](/packages/llamaindex/src/Node.ts): A document represents a text file, PDF file or other contiguous piece of data.
|
||||
|
||||
- [Node](/packages/llamaindex/src/Node.ts): The basic data building block. Most commonly, these are parts of the document split into manageable pieces that are small enough to be fed into an embedding model and LLM.
|
||||
|
||||
- [Embedding](/packages/llamaindex/src/embeddings/OpenAIEmbedding.ts): Embeddings are sets of floating point numbers which represent the data in a Node. By comparing the similarity of embeddings, we can derive an understanding of the similarity of two pieces of data. One use case is to compare the embedding of a question with the embeddings of our Nodes to see which Nodes may contain the data needed to answer that question. Because the default service context is OpenAI, the default embedding is `OpenAIEmbedding`. If using different models, say through Ollama, use this [Embedding](/packages/llamaindex/src/embeddings/OllamaEmbedding.ts) (see all [here](/packages/llamaindex/src/embeddings)).
|
||||
|
||||
- [Indices](/packages/llamaindex/src/indices/): Indices store the Nodes and the embeddings of those nodes. QueryEngines retrieve Nodes from these Indices using embedding similarity.
|
||||
|
||||
- [QueryEngine](/packages/llamaindex/src/engines/query/RetrieverQueryEngine.ts): Query engines are what generate the query you put in and give you back the result. Query engines generally combine a pre-built prompt with selected Nodes from your Index to give the LLM the context it needs to answer your query. To build a query engine from your Index (recommended), use the [`asQueryEngine`](/packages/llamaindex/src/indices/BaseIndex.ts) method on your Index. See all query engines [here](/packages/llamaindex/src/engines/query).
|
||||
|
||||
- [ChatEngine](/packages/llamaindex/src/engines/chat/SimpleChatEngine.ts): A ChatEngine helps you build a chatbot that will interact with your Indices. See all chat engines [here](/packages/llamaindex/src/engines/chat).
|
||||
|
||||
- [SimplePrompt](/packages/llamaindex/src/Prompt.ts): A simple standardized function call definition that takes in inputs and formats them in a template literal. SimplePrompts can be specialized using currying and combined using other SimplePrompt functions.
|
||||
|
||||
## Tips when using in non-Node.js environments
|
||||
|
||||
When you are importing `llamaindex` in a non-Node.js environment(such as React Server Components, Cloudflare Workers, etc.)
|
||||
When you are importing `llamaindex` in a non-Node.js environment(such as Vercel Edge, Cloudflare Workers, etc.)
|
||||
Some classes are not exported from top-level entry file.
|
||||
|
||||
The reason is that some classes are only compatible with Node.js runtime,(e.g. `PDFReader`) which uses Node.js specific APIs(like `fs`, `child_process`, `crypto`).
|
||||
@@ -262,19 +303,31 @@ export async function getDocuments() {
|
||||
|
||||
You'll find a complete example with LlamaIndexTS here: https://github.com/run-llama/create_llama_projects/tree/main/nextjs-edge-llamaparse
|
||||
|
||||
## Supported LLMs:
|
||||
## Playground
|
||||
|
||||
- OpenAI GPT-3.5-turbo and GPT-4
|
||||
- Anthropic Claude 3 (Opus, Sonnet, and Haiku) and the legacy models (Claude 2 and Instant)
|
||||
- Groq LLMs
|
||||
- Llama2/3 Chat LLMs (70B, 13B, and 7B parameters)
|
||||
- MistralAI Chat LLMs
|
||||
- Fireworks Chat LLMs
|
||||
Check out our NextJS playground at https://llama-playground.vercel.app/. The source is available at https://github.com/run-llama/ts-playground
|
||||
|
||||
## Core concepts for getting started:
|
||||
|
||||
- [Document](/packages/llamaindex/src/Node.ts): A document represents a text file, PDF file or other contiguous piece of data.
|
||||
|
||||
- [Node](/packages/llamaindex/src/Node.ts): The basic data building block. Most commonly, these are parts of the document split into manageable pieces that are small enough to be fed into an embedding model and LLM.
|
||||
|
||||
- [Embedding](/packages/llamaindex/src/embeddings/OpenAIEmbedding.ts): Embeddings are sets of floating point numbers which represent the data in a Node. By comparing the similarity of embeddings, we can derive an understanding of the similarity of two pieces of data. One use case is to compare the embedding of a question with the embeddings of our Nodes to see which Nodes may contain the data needed to answer that question. Because the default service context is OpenAI, the default embedding is `OpenAIEmbedding`. If using different models, say through Ollama, use this [Embedding](/packages/llamaindex/src/embeddings/OllamaEmbedding.ts) (see all [here](/packages/llamaindex/src/embeddings)).
|
||||
|
||||
- [Indices](/packages/llamaindex/src/indices/): Indices store the Nodes and the embeddings of those nodes. QueryEngines retrieve Nodes from these Indices using embedding similarity.
|
||||
|
||||
- [QueryEngine](/packages/llamaindex/src/engines/query/RetrieverQueryEngine.ts): Query engines are what generate the query you put in and give you back the result. Query engines generally combine a pre-built prompt with selected Nodes from your Index to give the LLM the context it needs to answer your query. To build a query engine from your Index (recommended), use the [`asQueryEngine`](/packages/llamaindex/src/indices/BaseIndex.ts) method on your Index. See all query engines [here](/packages/llamaindex/src/engines/query).
|
||||
|
||||
- [ChatEngine](/packages/llamaindex/src/engines/chat/SimpleChatEngine.ts): A ChatEngine helps you build a chatbot that will interact with your Indices. See all chat engines [here](/packages/llamaindex/src/engines/chat).
|
||||
|
||||
- [SimplePrompt](/packages/llamaindex/src/Prompt.ts): A simple standardized function call definition that takes in inputs and formats them in a template literal. SimplePrompts can be specialized using currying and combined using other SimplePrompt functions.
|
||||
|
||||
## Contributing:
|
||||
|
||||
We are in the very early days of LlamaIndex.TS. If you’re interested in hacking on it with us check out our [contributing guide](/CONTRIBUTING.md)
|
||||
Please see our [contributing guide](CONTRIBUTING.md) for more information.
|
||||
You are highly encouraged to contribute to LlamaIndex.TS!
|
||||
|
||||
## Bugs? Questions?
|
||||
## Community
|
||||
|
||||
Please join our Discord! https://discord.com/invite/eN6D2HQ4aX
|
||||
|
||||
@@ -1,5 +1,215 @@
|
||||
# docs
|
||||
|
||||
## 0.0.103
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [359fd33]
|
||||
- Updated dependencies [efb7e1b]
|
||||
- Updated dependencies [98ba1e7]
|
||||
- Updated dependencies [620c63c]
|
||||
- llamaindex@0.8.0
|
||||
- @llamaindex/examples@0.0.11
|
||||
|
||||
## 0.0.102
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [9df9a8f]
|
||||
- llamaindex@0.7.10
|
||||
|
||||
## 0.0.101
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [691c5bc]
|
||||
- llamaindex@0.7.9
|
||||
|
||||
## 0.0.100
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.7.8
|
||||
|
||||
## 0.0.99
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2486bd8]
|
||||
- @llamaindex/examples@0.0.10
|
||||
- llamaindex@0.7.7
|
||||
|
||||
## 0.0.98
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [534d550]
|
||||
- llamaindex@0.7.6
|
||||
|
||||
## 0.0.97
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [e9a111d]
|
||||
- Updated dependencies [9f22aae]
|
||||
- llamaindex@0.7.5
|
||||
|
||||
## 0.0.96
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.7.4
|
||||
|
||||
## 0.0.95
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.7.3
|
||||
|
||||
## 0.0.94
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.7.2
|
||||
|
||||
## 0.0.93
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [ae49ff4]
|
||||
- Updated dependencies [4c38c1b]
|
||||
- Updated dependencies [a75af83]
|
||||
- Updated dependencies [a75af83]
|
||||
- llamaindex@0.7.1
|
||||
|
||||
## 0.0.92
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [1364e8e]
|
||||
- Updated dependencies [3b7736f]
|
||||
- Updated dependencies [96fc69c]
|
||||
- llamaindex@0.7.0
|
||||
- @llamaindex/examples@0.0.9
|
||||
|
||||
## 0.0.91
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5729bd9]
|
||||
- llamaindex@0.6.22
|
||||
|
||||
## 0.0.90
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [6f75306]
|
||||
- Updated dependencies [94cb4ad]
|
||||
- llamaindex@0.6.21
|
||||
|
||||
## 0.0.89
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [6a9a7b1]
|
||||
- llamaindex@0.6.20
|
||||
|
||||
## 0.0.88
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [62cba52]
|
||||
- Updated dependencies [d265e96]
|
||||
- Updated dependencies [d30bbf7]
|
||||
- Updated dependencies [53fd00a]
|
||||
- llamaindex@0.6.19
|
||||
|
||||
## 0.0.87
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5f67820]
|
||||
- Updated dependencies [fe08d04]
|
||||
- llamaindex@0.6.18
|
||||
|
||||
## 0.0.86
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [ee697fb]
|
||||
- llamaindex@0.6.17
|
||||
|
||||
## 0.0.85
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [63e9846]
|
||||
- Updated dependencies [6f3a31c]
|
||||
- llamaindex@0.6.16
|
||||
|
||||
## 0.0.84
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2a82413]
|
||||
- llamaindex@0.6.15
|
||||
|
||||
## 0.0.83
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.6.14
|
||||
|
||||
## 0.0.82
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.6.13
|
||||
|
||||
## 0.0.81
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f7b4e94]
|
||||
- Updated dependencies [78037a6]
|
||||
- Updated dependencies [1d9e3b1]
|
||||
- llamaindex@0.6.12
|
||||
|
||||
## 0.0.80
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [df441e2]
|
||||
- llamaindex@0.6.11
|
||||
|
||||
## 0.0.79
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [ebc5105]
|
||||
- Updated dependencies [6cce3b1]
|
||||
- llamaindex@0.6.10
|
||||
|
||||
## 0.0.78
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.6.9
|
||||
|
||||
## 0.0.77
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [8b7fdba]
|
||||
- llamaindex@0.6.8
|
||||
|
||||
## 0.0.76
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [23bcc37]
|
||||
- llamaindex@0.6.7
|
||||
|
||||
## 0.0.75
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
---
|
||||
sidebar_position: 14
|
||||
---
|
||||
|
||||
# Context-Aware Agent
|
||||
|
||||
The Context-Aware Agent enhances the capabilities of standard LLM agents by incorporating relevant context from a retriever for each query. This allows the agent to provide more informed and specific responses based on the available information.
|
||||
|
||||
## Usage
|
||||
|
||||
Here's a simple example of how to use the Context-Aware Agent:
|
||||
|
||||
```typescript
|
||||
import {
|
||||
Document,
|
||||
VectorStoreIndex,
|
||||
OpenAIContextAwareAgent,
|
||||
OpenAI,
|
||||
} from "llamaindex";
|
||||
|
||||
async function createContextAwareAgent() {
|
||||
// Create and index some documents
|
||||
const documents = [
|
||||
new Document({
|
||||
text: "LlamaIndex is a data framework for LLM applications.",
|
||||
id_: "doc1",
|
||||
}),
|
||||
new Document({
|
||||
text: "The Eiffel Tower is located in Paris, France.",
|
||||
id_: "doc2",
|
||||
}),
|
||||
];
|
||||
|
||||
const index = await VectorStoreIndex.fromDocuments(documents);
|
||||
const retriever = index.asRetriever({ similarityTopK: 1 });
|
||||
|
||||
// Create the Context-Aware Agent
|
||||
const agent = new OpenAIContextAwareAgent({
|
||||
llm: new OpenAI({ model: "gpt-3.5-turbo" }),
|
||||
contextRetriever: retriever,
|
||||
});
|
||||
|
||||
// Use the agent to answer queries
|
||||
const response = await agent.chat({
|
||||
message: "What is LlamaIndex used for?",
|
||||
});
|
||||
|
||||
console.log("Agent Response:", response.response);
|
||||
}
|
||||
|
||||
createContextAwareAgent().catch(console.error);
|
||||
```
|
||||
|
||||
In this example, the Context-Aware Agent uses the retriever to fetch relevant context for each query, allowing it to provide more accurate and informed responses based on the indexed documents.
|
||||
|
||||
## Key Components
|
||||
|
||||
- `contextRetriever`: A retriever (e.g., from a VectorStoreIndex) that fetches relevant documents or passages for each query.
|
||||
|
||||
## Available Context-Aware Agents
|
||||
|
||||
- `OpenAIContextAwareAgent`: A context-aware agent using OpenAI's models.
|
||||
- `AnthropicContextAwareAgent`: A context-aware agent using Anthropic's models.
|
||||
@@ -4,22 +4,23 @@ While an agent that can perform math is nifty (LLMs are usually not very good at
|
||||
|
||||
To learn more about RAG, we recommend this [introduction](https://docs.llamaindex.ai/en/stable/getting_started/concepts/) from our Python docs. We'll assume you know the basics:
|
||||
|
||||
- You need to parse your source data into chunks of text
|
||||
- You need to encode that text as numbers, called embeddings
|
||||
- You need to search your embeddings for the most relevant chunks of text
|
||||
- You feed your relevant chunks and a query to an LLM to answer a question
|
||||
- Parse your source data into chunks of text.
|
||||
- Encode that text as numbers, called embeddings.
|
||||
- Search your embeddings for the most relevant chunks of text.
|
||||
- Use the relevant chunks along with a query to ask an LLM to generate an answer.
|
||||
|
||||
We're going to start with the same agent we [built in step 1](https://github.com/run-llama/ts-agents/blob/main/1_agent/agent.ts), but make a few changes. You can find the finished version [in the repository](https://github.com/run-llama/ts-agents/blob/main/2_agentic_rag/agent.ts).
|
||||
|
||||
### New dependencies
|
||||
|
||||
We'll be bringing in `SimpleDirectoryReader`, `HuggingFaceEmbedding`, `VectorStoreIndex`, and `QueryEngineTool` from LlamaIndex.TS, as well as the dependencies we previously used.
|
||||
We'll be bringing in `SimpleDirectoryReader`, `HuggingFaceEmbedding`, `VectorStoreIndex`, and `QueryEngineTool`, `OpenAIContextAwareAgent` from LlamaIndex.TS, as well as the dependencies we previously used.
|
||||
|
||||
```javascript
|
||||
import {
|
||||
OpenAI,
|
||||
FunctionTool,
|
||||
OpenAIAgent,
|
||||
OpenAIContextAwareAgent,
|
||||
Settings,
|
||||
SimpleDirectoryReader,
|
||||
HuggingFaceEmbedding,
|
||||
@@ -41,7 +42,7 @@ Settings.embedModel = new HuggingFaceEmbedding({
|
||||
|
||||
### Load data using SimpleDirectoryReader
|
||||
|
||||
SimpleDirectoryReader is a flexible tool that can read a variety of file formats. We're going to point it at our data directory, which contains just the single PDF file, and get it to return a set of documents.
|
||||
`SimpleDirectoryReader` is a flexible tool that can read various file formats. We will point it at our data directory, which contains a single PDF file, and retrieve a set of documents.
|
||||
|
||||
```javascript
|
||||
const reader = new SimpleDirectoryReader();
|
||||
@@ -50,7 +51,7 @@ const documents = await reader.loadData("../data");
|
||||
|
||||
### Index our data
|
||||
|
||||
Now we turn our text into embeddings. The `VectorStoreIndex` class takes care of this for us when we use the `fromDocuments` method (it uses the embedding model we defined in `Settings` earlier).
|
||||
We will convert our text into embeddings using the `VectorStoreIndex` class through the `fromDocuments` method, which utilizes the embedding model defined earlier in `Settings`.
|
||||
|
||||
```javascript
|
||||
const index = await VectorStoreIndex.fromDocuments(documents);
|
||||
@@ -72,21 +73,35 @@ By default LlamaIndex will retrieve just the 2 most relevant chunks of text. Thi
|
||||
retriever.similarityTopK = 10;
|
||||
```
|
||||
|
||||
### Create a query engine
|
||||
### Approach 1: Create a Context-Aware Agent
|
||||
|
||||
And our final step in creating a RAG pipeline is to create a query engine that will use the retriever to find the most relevant chunks of text, and then use the LLM to answer the question.
|
||||
With the retriever ready, you can create a **context-aware agent**.
|
||||
|
||||
```javascript
|
||||
const queryEngine = await index.asQueryEngine({
|
||||
retriever,
|
||||
const agent = new OpenAIContextAwareAgent({
|
||||
contextRetriever: retriever,
|
||||
});
|
||||
|
||||
// Example query to the context-aware agent
|
||||
let response = await agent.chat({
|
||||
message: `What's the budget of San Francisco in 2023-2024?`,
|
||||
});
|
||||
|
||||
console.log(response);
|
||||
```
|
||||
|
||||
### Define the query engine as a tool
|
||||
**Expected Output:**
|
||||
|
||||
Just as before we created a `FunctionTool`, we're going to create a `QueryEngineTool` that uses our `queryEngine`.
|
||||
```md
|
||||
The total budget for the City and County of San Francisco for the fiscal year 2023-2024 is $14.6 billion. This represents a $611.8 million, or 4.4 percent, increase over the previous fiscal year's budget. The budget covers various expenditures across different departments and services, including significant allocations to public works, transportation, commerce, public protection, and health services.
|
||||
```
|
||||
|
||||
### Approach 2: Using QueryEngineTool (Alternative Approach)
|
||||
|
||||
If you prefer more flexibility and don't mind additional complexity, you can create a `QueryEngineTool`. This approach allows you to define the query logic, providing a more tailored way to interact with the data, but note that it introduces a delay due to the extra tool call.
|
||||
|
||||
```javascript
|
||||
const queryEngine = await index.asQueryEngine({ retriever });
|
||||
const tools = [
|
||||
new QueryEngineTool({
|
||||
queryEngine: queryEngine,
|
||||
@@ -96,28 +111,18 @@ const tools = [
|
||||
},
|
||||
}),
|
||||
];
|
||||
```
|
||||
|
||||
As before, we've created an array of tools with just one tool in it. The metadata is slightly different: we don't need to define our parameters, we just give the tool a name and a natural-language description.
|
||||
|
||||
### Create the agent as before
|
||||
|
||||
Creating the agent and asking a question is exactly the same as before, but we'll ask a different question.
|
||||
|
||||
```javascript
|
||||
// create the agent
|
||||
// Create an agent using the tools array
|
||||
const agent = new OpenAIAgent({ tools });
|
||||
|
||||
let response = await agent.chat({
|
||||
let toolResponse = await agent.chat({
|
||||
message: "What's the budget of San Francisco in 2023-2024?",
|
||||
});
|
||||
|
||||
console.log(response);
|
||||
console.log(toolResponse);
|
||||
```
|
||||
|
||||
Once again we'll run `npx tsx agent.ts` and see what we get:
|
||||
|
||||
**_Output_**
|
||||
**Expected Output:**
|
||||
|
||||
```javascript
|
||||
{
|
||||
@@ -138,28 +143,12 @@ Once again we'll run `npx tsx agent.ts` and see what we get:
|
||||
}
|
||||
```
|
||||
|
||||
```javascript
|
||||
{
|
||||
response: {
|
||||
raw: {
|
||||
id: 'chatcmpl-9KxUkwizVCYCmxwFQcZFSHrInzNFU',
|
||||
object: 'chat.completion',
|
||||
created: 1714782286,
|
||||
model: 'gpt-4-turbo-2024-04-09',
|
||||
choices: [Array],
|
||||
usage: [Object],
|
||||
system_fingerprint: 'fp_ea6eb70039'
|
||||
},
|
||||
message: {
|
||||
content: "The total budget for the City and County of San Francisco for the fiscal year 2023-2024 is $14.6 billion. This represents a $611.8 million, or 4.4 percent, increase over the previous fiscal year's budget. The budget covers various expenditures across different departments and services, including significant allocations to public works, transportation, commerce, public protection, and health services.",
|
||||
role: 'assistant',
|
||||
options: {}
|
||||
}
|
||||
},
|
||||
sources: [Getter]
|
||||
}
|
||||
```
|
||||
|
||||
Once again we see a `toolResult`. You can see the query the LLM decided to send to the query engine ("total budget"), and the output the engine returned. In `response.message` you see that the LLM has returned the output from the tool almost verbatim, although it trimmed out the bit about 2024-2025 since we didn't ask about that year.
|
||||
|
||||
### Comparison of Approaches
|
||||
|
||||
The `OpenAIContextAwareAgent` approach simplifies the setup by allowing you to directly link the retriever to the agent, making it straightforward to access relevant context for your queries. This is ideal for situations where you want easy integration with existing data sources, like a context chat engine.
|
||||
|
||||
On the other hand, using the `QueryEngineTool` offers more flexibility and power. This method allows for customization in how queries are constructed and executed, enabling you to query data from various storages and process them in different ways. However, this added flexibility comes with increased complexity and response time due to the separate tool call and queryEngine generating tool output by LLM that is then passed to the agent.
|
||||
|
||||
So now we have an agent that can index complicated documents and answer questions about them. Let's [combine our math agent and our RAG agent](rag_and_tools)!
|
||||
|
||||
@@ -13,7 +13,7 @@ Official documentation for LlamaParse can be found [here](https://docs.cloud.lla
|
||||
## Usage
|
||||
|
||||
You can then use the `LlamaParseReader` class to load local files and convert them into a parsed document that can be used by LlamaIndex.
|
||||
See [LlamaParseReader.ts](https://github.com/run-llama/LlamaIndexTS/blob/main/packages/llamaindex/src/readers/LlamaParseReader.ts) for a list of supported file types:
|
||||
See [reader.ts](https://github.com/run-llama/LlamaIndexTS/blob/main/packages/cloud/src/reader.ts) for a list of supported file types:
|
||||
|
||||
<CodeBlock language="ts">{CodeSource}</CodeBlock>
|
||||
|
||||
|
||||
@@ -31,7 +31,34 @@ META_LLAMA3_8B_INSTRUCT = "meta.llama3-8b-instruct-v1:0";
|
||||
META_LLAMA3_70B_INSTRUCT = "meta.llama3-70b-instruct-v1:0";
|
||||
META_LLAMA3_1_8B_INSTRUCT = "meta.llama3-1-8b-instruct-v1:0"; // available on us-west-2
|
||||
META_LLAMA3_1_70B_INSTRUCT = "meta.llama3-1-70b-instruct-v1:0"; // available on us-west-2
|
||||
META_LLAMA3_1_405B_INSTRUCT = "meta.llama3-1-405b-instruct-v1:0"; // preview only, available on us-west-2, tool calling supported
|
||||
META_LLAMA3_1_405B_INSTRUCT = "meta.llama3-1-405b-instruct-v1:0"; // available on us-west-2, tool calling supported
|
||||
META_LLAMA3_2_1B_INSTRUCT = "meta.llama3-2-1b-instruct-v1:0"; // only available via inference endpoints (see below)
|
||||
META_LLAMA3_2_3B_INSTRUCT = "meta.llama3-2-3b-instruct-v1:0"; // only available via inference endpoints (see below)
|
||||
META_LLAMA3_2_11B_INSTRUCT = "meta.llama3-2-11b-instruct-v1:0"; // only available via inference endpoints (see below), multimodal and function call supported
|
||||
META_LLAMA3_2_90B_INSTRUCT = "meta.llama3-2-90b-instruct-v1:0"; // only available via inference endpoints (see below), multimodal and function call supported
|
||||
```
|
||||
|
||||
You can also use Bedrock's Inference endpoints by using the model names:
|
||||
|
||||
```ts
|
||||
// US
|
||||
US_ANTHROPIC_CLAUDE_3_HAIKU = "us.anthropic.claude-3-haiku-20240307-v1:0";
|
||||
US_ANTHROPIC_CLAUDE_3_OPUS = "us.anthropic.claude-3-opus-20240229-v1:0";
|
||||
US_ANTHROPIC_CLAUDE_3_SONNET = "us.anthropic.claude-3-sonnet-20240229-v1:0";
|
||||
US_ANTHROPIC_CLAUDE_3_5_SONNET = "us.anthropic.claude-3-5-sonnet-20240620-v1:0";
|
||||
US_ANTHROPIC_CLAUDE_3_5_SONNET_V2 =
|
||||
"us.anthropic.claude-3-5-sonnet-20241022-v2:0";
|
||||
US_META_LLAMA_3_2_1B_INSTRUCT = "us.meta.llama3-2-1b-instruct-v1:0";
|
||||
US_META_LLAMA_3_2_3B_INSTRUCT = "us.meta.llama3-2-3b-instruct-v1:0";
|
||||
US_META_LLAMA_3_2_11B_INSTRUCT = "us.meta.llama3-2-11b-instruct-v1:0";
|
||||
US_META_LLAMA_3_2_90B_INSTRUCT = "us.meta.llama3-2-90b-instruct-v1:0";
|
||||
|
||||
// EU
|
||||
EU_ANTHROPIC_CLAUDE_3_HAIKU = "eu.anthropic.claude-3-haiku-20240307-v1:0";
|
||||
EU_ANTHROPIC_CLAUDE_3_SONNET = "eu.anthropic.claude-3-sonnet-20240229-v1:0";
|
||||
EU_ANTHROPIC_CLAUDE_3_5_SONNET = "eu.anthropic.claude-3-5-sonnet-20240620-v1:0";
|
||||
EU_META_LLAMA_3_2_1B_INSTRUCT = "eu.meta.llama3-2-1b-instruct-v1:0";
|
||||
EU_META_LLAMA_3_2_3B_INSTRUCT = "eu.meta.llama3-2-3b-instruct-v1:0";
|
||||
```
|
||||
|
||||
Sonnet, Haiku and Opus are multimodal, image_url only supports base64 data url format, e.g. `data:image/jpeg;base64,SGVsbG8sIFdvcmxkIQ==`
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "docs",
|
||||
"version": "0.0.75",
|
||||
"version": "0.0.103",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"docusaurus": "docusaurus",
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": ["//"],
|
||||
"tasks": {
|
||||
"build": {
|
||||
"outputs": ["build/**", ".docusaurus/**"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
# deps
|
||||
/node_modules
|
||||
|
||||
# generated content
|
||||
.contentlayer
|
||||
.content-collections
|
||||
.source
|
||||
|
||||
# test & build
|
||||
/coverage
|
||||
/.next/
|
||||
/out/
|
||||
/build
|
||||
*.tsbuildinfo
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
/.pnp
|
||||
.pnp.js
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# others
|
||||
.env*.local
|
||||
.vercel
|
||||
next-env.d.ts
|
||||
|
||||
# build
|
||||
/src/content/docs/cloud/api
|
||||
@@ -0,0 +1,15 @@
|
||||
# @llamaindex/doc
|
||||
|
||||
## 0.0.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [359fd33]
|
||||
- Updated dependencies [efb7e1b]
|
||||
- Updated dependencies [98ba1e7]
|
||||
- Updated dependencies [620c63c]
|
||||
- @llamaindex/core@0.4.0
|
||||
- llamaindex@0.8.0
|
||||
- @llamaindex/cloud@2.0.0
|
||||
- @llamaindex/openai@0.1.25
|
||||
- @llamaindex/readers@1.0.0
|
||||
@@ -0,0 +1,26 @@
|
||||
# next
|
||||
|
||||
This is a Next.js application generated with
|
||||
[Create Fumadocs](https://github.com/fuma-nama/fumadocs).
|
||||
|
||||
Run development server:
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
# or
|
||||
pnpm dev
|
||||
# or
|
||||
yarn dev
|
||||
```
|
||||
|
||||
Open http://localhost:3000 with your browser to see the result.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Next.js and Fumadocs, take a look at the following
|
||||
resources:
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js
|
||||
features and API.
|
||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||
- [Fumadocs](https://fumadocs.vercel.app) - learn about Fumadocs
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"$schema": "https://ui.shadcn.com/schema.json",
|
||||
"style": "new-york",
|
||||
"rsc": true,
|
||||
"tsx": true,
|
||||
"tailwind": {
|
||||
"config": "tailwind.config.js",
|
||||
"css": "app/global.css",
|
||||
"baseColor": "neutral",
|
||||
"cssVariables": true,
|
||||
"prefix": ""
|
||||
},
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils",
|
||||
"ui": "@/components/ui",
|
||||
"lib": "@/lib",
|
||||
"hooks": "@/hooks"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { createMDX } from "fumadocs-mdx/next";
|
||||
|
||||
const withMDX = createMDX();
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const config = {
|
||||
reactStrictMode: true,
|
||||
};
|
||||
|
||||
export default withMDX(config);
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "@llamaindex/doc",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "pnpm run build:docs && next build",
|
||||
"dev": "next dev",
|
||||
"start": "next start",
|
||||
"postdev": "fumadocs-mdx",
|
||||
"postbuild": "fumadocs-mdx",
|
||||
"build:docs": "node ./scripts/generate-docs.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@icons-pack/react-simple-icons": "^10.1.0",
|
||||
"@llamaindex/cloud": "workspace:*",
|
||||
"@llamaindex/core": "workspace:*",
|
||||
"@llamaindex/openai": "workspace:*",
|
||||
"@llamaindex/readers": "workspace:*",
|
||||
"@mdx-js/mdx": "^3.1.0",
|
||||
"@radix-ui/react-dialog": "^1.1.2",
|
||||
"@radix-ui/react-icons": "^1.3.0",
|
||||
"@radix-ui/react-slot": "^1.1.0",
|
||||
"@radix-ui/react-tooltip": "^1.1.3",
|
||||
"ai": "^3.3.21",
|
||||
"class-variance-authority": "^0.7.0",
|
||||
"clsx": "2.1.1",
|
||||
"foxact": "^0.2.39",
|
||||
"framer-motion": "^11.11.10",
|
||||
"fumadocs-core": "14.0.2",
|
||||
"fumadocs-docgen": "^1.3.0",
|
||||
"fumadocs-mdx": "11.0.0",
|
||||
"fumadocs-openapi": "^5.5.3",
|
||||
"fumadocs-twoslash": "^2.0.0",
|
||||
"fumadocs-ui": "14.0.2",
|
||||
"hast-util-to-jsx-runtime": "^2.3.2",
|
||||
"llamaindex": "workspace:*",
|
||||
"lucide-react": "^0.436.0",
|
||||
"next": "15.0.1",
|
||||
"next-themes": "^0.3.0",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-icons": "^5.3.0",
|
||||
"react-text-transition": "^3.1.0",
|
||||
"react-use-measure": "^2.1.1",
|
||||
"rehype-katex": "^7.0.1",
|
||||
"remark-math": "^6.0.0",
|
||||
"rimraf": "^6.0.1",
|
||||
"shiki": "^1.22.0",
|
||||
"shiki-magic-move": "^0.5.0",
|
||||
"swr": "^2.2.5",
|
||||
"tailwind-merge": "^2.5.2",
|
||||
"tailwindcss-animate": "^1.0.7",
|
||||
"zod": "^3.23.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mdx": "^2.0.13",
|
||||
"@types/node": "22.7.8",
|
||||
"@types/react": "^18.3.12",
|
||||
"@types/react-dom": "^18.3.1",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"postcss": "^8.4.47",
|
||||
"tailwindcss": "^3.4.14",
|
||||
"typescript": "^5.6.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
};
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 867 B |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 304 182" style="enable-background:new 0 0 304 182;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#252F3E;}
|
||||
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FF9900;}
|
||||
</style>
|
||||
<g>
|
||||
<path class="st0" d="M86.4,66.4c0,3.7,0.4,6.7,1.1,8.9c0.8,2.2,1.8,4.6,3.2,7.2c0.5,0.8,0.7,1.6,0.7,2.3c0,1-0.6,2-1.9,3l-6.3,4.2
|
||||
c-0.9,0.6-1.8,0.9-2.6,0.9c-1,0-2-0.5-3-1.4C76.2,90,75,88.4,74,86.8c-1-1.7-2-3.6-3.1-5.9c-7.8,9.2-17.6,13.8-29.4,13.8
|
||||
c-8.4,0-15.1-2.4-20-7.2c-4.9-4.8-7.4-11.2-7.4-19.2c0-8.5,3-15.4,9.1-20.6c6.1-5.2,14.2-7.8,24.5-7.8c3.4,0,6.9,0.3,10.6,0.8
|
||||
c3.7,0.5,7.5,1.3,11.5,2.2v-7.3c0-7.6-1.6-12.9-4.7-16c-3.2-3.1-8.6-4.6-16.3-4.6c-3.5,0-7.1,0.4-10.8,1.3c-3.7,0.9-7.3,2-10.8,3.4
|
||||
c-1.6,0.7-2.8,1.1-3.5,1.3c-0.7,0.2-1.2,0.3-1.6,0.3c-1.4,0-2.1-1-2.1-3.1v-4.9c0-1.6,0.2-2.8,0.7-3.5c0.5-0.7,1.4-1.4,2.8-2.1
|
||||
c3.5-1.8,7.7-3.3,12.6-4.5c4.9-1.3,10.1-1.9,15.6-1.9c11.9,0,20.6,2.7,26.2,8.1c5.5,5.4,8.3,13.6,8.3,24.6V66.4z M45.8,81.6
|
||||
c3.3,0,6.7-0.6,10.3-1.8c3.6-1.2,6.8-3.4,9.5-6.4c1.6-1.9,2.8-4,3.4-6.4c0.6-2.4,1-5.3,1-8.7v-4.2c-2.9-0.7-6-1.3-9.2-1.7
|
||||
c-3.2-0.4-6.3-0.6-9.4-0.6c-6.7,0-11.6,1.3-14.9,4c-3.3,2.7-4.9,6.5-4.9,11.5c0,4.7,1.2,8.2,3.7,10.6
|
||||
C37.7,80.4,41.2,81.6,45.8,81.6z M126.1,92.4c-1.8,0-3-0.3-3.8-1c-0.8-0.6-1.5-2-2.1-3.9L96.7,10.2c-0.6-2-0.9-3.3-0.9-4
|
||||
c0-1.6,0.8-2.5,2.4-2.5h9.8c1.9,0,3.2,0.3,3.9,1c0.8,0.6,1.4,2,2,3.9l16.8,66.2l15.6-66.2c0.5-2,1.1-3.3,1.9-3.9c0.8-0.6,2.2-1,4-1
|
||||
h8c1.9,0,3.2,0.3,4,1c0.8,0.6,1.5,2,1.9,3.9l15.8,67l17.3-67c0.6-2,1.3-3.3,2-3.9c0.8-0.6,2.1-1,3.9-1h9.3c1.6,0,2.5,0.8,2.5,2.5
|
||||
c0,0.5-0.1,1-0.2,1.6c-0.1,0.6-0.3,1.4-0.7,2.5l-24.1,77.3c-0.6,2-1.3,3.3-2.1,3.9c-0.8,0.6-2.1,1-3.8,1h-8.6c-1.9,0-3.2-0.3-4-1
|
||||
c-0.8-0.7-1.5-2-1.9-4L156,23l-15.4,64.4c-0.5,2-1.1,3.3-1.9,4c-0.8,0.7-2.2,1-4,1H126.1z M254.6,95.1c-5.2,0-10.4-0.6-15.4-1.8
|
||||
c-5-1.2-8.9-2.5-11.5-4c-1.6-0.9-2.7-1.9-3.1-2.8c-0.4-0.9-0.6-1.9-0.6-2.8v-5.1c0-2.1,0.8-3.1,2.3-3.1c0.6,0,1.2,0.1,1.8,0.3
|
||||
c0.6,0.2,1.5,0.6,2.5,1c3.4,1.5,7.1,2.7,11,3.5c4,0.8,7.9,1.2,11.9,1.2c6.3,0,11.2-1.1,14.6-3.3c3.4-2.2,5.2-5.4,5.2-9.5
|
||||
c0-2.8-0.9-5.1-2.7-7c-1.8-1.9-5.2-3.6-10.1-5.2L246,52c-7.3-2.3-12.7-5.7-16-10.2c-3.3-4.4-5-9.3-5-14.5c0-4.2,0.9-7.9,2.7-11.1
|
||||
c1.8-3.2,4.2-6,7.2-8.2c3-2.3,6.4-4,10.4-5.2c4-1.2,8.2-1.7,12.6-1.7c2.2,0,4.5,0.1,6.7,0.4c2.3,0.3,4.4,0.7,6.5,1.1
|
||||
c2,0.5,3.9,1,5.7,1.6c1.8,0.6,3.2,1.2,4.2,1.8c1.4,0.8,2.4,1.6,3,2.5c0.6,0.8,0.9,1.9,0.9,3.3v4.7c0,2.1-0.8,3.2-2.3,3.2
|
||||
c-0.8,0-2.1-0.4-3.8-1.2c-5.7-2.6-12.1-3.9-19.2-3.9c-5.7,0-10.2,0.9-13.3,2.8c-3.1,1.9-4.7,4.8-4.7,8.9c0,2.8,1,5.2,3,7.1
|
||||
c2,1.9,5.7,3.8,11,5.5l14.2,4.5c7.2,2.3,12.4,5.5,15.5,9.6c3.1,4.1,4.6,8.8,4.6,14c0,4.3-0.9,8.2-2.6,11.6
|
||||
c-1.8,3.4-4.2,6.4-7.3,8.8c-3.1,2.5-6.8,4.3-11.1,5.6C264.4,94.4,259.7,95.1,254.6,95.1z"/>
|
||||
<g>
|
||||
<path class="st1" d="M273.5,143.7c-32.9,24.3-80.7,37.2-121.8,37.2c-57.6,0-109.5-21.3-148.7-56.7c-3.1-2.8-0.3-6.6,3.4-4.4
|
||||
c42.4,24.6,94.7,39.5,148.8,39.5c36.5,0,76.6-7.6,113.5-23.2C274.2,133.6,278.9,139.7,273.5,143.7z"/>
|
||||
<path class="st1" d="M287.2,128.1c-4.2-5.4-27.8-2.6-38.5-1.3c-3.2,0.4-3.7-2.4-0.8-4.5c18.8-13.2,49.7-9.4,53.3-5
|
||||
c3.6,4.5-1,35.4-18.6,50.2c-2.7,2.3-5.3,1.1-4.1-1.9C282.5,155.7,291.4,133.4,287.2,128.1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 272 92" width="272" height="92"><path fill="#EA4335" d="M115.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18C71.25 34.32 81.24 25 93.5 25s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44S80.99 39.2 80.99 47.18c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z"/><path fill="#FBBC05" d="M163.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18c0-12.85 9.99-22.18 22.25-22.18s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44s-12.51 5.46-12.51 13.44c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z"/><path fill="#4285F4" d="M209.75 26.34v39.82c0 16.38-9.66 23.07-21.08 23.07-10.75 0-17.22-7.19-19.66-13.07l8.48-3.53c1.51 3.61 5.21 7.87 11.17 7.87 7.31 0 11.84-4.51 11.84-13v-3.19h-.34c-2.18 2.69-6.38 5.04-11.68 5.04-11.09 0-21.25-9.66-21.25-22.09 0-12.52 10.16-22.26 21.25-22.26 5.29 0 9.49 2.35 11.68 4.96h.34v-3.61h9.25zm-8.56 20.92c0-7.81-5.21-13.52-11.84-13.52-6.72 0-12.35 5.71-12.35 13.52 0 7.73 5.63 13.36 12.35 13.36 6.63 0 11.84-5.63 11.84-13.36z"/><path fill="#34A853" d="M225 3v65h-9.5V3h9.5z"/><path fill="#EA4335" d="M262.02 54.48l7.56 5.04c-2.44 3.61-8.32 9.83-18.48 9.83-12.6 0-22.01-9.74-22.01-22.18 0-13.19 9.49-22.18 20.92-22.18 11.51 0 17.14 9.16 18.98 14.11l1.01 2.52-29.65 12.28c2.27 4.45 5.8 6.72 10.75 6.72 4.96 0 8.4-2.44 10.92-6.14zm-23.27-7.98l19.82-8.23c-1.09-2.77-4.37-4.7-8.23-4.7-4.95 0-11.84 4.37-11.59 12.93z"/><path fill="#4285F4" d="M35.29 41.41V32H67c.31 1.64.47 3.58.47 5.68 0 7.06-1.93 15.79-8.15 22.01-6.05 6.3-13.78 9.66-24.02 9.66C16.32 69.35.36 53.89.36 34.91.36 15.93 16.32.47 35.3.47c10.5 0 17.98 4.12 23.6 9.49l-6.64 6.64c-4.03-3.78-9.49-6.72-16.97-6.72-13.86 0-24.7 11.17-24.7 25.03 0 13.86 10.84 25.03 24.7 25.03 8.99 0 14.11-3.61 17.39-6.89 2.66-2.66 4.41-6.46 5.1-11.65l-22.49.01z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1,654 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 28.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg [
|
||||
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
|
||||
<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
|
||||
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
|
||||
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
|
||||
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
|
||||
<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
|
||||
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
|
||||
<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
|
||||
]>
|
||||
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 341.5"
|
||||
overflow="visible" xml:space="preserve">
|
||||
<switch>
|
||||
<foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
|
||||
<i:aipgfRef xlink:href="#adobe_illustrator_pgf">
|
||||
</i:aipgfRef>
|
||||
</foreignObject>
|
||||
<g i:extraneous="self">
|
||||
<path d="M556,7.1c-62.1,0-112.4,50.3-112.4,112.4S493.9,232,556,232s112.4-50.3,112.4-112.4c0,0,0,0,0,0
|
||||
C668.3,57.5,618,7.2,556,7.1z M556,189.8c-38.8,0-70.3-31.5-70.3-70.3c0-38.8,31.5-70.3,70.3-70.3c38.8,0,70.3,31.5,70.3,70.3
|
||||
C626.2,158.3,594.7,189.8,556,189.8L556,189.8z"/>
|
||||
<path d="M131.6,6.5C69.5,6,18.7,55.8,18.1,117.9C17.5,180,67.4,230.8,129.5,231.4c0.7,0,1.4,0,2.1,0h37v-42.1h-37
|
||||
c-38.8,0.5-70.6-30.6-71.1-69.4s30.6-70.6,69.4-71.1c0.5,0,1.1,0,1.6,0c38.7,0,70.4,31.5,70.4,70.3l0,0v103.5l0,0
|
||||
c0,38.5-31.3,69.8-69.7,70.3c-18.4-0.2-35.9-7.5-48.9-20.6L53.5,302c20.7,20.8,48.7,32.6,78,32.9l0,0h1.5l0,0
|
||||
c61.3-0.9,110.6-50.6,110.9-111.9V116.2C242.4,55.2,192.5,6.6,131.6,6.5z"/>
|
||||
<path d="M918.6,330.1V116.8c-1.5-61-51.4-109.6-112.4-109.7c-62.1-0.6-112.9,49.3-113.5,111.4S742.1,231.4,804.2,232
|
||||
c0.7,0,1.4,0,2.1,0h37v-42.1h-37c-38.8,0.5-70.6-30.6-71.1-69.4s30.6-70.6,69.4-71.1c0.5,0,1.1,0,1.6,0
|
||||
c38.7,0,70.4,31.5,70.4,70.3l0,0v210.1l0,0L918.6,330.1z"/>
|
||||
<path d="M276.1,232h42V119.6c0-38.8,31.5-70.3,70.3-70.3c12.8,0,24.7,3.4,35.1,9.4l21.1-36.5c-16.5-9.5-35.7-15-56.1-15
|
||||
c-62.1,0-112.4,50.3-112.4,112.4L276.1,232z"/>
|
||||
<g>
|
||||
<path d="M950.3,10c3.2,1.8,5.7,4.3,7.5,7.5c1.8,3.2,2.7,6.7,2.7,10.6c0,3.9-0.9,7.4-2.8,10.7c-1.9,3.2-4.4,5.8-7.6,7.6
|
||||
c-3.2,1.9-6.8,2.8-10.6,2.8s-7.4-0.9-10.6-2.8c-3.2-1.9-5.7-4.4-7.5-7.6c-1.8-3.2-2.8-6.7-2.8-10.6c0-3.8,0.9-7.4,2.8-10.6
|
||||
c1.8-3.2,4.4-5.7,7.6-7.6s6.8-2.8,10.7-2.8C943.6,7.2,947.1,8.1,950.3,10z M948.2,43c2.6-1.5,4.6-3.6,6.1-6.2
|
||||
c1.5-2.6,2.2-5.5,2.2-8.7c0-3.2-0.7-6.1-2.2-8.7s-3.5-4.6-6-6.1c-2.6-1.5-5.5-2.2-8.7-2.2c-3.2,0-6.1,0.8-8.7,2.3
|
||||
c-2.6,1.5-4.6,3.6-6.1,6.2c-1.5,2.6-2.2,5.5-2.2,8.7c0,3.2,0.7,6.1,2.2,8.7c1.5,2.6,3.5,4.7,6,6.2c2.6,1.5,5.4,2.3,8.6,2.3
|
||||
C942.7,45.3,945.6,44.5,948.2,43z M949.5,29.2c-0.7,1.2-1.8,2.1-3.2,2.8l5,7.7h-6.2l-4.3-6.7h-0.2h-3.9v6.7h-6.2v-23h10
|
||||
c3.1,0,5.6,0.7,7.4,2.2c1.8,1.5,2.7,3.5,2.7,6C950.6,26.5,950.2,28,949.5,29.2z M940.1,28.4c1.4,0,2.5-0.3,3.2-0.9
|
||||
c0.8-0.6,1.2-1.5,1.2-2.6c0-1.1-0.4-2-1.2-2.7s-1.9-0.9-3.2-0.9h-3.5v7.2H940.1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</switch>
|
||||
<i:aipgf id="adobe_illustrator_pgf" i:pgfEncoding="zstd/base64" i:pgfVersion="24">
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
Z5Bw3N6JMPVsubV7rZuvyxlp9+hYH9SXIzyvkRRrbk86ijfvrNSUn/vXReobrezsZbTkXS0TGfeo
|
||||
nryyV3SYStebspdrkkuprLZsstj/3EIy/dgu/aiOZpoqJx0Jh9ndJeqllf9KHSxf79lfTc/JpdaY
|
||||
drb69e7m60dSj2XSURB/Ncz9oc1WUcxU+u2pb8qk13JqfhbL8VTLpldNaZ1S5n3wylmZYvqu/eAW
|
||||
tebV0e2ijlq5W/OU7KRdL1I6R618j1efl4sp1SoVIZVnreCPaFXPwqF0sbXa3SM63ZDq/mSqpdxR
|
||||
uyPhKE/yrVppbf7CVCs77T/Gl0Tn6Wlu7piul6q5S/uhtBrRuFzQDvGchHqlvGrimc+ZhlR2abbp
|
||||
tSqtS3fxVUR17x0lOYk83lK3eLv8tP9U1eqUaAgrz3UmQ9xz7hrd0Yaw3H3T5r3TubrYplmmpqF3
|
||||
CIuW8SqfhWkyQpMpmuV8k45iPqlRpj+/jtOq6Y1cN4qI50U77+lQufjommpDOqkdeqiccJSywpMa
|
||||
TemWlOymTpu9CyKd7PseDtmlDnMVrUqzJrFoolqp1GhjdLFrWslmSTfphKPccNeuurupv/jXVd2k
|
||||
K426rH7tV6qGc/pyrSNDdeLhqAuqd6kq1zdXRWaq37NZTEwUNHtvS2e6at/83bhcF3GBgggmiJBk
|
||||
kHRwlDy8f/NmGulZ6fx8ZlKSuqz4t5aLZlNFLRthevCYcBS7j063cOnIhZg3W7iJR/mnhYg2v+55
|
||||
ty0WWs7VFrNMs13+NVVV1M8vFpl6Xptfm+Xt2u4s6+Ylwn+d5qTDnDuu3nlIky80TVs01NOpF9bu
|
||||
kp4Ph16OkHTRm/eky6NcnlftMPVTtladMNfMZqnKHstf7/WuqXezvhmP0G5WLCIbf0seJpnUSWS3
|
||||
tk/9+bsysruc+49r+ruzHX0anmaiUnl+5K+uDXGuNvG46d3R7uxma8s9NVUT11VIezVlW9DoPrUv
|
||||
q3hTry7uoG3iUfS26pHtuX2xKsqzrE0P3ZZ0IabmOndwX/BwK+tkWlO3ZansT1P0ze6LlppKSdE7
|
||||
d0tIlvaynFOVW5/VeNfEosQypOfOUZXXKdNqZaUsz36zlHgUq6OkTEKyKaPxmESnn/Q+ia5Dr1J1
|
||||
RYTWI87eJh4lvXdPNSUae5Uvnc/wyHTytlyt1yet9eSr2CGeyqWmwduyr1KfiChnX8VuZt2fEX4V
|
||||
S9c3ripWope17DV06xUZJB0c5e5LdaKqns7lkbYucz34Sjy08DBNa426SonHylEyu6vV0Vcpa95X
|
||||
85Z0FNsrdZl8Neuq3KdtzCzhKKq4iU5T0rm+rFURa+pWfKqYo/qCtEVnuxtN2W59V3rSmCzxuNd+
|
||||
VKvci151fqnNWhXX2apXy+pkibSaSh3Wq+6tdBp1JSbKZe2VXiruN2+kwbzeeiOk9KZOnoQIxUID
|
||||
hEVNTLzD9sdUM9OxOxKOcjJC7/i1pHcv4uGWVpHql3Iw1XdDIjo6zVmlL+9eVrlpeddS9Vqa0VkN
|
||||
VY1Xfmnh0UuYY/xV71PpHGYxPRbp5q7O3outDymLtHKsEun+K3rJpZVOoq9NT5WsV3qffUu6ZzhX
|
||||
WRStvHZ+jWpLm8R0mp3OOsPxdTzvTmdH+CnDuqLioerNkZYratJTj1SptK5rq2OkCUexxKs1/Y2Y
|
||||
pmdWpk+JhQcqQCAQSEKixAUbLOCEBikKiY8TKlKQ+ChRSJS4YAMSKi4oJBRwQYoSyQcJBBTggg8J
|
||||
JEjoeAcPxQJCwWSEhwk6XmVms7xCjvKyuvrQy94sPpPIqJ9dpBca7Q9Hf/ZdtjEnn1nGy6PNOc1u
|
||||
DP9To9IbcxW02qr8+jxmdUZUL+61kkjvNKtupbTXXfl2iao+wrnt7Vb+xmeXtaVVVHO/lUTmIdtM
|
||||
Mkg8ypa+fFPO/Hd/t7pFt2OJB+6ZvfckHx71COn2bD8sxePS2Lj/KZnuUu96c3zpyf+W9W5XDZH2
|
||||
Pi0P2trU6ieV4lQh6tlmtzT0DVX+ZoqWtThYu5d3N5R0IuvtbKNUpbCojPCbQ2tLN1LpPWebdBR8
|
||||
nanPDHNMVZKIEGvvqMa3CUcx8+KNhIq2iqlXex+01Pvm+dLS9H6Kk7Ylf6RLY1fJtHVtLkwTJQ19
|
||||
dzOkmrtK+VRrs1QFsdCWubfdm575+t6cqWKhc26beJx0vWj12rVZg7VFnbsnV9VSqaazcLUya3/S
|
||||
PURVvCL6bWf3qXlastF60XFvojkt3n1H4xhhmutWU/9JKqu4ZHlfe4jK9q6wzgZdJY1UOf8W39OK
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
30u5gMQXtCf0pGs8eMi17B3Z4KTmwnmndi8JWA/E6YYPdiemkI782cC/SE0tWoNvjKBDejvvcPvs
|
||||
JTV+XPuEr1zoJTFgk3YUJ/S+L1ypo7Y3NvjI/rpWr7kf3amtW2p0NoRGD3lvozrdcmaKq/5pGEth
|
||||
oUdbquGOWwx2v7S5KshtZmgmVz5AlUwcAVe1SGoNEvBf1P3fLKDbc6IcR/QtG6pn7jlxpQ49NWlD
|
||||
qr7w9o9v/A868sOZINyLoUsRAVnuhpYhNGgKFaTO74NWlCg8AkV6/ru7CKbfjkWMwbYP9LplJR6e
|
||||
QKu4tpHhQdfaMNHKoH8U0SEtLWTlzXJMKm6xLG5Gow1RSp8ifGQMYoTGILVLHOpNjqwoxy2RWERW
|
||||
zYqspItT0f4JrSgWlRZ4JPAiYJd4WwdkZ8K2BFZRaCj+U0i3V7P9mQ8c/nhAiwzHqOqbCdEOeyx3
|
||||
l09R0/ZjYBu8tfqxBxD30P78QwM1M0gEniyKkKMfxh8BGu2MC6j47MHViG11wv3urpcqhx3qDznI
|
||||
g1hLpF6JcK6OtxvuNm6RViaIT6Z53L1bjhuZhhwJkWMjeccnS6IDbKCBtwNQq7L5F0K6u3vwJor2
|
||||
NKO704E328Ont4DGvzDL7LK17tjoMDcy9Nht3iepGkCFPmmALmx/iNC2F33EdPcHTKrzg3b8lQHc
|
||||
XrUBQNu+4BTyc+C2CWnBfzxQ2vGx2TOjbXNIi+jfQ56z936nTESjV+altrfzrVXsEi9qG4/cntzZ
|
||||
rM2TW0c2hEwLhmhbEq73LREyH2jzr0t0NNerpLZpU4BlMrWTz796Q9v2ZNBsV78sGUSUh/0i8UPX
|
||||
Aw==
|
||||
]]>
|
||||
</i:aipgf>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 48 KiB |
@@ -0,0 +1,23 @@
|
||||
<svg width="150" height="150" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<linearGradient id="e399c19f-b68f-429d-b176-18c2117ff73c" x1="-1032.172" x2="-1059.213" y1="145.312" y2="65.426" gradientTransform="matrix(1 0 0 -1 1075 158)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#114a8b"/>
|
||||
<stop offset="1" stop-color="#0669bc"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="ac2a6fc2-ca48-4327-9a3c-d4dcc3256e15" x1="-1023.725" x2="-1029.98" y1="108.083" y2="105.968" gradientTransform="matrix(1 0 0 -1 1075 158)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-opacity=".3"/>
|
||||
<stop offset=".071" stop-opacity=".2"/>
|
||||
<stop offset=".321" stop-opacity=".1"/>
|
||||
<stop offset=".623" stop-opacity=".05"/>
|
||||
<stop offset="1" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="a7fee970-a784-4bb1-af8d-63d18e5f7db9" x1="-1027.165" x2="-997.482" y1="147.642" y2="68.561" gradientTransform="matrix(1 0 0 -1 1075 158)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#3ccbf4"/>
|
||||
<stop offset="1" stop-color="#2892df"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path fill="url(#e399c19f-b68f-429d-b176-18c2117ff73c)" d="M33.338 6.544h26.038l-27.03 80.087a4.152 4.152 0 0 1-3.933 2.824H8.149a4.145 4.145 0 0 1-3.928-5.47L29.404 9.368a4.152 4.152 0 0 1 3.934-2.825z"/>
|
||||
<path fill="#0078d4" d="M71.175 60.261h-41.29a1.911 1.911 0 0 0-1.305 3.309l26.532 24.764a4.171 4.171 0 0 0 2.846 1.121h23.38z"/>
|
||||
<path fill="url(#ac2a6fc2-ca48-4327-9a3c-d4dcc3256e15)" d="M33.338 6.544a4.118 4.118 0 0 0-3.943 2.879L4.252 83.917a4.14 4.14 0 0 0 3.908 5.538h20.787a4.443 4.443 0 0 0 3.41-2.9l5.014-14.777 17.91 16.705a4.237 4.237 0 0 0 2.666.972H81.24L71.024 60.261l-29.781.007L59.47 6.544z"/>
|
||||
<path fill="url(#a7fee970-a784-4bb1-af8d-63d18e5f7db9)" d="M66.595 9.364a4.145 4.145 0 0 0-3.928-2.82H33.648a4.146 4.146 0 0 1 3.928 2.82l25.184 74.62a4.146 4.146 0 0 1-3.928 5.472h29.02a4.146 4.146 0 0 0 3.927-5.472z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
@@ -0,0 +1,7 @@
|
||||
<svg width="209" height="135" viewBox="0 0 209 135" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<ellipse cx="136.019" cy="67.2304" rx="66.6667" ry="64" fill="#FFDE2D"/>
|
||||
<ellipse cx="69.352" cy="67.2304" rx="66.6667" ry="64" fill="#327EFF"/>
|
||||
<path d="M2.68528 67.2304C2.68527 31.8842 32.5329 3.23047 69.3519 3.23047L69.3519 67.2304L2.68528 67.2304Z" fill="#327EFF"/>
|
||||
<path d="M136.019 67.2305C136.019 102.577 106.171 131.23 69.3519 131.23L69.3519 67.2305L136.019 67.2305Z" fill="#FF6446"/>
|
||||
<path d="M69.352 67.2304C69.352 31.8842 99.1997 3.23047 136.019 3.23047L136.019 67.2304L69.352 67.2304Z" fill="#FF6446"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 622 B |
|
After Width: | Height: | Size: 7.1 KiB |
@@ -0,0 +1,27 @@
|
||||
<svg width="167" height="56" viewBox="0 0 167 56" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_4688_32443)">
|
||||
<path d="M78.6387 42.6243C78.6387 44.6538 76.9936 46.2992 74.9641 46.2992H72.4522V43.4301H72.3626C72.0936 43.8185 71.7349 44.222 71.2866 44.6402C70.8681 45.0289 70.3603 45.3876 69.7624 45.7164C69.1947 46.0449 68.5521 46.3139 67.8348 46.5234C67.1473 46.7325 66.43 46.8368 65.683 46.8368C64.0691 46.8368 62.6048 46.5678 61.2897 46.0299C59.9746 45.4622 58.8391 44.685 57.8827 43.6988C56.9563 42.6827 56.239 41.4874 55.7309 40.1128C55.2227 38.7378 54.9688 37.2286 54.9688 35.585C54.9688 34.0608 55.1929 32.6112 55.6412 31.2362C56.1192 29.8318 56.777 28.5912 57.6137 27.5153C58.4805 26.4396 59.5263 25.5879 60.7517 24.9602C61.9772 24.3028 63.3669 23.974 64.9209 23.974C66.3257 23.974 67.6257 24.1981 68.821 24.6464C70.0465 25.0649 71.0474 25.7971 71.8246 26.8433H71.9143V16.0827C71.9143 14.0533 73.5594 12.4082 75.5888 12.4082H78.6387V42.6243ZM72.4522 35.4053C72.4522 33.7617 71.9742 32.4319 71.0177 31.4155C70.0913 30.3995 68.7762 29.8913 67.0727 29.8913C65.3692 29.8913 64.0394 30.3995 63.0829 31.4155C62.1565 32.4319 61.6932 33.7617 61.6932 35.4053C61.6932 37.0493 62.1565 38.3791 63.0829 39.3951C64.0394 40.4115 65.3692 40.9197 67.0727 40.9197C68.7762 40.9197 70.0913 40.4115 71.0177 39.3951C71.9742 38.3791 72.4522 37.0493 72.4522 35.4053Z" fill="#DC244C"/>
|
||||
<path d="M82.9893 28.1863C82.9893 26.1571 84.6344 24.512 86.6639 24.512H89.7137V28.0085H89.8034C90.5207 26.6638 91.3724 25.6626 92.3587 25.0051C93.3449 24.3177 94.5851 23.974 96.0795 23.974C96.4679 23.974 96.8563 23.989 97.2451 24.0188C97.6335 24.0487 97.9921 24.1085 98.321 24.1982V30.3398C97.8426 30.1902 97.3645 30.0855 96.8864 30.0256C96.4381 29.9359 95.9597 29.8911 95.4519 29.8911C94.1665 29.8911 93.1505 30.0704 92.4035 30.4291C91.6561 30.7877 91.0733 31.2959 90.6552 31.9533C90.2664 32.5809 90.0125 33.343 89.8931 34.2396C89.7733 35.1365 89.7137 36.1224 89.7137 37.1983V42.6241C89.7137 44.6536 88.0686 46.299 86.0392 46.299H82.9893V28.1863Z" fill="#DC244C"/>
|
||||
<path d="M114.631 43.565H114.541C113.794 44.7306 112.793 45.5673 111.538 46.0754C110.312 46.5833 109.012 46.8372 107.637 46.8372C106.621 46.8372 105.635 46.688 104.679 46.3893C103.752 46.1203 102.93 45.7017 102.213 45.134C101.496 44.5659 100.928 43.8637 100.51 43.0267C100.091 42.19 99.8819 41.2188 99.8819 40.1131C99.8819 38.8579 100.106 37.7967 100.554 36.9303C101.033 36.0634 101.66 35.3462 102.437 34.7784C103.244 34.2104 104.156 33.7771 105.172 33.4784C106.188 33.1495 107.234 32.9103 108.31 32.7607C109.416 32.6116 110.506 32.5219 111.582 32.4918C112.688 32.462 113.704 32.4473 114.631 32.4473C114.631 31.2516 114.198 30.3102 113.331 29.6227C112.494 28.9054 111.493 28.5468 110.327 28.5468C109.222 28.5468 108.205 28.786 107.279 29.2641C106.382 29.7127 105.575 30.3403 104.858 31.1469L101.272 27.4709C102.527 26.3055 103.992 25.4388 105.665 24.871C107.339 24.2732 109.072 23.9744 110.865 23.9744C112.838 23.9744 114.451 24.2284 115.707 24.7365C116.992 25.2146 118.008 25.9319 118.755 26.8881C119.532 27.8446 120.07 29.0252 120.369 30.4296C120.668 31.8046 120.817 33.4034 120.817 35.2264V42.6251C120.817 44.6541 119.172 46.2996 117.143 46.2996H114.631V43.565ZM112.972 36.7506C112.464 36.7506 111.822 36.7807 111.044 36.8402C110.297 36.8704 109.565 36.9898 108.848 37.1989C108.161 37.4083 107.563 37.7221 107.055 38.1403C106.577 38.5588 106.337 39.1416 106.337 39.889C106.337 40.6959 106.681 41.2934 107.368 41.6818C108.056 42.0706 108.773 42.2646 109.52 42.2646C110.178 42.2646 110.806 42.1749 111.403 41.9956C112.031 41.8163 112.584 41.5624 113.062 41.2335C113.54 40.905 113.914 40.4865 114.183 39.9783C114.482 39.4705 114.631 38.8726 114.631 38.1855V36.7506H112.972Z" fill="#DC244C"/>
|
||||
<path d="M125.485 28.1863C125.485 26.1571 127.13 24.512 129.16 24.512H131.941V27.4705H132.03C132.24 27.0524 132.538 26.6339 132.927 26.2155C133.315 25.7971 133.779 25.4235 134.317 25.0947C134.855 24.766 135.467 24.497 136.155 24.2878C136.842 24.0786 137.589 23.974 138.396 23.974C140.1 23.974 141.474 24.243 142.521 24.7809C143.566 25.289 144.373 26.0063 144.941 26.9326C145.539 27.8593 145.942 28.9499 146.152 30.2051C146.361 31.4603 146.466 32.8203 146.466 34.2849V42.6243C146.466 44.6538 144.82 46.2992 142.791 46.2992H139.741V35.6295C139.741 35.0019 139.711 34.3595 139.651 33.7018C139.621 33.0147 139.487 32.3871 139.248 31.8193C139.039 31.2512 138.695 30.7879 138.217 30.4293C137.769 30.0706 137.111 29.8913 136.244 29.8913C135.378 29.8913 134.675 30.0559 134.137 30.3844C133.6 30.6835 133.181 31.1017 132.882 31.6397C132.613 32.1478 132.434 32.7306 132.344 33.388C132.255 34.0457 132.21 34.7329 132.21 35.4501V42.6243C132.21 44.6538 130.565 46.2992 128.535 46.2992H125.485V28.1863Z" fill="#DC244C"/>
|
||||
<path d="M166.515 26.2168C166.515 28.246 164.87 29.8911 162.841 29.8911H160.598V37.1538C160.598 37.7513 160.628 38.3043 160.687 38.8122C160.747 39.2906 160.882 39.7088 161.091 40.0674C161.3 40.426 161.614 40.7101 162.032 40.9195C162.481 41.0988 163.063 41.1881 163.781 41.1881C164.139 41.1881 164.603 41.1584 165.17 41.0985C165.768 41.0088 166.217 40.8299 166.515 40.5609V43.7666C166.515 45.2051 165.614 46.5434 164.184 46.7021C163.377 46.7918 162.585 46.8366 161.808 46.8366C160.673 46.8366 159.627 46.7172 158.67 46.478C157.714 46.2392 156.877 45.8654 156.16 45.3576C155.442 44.8197 154.875 44.1322 154.456 43.2951C154.068 42.4584 153.873 41.4424 153.873 40.2471V29.8911H149.57V28.1861C149.57 26.1569 151.215 24.5118 153.244 24.5118H153.873V21.7309C153.873 19.7015 155.519 18.0563 157.548 18.0563H160.598V24.5118H166.515V26.2168Z" fill="#DC244C"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M38.6234 51.4767L37.5067 20.6899L35.4844 12.5732L48.9828 14.0022V51.2437L40.7371 56.0026L38.6234 51.4767Z" fill="#24386C"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M48.9815 14L40.7359 18.7622L23.7198 15.0296L3.80271 23.139L0.484375 14L12.6067 7L24.7327 0L36.8553 7L48.9815 14Z" fill="#7589BE"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.484375 13.9994L8.73004 18.7616L13.5099 32.9769L29.6488 45.89L24.733 55.9994L12.6071 48.999L0.484375 41.999V13.9994Z" fill="#B2BFE8"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.201 38.4209L24.7344 46.4799V56.0006L32.4913 51.525L36.4881 45.5569" fill="#24386C"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.7368 36.9622L16.9766 23.5262L18.6481 19.0731L25.0025 15.9922L32.4904 23.5265L24.7368 36.9622Z" fill="#7589BE"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9756 23.5254L24.7326 28.001V36.9595L17.5584 37.2682L13.2188 31.727L16.9756 23.5254Z" fill="#B2BFE8"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.7344 27.9996L32.4913 23.5244L37.7705 32.3147L31.382 37.5931L24.7344 36.9585V27.9996Z" fill="#24386C"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.49 51.524L40.7357 56V18.7622L32.7326 14.1433L24.7331 9.52441L16.7299 14.1433L8.73047 18.7622V37.2411L16.7299 41.86L24.7331 46.4793L32.49 41.9996V51.524ZM32.49 32.4789L24.7331 36.9582L16.9761 32.4789V23.524L24.7331 19.0448L32.49 23.524V32.4789Z" fill="#DC244C"/>
|
||||
<path d="M24.7361 46.4828V36.9606L17.0195 32.5195V42.0259L24.7361 46.4828Z" fill="url(#paint0_linear_4688_32443)"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_4688_32443" x1="23.3133" y1="38.7809" x2="15.6239" y2="38.7809" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FF3364"/>
|
||||
<stop offset="1" stop-color="#C91540" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_4688_32443">
|
||||
<rect width="166.03" height="56" fill="white" transform="translate(0.484375)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.4 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 7.4 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 169 KiB |
@@ -0,0 +1,22 @@
|
||||
import * as OpenAPI from "fumadocs-openapi";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { rimrafSync } from "rimraf";
|
||||
|
||||
const out = "./src/content/docs/cloud/api";
|
||||
|
||||
// clean generated files
|
||||
rimrafSync(out, {
|
||||
filter(v) {
|
||||
return !v.endsWith("index.mdx") && !v.endsWith("meta.json");
|
||||
},
|
||||
});
|
||||
|
||||
void OpenAPI.generateFiles({
|
||||
input: [
|
||||
fileURLToPath(
|
||||
new URL("../../../packages/cloud/openapi.json", import.meta.url),
|
||||
),
|
||||
],
|
||||
output: out,
|
||||
groupBy: "tag",
|
||||
});
|
||||
@@ -0,0 +1,117 @@
|
||||
import { PipelinesService } from "@llamaindex/cloud/api";
|
||||
import { rehypeCodeDefaultOptions } from "fumadocs-core/mdx-plugins";
|
||||
import { fileGenerator, remarkDocGen, remarkInstall } from "fumadocs-docgen";
|
||||
import { defineConfig, defineDocs } from "fumadocs-mdx/config";
|
||||
import { transformerTwoslash } from "fumadocs-twoslash";
|
||||
import { relative } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import rehypeKatex from "rehype-katex";
|
||||
import remarkMath from "remark-math";
|
||||
|
||||
const baseDir = fileURLToPath(new URL("../src/content", import.meta.url));
|
||||
|
||||
export const { docs, meta } = defineDocs({
|
||||
dir: "./src/content/docs",
|
||||
});
|
||||
|
||||
export default defineConfig({
|
||||
lastModifiedTime: "git",
|
||||
mdxOptions: {
|
||||
rehypeCodeOptions: {
|
||||
inline: "tailing-curly-colon",
|
||||
themes: {
|
||||
light: "catppuccin-latte",
|
||||
dark: "catppuccin-mocha",
|
||||
},
|
||||
transformers: [
|
||||
...(rehypeCodeDefaultOptions.transformers ?? []),
|
||||
transformerTwoslash(),
|
||||
{
|
||||
name: "transformers:remove-notation-escape",
|
||||
code(hast) {
|
||||
for (const line of hast.children) {
|
||||
if (line.type !== "element") continue;
|
||||
|
||||
const lastSpan = line.children.findLast(
|
||||
(v) => v.type === "element",
|
||||
);
|
||||
|
||||
const head = lastSpan?.children[0];
|
||||
if (head?.type !== "text") return;
|
||||
|
||||
head.value = head.value.replace(/\[\\!code/g, "[!code");
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
remarkPlugins: [
|
||||
remarkMath,
|
||||
[remarkInstall, { persist: { id: "package-manager" } }],
|
||||
[remarkDocGen, { generators: [fileGenerator()] }],
|
||||
() => {
|
||||
return (_, file, next) => {
|
||||
const metadata = file.data.frontmatter as Record<string, unknown>;
|
||||
const title = metadata.title as string;
|
||||
const description = metadata.description as string;
|
||||
let content: string;
|
||||
if (file.value instanceof Uint8Array) {
|
||||
content = file.value.toString();
|
||||
} else {
|
||||
content = file.value;
|
||||
}
|
||||
if (file.path.includes("content/docs/cloud/api")) {
|
||||
// skip cloud api docs
|
||||
return next();
|
||||
}
|
||||
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
||||
if (process.env.NODE_ENV === "development") {
|
||||
// skip development
|
||||
return next();
|
||||
}
|
||||
if (!title || !description) {
|
||||
throw new Error(`Missing title or description in ${file.path}`);
|
||||
}
|
||||
const id = relative(baseDir, file.path);
|
||||
|
||||
if (
|
||||
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
||||
process.env.LLAMA_CLOUD_UPSERT_PIPELINE_DOCUMENTS === "true" &&
|
||||
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
||||
process.env.LLAMA_CLOUD_PIPELINE_ID !== undefined
|
||||
) {
|
||||
PipelinesService.upsertBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPut(
|
||||
{
|
||||
baseUrl: "https://api.cloud.llamaindex.ai/",
|
||||
body: [
|
||||
{
|
||||
metadata: {
|
||||
title,
|
||||
description,
|
||||
documentUrl: id,
|
||||
},
|
||||
text: content,
|
||||
id,
|
||||
},
|
||||
],
|
||||
path: {
|
||||
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
||||
pipeline_id: process.env.LLAMA_CLOUD_PIPELINE_ID,
|
||||
},
|
||||
throwOnError: true,
|
||||
headers: {
|
||||
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
||||
Authorization: `Bearer ${process.env.LLAMA_CLOUD_API_KEY}`,
|
||||
},
|
||||
},
|
||||
).catch((error) => {
|
||||
console.error(error);
|
||||
});
|
||||
}
|
||||
return next();
|
||||
};
|
||||
},
|
||||
],
|
||||
rehypePlugins: (v) => [rehypeKatex, ...v],
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,109 @@
|
||||
import { ClientMDXContent } from "@/components/mdx";
|
||||
import { BotMessage } from "@/components/message";
|
||||
import { Skeleton } from "@/components/ui/skeleton";
|
||||
import { LlamaCloudRetriever } from "@/deps/cloud";
|
||||
import { ContextChatEngine } from "@llamaindex/core/chat-engine";
|
||||
import { Settings } from "@llamaindex/core/global";
|
||||
import { ChatMessage } from "@llamaindex/core/llms";
|
||||
import { OpenAI } from "@llamaindex/openai";
|
||||
import { createAI, createStreamableUI, getMutableAIState } from "ai/rsc";
|
||||
import { ReactNode } from "react";
|
||||
|
||||
Settings.llm = new OpenAI({
|
||||
model: "gpt-4o",
|
||||
});
|
||||
|
||||
const retriever = new LlamaCloudRetriever({
|
||||
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
||||
apiKey: process.env.LLAMA_CLOUD_API_KEY!,
|
||||
baseUrl: "https://api.cloud.llamaindex.ai/",
|
||||
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
||||
pipelineId: process.env.LLAMA_CLOUD_PIPELINE_ID!,
|
||||
});
|
||||
|
||||
const initialAIState = {
|
||||
messages: [],
|
||||
} as {
|
||||
messages: ChatMessage[];
|
||||
};
|
||||
|
||||
type UIMessage = {
|
||||
id: number;
|
||||
display: ReactNode;
|
||||
};
|
||||
|
||||
const initialUIState = {
|
||||
messages: [],
|
||||
} as {
|
||||
messages: UIMessage[];
|
||||
};
|
||||
|
||||
const runAsyncFnWithoutBlocking = (fn: (...args: any) => Promise<any>) => {
|
||||
fn().catch((error) => {
|
||||
console.error(error);
|
||||
});
|
||||
};
|
||||
|
||||
export const AIProvider = createAI({
|
||||
initialAIState,
|
||||
initialUIState,
|
||||
actions: {
|
||||
query: async (message: string): Promise<UIMessage> => {
|
||||
"use server";
|
||||
const chatEngine = new ContextChatEngine({ retriever });
|
||||
|
||||
const id = Date.now();
|
||||
const aiState = getMutableAIState<typeof AIProvider>();
|
||||
aiState.update({
|
||||
...aiState.get(),
|
||||
messages: [
|
||||
...aiState.get().messages,
|
||||
{
|
||||
role: "user",
|
||||
content: message,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const ui = createStreamableUI(
|
||||
<div className="space-y-2">
|
||||
<Skeleton className="h-4 w-full" />
|
||||
<Skeleton className="h-4 w-full" />
|
||||
</div>,
|
||||
);
|
||||
|
||||
runAsyncFnWithoutBlocking(async () => {
|
||||
const response = await chatEngine.chat({
|
||||
message,
|
||||
chatHistory: aiState.get().messages,
|
||||
stream: true,
|
||||
});
|
||||
|
||||
let content = "";
|
||||
|
||||
for await (const { delta } of response) {
|
||||
content += delta;
|
||||
ui.update(<ClientMDXContent id={id} content={content} />);
|
||||
}
|
||||
|
||||
ui.done();
|
||||
|
||||
aiState.done({
|
||||
...aiState.get(),
|
||||
messages: [
|
||||
...aiState.get().messages,
|
||||
{
|
||||
role: "assistant",
|
||||
content,
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
return {
|
||||
id,
|
||||
display: <BotMessage>{ui.value}</BotMessage>,
|
||||
};
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,19 @@
|
||||
import { baseOptions } from "@/app/layout.config";
|
||||
import { Footer } from "@/components/website/Footer";
|
||||
import { HomeLayout } from "fumadocs-ui/layouts/home";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
export default function Layout({
|
||||
children,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
}): React.ReactElement {
|
||||
return (
|
||||
<HomeLayout {...baseOptions}>
|
||||
{children}
|
||||
<div className="container">
|
||||
<Footer />
|
||||
</div>
|
||||
</HomeLayout>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
import { CodeBlock } from "@/components/code-block";
|
||||
import { Contributing } from "@/components/contribution";
|
||||
import { CreateAppAnimation } from "@/components/create-app-animation";
|
||||
import { Feature } from "@/components/feature";
|
||||
import {
|
||||
InfiniteLLMProviders,
|
||||
InfiniteVectorStoreProviders,
|
||||
} from "@/components/infinite-providers";
|
||||
import { MagicMove } from "@/components/magic-move";
|
||||
import { NpmInstall } from "@/components/npm-install";
|
||||
import { TextEffect } from "@/components/text-effect";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Skeleton } from "@/components/ui/skeleton";
|
||||
import { DOCUMENT_URL } from "@/lib/const";
|
||||
import { SiStackblitz } from "@icons-pack/react-simple-icons";
|
||||
import {
|
||||
CodeBlock as FumaCodeBlock,
|
||||
Pre,
|
||||
} from "fumadocs-ui/components/codeblock";
|
||||
import { Blocks, Bot, Footprints, Terminal } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { Suspense } from "react";
|
||||
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<main className="container mx-auto px-4 py-12">
|
||||
<h1 className="text-4xl md:text-6xl font-bold text-center mb-4">
|
||||
Build RAG Web App using
|
||||
<br /> <span className="text-blue-500">LlamaIndex.TS</span>
|
||||
</h1>
|
||||
<p className="text-xl text-center text-fd-muted-foreground mb-12 ">
|
||||
LlamaIndex.TS is the JS/TS library from our popular Python library
|
||||
llama-index for building LLM applications
|
||||
</p>
|
||||
<div className="text-center text-lg text-fd-muted-foreground mb-12">
|
||||
<span>Designed for building web applications under </span>
|
||||
<TextEffect />
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-4">
|
||||
<Link href={DOCUMENT_URL}>
|
||||
<Button variant="outline">Get Started</Button>
|
||||
</Link>
|
||||
<NpmInstall />
|
||||
<Link
|
||||
href="https://stackblitz.com/github/run-llama/LlamaIndexTS/tree/main/examples"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
<Button className="bg-blue-500 text-white hover:bg-blue-600">
|
||||
<SiStackblitz />
|
||||
Playground
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
<div className="mt-4" />
|
||||
<div className="grid grid-cols-1 border-r md:grid-cols-2">
|
||||
<Feature
|
||||
icon={Footprints}
|
||||
subheading="Progressive"
|
||||
heading="Adding AI feature from simple to complex"
|
||||
description="LlamaIndex.TS is designed to be simple to start with and can be extended to build complex AI applications."
|
||||
>
|
||||
<Suspense
|
||||
fallback={
|
||||
<FumaCodeBlock allowCopy={false}>
|
||||
<Pre>
|
||||
<div className="space-y-2">
|
||||
<Skeleton className="h-4 w-[250px]" />
|
||||
<Skeleton className="h-4 w-[200px]" />
|
||||
</div>
|
||||
</Pre>
|
||||
</FumaCodeBlock>
|
||||
}
|
||||
>
|
||||
<MagicMove
|
||||
code={[
|
||||
`import { OpenAI } from "llamaindex";
|
||||
const llm = new OpenAI();
|
||||
const response = await llm.complete({ prompt: "How are you?" });`,
|
||||
`import { OpenAI } from "llamaindex";
|
||||
const llm = new OpenAI();
|
||||
const response = await llm.chat({
|
||||
messages: [{ content: "Tell me a joke.", role: "user" }],
|
||||
});`,
|
||||
`import { OpenAI, ChatMemoryBuffer } from "llamaindex";
|
||||
const llm = new OpenAI({ model: 'gpt4o-turbo' });
|
||||
const buffer = new ChatMemoryBuffer({
|
||||
tokenLimit: 128_000,
|
||||
})
|
||||
buffer.put({ content: "Tell me a joke.", role: "user" })
|
||||
const response = await llm.chat({
|
||||
messages: buffer.getMessages(),
|
||||
stream: true
|
||||
});`,
|
||||
`import { OpenAIAgent, ChatMemoryBuffer } from "llamaindex";
|
||||
const agent = new OpenAIAgent({
|
||||
llm,
|
||||
tools: [...myTools]
|
||||
systemPrompt,
|
||||
});
|
||||
const buffer = new ChatMemoryBuffer({
|
||||
tokenLimit: 128_000,
|
||||
})
|
||||
buffer.put({ content: "Analysis the data based on the given data.", role: "user" })
|
||||
buffer.put({ content: \`\${data}\`, role: "user" })
|
||||
const response = await agent.chat({
|
||||
message: buffer.getMessages(),
|
||||
});`,
|
||||
]}
|
||||
/>
|
||||
</Suspense>
|
||||
</Feature>
|
||||
<Feature
|
||||
icon={Bot}
|
||||
subheading="Agent"
|
||||
heading="Build agent for RAG"
|
||||
description="Build agents for RAG using LlamaIndex.TS. Agents are the core building blocks of RAG applications."
|
||||
>
|
||||
<CodeBlock
|
||||
code={`import { FunctionTool } from "llamaindex";
|
||||
import { OpenAIAgent } from "@llamaindex/openai";
|
||||
|
||||
const interpreterTool = FunctionTool.from(...);
|
||||
const systemPrompt = \`...\`;
|
||||
|
||||
const agent = new OpenAIAgent({
|
||||
llm,
|
||||
tools: [interpreterTool],
|
||||
systemPrompt,
|
||||
});
|
||||
|
||||
await agent.chat('...');`}
|
||||
lang="ts"
|
||||
/>
|
||||
</Feature>
|
||||
<Feature
|
||||
icon={Blocks}
|
||||
subheading="Providers"
|
||||
heading="LLM / Data Loader / Vector Store"
|
||||
description="LlamaIndex.TS provides various providers to turn your data into valuable insights."
|
||||
>
|
||||
<div className="mt-8 flex flex-col gap-8">
|
||||
<div>
|
||||
<h3 className="text-lg font-semibold text-fd-muted-foreground mb-2">
|
||||
LLM
|
||||
</h3>
|
||||
<InfiniteLLMProviders />
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-lg font-semibold text-fd-muted-foreground mb-2">
|
||||
Vector Store
|
||||
</h3>
|
||||
<InfiniteVectorStoreProviders />
|
||||
</div>
|
||||
</div>
|
||||
</Feature>
|
||||
<Feature
|
||||
icon={Terminal}
|
||||
subheading="Create Llama CLI"
|
||||
heading="CLI for starting RAG app with one line"
|
||||
description="A command line tool to generate LlamaIndex apps, the easiest way to get started with LlamaIndex."
|
||||
>
|
||||
<div className="my-6">
|
||||
<CreateAppAnimation />
|
||||
</div>
|
||||
</Feature>
|
||||
</div>
|
||||
<Contributing />
|
||||
<div className="border-b" />
|
||||
</main>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
import { DOCUMENT_URL } from "@/lib/const";
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default async function Page(props: {
|
||||
params: Promise<{
|
||||
any: string[];
|
||||
}>;
|
||||
}) {
|
||||
const path = await props.params.then(({ any }) => any.join("/"));
|
||||
return redirect(new URL(path, DOCUMENT_URL).toString());
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
import { source } from "@/lib/source";
|
||||
import { createFromSource } from "fumadocs-core/search/server";
|
||||
|
||||
export const { GET } = createFromSource(source);
|
||||
@@ -0,0 +1,61 @@
|
||||
import { createMetadata, metadataImage } from "@/lib/metadata";
|
||||
import { openapi, source } from "@/lib/source";
|
||||
import { Popup, PopupContent, PopupTrigger } from "fumadocs-twoslash/ui";
|
||||
import defaultMdxComponents from "fumadocs-ui/mdx";
|
||||
import {
|
||||
DocsBody,
|
||||
DocsDescription,
|
||||
DocsPage,
|
||||
DocsTitle,
|
||||
} from "fumadocs-ui/page";
|
||||
import { notFound } from "next/navigation";
|
||||
|
||||
export default async function Page(props: {
|
||||
params: Promise<{ slug?: string[] }>;
|
||||
}) {
|
||||
const params = await props.params;
|
||||
const page = source.getPage(params.slug);
|
||||
if (!page) notFound();
|
||||
|
||||
const MDX = page.data.body;
|
||||
|
||||
return (
|
||||
<DocsPage toc={page.data.toc} full={page.data.full}>
|
||||
<DocsTitle>{page.data.title}</DocsTitle>
|
||||
<DocsDescription>{page.data.description}</DocsDescription>
|
||||
<DocsBody>
|
||||
<MDX
|
||||
components={{
|
||||
...defaultMdxComponents,
|
||||
APIPage: openapi.APIPage,
|
||||
Popup,
|
||||
PopupContent,
|
||||
PopupTrigger,
|
||||
}}
|
||||
/>
|
||||
</DocsBody>
|
||||
</DocsPage>
|
||||
);
|
||||
}
|
||||
|
||||
export async function generateStaticParams() {
|
||||
return source.generateParams();
|
||||
}
|
||||
|
||||
export async function generateMetadata(props: {
|
||||
params: Promise<{ slug?: string[] }>;
|
||||
}) {
|
||||
const params = await props.params;
|
||||
const page = source.getPage(params.slug);
|
||||
if (!page) notFound();
|
||||
|
||||
return createMetadata(
|
||||
metadataImage.withImage(page.slugs, {
|
||||
title: page.data.title,
|
||||
description: page.data.description,
|
||||
openGraph: {
|
||||
url: `/docs/${page.slugs.join("/")}`,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
import { baseOptions } from "@/app/layout.config";
|
||||
import { AITrigger } from "@/components/ai-chat";
|
||||
import { buttonVariants } from "@/components/ui/button";
|
||||
import { source } from "@/lib/source";
|
||||
import { cn } from "@/lib/utils";
|
||||
import "fumadocs-twoslash/twoslash.css";
|
||||
import { DocsLayout } from "fumadocs-ui/layouts/docs";
|
||||
import { MessageCircle } from "lucide-react";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
export default function Layout({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<DocsLayout
|
||||
tree={source.pageTree}
|
||||
{...baseOptions}
|
||||
nav={{
|
||||
...baseOptions.nav,
|
||||
children: (
|
||||
<AITrigger
|
||||
className={cn(
|
||||
buttonVariants({
|
||||
variant: "secondary",
|
||||
size: "xs",
|
||||
className:
|
||||
"md:flex-1 px-2 ms-2 gap-1.5 text-fd-muted-foreground rounded-full",
|
||||
}),
|
||||
)}
|
||||
>
|
||||
<MessageCircle className="size-3" />
|
||||
Ask LlamaCloud
|
||||
</AITrigger>
|
||||
),
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</DocsLayout>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
@layer base {
|
||||
:root {
|
||||
--page-max-width: 1840px;
|
||||
--plus-icon: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03IDFDNyAwLjQ0NzcxNSA2LjU1MjI4IDAgNiAwSDVDNC40NDc3MiAwIDQgMC40NDc3MTUgNCAxVjNDNCAzLjU1MjI5IDMuNTUyMjggNCAzIDRIMUMwLjQ0NzcxNSA0IDAgNC40NDc3MiAwIDVWNkMwIDYuNTUyMjggMC40NDc3MTUgNyAxIDdIM0MzLjU1MjI4IDcgNCA3LjQ0NzcyIDQgOFYxMEM0IDEwLjU1MjMgNC40NDc3MiAxMSA1IDExSDZDNi41NTIyOCAxMSA3IDEwLjU1MjMgNyAxMFY4QzcgNy40NDc3MSA3LjQ0NzcyIDcgOCA3SDEwQzEwLjU1MjMgNyAxMSA2LjU1MjI4IDExIDZWNUMxMSA0LjQ0NzcyIDEwLjU1MjMgNCAxMCA0SDhDNy40NDc3MiA0IDcgMy41NTIyOCA3IDNWMVoiIGZpbGw9IiNBREE4QzQiLz4KPC9zdmc+Cg==");
|
||||
|
||||
--color-neutral-000: #ffffff;
|
||||
--color-neutral-100: #f7f6fc;
|
||||
--color-neutral-200: #cac6dd;
|
||||
--color-neutral-400: #757185;
|
||||
--color-neutral-800: #252134;
|
||||
--color-neutral-900: #0e0c15;
|
||||
|
||||
--color-purple-400: #858dff;
|
||||
--color-red-400: #ff776f;
|
||||
--color-green-400: #7adb78;
|
||||
--color-yellow-400: #ffc876;
|
||||
--color-violet-400: #ac6aff;
|
||||
--color-pink-400: #ff98e2;
|
||||
|
||||
--background: 0 0% 100%;
|
||||
--foreground: 0 0% 3.9%;
|
||||
--card: 0 0% 100%;
|
||||
--card-foreground: 0 0% 3.9%;
|
||||
--popover: 0 0% 100%;
|
||||
--popover-foreground: 0 0% 3.9%;
|
||||
--primary: 0 0% 9%;
|
||||
--primary-foreground: 0 0% 98%;
|
||||
--secondary: 0 0% 96.1%;
|
||||
--secondary-foreground: 0 0% 9%;
|
||||
--muted: 0 0% 96.1%;
|
||||
--muted-foreground: 0 0% 45.1%;
|
||||
--accent: 0 0% 96.1%;
|
||||
--accent-foreground: 0 0% 9%;
|
||||
--destructive: 0 84.2% 60.2%;
|
||||
--destructive-foreground: 0 0% 98%;
|
||||
--border: 0 0% 89.8%;
|
||||
--input: 0 0% 89.8%;
|
||||
--ring: 0 0% 3.9%;
|
||||
--chart-1: 12 76% 61%;
|
||||
--chart-2: 173 58% 39%;
|
||||
--chart-3: 197 37% 24%;
|
||||
--chart-4: 43 74% 66%;
|
||||
--chart-5: 27 87% 67%;
|
||||
--radius: 0.5rem;
|
||||
}
|
||||
.dark {
|
||||
--color-neutral-000: #0e0c15;
|
||||
--color-neutral-100: #252134;
|
||||
--color-neutral-200: #757185;
|
||||
--color-neutral-400: #cac6dd;
|
||||
--color-neutral-800: #f7f6fc;
|
||||
--color-neutral-900: #ffffff;
|
||||
|
||||
--color-purple-400: #858dff;
|
||||
--color-red-400: #ff776f;
|
||||
--color-green-400: #7adb78;
|
||||
--color-yellow-400: #ffc876;
|
||||
--color-violet-400: #ac6aff;
|
||||
--color-pink-400: #ff98e2;
|
||||
|
||||
--background: 0 0% 3.9%;
|
||||
--foreground: 0 0% 98%;
|
||||
--card: 0 0% 3.9%;
|
||||
--card-foreground: 0 0% 98%;
|
||||
--popover: 0 0% 3.9%;
|
||||
--popover-foreground: 0 0% 98%;
|
||||
--primary: 0 0% 98%;
|
||||
--primary-foreground: 0 0% 9%;
|
||||
--secondary: 0 0% 14.9%;
|
||||
--secondary-foreground: 0 0% 98%;
|
||||
--muted: 0 0% 14.9%;
|
||||
--muted-foreground: 0 0% 63.9%;
|
||||
--accent: 0 0% 14.9%;
|
||||
--accent-foreground: 0 0% 98%;
|
||||
--destructive: 0 62.8% 30.6%;
|
||||
--destructive-foreground: 0 0% 98%;
|
||||
--border: 0 0% 14.9%;
|
||||
--input: 0 0% 14.9%;
|
||||
--ring: 0 0% 83.1%;
|
||||
--chart-1: 220 70% 50%;
|
||||
--chart-2: 160 60% 45%;
|
||||
--chart-3: 30 80% 55%;
|
||||
--chart-4: 280 65% 60%;
|
||||
--chart-5: 340 75% 55%;
|
||||
}
|
||||
}
|
||||
@layer base {
|
||||
* {
|
||||
@apply border-border;
|
||||
}
|
||||
body {
|
||||
@apply bg-background text-foreground;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { DOCUMENT_URL } from "@/lib/const";
|
||||
import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared";
|
||||
import Image from "next/image";
|
||||
|
||||
const logo = (
|
||||
<Image
|
||||
src="/logo-large.png"
|
||||
alt="Logo"
|
||||
className="size-8"
|
||||
width={147}
|
||||
height={147}
|
||||
/>
|
||||
);
|
||||
|
||||
/**
|
||||
* Shared layout configurations
|
||||
*
|
||||
* you can configure layouts individually from:
|
||||
* Home Layout: app/(home)/layout.tsx
|
||||
* Docs Layout: app/docs/layout.tsx
|
||||
*/
|
||||
export const baseOptions: BaseLayoutProps = {
|
||||
nav: {
|
||||
title: logo,
|
||||
transparentMode: "top",
|
||||
},
|
||||
githubUrl: "https://github.com/run-llama/LlamaIndexTS",
|
||||
links: [
|
||||
{
|
||||
text: "Documentation",
|
||||
url: DOCUMENT_URL,
|
||||
active: "nested-url",
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,44 @@
|
||||
import { AIProvider } from "@/actions";
|
||||
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||
import { RootProvider } from "fumadocs-ui/provider";
|
||||
import { Inter } from "next/font/google";
|
||||
import type { ReactNode } from "react";
|
||||
import "shiki-magic-move/dist/style.css";
|
||||
import "./global.css";
|
||||
|
||||
const inter = Inter({
|
||||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
export default function Layout({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<html lang="en" className={inter.className} suppressHydrationWarning>
|
||||
<head>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="180x180"
|
||||
href="/apple-touch-icon.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="/favicon-32x32.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="16x16"
|
||||
href="/favicon-16x16.png"
|
||||
/>
|
||||
</head>
|
||||
<body className="flex flex-col min-h-screen">
|
||||
<TooltipProvider>
|
||||
<AIProvider>
|
||||
<RootProvider>{children}</RootProvider>
|
||||
</AIProvider>
|
||||
</TooltipProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
import type { ImageResponseOptions } from "next/dist/compiled/@vercel/og/types";
|
||||
import { ImageResponse } from "next/og";
|
||||
import type { ReactElement, ReactNode } from "react";
|
||||
|
||||
interface GenerateProps {
|
||||
title: ReactNode;
|
||||
description?: ReactNode;
|
||||
icon?: ReactNode;
|
||||
primaryColor?: string;
|
||||
primaryTextColor?: string;
|
||||
site?: ReactNode;
|
||||
}
|
||||
|
||||
export function generateOGImage(
|
||||
options: GenerateProps & ImageResponseOptions,
|
||||
): ImageResponse {
|
||||
const {
|
||||
title,
|
||||
description,
|
||||
icon,
|
||||
site,
|
||||
primaryColor,
|
||||
primaryTextColor,
|
||||
...rest
|
||||
} = options;
|
||||
|
||||
return new ImageResponse(
|
||||
generate({
|
||||
title,
|
||||
description,
|
||||
icon,
|
||||
site,
|
||||
primaryTextColor,
|
||||
primaryColor,
|
||||
}),
|
||||
{
|
||||
width: 1200,
|
||||
height: 630,
|
||||
...rest,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export function generate({
|
||||
primaryColor = "rgba(255,150,255,0.5)",
|
||||
primaryTextColor = "rgb(255,150,255)",
|
||||
...props
|
||||
}: GenerateProps): ReactElement {
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
color: "white",
|
||||
backgroundColor: "#0c0c0c",
|
||||
backgroundImage: `linear-gradient(to right top, ${primaryColor}, ${primaryColor})`,
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
padding: "4rem",
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
alignItems: "center",
|
||||
gap: "16px",
|
||||
marginBottom: "12px",
|
||||
color: primaryTextColor,
|
||||
}}
|
||||
>
|
||||
{props.icon}
|
||||
<p
|
||||
style={{
|
||||
fontSize: "56px",
|
||||
fontWeight: 600,
|
||||
}}
|
||||
>
|
||||
{props.site}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p
|
||||
style={{
|
||||
fontWeight: 800,
|
||||
fontSize: "82px",
|
||||
}}
|
||||
>
|
||||
{props.title}
|
||||
</p>
|
||||
<p
|
||||
style={{
|
||||
fontSize: "52px",
|
||||
color: "rgba(240,240,240,0.7)",
|
||||
}}
|
||||
>
|
||||
{props.description}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
interface GridPatternProps {
|
||||
width?: number;
|
||||
height?: number;
|
||||
x?: number;
|
||||
y?: number;
|
||||
squares?: [x: number, y: number][];
|
||||
strokeDasharray?: number;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
export function GridPattern({
|
||||
width = 100,
|
||||
height = 100,
|
||||
x = -1,
|
||||
y = -1,
|
||||
squares,
|
||||
strokeDasharray,
|
||||
...props
|
||||
}: GridPatternProps): ReactElement {
|
||||
return (
|
||||
<svg
|
||||
fill="rgba(156, 163, 175, 0.2)"
|
||||
stroke="rgba(156, 163, 175, 0.2)"
|
||||
style={{
|
||||
position: "absolute",
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
top: 0,
|
||||
maskImage: "radial-gradient(circle at 0% 100%, white, transparent)",
|
||||
}}
|
||||
viewBox="0 0 600 400"
|
||||
{...props}
|
||||
>
|
||||
<defs>
|
||||
<pattern
|
||||
id="og-pattern"
|
||||
width={width}
|
||||
height={height}
|
||||
patternUnits="userSpaceOnUse"
|
||||
>
|
||||
<path
|
||||
d={`M.5 ${height.toString()}V.5H${width.toString()}`}
|
||||
fill="none"
|
||||
strokeWidth={1}
|
||||
strokeDasharray={strokeDasharray}
|
||||
/>
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect
|
||||
width="600"
|
||||
height="600"
|
||||
strokeWidth={0}
|
||||
fill="url(#og-pattern)"
|
||||
x={x}
|
||||
y={y}
|
||||
/>
|
||||
{squares?.map(([itemX, itemY]) => (
|
||||
<rect
|
||||
strokeWidth="0"
|
||||
key={`${itemX.toString()}-${itemY.toString()}`}
|
||||
width={width - 1}
|
||||
height={height}
|
||||
x={itemX * width + 1}
|
||||
y={itemY * (height + 1)}
|
||||
/>
|
||||
))}
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
"use client";
|
||||
import type { AIProvider } from "@/actions";
|
||||
import { UserMessage } from "@/components/message";
|
||||
import { useActions, useUIState } from "ai/rsc";
|
||||
import { Info } from "lucide-react";
|
||||
import { ButtonHTMLAttributes, useState } from "react";
|
||||
import { Alert, AlertDescription, AlertTitle } from "./ui/alert";
|
||||
import { Button } from "./ui/button";
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogHeader,
|
||||
DialogOverlay,
|
||||
DialogPortal,
|
||||
DialogTitle,
|
||||
DialogTrigger,
|
||||
} from "./ui/dialog";
|
||||
import { Textarea } from "./ui/textarea";
|
||||
import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip";
|
||||
|
||||
type AITriggerProps = ButtonHTMLAttributes<HTMLButtonElement>;
|
||||
|
||||
function ChatList({ messages }: { messages: any[] }) {
|
||||
if (messages.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="relative mx-auto w-full px-4">
|
||||
{messages.map((message, index) => (
|
||||
<div key={index} className="pb-4">
|
||||
{message.display}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export const AITrigger = (props: AITriggerProps) => {
|
||||
const [{ messages }, setUIState] = useUIState<typeof AIProvider>();
|
||||
const { query } = useActions<typeof AIProvider>();
|
||||
const [inputValue, setInputValue] = useState("");
|
||||
return (
|
||||
<Dialog>
|
||||
<DialogTrigger {...props} />
|
||||
<DialogPortal>
|
||||
<DialogOverlay className="fixed inset-0 z-50 bg-fd-background/50 backdrop-blur-sm data-[state=closed]:animate-fd-fade-out data-[state=open]:animate-fd-fade-in" />
|
||||
<DialogContent
|
||||
onOpenAutoFocus={(e) => {
|
||||
document.getElementById("nd-ai-input")?.focus();
|
||||
e.preventDefault();
|
||||
}}
|
||||
className="fixed left-1/2 z-50 my-[5vh] flex max-h-[90dvh] w-[98vw] max-w-[860px] origin-left -translate-x-1/2 flex-col rounded-lg border bg-fd-popover text-fd-popover-foreground shadow-lg focus-visible:outline-none data-[state=closed]:animate-fd-dialog-out data-[state=open]:animate-fd-dialog-in"
|
||||
>
|
||||
<DialogHeader>
|
||||
<DialogTitle className="sr-only">Search AI</DialogTitle>
|
||||
<DialogDescription className="sr-only">
|
||||
Ask AI some questions.
|
||||
</DialogDescription>
|
||||
<Alert>
|
||||
<Info className="size-4" />
|
||||
<AlertTitle>Heads up!</AlertTitle>
|
||||
<AlertDescription>
|
||||
Answers from LlamaCloud may be inaccurate, please use with
|
||||
discretion.
|
||||
</AlertDescription>
|
||||
</Alert>
|
||||
</DialogHeader>
|
||||
<div className="overflow-scroll flex-grow mt-4">
|
||||
<ChatList messages={messages} />
|
||||
</div>
|
||||
<form
|
||||
className="px-4 py-2 space-y-4"
|
||||
action={async () => {
|
||||
const value = inputValue.trim();
|
||||
setInputValue("");
|
||||
if (!value) return;
|
||||
|
||||
// Add user message UI
|
||||
setUIState((state) => ({
|
||||
...state,
|
||||
messages: [
|
||||
...state.messages,
|
||||
{
|
||||
id: Date.now(),
|
||||
display: <UserMessage>{value}</UserMessage>,
|
||||
},
|
||||
],
|
||||
}));
|
||||
|
||||
try {
|
||||
// Submit and get response message
|
||||
const responseMessage = await query(value);
|
||||
setUIState((state) => ({
|
||||
...state,
|
||||
messages: [...state.messages, responseMessage],
|
||||
}));
|
||||
} catch (error) {
|
||||
// You may want to show a toast or trigger an error state.
|
||||
console.error(error);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div className="flex flex-row w-full items-center gap-2">
|
||||
<Textarea
|
||||
tabIndex={0}
|
||||
placeholder="Ask AI about documentation."
|
||||
className="w-full resize-none bg-transparent px-4 focus-within:outline-none sm:text-sm"
|
||||
onKeyDown={(event) => {
|
||||
if (event.key === "Enter" && !event.shiftKey) {
|
||||
event.preventDefault();
|
||||
event.currentTarget.form?.requestSubmit(null);
|
||||
}
|
||||
}}
|
||||
autoFocus
|
||||
spellCheck={false}
|
||||
autoComplete="off"
|
||||
autoCorrect="off"
|
||||
name="message"
|
||||
rows={1}
|
||||
value={inputValue}
|
||||
onChange={(e) => setInputValue(e.target.value)}
|
||||
/>
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<Button
|
||||
type="submit"
|
||||
size="icon"
|
||||
disabled={inputValue === ""}
|
||||
>
|
||||
<span className="sr-only">Send message</span>
|
||||
</Button>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>Send message</TooltipContent>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</form>
|
||||
</DialogContent>
|
||||
</DialogPortal>
|
||||
</Dialog>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,53 @@
|
||||
import * as Base from "fumadocs-ui/components/codeblock";
|
||||
import { toJsxRuntime, type Jsx } from "hast-util-to-jsx-runtime";
|
||||
import { Fragment } from "react";
|
||||
import { jsx, jsxs } from "react/jsx-runtime";
|
||||
import { codeToHast } from "shiki";
|
||||
|
||||
export interface CodeBlockProps {
|
||||
code: string;
|
||||
wrapper?: Base.CodeBlockProps;
|
||||
lang: "bash" | "ts" | "tsx";
|
||||
}
|
||||
|
||||
export async function CodeBlock({
|
||||
code,
|
||||
lang,
|
||||
wrapper,
|
||||
}: CodeBlockProps): Promise<React.ReactElement> {
|
||||
const hast = await codeToHast(code, {
|
||||
lang,
|
||||
defaultColor: false,
|
||||
themes: {
|
||||
light: "github-light",
|
||||
dark: "vesper",
|
||||
},
|
||||
transformers: [
|
||||
{
|
||||
name: "rehype-code:pre-process",
|
||||
line(node) {
|
||||
if (node.children.length === 0) {
|
||||
// Keep the empty lines when using grid layout
|
||||
node.children.push({
|
||||
type: "text",
|
||||
value: " ",
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const rendered = toJsxRuntime(hast, {
|
||||
jsx: jsx as Jsx,
|
||||
jsxs: jsxs as Jsx,
|
||||
Fragment,
|
||||
development: false,
|
||||
components: {
|
||||
// @ts-expect-error -- JSX component
|
||||
pre: Base.Pre,
|
||||
},
|
||||
});
|
||||
|
||||
return <Base.CodeBlock {...wrapper}>{rendered}</Base.CodeBlock>;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
import ContributorCounter from "@/components/contributor-count";
|
||||
import { buttonVariants } from "@/components/ui/button";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { Heart } from "lucide-react";
|
||||
import { ReactElement } from "react";
|
||||
|
||||
export function Contributing(): ReactElement {
|
||||
return (
|
||||
<div className="flex flex-col items-center border-x border-t px-4 py-16 text-center">
|
||||
<Heart className="mb-4" />
|
||||
<h2 className="mb-4 text-xl font-semibold sm:text-2xl">
|
||||
Made Possible by You.
|
||||
</h2>
|
||||
<p className="mb-4 text-fd-muted-foreground">
|
||||
LlamaIndex.TS is powered by the open source community.
|
||||
</p>
|
||||
<div className="mb-8 flex flex-row items-center gap-2">
|
||||
<a
|
||||
href="https://github.com/run-llama/LlamaIndexTS/graphs/contributors"
|
||||
rel="noreferrer noopener"
|
||||
className={cn(buttonVariants({ variant: "ghost" }))}
|
||||
>
|
||||
See Contributors
|
||||
</a>
|
||||
</div>
|
||||
<ContributorCounter repoOwner="run-llama" repoName="LlamaIndexTS" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import { fetchContributors } from "@/lib/get-contributors";
|
||||
import { cn } from "@/lib/utils";
|
||||
import Image from "next/image";
|
||||
import type { HTMLAttributes, ReactElement } from "react";
|
||||
|
||||
export interface ContributorCounterProps
|
||||
extends HTMLAttributes<HTMLDivElement> {
|
||||
repoOwner: string;
|
||||
repoName: string;
|
||||
displayCount?: number;
|
||||
}
|
||||
|
||||
export default async function ContributorCounter({
|
||||
repoOwner,
|
||||
repoName,
|
||||
displayCount = 20,
|
||||
...props
|
||||
}: ContributorCounterProps): Promise<ReactElement> {
|
||||
const contributors = await fetchContributors(repoOwner, repoName);
|
||||
const topContributors = contributors
|
||||
.filter((contributor) => contributor.login !== repoOwner)
|
||||
.slice(0, displayCount);
|
||||
|
||||
return (
|
||||
<div
|
||||
{...props}
|
||||
className={cn("flex flex-col items-center gap-4", props.className)}
|
||||
>
|
||||
<div className="flex flex-row flex-wrap items-center justify-center md:pe-4">
|
||||
{topContributors.map((contributor, i) => (
|
||||
<a
|
||||
key={contributor.login}
|
||||
href={`https://github.com/${contributor.login}`}
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
className="size-10 overflow-hidden rounded-full border-4 border-fd-background bg-fd-background md:-mr-4 md:size-12"
|
||||
style={{
|
||||
zIndex: topContributors.length - i,
|
||||
}}
|
||||
>
|
||||
<Image
|
||||
src={contributor.avatar_url}
|
||||
alt={`${contributor.login}'s avatar`}
|
||||
unoptimized
|
||||
width={48}
|
||||
height={48}
|
||||
/>
|
||||
</a>
|
||||
))}
|
||||
{displayCount < contributors.length ? (
|
||||
<div className="size-12 content-center rounded-full bg-fd-secondary text-center">
|
||||
+{contributors.length - displayCount}
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
<div className="text-center text-sm text-fd-muted-foreground">
|
||||
Some of our best contributors.
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
"use client";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { TerminalIcon } from "lucide-react";
|
||||
import {
|
||||
Fragment,
|
||||
HTMLAttributes,
|
||||
ReactElement,
|
||||
ReactNode,
|
||||
useEffect,
|
||||
useState,
|
||||
} from "react";
|
||||
import { Input } from "./ui/input";
|
||||
|
||||
export function CreateAppAnimation(): React.ReactElement {
|
||||
const installCmd = "npx create-llama@latest";
|
||||
const tickTime = 100;
|
||||
const timeCommandEnter = installCmd.length;
|
||||
const timeCommandRun = timeCommandEnter + 3;
|
||||
const timeCommandEnd = timeCommandRun + 3;
|
||||
const timeWindowOpen = timeCommandEnd + 1;
|
||||
const timeEnd = timeWindowOpen + 1;
|
||||
|
||||
const [tick, setTick] = useState(timeEnd);
|
||||
|
||||
useEffect(() => {
|
||||
const timer = setInterval(() => {
|
||||
setTick((prev) => (prev >= timeEnd ? prev : prev + 1));
|
||||
}, tickTime);
|
||||
|
||||
return () => {
|
||||
clearInterval(timer);
|
||||
};
|
||||
}, [timeEnd]);
|
||||
|
||||
const lines: ReactElement[] = [];
|
||||
|
||||
lines.push(
|
||||
<span key="command_type">
|
||||
{installCmd.substring(0, tick)}
|
||||
{tick < timeCommandEnter && (
|
||||
<div className="inline-block h-3 w-1 animate-pulse bg-white" />
|
||||
)}
|
||||
</span>,
|
||||
);
|
||||
|
||||
if (tick >= timeCommandEnter) {
|
||||
lines.push(<span key="space"> </span>);
|
||||
}
|
||||
|
||||
if (tick > timeCommandRun)
|
||||
lines.push(
|
||||
<Fragment key="command_response">
|
||||
<span className="font-bold">┌ Create Llama</span>
|
||||
<span>│</span>
|
||||
{tick > timeCommandRun + 1 && (
|
||||
<>
|
||||
<span className="font-bold">◇ What is your project named?</span>
|
||||
<span>│ my-app</span>
|
||||
</>
|
||||
)}
|
||||
{tick > timeCommandRun + 2 && (
|
||||
<>
|
||||
<span>│</span>
|
||||
<span className="font-bold">◆ What app do you want to build?</span>
|
||||
</>
|
||||
)}
|
||||
{tick > timeCommandRun + 3 && (
|
||||
<>
|
||||
<span>│ ● Agentic RAG</span>
|
||||
<span>│ ○ Data Scientist</span>
|
||||
</>
|
||||
)}
|
||||
</Fragment>,
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
className="relative"
|
||||
onMouseEnter={() => {
|
||||
if (tick >= timeEnd) {
|
||||
setTick(0);
|
||||
}
|
||||
}}
|
||||
>
|
||||
{tick > timeWindowOpen && (
|
||||
<LaunchAppWindow className="absolute bottom-5 right-4 z-10 animate-in fade-in slide-in-from-top-10" />
|
||||
)}
|
||||
<pre className="overflow-hidden rounded-xl border text-xs">
|
||||
<div className="flex flex-row items-center gap-2 border-b px-4 py-2">
|
||||
<TerminalIcon className="size-4" />{" "}
|
||||
<span className="font-bold">Terminal</span>
|
||||
<div className="grow" />
|
||||
<div className="size-2 rounded-full bg-red-400" />
|
||||
</div>
|
||||
<div className="min-h-[200px] bg-gradient-to-b from-fd-secondary [mask-image:linear-gradient(to_bottom,white,transparent)]">
|
||||
<code className="grid p-4">{lines}</code>
|
||||
</div>
|
||||
</pre>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function UserMessage({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<div className="group relative flex items-start">
|
||||
<div className="flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow-sm bg-background">
|
||||
<IconUser />
|
||||
</div>
|
||||
<div className="ml-4 flex-1 space-y-2 overflow-hidden px-1">
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function BotMessage({
|
||||
children,
|
||||
className,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
className?: string;
|
||||
}) {
|
||||
return (
|
||||
<div className={cn("group relative flex items-start", className)}>
|
||||
<div className="flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow-sm bg-primary text-primary-foreground">
|
||||
<IconAI />
|
||||
</div>
|
||||
<div className="ml-4 flex-1 space-y-2 overflow-hidden px-1">
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function ChatExample() {
|
||||
const userMessageFull =
|
||||
"Hello, please summarize the article on the file I uploaded.";
|
||||
const botMessageFull = "Processing...";
|
||||
|
||||
const tickTime = 100;
|
||||
const userMessageDuration = userMessageFull.length;
|
||||
const botMessageDelay = userMessageDuration + 10;
|
||||
const botMessageDuration = botMessageDelay + botMessageFull.length;
|
||||
const totalDuration = botMessageDuration + 10;
|
||||
|
||||
const [tick, setTick] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
// Increment tick every tickTime milliseconds
|
||||
const timer = setInterval(() => {
|
||||
setTick((prev) => (prev >= totalDuration ? prev : prev + 1));
|
||||
}, tickTime);
|
||||
|
||||
return () => {
|
||||
clearInterval(timer);
|
||||
};
|
||||
}, [totalDuration]);
|
||||
|
||||
const userMessageLength = Math.min(tick, userMessageFull.length);
|
||||
const botMessageLength = Math.max(
|
||||
0,
|
||||
Math.min(tick - botMessageDelay, botMessageFull.length),
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="max-w-64">
|
||||
<div className="flex flex-col px-4 gap-2">
|
||||
{userMessageLength === userMessageFull.length && (
|
||||
<UserMessage>
|
||||
<span>{userMessageFull}</span>
|
||||
</UserMessage>
|
||||
)}
|
||||
{tick > botMessageDelay && (
|
||||
<BotMessage>
|
||||
<div>
|
||||
<p>
|
||||
{botMessageFull.substring(0, botMessageLength)}
|
||||
{tick - botMessageDelay < botMessageFull.length && (
|
||||
<span className="inline-block h-3 w-1 animate-pulse bg-white" />
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
</BotMessage>
|
||||
)}
|
||||
</div>
|
||||
<Input
|
||||
className="mt-4"
|
||||
value={
|
||||
userMessageFull.substring(0, userMessageLength) === userMessageFull
|
||||
? ""
|
||||
: userMessageFull.substring(0, userMessageLength)
|
||||
}
|
||||
readOnly
|
||||
placeholder="Input message..."
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function LaunchAppWindow(
|
||||
props: HTMLAttributes<HTMLDivElement>,
|
||||
): React.ReactElement {
|
||||
return (
|
||||
<div
|
||||
{...props}
|
||||
className={cn(
|
||||
"overflow-hidden rounded-md border bg-fd-background shadow-xl",
|
||||
props.className,
|
||||
)}
|
||||
>
|
||||
<div className="relative flex h-6 flex-row items-center border-b bg-fd-muted px-4 text-xs text-fd-muted-foreground">
|
||||
<p className="absolute inset-x-0 text-center">localhost:8080</p>
|
||||
</div>
|
||||
<div className="p-4 text-sm">
|
||||
<ChatExample />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function IconUser({ className, ...props }: React.ComponentProps<"svg">) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 256 256"
|
||||
fill="currentColor"
|
||||
className={cn("h-4 w-4", className)}
|
||||
{...props}
|
||||
>
|
||||
<path d="M230.92 212c-15.23-26.33-38.7-45.21-66.09-54.16a72 72 0 1 0-73.66 0c-27.39 8.94-50.86 27.82-66.09 54.16a8 8 0 1 0 13.85 8c18.84-32.56 52.14-52 89.07-52s70.23 19.44 89.07 52a8 8 0 1 0 13.85-8ZM72 96a56 56 0 1 1 56 56 56.06 56.06 0 0 1-56-56Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
|
||||
function IconAI({ className, ...props }: React.ComponentProps<"svg">) {
|
||||
return (
|
||||
<svg
|
||||
fill="currentColor"
|
||||
viewBox="0 0 256 256"
|
||||
role="img"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className={cn("h-4 w-4", className)}
|
||||
{...props}
|
||||
>
|
||||
<path d="M197.58,129.06l-51.61-19-19-51.65a15.92,15.92,0,0,0-29.88,0L78.07,110l-51.65,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0l19-51.61,51.65-19a15.92,15.92,0,0,0,0-29.88ZM140.39,163a15.87,15.87,0,0,0-9.43,9.43l-19,51.46L93,172.39A15.87,15.87,0,0,0,83.61,163h0L32.15,144l51.46-19A15.87,15.87,0,0,0,93,115.61l19-51.46,19,51.46a15.87,15.87,0,0,0,9.43,9.43l51.46,19ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z"></path>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import { LucideIcon } from "lucide-react";
|
||||
import { HTMLAttributes, ReactElement, ReactNode } from "react";
|
||||
|
||||
export function Feature({
|
||||
className,
|
||||
icon: Icon,
|
||||
heading,
|
||||
subheading,
|
||||
description,
|
||||
...props
|
||||
}: HTMLAttributes<HTMLDivElement> & {
|
||||
icon: LucideIcon;
|
||||
subheading: ReactNode;
|
||||
heading: ReactNode;
|
||||
description: ReactNode;
|
||||
}): ReactElement {
|
||||
return (
|
||||
<div
|
||||
className={cn("border-l border-t px-6 py-12 md:py-16", className)}
|
||||
{...props}
|
||||
>
|
||||
<div className="mb-4 inline-flex items-center gap-2 text-sm font-medium text-fd-muted-foreground">
|
||||
<Icon className="size-4" />
|
||||
<p>{subheading}</p>
|
||||
</div>
|
||||
<h2 className="mb-2 text-lg font-semibold">{heading}</h2>
|
||||
<p className="text-fd-muted-foreground">{description}</p>
|
||||
|
||||
{props.children}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
import { InfiniteSlider } from "@/components/ui/infinite-slider";
|
||||
import { SiAnthropic, SiOpenai } from "@icons-pack/react-simple-icons";
|
||||
import Image from "next/image";
|
||||
|
||||
export function InfiniteLLMProviders() {
|
||||
return (
|
||||
<InfiniteSlider gap={24} reverse>
|
||||
<SiOpenai className="h-[60px] w-auto" />
|
||||
<Image
|
||||
src="/icons/Google_2015_logo.svg"
|
||||
alt="Google"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
<Image
|
||||
src="/icons/Microsoft_Azure.svg"
|
||||
alt="Microsoft Azure"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
<SiAnthropic className="h-[60px] w-auto" />
|
||||
<Image
|
||||
src="/icons/Amazon_Web_Services_Logo.svg"
|
||||
alt="Amazon Web Services"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
<Image
|
||||
src="/icons/Groq_Logo.svg"
|
||||
alt="Groq"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
</InfiniteSlider>
|
||||
);
|
||||
}
|
||||
|
||||
export function InfiniteVectorStoreProviders() {
|
||||
return (
|
||||
<InfiniteSlider gap={24}>
|
||||
<Image
|
||||
src="/icons/postgresql-ar21.svg"
|
||||
alt="PostgreSQL"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
<Image
|
||||
src="/icons/Datastax_logo.svg"
|
||||
alt="Datastax"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
<Image
|
||||
src="/icons/chroma.svg"
|
||||
alt="Chroma"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
<Image
|
||||
src="/icons/weaviate-nav-logo-light.svg"
|
||||
alt="Weaviate"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
<Image
|
||||
src="/icons/qdrant-logo.svg"
|
||||
alt="Qdrant"
|
||||
width={60}
|
||||
height={60}
|
||||
className="h-[60px] w-auto"
|
||||
/>
|
||||
</InfiniteSlider>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
"use client";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { CodeBlock, Pre } from "fumadocs-ui/components/codeblock";
|
||||
import { RotateCcw } from "lucide-react";
|
||||
import { useTheme } from "next-themes";
|
||||
import { use, useCallback, useEffect, useState } from "react";
|
||||
import { getSingletonHighlighter } from "shiki";
|
||||
import { ShikiMagicMove } from "shiki-magic-move/react";
|
||||
import { createOnigurumaEngine } from "shiki/engine/oniguruma";
|
||||
|
||||
const highlighterPromise = getSingletonHighlighter({
|
||||
engine: createOnigurumaEngine(() => import("shiki/wasm")),
|
||||
themes: ["vesper", "github-light"],
|
||||
langs: ["js", "ts", "tsx"],
|
||||
});
|
||||
|
||||
export type MagicMoveProps = {
|
||||
code: string[];
|
||||
};
|
||||
|
||||
export function MagicMove(props: MagicMoveProps) {
|
||||
const [move, setMove] = useState<number>(0);
|
||||
const currentCode = props.code[move];
|
||||
const highlighter = use(highlighterPromise);
|
||||
const { resolvedTheme } = useTheme();
|
||||
|
||||
const animate = useCallback(() => {
|
||||
setMove((move) => (move + 1) % props.code.length);
|
||||
}, [props.code]);
|
||||
|
||||
useEffect(() => {
|
||||
if (move === props.code.length - 1) {
|
||||
return;
|
||||
} else {
|
||||
const interval = setInterval(animate, 3000);
|
||||
return () => clearInterval(interval);
|
||||
}
|
||||
}, [animate, move, props.code]);
|
||||
|
||||
return (
|
||||
<CodeBlock allowCopy={false}>
|
||||
{highlighter && (
|
||||
<Pre>
|
||||
<ShikiMagicMove
|
||||
lang="ts"
|
||||
theme={resolvedTheme === "dark" ? "vesper" : "github-light"}
|
||||
highlighter={highlighter}
|
||||
code={currentCode}
|
||||
options={{
|
||||
duration: 800,
|
||||
stagger: 0.3,
|
||||
lineNumbers: false,
|
||||
containerStyle: false,
|
||||
}}
|
||||
/>
|
||||
</Pre>
|
||||
)}
|
||||
<Button
|
||||
className={cn(
|
||||
"absolute bottom-2 right-2",
|
||||
move !== props.code.length - 1 ? "hidden" : "",
|
||||
)}
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
disabled={move !== props.code.length - 1}
|
||||
onClick={animate}
|
||||
>
|
||||
<RotateCcw />
|
||||
</Button>
|
||||
</CodeBlock>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
"use client";
|
||||
import { createProcessor, run } from "@mdx-js/mdx";
|
||||
import defaultMdxComponents from "fumadocs-ui/mdx";
|
||||
import { ReactNode, useDeferredValue } from "react";
|
||||
import * as runtime from "react/jsx-runtime";
|
||||
import useSWR from "swr";
|
||||
|
||||
const processor = createProcessor({
|
||||
outputFormat: "function-body",
|
||||
});
|
||||
|
||||
export function ClientMDXContent({
|
||||
content,
|
||||
id,
|
||||
}: {
|
||||
content: string;
|
||||
id: number;
|
||||
}): ReactNode {
|
||||
const deferredContent = useDeferredValue(content);
|
||||
const { data: jsx } = useSWR(["mdx", id, deferredContent], {
|
||||
fetcher: async () => {
|
||||
const code = await processor
|
||||
.process(deferredContent)
|
||||
.then((vfile) => vfile.value);
|
||||
const { default: Content } = await run(code, {
|
||||
...runtime,
|
||||
baseUrl: import.meta.url,
|
||||
});
|
||||
return (
|
||||
<Content
|
||||
components={{
|
||||
...defaultMdxComponents,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
},
|
||||
suspense: true,
|
||||
});
|
||||
|
||||
return jsx;
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
"use client";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import Image from "next/image";
|
||||
import { ReactNode } from "react";
|
||||
import { IconAI, IconUser } from "./ui/icons";
|
||||
|
||||
export function UserMessage({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<div className="group relative flex items-start">
|
||||
<div className="flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow-sm bg-background">
|
||||
<IconUser />
|
||||
</div>
|
||||
<div className="ml-4 flex-1 space-y-2 overflow-hidden px-1">
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function BotMessage({
|
||||
children,
|
||||
className,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
className?: string;
|
||||
}) {
|
||||
return (
|
||||
<div className={cn("group relative flex items-start", className)}>
|
||||
<div className="flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow-sm">
|
||||
<Image
|
||||
src="/logo-large.png"
|
||||
alt="Logo"
|
||||
className="size-4"
|
||||
width={147}
|
||||
height={147}
|
||||
/>
|
||||
</div>
|
||||
<div className="ml-4 flex-1 space-y-2 overflow-hidden px-1">
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function BotCard({
|
||||
children,
|
||||
showAvatar = true,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
showAvatar?: boolean;
|
||||
}) {
|
||||
return (
|
||||
<div className="group relative flex items-start md:-ml-12">
|
||||
<div
|
||||
className={cn(
|
||||
"flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow-sm bg-primary text-primary-foreground",
|
||||
!showAvatar && "invisible",
|
||||
)}
|
||||
>
|
||||
<IconAI />
|
||||
</div>
|
||||
<div className="ml-4 flex-1 px-1">{children}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function SystemMessage({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div
|
||||
className={
|
||||
"mt-2 flex items-center justify-center gap-2 text-xs text-gray-500"
|
||||
}
|
||||
>
|
||||
<div className={"max-w-[600px] flex-initial px-2 py-2"}>{children}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
"use client";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { useClipboard } from "foxact/use-clipboard";
|
||||
import { Check, Copy } from "lucide-react";
|
||||
import { useCallback, useState } from "react";
|
||||
|
||||
export const NpmInstall = () => {
|
||||
const { copy } = useClipboard();
|
||||
const [hasCheckIcon, setHasCheckIcon] = useState(false);
|
||||
|
||||
return (
|
||||
<Button
|
||||
onClick={useCallback(() => {
|
||||
copy("npm i llamaindex")
|
||||
.then(() => {
|
||||
setHasCheckIcon(true);
|
||||
|
||||
setTimeout(() => {
|
||||
setHasCheckIcon(false);
|
||||
}, 1000);
|
||||
})
|
||||
.catch(console.error);
|
||||
}, [copy])}
|
||||
variant="outline"
|
||||
className="flex flex-row items-center justify-center"
|
||||
>
|
||||
<code className="mr-2">$ npm i llamaindex</code>
|
||||
<div className="relative cursor-pointer bg-transparent w-4 h-4">
|
||||
<div
|
||||
className={`absolute inset-0 transform transition-all duration-300 ${
|
||||
hasCheckIcon ? "scale-0 opacity-0" : "scale-100 opacity-100"
|
||||
}`}
|
||||
>
|
||||
<Copy className="h-4 w-4 text-zinc-800 dark:text-zinc-200" />
|
||||
</div>
|
||||
<div
|
||||
className={`absolute inset-0 transform transition-all duration-300 ${
|
||||
hasCheckIcon ? "scale-100 opacity-100" : "scale-0 opacity-0"
|
||||
}`}
|
||||
>
|
||||
<Check className="h-4 w-4 text-zinc-800 dark:text-zinc-200" />
|
||||
</div>
|
||||
</div>
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
"use client";
|
||||
import { useEffect, useState } from "react";
|
||||
import ReactTextTransition from "react-text-transition";
|
||||
|
||||
const supports = [
|
||||
"Next.js",
|
||||
"Node.js",
|
||||
"Hono",
|
||||
"Express.js",
|
||||
"Deno",
|
||||
"Nest.js",
|
||||
"Waku",
|
||||
];
|
||||
|
||||
export const TextEffect = () => {
|
||||
const [counter, setCounter] = useState(0);
|
||||
useEffect(() => {
|
||||
const id = setInterval(() => {
|
||||
setCounter(
|
||||
(Math.floor(Math.random() * supports.length) + 1) % supports.length,
|
||||
);
|
||||
}, 4000);
|
||||
return () => {
|
||||
clearInterval(id);
|
||||
};
|
||||
}, []);
|
||||
return <ReactTextTransition inline>{supports[counter]}</ReactTextTransition>;
|
||||
};
|
||||
@@ -0,0 +1,59 @@
|
||||
import { cva, type VariantProps } from "class-variance-authority";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
const alertVariants = cva(
|
||||
"relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
|
||||
{
|
||||
variants: {
|
||||
variant: {
|
||||
default: "bg-background text-foreground",
|
||||
destructive:
|
||||
"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
|
||||
},
|
||||
},
|
||||
defaultVariants: {
|
||||
variant: "default",
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
const Alert = React.forwardRef<
|
||||
HTMLDivElement,
|
||||
React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
|
||||
>(({ className, variant, ...props }, ref) => (
|
||||
<div
|
||||
ref={ref}
|
||||
role="alert"
|
||||
className={cn(alertVariants({ variant }), className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
Alert.displayName = "Alert";
|
||||
|
||||
const AlertTitle = React.forwardRef<
|
||||
HTMLParagraphElement,
|
||||
React.HTMLAttributes<HTMLHeadingElement>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<h5
|
||||
ref={ref}
|
||||
className={cn("mb-1 font-medium leading-none tracking-tight", className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
AlertTitle.displayName = "AlertTitle";
|
||||
|
||||
const AlertDescription = React.forwardRef<
|
||||
HTMLParagraphElement,
|
||||
React.HTMLAttributes<HTMLParagraphElement>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<div
|
||||
ref={ref}
|
||||
className={cn("text-sm [&_p]:leading-relaxed", className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
AlertDescription.displayName = "AlertDescription";
|
||||
|
||||
export { Alert, AlertDescription, AlertTitle };
|
||||
@@ -0,0 +1,58 @@
|
||||
import { Slot } from "@radix-ui/react-slot";
|
||||
import { cva, type VariantProps } from "class-variance-authority";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
const buttonVariants = cva(
|
||||
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
||||
{
|
||||
variants: {
|
||||
variant: {
|
||||
default:
|
||||
"bg-primary text-primary-foreground shadow hover:bg-primary/90",
|
||||
destructive:
|
||||
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
|
||||
outline:
|
||||
"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
|
||||
secondary:
|
||||
"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
|
||||
ghost: "hover:bg-accent hover:text-accent-foreground",
|
||||
link: "text-primary underline-offset-4 hover:underline",
|
||||
},
|
||||
size: {
|
||||
default: "h-9 px-4 py-2",
|
||||
sm: "h-8 rounded-md px-3 text-xs",
|
||||
lg: "h-10 rounded-md px-8",
|
||||
xs: "px-1.5 py-0.5 text-xs",
|
||||
icon: "h-9 w-9",
|
||||
},
|
||||
},
|
||||
defaultVariants: {
|
||||
variant: "default",
|
||||
size: "default",
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
export interface ButtonProps
|
||||
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
||||
VariantProps<typeof buttonVariants> {
|
||||
asChild?: boolean;
|
||||
}
|
||||
|
||||
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
||||
({ className, variant, size, asChild = false, ...props }, ref) => {
|
||||
const Comp = asChild ? Slot : "button";
|
||||
return (
|
||||
<Comp
|
||||
className={cn(buttonVariants({ variant, size, className }))}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
},
|
||||
);
|
||||
Button.displayName = "Button";
|
||||
|
||||
export { Button, buttonVariants };
|
||||
@@ -0,0 +1,122 @@
|
||||
"use client";
|
||||
|
||||
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
||||
import { Cross2Icon } from "@radix-ui/react-icons";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
const Dialog = DialogPrimitive.Root;
|
||||
|
||||
const DialogTrigger = DialogPrimitive.Trigger;
|
||||
|
||||
const DialogPortal = DialogPrimitive.Portal;
|
||||
|
||||
const DialogClose = DialogPrimitive.Close;
|
||||
|
||||
const DialogOverlay = React.forwardRef<
|
||||
React.ElementRef<typeof DialogPrimitive.Overlay>,
|
||||
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<DialogPrimitive.Overlay
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
||||
|
||||
const DialogContent = React.forwardRef<
|
||||
React.ElementRef<typeof DialogPrimitive.Content>,
|
||||
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
|
||||
>(({ className, children, ...props }, ref) => (
|
||||
<DialogPortal>
|
||||
<DialogOverlay />
|
||||
<DialogPrimitive.Content
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
>
|
||||
{children}
|
||||
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
|
||||
<Cross2Icon className="h-4 w-4" />
|
||||
<span className="sr-only">Close</span>
|
||||
</DialogPrimitive.Close>
|
||||
</DialogPrimitive.Content>
|
||||
</DialogPortal>
|
||||
));
|
||||
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
||||
|
||||
const DialogHeader = ({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) => (
|
||||
<div
|
||||
className={cn(
|
||||
"flex flex-col space-y-1.5 text-center sm:text-left",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
DialogHeader.displayName = "DialogHeader";
|
||||
|
||||
const DialogFooter = ({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) => (
|
||||
<div
|
||||
className={cn(
|
||||
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
DialogFooter.displayName = "DialogFooter";
|
||||
|
||||
const DialogTitle = React.forwardRef<
|
||||
React.ElementRef<typeof DialogPrimitive.Title>,
|
||||
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<DialogPrimitive.Title
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"text-lg font-semibold leading-none tracking-tight",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
||||
|
||||
const DialogDescription = React.forwardRef<
|
||||
React.ElementRef<typeof DialogPrimitive.Description>,
|
||||
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<DialogPrimitive.Description
|
||||
ref={ref}
|
||||
className={cn("text-sm text-muted-foreground", className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
||||
|
||||
export {
|
||||
Dialog,
|
||||
DialogClose,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogOverlay,
|
||||
DialogPortal,
|
||||
DialogTitle,
|
||||
DialogTrigger,
|
||||
};
|
||||
@@ -0,0 +1,30 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
export function IconAI({ className, ...props }: React.ComponentProps<"svg">) {
|
||||
return (
|
||||
<svg
|
||||
fill="currentColor"
|
||||
viewBox="0 0 256 256"
|
||||
role="img"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className={cn("h-4 w-4", className)}
|
||||
{...props}
|
||||
>
|
||||
<path d="M197.58,129.06l-51.61-19-19-51.65a15.92,15.92,0,0,0-29.88,0L78.07,110l-51.65,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0l19-51.61,51.65-19a15.92,15.92,0,0,0,0-29.88ZM140.39,163a15.87,15.87,0,0,0-9.43,9.43l-19,51.46L93,172.39A15.87,15.87,0,0,0,83.61,163h0L32.15,144l51.46-19A15.87,15.87,0,0,0,93,115.61l19-51.46,19,51.46a15.87,15.87,0,0,0,9.43,9.43l51.46,19ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z"></path>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
|
||||
export function IconUser({ className, ...props }: React.ComponentProps<"svg">) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 256 256"
|
||||
fill="currentColor"
|
||||
className={cn("h-4 w-4", className)}
|
||||
{...props}
|
||||
>
|
||||
<path d="M230.92 212c-15.23-26.33-38.7-45.21-66.09-54.16a72 72 0 1 0-73.66 0c-27.39 8.94-50.86 27.82-66.09 54.16a8 8 0 1 0 13.85 8c18.84-32.56 52.14-52 89.07-52s70.23 19.44 89.07 52a8 8 0 1 0 13.85-8ZM72 96a56 56 0 1 1 56 56 56.06 56.06 0 0 1-56-56Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
"use client";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { animate, motion, useMotionValue } from "framer-motion";
|
||||
import { useEffect, useState } from "react";
|
||||
import useMeasure from "react-use-measure";
|
||||
|
||||
type InfiniteSliderProps = {
|
||||
children: React.ReactNode;
|
||||
gap?: number;
|
||||
duration?: number;
|
||||
durationOnHover?: number;
|
||||
direction?: "horizontal" | "vertical";
|
||||
reverse?: boolean;
|
||||
className?: string;
|
||||
};
|
||||
|
||||
export function InfiniteSlider({
|
||||
children,
|
||||
gap = 16,
|
||||
duration = 25,
|
||||
durationOnHover,
|
||||
direction = "horizontal",
|
||||
reverse = false,
|
||||
className,
|
||||
}: InfiniteSliderProps) {
|
||||
const [currentDuration, setCurrentDuration] = useState(duration);
|
||||
const [ref, { width, height }] = useMeasure();
|
||||
const translation = useMotionValue(0);
|
||||
const [isTransitioning, setIsTransitioning] = useState(false);
|
||||
const [key, setKey] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
let controls;
|
||||
const size = direction === "horizontal" ? width : height;
|
||||
const contentSize = size + gap;
|
||||
const from = reverse ? -contentSize / 2 : 0;
|
||||
const to = reverse ? 0 : -contentSize / 2;
|
||||
|
||||
if (isTransitioning) {
|
||||
controls = animate(translation, [translation.get(), to], {
|
||||
ease: "linear",
|
||||
duration:
|
||||
currentDuration * Math.abs((translation.get() - to) / contentSize),
|
||||
onComplete: () => {
|
||||
setIsTransitioning(false);
|
||||
setKey((prevKey) => prevKey + 1);
|
||||
},
|
||||
});
|
||||
} else {
|
||||
controls = animate(translation, [from, to], {
|
||||
ease: "linear",
|
||||
duration: currentDuration,
|
||||
repeat: Infinity,
|
||||
repeatType: "loop",
|
||||
repeatDelay: 0,
|
||||
onRepeat: () => {
|
||||
translation.set(from);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
return controls?.stop;
|
||||
}, [
|
||||
key,
|
||||
translation,
|
||||
currentDuration,
|
||||
width,
|
||||
height,
|
||||
gap,
|
||||
isTransitioning,
|
||||
direction,
|
||||
reverse,
|
||||
]);
|
||||
|
||||
const hoverProps = durationOnHover
|
||||
? {
|
||||
onHoverStart: () => {
|
||||
setIsTransitioning(true);
|
||||
setCurrentDuration(durationOnHover);
|
||||
},
|
||||
onHoverEnd: () => {
|
||||
setIsTransitioning(true);
|
||||
setCurrentDuration(duration);
|
||||
},
|
||||
}
|
||||
: {};
|
||||
|
||||
return (
|
||||
<div className={cn("overflow-hidden", className)}>
|
||||
<motion.div
|
||||
className="flex w-max items-center"
|
||||
style={{
|
||||
...(direction === "horizontal"
|
||||
? { x: translation }
|
||||
: { y: translation }),
|
||||
gap: `${gap}px`,
|
||||
flexDirection: direction === "horizontal" ? "row" : "column",
|
||||
}}
|
||||
ref={ref}
|
||||
{...hoverProps}
|
||||
>
|
||||
{children}
|
||||
{children}
|
||||
</motion.div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
export interface InputProps
|
||||
extends React.InputHTMLAttributes<HTMLInputElement> {}
|
||||
|
||||
const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
||||
({ className, type, ...props }, ref) => {
|
||||
return (
|
||||
<input
|
||||
type={type}
|
||||
className={cn(
|
||||
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
||||
className,
|
||||
)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
},
|
||||
);
|
||||
Input.displayName = "Input";
|
||||
|
||||
export { Input };
|
||||
@@ -0,0 +1,15 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
function Skeleton({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div
|
||||
className={cn("animate-pulse rounded-md bg-primary/10", className)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export { Skeleton };
|
||||
@@ -0,0 +1,24 @@
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
export interface TextareaProps
|
||||
extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}
|
||||
|
||||
const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
||||
({ className, ...props }, ref) => {
|
||||
return (
|
||||
<textarea
|
||||
className={cn(
|
||||
"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
||||
className,
|
||||
)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
},
|
||||
);
|
||||
Textarea.displayName = "Textarea";
|
||||
|
||||
export { Textarea };
|
||||
@@ -0,0 +1,32 @@
|
||||
"use client";
|
||||
|
||||
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
const TooltipProvider = TooltipPrimitive.Provider;
|
||||
|
||||
const Tooltip = TooltipPrimitive.Root;
|
||||
|
||||
const TooltipTrigger = TooltipPrimitive.Trigger;
|
||||
|
||||
const TooltipContent = React.forwardRef<
|
||||
React.ElementRef<typeof TooltipPrimitive.Content>,
|
||||
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
|
||||
>(({ className, sideOffset = 4, ...props }, ref) => (
|
||||
<TooltipPrimitive.Portal>
|
||||
<TooltipPrimitive.Content
|
||||
ref={ref}
|
||||
sideOffset={sideOffset}
|
||||
className={cn(
|
||||
"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
</TooltipPrimitive.Portal>
|
||||
));
|
||||
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
||||
|
||||
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
||||
@@ -0,0 +1,151 @@
|
||||
.footer {
|
||||
width: 100%;
|
||||
max-width: var(--page-max-width);
|
||||
margin-inline: auto;
|
||||
margin-top: 6em;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.navContainer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
row-gap: 3em;
|
||||
border-bottom: 1px var(--color-neutral-200) solid;
|
||||
margin-bottom: 2em;
|
||||
padding-bottom: 2em;
|
||||
}
|
||||
|
||||
.logoContainer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.nav {
|
||||
display: flex;
|
||||
gap: 5em;
|
||||
margin-bottom: 2em;
|
||||
flex-wrap: wrap;
|
||||
gap: 3em;
|
||||
row-gap: 2em;
|
||||
text-align: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.nav ul {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5em;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.nav ul a {
|
||||
color: var(--color-neutral-400);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav ul a:hover {
|
||||
color: var(--color-neutral-900);
|
||||
}
|
||||
|
||||
.nav ul a:hover span {
|
||||
color: var(--color-neutral-900);
|
||||
}
|
||||
|
||||
.nav ul a span {
|
||||
transition: color 300ms cubic-bezier(0.72, 0, 0.12, 1);
|
||||
}
|
||||
|
||||
.navHeader,
|
||||
.navHeader a {
|
||||
color: var(--color-neutral-900);
|
||||
text-decoration: none;
|
||||
letter-spacing: -0.03em;
|
||||
}
|
||||
|
||||
.navHeader a {
|
||||
transition: color 300ms cubic-bezier(0.72, 0, 0.12, 1);
|
||||
}
|
||||
|
||||
.navHeader a:hover {
|
||||
color: var(--color-neutral-800);
|
||||
}
|
||||
|
||||
.navHeader {
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
.socialContainer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-top: 2em;
|
||||
}
|
||||
|
||||
.copyright {
|
||||
text-align: center;
|
||||
color: var(--color-neutral-400);
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
.copyright a {
|
||||
color: currentColor;
|
||||
text-decoration: none;
|
||||
transition: color 300ms cubic-bezier(0.72, 0, 0.12, 1);
|
||||
}
|
||||
|
||||
.copyright a:hover {
|
||||
color: var(--color-neutral-800);
|
||||
}
|
||||
|
||||
.copyrightContainer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
column-gap: 2em;
|
||||
row-gap: 1em;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 3em;
|
||||
}
|
||||
|
||||
.legalNav {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 1em;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.footer {
|
||||
padding: 0 2em;
|
||||
}
|
||||
|
||||
.footer::before,
|
||||
.footer::after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 450px) {
|
||||
.navContainer {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.nav {
|
||||
text-align: left;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.logoContainer {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.copyright {
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1300px) {
|
||||
.navContainer {
|
||||
flex-direction: row;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,214 @@
|
||||
import Image from "next/image";
|
||||
|
||||
import { Text } from "@/components/website/Text";
|
||||
|
||||
import { Socials } from "@/components/website/Socials";
|
||||
import styles from "./Footer.module.css";
|
||||
|
||||
const Footer = () => {
|
||||
return (
|
||||
<footer className={styles.footer}>
|
||||
<div className={styles.navContainer}>
|
||||
<div className={styles.logoContainer}>
|
||||
<Image
|
||||
src="/llamaindex.svg"
|
||||
alt="LlamaIndex"
|
||||
width={213}
|
||||
height={42}
|
||||
/>
|
||||
<div className={styles.socialContainer}>
|
||||
<Socials />
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.nav}>
|
||||
<div>
|
||||
<Text size={20} weight={600} as="h3" className={styles.navHeader}>
|
||||
<a href="https://llamaindex.ai">LlamaIndex</a>
|
||||
</Text>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://llamaindex.ai/blog">
|
||||
<Text as="span">Blog</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://llamaindex.ai/partners">
|
||||
<Text as="span">Partners</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://llamaindex.ai/careers">
|
||||
<Text as="span">Careers</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://llamaindex.ai/contact">
|
||||
<Text as="span">Contact</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://llamaindex.statuspage.io" target="_blank">
|
||||
<Text as="span">Status</Text>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<Text size={20} weight={600} as="h3" className={styles.navHeader}>
|
||||
<a href="https://llamaindex.ai/enterprise">Enterprise</a>
|
||||
</Text>
|
||||
<ul>
|
||||
<li>
|
||||
<a
|
||||
href="https://cloud.llamaindex.ai"
|
||||
data-tracking-variant="link"
|
||||
data-tracking-section="footer"
|
||||
>
|
||||
<Text as="span">LlamaCloud</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="https://cloud.llamaindex.ai/parse"
|
||||
data-tracking-variant="link"
|
||||
data-tracking-section="footer"
|
||||
>
|
||||
<Text as="span">LlamaParse</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="https://llamaindex.ai/llamacloud-sharepoint-data-loading-for-generative-ai"
|
||||
data-tracking-variant="link"
|
||||
data-tracking-section="footer"
|
||||
>
|
||||
<Text as="span">SharePoint</Text>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<Text size={20} weight={600} as="h3" className={styles.navHeader}>
|
||||
<a href="https://llamaindex.ai/open-source">Open Source</a>
|
||||
</Text>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://pypi.org/project/llama-index/">
|
||||
<Text as="span">Python package</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://docs.llamaindex.ai">
|
||||
<Text as="span">Python docs</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.npmjs.com/package/llamaindex">
|
||||
<Text as="span">TypeScript package</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://ts.llamaindex.ai">
|
||||
<Text as="span">TypeScript docs</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://llamahub.ai">
|
||||
<Text as="span">LlamaHub</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/run-llama">
|
||||
<Text as="span">GitHub</Text>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<Text size={20} weight={600} as="h3" className={styles.navHeader}>
|
||||
<a href="https://llamaindex.ai/community">Community</a>
|
||||
</Text>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://llamaindex.ai/community#newsletter">
|
||||
<Text as="span">Newsletter</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://discord.com/invite/eN6D2HQ4aX">
|
||||
<Text as="span">Discord</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://twitter.com/llama_index">
|
||||
<Text as="span">Twitter/X</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.linkedin.com/company/91154103/">
|
||||
<Text as="span">LinkedIn</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.youtube.com/@LlamaIndex">
|
||||
<Text as="span">YouTube</Text>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<Text size={20} weight={600} as="h3" className={styles.navHeader}>
|
||||
Starter projects
|
||||
</Text>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://www.npmjs.com/package/create-llama">
|
||||
<Text as="span">create-llama</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://secinsights.ai">
|
||||
<Text as="span">SEC Insights</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://chat.llamaindex.ai/">
|
||||
<Text as="span">Chat LlamaIndex</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/run-llama/llamabot">
|
||||
<Text as="span">LlamaBot</Text>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://docs.llamaindex.ai/en/stable/use_cases/q_and_a/rag_cli.html">
|
||||
<Text as="span">RAG CLI</Text>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.copyrightContainer}>
|
||||
<Text className={styles.copyright} size={14}>
|
||||
© {new Date().getFullYear()} LlamaIndex
|
||||
</Text>
|
||||
<div className={styles.legalNav}>
|
||||
<Text className={styles.copyright} size={14}>
|
||||
<a href="https://llamaindex.ai/files/privacy-notice.pdf">
|
||||
Privacy Notice
|
||||
</a>
|
||||
</Text>
|
||||
<Text className={styles.copyright} size={14}>
|
||||
<a href="https://llamaindex.ai/files/terms-of-service.pdf">
|
||||
Terms of Service
|
||||
</a>
|
||||
</Text>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
};
|
||||
|
||||
export { Footer };
|
||||
@@ -0,0 +1,4 @@
|
||||
.underline {
|
||||
display: inline-grid;
|
||||
gap: 0.25rem;
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import { ReactNode } from "react";
|
||||
|
||||
import styles from "./HeadingUnderline.module.css";
|
||||
|
||||
interface HeadingUnderlineProps {
|
||||
children: ReactNode;
|
||||
}
|
||||
|
||||
const HeadingUnderline = ({ children }: HeadingUnderlineProps) => (
|
||||
<span className={styles.underline}>
|
||||
{children}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 352 16"
|
||||
fill="none"
|
||||
preserveAspectRatio="none"
|
||||
>
|
||||
<path
|
||||
fill="url(#paint0_angular_57_743)"
|
||||
fillRule="evenodd"
|
||||
d="M350.974 15.007C216.288-1.307 61.29 8.211.669 15.01L0 9.048C60.879 2.22 216.381-7.34 351.695 9.05l-.721 5.956Z"
|
||||
clipRule="evenodd"
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="paint0_angular_57_743"
|
||||
x1={172}
|
||||
x2={180.5}
|
||||
y1={32.5}
|
||||
y2={-24.5}
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop stopColor="#BB8DEB" />
|
||||
<stop offset={0.291} stopColor="#F8DFD8" />
|
||||
<stop offset={0.632} stopColor="#FFA6EA" />
|
||||
<stop offset={0.881} stopColor="#45DFF8" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
</span>
|
||||
);
|
||||
|
||||
export { HeadingUnderline };
|
||||
@@ -0,0 +1,53 @@
|
||||
.socials {
|
||||
--background-color: var(--color-neutral-100);
|
||||
--icon-color: var(--color-neutral-400);
|
||||
|
||||
list-style: none;
|
||||
display: flex;
|
||||
gap: 2em;
|
||||
}
|
||||
|
||||
.socials a {
|
||||
width: 2.5em;
|
||||
height: 2.5em;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50%;
|
||||
background-color: var(--background-color);
|
||||
color: var(--icon-color);
|
||||
transition:
|
||||
color 300ms cubic-bezier(0.72, 0, 0.12, 1),
|
||||
background 300ms cubic-bezier(0.72, 0, 0.12, 1);
|
||||
}
|
||||
|
||||
.socials a:hover {
|
||||
background-color: var(--icon-color);
|
||||
color: var(--background-color);
|
||||
}
|
||||
|
||||
.socials-theme-dark {
|
||||
--background-color: #dedceb;
|
||||
}
|
||||
|
||||
.socialsWithDescription {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.socialsWithDescription li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1em;
|
||||
}
|
||||
|
||||
.icons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5em;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.socials {
|
||||
gap: 1em;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
import clsx from "clsx";
|
||||
|
||||
import {
|
||||
FaDiscord,
|
||||
FaGithub,
|
||||
FaLinkedin,
|
||||
FaPython,
|
||||
FaYoutube,
|
||||
} from "react-icons/fa";
|
||||
import { FaXTwitter } from "react-icons/fa6";
|
||||
import { SiTypescript } from "react-icons/si";
|
||||
|
||||
import { Text } from "@/components/website/Text";
|
||||
|
||||
import styles from "./Socials.module.css";
|
||||
|
||||
interface SocialsProps {
|
||||
className?: string;
|
||||
showDescription?: boolean;
|
||||
theme?: "light" | "dark";
|
||||
}
|
||||
|
||||
const Socials = ({
|
||||
theme = "light",
|
||||
showDescription = false,
|
||||
className,
|
||||
}: SocialsProps) => (
|
||||
<>
|
||||
{!showDescription && <IconsList theme={theme} className={className} />}
|
||||
{showDescription && (
|
||||
<IconsWithDescription theme={theme} className={className} />
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
const IconsList = ({ theme, className }: SocialsProps) => (
|
||||
<ul
|
||||
className={clsx(
|
||||
styles.socials,
|
||||
styles[`socials-theme-${theme}`],
|
||||
className,
|
||||
)}
|
||||
>
|
||||
<li>
|
||||
<a href="https://github.com/run-llama/llama_index">
|
||||
<FaGithub />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://discord.com/invite/eN6D2HQ4aX">
|
||||
<FaDiscord />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://twitter.com/llama_index">
|
||||
<FaXTwitter />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.linkedin.com/company/91154103/">
|
||||
<FaLinkedin />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.youtube.com/@LlamaIndex">
|
||||
<FaYoutube />
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
);
|
||||
|
||||
const IconsWithDescription = ({ theme, className }: SocialsProps) => (
|
||||
<ul
|
||||
className={clsx(
|
||||
styles.socials,
|
||||
styles.socialsWithDescription,
|
||||
styles[`socials-theme-${theme}`],
|
||||
className,
|
||||
)}
|
||||
>
|
||||
<li>
|
||||
<div className={styles.icons}>
|
||||
<a href="https://github.com/run-llama/llama_index">
|
||||
<FaPython />
|
||||
</a>
|
||||
<a href="https://github.com/run-llama/LlamaIndexTS">
|
||||
<SiTypescript />
|
||||
</a>
|
||||
</div>
|
||||
<Text>File issues and contribute patches</Text>
|
||||
</li>
|
||||
<li>
|
||||
<div className={styles.icons}>
|
||||
<a href="https://twitter.com/llama_index">
|
||||
<FaXTwitter />
|
||||
</a>
|
||||
<a href="https://www.linkedin.com/company/91154103/">
|
||||
<FaLinkedin />
|
||||
</a>
|
||||
</div>
|
||||
<Text>Follow us on social media for the latest updates</Text>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://discord.com/invite/eN6D2HQ4aX">
|
||||
<FaDiscord />
|
||||
</a>
|
||||
<Text>Get help from LlamaIndex and your peers</Text>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://www.youtube.com/@LlamaIndex">
|
||||
<FaYoutube />
|
||||
</a>
|
||||
<Text>Dive in to our tutorials and webinars</Text>
|
||||
</li>
|
||||
</ul>
|
||||
);
|
||||
|
||||
export { Socials };
|
||||
@@ -0,0 +1,96 @@
|
||||
.text {
|
||||
font-family: var(--font-inter);
|
||||
font-size: clamp(0.875rem, -0.4286rem + 4.5714vw, 1rem); /* 14px -> 16px */
|
||||
line-height: 1.6;
|
||||
letter-spacing: -0.04em;
|
||||
}
|
||||
|
||||
.text-size-12,
|
||||
.text-size-16,
|
||||
.text-size-18,
|
||||
.text-size-20 {
|
||||
color: var(--color-neutral-400);
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
.text-size-32,
|
||||
.text-size-36,
|
||||
.text-size-40,
|
||||
.text-size-48,
|
||||
.text-size-60 {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.text-weight-400 {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.text-weight-500 {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.text-weight-600 {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.text-align-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.text-size-12 {
|
||||
font-size: 0.75em;
|
||||
}
|
||||
|
||||
.text-size-14 {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
.text-size-18 {
|
||||
font-size: clamp(1rem, -0.4286rem + 4.5714vw, 1.125rem); /* 16px -> 18px */
|
||||
}
|
||||
|
||||
.text-size-20 {
|
||||
font-size: clamp(1rem, -0.4286rem + 4.5714vw, 1.25rem); /* 16px -> 20px */
|
||||
}
|
||||
|
||||
.text-size-24 {
|
||||
font-size: clamp(1.25rem, -0.4286rem + 4.5714vw, 1.5rem); /* 20px -> 24px */
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.text-size-28 {
|
||||
font-size: clamp(1.25rem, -0.4286rem + 4.5714vw, 1.75rem);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.text-size-32 {
|
||||
font-size: clamp(1.25rem, -0.4286rem + 4.5714vw, 2rem); /* 20px -> 32px */
|
||||
}
|
||||
|
||||
.text-size-36 {
|
||||
font-size: clamp(1.5rem, -0.4286rem + 4.5714vw, 2.25rem); /* 24px -> 36px */
|
||||
}
|
||||
|
||||
.text-size-40 {
|
||||
line-height: 1.2;
|
||||
font-size: clamp(1.75rem, -0.4286rem + 4.5714vw, 2.5rem); /* 28px -> 40px */
|
||||
}
|
||||
|
||||
.text-size-48 {
|
||||
font-size: 3em;
|
||||
font-size: clamp(1.75rem, -0.4286rem + 4.5714vw, 3rem); /* 28px -> 48px */
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.text-size-60 {
|
||||
line-height: 1.2;
|
||||
font-size: clamp(1.75rem, -0.4286rem + 4.5714vw, 3.75rem); /* 28px -> 60px */
|
||||
}
|
||||
|
||||
.text-family-sourceCodePro {
|
||||
font-family: var(--font-source-code-pro);
|
||||
}
|
||||
|
||||
.text-family-spaceGrotesk {
|
||||
font-family: var(--font-space-grotesk);
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
import clsx from "clsx";
|
||||
import { Fragment, ReactNode } from "react";
|
||||
|
||||
import { HeadingUnderline } from "@/components/website/HeadingUnderline";
|
||||
|
||||
import styles from "./Text.module.css";
|
||||
|
||||
export interface TextProps {
|
||||
align?: "left" | "center" | "right";
|
||||
size?: 12 | 14 | 16 | 18 | 20 | 24 | 28 | 32 | 36 | 40 | 48 | 60;
|
||||
family?: "inter" | "spaceGrotesk" | "sourceCodePro";
|
||||
weight?: 400 | 500 | 600;
|
||||
children?: ReactNode;
|
||||
className?: string;
|
||||
as?: any;
|
||||
maximumWidth?: any;
|
||||
}
|
||||
|
||||
const Text = ({
|
||||
align = "left",
|
||||
weight,
|
||||
children,
|
||||
className,
|
||||
size = 16,
|
||||
family,
|
||||
maximumWidth,
|
||||
as = "p",
|
||||
}: TextProps) => {
|
||||
const Component = as;
|
||||
|
||||
const renderTextWithComponent = (substring: string) => {
|
||||
if (substring.startsWith("|") && substring.endsWith("|")) {
|
||||
const content = substring.slice(1, -1);
|
||||
|
||||
return <HeadingUnderline>{content}</HeadingUnderline>;
|
||||
}
|
||||
|
||||
return substring;
|
||||
};
|
||||
|
||||
const renderedString =
|
||||
children &&
|
||||
typeof children === "string" &&
|
||||
children
|
||||
.toString()
|
||||
.split(/(\|.*?\|)/g)
|
||||
.map((substring: string) => (
|
||||
<Fragment key={substring}>
|
||||
{renderTextWithComponent(substring)}
|
||||
</Fragment>
|
||||
));
|
||||
|
||||
return (
|
||||
<Component
|
||||
className={clsx(
|
||||
styles.text,
|
||||
align && styles[`text-align-${align}`],
|
||||
size && styles[`text-size-${size}`],
|
||||
weight && styles[`text-weight-${weight}`],
|
||||
family && styles[`text-family-${family}`],
|
||||
className,
|
||||
)}
|
||||
style={{ maxWidth: maximumWidth ? `${maximumWidth}px` : undefined }}
|
||||
>
|
||||
{renderedString || children}
|
||||
</Component>
|
||||
);
|
||||
};
|
||||
|
||||
export { Text };
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: LlamaCloud
|
||||
description: LlamaCloud is a new generation of managed parsing, ingestion, and retrieval services, designed to bring production-grade context-augmentation to your LLM and RAG applications.
|
||||
---
|
||||
|
||||
This is TypeScript binding for LlamaCloud API. It provides a simple way to interact with LlamaCloud API.
|
||||
|
||||
If you are looking for the official documentation, please visit the [Official Document](https://docs.cloud.llamaindex.ai/)
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"title": "LlamaCloud",
|
||||
"description": "The Cloud framework for LLM",
|
||||
"root": true,
|
||||
"pages": ["---Guide---", "index", "api"]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: Getting Started with LlamaIndex.TS
|
||||
description: Install llamaindex by running a single command.
|
||||
---
|
||||
|
||||
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
|
||||
|
||||
<Tabs groupId="install-llamaindex" items={["npm", "yarn", "pnpm"]} persist>
|
||||
```shell tab="npm"
|
||||
npm install llamaindex
|
||||
```
|
||||
|
||||
```shell tab="yarn"
|
||||
yarn add llamaindex
|
||||
```
|
||||
|
||||
```shell tab="pnpm"
|
||||
pnpm add llamaindex
|
||||
```
|
||||
|
||||
</Tabs>
|
||||
|
||||
## What's next?
|
||||
|
||||
<Cards>
|
||||
<Card
|
||||
title="I'm new to RAG"
|
||||
description="Learn more about RAG (Retrieval-augmented generation) using LlamaIndex.TS."
|
||||
href="/docs/llamaindex/setup/what-is-rag"
|
||||
/>
|
||||
<Card
|
||||
title="I want to try LlamaIndex.TS"
|
||||
description="Learn how to use LlamaIndex.TS with different JS runtime and frameworks."
|
||||
href="/docs/llamaindex/setup"
|
||||
/>
|
||||
<Card
|
||||
title="I want to improve performance when using LlamaIndex.TS"
|
||||
description="Learn how to improve performance, reduce bundle size, improve accuracy."
|
||||
href="/docs/llamaindex/performance"
|
||||
/>
|
||||
<Card
|
||||
title="Show me code examples"
|
||||
description="Explore code examples using LlamaIndex.TS."
|
||||
href="https://stackblitz.com/github/run-llama/LlamaIndexTS/tree/main/examples?file=README.md"
|
||||
/>
|
||||
</Cards>
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"title": "LlamaIndex",
|
||||
"description": "The Data framework for LLM",
|
||||
"root": true,
|
||||
"pages": [
|
||||
"---Guide---",
|
||||
"what-is-llamaindex",
|
||||
"index",
|
||||
"setup",
|
||||
"starter",
|
||||
"readers"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: More
|
||||
description: More
|
||||
---
|
||||
|
||||
import {
|
||||
SiGithub,
|
||||
SiNpm,
|
||||
SiX,
|
||||
SiDiscord,
|
||||
} from "@icons-pack/react-simple-icons";
|
||||
|
||||
## 🗺️ Ecosystem
|
||||
|
||||
To download or contribute, find LlamaIndex on:
|
||||
|
||||
<Cards>
|
||||
<Card
|
||||
icon={<SiGithub />}
|
||||
title="GitHub"
|
||||
href="https://github.com/run-llama/LlamaIndexTS"
|
||||
/>
|
||||
<Card
|
||||
icon={<SiNpm />}
|
||||
title="NPM"
|
||||
href="https://www.npmjs.com/package/llamaindex"
|
||||
/>
|
||||
</Cards>
|
||||
|
||||
## Community
|
||||
|
||||
Need help? Have a feature suggestion? Join the LlamaIndex community:
|
||||
|
||||
<Cards>
|
||||
<Card icon={<SiX />} title="Twitter" href="https://twitter.com/llama_index" />
|
||||
<Card
|
||||
icon={<SiDiscord />}
|
||||
title="Discord"
|
||||
href="https://discord.gg/dGcwcsnxhU"
|
||||
/>
|
||||
</Cards>
|
||||
@@ -0,0 +1,105 @@
|
||||
---
|
||||
title: Document and Nodes
|
||||
description: llamaindex readers is a collection of readers for different file formats.
|
||||
---
|
||||
|
||||
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
|
||||
|
||||
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
|
||||
|
||||
<Accordions>
|
||||
<Accordion title="Install @llamaindex/readers">
|
||||
|
||||
If you want to only use reader modules, you can install `@llamaindex/readers`
|
||||
|
||||
<Tabs groupId="install-llamaindex" items={["npm", "yarn", "pnpm"]} persist>
|
||||
```shell tab="npm"
|
||||
npm install @llamaindex/readers
|
||||
```
|
||||
|
||||
```shell tab="yarn"
|
||||
yarn add @llamaindex/readers
|
||||
```
|
||||
|
||||
```shell tab="pnpm"
|
||||
pnpm add @llamaindex/readers
|
||||
```
|
||||
|
||||
</Tabs>
|
||||
</Accordion>
|
||||
</Accordions>
|
||||
|
||||
We offer readers for different file formats.
|
||||
|
||||
<Tabs groupId="llamaindex-or-readers" items={["llamaindex", "@llamaindex/readers"]} persist>
|
||||
```ts twoslash tab="llamaindex"
|
||||
import { CSVReader } from 'llamaindex'
|
||||
import { PDFReader } from 'llamaindex'
|
||||
import { JSONReader } from 'llamaindex'
|
||||
import { MarkdownReader } from 'llamaindex'
|
||||
import { HTMLReader } from 'llamaindex'
|
||||
// you can find more readers in the documentation
|
||||
```
|
||||
|
||||
```ts twoslash tab="@llamaindex/readers"
|
||||
import { CSVReader } from '@llamaindex/readers/csv'
|
||||
import { PDFReader } from '@llamaindex/readers/pdf'
|
||||
import { JSONReader } from '@llamaindex/readers/json'
|
||||
import { MarkdownReader } from '@llamaindex/readers/markdown'
|
||||
import { HTMLReader } from '@llamaindex/readers/html'
|
||||
// you can find more readers in the documentation
|
||||
```
|
||||
|
||||
</Tabs>
|
||||
|
||||
## SimpleDirectoryReader
|
||||
|
||||
`SimpleDirectoryReader` is the simplest way to load data from local files into LlamaIndex.
|
||||
|
||||
<Tabs groupId="llamaindex-or-readers" items={["llamaindex", "@llamaindex/readers"]} persist>
|
||||
|
||||
```ts twoslash tab="llamaindex"
|
||||
import { SimpleDirectoryReader } from "llamaindex";
|
||||
|
||||
const reader = new SimpleDirectoryReader()
|
||||
const documents = await reader.loadData("./data")
|
||||
// ^?
|
||||
|
||||
|
||||
const texts = documents.map(doc => doc.getText())
|
||||
// ^?
|
||||
```
|
||||
|
||||
```ts twoslash tab="@llamaindex/readers"
|
||||
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
|
||||
|
||||
const reader = new SimpleDirectoryReader()
|
||||
const documents = await reader.loadData("./data")
|
||||
// ^?
|
||||
|
||||
|
||||
const texts = documents.map(doc => doc.getText())
|
||||
// ^?
|
||||
```
|
||||
|
||||
</Tabs>
|
||||
|
||||
## Load file natively using Node.js Customization Hooks
|
||||
|
||||
We have a helper utility to allow you to import a file in Node.js script.
|
||||
|
||||
<Tabs groupId="llamaindex-or-readers" items={["llamaindex", "@llamaindex/readers"]} persist>
|
||||
```shell tab="llamaindex"
|
||||
node --import llamaindex/register ./script.js
|
||||
```
|
||||
|
||||
```shell tab="@llamaindex/readers"
|
||||
node --import @llamaindex/readers/node ./script.js
|
||||
```
|
||||
</Tabs>
|
||||
|
||||
```ts
|
||||
import csv from './path/to/data.csv';
|
||||
|
||||
const text = csv.getText()
|
||||
```
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"title": "Loading",
|
||||
"description": "File Readers Collection",
|
||||
"pages": ["index"]
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: With Cloudflare Worker
|
||||
description: In this guide, you'll learn how to use LlamaIndex with CloudFlare Worker
|
||||
---
|
||||
|
||||
import {
|
||||
SiNodedotjs,
|
||||
SiDeno,
|
||||
SiBun,
|
||||
SiCloudflareworkers,
|
||||
} from "@icons-pack/react-simple-icons";
|
||||
|
||||
Before you start, make sure you have try LlamaIndex.TS in Node.js to make sure you understand the basics.
|
||||
|
||||
<Card
|
||||
title="Getting Started with LlamaIndex.TS in Node.js"
|
||||
href="/docs/llamaindex/setup/node"
|
||||
/>
|
||||
|
||||
Also, you need have the basic understanding of <a href='https://developers.cloudflare.com/workers/'><SiCloudflareworkers className="inline mr-2" color="#F38020" />Cloudflare Worker</a>.
|
||||
|
||||
## Adding environment variables
|
||||
|
||||
```ts
|
||||
export default {
|
||||
async fetch(request: Request, env: Env): Promise<Response> {
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(env);
|
||||
const { OpenAIAgent } = await import("@llamaindex/openai");
|
||||
// Start your code here
|
||||
return new Response("Hello, world!");
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
Then, you need create `.dev.vars` and add LLM api keys for the local development, such as `OPENAI_API_KEY` for OpenAI API key.
|
||||
|
||||
<Callout type="warn">Do not commit the api key to git repository.</Callout>
|
||||
|
||||
## Difference between Node.js and Cloudflare Worker
|
||||
|
||||
In Cloudflare Worker and similar serverless JS environment, you need to be aware of the following differences:
|
||||
|
||||
- Some Node.js modules are not available in Cloudflare Worker, such as `node:fs`, `node:child_process`, `node:cluster`...
|
||||
- You are recommend to design your code using network request, such as use `fetch` API to communicate with database, insteadof a long-running process in Node.js.
|
||||
- Some of LlamaIndex.TS modules are not available in Cloudflare Worker, for example `SimpleDirectoryReader` (requires `node:fs`), Some multimodal API that relies on [`onnxruntime-node`](https://www.npmjs.com/package/onnxruntime-node)(we might port to HTTP based module in the future).
|
||||
- `@llamaindex/core` is designed to work in all JavaScript environment, including Cloudflare Worker. If you find any issue, please report to us.
|
||||
- `@llamaindex/env` is a JS environment binding module, which polyfill some Node.js/Modern Web API (for example, we have a memory based `fs` module, and Crypto API polyfill). It is designed to work in all JavaScript environment, including Cloudflare Worker.
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: Getting Started
|
||||
description: We support multiple JS runtime and frameworks, bundlers.
|
||||
---
|
||||
import {
|
||||
SiNodedotjs,
|
||||
SiTypescript,
|
||||
SiNextdotjs,
|
||||
SiCloudflareworkers,
|
||||
SiVite
|
||||
} from "@icons-pack/react-simple-icons";
|
||||
|
||||
<Cards>
|
||||
<Card title={
|
||||
<>
|
||||
<SiNodedotjs className="inline" color="#5FA04E" /> Node.js
|
||||
</>
|
||||
} href="/docs/llamaindex/setup/node" />
|
||||
<Card title={
|
||||
<>
|
||||
<SiTypescript className="inline" color="#3178C6" /> TypeScript
|
||||
</>
|
||||
} href="/docs/llamaindex/setup/typescript.mdx" />
|
||||
<Card title={
|
||||
<>
|
||||
<SiVite className='inline' color='#646CFF' /> Vite
|
||||
</>
|
||||
} href="/docs/llamaindex/setup/vite" />
|
||||
<Card
|
||||
title={
|
||||
<>
|
||||
<SiNextdotjs className='inline' color='#000000' /> Next.js (React Server Component)
|
||||
</>
|
||||
}
|
||||
href="/docs/llamaindex/setup/next"
|
||||
/>
|
||||
<Card title={
|
||||
<>
|
||||
<SiCloudflareworkers className='inline' color='#F38020' /> Cloudflare Workers
|
||||
</>
|
||||
} href="/docs/llamaindex/setup/cloudflare" />
|
||||
</Cards>
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"title": "Setup",
|
||||
"description": "The setup guide",
|
||||
"defaultOpen": true,
|
||||
"pages": [
|
||||
"getting-started",
|
||||
"next",
|
||||
"node",
|
||||
"typescript",
|
||||
"vite",
|
||||
"cloudflare"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: With Next.js
|
||||
description: In this guide, you'll learn how to use LlamaIndex with Next.js.
|
||||
---
|
||||
|
||||
Before you start, make sure you have try LlamaIndex.TS in Node.js to make sure you understand the basics.
|
||||
|
||||
<Card
|
||||
title="Getting Started with LlamaIndex.TS in Node.js"
|
||||
href="/docs/llamaindex/setup/node"
|
||||
/>
|
||||
|
||||
## Differences between Node.js and Next.js
|
||||
|
||||
Next.js is a React framework that has both server side compatibility and client side compatibility.
|
||||
This means that you need to be careful when using LlamaIndex.TS in Next.js.
|
||||
Don't leak the import data like API keys to the client side.
|
||||
|
||||
Also, in Next.js, there is build time and runtime. Some computations can be done at build time like Document embedding could be done at build time for better performance.
|
||||
LlamaIndex.TS has lots of upstream dependencies, some of them are not compatible with Next.js.
|
||||
|
||||
You might need to use `withNext` to make sure that LlamaIndex.TS works well with Next.js.
|
||||
|
||||
```js
|
||||
// next.config.mjs / next.config.ts
|
||||
import withLlamaIndex from "llamaindex/next";
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {};
|
||||
|
||||
export default withLlamaIndex(nextConfig);
|
||||
```
|
||||
|
||||
If you see any dependency issues, you are welcome to open an issue on the GitHub.
|
||||
|
||||
## Edge Runtime
|
||||
|
||||
[Vercel Edge Runtime](https://edge-runtime.vercel.app/) is a subset of Node.js APIs. Similar to [Cloudflare Workers](./cloudflare#difference-between-nodejs-and-cloudflare-worker),
|
||||
it is a serverless platform that runs your code on the edge.
|
||||
|
||||
Not all features of Node.js are supported in Vercel Edge Runtime, so does LlamaIndex.TS, we are working on more compatibility with all JavaScript runtimes.
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: With Node.js/Bun/Deno
|
||||
description: In this guide, you'll learn how to use LlamaIndex with Node.js, Bun, and Deno.
|
||||
---
|
||||
|
||||
## Adding environment variables
|
||||
|
||||
By default, LlamaIndex uses OpenAI provider, which requires an API key. You can set the `OPENAI_API_KEY` environment variable to authenticate with OpenAI.
|
||||
|
||||
```shell
|
||||
export OPENAI_API_KEY=your-api-key
|
||||
```
|
||||
|
||||
Or you can use a `.env` file:
|
||||
|
||||
```shell
|
||||
echo "OPENAI_API_KEY=your-api-key" > .env
|
||||
node --env-file .env your-script.js
|
||||
```
|
||||
|
||||
<Callout type="warn">Do not commit the api key to git repository.</Callout>
|
||||
|
||||
For more information, see the [How to read environment variables from Node.js](https://nodejs.org/en/learn/command-line/how-to-read-environment-variables-from-nodejs).
|
||||
|
||||
## TypeScript support
|
||||
|
||||
<Card
|
||||
title="Getting Started with LlamaIndex.TS in TypeScript"
|
||||
href="/docs/llamaindex/setup/typescript"
|
||||
/>
|
||||
@@ -0,0 +1,103 @@
|
||||
---
|
||||
title: With TypeScript
|
||||
description: In this guide, you'll learn how to use LlamaIndex with TypeScript
|
||||
---
|
||||
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
|
||||
|
||||
LlamaIndex.TS is written in TypeScript and designed to be used in TypeScript projects.
|
||||
|
||||
We do lots of work on strong typing to make sure you have a great typing experience with LlamaIndex.TS.
|
||||
|
||||
```ts twoslash
|
||||
import { PromptTemplate } from '@llamaindex/core/prompts'
|
||||
const promptTemplate = new PromptTemplate({
|
||||
template: `Context information from multiple sources is below.
|
||||
---------------------
|
||||
{context}
|
||||
---------------------
|
||||
Given the information from multiple sources and not prior knowledge.
|
||||
Answer the query in the style of a Shakespeare play"
|
||||
Query: {query}
|
||||
Answer:`,
|
||||
templateVars: ["context", "query"],
|
||||
});
|
||||
// @noErrors
|
||||
promptTemplate.format({
|
||||
c
|
||||
//^|
|
||||
})
|
||||
```
|
||||
|
||||
```ts twoslash
|
||||
import { FunctionTool } from '@llamaindex/core/tools'
|
||||
import { z } from 'zod'
|
||||
|
||||
// ---cut-before---
|
||||
const inputSchema = z.object({
|
||||
time: z.string(),
|
||||
city: z.string(),
|
||||
})
|
||||
|
||||
type Input = z.infer<typeof inputSchema>
|
||||
|
||||
FunctionTool.from<Input>((input) => {
|
||||
// @noErrors
|
||||
input.t
|
||||
// ^|
|
||||
}, {
|
||||
name: 'getWeather',
|
||||
description: 'Get the weather information',
|
||||
parameters: inputSchema,
|
||||
})
|
||||
```
|
||||
|
||||
## Enable TypeScript
|
||||
|
||||
|
||||
```json5
|
||||
{
|
||||
compilerOptions: {
|
||||
// ⬇️ add this line to your tsconfig.json
|
||||
moduleResolution: "bundler", // or "node16"
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
<Accordions>
|
||||
<Accordion
|
||||
title="Why modify tsconfig.json"
|
||||
>
|
||||
|
||||
We are shipping both ESM and CJS module, and compatible with Vercel Edge, Cloudflare Workers, and other serverless platforms.
|
||||
|
||||
So we are using [conditional exports](https://nodejs.org/api/packages.html#conditional-exports) to support all environments.
|
||||
|
||||
This is a kind of modern way of shipping packages, but might cause TypeScript type check to fail because of legacy module resolution.
|
||||
|
||||
Imaging you put output file into `/dist/openai.js` but you are importing `llamaindex/openai` in your code, and set `package.json` like this:
|
||||
|
||||
```json5
|
||||
{
|
||||
"exports": {
|
||||
"./openai": "./dist/openai.js"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
In old module resolution, TypeScript will not be able to find the module because it is not follow the file structure, even you run `node index.js` successfully. (on Node.js >=16)
|
||||
|
||||
See more about [moduleResolution](https://www.typescriptlang.org/docs/handbook/modules/theory.html#module-resolution) or
|
||||
[TypeScript 5.0 blog](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#--moduleresolution-bundler7).
|
||||
|
||||
|
||||
</Accordion>
|
||||
</Accordions>
|
||||
|
||||
|
||||
## Run TypeScript Script in Node.js
|
||||
|
||||
We recommend to use [tsx](https://www.npmjs.com/package/tsx) to run TypeScript script in Node.js.
|
||||
|
||||
```shell
|
||||
node --import tsx ./my-script.ts
|
||||
```
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
title: With Vite
|
||||
description: In this guide, you'll learn how to use LlamaIndex with Vite
|
||||
---
|
||||
|
||||
Before you start, make sure you have try LlamaIndex.TS in Node.js to make sure you understand the basics.
|
||||
|
||||
<Card
|
||||
title="Getting Started with LlamaIndex.TS in Node.js"
|
||||
href="/docs/llamaindex/setup/node"
|
||||
/>
|
||||
|
||||
Also, make sure you have a basic understanding of [Vite](https://vitejs.dev/).
|
||||
|
||||
## Why mention Vite?
|
||||
|
||||
Vite.js is widely used in building many web applications, like React.js, even for some native app like [Electron](https://www.electronjs.org/).
|
||||
|
||||
However, it's not a ready-to-use solution for a Node.js-like application using Vite, as Vite is designed for web applications(run in browser).
|
||||
|
||||
There's some plugin/framework based on Vite, like [Waku.gg](https://github.com/dai-shi/waku), or [Electron Vite](https://electron-vite.org/)
|
||||
|
||||
For now, we have no clear solution for bundling LlamaIndex.TS with Vite, if you have any idea/solution, please let us know.
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: What is LlamaIndex.TS
|
||||
description: LlamaIndex is the leading data framework for building LLM applications
|
||||
---
|
||||
|
||||
import {
|
||||
SiNodedotjs,
|
||||
SiDeno,
|
||||
SiBun,
|
||||
SiCloudflareworkers,
|
||||
} from "@icons-pack/react-simple-icons";
|
||||
|
||||
LlamaIndex is a framework for building context-augmented generative AI applications with LLMs including agents and workflows.
|
||||
|
||||
The TypeScript implementation is designed for JavaScript server side applications using <SiNodedotjs className="inline" color="#5FA04E" /> Node.js, <SiDeno className="inline" color="#70FFAF" /> Deno, <SiBun className="inline" /> Bun, <SiCloudflareworkers className="inline" color="#F38020" /> Cloudflare Workers, and more.
|
||||
|
||||
LlamaIndex.TS provides tools for beginners, advanced users, and everyone in between.
|
||||
|
||||
<iframe
|
||||
className="w-full h-[440px]"
|
||||
aria-label="LlamaIndex.TS Starter"
|
||||
aria-description="This is a starter example for LlamaIndex.TS, it shows the basic usage of the library."
|
||||
src="https://stackblitz.com/github/run-llama/LlamaIndexTS/tree/main/examples?file=starter.ts"
|
||||
/>
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"pages": ["llamaindex", "cloud"]
|
||||
}
|
||||