This document proposes a practical plan for two requested directions:
- Build a desktop GUI with GPUI so GraphBit has a unified Rust-native experience.
- Evaluate and add vLLM support, including batched/parallel execution where appropriate.
It also includes suggested next steps outside those two areas.
- The repository is primarily a Rust core plus Python bindings/workspace members.
- There is no existing desktop UI crate or app shell in the workspace yet.
- The current root workspace members are:
coreguardrail_ffipython
- The Rust side already exposes the workflow engine, LLM provider abstraction, memory, streaming, and execution primitives, which is a good foundation for a native desktop app.
Create a Rust-native desktop application that lets users visually build, run, inspect, and debug GraphBit workflows without dropping into Python first.
Add a new workspace member, for example:
gpui-app/
Keep the UI thin and let it depend on graphbit-core directly. Avoid routing the desktop app through Python bindings.
Suggested layers:
- UI layer (GPUI)
- windows, panels, node editor, forms, run controls, logs
- App state layer
- loaded workflow, execution state, selected provider, environment profile, run history
- Integration layer
- translates UI actions into
graphbit-coreworkflows/executor calls
- translates UI actions into
- Core layer
- existing
graphbit-core
- existing
The MVP should focus on proving that GraphBit workflows can be created, executed, and inspected visually.
- Create a workflow visually.
- Add/edit core node types.
- Connect nodes in a graph.
- Configure one LLM provider and model.
- Run the workflow.
- See node-by-node status and outputs.
- View logs/errors for failures.
- Save and reopen workflow definitions.
-
Workflow canvas
- node graph editor
- drag/drop nodes
- connect/disconnect edges
- select node to edit properties
-
Node configuration panel
- node name/description
- node type selector
- prompt template editor
- system prompt override
- basic tool assignment
- timeout/retry settings if already supported cleanly
-
Run panel
- select provider/model
- API key/env var mapping
- run/cancel buttons
- execution progress
-
Execution inspector
- per-node state: pending/running/completed/failed
- output preview
- elapsed time
- error messages
-
Logs/trace panel
- structured runtime logs
- request/response metadata summary
- token/cost/latency if available
-
File/project actions
- new workflow
- open/save workflow JSON or another stable format
- recent workflows
Start with the smallest useful set:
AgentConditionTransformSplitJoinDelayHttpRequestDocumentLoader
If some node types are not yet ergonomic for visual editing, ship only the subset that is robust enough, but make Agent workflows first-class.
Do not block MVP on:
- multi-user collaboration
- plugin marketplace
- visual diff/versioning
- advanced observability dashboards
- embedded notebook experience
- full memory management UX
- benchmark runner UI
v1.0 should turn the app from “workflow runner/editor” into a real operator/developer console.
-
Streaming-first execution UX
- token streaming in node outputs
- live tool-call display
- progressive node status updates
-
Template/project system
- starter templates for common workflows
- example gallery
- clone-from-example to editable project
-
Provider management
- multiple saved providers/endpoints
- environment profiles (local/dev/staging/prod)
- per-node/provider override where applicable
-
Debugging and replay
- replay prior runs
- inspect full node inputs/outputs
- compare two runs
- deterministic re-run when inputs are unchanged
-
Guardrail/memory UI
- configure guardrail policy attachment
- inspect memory writes/reads
- toggle memory scopes and retention behavior
-
Artifact/document handling
- upload local files to document loader nodes
- inspect parsed chunks/splits
- preview extracted content
-
Observability dashboard
- latency histograms
- token usage by node/provider
- failure and retry analytics
- concurrency statistics
-
Packaging and distribution
- signed builds for macOS/Windows/Linux
- auto-update channel
- settings import/export
-
Workflow validation UX
- pre-run validation errors inline on nodes/edges
- cycle detection warnings
- missing provider/tool config warnings
-
Test harness / simulation mode
- dry-run or mock provider mode
- snapshot testing for workflows
- Add
gpui-appworkspace crate. - Add minimal shell window and app state.
- Define a serialized workflow document format for the GUI.
- Add adapters between GUI models and
graphbit-coreworkflow types.
- Build node canvas and selection model.
- Add inspector forms for the initial node types.
- Add save/open support.
- Add executor integration.
- Add run status, output, and error panels.
- Add cancellation and reset behavior.
- Add validation UX.
- Add logs panel.
- Add basic settings/provider management.
- Package first desktop preview builds.
- Streaming UX
- replay/debugging
- guardrails/memory
- observability
- templates and packaging polish
- Keep
graphbit-coreas the source of truth for workflow execution. - Add a thin app-facing API in Rust if the current public API is slightly too low-level for UI use.
- Prefer async task orchestration via Tokio with UI-safe state updates.
- Model execution state separately from workflow-definition state to keep the UI responsive.
- Treat secrets carefully: prefer env var references or OS keychain integration rather than storing raw keys in project files.
- A user can create a workflow with at least 2–3 nodes.
- A user can configure an LLM provider and run it from the app.
- The UI shows node statuses and outputs.
- The user can save and reopen the workflow.
- Basic validation prevents obviously invalid graphs/config.
- Streaming, replay, validation, and provider management are solid enough for daily development use.
- Packaging/distribution exists for the target desktop platforms.
- The app can be used as the primary workflow authoring/debugging environment for GraphBit.
Not explicitly as a first-class provider.
What exists today:
- The core has many provider implementations under
core/src/llm/. - The provider list includes
openai,anthropic,ollama,openrouter,togetherai,replicate,mistralai,gemini,deepseek,huggingface,ai21,xai,azurellm,bytedance, and a Python bridge. - There is no dedicated
vllm.rsprovider and noLlmConfig::Vllmvariant visible in the provider module structure.
Possibly, partially, through the existing OpenAI-compatible path.
Because the OpenAI provider supports a custom base_url, you can often point OpenAI-compatible clients at a vLLM server endpoint, assuming the target vLLM deployment exposes compatible chat completion APIs and the needed features.
That means there are two levels of support:
-
Unofficial compatibility mode
- Use
LlmConfig::OpenAI { ..., base_url: Some(...) } - Point it to a vLLM OpenAI-compatible endpoint
- Use
-
Real first-class vLLM support
- Add an explicit
Vllmprovider/config variant - Add vLLM-specific capabilities, defaults, and batch APIs
- Add an explicit
At the workflow level: yes, GraphBit appears designed for concurrency.
The repo documentation and core docs describe:
- deterministic concurrent execution
- parallel processing in the workflow engine
- concurrency statistics in the executor
- benchmark scenarios for parallel and concurrent tasks
So GraphBit already appears to exploit workflow-level parallelism.
No evidence of explicit vLLM request batching was found.
What is missing from the current provider surface:
- no first-class vLLM provider
- no exposed provider batch API for text generation akin to
embed_texts - no scheduler that groups compatible LLM requests into a single batched provider call
- no obvious
complete_manyor dynamic batching abstraction in the LLM provider layer
So the likely current situation is:
- GraphBit can run multiple tasks concurrently.
- Each task likely issues its own LLM request independently.
- That is parallelism, but not necessarily provider-side batching.
Implement vLLM in two stages:
- Stage A: first-class compatibility provider
- Add a dedicated
Vllmprovider using OpenAI-compatible endpoints.
- Add a dedicated
- Stage B: batched execution support
- Add optional batch APIs and request coalescing for workloads that benefit from vLLM batching.
Add LlmConfig::Vllm but internally reuse most of the OpenAI request/response logic.
Vllm {
api_key: Option<String>,
model: String,
base_url: String,
max_batch_size: Option<usize>,
enable_auto_batching: Option<bool>,
}Notes:
api_keyshould be optional because many self-hosted vLLM deployments do not require one.base_urlshould be required for clarity.- Keep feature flags explicit instead of hiding batching behavior.
Refactor the provider layer so OpenAI-compatible providers share a transport/core implementation.
Suggested shape:
- shared OpenAI-compatible transport module
- provider-specific adapters:
- OpenAI
- OpenRouter
- vLLM
- potentially other compatible backends
This reduces duplication and makes vLLM support cleaner.
- Add
VllmtoLlmConfig. - Add constructor/helpers in Rust and Python bindings.
- Add docs/examples for local and remote vLLM endpoints.
- Create
core/src/llm/vllm.rs. - Implement
LlmProviderTrait. - Support:
completestreamif endpoint supports it- function/tool calling only if the deployed vLLM model/server combination supports it well enough
- Update
core/src/llm/mod.rsand provider factory matching. - Register capability metadata correctly.
- Expose
vllmin PythonLlmConfighelpers/constructors. - Add examples in
python/README.md.
- Add unit tests for config and serialization.
- Add mocked integration tests against OpenAI-compatible responses.
- Add optional real integration tests guarded by env vars.
- Add “Using GraphBit with vLLM” guide.
- Explain supported features and limitations.
- Document local deployment examples.
There are three different optimizations people often mix together:
- Concurrent workflow execution
- multiple nodes/tasks run at once
- Concurrent provider requests
- multiple independent HTTP calls in flight
- True batch inference
- many prompts grouped into a single provider/server-side batch
GraphBit seems to already support #1, and likely some degree of #2 through async execution. What seems missing is a first-class abstraction for #3.
Add a provider-level optional batch API without forcing every provider to support it.
Add an optional method like:
async fn complete_many(&self, requests: Vec<LlmRequest>) -> GraphBitResult<Vec<LlmResponse>>Default behavior for providers that do not support batching:
- execute
complete()concurrently with a bounded concurrency limit
Specialized behavior for vLLM:
- map compatible requests into a batched call path when feasible
Only batch requests together when they match on key dimensions such as:
- same provider
- same model
- same sampling config where required
- same tool/function-calling mode
- same structured-output mode if applicable
- same endpoint/base URL
Add a small batching layer between executor and provider:
- collect ready LLM tasks for a short window
- group by batch key
- flush when either:
- max batch size is reached, or
- max wait time elapses
Suggested controls:
max_batch_sizemax_batch_wait_msmax_in_flight_batchesfallback_to_parallel_single_requests
Best place: near the LLM invocation boundary, not in the UI and not deep inside workflow graph logic.
Suggested layering:
- workflow executor decides what can run in parallel
- LLM dispatch layer decides what can be coalesced into batches
- provider executes either batched or single requests
Even before true batching, add cleaner bounded concurrency for provider requests.
- add provider pool / semaphore controls
- expose per-provider concurrency config
- collect request latency/queue metrics
This is valuable even if vLLM batching comes later.
- add
complete_many - add executor/dispatcher support for grouped calls
- default fallback implementation for non-batch providers
- implement batching in
vllm.rs - benchmark single vs concurrent vs batched modes
- expose config knobs
- batch size distribution
- queue wait time
- throughput improvements
- latency tradeoff dashboard/logs
Benefits:
- higher throughput
- better GPU utilization on vLLM backends
- lower overhead per request at scale
Costs/risks:
- slightly increased tail latency for small requests if batching waits too long
- more complex error mapping from batch response to per-request result
- harder support for heterogeneous tool-calling requests
- default to normal concurrent requests
- enable auto-batching only for clearly batch-friendly workloads
- expose knobs rather than making batching invisible
- Add
gpui-appcrate - Implement canvas + inspector + run panel
- Save/load workflow documents
- Show outputs and errors
- Add
LlmConfig::Vllm - Implement
core/src/llm/vllm.rs - Document OpenAI-compatible endpoint setup
- Add tests and examples
- Add bounded concurrency controls for LLM dispatch
- Add optional
complete_many - Add metrics around queueing and throughput
- Streaming UX
- provider profiles and secrets handling
- batch scheduler for vLLM
- observability dashboards
These are high-value next steps that complement both the GPUI app and vLLM support.
This is the most important adjacent investment.
Why:
- the GUI needs save/load
- examples/templates become portable
- replay/debugging becomes much easier
- future JS/web/editor integrations benefit too
Suggested output:
- versioned workflow schema
- import/export support
- migration strategy across schema versions
Right now the core is powerful, but a desktop app will benefit from a cleaner facade for:
- project loading/saving
- run orchestration
- execution event streaming
- provider profile management
A UI will benefit from a structured stream of events such as:
- workflow started
- node scheduled
- node started
- token chunk received
- tool call requested
- node completed/failed
- workflow completed
Examples should cover:
- parallel fan-out/fan-in
- tool calling
- memory
- document processing
- local model serving via Ollama/vLLM
The repo already has benchmarks. Extend them to compare:
- OpenAI-compatible single requests
- concurrent requests
- vLLM batched mode
- Ollama local inference
This will make the value of first-class vLLM support measurable.
- Define a stable workflow document format.
- Create the
gpui-appworkspace crate and ship a minimal workflow editor/runner MVP. - Add first-class
Vllmconfig/provider support using the OpenAI-compatible path. - Add bounded LLM dispatch concurrency controls.
- Add optional batch APIs and vLLM batching.
- Expand the desktop app toward v1.0 with streaming, replay, and observability.