diff --git a/chainforge/react-server/src/UploadNode.tsx b/chainforge/react-server/src/UploadNode.tsx
index 0869c550..f79fda22 100644
--- a/chainforge/react-server/src/UploadNode.tsx
+++ b/chainforge/react-server/src/UploadNode.tsx
@@ -22,6 +22,7 @@ import useStore from "./store";
import BaseNode from "./BaseNode";
import NodeLabel from "./NodeLabelComponent";
import { AlertModalContext } from "./AlertModal";
+import DocumentationButton from "./DocumentationButton";
import { Status } from "./StatusIndicatorComponent";
import { TemplateVarInfo } from "./backend/typing";
import { MediaLookup } from "./backend/cache";
@@ -151,6 +152,7 @@ const UploadNode: React.FC
= ({ data, id }) => {
nodeId={id}
icon={nodeIcon}
status={status}
+ customButtons={[]}
/>
= ({ data, id }) => {
nodeId={id}
status={status}
icon={"📊"}
+ customButtons={[]}
/>
= {
+ prompt:
+ "Prompt one or multiple LLMs. Specify prompt variables in brackets {}.",
+ chat: "Start or continue a conversation with chat models. Attach Prompt Node output as past context to continue chatting past the first turn.",
+ textfields:
+ "Specify input text to prompt or chat nodes. You can also declare variables in brackets {} to chain TextFields together.",
+ csv: "Specify inputs as a comma-separated list of items. Good for specifying lots of short text values. An alternative to TextFields node.",
+ table:
+ "Import or create a spreadsheet of data to use as input to prompt or chat nodes. Import accepts xlsx, csv, and jsonl.",
+ chunk:
+ "Chunk texts into smaller pieces. Compare different chunking methods. Typically used after the Upload Node.",
+ retrieval:
+ "Given chunks and queries, retrieve relevant chunks for the given query. Compare retrieval methods across queries. Retrieval methods include both classical methods like BM25, and vector stores.",
+ rerank: "Reranks retrieval outputs.",
+ upload: "Upload documents to the flow, such as text files or PDFs.",
+ simpleval: "Evaluate responses with a simple check (no coding required).",
+ "evaluator-javascript": "Evaluate responses by writing JavaScript code.",
+ "evaluator-python": "Evaluate responses by writing Python code.",
+ evaluator: "Evaluate responses by writing JavaScript or Python code.",
+ "processor-javascript":
+ "Transform responses by mapping a JavaScript function over them.",
+ "processor-python":
+ "Transform responses by mapping a Python function over them.",
+ processor: "Transform responses by mapping a function over them.",
+ llmeval:
+ "Evaluate responses with an LLM. (Note that LLM evaluators should be used with caution and always double-checked.)",
+ multieval:
+ "Evaluate responses across multiple criteria (multiple code and/or LLM evaluators).",
+ vis: "Plot evaluation results. (Attach an evaluator or scorer node as input.)",
+ inspect:
+ "Used to inspect responses from prompter or evaluation nodes, without opening up the pop-up view.",
+ script:
+ "Specify directories to load as local packages, so they can be imported in your Python evaluator nodes (add to sys path).",
+ join: "Concatenate responses or input data together before passing into later nodes, within or across variables and LLMs.",
+ split:
+ "Split responses or input data by some format. For instance, you can split a markdown list into separate items.",
+ comment: "Make a comment about your flow.",
+ media: "Add image data with corresponding metadata.",
+ selectvars:
+ "Filter which variables and metavariables to keep for the next steps.",
+};
+
+export const NODE_DOC_PATHS: Record = {
+ prompt: "prompt-node",
+ chat: "chat-turn-node",
+ textfields: "textfields-node",
+ csv: "random-sampling-from-a-spreadsheet",
+ table: "tabular-data-node",
+ chunk: "chunker-node",
+ retrieval: "retrieval-node",
+ rerank: "rerank-node",
+ upload: "upload-node",
+ simpleval: "simple-evaluator-node",
+ evaluator: "code-evaluator-node",
+ processor: "code-processor-nodes",
+ llmeval: "llm-scorer-node",
+ multieval: "multi-evaluator-node",
+ vis: "vis-node",
+ inspect: "inspect-node",
+ script: "global-python-scripts",
+ join: "join-node",
+ split: "split-node",
+ comment: "comment-node",
+ media: "",
+ selectvars: "",
+};
diff --git a/docker-compose.gpu.yml b/docker-compose.gpu.yml
new file mode 100644
index 00000000..8387ebda
--- /dev/null
+++ b/docker-compose.gpu.yml
@@ -0,0 +1,41 @@
+services:
+ chainforge-gpu:
+ build:
+ context: .
+ dockerfile: Dockerfile.gpu
+ image: gauransh/chainforge:gpu
+ container_name: chainforge-gpu
+ ports:
+ - "8000:8000"
+ volumes:
+ # Mount data directory for persistent storage
+ - chainforge-data:/home/chainforge/.local/share/chainforge
+ environment:
+ - NODE_ENV=production
+ - FLASK_ENV=production
+ # Add API keys as environment variables if needed
+ # - OPENAI_API_KEY=${OPENAI_API_KEY}
+ # - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
+ # - COHERE_API_KEY=${COHERE_API_KEY}
+ # - GOOGLE_API_KEY=${GOOGLE_API_KEY}
+ # - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
+ # - HUGGINGFACE_API_KEY=${HUGGINGFACE_API_KEY}
+ restart: unless-stopped
+ healthcheck:
+ test: ["CMD-SHELL", "curl -f http://localhost:8000 || exit 1"]
+ interval: 30s
+ timeout: 10s
+ retries: 3
+ start_period: 40s
+ deploy:
+ resources:
+ reservations:
+ devices:
+ - driver: nvidia
+ count: all
+ capabilities: [gpu]
+
+# Named volume for persistent data
+volumes:
+ chainforge-data:
+ driver: local
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 00000000..46bd1444
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,34 @@
+services:
+ chainforge:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ image: gauransh/chainforge:latest
+ container_name: chainforge
+ ports:
+ - "8000:8000"
+ volumes:
+ # Mount data directory for persistent storage
+ - chainforge-data:/home/chainforge/.local/share/chainforge
+ environment:
+ - NODE_ENV=production
+ - FLASK_ENV=production
+ # Add API keys as environment variables if needed
+ # - OPENAI_API_KEY=${OPENAI_API_KEY}
+ # - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
+ # - COHERE_API_KEY=${COHERE_API_KEY}
+ # - GOOGLE_API_KEY=${GOOGLE_API_KEY}
+ # - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
+ # - HUGGINGFACE_API_KEY=${HUGGINGFACE_API_KEY}
+ restart: unless-stopped
+ healthcheck:
+ test: ["CMD-SHELL", "curl -f http://localhost:8000 || exit 1"]
+ interval: 30s
+ timeout: 10s
+ retries: 3
+ start_period: 40s
+
+# Named volume for persistent data
+volumes:
+ chainforge-data:
+ driver: local
\ No newline at end of file