Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c4f4a8d83 | |||
| 620c63cd19 | |||
| cb51ad90ea | |||
| 359fd33041 | |||
| efb7e1b868 | |||
| 98ba1e71bd | |||
| fd4b09d375 | |||
| 7c90e1b6b4 | |||
| 21ba0a80d1 | |||
| 9df9a8fc1d | |||
| 60b185ff53 | |||
| ca75c81bc0 | |||
| 691c5bcaf1 | |||
| 9ab998c5d5 | |||
| 938b417028 | |||
| fa60fc66ae |
@@ -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.
|
||||
@@ -5,3 +5,5 @@ lib/
|
||||
dist/
|
||||
.docusaurus/
|
||||
.source/
|
||||
# prttier doesn't support mdx3 we are using
|
||||
*.mdx
|
||||
|
||||
@@ -1,5 +1,36 @@
|
||||
# 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
|
||||
|
||||
@@ -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)!
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "docs",
|
||||
"version": "0.0.99",
|
||||
"version": "0.0.103",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"docusaurus": "docusaurus",
|
||||
|
||||
@@ -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
|
||||
@@ -1,36 +1,56 @@
|
||||
{
|
||||
"name": "@llamaindex/doc",
|
||||
"version": "0.0.0",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "pnpm run build:docs && next build",
|
||||
"dev": "next dev",
|
||||
"start": "next start",
|
||||
"postinstall": "fumadocs-mdx",
|
||||
"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.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"
|
||||
"tailwindcss-animate": "^1.0.7",
|
||||
"zod": "^3.23.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mdx": "^2.0.13",
|
||||
|
||||
@@ -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[
|
||||
Do6zQ1TGt9mEAebdB+NxU4TgEAR6q+geLZt8AcLnL7Xd/8jpoM0MDFlKWzLMCxqq22q7TE487wD0
|
||||
piNMfKqh5WqT2VVYcnzZjldBOl77J5FNn5ZQ7CHAdhCeixkTFc/lGtEuP5daxNzJj408CJC5G4ni
|
||||
T7tdENrnBsGa5bLs1csV6Ty98Q9yABYduF4oVvu3cbQSckq3w71EFfKB2MMIIKwQAKiMkUvKn9jh
|
||||
xgi6cKP7N+35f285gR+K2Or2JGBdwtI2jmt75tfwa/u+rx1OZLuYPVeFd8U7rxjdqy86aVnG++bA
|
||||
17VYKxa5+FqrGv4rj5pFZuoi/lOclqfeJ9KWXK3o7Gm0tUU7ZqxKhUra3pg4nPL19qMtT8eW0jp/
|
||||
Ea7RQ/LMNYleZ0+Gxsi/ZUnm6BWo2ZKUpygqKqtFoySn70eEoSfMszh7voOzZLfa1KgO13G7m14s
|
||||
yRjhJo7CdfBb8w3X05ngZ7wAWBdS6+AfqEURISRsqim8hfrWBt/hmo7lg687oTlQrCMpFZSNU7zd
|
||||
TBNmBMWo2pm94gnANye3IegFd5KwFfRvFvXfI2pidQBIvWYcpq0KkM0jpaVdUXf7Ra2MAa91P5qT
|
||||
47GeVgWEa/tycltq2n6EnD57kNc0B5+WQ1iQ8Ms1Etj2VVLMkqu9zANUJgMdrmRaFF49lsGU8kGQ
|
||||
G84ztASFTLMYSlCWZbO7A4la2JPIqqSLhCNqIpAKNwjd7lNTeB0LlcHAccxkynG50UfaAzKNsDPd
|
||||
85HtYxA7k2nAbFJ5Y/mLvIw1MQtNB4oED1eBOqPn369UghEmvm07f3ZGVXEawwUrsOm232nmvjBA
|
||||
yBmHik0tOaDBbWnNKRk7rpdemrLvhXd/dbO6M/p7WLLhDfdkoOiduZuQ2GCBpFl8fYTpvofJnOzh
|
||||
tjfKy6s7fORF9dlz60JvBmPJtDeh2xT0QFzRZDjNS4aHUm4Ame6Kdi6n8qB4AO4iQBXvZNqKamx2
|
||||
e4IEDdRYPYByw67bWVg3FwFtWWFFKAdgmA6EYNh1+aYKlR8A2ye2Jl+dIJQvxT2WxHRjx/HVuUuP
|
||||
L524hNc1eRpcFAeY7n/ALjNU9upwBUxnD3ydqn92ISZsDSB5vvK3CLyrIxXOMIGd9qVEv0r9rDkL
|
||||
1hMcMGTByfVg2peuK+zrgiX+sAv0Mda1mz88nsW7GWIm+k5TD6d2Wu3BxPrSZATJy4fFmp2g3ElQ
|
||||
yIiLh6cYfAIISkUPG9HKDflw6lwsg7cfNZkSVCS6pvdP13AZlFFq2NTEOEgExqXcbRtgeIRTr9AY
|
||||
Zz0G6PZAqhzI33O28EYACbktknOcCEkYS8colB2FrgKBMmwp7KHBj3jjN55yZkDQrWeHEc7xkxI8
|
||||
mzizMv1/eBddVGCdAgCxLauFLEifbg7/j3pXl/mKcch706kjf0RAw1axwh96T7KJvj9BYHWfDQJ9
|
||||
/mbEp5ohhcWsNv9CCs0qyrFhFqFBiEhXrU+o7qyR6YWaBkDKVBAkhYAKPic8G15GGSsfBDN9ijVZ
|
||||
Mzb9gpj5KbRAsUWLpFFYPzqOjvRZiGV/k+oeJNJaZWZgrvu3JPtFUTLgP8r05C7GW7SSO9wBwoIt
|
||||
GNmxUg7GKHr8DKRQKVFYgpbpn4cRIY+oJcLQ1ViHH3qb7sn2otSC8sldldeGWYfBB+jH3bIH5M7X
|
||||
pUZdIGwLcvZdovF5zo/xeukakbQLEWm84Kicn3S8fUkFNrys/PMPsItjuD/h0huw9PfSvNVPiOXx
|
||||
7GvlqcgfDXiYSGLVmb5rU6WMsdvFhoFmSBlqSO2k8Sl4pbQk8dVN5DKcfWacBPgBSnyJH47/DD82
|
||||
fXttaDmgqpbHLtFFad0uUQepS1X/yzI540MnU3yrjsa7pmV4GC8iLg2yjU3A/yPsBBvuEweC7E6t
|
||||
RfZ4uWPxBUG+JMq3hMV5a62W2NjxzB4mnjJKemeiZEYYYcHA4eviO/JYqpUM3kAXatawnEZ85ZmZ
|
||||
BsgZFhWUR6TdNIv7eSmzu+MNSLGej1U5KKQEFkXE86zoO0JJaPJVHwTVppuxCkAeIY0j3pKYISNl
|
||||
k2DX3nRolEx8+VrdzTTLQ14sUFyEmNDbxBRJDdZINUiEIAxXnVsIyJkaQXOZPrFYg6Sj8DbDBIOT
|
||||
FxzmKflpGr8cgbgeGCBjJuzHID0iiPmE6c9V5M4ErovlBZZRyr45HbFVJMxOqIBlLviZ08UiLWHZ
|
||||
CIiow9VpkxoUHxBydUaFVFRZ3HWAqJbsgegkrtvIKZNKGW02ScRzRmT6DbNjbahN6MUMqDOHUeAW
|
||||
Y5jZE1h48KWC/9nLxI9FeUJtqisshL6SbiOCdEDXQElXkOEpeG+YQiZZAMTzkwrDb9pUlmAi1GSQ
|
||||
bqvX1DXwF1k6a/ZsPtd+yaCewnMhfVs7JQ2zBdEZbFD1swfX419S5D+Id6Rc6/px5j2IPoUdmI3T
|
||||
RfiiW2IdIvqlWg99pMMXUPlVTUncoBd3LXpA/NKB+9A2fgMZhTkO9+PQEzAS0ZC8cfE456yyz4WC
|
||||
7iNygU2fTYKa1UWpOh2dCELwcYjtTh4iE30D+8wMSfXP6SBGm9WYWMSMozIa0nWBE7URgEY84kRa
|
||||
YK/Iy0uNbNCiZWGi31hT9B9C5n59oh1rpvoabBds6M4Z5eiMbI+1ER1LqMhvoJzMMbp4QuTKcTRR
|
||||
weaS3vUpzbPs8iqMvXlXfhwM5uIuIbavd+iWkSI9vI7RM4zpvaKZZgX8FGExPtrgRmaYrC58RZTR
|
||||
Dm/q6g1W6uqqJZh1Jhkc96pwMe2WJb7d8AKOz0LyAlPGgZB9fK1KCj7QrJJoMLRu+mS6ZiS1BguH
|
||||
lz7Ql/XbNYF7ETEFsKBk8kiEYejEqISf4mycFp0e00VnALINtQEGHHa4A3OVLjjURaHCIkcqJQJa
|
||||
E4UzHdE6k14iMFApxdWagNkIcSf0RW5rGcrJHUh7oqcweW+hkDsJXMzZeTXShyD+R3b0b1s/H1tu
|
||||
zVSS5Weo03mkydEmS0o8ni5BzZmZtnSnbYzOM9lcubZs+gIO3GriLhKTv+b2uTJ45e7TEjmemH8a
|
||||
s2z+T9hDXHXiG9b6RICItZwHbQ+eWj56U6rcUWSC+9/nhSxfFW5uzpFrPO7rNYQIHzJCeCj0BpFT
|
||||
3GOltZNTLJXmcetMk26OcJz68hteKudHYJR235g1ZH5Mk/7r4XJngWKSHzoBqnAMVb8VcY74P5v4
|
||||
r0Mr6VmWENO6vj3qN+lm6HzfebKQ4XjZ/SRKflN86B+cy/8zD1abOXatf/gA52LZ0Y7Cqx1SqeM9
|
||||
zJ5gh8OkovRWdvdr+hGriBOwfXKv+2TorVD09kGryokin3nhGKmd1ieCMFdrXpgQSBkH13BI2TtF
|
||||
86C2KAxRTUOi1sgYPWE5Qb6JWgn5jvEtkW73rZ4i25GeoYeTDCuyFcXn0QKahjp/cnCtO5eYeh+Q
|
||||
nf5uYs8EKqmaV99HdRDjz1wEmjagyGZGjFJ3vzujLEABMiN8QXni73Oxxm1z4zONV1cFgfJpt62F
|
||||
g+8g191Y3VUpxcBbIMceOmuzotwduGVTeMPTzQHMfpbQUn50VsgTw7vyYb6UBFraLNQJJ+rI3S1E
|
||||
PCIzfyQoDbrf0uUY3lMh4zBMS8Ix7hby36AxE0c/ynLh3TrdvQnwltHrxyPZ1VLAge1dP7yXRyIG
|
||||
d2OSXWHuev5kxvN8vgc0QhvX3V9ciRZkaHNVeWKDyRGeBNpu5vbIV7zI6trew9CPhGx2UNS2XG4/
|
||||
1ghiD5QfbREhjWFVFJ9r5ekhKoccEqAFpbZDUwOl673S0LS9Fb/IRrxNyj5CrPoPbR/a+coAXF8l
|
||||
qu10jJeEMEgB0mS/Ee08bTdZgAm5PXm9OqztpsGlAIBe939+tJ10+2cbUyMsrFBWc9JSTtkttzGH
|
||||
d8NtVm1P1tikMXAm/xr/kxI49psfrd0ZHRs9vLze7Infvz+sqRmgIhVy7JsnJHRpuj0gf3zuEJiX
|
||||
TzBSze8VQii0Kz0f7bp2CFrkoEWRQagQj1gvGd7Hrc6IssikiNYgoNR6GzImmY6rhyTspuKaODCa
|
||||
GC2xtA8DFVOxAzwQZNnALBUlrZLa3mSAZ5HssFXV1mHNqdbYTtMwPBxmdUcyu3WLLaDvQ5xnk9mn
|
||||
nyc0JSKejGjz2R+YDqnGE3AS6jQz92Tb8g+7IJe+WdQ9LhtZ0kTOySRsR1P1WDk6zgzpMdemEIlF
|
||||
sJtr/pTOR1CeI6HcUT3L5tDHBloL4fJgjVR+dtADcVZE9ptr0xTJUoGf71XiWJOODCRZ8/yzX7ok
|
||||
wds99q4l437TntjmFYxhP3+cPaS/KNLRkNmE2ow585rekg0hkotK6YA55l1mmpgTm/R/IbQfqAd/
|
||||
Md1uK92RiDSmaUl968laP9GtzabtCaSNjL9nx/PiWjakvwrQXw0grynNQQsh7V1YnhKeA62MPtss
|
||||
+2PfPA7Ltld+QhIHjEqlmk3mkCc0UU1h3c/+Tn4dRtvh7uIXhc+008skJae0xbCNzH7qbpS+LixE
|
||||
aNS49kA5da6VvWd1MIpyK/vWsr//gL/NznTN44bP8OdHEnk9SYuHu2mRcEKwtKSlguycI7GWo877
|
||||
qWNas6m9+0YANJ51fXmtXuYn+eVy20j/xg1zWD//FmJJrdiFwos8wa69aF7dwQ5CmJvOlFDmxmde
|
||||
PFOmZW9ueMiAIhjjV2+sWPegTWi1kjXWV7vvpANcLFIGMV7He6o9j9zuuUpqrKz3TGJeiaFJAYTl
|
||||
LQXx9odQieUasQyBTeBOkhWUlp27/Ltz4s9xqZvjLPOFc+R1bjE3QVQY0TdJCjkQP7KUioHfBgDG
|
||||
hiCDBLekdHfscS+hw0NHGcgrAMyzPzDr/mb+KFYYTdkfHDB4sTDm2UhI14hOS8pEWubanxTY4ViO
|
||||
vm2crx4h9mQR5i3Gg7qTuVLSAsn+zHix1bUEYhWtv4tYeV8SvKxbUfD60YoP0khzvqJM1OhB0y2o
|
||||
YKehO6z0YYswtkNpbZtlEfTQNqqmuri0UOFz/eG6zbOz0UPY7tnaWT7b++2JUgf0rDrFkquE9/DQ
|
||||
uTapNkVM63tIyzHJg7VZDKmRIp16sraWUEkPwr5V3NbMs4AiPMEpjX8FV4WrTP6VOgDQtNk2LFuO
|
||||
u+Ifr/0FLYD+/hUt+44qBsTFik9nW4xNInnG4GGbYkgzNsiRBB1sbtAnj5NRPtXvFamZQ9PwSqqH
|
||||
td3hRDeHpX+p7QxVaHUvnFiOT153zPVEWWLf8jvY1egYchdVz4qEkZh/JkTqH/vEkFXVISd2V3ew
|
||||
HJHgPY6lrlfAeMAYJ9XiW0OFb4u2tpUTCdOBE3jCVsf49Sf++QkXmwzukoBiAL2mkCz+DEje0AvD
|
||||
weF908GauMKnJpB9zfIanY+u8y/aRnpzBCIwa772FnK6Ayj3MnR7E+mYJoJ81Bxxb0YZF/hGqDIT
|
||||
f9N9mFgwPotM5EluqpOjU7dYykit2s8bjlPVUsRqtOw31pemMpVtySZ7BgblBIIvfw==
|
||||
]]>
|
||||
<![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: 169 KiB |
@@ -1,7 +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();
|
||||
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>,
|
||||
};
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -2,12 +2,24 @@ 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 { Bot, Terminal } from "lucide-react";
|
||||
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 (
|
||||
@@ -26,7 +38,7 @@ export default function HomePage() {
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-4">
|
||||
<Link href="/docs/llamaindex">
|
||||
<Link href={DOCUMENT_URL}>
|
||||
<Button variant="outline">Get Started</Button>
|
||||
</Link>
|
||||
<NpmInstall />
|
||||
@@ -43,6 +55,62 @@ export default function HomePage() {
|
||||
</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"
|
||||
@@ -50,8 +118,7 @@ export default function HomePage() {
|
||||
description="Build agents for RAG using LlamaIndex.TS. Agents are the core building blocks of RAG applications."
|
||||
>
|
||||
<CodeBlock
|
||||
code={`
|
||||
import { FunctionTool } from "llamaindex";
|
||||
code={`import { FunctionTool } from "llamaindex";
|
||||
import { OpenAIAgent } from "@llamaindex/openai";
|
||||
|
||||
const interpreterTool = FunctionTool.from(...);
|
||||
@@ -67,6 +134,27 @@ 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"
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
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,
|
||||
@@ -26,6 +28,9 @@ export default async function Page(props: {
|
||||
components={{
|
||||
...defaultMdxComponents,
|
||||
APIPage: openapi.APIPage,
|
||||
Popup,
|
||||
PopupContent,
|
||||
PopupTrigger,
|
||||
}}
|
||||
/>
|
||||
</DocsBody>
|
||||
@@ -44,8 +49,13 @@ export async function generateMetadata(props: {
|
||||
const page = source.getPage(params.slug);
|
||||
if (!page) notFound();
|
||||
|
||||
return {
|
||||
title: page.data.title,
|
||||
description: page.data.description,
|
||||
};
|
||||
return createMetadata(
|
||||
metadataImage.withImage(page.slugs, {
|
||||
title: page.data.title,
|
||||
description: page.data.description,
|
||||
openGraph: {
|
||||
url: `/docs/${page.slugs.join("/")}`,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,37 @@
|
||||
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}>
|
||||
<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>
|
||||
);
|
||||
|
||||
@@ -1,4 +1,16 @@
|
||||
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
|
||||
@@ -9,12 +21,14 @@ import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared";
|
||||
*/
|
||||
export const baseOptions: BaseLayoutProps = {
|
||||
nav: {
|
||||
title: "LlamaIndex.TS",
|
||||
title: logo,
|
||||
transparentMode: "top",
|
||||
},
|
||||
githubUrl: "https://github.com/run-llama/LlamaIndexTS",
|
||||
links: [
|
||||
{
|
||||
text: "Documentation",
|
||||
url: "/docs/llamaindex",
|
||||
url: DOCUMENT_URL,
|
||||
active: "nested-url",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
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({
|
||||
@@ -30,7 +33,11 @@ export default function Layout({ children }: { children: ReactNode }) {
|
||||
/>
|
||||
</head>
|
||||
<body className="flex flex-col min-h-screen">
|
||||
<RootProvider>{children}</RootProvider>
|
||||
<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,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,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 };
|
||||
@@ -24,6 +24,7 @@ const buttonVariants = cva(
|
||||
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",
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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,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 };
|
||||
@@ -1,95 +1,46 @@
|
||||
---
|
||||
title: What is LlamaIndex?
|
||||
description: LlamaIndex is a framework for building LLM-powered applications.
|
||||
title: Getting Started with LlamaIndex.TS
|
||||
description: Install llamaindex by running a single command.
|
||||
---
|
||||
|
||||
import {
|
||||
SiGithub,
|
||||
SiNpm,
|
||||
SiX,
|
||||
SiDiscord,
|
||||
} from "@icons-pack/react-simple-icons";
|
||||
import { CodeBlock, Pre } from "fumadocs-ui/components/codeblock";
|
||||
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
|
||||
|
||||
LlamaIndex helps you ingest, structure, and access private or domain-specific data. It's available [as a Python package](https://docs.llamaindex.ai/en/stable/) and in TypeScript (this package).
|
||||
<Tabs groupId="install-llamaindex" items={["npm", "yarn", "pnpm"]} persist>
|
||||
```shell tab="npm"
|
||||
npm install llamaindex
|
||||
```
|
||||
|
||||
LlamaIndex.TS offers the core features of LlamaIndex for JS Runtime-agnostic (Node.js, Deno, and Bun) applications.
|
||||
```shell tab="yarn"
|
||||
yarn add llamaindex
|
||||
```
|
||||
|
||||
## 🚀 Why LlamaIndex.TS?
|
||||
```shell tab="pnpm"
|
||||
pnpm add llamaindex
|
||||
```
|
||||
|
||||
LLMs offer a natural language interface between humans and inferred data. Widely available models come pre-trained on huge amounts of publicly available data, from Wikipedia and mailing lists to textbooks and source code.
|
||||
|
||||
Applications built on top of LLMs often require augmenting these models with private or domain-specific data. That data is often distributed across siloed applications and data stores. It's behind APIs, in SQL databases, or trapped in PDFs and slide decks.
|
||||
|
||||
LlamaIndex.TS helps you unlock that data and then build powerful applications with it.
|
||||
|
||||
## 🦙 What is LlamaIndex for?
|
||||
|
||||
LlamaIndex.TS handles several major use cases:
|
||||
|
||||
- **Structured Data Extraction**: turning complex, unstructured and semi-structured data into uniform, programmatically accessible formats.
|
||||
- **Retrieval-Augmented Generation (RAG)**: answering queries across your internal data by providing LLMs with up-to-date, semantically relevant context including Question and Answer systems and chat bots.
|
||||
- **Autonomous Agents**: building software that is capable of intelligently selecting and using tools to accomplish tasks in an interactive, unsupervised manner.
|
||||
|
||||
## 👨👩👧👦 Who is LlamaIndex for?
|
||||
|
||||
LlamaIndex targets the "AI Engineer": developers building software in any domain that can be enhanced by LLM-powered functionality, without needing to be an expert in machine learning or natural language processing.
|
||||
|
||||
Our high-level API allows beginner users to use LlamaIndex.TS to ingest, index, and query their data in just a few lines of code.
|
||||
|
||||
For more complex applications, our lower-level APIs allow advanced users to customize and extend any module—data connectors, indices, retrievers, and query engines, to fit their needs.
|
||||
|
||||
## Getting Started
|
||||
|
||||
<Tabs items={["npm", "yarn", "pnpm"]}>
|
||||
<Tab value="npm">
|
||||
<CodeBlock language="shell">
|
||||
<Pre>npm install llamaindex</Pre>
|
||||
</CodeBlock>
|
||||
</Tab>
|
||||
<Tab value="yarn">
|
||||
<CodeBlock language="shell">
|
||||
<Pre>yarn add llamaindex</Pre>
|
||||
</CodeBlock>
|
||||
</Tab>
|
||||
<Tab value="pnpm">
|
||||
<CodeBlock language="shell">
|
||||
<Pre>pnpm add llamaindex</Pre>
|
||||
</CodeBlock>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
Our documentation includes [Installation Instructions](./getting_started/installation.mdx) and a [Starter Tutorial](./getting_started/starter_tutorial/retrieval_augmented_generation.mdx) to build your first application.
|
||||
|
||||
Once you're up and running, [High-Level Concepts](./getting_started/concepts.md) has an overview of LlamaIndex's modular architecture. For more hands-on practical examples, look through our Examples section on the sidebar.
|
||||
|
||||
## 🗺️ Ecosystem
|
||||
|
||||
To download or contribute, find LlamaIndex on:
|
||||
## What's next?
|
||||
|
||||
<Cards>
|
||||
<Card
|
||||
icon={<SiGithub />}
|
||||
title="GitHub"
|
||||
href="https://github.com/run-llama/LlamaIndexTS"
|
||||
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
|
||||
icon={<SiNpm />}
|
||||
title="NPM"
|
||||
href="https://www.npmjs.com/package/llamaindex"
|
||||
title="I want to try LlamaIndex.TS"
|
||||
description="Learn how to use LlamaIndex.TS with different JS runtime and frameworks."
|
||||
href="/docs/llamaindex/setup"
|
||||
/>
|
||||
</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"
|
||||
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>
|
||||
|
||||
@@ -2,5 +2,12 @@
|
||||
"title": "LlamaIndex",
|
||||
"description": "The Data framework for LLM",
|
||||
"root": true,
|
||||
"pages": ["---Guide---", "index"]
|
||||
"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,96 @@
|
||||
import {
|
||||
type MetadataFilter,
|
||||
type MetadataFilters,
|
||||
PipelinesService,
|
||||
type RetrievalParams,
|
||||
type TextNodeWithScore,
|
||||
} from "@llamaindex/cloud/api";
|
||||
import { QueryBundle } from "@llamaindex/core/query-engine";
|
||||
import { BaseRetriever } from "@llamaindex/core/retriever";
|
||||
import { jsonToNode, NodeWithScore, ObjectType } from "@llamaindex/core/schema";
|
||||
import { extractText } from "@llamaindex/core/utils";
|
||||
|
||||
export type CloudRetrieveParams = Omit<
|
||||
RetrievalParams,
|
||||
"query" | "search_filters" | "dense_similarity_top_k"
|
||||
> & { similarityTopK?: number; filters?: MetadataFilters };
|
||||
|
||||
export type LlamaCloudRetrieverParams = {
|
||||
apiKey: string;
|
||||
baseUrl: string;
|
||||
pipelineId: string;
|
||||
} & CloudRetrieveParams;
|
||||
|
||||
export class LlamaCloudRetriever extends BaseRetriever {
|
||||
baseUrl: string;
|
||||
apiKey: string;
|
||||
|
||||
retrieveParams: CloudRetrieveParams;
|
||||
organizationId?: string;
|
||||
pipelineId: string;
|
||||
|
||||
private resultNodesToNodeWithScore(
|
||||
nodes: TextNodeWithScore[],
|
||||
): NodeWithScore[] {
|
||||
return nodes.map((node: TextNodeWithScore) => {
|
||||
const textNode = jsonToNode(node.node, ObjectType.TEXT);
|
||||
textNode.metadata = {
|
||||
...textNode.metadata,
|
||||
...node.node.extra_info,
|
||||
};
|
||||
return {
|
||||
node: textNode,
|
||||
score: node.score ?? undefined,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
private convertFilter(filters?: MetadataFilters): MetadataFilters | null {
|
||||
if (!filters) return null;
|
||||
|
||||
const processFilter = (
|
||||
filter: MetadataFilter | MetadataFilters,
|
||||
): MetadataFilter | MetadataFilters => {
|
||||
if ("filters" in filter) {
|
||||
// type MetadataFilters
|
||||
return { ...filter, filters: filter.filters.map(processFilter) };
|
||||
}
|
||||
return { ...filter, value: filter.value ?? null };
|
||||
};
|
||||
|
||||
return { ...filters, filters: filters.filters.map(processFilter) };
|
||||
}
|
||||
|
||||
constructor(params: LlamaCloudRetrieverParams) {
|
||||
super();
|
||||
this.baseUrl = params.baseUrl;
|
||||
this.apiKey = params.apiKey;
|
||||
this.retrieveParams = params;
|
||||
this.pipelineId = params.pipelineId;
|
||||
}
|
||||
|
||||
override async _retrieve(query: QueryBundle): Promise<NodeWithScore[]> {
|
||||
const filters = this.convertFilter(this.retrieveParams.filters);
|
||||
const pipelineId = this.pipelineId;
|
||||
|
||||
const { data: results } =
|
||||
await PipelinesService.runSearchApiV1PipelinesPipelineIdRetrievePost({
|
||||
throwOnError: true,
|
||||
path: {
|
||||
pipeline_id: pipelineId,
|
||||
},
|
||||
baseUrl: this.baseUrl,
|
||||
body: {
|
||||
...this.retrieveParams,
|
||||
query: extractText(query),
|
||||
search_filters: filters,
|
||||
dense_similarity_top_k: this.retrieveParams.similarityTopK!,
|
||||
},
|
||||
headers: {
|
||||
authorization: `Bearer ${this.apiKey}`,
|
||||
},
|
||||
});
|
||||
|
||||
return this.resultNodesToNodeWithScore(results.retrieval_nodes);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
// when we are ready, change to /docs/llamaindex
|
||||
export const DOCUMENT_URL = 'https://legacy.ts.llamaindex.ai/'
|
||||
@@ -0,0 +1,30 @@
|
||||
import { createMetadataImage } from 'fumadocs-core/server';
|
||||
import { source } from '@/lib/source';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export const metadataImage = createMetadataImage({
|
||||
source,
|
||||
imageRoute: 'og',
|
||||
});
|
||||
|
||||
export function createMetadata(override: Metadata): Metadata {
|
||||
return {
|
||||
...override,
|
||||
openGraph: {
|
||||
title: override.title ?? undefined,
|
||||
description: override.description ?? undefined,
|
||||
url: 'https://ts.llamaindex.ai/',
|
||||
images: '/og.png',
|
||||
siteName: 'LlamaIndex.TS',
|
||||
...override.openGraph,
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
creator: '@llama_index',
|
||||
title: override.title ?? undefined,
|
||||
description: override.description ?? undefined,
|
||||
images: '/og.png',
|
||||
...override.twitter,
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,5 +1,17 @@
|
||||
# examples
|
||||
|
||||
## 0.0.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [359fd33]
|
||||
- Updated dependencies [efb7e1b]
|
||||
- Updated dependencies [98ba1e7]
|
||||
- Updated dependencies [620c63c]
|
||||
- @llamaindex/core@0.4.0
|
||||
- llamaindex@0.8.0
|
||||
- @llamaindex/readers@1.0.0
|
||||
|
||||
## 0.0.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import {
|
||||
AstraDBVectorStore,
|
||||
PapaCSVReader,
|
||||
CSVReader,
|
||||
storageContextFromDefaults,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
@@ -9,7 +9,7 @@ const collectionName = "movie_reviews";
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
const reader = new PapaCSVReader(false);
|
||||
const reader = new CSVReader(false);
|
||||
const docs = await reader.loadData("./data/movie_reviews.csv");
|
||||
|
||||
const astraVS = new AstraDBVectorStore({ contentKey: "reviewtext" });
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import {
|
||||
ChromaVectorStore,
|
||||
PapaCSVReader,
|
||||
CSVReader,
|
||||
storageContextFromDefaults,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
@@ -12,9 +12,7 @@ async function main() {
|
||||
|
||||
try {
|
||||
console.log(`Loading data from ${sourceFile}`);
|
||||
const reader = new PapaCSVReader(false, ", ", "\n", {
|
||||
header: true,
|
||||
});
|
||||
const reader = new CSVReader(false, ", ", "\n");
|
||||
const docs = await reader.loadData(sourceFile);
|
||||
|
||||
console.log("Creating ChromaDB vector store");
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
import {
|
||||
Document,
|
||||
OpenAI,
|
||||
OpenAIContextAwareAgent,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
|
||||
import dotenv from "dotenv";
|
||||
dotenv.config();
|
||||
|
||||
async function createTestContextAwareAgent() {
|
||||
// Create test documents
|
||||
const testDocument1 = new Document({
|
||||
text: "LlamaIndex is a data framework for LLM applications to ingest, structure, and access private or domain-specific data.",
|
||||
id_: "doc1",
|
||||
});
|
||||
|
||||
const testDocument2 = new Document({
|
||||
text: "The Eiffel Tower is a wrought-iron lattice tower on the Champ de Mars in Paris, France. It is named after the engineer Gustave Eiffel, whose company designed and built the tower.",
|
||||
id_: "doc2",
|
||||
});
|
||||
|
||||
const testDocument3 = new Document({
|
||||
text: "Photosynthesis is the process by which green plants and some other organisms use sunlight to synthesize foods with the help of chlorophyll pigments.",
|
||||
id_: "doc3",
|
||||
});
|
||||
|
||||
// Create a test index
|
||||
const testIndex = await VectorStoreIndex.fromDocuments([
|
||||
testDocument1,
|
||||
testDocument2,
|
||||
testDocument3,
|
||||
]);
|
||||
|
||||
// Create a retriever from the index to get only 1 relevant document
|
||||
const testRetriever = testIndex.asRetriever({
|
||||
similarityTopK: 1,
|
||||
});
|
||||
|
||||
// Create an OpenAI Context-Aware Agent with the retriever
|
||||
const contextAwareAgent = new OpenAIContextAwareAgent({
|
||||
llm: new OpenAI({ model: "gpt-4o-mini" }),
|
||||
tools: [],
|
||||
contextRetriever: testRetriever,
|
||||
});
|
||||
|
||||
// Test the agent with a query that should trigger relevant document retrieval
|
||||
const response = await contextAwareAgent.chat({
|
||||
message: "What is LlamaIndex used for?",
|
||||
});
|
||||
|
||||
console.log("Context-aware Agent Response:", response.response);
|
||||
}
|
||||
|
||||
createTestContextAwareAgent().catch(console.error);
|
||||
@@ -1,6 +1,6 @@
|
||||
import {
|
||||
CSVReader,
|
||||
MilvusVectorStore,
|
||||
PapaCSVReader,
|
||||
storageContextFromDefaults,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
@@ -9,7 +9,7 @@ const collectionName = "movie_reviews";
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
const reader = new PapaCSVReader(false);
|
||||
const reader = new CSVReader(false);
|
||||
const docs = await reader.loadData("./data/movie_reviews.csv");
|
||||
|
||||
const vectorStore = new MilvusVectorStore({ collection: collectionName });
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* eslint-disable turbo/no-undeclared-env-vars */
|
||||
import { SimpleMongoReader } from "@llamaindex/readers/mongo";
|
||||
import * as dotenv from "dotenv";
|
||||
import {
|
||||
MongoDBAtlasVectorSearch,
|
||||
SimpleMongoReader,
|
||||
storageContextFromDefaults,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
{
|
||||
"name": "@llamaindex/examples",
|
||||
"private": true,
|
||||
"version": "0.0.10",
|
||||
"version": "0.0.11",
|
||||
"dependencies": {
|
||||
"@aws-crypto/sha256-js": "^5.2.0",
|
||||
"@azure/identity": "^4.4.1",
|
||||
"@datastax/astra-db-ts": "^1.4.1",
|
||||
"@llamaindex/core": "^0.3.4",
|
||||
"@llamaindex/core": "^0.4.0",
|
||||
"@llamaindex/readers": "^1.0.0",
|
||||
"@notionhq/client": "^2.2.15",
|
||||
"@pinecone-database/pinecone": "^3.0.2",
|
||||
"@vercel/postgres": "^0.10.0",
|
||||
@@ -15,7 +16,7 @@
|
||||
"commander": "^12.1.0",
|
||||
"dotenv": "^16.4.5",
|
||||
"js-tiktoken": "^1.0.14",
|
||||
"llamaindex": "^0.7.7",
|
||||
"llamaindex": "^0.8.0",
|
||||
"mongodb": "^6.7.0",
|
||||
"pathe": "^1.1.2",
|
||||
"postgres": "^3.4.4"
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"start:json": "node --import tsx ./src/json.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@llamaindex/readers": "*",
|
||||
"llamaindex": "*"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { AudioTranscriptReader } from "@llamaindex/readers/assembly-ai";
|
||||
import { program } from "commander";
|
||||
import { TranscribeParams, VectorStoreIndex } from "llamaindex";
|
||||
import { AudioTranscriptReader } from "llamaindex/readers/AssemblyAIReader";
|
||||
import { stdin as input, stdout as output } from "node:process";
|
||||
import { createInterface } from "node:readline/promises";
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { CSVReader } from "@llamaindex/readers/csv";
|
||||
import {
|
||||
getResponseSynthesizer,
|
||||
OpenAI,
|
||||
@@ -5,13 +6,12 @@ import {
|
||||
Settings,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
import { PapaCSVReader } from "llamaindex/readers/CSVReader";
|
||||
|
||||
Settings.llm = new OpenAI({ model: "gpt-4" });
|
||||
|
||||
async function main() {
|
||||
// Load CSV
|
||||
const reader = new PapaCSVReader();
|
||||
const reader = new CSVReader();
|
||||
const path = "../data/titanic_train.csv";
|
||||
const documents = await reader.loadData(path);
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { TextFileReader } from "@llamaindex/readers/text";
|
||||
import type { Document, Metadata } from "llamaindex";
|
||||
import { FileReader } from "llamaindex";
|
||||
import {
|
||||
FILE_EXT_TO_READER,
|
||||
FileReader,
|
||||
SimpleDirectoryReader,
|
||||
} from "llamaindex/readers/SimpleDirectoryReader";
|
||||
import { TextFileReader } from "llamaindex/readers/TextFileReader";
|
||||
} from "llamaindex";
|
||||
|
||||
class ZipReader extends FileReader {
|
||||
loadDataAsContent(fileContent: Uint8Array): Promise<Document<Metadata>[]> {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { DiscordReader } from "llamaindex";
|
||||
import { DiscordReader } from "@llamaindex/readers/discord";
|
||||
|
||||
async function main() {
|
||||
// Create an instance of the DiscordReader. Set token here or DISCORD_TOKEN environment variable
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { DocxReader } from "@llamaindex/readers/docx";
|
||||
import { VectorStoreIndex } from "llamaindex";
|
||||
import { DocxReader } from "llamaindex/readers/DocxReader";
|
||||
|
||||
const FILE_PATH = "../data/stars.docx";
|
||||
const SAMPLE_QUERY = "Information about Zodiac";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { HTMLReader } from "@llamaindex/readers/html";
|
||||
import { VectorStoreIndex } from "llamaindex";
|
||||
import { HTMLReader } from "llamaindex/readers/HTMLReader";
|
||||
|
||||
async function main() {
|
||||
// Load page
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { JSONReader } from "llamaindex";
|
||||
import { JSONReader } from "@llamaindex/readers/json";
|
||||
|
||||
async function main() {
|
||||
// Data
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { MarkdownReader } from "@llamaindex/readers/markdown";
|
||||
import { VectorStoreIndex } from "llamaindex";
|
||||
import { MarkdownReader } from "llamaindex/readers/MarkdownReader";
|
||||
|
||||
const FILE_PATH = "../data/planets.md";
|
||||
const SAMPLE_QUERY = "List all planets";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { NotionReader } from "@llamaindex/readers/notion";
|
||||
import { Client } from "@notionhq/client";
|
||||
import { program } from "commander";
|
||||
import { VectorStoreIndex } from "llamaindex";
|
||||
import { NotionReader } from "llamaindex/readers/NotionReader";
|
||||
import { stdin as input, stdout as output } from "node:process";
|
||||
import { createInterface } from "node:readline/promises";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { PDFReader } from "@llamaindex/readers/pdf";
|
||||
import { VectorStoreIndex } from "llamaindex";
|
||||
import { PDFReader } from "llamaindex/readers/PDFReader";
|
||||
|
||||
async function main() {
|
||||
// Load PDF
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { PDFReader } from "@llamaindex/readers/pdf";
|
||||
import { FireworksEmbedding, FireworksLLM, VectorStoreIndex } from "llamaindex";
|
||||
import { PDFReader } from "llamaindex/readers/PDFReader";
|
||||
|
||||
import { Settings } from "llamaindex";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { PDFReader } from "@llamaindex/readers/pdf";
|
||||
import { OpenAI, OpenAIEmbedding, VectorStoreIndex } from "llamaindex";
|
||||
import { PDFReader } from "llamaindex/readers/PDFReader";
|
||||
|
||||
import { Settings } from "llamaindex";
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import {
|
||||
LlamaParseReader,
|
||||
SimpleDirectoryReader,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
|
||||
import { LlamaParseReader, VectorStoreIndex } from "llamaindex";
|
||||
|
||||
async function main() {
|
||||
const reader = new SimpleDirectoryReader();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { SimpleDirectoryReader } from "llamaindex/readers/SimpleDirectoryReader";
|
||||
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
|
||||
// or
|
||||
// import { SimpleDirectoryReader } from 'llamaindex'
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import { SimpleDirectoryReader, VectorStoreIndex } from "llamaindex";
|
||||
import { createInterface } from "node:readline/promises";
|
||||
|
||||
async function main() {
|
||||
const reader = new SimpleDirectoryReader();
|
||||
|
||||
const documents = await reader.loadData("./data");
|
||||
|
||||
const index = await VectorStoreIndex.fromDocuments(documents);
|
||||
const queryEngine = index.asQueryEngine();
|
||||
|
||||
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
||||
|
||||
while (true) {
|
||||
const query = await rl.question("Query: ");
|
||||
const response = await queryEngine.query({
|
||||
query,
|
||||
});
|
||||
console.log(response.toString());
|
||||
}
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
@@ -1,5 +1,5 @@
|
||||
import {
|
||||
PapaCSVReader,
|
||||
CSVReader,
|
||||
storageContextFromDefaults,
|
||||
VectorStoreIndex,
|
||||
WeaviateVectorStore,
|
||||
@@ -9,7 +9,7 @@ const indexName = "MovieReviews";
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
const reader = new PapaCSVReader(false);
|
||||
const reader = new CSVReader(false);
|
||||
const docs = await reader.loadData("./data/movie_reviews.csv");
|
||||
const vectorStore = new WeaviateVectorStore({ indexName });
|
||||
const storageContext = await storageContextFromDefaults({ vectorStore });
|
||||
|
||||
@@ -1,5 +1,35 @@
|
||||
# @llamaindex/autotool
|
||||
|
||||
## 5.0.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [359fd33]
|
||||
- Updated dependencies [efb7e1b]
|
||||
- Updated dependencies [98ba1e7]
|
||||
- Updated dependencies [620c63c]
|
||||
- llamaindex@0.8.0
|
||||
|
||||
## 4.0.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [9df9a8f]
|
||||
- llamaindex@0.7.10
|
||||
|
||||
## 4.0.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [691c5bc]
|
||||
- llamaindex@0.7.9
|
||||
|
||||
## 4.0.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.7.8
|
||||
|
||||
## 4.0.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,5 +1,39 @@
|
||||
# @llamaindex/autotool-01-node-example
|
||||
|
||||
## 0.0.43
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [359fd33]
|
||||
- Updated dependencies [efb7e1b]
|
||||
- Updated dependencies [98ba1e7]
|
||||
- Updated dependencies [620c63c]
|
||||
- llamaindex@0.8.0
|
||||
- @llamaindex/autotool@5.0.0
|
||||
|
||||
## 0.0.42
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [9df9a8f]
|
||||
- llamaindex@0.7.10
|
||||
- @llamaindex/autotool@4.0.10
|
||||
|
||||
## 0.0.41
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [691c5bc]
|
||||
- llamaindex@0.7.9
|
||||
- @llamaindex/autotool@4.0.9
|
||||
|
||||
## 0.0.40
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.7.8
|
||||
- @llamaindex/autotool@4.0.8
|
||||
|
||||
## 0.0.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
"scripts": {
|
||||
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
|
||||
},
|
||||
"version": "0.0.39"
|
||||
"version": "0.0.43"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,39 @@
|
||||
# @llamaindex/autotool-02-next-example
|
||||
|
||||
## 0.1.87
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [359fd33]
|
||||
- Updated dependencies [efb7e1b]
|
||||
- Updated dependencies [98ba1e7]
|
||||
- Updated dependencies [620c63c]
|
||||
- llamaindex@0.8.0
|
||||
- @llamaindex/autotool@5.0.0
|
||||
|
||||
## 0.1.86
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [9df9a8f]
|
||||
- llamaindex@0.7.10
|
||||
- @llamaindex/autotool@4.0.10
|
||||
|
||||
## 0.1.85
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [691c5bc]
|
||||
- llamaindex@0.7.9
|
||||
- @llamaindex/autotool@4.0.9
|
||||
|
||||
## 0.1.84
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.7.8
|
||||
- @llamaindex/autotool@4.0.8
|
||||
|
||||
## 0.1.83
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/autotool-02-next-example",
|
||||
"private": true,
|
||||
"version": "0.1.83",
|
||||
"version": "0.1.87",
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/autotool",
|
||||
"type": "module",
|
||||
"version": "4.0.7",
|
||||
"version": "5.0.0",
|
||||
"description": "auto transpile your JS function to LLM Agent compatible",
|
||||
"files": [
|
||||
"dist",
|
||||
|
||||
@@ -1,5 +1,37 @@
|
||||
# @llamaindex/cloud
|
||||
|
||||
## 2.0.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [359fd33]
|
||||
- Updated dependencies [efb7e1b]
|
||||
- Updated dependencies [98ba1e7]
|
||||
- Updated dependencies [620c63c]
|
||||
- @llamaindex/core@0.4.0
|
||||
|
||||
## 1.0.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [60b185f]
|
||||
- @llamaindex/core@0.3.7
|
||||
|
||||
## 1.0.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [691c5bc]
|
||||
- @llamaindex/core@0.3.6
|
||||
|
||||
## 1.0.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [fa60fc6]
|
||||
- @llamaindex/env@0.1.16
|
||||
- @llamaindex/core@0.3.5
|
||||
|
||||
## 1.0.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/cloud",
|
||||
"version": "1.0.5",
|
||||
"version": "2.0.0",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,37 @@
|
||||
# @llamaindex/community
|
||||
|
||||
## 0.0.57
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [359fd33]
|
||||
- Updated dependencies [efb7e1b]
|
||||
- Updated dependencies [98ba1e7]
|
||||
- Updated dependencies [620c63c]
|
||||
- @llamaindex/core@0.4.0
|
||||
|
||||
## 0.0.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [60b185f]
|
||||
- @llamaindex/core@0.3.7
|
||||
|
||||
## 0.0.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [691c5bc]
|
||||
- @llamaindex/core@0.3.6
|
||||
|
||||
## 0.0.54
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [fa60fc6]
|
||||
- @llamaindex/env@0.1.16
|
||||
- @llamaindex/core@0.3.5
|
||||
|
||||
## 0.0.53
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/community",
|
||||
"description": "Community package for LlamaIndexTS",
|
||||
"version": "0.0.53",
|
||||
"version": "0.0.57",
|
||||
"type": "module",
|
||||
"types": "dist/type/index.d.ts",
|
||||
"main": "dist/cjs/index.js",
|
||||
|
||||
@@ -1,5 +1,39 @@
|
||||
# @llamaindex/core
|
||||
|
||||
## 0.4.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 98ba1e7: fea:t implement context-aware agent
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 359fd33: refactor(core): move `ContextChatEngine` and `SimpleChatEngine`
|
||||
- efb7e1b: refactor: move `RetrieverQueryEngine` into core module
|
||||
- 620c63c: feat: add `@llamaindex/readers` package
|
||||
|
||||
If you are using import `llamaindex/readers/...`,
|
||||
you will need to install `@llamaindex/core` and change import path to `@llamaindex/readers/...`.
|
||||
|
||||
## 0.3.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 60b185f: fix: source nodes is empty
|
||||
|
||||
## 0.3.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 691c5bc: fix: export embeddings utils
|
||||
|
||||
## 0.3.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [fa60fc6]
|
||||
- @llamaindex/env@0.1.16
|
||||
|
||||
## 0.3.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/core",
|
||||
"type": "module",
|
||||
"version": "0.3.4",
|
||||
"version": "0.4.0",
|
||||
"description": "LlamaIndex Core Module",
|
||||
"exports": {
|
||||
"./agent": {
|
||||
@@ -297,6 +297,20 @@
|
||||
"types": "./data-structs/dist/index.d.ts",
|
||||
"default": "./data-structs/dist/index.js"
|
||||
}
|
||||
},
|
||||
"./postprocessor": {
|
||||
"require": {
|
||||
"types": "./postprocessor/dist/index.d.cts",
|
||||
"default": "./postprocessor/dist/index.cjs"
|
||||
},
|
||||
"import": {
|
||||
"types": "./postprocessor/dist/index.d.ts",
|
||||
"default": "./postprocessor/dist/index.js"
|
||||
},
|
||||
"default": {
|
||||
"types": "./postprocessor/dist/index.d.ts",
|
||||
"default": "./postprocessor/dist/index.js"
|
||||
}
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
@@ -320,7 +334,8 @@
|
||||
"./retriever",
|
||||
"./vector-store",
|
||||
"./tools",
|
||||
"./data-structs"
|
||||
"./data-structs",
|
||||
"./postprocessor"
|
||||
],
|
||||
"scripts": {
|
||||
"dev": "bunchee --watch",
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
BaseChatEngine,
|
||||
type NonStreamingChatEngineParams,
|
||||
type StreamingChatEngineParams,
|
||||
} from "../chat-engine";
|
||||
} from "../chat-engine/base";
|
||||
import { wrapEventCaller } from "../decorator";
|
||||
import { Settings } from "../global";
|
||||
import type {
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
export { AgentRunner, AgentWorker, type AgentParamsBase } from "./base.js";
|
||||
export { LLMAgent, LLMAgentWorker, type LLMAgentParams } from "./llm.js";
|
||||
export type { AgentEndEvent, AgentStartEvent, TaskHandler } from "./types.js";
|
||||
export type {
|
||||
AgentEndEvent,
|
||||
AgentStartEvent,
|
||||
TaskHandler,
|
||||
TaskStep,
|
||||
} from "./types.js";
|
||||
export {
|
||||
callTool,
|
||||
consumeAsyncIterable,
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
import type { ChatMessage, MessageContent } from "../llms";
|
||||
import type { BaseMemory } from "../memory";
|
||||
import { EngineResponse } from "../schema";
|
||||
|
||||
export interface BaseChatEngineParams<
|
||||
AdditionalMessageOptions extends object = object,
|
||||
> {
|
||||
message: MessageContent;
|
||||
/**
|
||||
* Optional chat history if you want to customize the chat history.
|
||||
*/
|
||||
chatHistory?:
|
||||
| ChatMessage<AdditionalMessageOptions>[]
|
||||
| BaseMemory<AdditionalMessageOptions>;
|
||||
}
|
||||
|
||||
export interface StreamingChatEngineParams<
|
||||
AdditionalMessageOptions extends object = object,
|
||||
> extends BaseChatEngineParams<AdditionalMessageOptions> {
|
||||
stream: true;
|
||||
}
|
||||
|
||||
export interface NonStreamingChatEngineParams<
|
||||
AdditionalMessageOptions extends object = object,
|
||||
> extends BaseChatEngineParams<AdditionalMessageOptions> {
|
||||
stream?: false;
|
||||
}
|
||||
|
||||
export abstract class BaseChatEngine {
|
||||
abstract chat(params: NonStreamingChatEngineParams): Promise<EngineResponse>;
|
||||
abstract chat(
|
||||
params: StreamingChatEngineParams,
|
||||
): Promise<AsyncIterable<EngineResponse>>;
|
||||
|
||||
abstract chatHistory: ChatMessage[] | Promise<ChatMessage[]>;
|
||||
}
|
||||
@@ -1,33 +1,24 @@
|
||||
import type {
|
||||
BaseChatEngine,
|
||||
NonStreamingChatEngineParams,
|
||||
StreamingChatEngineParams,
|
||||
} from "@llamaindex/core/chat-engine";
|
||||
import { wrapEventCaller } from "@llamaindex/core/decorator";
|
||||
import type {
|
||||
ChatMessage,
|
||||
LLM,
|
||||
MessageContent,
|
||||
MessageType,
|
||||
} from "@llamaindex/core/llms";
|
||||
import { BaseMemory, ChatMemoryBuffer } from "@llamaindex/core/memory";
|
||||
import { wrapEventCaller } from "../decorator";
|
||||
import { Settings } from "../global";
|
||||
import type { ChatMessage, LLM, MessageContent, MessageType } from "../llms";
|
||||
import { BaseMemory, ChatMemoryBuffer } from "../memory";
|
||||
import type { BaseNodePostprocessor } from "../postprocessor";
|
||||
import {
|
||||
type ContextSystemPrompt,
|
||||
type ModuleRecord,
|
||||
PromptMixin,
|
||||
type PromptsRecord,
|
||||
} from "@llamaindex/core/prompts";
|
||||
import type { BaseRetriever } from "@llamaindex/core/retriever";
|
||||
import { EngineResponse, MetadataMode } from "@llamaindex/core/schema";
|
||||
import {
|
||||
extractText,
|
||||
streamConverter,
|
||||
streamReducer,
|
||||
} from "@llamaindex/core/utils";
|
||||
import { Settings } from "../../Settings.js";
|
||||
import type { BaseNodePostprocessor } from "../../postprocessors/index.js";
|
||||
import { DefaultContextGenerator } from "./DefaultContextGenerator.js";
|
||||
import type { ContextGenerator } from "./types.js";
|
||||
} from "../prompts";
|
||||
import type { BaseRetriever } from "../retriever";
|
||||
import { EngineResponse, MetadataMode } from "../schema";
|
||||
import { extractText, streamConverter, streamReducer } from "../utils";
|
||||
import type {
|
||||
BaseChatEngine,
|
||||
NonStreamingChatEngineParams,
|
||||
StreamingChatEngineParams,
|
||||
} from "./base";
|
||||
import { DefaultContextGenerator } from "./default-context-generator";
|
||||
import type { ContextGenerator } from "./type";
|
||||
|
||||
/**
|
||||
* ContextChatEngine uses the Index to get the appropriate context for each query.
|
||||
@@ -1,15 +1,15 @@
|
||||
import type { MessageContent, MessageType } from "@llamaindex/core/llms";
|
||||
import type { MessageContent, MessageType } from "../llms";
|
||||
import type { BaseNodePostprocessor } from "../postprocessor";
|
||||
import {
|
||||
type ContextSystemPrompt,
|
||||
defaultContextSystemPrompt,
|
||||
type ModuleRecord,
|
||||
PromptMixin,
|
||||
} from "@llamaindex/core/prompts";
|
||||
import { createMessageContent } from "@llamaindex/core/response-synthesizers";
|
||||
import type { BaseRetriever } from "@llamaindex/core/retriever";
|
||||
import { MetadataMode, type NodeWithScore } from "@llamaindex/core/schema";
|
||||
import type { BaseNodePostprocessor } from "../../postprocessors/index.js";
|
||||
import type { Context, ContextGenerator } from "./types.js";
|
||||
} from "../prompts";
|
||||
import { createMessageContent } from "../response-synthesizers";
|
||||
import type { BaseRetriever } from "../retriever";
|
||||
import { MetadataMode, type NodeWithScore } from "../schema";
|
||||
import type { Context, ContextGenerator } from "./type.js";
|
||||
|
||||
export class DefaultContextGenerator
|
||||
extends PromptMixin
|
||||