From 84c1c5b9808679b98665b54961d15612bb37eeb9 Mon Sep 17 00:00:00 2001 From: Tat Dat Duong Date: Sun, 14 Sep 2025 02:04:21 +0200 Subject: [PATCH 01/11] feat(sdk): introduce useStreamCustom using barebones streaming protocol --- internal/vite/.gitignore | 24 +++ internal/vite/index.html | 13 ++ internal/vite/package.json | 37 ++++ internal/vite/src/client.app.tsx | 44 +++++ internal/vite/src/client.css | 1 + internal/vite/src/client.tsx | 10 + internal/vite/src/server.mts | 39 ++++ internal/vite/src/vite-env.d.ts | 1 + internal/vite/tsconfig.app.json | 27 +++ internal/vite/tsconfig.json | 7 + internal/vite/tsconfig.node.json | 25 +++ internal/vite/turbo.json | 28 +++ internal/vite/vite.config.ts | 10 + libs/sdk/src/react/index.ts | 1 + libs/sdk/src/react/streamCustom.tsx | 265 ++++++++++++++++++++++++++ yarn.lock | 281 +++++++++++++++++++++++++++- 16 files changed, 809 insertions(+), 4 deletions(-) create mode 100644 internal/vite/.gitignore create mode 100644 internal/vite/index.html create mode 100644 internal/vite/package.json create mode 100644 internal/vite/src/client.app.tsx create mode 100644 internal/vite/src/client.css create mode 100644 internal/vite/src/client.tsx create mode 100644 internal/vite/src/server.mts create mode 100644 internal/vite/src/vite-env.d.ts create mode 100644 internal/vite/tsconfig.app.json create mode 100644 internal/vite/tsconfig.json create mode 100644 internal/vite/tsconfig.node.json create mode 100644 internal/vite/turbo.json create mode 100644 internal/vite/vite.config.ts create mode 100644 libs/sdk/src/react/streamCustom.tsx diff --git a/internal/vite/.gitignore b/internal/vite/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/internal/vite/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/internal/vite/index.html b/internal/vite/index.html new file mode 100644 index 000000000..f64bb82cf --- /dev/null +++ b/internal/vite/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/internal/vite/package.json b/internal/vite/package.json new file mode 100644 index 000000000..2015358ce --- /dev/null +++ b/internal/vite/package.json @@ -0,0 +1,37 @@ +{ + "name": "vite", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "build": "yarn turbo:command build:internal --filter=vite", + "dev": "turbo dev:client dev:server", + "dev:client": "vite", + "dev:server": "tsx watch --env-file=.env --clear-screen=false src/server.mts", + "build:internal": "tsc -b && vite build", + "format": "prettier --write src", + "lint": "prettier --check src", + "preview": "vite preview" + }, + "dependencies": { + "@hono/node-server": "^1.12.0", + "@langchain/core": "^1.0.0-alpha", + "@langchain/langgraph": "workspace:*", + "@langchain/langgraph-sdk": "workspace:*", + "@langchain/openai": "^1.0.0-alpha", + "hono": "^4.8.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "zod": "^3.23.8" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.11", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.4.1", + "prettier": "^2.8.3", + "tailwindcss": "^4.1.11", + "typescript": "~5.8.3", + "vite": "^6.0.0" + } +} diff --git a/internal/vite/src/client.app.tsx b/internal/vite/src/client.app.tsx new file mode 100644 index 000000000..d7441cc3e --- /dev/null +++ b/internal/vite/src/client.app.tsx @@ -0,0 +1,44 @@ +import { useStreamCustom } from "@langchain/langgraph-sdk/react"; + +export function App() { + const stream = useStreamCustom({ apiUrl: "/api/stream" }); + + return ( +
+
+ {stream.messages.map((message) => ( +
+ {message.content as string} +
+ ))} +
+
{ + e.preventDefault(); + + const form = e.target as HTMLFormElement; + const formData = new FormData(form); + const content = formData.get("content") as string; + + form.reset(); + stream.submit({ content }); + }} + > +