Genetic tag: sdk.react.query.gen1
RU: REACT_QUERY_INTEGRATION_ru.md
Use @agentstack/react hooks — not useState + useEffect for server data.
Integrator docs: wrap the app with SDKProvider and read the client via useSDK().
AgentStackProvider is an alias of SDKProvider (same implementation); prefer SDKProvider in new code.
import { SDKProvider, useSDK } from '@agentstack/react';
import { resolveAgentStackApiBase } from '@agentstack/sdk';
function App() {
return (
<SDKProvider
config={{
apiBase: resolveAgentStackApiBase(),
apiKey: import.meta.env.VITE_AGENTSTACK_API_KEY,
projectId: Number(import.meta.env.VITE_AGENTSTACK_PROJECT_ID),
}}
>
<YourRoutes />
</SDKProvider>
);
}
function ProjectsList() {
const sdk = useSDK();
// useSDKQuery(sdk, …) below
}| Hook | Use |
|---|---|
useSDKQuery |
Read with SDK client |
useSDKMutation |
Write |
useSDKInfiniteQuery |
Paginated lists |
useSDKMutationWithInvalidation |
Write + entity registry |
useEntityData |
CRUD list boilerplate |
import { useSDKQuery } from '@agentstack/react';
function ProjectList() {
const { data, isLoading, error } = useSDKQuery({
queryKey: ['projects'],
queryFn: (sdk) => sdk.platform.api.getProjects(),
});
if (isLoading) return <div>Loading…</div>;
if (error) return <div>Error</div>;
return (
<ul>
{(data ?? []).map((p) => (
<li key={p.id}>{p.name}</li>
))}
</ul>
);
}After command-bus writes, invalidate snapshots and React Query keys:
await sdk.platform.protocol.executeCommand({ /* … */ });
await sdk.platform.protocol.invalidateSnapshotPrefix('projects');
// In mutations: queryClient.invalidateQueries({ queryKey: ['projects'] })Monorepo helper: agentstack-frontend/src/lib/cacheInvalidation.ts.
useAdminUsers and related hooks require sdkAudience: 'platform_operator' (AgentStack monorepo only). See INTEGRATOR_SCOPE.md.
- AI_REACT_SCAFFOLD.md — agent scaffold
- packages/react/README.en.md