Skip to content

Commit d8006e9

Browse files
committed
add motoko/llm_chatbot
1 parent d16f8e9 commit d8006e9

22 files changed

+3985
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
name: motoko-llm-chatbot
2+
on:
3+
push:
4+
branches:
5+
- master
6+
pull_request:
7+
paths:
8+
- motoko/llm_chatbot/**
9+
- .github/workflows/provision-darwin.sh
10+
- .github/workflows/provision-linux.sh
11+
- .github/workflows/motoko-llm-chatbot-example.yml
12+
- .ic-commit
13+
concurrency:
14+
group: ${{ github.workflow }}-${{ github.ref }}
15+
cancel-in-progress: true
16+
jobs:
17+
motoko-llm-chatbot-darwin:
18+
runs-on: macos-15
19+
steps:
20+
- uses: actions/checkout@v1
21+
- name: Provision Darwin
22+
run: bash .github/workflows/provision-darwin.sh
23+
- name: Motoko Flying Ninja Darwin
24+
run: |
25+
dfx start --background
26+
pushd motoko/llm_chatbot
27+
make install
28+
popd
29+
motoko-llm-chatbot-linux:
30+
runs-on: ubuntu-22.04
31+
steps:
32+
- uses: actions/checkout@v1
33+
- name: Provision Linux
34+
run: bash .github/workflows/provision-linux.sh
35+
- name: Motoko Flying Ninja Linux
36+
run: |
37+
dfx start --background
38+
pushd motoko/llm_chatbot
39+
make install
40+
popd

motoko/llm_chatbot/BUILD.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# Continue building locally
2+
3+
Projects deployed through ICP Ninja are temporary; they will only be live for 20 minutes before they are removed. The command-line tool `dfx` can be used to continue building your ICP Ninja project locally and deploy it to the mainnet.
4+
5+
To migrate your ICP Ninja project off of the web browser and develop it locally, follow these steps.
6+
7+
### 1. Install developer tools.
8+
9+
You can install the developer tools natively or use Dev Containers.
10+
11+
#### Option 1: Natively install developer tools
12+
13+
> Installing `dfx` natively is currently only supported on macOS and Linux systems. On Windows, it is recommended to use the Dev Containers option.
14+
15+
1. Install `dfx` with the following command:
16+
17+
```
18+
19+
sh -ci "$(curl -fsSL https://internetcomputer.org/install.sh)"
20+
21+
```
22+
23+
> On Apple Silicon (e.g., Apple M1 chip), make sure you have Rosetta installed (`softwareupdate --install-rosetta`).
24+
25+
2. [Install NodeJS](https://nodejs.org/en/download/package-manager).
26+
27+
3. For Rust projects, you will also need to:
28+
29+
- Install [Rust](https://doc.rust-lang.org/cargo/getting-started/installation.html#install-rust-and-cargo): `curl https://sh.rustup.rs -sSf | sh`
30+
31+
- Install [candid-extractor](https://crates.io/crates/candid-extractor): `cargo install candid-extractor`
32+
33+
4. For Motoko projects, you will also need to:
34+
35+
- Install the Motoko package manager [Mops](https://docs.mops.one/quick-start#2-install-mops-cli): `npm i -g ic-mops`
36+
37+
Lastly, navigate into your project's directory that you downloaded from ICP Ninja.
38+
39+
#### Option 2: Dev Containers
40+
41+
Continue building your projects locally by installing the [Dev Container extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for VS Code and [Docker](https://docs.docker.com/engine/install/).
42+
43+
Make sure Docker is running, then navigate into your project's directory that you downloaded from ICP Ninja and start the Dev Container by selecting `Dev-Containers: Reopen in Container` in VS Code's command palette (F1 or Ctrl/Cmd+Shift+P).
44+
45+
> Note that local development ports (e.g. the ports used by `dfx` or `vite`) are forwarded from the Dev Container to your local machine. In the VS code terminal, use Ctrl/Cmd+Click on the displayed local URLs to open them in your browser. To view the current port mappings, click the "Ports" tab in the VS Code terminal window.
46+
47+
### 2. Create a local developer identity.
48+
49+
To manage your project's canisters, it is recommended that you create a local [developer identity](https://internetcomputer.org/docs/building-apps/getting-started/identities) rather than use the `dfx` default identity that is not stored securely.
50+
51+
To create a new identity, run the commands:
52+
53+
```
54+
55+
dfx start --background
56+
57+
dfx identity new IDENTITY_NAME
58+
59+
dfx identity use IDENTITY_NAME
60+
61+
```
62+
63+
Replace `IDENTITY_NAME` with your preferred identity name. The first command `dfx start --background` starts the local `dfx` processes, then `dfx identity new` will create a new identity and return your identity's seed phase. Be sure to save this in a safe, secure location.
64+
65+
The third command `dfx identity use` will tell `dfx` to use your new identity as the active identity. Any canister smart contracts created after running `dfx identity use` will be owned and controlled by the active identity.
66+
67+
Your identity will have a principal ID associated with it. Principal IDs are used to identify different entities on ICP, such as users and canisters.
68+
69+
[Learn more about ICP developer identities](https://internetcomputer.org/docs/building-apps/getting-started/identities).
70+
71+
### 3. Deploy the project locally.
72+
73+
Deploy your project to your local developer environment with:
74+
75+
```
76+
npm install
77+
dfx deploy
78+
79+
```
80+
81+
Your project will be hosted on your local machine. The local canister URLs for your project will be shown in the terminal window as output of the `dfx deploy` command. You can open these URLs in your web browser to view the local instance of your project.
82+
83+
### 4. Obtain cycles.
84+
85+
To deploy your project to the mainnet for long-term public accessibility, first you will need [cycles](https://internetcomputer.org/docs/building-apps/getting-started/tokens-and-cycles). Cycles are used to pay for the resources your project uses on the mainnet, such as storage and compute.
86+
87+
> This cost model is known as ICP's [reverse gas model](https://internetcomputer.org/docs/building-apps/essentials/gas-cost), where developers pay for their project's gas fees rather than users pay for their own gas fees. This model provides an enhanced end user experience since they do not need to hold tokens or sign transactions when using a dapp deployed on ICP.
88+
89+
> Learn how much a project may cost by using the [pricing calculator](https://internetcomputer.org/docs/building-apps/essentials/cost-estimations-and-examples).
90+
91+
Cycles can be obtained through [converting ICP tokens into cycles using `dfx`](https://internetcomputer.org/docs/building-apps/developer-tools/dfx/dfx-cycles#dfx-cycles-convert).
92+
93+
### 5. Deploy to the mainnet.
94+
95+
Once you have cycles, run the command:
96+
97+
```
98+
99+
dfx deploy --network ic
100+
101+
```
102+
103+
After your project has been deployed to the mainnet, it will continuously require cycles to pay for the resources it uses. You will need to [top up](https://internetcomputer.org/docs/building-apps/canister-management/topping-up) your project's canisters or set up automatic cycles management through a service such as [CycleOps](https://cycleops.dev/).
104+
105+
> If your project's canisters run out of cycles, they will be removed from the network.
106+
107+
## Additional examples
108+
109+
Additional code examples and sample applications can be found in the [DFINITY examples repo](https://github.com/dfinity/examples).

motoko/llm_chatbot/Makefile

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
.PHONY: all
2+
all: build
3+
4+
.PHONY: node_modules
5+
.SILENT: node_modules
6+
node_modules:
7+
npm install
8+
9+
.PHONY: build
10+
.SILENT: build
11+
build: node_modules
12+
dfx canister create --all
13+
dfx build
14+
15+
.PHONY: install
16+
.SILENT: install
17+
install: build
18+
dfx canister install --all
19+
20+
.PHONY: upgrade
21+
.SILENT: upgrade
22+
upgrade: build
23+
dfx canister install --all --mode=upgrade
24+
25+
.PHONY: clean
26+
.SILENT: clean
27+
clean:
28+
rm -fr .dfx

motoko/llm_chatbot/README.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# LLM Chatbot
2+
3+
![LLM Chatbot](../../_attachments/llm_chatbot.png)
4+
5+
The LLM Chatbot example demonstrates how an ICP smart contract can be used to interact with a large language model (LLM) to generate text. The user can input a prompt, and the smart contract will use the LLM to generate a response.
6+
The response is then returned to the user, and the user can submit some follow-up prompts to continue the conversation.
7+
8+
This application's logic is written in [Motoko](https://internetcomputer.org/docs/motoko/main/getting-started/motoko-introduction), a programming language designed specifically for developing canisters on ICP.
9+
10+
## What is ICP Ninja?
11+
12+
ICP Ninja is a web-based integrated development environment (IDE) for the Internet Computer. It allows you to write code and deploy applications directly from your web browser in a temporary, sandbox-like environment.
13+
14+
For users who may already be familiar with the Internet Computer or who would rather use more **advanced tooling** such as command-line development tools, please refer to the [ICP developer documentation](https://internetcomputer.org/docs/building-apps/getting-started/install) to learn more.
15+
16+
Projects deployed to ICP from ICP Ninja are available on the mainnet for 20 minutes at a time. After 20 minutes, the project must be redeployed.
17+
18+
To deploy your project for long-term, production use such that it persists longer than 20 minutes without needing to be redeployed, you must migrate the files off of ICP Ninja and deploy them to the mainnet via `dfx` in a command-line environment.
19+
20+
## Project structure
21+
22+
The `/backend` folder contains the Motoko canister, `app.mo`. The `/frontend` folder contains web assets for the application's user interface. The user interface is written using the React framework. Edit the `mops.toml` file to add [Motoko dependencies](https://mops.one/) to the project.
23+
24+
## Deploying from ICP Ninja
25+
26+
When viewing this project in ICP Ninja, you can deploy it directly to the mainnet for free by clicking "Deploy" in the upper right corner.
27+
28+
To **download** or **reset** the project files, click the menu option next to the deploy button.
29+
30+
## Editing files
31+
32+
To make adjustments to this project, you can edit any file that is unlocked. Then, redeploy your application to view your changes.
33+
34+
To edit files that are immutable in ICP Ninja, you can export the project to GitHub or download the project to your local environment using the "Download files" option.
35+
36+
## Build and deploy from the command-line
37+
38+
To migrate your ICP Ninja project off of the web browser and develop it locally, follow these steps. These steps are necessary if you want to deploy this project for long-term, production use on the mainnet.
39+
40+
### 1. Download your project from ICP Ninja using the 'Download files' button on the upper left corner under the pink ninja star icon.
41+
42+
### 2. Setting up Ollama
43+
44+
To be able to test the agent locally, you'll need a server for processing the agent's prompts. For that, we'll use `ollama`, which is a tool that can download and serve LLMs.
45+
See the documentation on the [Ollama website](https://ollama.com/) to install it. Once it's installed, run:
46+
47+
```
48+
ollama serve
49+
# Expected to start listening on port 11434
50+
```
51+
52+
The above command will start the Ollama server, so that it can process requests by the agent. Additionally, and in a separate window, run the following command to download the LLM that will be used by the agent:
53+
54+
```
55+
ollama run llama3.1:8b
56+
```
57+
58+
The above command will download an 8B parameter model, which is around 4GiB. Once the command executes and the model is loaded, you can terminate it. You won't need to do this step again.
59+
60+
### 3. Open the `BUILD.md` file for further instructions.

motoko/llm_chatbot/backend/app.mo

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import LLM "mo:llm";
2+
3+
persistent actor {
4+
public func prompt(prompt : Text) : async Text {
5+
await LLM.prompt(#Llama3_1_8B, prompt);
6+
};
7+
8+
public func chat(messages : [LLM.ChatMessage]) : async Text {
9+
await LLM.chat(#Llama3_1_8B, messages);
10+
};
11+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "ICP Dev Environment",
3+
"image": "ghcr.io/dfinity/icp-dev-env-slim:17",
4+
"forwardPorts": [4943, 5173],
5+
"portsAttributes": {
6+
"4943": {
7+
"label": "dfx",
8+
"onAutoForward": "ignore"
9+
},
10+
"5173": {
11+
"label": "vite",
12+
"onAutoForward": "openBrowser"
13+
}
14+
},
15+
"customizations": {
16+
"vscode": {
17+
"extensions": ["dfinity-foundation.vscode-motoko"]
18+
}
19+
}
20+
}

motoko/llm_chatbot/dfx.json

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"canisters": {
3+
"backend": {
4+
"dependencies": ["llm"],
5+
"main": "backend/app.mo",
6+
"type": "motoko",
7+
"args": "--enhanced-orthogonal-persistence"
8+
},
9+
"frontend": {
10+
"dependencies": ["backend"],
11+
"frontend": {
12+
"entrypoint": "frontend/index.html"
13+
},
14+
"source": ["frontend/dist"],
15+
"type": "assets"
16+
},
17+
"llm": {
18+
"candid": "https://github.com/dfinity/llm/releases/latest/download/llm-canister-ollama.did",
19+
"type": "custom",
20+
"specified_id": "w36hm-eqaaa-aaaal-qr76a-cai",
21+
"remote": {
22+
"id": {
23+
"ic": "w36hm-eqaaa-aaaal-qr76a-cai"
24+
}
25+
},
26+
"wasm": "https://github.com/dfinity/llm/releases/latest/download/llm-canister-ollama.wasm"
27+
}
28+
},
29+
"output_env_file": ".env",
30+
"defaults": {
31+
"build": {
32+
"packtool": "mops sources"
33+
}
34+
}
35+
}

motoko/llm_chatbot/files.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[
2+
"README.md",
3+
"backend/app.mo",
4+
"dfx.json",
5+
"frontend/index.css",
6+
"frontend/index.html",
7+
"frontend/package.json",
8+
"frontend/postcss.config.js",
9+
"frontend/public/bot.svg",
10+
"frontend/public/favicon.ico",
11+
"frontend/public/user.svg",
12+
"frontend/src/main.jsx",
13+
"frontend/tailwind.config.js",
14+
"frontend/vite.config.js",
15+
"mops.toml",
16+
"package-lock.json",
17+
"package.json"
18+
]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@tailwind base;
2+
@tailwind components;
3+
@tailwind utilities;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>LLM Chatbot</title>
7+
<link rel="icon" href="/favicon.ico" />
8+
</head>
9+
<body>
10+
<div id="root"></div>
11+
<script type="module" src="src/main.jsx"></script>
12+
</body>
13+
</html>

0 commit comments

Comments
 (0)