Skip to content

Commit 9f7a9ca

Browse files
committed
nextjs transition and fly server
1 parent 4833632 commit 9f7a9ca

21 files changed

+6823
-39
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,4 @@ dmypy.json
137137

138138
vectorstore.pkl
139139
langchain.readthedocs.io/
140+
.vercel

Procfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Modify this Procfile to fit your needs
2+
web: uvicorn main:app --host 0.0.0.0 --port 8080

chat-langchain/.eslintrc.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"extends": "next/core-web-vitals"
3+
}

chat-langchain/.gitignore

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/.pnp
6+
.pnp.js
7+
8+
# testing
9+
/coverage
10+
11+
# next.js
12+
/.next/
13+
/out/
14+
15+
# production
16+
/build
17+
18+
# misc
19+
.DS_Store
20+
*.pem
21+
22+
# debug
23+
npm-debug.log*
24+
yarn-debug.log*
25+
yarn-error.log*
26+
27+
# local env files
28+
.env*.local
29+
30+
# vercel
31+
.vercel
32+
33+
# typescript
34+
*.tsbuildinfo
35+
next-env.d.ts

chat-langchain/README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2+
3+
## Getting Started
4+
5+
First, run the development server:
6+
7+
```bash
8+
npm run dev
9+
# or
10+
yarn dev
11+
# or
12+
pnpm dev
13+
```
14+
15+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
16+
17+
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
18+
19+
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
20+
21+
## Learn More
22+
23+
To learn more about Next.js, take a look at the following resources:
24+
25+
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
26+
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
27+
28+
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
29+
30+
## Deploy on Vercel
31+
32+
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
33+
34+
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
"use client";
2+
import React, { useEffect, useRef, useState } from "react";
3+
4+
const Chat = () => {
5+
const [messages, setMessages] = useState<
6+
Array<{ sender: string; message: string; isCode: boolean }>
7+
>([]);
8+
const [model, setModel] = useState("openai");
9+
const messagesEndRef = useRef<HTMLDivElement>(null);
10+
const [message, setMessage] = useState(""); // Add this line
11+
12+
const sendMessage = (event: { preventDefault: () => void }) => {
13+
event.preventDefault();
14+
if (message === "") {
15+
return;
16+
}
17+
let isCode = false;
18+
19+
fetch("http://0.0.0.0:8080/chat", {
20+
method: "POST",
21+
headers: {
22+
"Content-Type": "application/json",
23+
},
24+
body: JSON.stringify({
25+
message: message,
26+
model: model,
27+
}),
28+
})
29+
.then((response) => {
30+
const reader = response.body.getReader();
31+
const decoder = new TextDecoder("utf-8");
32+
33+
let accumulatedMessage = "";
34+
let prevIsCode = null;
35+
36+
reader
37+
.read()
38+
.then(function processText({
39+
done,
40+
value,
41+
}: {
42+
done: any;
43+
value: any;
44+
}) {
45+
if (done) {
46+
console.log("Stream complete");
47+
return;
48+
}
49+
50+
let result = decoder.decode(value);
51+
if (result.includes("``")) {
52+
isCode = !isCode;
53+
} else {
54+
result = result.replace(/`/g, "");
55+
accumulatedMessage += result;
56+
}
57+
58+
setMessages((prevMessages) => {
59+
let newMessages = [...prevMessages];
60+
if (isCode !== prevIsCode) {
61+
newMessages.push({
62+
sender: isCode ? "" : "Bot",
63+
message: accumulatedMessage.trim(),
64+
isCode: isCode,
65+
});
66+
if (newMessages.length > 1) {
67+
accumulatedMessage = "";
68+
}
69+
} else if (newMessages.length > 0) {
70+
newMessages[newMessages.length - 1] = {
71+
sender: isCode ? "" : "Bot",
72+
message: accumulatedMessage.trim(),
73+
isCode: isCode,
74+
};
75+
}
76+
prevIsCode = isCode;
77+
return newMessages;
78+
});
79+
setMessage("");
80+
return reader.read().then(processText);
81+
});
82+
})
83+
.catch((error) => {
84+
console.error("Error:", error);
85+
});
86+
};
87+
88+
useEffect(() => {
89+
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
90+
}, [messagesEndRef]);
91+
92+
return (
93+
<div className="rounded-2xl border-zinc-100 lg:border lg:p-6 bg-slate-200">
94+
<div className="w-full mb-5 rounded-lg px-4 py-5 shadow-lg ring-1 ring-zinc-100 sm:px-6 bg-slate-100">
95+
<h4 className="text-center text-3xl font-sans font-medium">
96+
Chat Langchain
97+
</h4>
98+
<span className="mx-auto flex font-mono flex-grow text-gray-400 clear-both mb-5 mt-1 text-sm justify-center">
99+
A chatbot for everything Langchain.
100+
</span>
101+
<hr className="border-gray-500 my-5" />
102+
<div
103+
id="messages"
104+
className="overflow-auto m-8"
105+
style={{ maxHeight: "500px" }}
106+
>
107+
{messages.map((msg, index) => (
108+
<div
109+
key={index}
110+
className={`flex ${
111+
msg.sender === "You" ? "justify-end" : "justify-start"
112+
}`}
113+
>
114+
<div
115+
className={
116+
msg.sender === "You" ? "client-message" : "server-message"
117+
}
118+
>
119+
{msg.sender && <strong>{msg.sender}: </strong>}
120+
{msg.isCode ? (
121+
<code
122+
style={{
123+
color: "white",
124+
backgroundColor: "rgba(0, 0, 0, 0.8)",
125+
opacity: "0.9",
126+
padding: "4px",
127+
margin: "4px",
128+
borderRadius: "5px",
129+
overflow: "auto",
130+
boxShadow: "0px 0px 10px rgba(0, 0, 0, 0.5))",
131+
transition: "ease-in-out 0.15s",
132+
}}
133+
dangerouslySetInnerHTML={{ __html: msg.message }}
134+
></code>
135+
) : (
136+
msg.message
137+
)}
138+
</div>
139+
</div>
140+
))}
141+
<div ref={messagesEndRef} />
142+
</div>
143+
<form className="flex justify-between mt-5" onSubmit={sendMessage}>
144+
<input
145+
type="text"
146+
className="w-4/5 bg-gray-800 text-white rounded p-2 mr-2"
147+
placeholder="Write your question"
148+
id="messageText"
149+
value={message}
150+
onChange={(e) => setMessage(e.target.value)}
151+
/>
152+
<select
153+
id="modelType"
154+
className="w-1/5 bg-gray-800 text-white rounded p-2 mr-2"
155+
value={model}
156+
onChange={(e) => setModel(e.target.value)}
157+
>
158+
<option value="openai">OpenAI</option>
159+
<option value="anthropic">Anthropic</option>
160+
</select>
161+
<button
162+
id="send"
163+
type="submit"
164+
className="bg-blue-500 text-white rounded p-2"
165+
>
166+
Send
167+
</button>
168+
</form>
169+
</div>
170+
</div>
171+
);
172+
};
173+
174+
export default Chat;

chat-langchain/app/favicon.ico

25.3 KB
Binary file not shown.

chat-langchain/app/globals.css

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
@tailwind base;
2+
@tailwind components;
3+
@tailwind utilities;
4+
5+
:root {
6+
--foreground-rgb: 0, 0, 0;
7+
--background-start-rgb: 214, 219, 220;
8+
--background-end-rgb: 255, 255, 255;
9+
}
10+
11+
@media (prefers-color-scheme: dark) {
12+
:root {
13+
--foreground-rgb: 255, 255, 255;
14+
--background-start-rgb: 0, 0, 0;
15+
--background-end-rgb: 0, 0, 0;
16+
}
17+
}
18+
19+
body {
20+
color: rgb(var(--foreground-rgb));
21+
background: linear-gradient(
22+
to bottom,
23+
transparent,
24+
rgb(var(--background-end-rgb))
25+
)
26+
rgb(var(--background-start-rgb));
27+
}

chat-langchain/app/layout.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import './globals.css'
2+
import type { Metadata } from 'next'
3+
import { Inter } from 'next/font/google'
4+
5+
const inter = Inter({ subsets: ['latin'] })
6+
7+
export const metadata: Metadata = {
8+
title: 'Create Next App',
9+
description: 'Generated by create next app',
10+
}
11+
12+
export default function RootLayout({
13+
children,
14+
}: {
15+
children: React.ReactNode
16+
}) {
17+
return (
18+
<html lang="en">
19+
<body className={inter.className}>{children}</body>
20+
</html>
21+
)
22+
}

chat-langchain/app/page.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Image from 'next/image'
2+
import axios from 'axios'
3+
import Chat from "../app/components/chat"
4+
5+
export default function Home() {
6+
return (
7+
<main className="flex min-h-screen flex-col items-center justify-between p-24 bg-white">
8+
<div className="z-10 max-w-5xl w-full items-center justify-between font-light text-sm lg:flex">
9+
<Chat/>
10+
</div>
11+
</main>
12+
)
13+
}
14+
15+

chat-langchain/next.config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/** @type {import('next').NextConfig} */
2+
const nextConfig = {}
3+
4+
module.exports = nextConfig

0 commit comments

Comments
 (0)