Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cd24ebf926 | |||
| 52f8ca133c |
@@ -1,8 +0,0 @@
|
||||
# Changesets
|
||||
|
||||
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
|
||||
with multi-package repos, or single-package repos to help you version and publish your code. You can
|
||||
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
|
||||
|
||||
We have a quick list of common questions to get you started engaging with this project in
|
||||
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
|
||||
"changelog": "@changesets/cli/changelog",
|
||||
"commit": false,
|
||||
"fixed": [],
|
||||
"linked": [],
|
||||
"access": "public",
|
||||
"baseBranch": "main",
|
||||
"updateInternalDependencies": "patch",
|
||||
"ignore": []
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"jsc": {
|
||||
"parser": {
|
||||
"syntax": "typescript",
|
||||
"decorators": true
|
||||
},
|
||||
"target": "esnext",
|
||||
"transform": {
|
||||
"decoratorVersion": "2022-03"
|
||||
}
|
||||
},
|
||||
"module": {
|
||||
"type": "commonjs",
|
||||
"ignoreDynamic": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
// This tells ESLint to load the config from the package `eslint-config-custom`
|
||||
extends: ["custom"],
|
||||
settings: {
|
||||
next: {
|
||||
rootDir: ["apps/*/"],
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -1,2 +0,0 @@
|
||||
examples/readers/data/** binary
|
||||
examples/data/** binary
|
||||
@@ -1,46 +0,0 @@
|
||||
---
|
||||
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.
|
||||
@@ -1,10 +0,0 @@
|
||||
name: Bugfix
|
||||
title: ""
|
||||
description: Write something like "We notice ... behavior when ... happens instead of ..." If you would like to use sweep.dev prefix with "Sweep:"
|
||||
body:
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Details
|
||||
description: More details about the bug
|
||||
placeholder: The bug might be in ... file
|
||||
@@ -1,10 +0,0 @@
|
||||
name: Feature Request
|
||||
title: ""
|
||||
description: Write something like "Write an api endpoint that does "..." in the "..." file". If you would like to use sweep.dev prefix with "Sweep:"
|
||||
body:
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Details
|
||||
description: More details
|
||||
placeholder: The new endpoint should use the ... class from ... file because it contains ... logic
|
||||
@@ -1,10 +0,0 @@
|
||||
name: Refactor
|
||||
title: ""
|
||||
description: Write something like "Modify the ... api endpoint to use ... version and ... framework" If you would like to use sweep.dev prefix with "Sweep:"
|
||||
body:
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Details
|
||||
description: More details
|
||||
placeholder: We are migrating this function to ... version because ...
|
||||
@@ -1,27 +0,0 @@
|
||||
name: Lint on push or pull request
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
- name: Run lint
|
||||
run: pnpm run lint
|
||||
- name: Run Prettier
|
||||
run: pnpm run format
|
||||
@@ -1,28 +0,0 @@
|
||||
name: Publish Preview
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
pre_release:
|
||||
name: Pre Release
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: Build
|
||||
run: pnpm run build
|
||||
|
||||
- name: Pre Release
|
||||
run: pnpx pkg-pr-new publish --pnpm ./packages/* ./packages/providers/* ./packages/providers/storage/*
|
||||
@@ -1,37 +0,0 @@
|
||||
name: Publish to GitHub Releases
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "llamaindex@*"
|
||||
|
||||
jobs:
|
||||
build-and-publish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: Build tarball
|
||||
run: |
|
||||
pnpm pack
|
||||
working-directory: packages/llamaindex
|
||||
|
||||
- name: Create release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "packages/llamaindex/llamaindex-*.tgz"
|
||||
name: Release ${{ github.ref }}
|
||||
bodyFile: "packages/llamaindex/CHANGELOG.md"
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -1,70 +0,0 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Release
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: Add auth token to .npmrc file
|
||||
run: |
|
||||
cat << EOF >> ".npmrc"
|
||||
//registry.npmjs.org/:_authToken=$NPM_TOKEN
|
||||
EOF
|
||||
env:
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
- name: Get changeset status
|
||||
id: get-changeset-status
|
||||
run: |
|
||||
pnpm changeset status --output .changeset/status.json
|
||||
new_version=$(jq -r '.releases[] | select(.name == "llamaindex") | .newVersion' < .changeset/status.json)
|
||||
rm -v .changeset/status.json
|
||||
echo "new-version=${new_version}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Create Release Pull Request or Publish to npm
|
||||
id: changesets
|
||||
uses: changesets/action@v1
|
||||
with:
|
||||
commit: Release ${{ steps.get-changeset-status.outputs.new-version }}
|
||||
title: Release ${{ steps.get-changeset-status.outputs.new-version }}
|
||||
# update version PR with the latest changesets
|
||||
version: pnpm new-version
|
||||
# build package and call changeset publish
|
||||
publish: pnpm release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
# Refs: https://github.com/changesets/changesets/issues/421
|
||||
- name: Update lock file
|
||||
continue-on-error: true
|
||||
run: pnpm install --lockfile-only
|
||||
|
||||
- name: Commit lock file
|
||||
continue-on-error: true
|
||||
uses: stefanzweifel/git-auto-commit-action@v5
|
||||
with:
|
||||
commit_message: "chore: update lock file"
|
||||
branch: changeset-release/main
|
||||
file_pattern: "pnpm-lock.yaml"
|
||||
@@ -1,193 +0,0 @@
|
||||
name: Run Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
|
||||
TURBO_REMOTE_ONLY: true
|
||||
|
||||
jobs:
|
||||
e2e:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [18.x, 20.x, 22.x, 23.x]
|
||||
name: E2E on Node.js ${{ matrix.node-version }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ankane/setup-postgres@v1
|
||||
with:
|
||||
database: llamaindex_node_test
|
||||
dev-files: true
|
||||
- run: |
|
||||
cd /tmp
|
||||
git clone --branch v0.7.0 https://github.com/pgvector/pgvector.git
|
||||
cd pgvector
|
||||
make
|
||||
sudo make install
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: "pnpm"
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
- name: Run E2E Tests
|
||||
run: pnpm run e2e
|
||||
|
||||
test:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [18.x, 20.x, 22.x, 23.x]
|
||||
name: Test on Node.js ${{ matrix.node-version }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: "pnpm"
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
- name: Run tests
|
||||
run: pnpm run test
|
||||
typecheck:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
- name: Build
|
||||
run: pnpm run build
|
||||
- name: Run Type Check
|
||||
run: pnpm run type-check
|
||||
- name: Run Circular Dependency Check
|
||||
run: pnpm run circular-check
|
||||
e2e-llamaindex-examples:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
packages:
|
||||
- cloudflare-worker-agent
|
||||
- nextjs-agent
|
||||
- nextjs-edge-runtime
|
||||
- nextjs-node-runtime
|
||||
- waku-query-engine
|
||||
- llama-parse-browser
|
||||
- vite-import-llamaindex
|
||||
runs-on: ubuntu-latest
|
||||
name: Build LlamaIndex Example (${{ matrix.packages }})
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
- name: Build llamaindex
|
||||
run: pnpm run build
|
||||
- name: Build ${{ matrix.packages }}
|
||||
run: pnpm run build
|
||||
working-directory: e2e/examples/${{ matrix.packages }}
|
||||
|
||||
size-limit:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'pull_request'
|
||||
name: Size Limit
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
- name: Build llamaindex
|
||||
run: pnpm run build
|
||||
- uses: andresz1/size-limit-action@94bc357df29c36c8f8d50ea497c3e225c3c95d1d
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
directory: e2e/examples/vite-import-llamaindex
|
||||
skip_step: "install"
|
||||
build_script: build
|
||||
package_manager: pnpm
|
||||
|
||||
typecheck-examples:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
cache: "pnpm"
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
- name: Build
|
||||
run: pnpm run build
|
||||
- name: Copy examples
|
||||
run: rsync -rv --exclude=node_modules ./examples ${{ runner.temp }}
|
||||
- name: Pack packages
|
||||
run: |
|
||||
for dir in packages/*; do
|
||||
if [ -d "$dir" ] && [ -f "$dir/package.json" ] && [[ ! "$dir" =~ autotool ]]; then
|
||||
echo "Packing $dir"
|
||||
pnpm pack --pack-destination ${{ runner.temp }} -C $dir
|
||||
else
|
||||
echo "Skipping $dir, no package.json found"
|
||||
fi
|
||||
done
|
||||
- name: Pack provider packages
|
||||
run: |
|
||||
for dir in packages/providers/* packages/providers/storage/*; do
|
||||
if [ -d "$dir" ] && [ -f "$dir/package.json" ]; then
|
||||
echo "Packing $dir"
|
||||
pnpm pack --pack-destination ${{ runner.temp }} -C $dir
|
||||
else
|
||||
echo "Skipping $dir, no package.json found"
|
||||
fi
|
||||
done
|
||||
- name: Install
|
||||
run: npm add ${{ runner.temp }}/*.tgz
|
||||
working-directory: ${{ runner.temp }}/examples
|
||||
- name: Run Type Check
|
||||
run: npx tsc --project ./tsconfig.json
|
||||
working-directory: ${{ runner.temp }}/examples
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: build-dist
|
||||
path: |
|
||||
${{ runner.temp }}/*.tgz
|
||||
if-no-files-found: error
|
||||
@@ -3,7 +3,6 @@
|
||||
# dependencies
|
||||
node_modules
|
||||
.pnp
|
||||
.pnpm-store
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
@@ -36,18 +35,4 @@ yarn-error.log*
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
dist/
|
||||
lib/
|
||||
|
||||
.cache
|
||||
test-results/
|
||||
playwright-report/
|
||||
blob-report/
|
||||
playwright/.cache/
|
||||
.tsbuildinfo
|
||||
|
||||
# intellij
|
||||
**/.idea
|
||||
|
||||
# generated API
|
||||
packages/cloud/src/client
|
||||
storage/
|
||||
|
||||
@@ -1 +1,4 @@
|
||||
pnpm run lint-staged
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
pnpm lint
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
pnpm test
|
||||
@@ -1,5 +1 @@
|
||||
auto-install-peers = true
|
||||
enable-pre-post-scripts = true
|
||||
prefer-workspace-packages = true
|
||||
save-workspace-protocol = true
|
||||
link-workspace-packages = true
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
apps/docs/i18n
|
||||
apps/docs/docs/api
|
||||
pnpm-lock.yaml
|
||||
lib/
|
||||
dist/
|
||||
.docusaurus/
|
||||
.source/
|
||||
# prttier doesn't support mdx3 we are using
|
||||
*.mdx
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"jsc": {
|
||||
"parser": {
|
||||
"syntax": "typescript",
|
||||
"decorators": true
|
||||
},
|
||||
"target": "esnext",
|
||||
"transform": {
|
||||
"decoratorVersion": "2022-03"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Debug Example",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"runtimeExecutable": "pnpm",
|
||||
"console": "integratedTerminal",
|
||||
"cwd": "${workspaceFolder}/examples",
|
||||
"runtimeArgs": ["npx", "tsx", "${file}"]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
LlamaIndexTS
|
||||
@@ -1,19 +1,5 @@
|
||||
{
|
||||
"editor.tabSize": 2,
|
||||
"editor.formatOnSave": true,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"[xml]": {
|
||||
"editor.defaultFormatter": "redhat.vscode-xml"
|
||||
},
|
||||
"[python]": {
|
||||
"editor.defaultFormatter": "ms-python.black-formatter"
|
||||
},
|
||||
"[jsonc]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"prettier.prettierPath": "./node_modules/prettier",
|
||||
"prettier.configPath": "prettier.config.mjs"
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
}
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
# Contributing
|
||||
|
||||
## Structure
|
||||
|
||||
LlamaIndex.TS uses pnpm monorepo.
|
||||
|
||||
We recommend you to understand the basics of Node.js, TypeScript, pnpm, and of course, LLM before contributing.
|
||||
|
||||
There are some important folders in the repository:
|
||||
|
||||
- `packages/*`: Contains the source code of the packages. Each package is a separate npm package.
|
||||
- `llamaindex`: The starter package for LlamaIndex.TS, which contains the all sub-packages.
|
||||
- `core`: The core package of LlamaIndex.TS, which contains the abstract classes and interfaces. It is designed for
|
||||
all JS runtime environments.
|
||||
- `env`: The environment package of LlamaIndex.TS, which contains the environment-specific classes and interfaces. It
|
||||
includes compatibility layers for Node.js, Deno, Vercel Edge Runtime, Cloudflare Workers...
|
||||
- `apps/*`: The applications based on LlamaIndex.TS.
|
||||
- `next`: Our documentation website based on Next.js.
|
||||
- `examples`: The code examples of LlamaIndex.TS using Node.js.
|
||||
|
||||
## Getting Started
|
||||
|
||||
Make sure you have Node.js LIS (Long-term Support) installed. You can check your Node.js version by running:
|
||||
|
||||
```shell
|
||||
node -v
|
||||
# v20.x.x
|
||||
```
|
||||
|
||||
### Use pnpm
|
||||
|
||||
```shell
|
||||
corepack enable
|
||||
```
|
||||
|
||||
### Install dependencies
|
||||
|
||||
```shell
|
||||
pnpm install
|
||||
```
|
||||
|
||||
### Build the packages
|
||||
|
||||
You'll need Turbo to build the packages. If you don't have it, you can run it with `pnpx`.
|
||||
|
||||
To build all packages, run:
|
||||
|
||||
```shell
|
||||
# Build all packages
|
||||
pnpx turbo build --filter "./packages/*"
|
||||
|
||||
# Or if you have turbo installed, you can run:
|
||||
turbo build --filter "./packages/*"
|
||||
```
|
||||
|
||||
### Docs
|
||||
|
||||
See the [docs](./apps/next/README.md) for more information.
|
||||
|
||||
## Changeset
|
||||
|
||||
We use [changesets](https://github.com/changesets/changesets) for managing versions and changelogs. To create a new
|
||||
changeset, run in the root folder:
|
||||
|
||||
```
|
||||
pnpm changeset
|
||||
```
|
||||
|
||||
Please send a descriptive changeset for each PR.
|
||||
|
||||
## Publishing (maintainers only)
|
||||
|
||||
The [Release Github Action](.github/workflows/release.yml) is automatically generating and updating a
|
||||
PR called "Release {version}".
|
||||
|
||||
This PR will update the `package.json` and `CHANGELOG.md` files of each package according to
|
||||
the current changesets in the [.changeset](.changeset) folder.
|
||||
|
||||
If this PR is merged it will automatically add version tags to the repository and publish the updated packages to NPM.
|
||||
@@ -0,0 +1,81 @@
|
||||
# Turborepo starter
|
||||
|
||||
This is an official starter Turborepo.
|
||||
|
||||
## Using this example
|
||||
|
||||
Run the following command:
|
||||
|
||||
```sh
|
||||
npx create-turbo@latest
|
||||
```
|
||||
|
||||
## What's inside?
|
||||
|
||||
This Turborepo includes the following packages/apps:
|
||||
|
||||
### Apps and Packages
|
||||
|
||||
- `docs`: a [Next.js](https://nextjs.org/) app
|
||||
- `web`: another [Next.js](https://nextjs.org/) app
|
||||
- `ui`: a stub React component library shared by both `web` and `docs` applications
|
||||
- `eslint-config-custom`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`)
|
||||
- `tsconfig`: `tsconfig.json`s used throughout the monorepo
|
||||
|
||||
Each package/app is 100% [TypeScript](https://www.typescriptlang.org/).
|
||||
|
||||
### Utilities
|
||||
|
||||
This Turborepo has some additional tools already setup for you:
|
||||
|
||||
- [TypeScript](https://www.typescriptlang.org/) for static type checking
|
||||
- [ESLint](https://eslint.org/) for code linting
|
||||
- [Prettier](https://prettier.io) for code formatting
|
||||
|
||||
### Build
|
||||
|
||||
To build all apps and packages, run the following command:
|
||||
|
||||
```
|
||||
cd my-turborepo
|
||||
pnpm build
|
||||
```
|
||||
|
||||
### Develop
|
||||
|
||||
To develop all apps and packages, run the following command:
|
||||
|
||||
```
|
||||
cd my-turborepo
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
### Remote Caching
|
||||
|
||||
Turborepo can use a technique known as [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines.
|
||||
|
||||
By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup), then enter the following commands:
|
||||
|
||||
```
|
||||
cd my-turborepo
|
||||
npx turbo login
|
||||
```
|
||||
|
||||
This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview).
|
||||
|
||||
Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your Turborepo:
|
||||
|
||||
```
|
||||
npx turbo link
|
||||
```
|
||||
|
||||
## Useful Links
|
||||
|
||||
Learn more about the power of Turborepo:
|
||||
|
||||
- [Tasks](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks)
|
||||
- [Caching](https://turbo.build/repo/docs/core-concepts/caching)
|
||||
- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching)
|
||||
- [Filtering](https://turbo.build/repo/docs/core-concepts/monorepos/filtering)
|
||||
- [Configuration Options](https://turbo.build/repo/docs/reference/configuration)
|
||||
- [CLI Usage](https://turbo.build/repo/docs/reference/command-line-reference)
|
||||
@@ -1,107 +1,64 @@
|
||||
<p align="center">
|
||||
<img height="100" width="100" alt="LlamaIndex logo" src="https://ts.llamaindex.ai/square.svg" />
|
||||
</p>
|
||||
<h1 align="center">LlamaIndex.TS</h1>
|
||||
<h3 align="center">
|
||||
Data framework for your LLM application.
|
||||
</h3>
|
||||
# LlamaScript: LlamaIndex for TS/JS
|
||||
|
||||
[](https://www.npmjs.com/package/llamaindex)
|
||||
[](https://www.npmjs.com/package/llamaindex)
|
||||
[](https://www.npmjs.com/package/llamaindex)
|
||||
[](https://discord.com/invite/eN6D2HQ4aX)
|
||||
## Structure
|
||||
|
||||
Use your own data with large language models (LLMs, OpenAI ChatGPT and others) in JS runtime environments with TypeScript support.
|
||||
This is a monorepo built with Turborepo
|
||||
|
||||
Documentation: https://ts.llamaindex.ai/
|
||||
Right now there are two packages of importance:
|
||||
|
||||
Try examples online:
|
||||
packages/core which is the main NPM library @llamaindex/core
|
||||
|
||||
[](https://stackblitz.com/github/run-llama/LlamaIndexTS/tree/main/examples)
|
||||
apps/simple is where the demo code lives
|
||||
|
||||
## What is LlamaIndex.TS?
|
||||
### Turborepo docs
|
||||
|
||||
LlamaIndex.TS aims to be a lightweight, easy to use set of libraries to help you integrate large language models into your applications with your own data.
|
||||
You can checkout how Turborepo works using the built in [README-turborepo.md](README-turborepo.md)
|
||||
|
||||
## Compatibility
|
||||
## Getting Started
|
||||
|
||||
### Multiple JS Environment Support
|
||||
Install NodeJS. Preferably v18 using nvm or n.
|
||||
|
||||
LlamaIndex.TS supports multiple JS environments, including:
|
||||
Inside the llamascript directory:
|
||||
|
||||
- Node.js >= 20 ✅
|
||||
- Deno ✅
|
||||
- Bun ✅
|
||||
- Nitro ✅
|
||||
- Vercel Edge Runtime ✅ (with some limitations)
|
||||
- Cloudflare Workers ✅ (with some limitations)
|
||||
|
||||
For now, browser support is limited due to the lack of support for [AsyncLocalStorage-like APIs](https://github.com/tc39/proposal-async-context)
|
||||
|
||||
### Supported LLMs:
|
||||
|
||||
- OpenAI LLms
|
||||
- Anthropic LLms
|
||||
- Groq LLMs
|
||||
- Llama2, Llama3, Llama3.1 LLMs
|
||||
- MistralAI LLMs
|
||||
- Fireworks LLMs
|
||||
- DeepSeek LLMs
|
||||
- ReplicateAI LLMs
|
||||
- TogetherAI LLMs
|
||||
- HuggingFace LLms
|
||||
- DeepInfra LLMs
|
||||
- Gemini LLMs
|
||||
|
||||
## Getting started
|
||||
|
||||
```shell
|
||||
npm install llamaindex
|
||||
pnpm install llamaindex
|
||||
yarn add llamaindex
|
||||
```
|
||||
npm i -g pnpm ts-node
|
||||
pnpm install
|
||||
```
|
||||
|
||||
### Setup in Node.js, Deno, Bun, TypeScript...?
|
||||
Note: we use pnpm in this repo, which has a lot of the same functionality and CLI options as npm but it does do some things better in a monorepo, like centralizing dependencies and caching.
|
||||
|
||||
See our official document: <https://ts.llamaindex.ai/docs/llamaindex/getting_started/>
|
||||
PNPM's has documentation on its [workspace feature](https://pnpm.io/workspaces) and Turborepo had some [useful documentation also](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks).
|
||||
|
||||
### Adding provider packages
|
||||
### Running Typescript
|
||||
|
||||
In most cases, you'll also need to install provider packages to use LlamaIndexTS. These are for adding AI models, file readers for ingestion or storing documents, e.g. in vector databases.
|
||||
When we publish to NPM we will have a tsc compiled version of the library in JS. For now, the easiest thing to do is use ts-node.
|
||||
|
||||
For example, to use the OpenAI LLM, you would install the following package:
|
||||
### Test cases
|
||||
|
||||
```shell
|
||||
npm install @llamaindex/openai
|
||||
pnpm install @llamaindex/openai
|
||||
yarn add @llamaindex/openai
|
||||
To run them, run
|
||||
|
||||
```
|
||||
pnpm run test
|
||||
```
|
||||
|
||||
## Playground
|
||||
To write new test cases write them in packages/core/src/tests
|
||||
|
||||
Check out our NextJS playground at https://llama-playground.vercel.app/. The source is available at https://github.com/run-llama/ts-playground
|
||||
We use Jest https://jestjs.io/ to write our test cases. Jest comes with a bunch of built in assertions using the expect function: https://jestjs.io/docs/expect
|
||||
|
||||
## Core concepts for getting started:
|
||||
### Demo applications
|
||||
|
||||
- [Document](/packages/llamaindex/src/Node.ts): A document represents a text file, PDF file or other contiguous piece of data.
|
||||
You can create new demo applications in the apps folder. Just run pnpm init in the folder after you create it to create its own package.json
|
||||
|
||||
- [Node](/packages/llamaindex/src/Node.ts): The basic data building block. Most commonly, these are parts of the document split into manageable pieces that are small enough to be fed into an embedding model and LLM.
|
||||
### Installing packages
|
||||
|
||||
- [Embedding](/packages/llamaindex/src/embeddings/OpenAIEmbedding.ts): Embeddings are sets of floating point numbers which represent the data in a Node. By comparing the similarity of embeddings, we can derive an understanding of the similarity of two pieces of data. One use case is to compare the embedding of a question with the embeddings of our Nodes to see which Nodes may contain the data needed to answer that question. Because the default service context is OpenAI, the default embedding is `OpenAIEmbedding`. If using different models, say through Ollama, use this [Embedding](/packages/llamaindex/src/embeddings/OllamaEmbedding.ts) (see all [here](/packages/llamaindex/src/embeddings)).
|
||||
To install packages for a specific package or demo application, run
|
||||
|
||||
- [Indices](/packages/llamaindex/src/indices/): Indices store the Nodes and the embeddings of those nodes. QueryEngines retrieve Nodes from these Indices using embedding similarity.
|
||||
```
|
||||
pnpm add [NPM Package] --filter [package or application i.e. core or simple]
|
||||
```
|
||||
|
||||
- [QueryEngine](/packages/llamaindex/src/engines/query/RetrieverQueryEngine.ts): Query engines are what generate the query you put in and give you back the result. Query engines generally combine a pre-built prompt with selected Nodes from your Index to give the LLM the context it needs to answer your query. To build a query engine from your Index (recommended), use the [`asQueryEngine`](/packages/llamaindex/src/indices/BaseIndex.ts) method on your Index. See all query engines [here](/packages/llamaindex/src/engines/query).
|
||||
To install packages for every package or application run
|
||||
|
||||
- [ChatEngine](/packages/llamaindex/src/engines/chat/SimpleChatEngine.ts): A ChatEngine helps you build a chatbot that will interact with your Indices. See all chat engines [here](/packages/llamaindex/src/engines/chat).
|
||||
|
||||
- [SimplePrompt](/packages/llamaindex/src/Prompt.ts): A simple standardized function call definition that takes in inputs and formats them in a template literal. SimplePrompts can be specialized using currying and combined using other SimplePrompt functions.
|
||||
|
||||
## Contributing:
|
||||
|
||||
Please see our [contributing guide](CONTRIBUTING.md) for more information.
|
||||
You are highly encouraged to contribute to LlamaIndex.TS!
|
||||
|
||||
## Community
|
||||
|
||||
Please join our Discord! https://discord.com/invite/eN6D2HQ4aX
|
||||
```
|
||||
pnpm add -w [NPM Package]
|
||||
```
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
extends: ["custom"],
|
||||
};
|
||||
@@ -25,11 +25,10 @@ yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
@@ -0,0 +1,30 @@
|
||||
## Getting Started
|
||||
|
||||
First, run the development server:
|
||||
|
||||
```bash
|
||||
yarn dev
|
||||
```
|
||||
|
||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||
|
||||
You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
|
||||
|
||||
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
|
||||
|
||||
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Next.js, take a look at the following resources:
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
||||
- [Learn Next.js](https://nextjs.org/learn/foundations/about-nextjs) - an interactive Next.js tutorial.
|
||||
|
||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
||||
|
||||
## Deploy on Vercel
|
||||
|
||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js.
|
||||
|
||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
||||
@@ -0,0 +1,11 @@
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { Button, Header } from "ui";
|
||||
|
||||
export default function Page() {
|
||||
return (
|
||||
<>
|
||||
<Header text="Docs" />
|
||||
<Button />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
reactStrictMode: true,
|
||||
transpilePackages: ["ui"],
|
||||
};
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "docs",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev --port 3001",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "^13.4.1",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"ui": "workspace:*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^17.0.12",
|
||||
"@types/react": "^18.0.22",
|
||||
"@types/react-dom": "^18.0.7",
|
||||
"eslint-config-custom": "workspace:*",
|
||||
"tsconfig": "workspace:*",
|
||||
"typescript": "^4.5.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": "tsconfig/nextjs.json",
|
||||
"compilerOptions": {
|
||||
"plugins": [{ "name": "next" }]
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
# deps
|
||||
/node_modules
|
||||
|
||||
# generated content
|
||||
.contentlayer
|
||||
.content-collections
|
||||
.source
|
||||
|
||||
# test & build
|
||||
/coverage
|
||||
/.next/
|
||||
/out/
|
||||
/build
|
||||
*.tsbuildinfo
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
/.pnp
|
||||
.pnp.js
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# others
|
||||
.env*.local
|
||||
.vercel
|
||||
next-env.d.ts
|
||||
|
||||
# build
|
||||
/src/content/docs/cloud/api
|
||||
/src/content/docs/api
|
||||
./types
|
||||
@@ -1,542 +0,0 @@
|
||||
# @llamaindex/doc
|
||||
|
||||
## 0.1.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5668970]
|
||||
- @llamaindex/core@0.5.5
|
||||
- @llamaindex/workflow@0.0.12
|
||||
- @llamaindex/cloud@3.0.6
|
||||
- llamaindex@0.9.6
|
||||
- @llamaindex/node-parser@1.0.5
|
||||
- @llamaindex/openai@0.1.57
|
||||
- @llamaindex/readers@2.0.5
|
||||
|
||||
## 0.1.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [ad3c7f1]
|
||||
- @llamaindex/core@0.5.4
|
||||
- @llamaindex/cloud@3.0.5
|
||||
- llamaindex@0.9.5
|
||||
- @llamaindex/node-parser@1.0.4
|
||||
- @llamaindex/openai@0.1.56
|
||||
- @llamaindex/readers@2.0.4
|
||||
|
||||
## 0.1.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [cb256f2]
|
||||
- Updated dependencies [cb021e7]
|
||||
- @llamaindex/openai@0.1.55
|
||||
- @llamaindex/core@0.5.3
|
||||
- llamaindex@0.9.4
|
||||
- @llamaindex/cloud@3.0.4
|
||||
- @llamaindex/node-parser@1.0.3
|
||||
- @llamaindex/readers@2.0.3
|
||||
|
||||
## 0.1.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [d952e68]
|
||||
- @llamaindex/core@0.5.2
|
||||
- @llamaindex/cloud@3.0.3
|
||||
- llamaindex@0.9.3
|
||||
- @llamaindex/node-parser@1.0.2
|
||||
- @llamaindex/openai@0.1.54
|
||||
- @llamaindex/readers@2.0.2
|
||||
|
||||
## 0.1.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [c902fcb]
|
||||
- Updated dependencies [88d776f]
|
||||
- @llamaindex/cloud@3.0.2
|
||||
- llamaindex@0.9.2
|
||||
|
||||
## 0.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [6d37d44]
|
||||
- llamaindex@0.9.1
|
||||
- @llamaindex/cloud@3.0.1
|
||||
- @llamaindex/core@0.5.1
|
||||
- @llamaindex/node-parser@1.0.1
|
||||
- @llamaindex/openai@0.1.53
|
||||
- @llamaindex/readers@2.0.1
|
||||
- @llamaindex/workflow@0.0.11
|
||||
|
||||
## 0.1.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 6a4a737: Remove re-exports from llamaindex main package
|
||||
- f4588bc: Remove readers package from llamaindex
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- c7c0800: fix: fumadoc build fail
|
||||
- a87efb9: docs: update chat engine docs
|
||||
- 7bd5d93: docs: update workflow doc
|
||||
- Updated dependencies [6a4a737]
|
||||
- Updated dependencies [d924c63]
|
||||
- Updated dependencies [b490376]
|
||||
- Updated dependencies [f4588bc]
|
||||
- llamaindex@0.9.0
|
||||
- @llamaindex/core@0.5.0
|
||||
- @llamaindex/cloud@3.0.0
|
||||
- @llamaindex/node-parser@1.0.0
|
||||
- @llamaindex/openai@0.1.52
|
||||
- @llamaindex/readers@2.0.0
|
||||
|
||||
## 0.0.41
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [1c908fd]
|
||||
- @llamaindex/openai@0.1.51
|
||||
- @llamaindex/node-parser@0.0.24
|
||||
- @llamaindex/workflow@0.0.10
|
||||
- @llamaindex/readers@1.0.25
|
||||
- @llamaindex/cloud@2.0.24
|
||||
- @llamaindex/core@0.4.23
|
||||
- llamaindex@0.8.37
|
||||
|
||||
## 0.0.40
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [cb608b5]
|
||||
- @llamaindex/openai@0.1.50
|
||||
- @llamaindex/node-parser@0.0.23
|
||||
- @llamaindex/workflow@0.0.9
|
||||
- @llamaindex/readers@1.0.24
|
||||
- @llamaindex/cloud@2.0.23
|
||||
- @llamaindex/core@0.4.22
|
||||
- llamaindex@0.8.36
|
||||
|
||||
## 0.0.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 6d4d96f: chore: update examples and docs to use unified imports
|
||||
- Updated dependencies [15563a0]
|
||||
- @llamaindex/openai@0.1.49
|
||||
- llamaindex@0.8.35
|
||||
|
||||
## 0.0.38
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [9f8ad37]
|
||||
- Updated dependencies [7265f74]
|
||||
- llamaindex@0.8.34
|
||||
- @llamaindex/openai@0.1.48
|
||||
|
||||
## 0.0.37
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2019a04]
|
||||
- @llamaindex/openai@0.1.47
|
||||
- llamaindex@0.8.33
|
||||
|
||||
## 0.0.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- f02621e: Fix internal links between chapters
|
||||
- Updated dependencies [34faf48]
|
||||
- Updated dependencies [4df1fe6]
|
||||
- Updated dependencies [9456616]
|
||||
- Updated dependencies [d6c270e]
|
||||
- Updated dependencies [1892e1c]
|
||||
- Updated dependencies [1931bbc]
|
||||
- llamaindex@0.8.32
|
||||
- @llamaindex/core@0.4.21
|
||||
- @llamaindex/cloud@2.0.22
|
||||
- @llamaindex/openai@0.1.46
|
||||
- @llamaindex/node-parser@0.0.22
|
||||
- @llamaindex/readers@1.0.23
|
||||
|
||||
## 0.0.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5dec9f9]
|
||||
- Updated dependencies [fd9c829]
|
||||
- Updated dependencies [d211b7a]
|
||||
- Updated dependencies [0ebbfc1]
|
||||
- @llamaindex/cloud@2.0.21
|
||||
- llamaindex@0.8.31
|
||||
- @llamaindex/core@0.4.20
|
||||
- @llamaindex/node-parser@0.0.21
|
||||
- @llamaindex/openai@0.1.45
|
||||
- @llamaindex/readers@1.0.22
|
||||
|
||||
## 0.0.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [012495b]
|
||||
- @llamaindex/cloud@2.0.20
|
||||
- llamaindex@0.8.30
|
||||
|
||||
## 0.0.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [dd596a0]
|
||||
- llamaindex@0.8.29
|
||||
|
||||
## 0.0.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- a9b5b99: feat: build api reference pages for new documentation site
|
||||
- Updated dependencies [a9b5b99]
|
||||
- @llamaindex/core@0.4.19
|
||||
- @llamaindex/readers@1.0.21
|
||||
- @llamaindex/cloud@2.0.19
|
||||
- llamaindex@0.8.28
|
||||
- @llamaindex/node-parser@0.0.20
|
||||
- @llamaindex/openai@0.1.44
|
||||
|
||||
## 0.0.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [b504303]
|
||||
- Updated dependencies [e0f6cc3]
|
||||
- Updated dependencies [a0e6f57]
|
||||
- llamaindex@0.8.27
|
||||
- @llamaindex/core@0.4.18
|
||||
- @llamaindex/cloud@2.0.18
|
||||
- @llamaindex/node-parser@0.0.19
|
||||
- @llamaindex/openai@0.1.43
|
||||
- @llamaindex/readers@1.0.20
|
||||
- @llamaindex/workflow@0.0.8
|
||||
|
||||
## 0.0.30
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [3d1808b]
|
||||
- @llamaindex/core@0.4.17
|
||||
- llamaindex@0.8.26
|
||||
- @llamaindex/openai@0.1.42
|
||||
- @llamaindex/cloud@2.0.17
|
||||
- @llamaindex/node-parser@0.0.18
|
||||
- @llamaindex/readers@1.0.19
|
||||
|
||||
## 0.0.29
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7e8230b]
|
||||
- Updated dependencies [8be4589]
|
||||
- @llamaindex/readers@1.0.18
|
||||
- @llamaindex/cloud@2.0.16
|
||||
- @llamaindex/core@0.4.16
|
||||
- @llamaindex/node-parser@0.0.17
|
||||
- @llamaindex/openai@0.1.41
|
||||
- @llamaindex/workflow@0.0.7
|
||||
- llamaindex@0.8.25
|
||||
|
||||
## 0.0.28
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- fd38a25: Add vercel tool adapter to use query engine tool
|
||||
|
||||
## 0.0.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515f2c1]
|
||||
- llamaindex@0.8.24
|
||||
|
||||
## 0.0.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @llamaindex/cloud@2.0.15
|
||||
- @llamaindex/core@0.4.15
|
||||
- llamaindex@0.8.23
|
||||
- @llamaindex/node-parser@0.0.16
|
||||
- @llamaindex/openai@0.1.40
|
||||
- @llamaindex/readers@1.0.17
|
||||
|
||||
## 0.0.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [819af45]
|
||||
- llamaindex@0.8.22
|
||||
- @llamaindex/cloud@2.0.14
|
||||
- @llamaindex/core@0.4.14
|
||||
- @llamaindex/node-parser@0.0.15
|
||||
- @llamaindex/openai@0.1.39
|
||||
- @llamaindex/readers@1.0.16
|
||||
|
||||
## 0.0.24
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [83c3897]
|
||||
- Updated dependencies [efa2211]
|
||||
- llamaindex@0.8.21
|
||||
|
||||
## 0.0.23
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [02b22da]
|
||||
- llamaindex@0.8.20
|
||||
|
||||
## 0.0.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [90d265c]
|
||||
- @llamaindex/cloud@2.0.13
|
||||
- @llamaindex/core@0.4.13
|
||||
- llamaindex@0.8.19
|
||||
- @llamaindex/node-parser@0.0.14
|
||||
- @llamaindex/readers@1.0.15
|
||||
- @llamaindex/openai@0.1.38
|
||||
|
||||
## 0.0.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [d17450f]
|
||||
- Updated dependencies [ef4f63d]
|
||||
- llamaindex@0.8.18
|
||||
- @llamaindex/core@0.4.12
|
||||
- @llamaindex/cloud@2.0.12
|
||||
- @llamaindex/node-parser@0.0.13
|
||||
- @llamaindex/openai@0.1.37
|
||||
- @llamaindex/readers@1.0.14
|
||||
|
||||
## 0.0.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [6d22fa2]
|
||||
- @llamaindex/core@0.4.11
|
||||
- @llamaindex/cloud@2.0.11
|
||||
- llamaindex@0.8.17
|
||||
- @llamaindex/node-parser@0.0.12
|
||||
- @llamaindex/openai@0.1.36
|
||||
- @llamaindex/readers@1.0.13
|
||||
|
||||
## 0.0.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [e60328b]
|
||||
- @llamaindex/readers@1.0.12
|
||||
- llamaindex@0.8.16
|
||||
|
||||
## 0.0.18
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [3d503cb]
|
||||
- Updated dependencies [5dae534]
|
||||
- llamaindex@0.8.15
|
||||
|
||||
## 0.0.17
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [630b425]
|
||||
- llamaindex@0.8.14
|
||||
|
||||
## 0.0.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a7b0ac3]
|
||||
- Updated dependencies [ee20c44]
|
||||
- Updated dependencies [c69605f]
|
||||
- @llamaindex/core@0.4.10
|
||||
- @llamaindex/workflow@0.0.6
|
||||
- llamaindex@0.8.13
|
||||
- @llamaindex/cloud@2.0.10
|
||||
- @llamaindex/node-parser@0.0.11
|
||||
- @llamaindex/openai@0.1.35
|
||||
- @llamaindex/readers@1.0.11
|
||||
|
||||
## 0.0.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [ea92b69]
|
||||
- Updated dependencies [fadc8b8]
|
||||
- @llamaindex/workflow@0.0.5
|
||||
|
||||
## 0.0.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7ae6eaa]
|
||||
- @llamaindex/core@0.4.9
|
||||
- @llamaindex/openai@0.1.34
|
||||
- @llamaindex/cloud@2.0.9
|
||||
- llamaindex@0.8.12
|
||||
- @llamaindex/node-parser@0.0.10
|
||||
- @llamaindex/readers@1.0.10
|
||||
|
||||
## 0.0.13
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f865c98]
|
||||
- @llamaindex/core@0.4.8
|
||||
- @llamaindex/cloud@2.0.8
|
||||
- llamaindex@0.8.11
|
||||
- @llamaindex/node-parser@0.0.9
|
||||
- @llamaindex/openai@0.1.33
|
||||
- @llamaindex/readers@1.0.9
|
||||
|
||||
## 0.0.12
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f066e50]
|
||||
- Updated dependencies [d89ebe0]
|
||||
- Updated dependencies [fd8c882]
|
||||
- Updated dependencies [fd8c882]
|
||||
- llamaindex@0.8.10
|
||||
- @llamaindex/core@0.4.7
|
||||
- @llamaindex/workflow@0.0.4
|
||||
- @llamaindex/cloud@2.0.7
|
||||
- @llamaindex/node-parser@0.0.8
|
||||
- @llamaindex/openai@0.1.32
|
||||
- @llamaindex/readers@1.0.8
|
||||
|
||||
## 0.0.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4fc001c]
|
||||
- Updated dependencies [4d4cd8a]
|
||||
- llamaindex@0.8.9
|
||||
- @llamaindex/cloud@2.0.6
|
||||
- @llamaindex/core@0.4.6
|
||||
- @llamaindex/node-parser@0.0.7
|
||||
- @llamaindex/openai@0.1.31
|
||||
- @llamaindex/readers@1.0.7
|
||||
|
||||
## 0.0.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [ad85bd0]
|
||||
- @llamaindex/core@0.4.5
|
||||
- llamaindex@0.8.8
|
||||
- @llamaindex/node-parser@0.0.6
|
||||
- @llamaindex/workflow@0.0.3
|
||||
- @llamaindex/cloud@2.0.5
|
||||
- @llamaindex/openai@0.1.30
|
||||
- @llamaindex/readers@1.0.6
|
||||
|
||||
## 0.0.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @llamaindex/cloud@2.0.4
|
||||
- @llamaindex/core@0.4.4
|
||||
- llamaindex@0.8.7
|
||||
- @llamaindex/node-parser@0.0.5
|
||||
- @llamaindex/openai@0.1.29
|
||||
- @llamaindex/readers@1.0.5
|
||||
|
||||
## 0.0.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [95a5cc6]
|
||||
- @llamaindex/core@0.4.3
|
||||
- llamaindex@0.8.6
|
||||
- @llamaindex/cloud@2.0.3
|
||||
- @llamaindex/node-parser@0.0.4
|
||||
- @llamaindex/openai@0.1.28
|
||||
- @llamaindex/readers@1.0.4
|
||||
|
||||
## 0.0.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [14cc9eb]
|
||||
- Updated dependencies [a6db5dd]
|
||||
- Updated dependencies [396b1e1]
|
||||
- llamaindex@0.8.5
|
||||
- @llamaindex/cloud@2.0.2
|
||||
- @llamaindex/core@0.4.2
|
||||
- @llamaindex/node-parser@0.0.3
|
||||
- @llamaindex/openai@0.1.27
|
||||
- @llamaindex/readers@1.0.3
|
||||
|
||||
## 0.0.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [35430d3]
|
||||
- llamaindex@0.8.4
|
||||
- @llamaindex/readers@1.0.2
|
||||
|
||||
## 0.0.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2ff0a89]
|
||||
- @llamaindex/node-parser@0.0.2
|
||||
- llamaindex@0.8.3
|
||||
|
||||
## 0.0.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0765742]
|
||||
- @llamaindex/workflow@0.0.2
|
||||
|
||||
## 0.0.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [c7a918c]
|
||||
- llamaindex@0.8.2
|
||||
|
||||
## 0.0.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [9c73f0a]
|
||||
- @llamaindex/core@0.4.1
|
||||
- @llamaindex/cloud@2.0.1
|
||||
- llamaindex@0.8.1
|
||||
- @llamaindex/openai@0.1.26
|
||||
- @llamaindex/readers@1.0.1
|
||||
|
||||
## 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,21 +0,0 @@
|
||||
# Docs
|
||||
|
||||
This is a Next.js application generated with
|
||||
[Create Fumadocs](https://github.com/fuma-nama/fumadocs).
|
||||
|
||||
Run development server:
|
||||
|
||||
```bash
|
||||
turbo run dev
|
||||
# turbo will build all required packages before running the dev server
|
||||
```
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Next.js and Fumadocs, take a look at the following
|
||||
resources:
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js
|
||||
features and API.
|
||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||
- [Fumadocs](https://fumadocs.vercel.app) - learn about Fumadocs
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"$schema": "https://ui.shadcn.com/schema.json",
|
||||
"style": "new-york",
|
||||
"rsc": true,
|
||||
"tsx": true,
|
||||
"tailwind": {
|
||||
"config": "tailwind.config.js",
|
||||
"css": "app/global.css",
|
||||
"baseColor": "neutral",
|
||||
"cssVariables": true,
|
||||
"prefix": ""
|
||||
},
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils",
|
||||
"ui": "@/components/ui",
|
||||
"lib": "@/lib",
|
||||
"hooks": "@/hooks"
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
import { createMDX } from "fumadocs-mdx/next";
|
||||
import MonacoWebpackPlugin from "monaco-editor-webpack-plugin";
|
||||
const withMDX = createMDX();
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const config = {
|
||||
reactStrictMode: true,
|
||||
transpilePackages: ["monaco-editor"],
|
||||
serverExternalPackages: ["@huggingface/transformers"],
|
||||
webpack: (config, { isServer }) => {
|
||||
if (Array.isArray(config.target) && config.target.includes("web")) {
|
||||
config.target = ["web", "es2020"];
|
||||
}
|
||||
|
||||
config.resolve.alias = {
|
||||
...config.resolve.alias,
|
||||
sharp$: false,
|
||||
"onnxruntime-node$": false,
|
||||
};
|
||||
config.resolve.fallback ??= {};
|
||||
config.resolve.fallback.fs = false;
|
||||
if (!isServer) {
|
||||
config.plugins.push(
|
||||
new MonacoWebpackPlugin({
|
||||
languages: ["typescript"],
|
||||
filename: "static/[name].worker.js",
|
||||
}),
|
||||
);
|
||||
}
|
||||
config.resolve.alias["replicate"] = false;
|
||||
return config;
|
||||
},
|
||||
};
|
||||
|
||||
export default withMDX(config);
|
||||
@@ -1,93 +0,0 @@
|
||||
{
|
||||
"name": "@llamaindex/doc",
|
||||
"version": "0.1.6",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "pnpm run build:docs && next build",
|
||||
"dev": "next dev",
|
||||
"start": "next start",
|
||||
"postdev": "fumadocs-mdx",
|
||||
"postbuild": "fumadocs-mdx && tsx scripts/post-build.mts",
|
||||
"build:docs": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" typedoc && node ./scripts/generate-docs.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@icons-pack/react-simple-icons": "^10.1.0",
|
||||
"@llamaindex/chat-ui": "0.0.9",
|
||||
"@llamaindex/cloud": "workspace:*",
|
||||
"@llamaindex/core": "workspace:*",
|
||||
"@llamaindex/node-parser": "workspace:*",
|
||||
"@llamaindex/openai": "workspace:*",
|
||||
"@llamaindex/readers": "workspace:*",
|
||||
"@llamaindex/workflow": "workspace:*",
|
||||
"@mdx-js/mdx": "^3.1.0",
|
||||
"@number-flow/react": "^0.3.4",
|
||||
"@radix-ui/react-dialog": "^1.1.2",
|
||||
"@radix-ui/react-icons": "^1.3.2",
|
||||
"@radix-ui/react-label": "^2.1.0",
|
||||
"@radix-ui/react-slider": "^1.2.1",
|
||||
"@radix-ui/react-slot": "^1.1.0",
|
||||
"@radix-ui/react-tooltip": "^1.1.4",
|
||||
"@vercel/functions": "^1.5.0",
|
||||
"@scalar/api-client-react": "^1.1.25",
|
||||
"ai": "^3.4.33",
|
||||
"class-variance-authority": "^0.7.0",
|
||||
"clsx": "2.1.1",
|
||||
"foxact": "^0.2.41",
|
||||
"framer-motion": "^11.11.17",
|
||||
"fumadocs-core": "^14.7.7",
|
||||
"fumadocs-docgen": "^1.3.7",
|
||||
"fumadocs-mdx": "^11.5.3",
|
||||
"fumadocs-openapi": "^5.12.0",
|
||||
"fumadocs-twoslash": "^2.0.3",
|
||||
"fumadocs-typescript": "^3.0.3",
|
||||
"fumadocs-ui": "^14.7.7",
|
||||
"hast-util-to-jsx-runtime": "^2.3.2",
|
||||
"llamaindex": "workspace:*",
|
||||
"lucide-react": "^0.460.0",
|
||||
"next": "15.1.7",
|
||||
"next-themes": "^0.4.3",
|
||||
"react": "^19.0.0",
|
||||
"react-dom": "^19.0.0",
|
||||
"react-icons": "^5.3.0",
|
||||
"react-monaco-editor": "^0.56.2",
|
||||
"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": "^2.3.2",
|
||||
"shiki-magic-move": "^1.0.0",
|
||||
"swr": "^2.2.5",
|
||||
"tailwind-merge": "^2.5.2",
|
||||
"tailwindcss-animate": "^1.0.7",
|
||||
"tree-sitter": "^0.22.1",
|
||||
"tree-sitter-typescript": "^0.23.2",
|
||||
"use-stick-to-bottom": "^1.0.42",
|
||||
"web-tree-sitter": "^0.24.4",
|
||||
"zod": "^3.23.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@next/env": "^15.0.3",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"@types/node": "22.9.0",
|
||||
"@types/react": "^18.3.12",
|
||||
"@types/react-dom": "^18.3.1",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"cross-env": "^7.0.3",
|
||||
"fast-glob": "^3.3.2",
|
||||
"gray-matter": "^4.0.3",
|
||||
"monaco-editor-webpack-plugin": "^7.1.0",
|
||||
"postcss": "^8.4.49",
|
||||
"raw-loader": "^4.0.2",
|
||||
"remark": "^15.0.1",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"remark-mdx": "^3.1.0",
|
||||
"remark-stringify": "^11.0.0",
|
||||
"tailwindcss": "^3.4.15",
|
||||
"tsx": "^4.19.2",
|
||||
"typedoc": "0.27.4",
|
||||
"typedoc-plugin-markdown": "^4.3.1",
|
||||
"typedoc-plugin-merge-modules": "^6.1.0",
|
||||
"typescript": "^5.7.2"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
};
|
||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 867 B |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 15 KiB |
@@ -1,38 +0,0 @@
|
||||
<?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>
|
||||
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
@@ -1,2 +0,0 @@
|
||||
<?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>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@@ -1,654 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 28.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg [
|
||||
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
|
||||
<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
|
||||
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
|
||||
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
|
||||
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
|
||||
<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
|
||||
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
|
||||
<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
|
||||
]>
|
||||
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 341.5"
|
||||
overflow="visible" xml:space="preserve">
|
||||
<switch>
|
||||
<foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
|
||||
<i:aipgfRef xlink:href="#adobe_illustrator_pgf">
|
||||
</i:aipgfRef>
|
||||
</foreignObject>
|
||||
<g i:extraneous="self">
|
||||
<path d="M556,7.1c-62.1,0-112.4,50.3-112.4,112.4S493.9,232,556,232s112.4-50.3,112.4-112.4c0,0,0,0,0,0
|
||||
C668.3,57.5,618,7.2,556,7.1z M556,189.8c-38.8,0-70.3-31.5-70.3-70.3c0-38.8,31.5-70.3,70.3-70.3c38.8,0,70.3,31.5,70.3,70.3
|
||||
C626.2,158.3,594.7,189.8,556,189.8L556,189.8z"/>
|
||||
<path d="M131.6,6.5C69.5,6,18.7,55.8,18.1,117.9C17.5,180,67.4,230.8,129.5,231.4c0.7,0,1.4,0,2.1,0h37v-42.1h-37
|
||||
c-38.8,0.5-70.6-30.6-71.1-69.4s30.6-70.6,69.4-71.1c0.5,0,1.1,0,1.6,0c38.7,0,70.4,31.5,70.4,70.3l0,0v103.5l0,0
|
||||
c0,38.5-31.3,69.8-69.7,70.3c-18.4-0.2-35.9-7.5-48.9-20.6L53.5,302c20.7,20.8,48.7,32.6,78,32.9l0,0h1.5l0,0
|
||||
c61.3-0.9,110.6-50.6,110.9-111.9V116.2C242.4,55.2,192.5,6.6,131.6,6.5z"/>
|
||||
<path d="M918.6,330.1V116.8c-1.5-61-51.4-109.6-112.4-109.7c-62.1-0.6-112.9,49.3-113.5,111.4S742.1,231.4,804.2,232
|
||||
c0.7,0,1.4,0,2.1,0h37v-42.1h-37c-38.8,0.5-70.6-30.6-71.1-69.4s30.6-70.6,69.4-71.1c0.5,0,1.1,0,1.6,0
|
||||
c38.7,0,70.4,31.5,70.4,70.3l0,0v210.1l0,0L918.6,330.1z"/>
|
||||
<path d="M276.1,232h42V119.6c0-38.8,31.5-70.3,70.3-70.3c12.8,0,24.7,3.4,35.1,9.4l21.1-36.5c-16.5-9.5-35.7-15-56.1-15
|
||||
c-62.1,0-112.4,50.3-112.4,112.4L276.1,232z"/>
|
||||
<g>
|
||||
<path d="M950.3,10c3.2,1.8,5.7,4.3,7.5,7.5c1.8,3.2,2.7,6.7,2.7,10.6c0,3.9-0.9,7.4-2.8,10.7c-1.9,3.2-4.4,5.8-7.6,7.6
|
||||
c-3.2,1.9-6.8,2.8-10.6,2.8s-7.4-0.9-10.6-2.8c-3.2-1.9-5.7-4.4-7.5-7.6c-1.8-3.2-2.8-6.7-2.8-10.6c0-3.8,0.9-7.4,2.8-10.6
|
||||
c1.8-3.2,4.4-5.7,7.6-7.6s6.8-2.8,10.7-2.8C943.6,7.2,947.1,8.1,950.3,10z M948.2,43c2.6-1.5,4.6-3.6,6.1-6.2
|
||||
c1.5-2.6,2.2-5.5,2.2-8.7c0-3.2-0.7-6.1-2.2-8.7s-3.5-4.6-6-6.1c-2.6-1.5-5.5-2.2-8.7-2.2c-3.2,0-6.1,0.8-8.7,2.3
|
||||
c-2.6,1.5-4.6,3.6-6.1,6.2c-1.5,2.6-2.2,5.5-2.2,8.7c0,3.2,0.7,6.1,2.2,8.7c1.5,2.6,3.5,4.7,6,6.2c2.6,1.5,5.4,2.3,8.6,2.3
|
||||
C942.7,45.3,945.6,44.5,948.2,43z M949.5,29.2c-0.7,1.2-1.8,2.1-3.2,2.8l5,7.7h-6.2l-4.3-6.7h-0.2h-3.9v6.7h-6.2v-23h10
|
||||
c3.1,0,5.6,0.7,7.4,2.2c1.8,1.5,2.7,3.5,2.7,6C950.6,26.5,950.2,28,949.5,29.2z M940.1,28.4c1.4,0,2.5-0.3,3.2-0.9
|
||||
c0.8-0.6,1.2-1.5,1.2-2.6c0-1.1-0.4-2-1.2-2.7s-1.9-0.9-3.2-0.9h-3.5v7.2H940.1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</switch>
|
||||
<i:aipgf id="adobe_illustrator_pgf" i:pgfEncoding="zstd/base64" i:pgfVersion="24">
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
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
|
||||
]]>
|
||||
<![CDATA[
|
||||
PTCvPQ9bQKejRPUB6T1fJHiPwUi6C0vNjB1ATJm1ZccySprsYKzTWno2JUcbnKYPlOqvJTIsNqJC
|
||||
Wu+A5siOIWacHFvaKpJC0gY7/Nlwk1balao6iUhzmoEEdOjwQgaDqzUBLTc6CYbSgdrO6A0qxmVl
|
||||
fNey1fTUhfbHUe4VaQdtuf9cq0KqnozQhdFUFZ4Uv5RF7SCE62nF4nLvlqJ++mr+eTY6vJc4dwtv
|
||||
fME7ljc3YFxHtWcUPNCCYTfFHyPamFHBGvsz5A1alDcb5JgZVR/ozLdD2m5+oJLtlX9RKtD8r/sh
|
||||
u/nY7pdh3aD2zm3k4u/Z5N8mDZmPjR+cFsvYxTJx8cOR43vmEpC960BaD9pB3MCGwTnNQCdt2vik
|
||||
vjsMIneWS5wvOszAtFeHeKrDej9R2A1SHcTCYckw4gyuMaWWdxJ1pHiBztSsGitRgaTIq3gSJzuV
|
||||
SNCpgX27iDrxt8ns5urvmZS7G/EEulzxxF05ydzvfgdu2QGE4olgz+jS0gxm2crzhQxM7YpQBsRI
|
||||
rbnLBAAPfwWrFeYbYyHTQQh3DYOtXWTQSNjxMki7Zf/DTBIz4ex1HdkuccgMVPeDDeVRlPs9vFij
|
||||
UDx136V+cnNJnEkgVyI4O1mtAKZlg2I0LZJlUQDRrDwA3kK6LYkamLa/2WVwxiL+qKxi7xGHPl5M
|
||||
ru4xMvIf+3l/KekmwvGJlxYnsbWYvLhUG3+RZRyRaM6o9Dovibu+yOu0LAWulEhY3udv1ESD8jBH
|
||||
Eg1KA4+EPVvfd5M1PL98STnzVh0sYMecZ1SI1cE7Ii/pLJs4ZNwjN9+mHyxXR+rGWj6s3Gb/oF7X
|
||||
rf0afiuDiyPA6zPF/Iu01Gnb3tOToeOl9IpchsOTjAAh7nfxM3WpvZI6oZ6H0YvPE3htLSLViBwY
|
||||
+oxP2S7ZoVkPlpHTvOtuM2MZ9ZK+TgNANZ8ifF87CTfxO8SrKk6915L9eFIeFhuIARVbcWA/ntJm
|
||||
q1v3atScv2gEFKdYMtIOSio+dgDyJBEJXD+erJbcFUyMEEB924h/PO2DXpjO4GjjiSUFQDiPJ5zx
|
||||
T+tbr/gfT6UxLjXUxhPlmwBJoeNNbWw8WTYu6n88zSoWopAXBHSxGEyy8iVXKAMkAXuze3ySuJV5
|
||||
rKYkY0UHUSeuNYvwl++ACXtohu43HbCApdBQ45UyHq1p7ZF28oNY09eW1V6Q3RkJhzy3FJ0OUrsm
|
||||
lYqcfSZP4qMsc9m0uJ4XQiSPuwhDL1bhD7B6ofQqC8bocbBh7fBT1NvLM96pQbPuDoZVVPtTK2mo
|
||||
4q4sXBnlDmBTBgXDYrDAiQUD7q2cVZpgNwkJYeeIMepfSsmXZgoOxlo30Qf/V42NYRtTOSjk4KjV
|
||||
FV7I26SpFoPv7//q3AJ11fF2L6jv2nyXWidnKo56LiXg8Pr8hVBe68GvUiTqume5MR5TI/M2zzdM
|
||||
rel/+knA6CbUoPt20S6Fe4quV2J+r1BOO7O5/+iDvc1MJum2gYhPsgIKSD5D3CKVeWGnFAqqsEFO
|
||||
kTJlzovel5T3i8hWlFgwd1pnm1XaKioLrhaIdcHOgvRonobEBt/2SboOutdne5ubOuCaDAA+1wPY
|
||||
SyGhFjIePCOqhpF2ttL+fVO1w0sqsi+TGuALGTEv0VWkKkfkjS+WPMUfd3Q+11tkpVgKWyuV/AiJ
|
||||
JQuFBKPt7L7riht0qyNjiYhB8l09dSyxolAZ26uPbWmJI2ExQHVkqqUQ0zEw5RvPORYyvKMnDZ9a
|
||||
Ub4uhiLFmHlOXEw+9a03tXWKvl8FPwvia8M5/03T8BYrXr1Lkha4jbNp694cL3HLuSItg/JFZs9n
|
||||
MBdL/4/T6OQATKAOCKWRBJol4DVKKrwyO/iAkFhizetSOyUZXJrZukkWenI1FKLYQGddWUIuc6Go
|
||||
A7Ppqr2uCbFdJp4ZPpw0CYarvVV90IrXqDsETYp5m0/adCcnGaKxKk/KKSA/Vs6SI+BYW41VRhua
|
||||
oZvM8iCiiLHRrQM3BnTlsbbJ6ZDOaYZDRN7Ito1I0BcZEXZW0Pt5SQ4uAeBdBu4tvw8EPERkXpmK
|
||||
1vDAGyE/fyadHbNcYt/xbyGsh5gxjU5ucvU0NxH1VCjJJCHmJve7VBaYlSrF/X/KfNAcpq9/ryxm
|
||||
emz6xL+b0L+bpRa5Ev9CA38Qe1ac1OambUAEL2TZuMhNqAH3BJmbKpJDn5VPaBLjmjK4X/+2i66W
|
||||
7nsLwr/Zl4SqrSpQw78KXxMPiKboYxEwrCLLdqz0Lw3LCA78myNDJPH1H9a0GOJBuIKFqnf3CcD3
|
||||
AhmMpVQNSDlC0b9Tu0hp4d8cjVkGLgGbVCr+ldKX103/NuanYWbhwFF87tNgeGXckkJ7oDAgmwZp
|
||||
/TtxH9dw55TQJOvfq29xU+Df9XqOcrn3AD6IHR988C/PhYx6JMt+vyalVzxd8WZ88jNFC+FzkTaH
|
||||
lpX7MtDJrpks4gF1Jsq2EPXjzG5hrIzx8/7Ua0zj1nKRcev7K55b6fVMe1YAtLQM8aHUVpNvrzzo
|
||||
4QtDJkP5+fmIwwCdEsbPv1kQ6gpQGEp8AI0pwA8tGF+9GWowncw4YjF2FppXfypLcmhNe0671/x0
|
||||
O4T8Ngg+4SKsxd1jhoZzlaWjQBSZWJraW6Uirvgoq6Q0SMcE6oFdJXVVPopm5bwSOc1hsZxT9In3
|
||||
S3Hbq0jGntJ5japb8Clz/HTdofJjKXT2JhmyqVQSqX2vQ/B8HlJG+b+FvMsYuPa2ouP68e5vSUKb
|
||||
0BF6H2IUavTGFl3FMvTaR+ROiIHRnDKx3KdJQRqQMvkeWMRmmbD6eyPGaq4GITXJskHxhl77a88E
|
||||
4AaPXrRFN9fy10bGjd6oArpzo1okbVrNZ5oihUwNLLN/+M5AS8bgknCsC0RD+qyQuvMlmDf0tZBV
|
||||
ENZWKuyVCkk4F1IEEedsNRYU/yLawMPhRzVdRWnkk15MnBfj+o4SHfoZkTXRbS6ZTH1rEyunC2sH
|
||||
2oEjy97MwBU3uN+CfOkALX/wMwNCCRqo8sYsDnELUO/ehB56sZRrW36OT8suhXoF4aSDpN6hcnaQ
|
||||
EmWqyTCoN5fh8P7ese/kDap8iUuolyfUtwakXv6Qcp2TeVDAVgDCfKprpN5Us5Zr+4xGbm0U0EoG
|
||||
USz47ZNMYj9qasVE8xodIVGwS3jGNKlOkzQMikYX5clbt225YKMqplhIUhx06Q/svvfp3FE3LYz6
|
||||
6N6EvxVA1mys+PG6Z0qj1saHSB6X/7407WHZyzrOI2aR+MwhEnUI9zJbxIm6W/Z5wuqG/LwRVMsn
|
||||
+8Guq5CAZ8ARzqGM3GQpzgzvbWEGng/3Zj3wNhCjecUtlg1f3/d3DXGCqbh5ImcyPlIp3s6rnWyf
|
||||
THA9fnkXy8duP1gYWbFwEKJr8pHHs/Sa5gQxm2Kz7aVMTtiWFbsFff2mvCjvwD4k450pW7eqkRnp
|
||||
Y+rLDr63tmfnFdqyV6DEta8TJ54MA5yjdUIJcA7tUlkK1jE2Q2GvSOHD/J3qv8PDb/XfWZXOMrcH
|
||||
pQrZYBNQNuNfJiUhNGmocJorzXcbVQdhutwOvXqTZhYSDkhB6JYLpTDp6l0O1XXg4j9HX/XK7wK4
|
||||
bUn9qtdpRiT2rt5W2xux6m0n+QfTxIjx/q7e9zIaSHzL9SjTpLH9JLSEXPWSkjOtk0wuPJGr3upD
|
||||
T7CVRRkBKsOr4gZWupQgHK5A1Ss8Olfv0TMHXtchVYd5KFSQo+aOjNdWvfvNPXu+XIzl5cJVL4hC
|
||||
LBGf/FoKbfmK5aekzVkBg79MonlEX39rceIP1TEYqbHyXOWODJ5YNE0x83uQcG54mDygLtggOPa9
|
||||
+QjrE1x8iod8ySxE0kwB88c7DN7BFw/enqKHSYbI3sGbei0pL+kOgzUIDZrcgREAr5I+LQyjgOvS
|
||||
ZF0RkJZWPPaNroKrDO9vUpvQv/XAxI4P8SzA+z42xCNO7BecXu/au/NTQ0lPfFfzdcbuqhImoK+x
|
||||
AF32fB+UHdw20cecwhQUBSeXYWuaKHidVJR6kZY7HtImNJpE8+vlu//BBAbUlvUaMfwFgdtkXjuc
|
||||
83ovpxMZbCJw9wcvGEQB4XbQ+WYSdv+TkweE7Us4rLGhH8ijC6WBXt8+7xkdVpTjtfvP6jayjAch
|
||||
wUU6pAQzl73rUInwGuzOu5KKecaAXQQykKw6GQvC+UvvQgaE4MsNeSDDC+JsAHPxUAmMYAxb8+Wd
|
||||
KP1Pd6rU+zgzMVqT/Lojp3B8vAu8wYS+u42c34VrPIR6nIDxMvOiGPypKS2biqDz7voOESHexNV4
|
||||
d6AbQhuGdPDuLjvRXLqOaJ329ncXX4CyrKIL+uebZT/OwMLsp9ztuU17cWx8dwMhJKudkg7lE1LW
|
||||
YGSvNIOaiL+eP53YEu/mK/PuFg014l2Wl5bOd7cB0XuqvkEKXM7xbmizgIMxZlegGu8WccYWJ2cU
|
||||
7+5M6B6X/bvbkJWr4RlGmCd7/3+K71BASlQHKfsXfuFtMyMJGkhPQR32RnspQjdqRd9+uvCyAO8E
|
||||
qqyASB3iSrG8nmpWGeVG2qjkCK/XSWD0Fz7vO/Zi+HprTLylnAWT4jKQa6pgQ0CUlSNiYYPNLJZy
|
||||
gpMFLCpiKId8f0hRTtAVHzWWhK7sUGLrBjOR/V2Ky+s5w/3b9J0Yg9ud2axLSoMu9njBQ8OezPKg
|
||||
rIaPFzgbzKWPisUxSBNMi/kRCcayhTU/t1Wy9OqVroC7dEtc17kWjBoFCqgW7BzBaxQCfRU015SO
|
||||
IUWOejJAx6k+2FZTkGeoNV87gyr/D1LBoyxE786S9LpNwjvKDChcVBlQlwzEGe+lPS3G1Sve103a
|
||||
8WNn6rzdxuJgLOR/BtXNdYlNcCSu/cqijQfgcslwXBZjJfGI1gtYJoBi4cXIui0R9WfEtiXgqoSs
|
||||
5Ej+nAuzn2JRcN85O4suuhKjh3o1T8XiWxQypUWC88DaDmuHXhS/joYRGlVroxrVcLv/GLlpqGo9
|
||||
fqPxQAFGvflj+d30VgTAlBZNnPZvzVSF2RNuuu+4+4OpQAntnxfVfEr85F6hd35ho0DTvO/xNCXk
|
||||
e0QHXV9qeuEIr60CH8Wawhfjw4XcZbE7eB7U0Gee0xd8ooqm/iA0ezMKKVCCE6XITbtmCZTUjwTf
|
||||
BlwakLOmzgnZiewFPHgB1JYcORsLQ8mbQ07u287plfacK0nGASUseTI8ugA89FVpvTfjOFTawW6K
|
||||
1Dhqk/5JNFpoF7mErt7FJGqJ/2cz1vJ/P8saW0MNdfXQe5nDEbhWR42cXk2cR1fWHKyTnPiiqwX5
|
||||
GQ85kVmPbtr2Oeo5Zsr/X1bhxQsLE9DpGmQmmGxHN3pxP+HINqTNS6Qc3ROiwflNxaLLu4puB87u
|
||||
6NKfNveog3TH0x/dkjBlCYru/OHo3se0dFMR55+wkn0sBl3c6Vp+zpAMYWFjZfV6UZ3kpoGD7vth
|
||||
iBEEk98mG454o0TUKpZikRns6CdrUky6SMFPiCi8tChiP5hjxafHCxc5XNfj3LEVPw==
|
||||
]]>
|
||||
<![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>
|
||||
|
Before Width: | Height: | Size: 48 KiB |
@@ -1,23 +0,0 @@
|
||||
<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>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,7 +0,0 @@
|
||||
<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>
|
||||
|
Before Width: | Height: | Size: 622 B |
|
Before Width: | Height: | Size: 7.1 KiB |
@@ -1,27 +0,0 @@
|
||||
<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>
|
||||
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
@@ -1,86 +0,0 @@
|
||||
import * as OpenAPI from "fumadocs-openapi";
|
||||
import { generateFiles } from "fumadocs-typescript";
|
||||
import fs from "node:fs";
|
||||
import * as path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { rimrafSync } from "rimraf";
|
||||
|
||||
const out = "./src/content/docs/cloud/api";
|
||||
const apiRefOut = "./src/content/docs/api";
|
||||
|
||||
// clean generated files
|
||||
rimrafSync(out, {
|
||||
filter(v) {
|
||||
return !v.endsWith("index.mdx") && !v.endsWith("meta.json");
|
||||
},
|
||||
});
|
||||
|
||||
void OpenAPI.generateFiles({
|
||||
input: [
|
||||
fileURLToPath(
|
||||
new URL("../../../packages/cloud/openapi.json", import.meta.url),
|
||||
),
|
||||
],
|
||||
output: out,
|
||||
groupBy: "tag",
|
||||
});
|
||||
|
||||
void generateFiles({
|
||||
input: ["./src/content/docs/api/**/*.mdx"],
|
||||
output: (file) => path.resolve(path.dirname(file), path.basename(file)),
|
||||
transformOutput,
|
||||
});
|
||||
|
||||
function transformOutput(filePath, content) {
|
||||
const fileName = path.basename(filePath);
|
||||
let title = fileName.split(".")[0];
|
||||
let pageContent = content;
|
||||
if (title === "index") title = "LlamaIndex API Reference";
|
||||
return `---\ntitle: ${title}\n---\n\n${transformAbsoluteUrl(pageContent, filePath)}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms the content by converting relative MDX links to absolute docs API links
|
||||
* Example: [text](../type-aliases/TaskHandler.mdx) -> [text](/docs/api/type-aliases/TaskHandler)
|
||||
* [text](BaseChatEngine.mdx) -> [text](/docs/api/classes/BaseChatEngine)
|
||||
* [text](BaseVectorStore.mdx#constructors) -> [text](/docs/api/classes/BaseVectorStore#constructors)
|
||||
* [text](TaskStep.mdx) -> [text](/docs/api/type-aliases/TaskStep)
|
||||
*/
|
||||
function transformAbsoluteUrl(content, filePath) {
|
||||
const group = path.dirname(filePath).split(path.sep).pop();
|
||||
return content.replace(
|
||||
/\]\(([^)]+)\.mdx([^)]*)\)/g,
|
||||
(match, slug, anchor) => {
|
||||
const slugParts = slug.split("/");
|
||||
const fileName = slugParts[slugParts.length - 1];
|
||||
const fileGroup = slugParts[slugParts.length - 2] ?? group;
|
||||
const result = ["/docs/api", fileGroup, fileName, anchor]
|
||||
.filter(Boolean)
|
||||
.join("/");
|
||||
return `](${result})`;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// append meta.json for API page
|
||||
fs.writeFileSync(
|
||||
path.resolve(apiRefOut, "meta.json"),
|
||||
JSON.stringify(
|
||||
{
|
||||
title: "API Reference",
|
||||
description: "LlamaIndex API Reference",
|
||||
root: true,
|
||||
pages: [
|
||||
"index",
|
||||
"classes",
|
||||
"enumerations",
|
||||
"functions",
|
||||
"interfaces",
|
||||
"type-aliases",
|
||||
"variables",
|
||||
],
|
||||
},
|
||||
null,
|
||||
2,
|
||||
),
|
||||
);
|
||||
@@ -1,7 +0,0 @@
|
||||
import env from "@next/env";
|
||||
|
||||
import { updateLlamaCloud } from "./update-llamacloud.mjs";
|
||||
|
||||
env.loadEnvConfig(process.cwd());
|
||||
|
||||
await updateLlamaCloud();
|
||||
@@ -1,107 +0,0 @@
|
||||
import { upsertBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPut } from "@llamaindex/cloud/api";
|
||||
import fg from "fast-glob";
|
||||
import {
|
||||
fileGenerator,
|
||||
remarkDocGen,
|
||||
remarkInstall,
|
||||
typescriptGenerator,
|
||||
} from "fumadocs-docgen";
|
||||
import matter from "gray-matter";
|
||||
import * as fs from "node:fs/promises";
|
||||
import path, { relative } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { remark } from "remark";
|
||||
import remarkGfm from "remark-gfm";
|
||||
import remarkMdx from "remark-mdx";
|
||||
import remarkStringify from "remark-stringify";
|
||||
|
||||
const baseDir = fileURLToPath(new URL("../src/content", import.meta.url));
|
||||
|
||||
async function processContent(content: string): Promise<string> {
|
||||
const file = await remark()
|
||||
.use(remarkMdx)
|
||||
.use(remarkGfm)
|
||||
.use(remarkDocGen, { generators: [typescriptGenerator(), fileGenerator()] })
|
||||
.use(remarkInstall, { persist: { id: "package-manager" } })
|
||||
.use(remarkStringify)
|
||||
.process(content);
|
||||
|
||||
return String(file);
|
||||
}
|
||||
|
||||
export async function updateLlamaCloud(): Promise<void> {
|
||||
const apiKey = process.env.LLAMA_CLOUD_API_KEY;
|
||||
|
||||
const index = process.env.LLAMA_CLOUD_PIPELINE_ID;
|
||||
|
||||
if (!apiKey || !index) {
|
||||
console.log("no api key for LlamaCloud found, skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
const files = await fg([
|
||||
"./src/content/docs/**/*.mdx",
|
||||
"!./src/content/docs/cloud/api/**/*",
|
||||
]);
|
||||
|
||||
const records: {
|
||||
id: string;
|
||||
title: string;
|
||||
description: string;
|
||||
content: string;
|
||||
category: string | undefined;
|
||||
}[] = [];
|
||||
|
||||
console.log("processing documents for AI");
|
||||
const scan = files.map(async (file) => {
|
||||
const fileContent = await fs.readFile(file);
|
||||
const { content, data } = matter(fileContent.toString());
|
||||
|
||||
const dir = path.dirname(file).split(path.sep).at(3);
|
||||
const category = {
|
||||
cloud: "LlamaCloud",
|
||||
llamaindex: "LlamaIndex.TS",
|
||||
}[dir ?? ""];
|
||||
|
||||
if (data._mdx?.mirror) {
|
||||
return;
|
||||
}
|
||||
|
||||
const processed = await processContent(content);
|
||||
const id = relative(baseDir, file);
|
||||
records.push({
|
||||
id,
|
||||
title: data.title as string,
|
||||
description: data.description as string,
|
||||
content: processed,
|
||||
category,
|
||||
});
|
||||
});
|
||||
|
||||
await Promise.all(scan);
|
||||
|
||||
console.log(`added ${records.length} records`);
|
||||
|
||||
await upsertBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPut({
|
||||
baseUrl: "https://api.cloud.llamaindex.ai/",
|
||||
body: records.map((record) => ({
|
||||
id: record.id,
|
||||
metadata: {
|
||||
title: record.title,
|
||||
description: record.description,
|
||||
documentUrl: record.id,
|
||||
category: record.category,
|
||||
},
|
||||
text: record.content,
|
||||
})),
|
||||
path: {
|
||||
pipeline_id: index,
|
||||
},
|
||||
throwOnError: true,
|
||||
headers: {
|
||||
Authorization: `Bearer ${apiKey}`,
|
||||
},
|
||||
});
|
||||
|
||||
console.log("done");
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
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 rehypeKatex from "rehype-katex";
|
||||
import remarkMath from "remark-math";
|
||||
|
||||
export const { docs, meta } = defineDocs({
|
||||
dir: "./src/content/docs",
|
||||
});
|
||||
|
||||
export default defineConfig({
|
||||
lastModifiedTime: "git",
|
||||
mdxOptions: {
|
||||
rehypeCodeOptions: {
|
||||
inline: "tailing-curly-colon",
|
||||
themes: {
|
||||
light: "catppuccin-latte",
|
||||
dark: "catppuccin-mocha",
|
||||
},
|
||||
transformers: [
|
||||
...(rehypeCodeDefaultOptions.transformers ?? []),
|
||||
transformerTwoslash(),
|
||||
{
|
||||
name: "transformers:remove-notation-escape",
|
||||
code(hast) {
|
||||
for (const line of hast.children) {
|
||||
if (line.type !== "element") continue;
|
||||
|
||||
const lastSpan = line.children.findLast(
|
||||
(v) => v.type === "element",
|
||||
);
|
||||
|
||||
const head = lastSpan?.children[0];
|
||||
if (head?.type !== "text") return;
|
||||
|
||||
head.value = head.value.replace(/\[\\!code/g, "[!code");
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
remarkPlugins: [
|
||||
remarkMath,
|
||||
[remarkInstall, { persist: { id: "package-manager" } }],
|
||||
[remarkDocGen, { generators: [fileGenerator()] }],
|
||||
],
|
||||
rehypePlugins: (v) => [rehypeKatex, ...v],
|
||||
},
|
||||
});
|
||||
@@ -1,109 +0,0 @@
|
||||
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({
|
||||
apiKey: process.env.LLAMA_CLOUD_API_KEY!,
|
||||
baseUrl: "https://api.cloud.llamaindex.ai/",
|
||||
|
||||
pipelineId: process.env.LLAMA_CLOUD_PIPELINE_ID!,
|
||||
});
|
||||
|
||||
const initialAIState = {
|
||||
messages: [],
|
||||
} as {
|
||||
messages: ChatMessage[];
|
||||
};
|
||||
|
||||
export type UIMessage = {
|
||||
id: number;
|
||||
display: ReactNode;
|
||||
};
|
||||
|
||||
const initialUIState = {
|
||||
messages: [],
|
||||
} as {
|
||||
messages: UIMessage[];
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
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>,
|
||||
};
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -1,19 +0,0 @@
|
||||
import { baseOptions } from "@/app/layout.config";
|
||||
import { Footer } from "@/components/website/Footer";
|
||||
import { HomeLayout } from "fumadocs-ui/layouts/home";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
export default function Layout({
|
||||
children,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
}): React.ReactElement {
|
||||
return (
|
||||
<HomeLayout {...baseOptions}>
|
||||
{children}
|
||||
<div className="container">
|
||||
<Footer />
|
||||
</div>
|
||||
</HomeLayout>
|
||||
);
|
||||
}
|
||||
@@ -1,180 +0,0 @@
|
||||
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 { LEGACY_DOCUMENT_URL } from "@/lib/const";
|
||||
import { SiStackblitz } from "@icons-pack/react-simple-icons";
|
||||
import {
|
||||
CodeBlock as FumaCodeBlock,
|
||||
Pre,
|
||||
} from "fumadocs-ui/components/codeblock";
|
||||
import { Blocks, Bot, Footprints, Terminal } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
import { Suspense } from "react";
|
||||
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<main className="container mx-auto px-4 py-12">
|
||||
<h1 className="text-4xl md:text-6xl font-bold text-center mb-4">
|
||||
Build context-augmented web apps using
|
||||
<br /> <span className="text-blue-500">LlamaIndex.TS</span>
|
||||
</h1>
|
||||
<p className="text-xl text-center text-fd-muted-foreground mb-12 ">
|
||||
LlamaIndex.TS is the JS/TS version of{" "}
|
||||
<a href="https://llamaindex.ai">LlamaIndex</a>, the framework for
|
||||
building agentic generative AI applications connected to your data.
|
||||
</p>
|
||||
<div className="text-center text-lg text-fd-muted-foreground mb-12">
|
||||
<span>Designed for building web applications in </span>
|
||||
<TextEffect />
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-4">
|
||||
<Link href={LEGACY_DOCUMENT_URL}>
|
||||
<Button variant="outline">Get Started</Button>
|
||||
</Link>
|
||||
<NpmInstall />
|
||||
<Link
|
||||
href="https://stackblitz.com/github/run-llama/LlamaIndexTS/tree/main/examples"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
<Button className="bg-blue-500 text-white hover:bg-blue-600">
|
||||
<SiStackblitz />
|
||||
Playground
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
<div className="mt-4" />
|
||||
<div className="grid grid-cols-1 border-r md:grid-cols-2">
|
||||
<Feature
|
||||
icon={Footprints}
|
||||
subheading="Progressive"
|
||||
heading="From the simplest to the most complex"
|
||||
description="LlamaIndex.TS is designed to be simple to get started, but powerful enough to build complex, agentic 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/openai";
|
||||
|
||||
const llm = new OpenAI();
|
||||
const response = await llm.complete({ prompt: "How are you?" });`,
|
||||
`import { OpenAI } from "@llamaindex/openai";
|
||||
|
||||
const llm = new OpenAI();
|
||||
const response = await llm.chat({
|
||||
messages: [{ content: "Tell me a joke.", role: "user" }],
|
||||
});`,
|
||||
`import { ChatMemoryBuffer } from "llamaindex";
|
||||
import { OpenAI } from "@llamaindex/openai";
|
||||
|
||||
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 { ChatMemoryBuffer } from "llamaindex";
|
||||
import { OpenAIAgent } from "@llamaindex/openai";
|
||||
|
||||
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="Agents"
|
||||
heading="Build agentic RAG applications"
|
||||
description="Truly powerful retrieval-augmented generation applications use agentic techniques, and LlamaIndex.TS makes it easy to build them."
|
||||
>
|
||||
<CodeBlock
|
||||
code={`import { FunctionTool } from "llamaindex";
|
||||
import { OpenAIAgent } from "@llamaindex/openai";
|
||||
|
||||
const interpreterTool = FunctionTool.from(...);
|
||||
const systemPrompt = \`...\`;
|
||||
|
||||
const agent = new OpenAIAgent({
|
||||
llm,
|
||||
tools: [interpreterTool],
|
||||
systemPrompt,
|
||||
});
|
||||
|
||||
await agent.chat('...');`}
|
||||
lang="ts"
|
||||
/>
|
||||
</Feature>
|
||||
<Feature
|
||||
icon={Blocks}
|
||||
subheading="Providers"
|
||||
heading="LLMs, Data Loaders, Vector Stores and more!"
|
||||
description="LlamaIndex.TS has hundreds of integrations to connect to your data, index it, and query it with LLMs."
|
||||
>
|
||||
<div className="mt-8 flex flex-col gap-8">
|
||||
<div>
|
||||
<h3 className="text-lg font-semibold text-fd-muted-foreground mb-2">
|
||||
LLMs
|
||||
</h3>
|
||||
<InfiniteLLMProviders />
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-lg font-semibold text-fd-muted-foreground mb-2">
|
||||
Vector Stores
|
||||
</h3>
|
||||
<InfiniteVectorStoreProviders />
|
||||
</div>
|
||||
</div>
|
||||
</Feature>
|
||||
<Feature
|
||||
icon={Terminal}
|
||||
subheading="create-llama CLI"
|
||||
heading="Build a RAG app with a single command"
|
||||
description="A command line tool to generate LlamaIndex apps, the easiest way to get started with LlamaIndex."
|
||||
>
|
||||
<div className="my-6">
|
||||
<CreateAppAnimation />
|
||||
</div>
|
||||
</Feature>
|
||||
</div>
|
||||
<Contributing />
|
||||
<div className="border-b" />
|
||||
</main>
|
||||
);
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
import { LEGACY_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, LEGACY_DOCUMENT_URL).toString());
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
import { MockLLM } from "@llamaindex/core/utils";
|
||||
import { LlamaIndexAdapter, type Message } from "ai";
|
||||
import { Settings, SimpleChatEngine, type ChatMessage } from "llamaindex";
|
||||
import { NextResponse, type NextRequest } from "next/server";
|
||||
|
||||
Settings.llm = new MockLLM(); // config your LLM here
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
try {
|
||||
const { messages } = (await request.json()) as { messages: Message[] };
|
||||
const userMessage = messages[messages.length - 1];
|
||||
if (!userMessage || userMessage.role !== "user") {
|
||||
return NextResponse.json(
|
||||
{ detail: "Last message is not a user message" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
const chatEngine = new SimpleChatEngine();
|
||||
|
||||
return LlamaIndexAdapter.toDataStreamResponse(
|
||||
await chatEngine.chat({
|
||||
message: userMessage.content,
|
||||
chatHistory: messages as ChatMessage[],
|
||||
stream: true,
|
||||
}),
|
||||
{},
|
||||
);
|
||||
} catch (error) {
|
||||
const detail = (error as Error).message;
|
||||
return NextResponse.json({ detail }, { status: 500 });
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
import { source } from "@/lib/source";
|
||||
import { createFromSource } from "fumadocs-core/search/server";
|
||||
|
||||
export const { GET } = createFromSource(source);
|
||||
@@ -1,74 +0,0 @@
|
||||
import { createMetadata, metadataImage } from "@/lib/metadata";
|
||||
import { openapi, source } from "@/lib/source";
|
||||
import { Popup, PopupContent, PopupTrigger } from "fumadocs-twoslash/ui";
|
||||
import { createTypeTable } from "fumadocs-typescript/ui";
|
||||
import defaultMdxComponents from "fumadocs-ui/mdx";
|
||||
import {
|
||||
DocsBody,
|
||||
DocsDescription,
|
||||
DocsPage,
|
||||
DocsTitle,
|
||||
} from "fumadocs-ui/page";
|
||||
import { notFound } from "next/navigation";
|
||||
|
||||
const { AutoTypeTable } = createTypeTable();
|
||||
|
||||
export default async function Page(props: {
|
||||
params: Promise<{ slug?: string[] }>;
|
||||
}) {
|
||||
const params = await props.params;
|
||||
const page = source.getPage(params.slug);
|
||||
if (!page) notFound();
|
||||
|
||||
const MDX = page.data.body;
|
||||
|
||||
return (
|
||||
<DocsPage
|
||||
toc={page.data.toc}
|
||||
full={page.data.full}
|
||||
editOnGithub={{
|
||||
owner: "run-llama",
|
||||
repo: "LlamaIndexTS",
|
||||
sha: "main",
|
||||
path: `apps/next/src/content/docs/${page.file.path}`,
|
||||
}}
|
||||
>
|
||||
<DocsTitle>{page.data.title}</DocsTitle>
|
||||
<DocsDescription>{page.data.description}</DocsDescription>
|
||||
<DocsBody>
|
||||
<MDX
|
||||
components={{
|
||||
...defaultMdxComponents,
|
||||
APIPage: openapi.APIPage,
|
||||
Popup,
|
||||
PopupContent,
|
||||
PopupTrigger,
|
||||
AutoTypeTable,
|
||||
}}
|
||||
/>
|
||||
</DocsBody>
|
||||
</DocsPage>
|
||||
);
|
||||
}
|
||||
|
||||
export async function generateStaticParams() {
|
||||
return source.generateParams();
|
||||
}
|
||||
|
||||
export async function generateMetadata(props: {
|
||||
params: Promise<{ slug?: string[] }>;
|
||||
}) {
|
||||
const params = await props.params;
|
||||
const page = source.getPage(params.slug);
|
||||
if (!page) notFound();
|
||||
|
||||
return createMetadata(
|
||||
metadataImage.withImage(page.slugs, {
|
||||
title: page.data.title,
|
||||
description: page.data.description,
|
||||
openGraph: {
|
||||
url: `/docs/${page.slugs.join("/")}`,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import { baseOptions } from "@/app/layout.config";
|
||||
import { AITrigger } from "@/components/ai-chat";
|
||||
import { buttonVariants } from "@/components/ui/button";
|
||||
import { source } from "@/lib/source";
|
||||
import { cn } from "@/lib/utils";
|
||||
import "fumadocs-twoslash/twoslash.css";
|
||||
import { DocsLayout } from "fumadocs-ui/layouts/docs";
|
||||
import { MessageCircle } from "lucide-react";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
export default function Layout({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<DocsLayout
|
||||
tree={source.pageTree}
|
||||
{...baseOptions}
|
||||
nav={{
|
||||
...baseOptions.nav,
|
||||
children: (
|
||||
<AITrigger
|
||||
className={cn(
|
||||
buttonVariants({
|
||||
variant: "secondary",
|
||||
size: "xs",
|
||||
className:
|
||||
"md:flex-1 px-2 ms-2 gap-1.5 text-fd-muted-foreground rounded-full",
|
||||
}),
|
||||
)}
|
||||
>
|
||||
<MessageCircle className="size-3" />
|
||||
Ask LlamaCloud
|
||||
</AITrigger>
|
||||
),
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</DocsLayout>
|
||||
);
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
@layer base {
|
||||
:root {
|
||||
--page-max-width: 1840px;
|
||||
--plus-icon: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03IDFDNyAwLjQ0NzcxNSA2LjU1MjI4IDAgNiAwSDVDNC40NDc3MiAwIDQgMC40NDc3MTUgNCAxVjNDNCAzLjU1MjI5IDMuNTUyMjggNCAzIDRIMUMwLjQ0NzcxNSA0IDAgNC40NDc3MiAwIDVWNkMwIDYuNTUyMjggMC40NDc3MTUgNyAxIDdIM0MzLjU1MjI4IDcgNCA3LjQ0NzcyIDQgOFYxMEM0IDEwLjU1MjMgNC40NDc3MiAxMSA1IDExSDZDNi41NTIyOCAxMSA3IDEwLjU1MjMgNyAxMFY4QzcgNy40NDc3MSA3LjQ0NzcyIDcgOCA3SDEwQzEwLjU1MjMgNyAxMSA2LjU1MjI4IDExIDZWNUMxMSA0LjQ0NzcyIDEwLjU1MjMgNCAxMCA0SDhDNy40NDc3MiA0IDcgMy41NTIyOCA3IDNWMVoiIGZpbGw9IiNBREE4QzQiLz4KPC9zdmc+Cg==");
|
||||
|
||||
--color-neutral-000: #ffffff;
|
||||
--color-neutral-100: #f7f6fc;
|
||||
--color-neutral-200: #cac6dd;
|
||||
--color-neutral-400: #757185;
|
||||
--color-neutral-800: #252134;
|
||||
--color-neutral-900: #0e0c15;
|
||||
|
||||
--color-purple-400: #858dff;
|
||||
--color-red-400: #ff776f;
|
||||
--color-green-400: #7adb78;
|
||||
--color-yellow-400: #ffc876;
|
||||
--color-violet-400: #ac6aff;
|
||||
--color-pink-400: #ff98e2;
|
||||
|
||||
--background: 0 0% 100%;
|
||||
--foreground: 0 0% 3.9%;
|
||||
--card: 0 0% 100%;
|
||||
--card-foreground: 0 0% 3.9%;
|
||||
--popover: 0 0% 100%;
|
||||
--popover-foreground: 0 0% 3.9%;
|
||||
--primary: 0 0% 9%;
|
||||
--primary-foreground: 0 0% 98%;
|
||||
--secondary: 0 0% 96.1%;
|
||||
--secondary-foreground: 0 0% 9%;
|
||||
--muted: 0 0% 96.1%;
|
||||
--muted-foreground: 0 0% 45.1%;
|
||||
--accent: 0 0% 96.1%;
|
||||
--accent-foreground: 0 0% 9%;
|
||||
--destructive: 0 84.2% 60.2%;
|
||||
--destructive-foreground: 0 0% 98%;
|
||||
--border: 0 0% 89.8%;
|
||||
--input: 0 0% 89.8%;
|
||||
--ring: 0 0% 3.9%;
|
||||
--chart-1: 12 76% 61%;
|
||||
--chart-2: 173 58% 39%;
|
||||
--chart-3: 197 37% 24%;
|
||||
--chart-4: 43 74% 66%;
|
||||
--chart-5: 27 87% 67%;
|
||||
--radius: 0.5rem;
|
||||
}
|
||||
.dark {
|
||||
--color-neutral-000: #0e0c15;
|
||||
--color-neutral-100: #252134;
|
||||
--color-neutral-200: #757185;
|
||||
--color-neutral-400: #cac6dd;
|
||||
--color-neutral-800: #f7f6fc;
|
||||
--color-neutral-900: #ffffff;
|
||||
|
||||
--color-purple-400: #858dff;
|
||||
--color-red-400: #ff776f;
|
||||
--color-green-400: #7adb78;
|
||||
--color-yellow-400: #ffc876;
|
||||
--color-violet-400: #ac6aff;
|
||||
--color-pink-400: #ff98e2;
|
||||
|
||||
--background: 0 0% 3.9%;
|
||||
--foreground: 0 0% 98%;
|
||||
--card: 0 0% 3.9%;
|
||||
--card-foreground: 0 0% 98%;
|
||||
--popover: 0 0% 3.9%;
|
||||
--popover-foreground: 0 0% 98%;
|
||||
--primary: 0 0% 98%;
|
||||
--primary-foreground: 0 0% 9%;
|
||||
--secondary: 0 0% 14.9%;
|
||||
--secondary-foreground: 0 0% 98%;
|
||||
--muted: 0 0% 14.9%;
|
||||
--muted-foreground: 0 0% 63.9%;
|
||||
--accent: 0 0% 14.9%;
|
||||
--accent-foreground: 0 0% 98%;
|
||||
--destructive: 0 62.8% 30.6%;
|
||||
--destructive-foreground: 0 0% 98%;
|
||||
--border: 0 0% 14.9%;
|
||||
--input: 0 0% 14.9%;
|
||||
--ring: 0 0% 83.1%;
|
||||
--chart-1: 220 70% 50%;
|
||||
--chart-2: 160 60% 45%;
|
||||
--chart-3: 30 80% 55%;
|
||||
--chart-4: 280 65% 60%;
|
||||
--chart-5: 340 75% 55%;
|
||||
}
|
||||
}
|
||||
@layer base {
|
||||
* {
|
||||
@apply border-border;
|
||||
}
|
||||
body {
|
||||
@apply bg-background text-foreground;
|
||||
}
|
||||
|
||||
/*
|
||||
* Override default styles for Markdown
|
||||
*/
|
||||
.prose
|
||||
:where(blockquote):not(
|
||||
:where([class~="not-prose"], [class~="not-prose"] *)
|
||||
) {
|
||||
font-style: normal !important;
|
||||
}
|
||||
|
||||
.prose
|
||||
:where(blockquote p:first-of-type):not(
|
||||
:where([class~="not-prose"], [class~="not-prose"] *)
|
||||
):before {
|
||||
content: none !important;
|
||||
}
|
||||
|
||||
.prose
|
||||
:where(blockquote p:first-of-type):not(
|
||||
:where([class~="not-prose"], [class~="not-prose"] *)
|
||||
):after {
|
||||
content: none !important;
|
||||
}
|
||||
|
||||
.prose
|
||||
:where(code):not(:where([class~="not-prose"], [class~="not-prose"] *)) {
|
||||
@apply text-blue-600 !important;
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
import { LEGACY_DOCUMENT_URL } from "@/lib/const";
|
||||
import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared";
|
||||
import Image from "next/image";
|
||||
|
||||
const logo = (
|
||||
<Image
|
||||
src="/logo-large.png"
|
||||
alt="Logo"
|
||||
className="size-8"
|
||||
width={147}
|
||||
height={147}
|
||||
/>
|
||||
);
|
||||
|
||||
/**
|
||||
* Shared layout configurations
|
||||
*
|
||||
* you can configure layouts individually from:
|
||||
* Home Layout: app/(home)/layout.tsx
|
||||
* Docs Layout: app/docs/layout.tsx
|
||||
*/
|
||||
export const baseOptions: BaseLayoutProps = {
|
||||
nav: {
|
||||
title: logo,
|
||||
transparentMode: "top",
|
||||
},
|
||||
githubUrl: "https://github.com/run-llama/LlamaIndexTS",
|
||||
links: [
|
||||
{
|
||||
text: "Docs",
|
||||
url: LEGACY_DOCUMENT_URL,
|
||||
active: "nested-url",
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
import { AIProvider } from "@/actions";
|
||||
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||
import { RootProvider } from "fumadocs-ui/provider";
|
||||
import { Inter } from "next/font/google";
|
||||
import type { ReactNode } from "react";
|
||||
import "shiki-magic-move/dist/style.css";
|
||||
import "./global.css";
|
||||
|
||||
const inter = Inter({
|
||||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
export default function Layout({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<html lang="en" className={inter.className} suppressHydrationWarning>
|
||||
<head>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="180x180"
|
||||
href="/apple-touch-icon.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="/favicon-32x32.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="16x16"
|
||||
href="/favicon-16x16.png"
|
||||
/>
|
||||
</head>
|
||||
<body className="flex flex-col min-h-screen">
|
||||
<TooltipProvider>
|
||||
<AIProvider>
|
||||
<RootProvider>{children}</RootProvider>
|
||||
</AIProvider>
|
||||
</TooltipProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -1,180 +0,0 @@
|
||||
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>
|
||||
);
|
||||
}
|
||||
@@ -1,143 +0,0 @@
|
||||
"use client";
|
||||
import type { AIProvider, UIMessage } 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: UIMessage[] }) {
|
||||
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>
|
||||
);
|
||||
};
|
||||
@@ -1,53 +0,0 @@
|
||||
import * as Base from "fumadocs-ui/components/codeblock";
|
||||
import { toJsxRuntime, type Jsx } from "hast-util-to-jsx-runtime";
|
||||
import { Fragment } from "react";
|
||||
import { jsx, jsxs } from "react/jsx-runtime";
|
||||
import { codeToHast } from "shiki";
|
||||
|
||||
export interface CodeBlockProps {
|
||||
code: string;
|
||||
wrapper?: Base.CodeBlockProps;
|
||||
lang: "bash" | "ts" | "tsx";
|
||||
}
|
||||
|
||||
export async function CodeBlock({
|
||||
code,
|
||||
lang,
|
||||
wrapper,
|
||||
}: CodeBlockProps): Promise<React.ReactElement> {
|
||||
const hast = await codeToHast(code, {
|
||||
lang,
|
||||
defaultColor: false,
|
||||
themes: {
|
||||
light: "github-light",
|
||||
dark: "vesper",
|
||||
},
|
||||
transformers: [
|
||||
{
|
||||
name: "rehype-code:pre-process",
|
||||
line(node) {
|
||||
if (node.children.length === 0) {
|
||||
// Keep the empty lines when using grid layout
|
||||
node.children.push({
|
||||
type: "text",
|
||||
value: " ",
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const rendered = toJsxRuntime(hast, {
|
||||
jsx: jsx as Jsx,
|
||||
jsxs: jsxs as Jsx,
|
||||
Fragment,
|
||||
development: false,
|
||||
components: {
|
||||
// @ts-expect-error -- JSX component
|
||||
pre: Base.Pre,
|
||||
},
|
||||
});
|
||||
|
||||
return <Base.CodeBlock {...wrapper}>{rendered}</Base.CodeBlock>;
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
import ContributorCounter from "@/components/contributor-count";
|
||||
import { buttonVariants } from "@/components/ui/button";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { Heart } from "lucide-react";
|
||||
import { ReactElement } from "react";
|
||||
|
||||
export function Contributing(): ReactElement {
|
||||
return (
|
||||
<div className="flex flex-col items-center border-x border-t px-4 py-16 text-center">
|
||||
<h2 className="mb-4 text-xl font-semibold sm:text-2xl">
|
||||
Made possible by you <Heart className="inline align-middle" />
|
||||
</h2>
|
||||
<p className="mb-4 text-fd-muted-foreground">
|
||||
LlamaIndex.TS is powered by the open source community.
|
||||
</p>
|
||||
<div className="mb-8 flex flex-row items-center gap-2">
|
||||
<a
|
||||
href="https://github.com/run-llama/LlamaIndexTS/graphs/contributors"
|
||||
rel="noreferrer noopener"
|
||||
className={cn(buttonVariants({ variant: "ghost" }))}
|
||||
>
|
||||
See Contributors
|
||||
</a>
|
||||
</div>
|
||||
<ContributorCounter repoOwner="run-llama" repoName="LlamaIndexTS" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
import { fetchContributors } from "@/lib/get-contributors";
|
||||
import { cn } from "@/lib/utils";
|
||||
import Image from "next/image";
|
||||
import type { HTMLAttributes, ReactElement } from "react";
|
||||
|
||||
export interface ContributorCounterProps
|
||||
extends HTMLAttributes<HTMLDivElement> {
|
||||
repoOwner: string;
|
||||
repoName: string;
|
||||
displayCount?: number;
|
||||
}
|
||||
|
||||
export default async function ContributorCounter({
|
||||
repoOwner,
|
||||
repoName,
|
||||
displayCount = 20,
|
||||
...props
|
||||
}: ContributorCounterProps): Promise<ReactElement> {
|
||||
const contributors = await fetchContributors(repoOwner, repoName);
|
||||
const topContributors = contributors
|
||||
.filter((contributor) => contributor.login !== repoOwner)
|
||||
.slice(0, displayCount);
|
||||
|
||||
return (
|
||||
<div
|
||||
{...props}
|
||||
className={cn("flex flex-col items-center gap-4", props.className)}
|
||||
>
|
||||
<div className="flex flex-row flex-wrap items-center justify-center md:pe-4">
|
||||
{topContributors.map((contributor, i) => (
|
||||
<a
|
||||
key={contributor.login}
|
||||
href={`https://github.com/${contributor.login}`}
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
className="size-10 overflow-hidden rounded-full border-4 border-fd-background bg-fd-background md:-mr-4 md:size-12"
|
||||
style={{
|
||||
zIndex: topContributors.length - i,
|
||||
}}
|
||||
>
|
||||
<Image
|
||||
src={contributor.avatar_url}
|
||||
alt={`${contributor.login}'s avatar`}
|
||||
unoptimized
|
||||
width={48}
|
||||
height={48}
|
||||
/>
|
||||
</a>
|
||||
))}
|
||||
{displayCount < contributors.length ? (
|
||||
<div className="size-12 content-center rounded-full bg-fd-secondary text-center">
|
||||
+{contributors.length - displayCount}
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,248 +0,0 @@
|
||||
"use client";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { TerminalIcon } from "lucide-react";
|
||||
import {
|
||||
Fragment,
|
||||
HTMLAttributes,
|
||||
ReactElement,
|
||||
ReactNode,
|
||||
useEffect,
|
||||
useState,
|
||||
} from "react";
|
||||
import { Input } from "./ui/input";
|
||||
|
||||
export function CreateAppAnimation(): React.ReactElement {
|
||||
const installCmd = "npx create-llama@latest";
|
||||
const tickTime = 100;
|
||||
const timeCommandEnter = installCmd.length;
|
||||
const timeCommandRun = timeCommandEnter + 3;
|
||||
const timeCommandEnd = timeCommandRun + 3;
|
||||
const timeWindowOpen = timeCommandEnd + 1;
|
||||
const timeEnd = timeWindowOpen + 1;
|
||||
|
||||
const [tick, setTick] = useState(timeEnd);
|
||||
|
||||
useEffect(() => {
|
||||
const timer = setInterval(() => {
|
||||
setTick((prev) => (prev >= timeEnd ? prev : prev + 1));
|
||||
}, tickTime);
|
||||
|
||||
return () => {
|
||||
clearInterval(timer);
|
||||
};
|
||||
}, [timeEnd]);
|
||||
|
||||
const lines: ReactElement[] = [];
|
||||
|
||||
lines.push(
|
||||
<span key="command_type">
|
||||
{installCmd.substring(0, tick)}
|
||||
{tick < timeCommandEnter && (
|
||||
<div className="inline-block h-3 w-1 animate-pulse bg-white" />
|
||||
)}
|
||||
</span>,
|
||||
);
|
||||
|
||||
if (tick >= timeCommandEnter) {
|
||||
lines.push(<span key="space"> </span>);
|
||||
}
|
||||
|
||||
if (tick > timeCommandRun)
|
||||
lines.push(
|
||||
<Fragment key="command_response">
|
||||
<span className="font-bold">┌ Create Llama</span>
|
||||
<span>│</span>
|
||||
{tick > timeCommandRun + 1 && (
|
||||
<>
|
||||
<span className="font-bold">◇ What is your project named?</span>
|
||||
<span>│ my-app</span>
|
||||
</>
|
||||
)}
|
||||
{tick > timeCommandRun + 2 && (
|
||||
<>
|
||||
<span>│</span>
|
||||
<span className="font-bold">◆ What app do you want to build?</span>
|
||||
</>
|
||||
)}
|
||||
{tick > timeCommandRun + 3 && (
|
||||
<>
|
||||
<span>│ ● Agentic RAG</span>
|
||||
<span>│ ○ Data Scientist</span>
|
||||
</>
|
||||
)}
|
||||
</Fragment>,
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
className="relative"
|
||||
onMouseEnter={() => {
|
||||
if (tick >= timeEnd) {
|
||||
setTick(0);
|
||||
}
|
||||
}}
|
||||
>
|
||||
{tick > timeWindowOpen && (
|
||||
<LaunchAppWindow className="absolute bottom-5 right-4 z-10 animate-in fade-in slide-in-from-top-10" />
|
||||
)}
|
||||
<pre className="overflow-hidden rounded-xl border text-xs">
|
||||
<div className="flex flex-row items-center gap-2 border-b px-4 py-2">
|
||||
<TerminalIcon className="size-4" />{" "}
|
||||
<span className="font-bold">Terminal</span>
|
||||
<div className="grow" />
|
||||
<div className="size-2 rounded-full bg-red-400" />
|
||||
</div>
|
||||
<div className="min-h-[200px] bg-gradient-to-b from-fd-secondary [mask-image:linear-gradient(to_bottom,white,transparent)]">
|
||||
<code className="grid p-4">{lines}</code>
|
||||
</div>
|
||||
</pre>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function UserMessage({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<div className="group relative flex items-start">
|
||||
<div className="flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow-sm bg-background">
|
||||
<IconUser />
|
||||
</div>
|
||||
<div className="ml-4 flex-1 space-y-2 overflow-hidden px-1">
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function BotMessage({
|
||||
children,
|
||||
className,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
className?: string;
|
||||
}) {
|
||||
return (
|
||||
<div className={cn("group relative flex items-start", className)}>
|
||||
<div className="flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow-sm bg-primary text-primary-foreground">
|
||||
<IconAI />
|
||||
</div>
|
||||
<div className="ml-4 flex-1 space-y-2 overflow-hidden px-1">
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function ChatExample() {
|
||||
const userMessageFull =
|
||||
"Hello, please summarize the article on the file I uploaded.";
|
||||
const botMessageFull = "Processing...";
|
||||
|
||||
const tickTime = 100;
|
||||
const userMessageDuration = userMessageFull.length;
|
||||
const botMessageDelay = userMessageDuration + 10;
|
||||
const botMessageDuration = botMessageDelay + botMessageFull.length;
|
||||
const totalDuration = botMessageDuration + 10;
|
||||
|
||||
const [tick, setTick] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
// Increment tick every tickTime milliseconds
|
||||
const timer = setInterval(() => {
|
||||
setTick((prev) => (prev >= totalDuration ? prev : prev + 1));
|
||||
}, tickTime);
|
||||
|
||||
return () => {
|
||||
clearInterval(timer);
|
||||
};
|
||||
}, [totalDuration]);
|
||||
|
||||
const userMessageLength = Math.min(tick, userMessageFull.length);
|
||||
const botMessageLength = Math.max(
|
||||
0,
|
||||
Math.min(tick - botMessageDelay, botMessageFull.length),
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="max-w-64">
|
||||
<div className="flex flex-col px-4 gap-2">
|
||||
{userMessageLength === userMessageFull.length && (
|
||||
<UserMessage>
|
||||
<span>{userMessageFull}</span>
|
||||
</UserMessage>
|
||||
)}
|
||||
{tick > botMessageDelay && (
|
||||
<BotMessage>
|
||||
<div>
|
||||
<p>
|
||||
{botMessageFull.substring(0, botMessageLength)}
|
||||
{tick - botMessageDelay < botMessageFull.length && (
|
||||
<span className="inline-block h-3 w-1 animate-pulse bg-white" />
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
</BotMessage>
|
||||
)}
|
||||
</div>
|
||||
<Input
|
||||
className="mt-4"
|
||||
value={
|
||||
userMessageFull.substring(0, userMessageLength) === userMessageFull
|
||||
? ""
|
||||
: userMessageFull.substring(0, userMessageLength)
|
||||
}
|
||||
readOnly
|
||||
placeholder="Input message..."
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function LaunchAppWindow(
|
||||
props: HTMLAttributes<HTMLDivElement>,
|
||||
): React.ReactElement {
|
||||
return (
|
||||
<div
|
||||
{...props}
|
||||
className={cn(
|
||||
"overflow-hidden rounded-md border bg-fd-background shadow-xl",
|
||||
props.className,
|
||||
)}
|
||||
>
|
||||
<div className="relative flex h-6 flex-row items-center border-b bg-fd-muted px-4 text-xs text-fd-muted-foreground">
|
||||
<p className="absolute inset-x-0 text-center">localhost:8080</p>
|
||||
</div>
|
||||
<div className="p-4 text-sm">
|
||||
<ChatExample />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function IconUser({ className, ...props }: React.ComponentProps<"svg">) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 256 256"
|
||||
fill="currentColor"
|
||||
className={cn("h-4 w-4", className)}
|
||||
{...props}
|
||||
>
|
||||
<path d="M230.92 212c-15.23-26.33-38.7-45.21-66.09-54.16a72 72 0 1 0-73.66 0c-27.39 8.94-50.86 27.82-66.09 54.16a8 8 0 1 0 13.85 8c18.84-32.56 52.14-52 89.07-52s70.23 19.44 89.07 52a8 8 0 1 0 13.85-8ZM72 96a56 56 0 1 1 56 56 56.06 56.06 0 0 1-56-56Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
|
||||
function IconAI({ className, ...props }: React.ComponentProps<"svg">) {
|
||||
return (
|
||||
<svg
|
||||
fill="currentColor"
|
||||
viewBox="0 0 256 256"
|
||||
role="img"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className={cn("h-4 w-4", className)}
|
||||
{...props}
|
||||
>
|
||||
<path d="M197.58,129.06l-51.61-19-19-51.65a15.92,15.92,0,0,0-29.88,0L78.07,110l-51.65,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0l19-51.61,51.65-19a15.92,15.92,0,0,0,0-29.88ZM140.39,163a15.87,15.87,0,0,0-9.43,9.43l-19,51.46L93,172.39A15.87,15.87,0,0,0,83.61,163h0L32.15,144l51.46-19A15.87,15.87,0,0,0,93,115.61l19-51.46,19,51.46a15.87,15.87,0,0,0,9.43,9.43l51.46,19ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z"></path>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
"use client";
|
||||
import { ChatInput, ChatMessages, ChatSection } from "@llamaindex/chat-ui";
|
||||
import { useChat } from "ai/react";
|
||||
|
||||
export const ChatDemo = () => {
|
||||
const handler = useChat();
|
||||
return (
|
||||
<ChatSection handler={handler}>
|
||||
<ChatMessages>
|
||||
<ChatMessages.List className="h-auto max-h-[400px]" />
|
||||
<ChatMessages.Actions />
|
||||
</ChatMessages>
|
||||
<ChatInput />
|
||||
</ChatSection>
|
||||
);
|
||||
};
|
||||
@@ -1,57 +0,0 @@
|
||||
import { Markdown } from "@llamaindex/chat-ui/widgets";
|
||||
import { MockLLM } from "@llamaindex/core/utils";
|
||||
import { generateId, Message } from "ai";
|
||||
import { createAI, createStreamableUI, getMutableAIState } from "ai/rsc";
|
||||
import { type ChatMessage, Settings, SimpleChatEngine } from "llamaindex";
|
||||
import { ReactNode } from "react";
|
||||
|
||||
type ServerState = Message[];
|
||||
type FrontendState = Array<Message & { display: ReactNode }>;
|
||||
type Actions = {
|
||||
chat: (message: Message) => Promise<Message & { display: ReactNode }>;
|
||||
};
|
||||
|
||||
Settings.llm = new MockLLM(); // config your LLM here
|
||||
|
||||
export const AI = createAI<ServerState, FrontendState, Actions>({
|
||||
initialAIState: [],
|
||||
initialUIState: [],
|
||||
actions: {
|
||||
chat: async (message: Message) => {
|
||||
"use server";
|
||||
|
||||
const aiState = getMutableAIState<typeof AI>();
|
||||
aiState.update((prev) => [...prev, message]);
|
||||
|
||||
const uiStream = createStreamableUI();
|
||||
const chatEngine = new SimpleChatEngine();
|
||||
const assistantMessage: Message = {
|
||||
id: generateId(),
|
||||
role: "assistant",
|
||||
content: "",
|
||||
};
|
||||
|
||||
// run the async function without blocking
|
||||
(async () => {
|
||||
const chatResponse = await chatEngine.chat({
|
||||
stream: true,
|
||||
message: message.content,
|
||||
chatHistory: aiState.get() as ChatMessage[],
|
||||
});
|
||||
|
||||
for await (const chunk of chatResponse) {
|
||||
assistantMessage.content += chunk.delta;
|
||||
uiStream.update(<Markdown content={assistantMessage.content} />);
|
||||
}
|
||||
|
||||
aiState.done([...aiState.get(), assistantMessage]);
|
||||
uiStream.done();
|
||||
})();
|
||||
|
||||
return {
|
||||
...assistantMessage,
|
||||
display: uiStream.value,
|
||||
};
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -1,33 +0,0 @@
|
||||
"use client";
|
||||
|
||||
import {
|
||||
ChatInput,
|
||||
ChatMessage,
|
||||
ChatMessages,
|
||||
ChatSection as ChatSectionUI,
|
||||
} from "@llamaindex/chat-ui";
|
||||
import { useChatRSC } from "./use-chat-rsc";
|
||||
|
||||
export const ChatSectionRSC = () => {
|
||||
const handler = useChatRSC();
|
||||
return (
|
||||
<ChatSectionUI handler={handler}>
|
||||
<ChatMessages>
|
||||
<ChatMessages.List className="h-auto max-h-[400px]">
|
||||
{handler.messages.map((message, index) => (
|
||||
<ChatMessage
|
||||
key={index}
|
||||
message={message}
|
||||
isLast={index === handler.messages.length - 1}
|
||||
>
|
||||
<ChatMessage.Avatar />
|
||||
<ChatMessage.Content>{message.display}</ChatMessage.Content>
|
||||
</ChatMessage>
|
||||
))}
|
||||
<ChatMessages.Loading />
|
||||
</ChatMessages.List>
|
||||
</ChatMessages>
|
||||
<ChatInput />
|
||||
</ChatSectionUI>
|
||||
);
|
||||
};
|
||||
@@ -1,8 +0,0 @@
|
||||
import { AI } from "./ai-action";
|
||||
import { ChatSectionRSC } from "./chat-section";
|
||||
|
||||
export const ChatDemoRSC = () => (
|
||||
<AI>
|
||||
<ChatSectionRSC />
|
||||
</AI>
|
||||
);
|
||||
@@ -1,41 +0,0 @@
|
||||
"use client";
|
||||
|
||||
import { useActions } from "ai/rsc";
|
||||
|
||||
import { generateId, Message } from "ai";
|
||||
import { useUIState } from "ai/rsc";
|
||||
import { useState } from "react";
|
||||
import { AI } from "./ai-action";
|
||||
|
||||
export function useChatRSC() {
|
||||
const [input, setInput] = useState<string>("");
|
||||
const [isLoading, setIsLoading] = useState<boolean>(false);
|
||||
const [messages, setMessages] = useUIState<typeof AI>();
|
||||
const { chat } = useActions<typeof AI>();
|
||||
|
||||
const append = async (message: Omit<Message, "id">) => {
|
||||
const newMsg: Message = { ...message, id: generateId() };
|
||||
|
||||
setIsLoading(true);
|
||||
try {
|
||||
setMessages((prev) => [...prev, { ...newMsg, display: message.content }]);
|
||||
const assistantMsg = await chat(newMsg);
|
||||
setMessages((prev) => [...prev, assistantMsg]);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
setIsLoading(false);
|
||||
setInput("");
|
||||
|
||||
return message.content;
|
||||
};
|
||||
|
||||
return {
|
||||
input,
|
||||
setInput,
|
||||
isLoading,
|
||||
messages,
|
||||
setMessages,
|
||||
append,
|
||||
};
|
||||
}
|
||||
@@ -1,182 +0,0 @@
|
||||
"use client";
|
||||
import { createContextState } from "foxact/context-state";
|
||||
import { useIsClient } from "foxact/use-is-client";
|
||||
import { useShiki } from "fumadocs-core/utils/use-shiki";
|
||||
import { CodeBlock, Pre } from "fumadocs-ui/components/codeblock";
|
||||
import { lazy, Suspense, use, useMemo } from "react";
|
||||
import { StickToBottom, useStickToBottomContext } from "use-stick-to-bottom";
|
||||
import Parser from "web-tree-sitter";
|
||||
|
||||
import { Label } from "@/components/ui/label";
|
||||
import { Skeleton } from "@/components/ui/skeleton";
|
||||
import { Slider } from "@/components/ui/slider";
|
||||
import { CodeSplitter } from "@llamaindex/node-parser/code";
|
||||
|
||||
let promise: Promise<CodeSplitter>;
|
||||
if (typeof window !== "undefined") {
|
||||
promise = Parser.init({
|
||||
locateFile(scriptName: string) {
|
||||
return "/" + scriptName;
|
||||
},
|
||||
}).then(async () => {
|
||||
const parser = new Parser();
|
||||
const Lang = await Parser.Language.load("/tree-sitter-typescript.wasm");
|
||||
parser.setLanguage(Lang);
|
||||
return new CodeSplitter({
|
||||
getParser: () => parser,
|
||||
maxChars: 100,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
const [SliderProvider, useSlider, useSetSlider] = createContextState(100);
|
||||
|
||||
const [CodeProvider, useCode, useSetCode] =
|
||||
createContextState(`interface Person {
|
||||
name: string;
|
||||
age: number;
|
||||
}
|
||||
|
||||
function greet(person: Person): string {
|
||||
return \`Hello, \${person.name}! You are \${person.age} years old.\`;
|
||||
}
|
||||
|
||||
const john: Person = {
|
||||
name: "John Doe",
|
||||
age: 30
|
||||
};
|
||||
|
||||
console.log(greet(john));`);
|
||||
|
||||
const Editor = lazy(() => import("react-monaco-editor"));
|
||||
|
||||
export const IDE = () => {
|
||||
const codeSplitter = use(promise);
|
||||
const code = useCode();
|
||||
const setCode = useSetCode();
|
||||
const maxChars = useSlider();
|
||||
const useSetMaxChars = useSetSlider();
|
||||
return (
|
||||
<div className="flex flex-col p-4 border-r max-h-96 overflow-scroll">
|
||||
<div>
|
||||
<Label>Max Chars {maxChars}</Label>
|
||||
<Slider
|
||||
className="my-4"
|
||||
min={10}
|
||||
max={300}
|
||||
step={10}
|
||||
value={[maxChars]}
|
||||
onValueChange={(value) => {
|
||||
useSetMaxChars(value[0]);
|
||||
codeSplitter.maxChars = value[0];
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<Editor
|
||||
editorWillMount={() => {}}
|
||||
editorDidMount={() => {
|
||||
window.MonacoEnvironment!.getWorkerUrl = (
|
||||
_moduleId: string,
|
||||
label: string,
|
||||
) => {
|
||||
if (label === "json") return "/_next/static/json.worker.js";
|
||||
if (label === "css") return "/_next/static/css.worker.js";
|
||||
if (label === "html") return "/_next/static/html.worker.js";
|
||||
if (label === "typescript" || label === "javascript")
|
||||
return "/_next/static/ts.worker.js";
|
||||
return "/_next/static/editor.worker.js";
|
||||
};
|
||||
}}
|
||||
editorWillUnmount={() => {}}
|
||||
options={{
|
||||
minimap: {
|
||||
enabled: false,
|
||||
},
|
||||
}}
|
||||
theme="vs-dark"
|
||||
height="100%"
|
||||
width="100%"
|
||||
language="typescript"
|
||||
onChange={setCode}
|
||||
value={code}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const Preview = ({ text }: { text: string }) => {
|
||||
const rendered = useShiki(text, {
|
||||
lang: "ts",
|
||||
components: {
|
||||
pre: (props) => {
|
||||
return <Pre {...props}>{props.children}</Pre>;
|
||||
},
|
||||
},
|
||||
});
|
||||
return <CodeBlock className="py-0 m-2">{rendered}</CodeBlock>;
|
||||
};
|
||||
|
||||
function ScrollToBottom() {
|
||||
const { isAtBottom, scrollToBottom } = useStickToBottomContext();
|
||||
|
||||
return (
|
||||
!isAtBottom && (
|
||||
<button
|
||||
className="absolute i-ph-arrow-circle-down-fill text-4xl rounded-lg left-[50%] translate-x-[-50%] bottom-0"
|
||||
onClick={() => scrollToBottom()}
|
||||
/>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export const NodePreview = () => {
|
||||
const parser = use(promise);
|
||||
const code = useCode();
|
||||
const maxChars = useSlider();
|
||||
const textChunks = useMemo(() => parser.splitText(code), [code, maxChars]);
|
||||
return (
|
||||
<StickToBottom
|
||||
className="block relative max-h-96 overflow-scroll"
|
||||
resize="smooth"
|
||||
initial="smooth"
|
||||
>
|
||||
<StickToBottom.Content>
|
||||
{textChunks.map((chunk, i) => (
|
||||
<Preview key={i} text={chunk} />
|
||||
))}
|
||||
</StickToBottom.Content>
|
||||
<ScrollToBottom />
|
||||
</StickToBottom>
|
||||
);
|
||||
};
|
||||
|
||||
export const CodeNodeParserDemo = () => {
|
||||
const isClient = useIsClient();
|
||||
if (!isClient) {
|
||||
return (
|
||||
<div className="my-2 grid grid-cols-1 md:grid-cols-2 gap-2 border rounded-xl w-full max-h-96">
|
||||
<Skeleton className="h-96" />
|
||||
<Skeleton className="h-96" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<SliderProvider>
|
||||
<CodeProvider>
|
||||
<Suspense
|
||||
fallback={
|
||||
<div className="my-2 grid grid-cols-1 md:grid-cols-2 gap-2 border rounded-xl w-full max-h-96">
|
||||
<Skeleton className="h-96" />
|
||||
<Skeleton className="h-96" />
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<div className="my-2 grid grid-cols-1 md:grid-cols-2 gap-2 border rounded-xl w-full max-h-96">
|
||||
<IDE />
|
||||
<NodePreview />
|
||||
</div>
|
||||
</Suspense>
|
||||
</CodeProvider>
|
||||
</SliderProvider>
|
||||
);
|
||||
};
|
||||
@@ -1,152 +0,0 @@
|
||||
"use client";
|
||||
import FlowInput from "@/components/flow-input";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import {
|
||||
StartEvent,
|
||||
StopEvent,
|
||||
Workflow,
|
||||
WorkflowEvent,
|
||||
} from "@llamaindex/workflow";
|
||||
import { ReactNode, startTransition, useState } from "react";
|
||||
import { StickToBottom, useStickToBottomContext } from "use-stick-to-bottom";
|
||||
|
||||
class ComputeEvent extends WorkflowEvent<number> {
|
||||
constructor(data: number) {
|
||||
super(data);
|
||||
}
|
||||
}
|
||||
|
||||
class ComputeResultEvent extends WorkflowEvent<number> {
|
||||
constructor(data: number) {
|
||||
super(data);
|
||||
}
|
||||
}
|
||||
|
||||
type ContextData = {
|
||||
sum: number;
|
||||
};
|
||||
|
||||
const workflow = new Workflow<ContextData, number, number>();
|
||||
|
||||
const max = 1000;
|
||||
const min = 100;
|
||||
|
||||
workflow.addStep(
|
||||
{
|
||||
inputs: [StartEvent<number>],
|
||||
outputs: [StopEvent<number>],
|
||||
},
|
||||
async (context, event) => {
|
||||
const total = event.data;
|
||||
for (let i = 0; i < total; i++) {
|
||||
context.sendEvent(new ComputeEvent(i));
|
||||
}
|
||||
console.log("waiting");
|
||||
const computeResults = await Promise.all(
|
||||
Array.from({ length: total }).map(() =>
|
||||
context.requireEvent(ComputeResultEvent),
|
||||
),
|
||||
);
|
||||
context.data.sum = computeResults.reduce(
|
||||
(acc, result) => acc + result.data,
|
||||
0,
|
||||
);
|
||||
console.log("stop");
|
||||
return new StopEvent(context.data.sum);
|
||||
},
|
||||
);
|
||||
|
||||
workflow.addStep(
|
||||
{
|
||||
inputs: [ComputeEvent],
|
||||
outputs: [ComputeResultEvent],
|
||||
},
|
||||
async (context, event) => {
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, Math.floor(Math.random() * (max - min + 1) + min)),
|
||||
);
|
||||
return new ComputeResultEvent(event.data);
|
||||
},
|
||||
);
|
||||
|
||||
function ScrollToBottom() {
|
||||
const { isAtBottom, scrollToBottom } = useStickToBottomContext();
|
||||
|
||||
return (
|
||||
!isAtBottom && (
|
||||
<button
|
||||
className="absolute i-ph-arrow-circle-down-fill text-4xl rounded-lg left-[50%] translate-x-[-50%] bottom-0"
|
||||
onClick={() => scrollToBottom()}
|
||||
/>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function WorkflowStreamingDemo() {
|
||||
const [ui, setUI] = useState<ReactNode[]>([
|
||||
<div key={0} className="bg-gray-100 dark:bg-gray-800">
|
||||
Waiting for workflow to start
|
||||
</div>,
|
||||
]);
|
||||
const [total, setTotal] = useState<number>(10);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col items-start w-full gap-2">
|
||||
<div className="flex flex-row justify-center items-center">
|
||||
<div className="text-lg mr-2">Compute total</div>{" "}
|
||||
<FlowInput value={total} onChange={(value) => setTotal(value)} />
|
||||
</div>
|
||||
<Button
|
||||
onClick={async () => {
|
||||
startTransition(() => {
|
||||
setUI([]);
|
||||
});
|
||||
const context = workflow.run(total, {
|
||||
sum: 0,
|
||||
});
|
||||
let i = 0;
|
||||
for await (const event of context) {
|
||||
console.log(event);
|
||||
if (event instanceof ComputeEvent) {
|
||||
setUI((ui) => [
|
||||
...ui,
|
||||
<div key={i++} className="bg-yellow-100 dark:bg-yellow-800">
|
||||
Computing task id: {event.data}
|
||||
</div>,
|
||||
]);
|
||||
} else if (event instanceof ComputeResultEvent) {
|
||||
setUI((ui) => [
|
||||
...ui,
|
||||
<div key={i++} className="bg-green-100 dark:bg-green-800">
|
||||
Computed task id: {event.data}
|
||||
</div>,
|
||||
]);
|
||||
} else if (event instanceof StartEvent) {
|
||||
setUI((ui) => [
|
||||
...ui,
|
||||
<div key={i++} className="bg-blue-100 dark:bg-blue-800">
|
||||
Started workflow with total {event.data}
|
||||
</div>,
|
||||
]);
|
||||
} else if (event instanceof StopEvent) {
|
||||
setUI((ui) => [
|
||||
...ui,
|
||||
<div key={i++} className="bg-red-100 dark:bg-red-800">
|
||||
Workflow stopped
|
||||
</div>,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}}
|
||||
>
|
||||
Start Workflow
|
||||
</Button>
|
||||
<StickToBottom className="w-full flex flex-col gap-2 p-2 border border-gray-200 rounded-lg max-h-96 overflow-y-auto">
|
||||
<StickToBottom.Content className="flex flex-col gap-2">
|
||||
{ui}
|
||||
</StickToBottom.Content>
|
||||
<ScrollToBottom />
|
||||
</StickToBottom>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import { LucideIcon } from "lucide-react";
|
||||
import { HTMLAttributes, ReactElement, ReactNode } from "react";
|
||||
|
||||
export function Feature({
|
||||
className,
|
||||
icon: Icon,
|
||||
heading,
|
||||
subheading,
|
||||
description,
|
||||
...props
|
||||
}: HTMLAttributes<HTMLDivElement> & {
|
||||
icon: LucideIcon;
|
||||
subheading: ReactNode;
|
||||
heading: ReactNode;
|
||||
description: ReactNode;
|
||||
}): ReactElement {
|
||||
return (
|
||||
<div
|
||||
className={cn("border-l border-t px-6 py-12 md:py-16", className)}
|
||||
{...props}
|
||||
>
|
||||
<div className="mb-4 inline-flex items-center gap-2 text-sm font-medium text-fd-muted-foreground">
|
||||
<Icon className="size-4" />
|
||||
<p>{subheading}</p>
|
||||
</div>
|
||||
<h2 className="mb-2 text-lg font-semibold">{heading}</h2>
|
||||
<p className="text-fd-muted-foreground">{description}</p>
|
||||
|
||||
{props.children}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
import NumberFlow from "@number-flow/react";
|
||||
import clsx from "clsx/lite";
|
||||
import { Minus, Plus } from "lucide-react";
|
||||
import * as React from "react";
|
||||
|
||||
type Props = {
|
||||
value?: number;
|
||||
min?: number;
|
||||
max?: number;
|
||||
onChange?: (value: number) => void;
|
||||
};
|
||||
export default function FlowInput({
|
||||
value = 0,
|
||||
min = -Infinity,
|
||||
max = Infinity,
|
||||
onChange,
|
||||
}: Props) {
|
||||
const defaultValue = React.useRef(value);
|
||||
const inputRef = React.useRef<HTMLInputElement>(null);
|
||||
const [animated, setAnimated] = React.useState(true);
|
||||
const [showCaret, setShowCaret] = React.useState(true);
|
||||
const handleInput: React.ChangeEventHandler<HTMLInputElement> = ({
|
||||
currentTarget: el,
|
||||
}) => {
|
||||
setAnimated(false);
|
||||
let next = value;
|
||||
if (el.value === "") {
|
||||
next = defaultValue.current;
|
||||
} else {
|
||||
const num = parseInt(el.value);
|
||||
if (!isNaN(num) && min <= num && num <= max) next = num;
|
||||
}
|
||||
el.value = String(next);
|
||||
onChange?.(next);
|
||||
};
|
||||
const handlePointerDown =
|
||||
(diff: number) => (event: React.PointerEvent<HTMLButtonElement>) => {
|
||||
setAnimated(true);
|
||||
if (event.pointerType === "mouse") {
|
||||
event?.preventDefault();
|
||||
inputRef.current?.focus();
|
||||
}
|
||||
const newVal = Math.min(Math.max(value + diff, min), max);
|
||||
onChange?.(newVal);
|
||||
};
|
||||
return (
|
||||
<div className="group flex items-stretch rounded-md text-lg font-semibold ring ring-zinc-200 transition-[box-shadow] focus-within:ring-2 focus-within:ring-blue-500 dark:ring-zinc-800">
|
||||
<button
|
||||
aria-hidden
|
||||
tabIndex={-1}
|
||||
className="flex items-center pl-[.5em] pr-[.325em]"
|
||||
disabled={min != null && value <= min}
|
||||
onPointerDown={handlePointerDown(-1)}
|
||||
>
|
||||
<Minus className="size-4" absoluteStrokeWidth strokeWidth={3.5} />
|
||||
</button>
|
||||
<div className="relative grid items-center justify-items-center text-center [grid-template-areas:'overlap'] *:[grid-area:overlap]">
|
||||
<input
|
||||
ref={inputRef}
|
||||
className={clsx(
|
||||
showCaret ? "caret-primary" : "caret-transparent",
|
||||
"spin-hide w-[1.5em] bg-transparent py-2 text-center font-[inherit] text-transparent outline-none",
|
||||
"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
|
||||
)}
|
||||
// Make sure to disable kerning, to match NumberFlow:
|
||||
style={{ fontKerning: "none" }}
|
||||
type="number"
|
||||
min={min}
|
||||
step={1}
|
||||
autoComplete="off"
|
||||
inputMode="numeric"
|
||||
max={max}
|
||||
value={value}
|
||||
onInput={handleInput}
|
||||
/>
|
||||
<NumberFlow
|
||||
value={value}
|
||||
format={{ useGrouping: false }}
|
||||
aria-hidden
|
||||
animated={animated}
|
||||
onAnimationsStart={() => setShowCaret(false)}
|
||||
onAnimationsFinish={() => setShowCaret(true)}
|
||||
className="pointer-events-none"
|
||||
willChange
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
aria-hidden
|
||||
tabIndex={-1}
|
||||
className="flex items-center pl-[.325em] pr-[.5em]"
|
||||
disabled={max != null && value >= max}
|
||||
onPointerDown={handlePointerDown(1)}
|
||||
>
|
||||
<Plus className="size-4" absoluteStrokeWidth strokeWidth={3.5} />
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
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>
|
||||
);
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
"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>
|
||||
);
|
||||
}
|
||||