@assistant-ui/mcp-docs-server 0.1.36 → 0.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.docs/organized/code-examples/waterfall.md +8 -9
- package/.docs/organized/code-examples/with-a2a.md +16 -11
- package/.docs/organized/code-examples/with-ag-ui.md +16 -11
- package/.docs/organized/code-examples/{with-ai-sdk-v6.md → with-ai-sdk-v7.md} +32 -21
- package/.docs/organized/code-examples/with-artifacts.md +17 -10
- package/.docs/organized/code-examples/with-assistant-transport.md +15 -8
- package/.docs/organized/code-examples/with-browser-extension.md +15 -8
- package/.docs/organized/code-examples/with-chain-of-thought.md +17 -10
- package/.docs/organized/code-examples/with-cloud-standalone.md +10 -9
- package/.docs/organized/code-examples/with-cloud.md +18 -13
- package/.docs/organized/code-examples/with-custom-thread-list.md +17 -10
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +20 -13
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +20 -13
- package/.docs/organized/code-examples/with-eve.md +16 -9
- package/.docs/organized/code-examples/with-expo.md +26 -23
- package/.docs/organized/code-examples/with-external-store.md +16 -11
- package/.docs/organized/code-examples/with-ffmpeg.md +18 -13
- package/.docs/organized/code-examples/with-generative-ui.md +20 -15
- package/.docs/organized/code-examples/with-google-adk.md +16 -9
- package/.docs/organized/code-examples/with-heat-graph.md +8 -9
- package/.docs/organized/code-examples/with-image-generation.md +17 -10
- package/.docs/organized/code-examples/with-interactables.md +19 -15
- package/.docs/organized/code-examples/with-langchain.md +17 -10
- package/.docs/organized/code-examples/with-langgraph.md +17 -10
- package/.docs/organized/code-examples/with-livekit.md +21 -14
- package/.docs/organized/code-examples/with-mcp.md +40 -18
- package/.docs/organized/code-examples/with-opencode.md +22 -17
- package/.docs/organized/code-examples/with-pi.md +47 -12
- package/.docs/organized/code-examples/with-react-hook-form.md +19 -14
- package/.docs/organized/code-examples/with-react-ink-web.md +6 -6
- package/.docs/organized/code-examples/with-react-ink.md +2 -2
- package/.docs/organized/code-examples/with-react-router.md +20 -15
- package/.docs/organized/code-examples/with-resumable-stream.md +19 -12
- package/.docs/organized/code-examples/with-store.md +8 -9
- package/.docs/organized/code-examples/with-tanstack.md +17 -11
- package/.docs/organized/code-examples/with-tap-runtime.md +16 -11
- package/.docs/organized/code-examples/with-virtualized-thread.md +17 -12
- package/.docs/raw/docs/(docs)/base-ui.mdx +39 -0
- package/.docs/raw/docs/(docs)/cli.mdx +18 -2
- package/.docs/raw/docs/(docs)/installation.mdx +15 -1
- package/.docs/raw/docs/(docs)/rtl.mdx +2 -4
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/actions.mdx +56 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/components.mdx +86 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/index.mdx +19 -1
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/json-generative-ui.mdx +42 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/rendering.mdx +53 -2
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/slack.mdx +81 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/teams.mdx +86 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/tokens.mdx +62 -0
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +4 -1
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-ai-sdk.mdx +4 -2
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +37 -0
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +1 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +29 -29
- package/.docs/raw/docs/(reference)/api-reference/primitives/composition.mdx +1 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +3 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +2 -0
- package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +0 -2
- package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +12 -9
- package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +4 -0
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +7 -1
- package/.docs/raw/docs/cloud/langgraph.mdx +4 -2
- package/.docs/raw/docs/guides/chatgpt-subscription.mdx +108 -0
- package/.docs/raw/docs/guides/dictation.mdx +185 -257
- package/.docs/raw/docs/guides/index.mdx +10 -0
- package/.docs/raw/docs/guides/mentions.mdx +31 -3
- package/.docs/raw/docs/guides/resumable-streams.mdx +12 -1
- package/.docs/raw/docs/guides/speech.mdx +47 -29
- package/.docs/raw/docs/guides/suggestions.mdx +70 -1
- package/.docs/raw/docs/guides/voice.mdx +197 -267
- package/.docs/raw/docs/ink/primitives.mdx +35 -1
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +13 -7
- package/.docs/raw/docs/integrations/frameworks/cloudflare-agents/overview.mdx +3 -3
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +1 -1
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +3 -3
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +1 -1
- package/.docs/raw/docs/integrations/gateways/index.mdx +2 -2
- package/.docs/raw/docs/integrations/index.mdx +1 -1
- package/.docs/raw/docs/integrations/observability/helicone.mdx +1 -1
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +1 -1
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +3 -3
- package/.docs/raw/docs/migrations/index.mdx +50 -0
- package/.docs/raw/docs/migrations/react-langgraph-v0-7.mdx +2 -2
- package/.docs/raw/docs/migrations/toolkit-tools.mdx +4 -2
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +6 -1
- package/.docs/raw/docs/primitives/composer.mdx +16 -0
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +25 -0
- package/.docs/raw/docs/primitives/thread-list.mdx +30 -6
- package/.docs/raw/docs/react-native/primitives.mdx +23 -0
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +1 -1
- package/.docs/raw/docs/runtimes/ag-ui/agent-state.mdx +124 -0
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +1 -1
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +13 -2
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +13 -4
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +11 -11
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +5 -5
- package/.docs/raw/docs/runtimes/ai-sdk/{v6.mdx → v6-legacy.mdx} +8 -6
- package/.docs/raw/docs/runtimes/ai-sdk/v7.mdx +717 -0
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +1 -1
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +1 -1
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +10 -19
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +1 -1
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +2 -0
- package/.docs/raw/docs/runtimes/eve/overview.mdx +1 -1
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +1 -1
- package/.docs/raw/docs/runtimes/langchain.mdx +2 -2
- package/.docs/raw/docs/runtimes/langgraph/agent-state.mdx +181 -0
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +1 -1
- package/.docs/raw/docs/tools/backend.mdx +6 -3
- package/.docs/raw/docs/tools/defining-tools.mdx +12 -1
- package/.docs/raw/docs/tools/generative-ui.mdx +95 -0
- package/.docs/raw/docs/tools/mcp-apps.mdx +37 -10
- package/.docs/raw/docs/tools/mcp.mdx +105 -3
- package/.docs/raw/docs/tools/tool-ui.mdx +6 -4
- package/.docs/raw/docs/tools/user-managed-mcp.mdx +41 -4
- package/.docs/raw/docs/ui/accordion.mdx +16 -10
- package/.docs/raw/docs/ui/assistant-modal.mdx +8 -4
- package/.docs/raw/docs/ui/attachment.mdx +5 -1
- package/.docs/raw/docs/ui/badge.mdx +23 -12
- package/.docs/raw/docs/ui/follow-up-suggestions.mdx +80 -0
- package/.docs/raw/docs/ui/model-selector.mdx +69 -6
- package/.docs/raw/docs/ui/select.mdx +22 -14
- package/.docs/raw/docs/ui/sources.mdx +1 -1
- package/.docs/raw/docs/ui/tabs.mdx +25 -14
- package/.docs/raw/docs/utilities/heat-graph.mdx +2 -2
- package/README.md +1 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -1
- package/dist/prepare-docs/code-examples.d.ts.map +1 -1
- package/dist/prepare-docs/copy-raw.d.ts.map +1 -1
- package/dist/prepare-docs/copy-raw.js +0 -4
- package/dist/prepare-docs/copy-raw.js.map +1 -1
- package/dist/prompts/xulux-playground.d.ts +12 -0
- package/dist/prompts/xulux-playground.d.ts.map +1 -0
- package/dist/prompts/xulux-playground.js +33 -0
- package/dist/prompts/xulux-playground.js.map +1 -0
- package/dist/tools/docs.d.ts +2 -4
- package/dist/tools/docs.d.ts.map +1 -1
- package/dist/tools/docs.js +38 -10
- package/dist/tools/docs.js.map +1 -1
- package/dist/tools/examples.d.ts +5 -5
- package/dist/tools/examples.d.ts.map +1 -1
- package/dist/tools/examples.js +10 -7
- package/dist/tools/examples.js.map +1 -1
- package/dist/tools/resources.d.ts +6 -0
- package/dist/tools/resources.d.ts.map +1 -0
- package/dist/tools/resources.js +74 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/tools/search.d.ts +30 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +39 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/tests/test-setup.d.ts.map +1 -1
- package/dist/tools/tests/test-setup.js +7 -1
- package/dist/tools/tests/test-setup.js.map +1 -1
- package/dist/tools/xulux-templates.d.ts +72 -0
- package/dist/tools/xulux-templates.d.ts.map +1 -0
- package/dist/tools/xulux-templates.js +82 -0
- package/dist/tools/xulux-templates.js.map +1 -0
- package/dist/utils/cache.d.ts +5 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +18 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/mcp-format.d.ts +1 -0
- package/dist/utils/mcp-format.d.ts.map +1 -1
- package/dist/utils/mcp-format.js +7 -4
- package/dist/utils/mcp-format.js.map +1 -1
- package/dist/utils/mdx.d.ts +2 -1
- package/dist/utils/mdx.d.ts.map +1 -1
- package/dist/utils/mdx.js +19 -2
- package/dist/utils/mdx.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +20 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/search.d.ts +10 -0
- package/dist/utils/search.d.ts.map +1 -0
- package/dist/utils/search.js +97 -0
- package/dist/utils/search.js.map +1 -0
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/xulux/catalog-client.d.ts +14 -0
- package/dist/xulux/catalog-client.d.ts.map +1 -0
- package/dist/xulux/catalog-client.js +67 -0
- package/dist/xulux/catalog-client.js.map +1 -0
- package/dist/xulux/fallback-catalog.d.ts +7 -0
- package/dist/xulux/fallback-catalog.d.ts.map +1 -0
- package/dist/xulux/fallback-catalog.js +47 -0
- package/dist/xulux/fallback-catalog.js.map +1 -0
- package/dist/xulux/fetch-sandbox.d.ts +5 -0
- package/dist/xulux/fetch-sandbox.d.ts.map +1 -0
- package/dist/xulux/fetch-sandbox.js +40 -0
- package/dist/xulux/fetch-sandbox.js.map +1 -0
- package/dist/xulux/template-service.d.ts +84 -0
- package/dist/xulux/template-service.d.ts.map +1 -0
- package/dist/xulux/template-service.js +223 -0
- package/dist/xulux/template-service.js.map +1 -0
- package/dist/xulux/types.d.ts +55 -0
- package/dist/xulux/types.d.ts.map +1 -0
- package/dist/xulux/types.js +6 -0
- package/dist/xulux/types.js.map +1 -0
- package/package.json +5 -5
- package/src/constants.ts +2 -0
- package/src/index.ts +67 -0
- package/src/prepare-docs/copy-raw.ts +0 -5
- package/src/prompts/xulux-playground.ts +36 -0
- package/src/tools/docs.ts +52 -4
- package/src/tools/examples.ts +18 -11
- package/src/tools/resources.ts +114 -0
- package/src/tools/search.ts +46 -0
- package/src/tools/tests/completions.test.ts +46 -0
- package/src/tools/tests/directory-size-cap.test.ts +50 -0
- package/src/tools/tests/docs.test.ts +20 -0
- package/src/tools/tests/examples.test.ts +5 -5
- package/src/tools/tests/listings-cache.test.ts +19 -0
- package/src/tools/tests/mcp-protocol.test.ts +92 -1
- package/src/tools/tests/resources.test.ts +102 -0
- package/src/tools/tests/search.test.ts +37 -0
- package/src/tools/tests/test-setup.ts +10 -0
- package/src/tools/tests/xulux-templates.test.ts +262 -0
- package/src/tools/xulux-templates.ts +141 -0
- package/src/utils/cache.ts +20 -0
- package/src/utils/mcp-format.ts +8 -6
- package/src/utils/mdx.ts +21 -1
- package/src/utils/paths.ts +25 -0
- package/src/utils/search.ts +131 -0
- package/src/utils/tests/cache.test.ts +51 -0
- package/src/utils/tests/mcp-format.test.ts +22 -0
- package/src/utils/tests/security.test.ts +1 -1
- package/src/xulux/catalog-client.ts +105 -0
- package/src/xulux/fallback-catalog.ts +63 -0
- package/src/xulux/fetch-sandbox.ts +56 -0
- package/src/xulux/template-service.ts +406 -0
- package/src/xulux/types.ts +60 -0
- package/.docs/raw/blog/2024-07-29-hello/index.mdx +0 -64
- package/.docs/raw/blog/2024-09-11/index.mdx +0 -10
- package/.docs/raw/blog/2024-12-15/index.mdx +0 -10
- package/.docs/raw/blog/2025-01-31-changelog/index.mdx +0 -127
- package/.docs/raw/blog/2026-03-launch-week/index.mdx +0 -258
- package/.docs/raw/docs/(reference)/api-reference/hooks/utilities.mdx +0 -464
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { fetchSandboxResource } from "./fetch-sandbox.js";
|
|
2
|
+
import type {
|
|
3
|
+
XuluxCatalog,
|
|
4
|
+
XuluxCatalogTemplate,
|
|
5
|
+
XuluxCatalogVersion,
|
|
6
|
+
} from "./types.js";
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Local, catalog-backed template operations for the assistant-ui template MCP tools.
|
|
10
|
+
// These functions never mutate any UI. Preview operations only return URLs.
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
export interface ResolvedTemplate {
|
|
14
|
+
template: XuluxCatalogTemplate;
|
|
15
|
+
version: XuluxCatalogVersion | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Resolves a template by id, preserving the app-route semantics:
|
|
20
|
+
* - exact `templateId` match wins
|
|
21
|
+
* - version-specific entry ids (e.g. `webpage-assistant-product-docs`)
|
|
22
|
+
* remain valid inputs
|
|
23
|
+
* - explicit `versionId` wins when provided
|
|
24
|
+
* - otherwise the template's default version is used
|
|
25
|
+
*/
|
|
26
|
+
export function resolveTemplate(
|
|
27
|
+
catalog: XuluxCatalog,
|
|
28
|
+
templateId: string,
|
|
29
|
+
versionId?: string | undefined,
|
|
30
|
+
): ResolvedTemplate | null {
|
|
31
|
+
let template = catalog.templates.find(
|
|
32
|
+
(t) => t.templateId === templateId || t.id === templateId,
|
|
33
|
+
);
|
|
34
|
+
let impliedVersionId: string | undefined;
|
|
35
|
+
|
|
36
|
+
if (!template) {
|
|
37
|
+
// Version-specific entry id such as `webpage-assistant-product-docs`.
|
|
38
|
+
template = catalog.templates.find((t) =>
|
|
39
|
+
t.versions.some((v) => v.entryId === templateId),
|
|
40
|
+
);
|
|
41
|
+
if (template) {
|
|
42
|
+
impliedVersionId = template.versions.find(
|
|
43
|
+
(v) => v.entryId === templateId,
|
|
44
|
+
)?.id;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (!template) return null;
|
|
49
|
+
|
|
50
|
+
const effectiveVersionId =
|
|
51
|
+
versionId ?? impliedVersionId ?? template.versionId;
|
|
52
|
+
const version = effectiveVersionId
|
|
53
|
+
? (template.versions.find((v) => v.id === effectiveVersionId) ?? null)
|
|
54
|
+
: null;
|
|
55
|
+
|
|
56
|
+
return { template, version };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface TemplateListItem {
|
|
60
|
+
id: string;
|
|
61
|
+
name: string;
|
|
62
|
+
summary: string;
|
|
63
|
+
assistantPlacement: string;
|
|
64
|
+
features: string[];
|
|
65
|
+
customizable: string[];
|
|
66
|
+
versions: Array<{ id: string; name: string; description: string }>;
|
|
67
|
+
kind: "template" | "example";
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function listTemplates(catalog: XuluxCatalog): {
|
|
71
|
+
templates: TemplateListItem[];
|
|
72
|
+
} {
|
|
73
|
+
return {
|
|
74
|
+
templates: catalog.templates.map((t) => ({
|
|
75
|
+
id: t.templateId,
|
|
76
|
+
name: t.name,
|
|
77
|
+
summary: t.summary,
|
|
78
|
+
assistantPlacement: t.assistantPlacement,
|
|
79
|
+
features: t.features,
|
|
80
|
+
customizable: t.customizable,
|
|
81
|
+
versions: t.versions.map((v) => ({
|
|
82
|
+
id: v.id,
|
|
83
|
+
name: v.name,
|
|
84
|
+
description: v.description,
|
|
85
|
+
})),
|
|
86
|
+
kind: t.kind,
|
|
87
|
+
})),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function fetchTemplateContract(
|
|
92
|
+
sandboxBaseUrl: string,
|
|
93
|
+
versionId: string | null,
|
|
94
|
+
): Promise<Record<string, unknown> | null> {
|
|
95
|
+
try {
|
|
96
|
+
const url = new URL("/api/template/contract", sandboxBaseUrl);
|
|
97
|
+
if (versionId) url.searchParams.set("v", versionId);
|
|
98
|
+
const res = await fetchSandboxResource(url.toString());
|
|
99
|
+
if (!res.ok) return null;
|
|
100
|
+
return (await res.json()) as Record<string, unknown>;
|
|
101
|
+
} catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface TemplateDetails {
|
|
107
|
+
id: string;
|
|
108
|
+
name: string;
|
|
109
|
+
selectedVersionId: string | null;
|
|
110
|
+
summary: string;
|
|
111
|
+
assistantPlacement: string;
|
|
112
|
+
configRoots?: Record<string, unknown>;
|
|
113
|
+
rules: {
|
|
114
|
+
required: string[];
|
|
115
|
+
unsupported?: string[];
|
|
116
|
+
};
|
|
117
|
+
tools: {
|
|
118
|
+
builtIn: unknown[];
|
|
119
|
+
customToolSupported: boolean;
|
|
120
|
+
renderers: unknown[];
|
|
121
|
+
};
|
|
122
|
+
exampleConfig: Record<string, unknown> | null;
|
|
123
|
+
previewUrl?: string;
|
|
124
|
+
downloadUrl?: string;
|
|
125
|
+
warnings?: string[];
|
|
126
|
+
exampleConfigNote?: string;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface TemplateError {
|
|
130
|
+
error: string;
|
|
131
|
+
retryHint?: string;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export async function getTemplateDetails(
|
|
135
|
+
catalog: XuluxCatalog,
|
|
136
|
+
input: { templateId: string; versionId?: string | undefined },
|
|
137
|
+
): Promise<TemplateDetails | TemplateError> {
|
|
138
|
+
const resolved = resolveTemplate(catalog, input.templateId, input.versionId);
|
|
139
|
+
if (!resolved) {
|
|
140
|
+
return {
|
|
141
|
+
error: `Template "${input.templateId}" not found.`,
|
|
142
|
+
retryHint:
|
|
143
|
+
"Call assistantUITemplates and use one of the returned template ids.",
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const { template, version } = resolved;
|
|
148
|
+
|
|
149
|
+
if (template.kind === "example") {
|
|
150
|
+
return {
|
|
151
|
+
id: template.templateId,
|
|
152
|
+
name: template.name,
|
|
153
|
+
selectedVersionId: null,
|
|
154
|
+
summary: template.summary,
|
|
155
|
+
assistantPlacement: template.assistantPlacement,
|
|
156
|
+
rules: template.rules ?? {
|
|
157
|
+
required: [
|
|
158
|
+
"This entry is a fixed demo and is not schema-customizable.",
|
|
159
|
+
"Preview and download it as-is. Do not pass a config for this entry.",
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
tools: { builtIn: [], customToolSupported: false, renderers: [] },
|
|
163
|
+
exampleConfig: null,
|
|
164
|
+
...(template.previewUrl ? { previewUrl: template.previewUrl } : {}),
|
|
165
|
+
...(template.downloadUrl ? { downloadUrl: template.downloadUrl } : {}),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const selectedVersionId = version?.id ?? template.versionId;
|
|
170
|
+
|
|
171
|
+
if (!template.configRoots || !template.tools) {
|
|
172
|
+
return {
|
|
173
|
+
error: `No authoring schema found for template "${template.templateId}".`,
|
|
174
|
+
retryHint:
|
|
175
|
+
"The catalog may be in degraded fallback mode. Retry when live catalog access is restored.",
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
let exampleConfig: Record<string, unknown> | null = null;
|
|
180
|
+
let exampleConfigNote: string;
|
|
181
|
+
if (template.sandboxBaseUrl) {
|
|
182
|
+
const contract = await fetchTemplateContract(
|
|
183
|
+
template.sandboxBaseUrl,
|
|
184
|
+
selectedVersionId,
|
|
185
|
+
);
|
|
186
|
+
exampleConfig =
|
|
187
|
+
(contract?.exampleCompleteConfig as Record<string, unknown> | null) ??
|
|
188
|
+
null;
|
|
189
|
+
exampleConfigNote = exampleConfig
|
|
190
|
+
? `Resolved defaults for version "${selectedVersionId}". Use as a complete working starting point.`
|
|
191
|
+
: "Could not reach the template sandbox to resolve exampleConfig. Use configRoots schemas and defaults to author config manually.";
|
|
192
|
+
} else {
|
|
193
|
+
exampleConfigNote =
|
|
194
|
+
"This template has no sandbox URL in the catalog, so exampleConfig is unavailable. Use configRoots schemas and defaults.";
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
id: template.templateId,
|
|
199
|
+
name: template.name,
|
|
200
|
+
selectedVersionId,
|
|
201
|
+
summary: template.summary,
|
|
202
|
+
assistantPlacement: template.assistantPlacement,
|
|
203
|
+
configRoots: template.configRoots,
|
|
204
|
+
rules: template.rules ?? { required: [] },
|
|
205
|
+
tools: template.tools,
|
|
206
|
+
exampleConfig,
|
|
207
|
+
exampleConfigNote,
|
|
208
|
+
...(version?.previewUrl
|
|
209
|
+
? { previewUrl: version.previewUrl }
|
|
210
|
+
: template.previewUrl
|
|
211
|
+
? { previewUrl: template.previewUrl }
|
|
212
|
+
: {}),
|
|
213
|
+
...(version?.downloadUrl
|
|
214
|
+
? { downloadUrl: version.downloadUrl }
|
|
215
|
+
: template.downloadUrl
|
|
216
|
+
? { downloadUrl: template.downloadUrl }
|
|
217
|
+
: {}),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function toAbsolute(baseUrl: string, url: string): string {
|
|
222
|
+
if (/^https?:\/\//.test(url)) return url;
|
|
223
|
+
return `${baseUrl}${url.startsWith("/") ? "" : "/"}${url}`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function withVersion(url: string, versionId: string | undefined): string {
|
|
227
|
+
if (!versionId) return url;
|
|
228
|
+
const [path, query = ""] = url.split("?");
|
|
229
|
+
const params = new URLSearchParams(query);
|
|
230
|
+
if (!params.has("v")) params.set("v", versionId);
|
|
231
|
+
return `${path}?${params.toString()}`;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function hasConfig(config: Record<string, unknown> | undefined): boolean {
|
|
235
|
+
return !!config && Object.keys(config).length > 0;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface TemplatePreviewResult {
|
|
239
|
+
success: boolean;
|
|
240
|
+
templateId: string;
|
|
241
|
+
versionId: string | null;
|
|
242
|
+
previewUrl?: string;
|
|
243
|
+
downloadUrl?: string;
|
|
244
|
+
title?: string;
|
|
245
|
+
customized?: boolean;
|
|
246
|
+
validationWarnings?: unknown[];
|
|
247
|
+
error?: string;
|
|
248
|
+
retryHint?: string;
|
|
249
|
+
details?: string;
|
|
250
|
+
summary?: string;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export async function createTemplatePreview(
|
|
254
|
+
catalog: XuluxCatalog,
|
|
255
|
+
input: {
|
|
256
|
+
templateId: string;
|
|
257
|
+
versionId?: string | undefined;
|
|
258
|
+
config?: Record<string, unknown> | undefined;
|
|
259
|
+
},
|
|
260
|
+
): Promise<TemplatePreviewResult> {
|
|
261
|
+
const resolved = resolveTemplate(catalog, input.templateId, input.versionId);
|
|
262
|
+
if (!resolved) {
|
|
263
|
+
return {
|
|
264
|
+
success: false,
|
|
265
|
+
templateId: input.templateId,
|
|
266
|
+
versionId: input.versionId ?? null,
|
|
267
|
+
error: `Template "${input.templateId}" not found.`,
|
|
268
|
+
retryHint:
|
|
269
|
+
"Call assistantUITemplates and use one of the returned template ids.",
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const { template, version } = resolved;
|
|
274
|
+
const tid = template.templateId;
|
|
275
|
+
|
|
276
|
+
if (template.kind === "example") {
|
|
277
|
+
if (hasConfig(input.config)) {
|
|
278
|
+
return {
|
|
279
|
+
success: false,
|
|
280
|
+
templateId: tid,
|
|
281
|
+
versionId: null,
|
|
282
|
+
error: `Template "${tid}" is a fixed demo and does not support config.`,
|
|
283
|
+
retryHint:
|
|
284
|
+
"Call assistantUITemplateDetails for this template. If no configRoots are returned, call assistantUITemplatePreview again without config or choose a configurable hosted template.",
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (!template.previewUrl) {
|
|
289
|
+
return {
|
|
290
|
+
success: false,
|
|
291
|
+
templateId: tid,
|
|
292
|
+
versionId: null,
|
|
293
|
+
error: `Fixed demo "${tid}" has no preview URL in the catalog.`,
|
|
294
|
+
retryHint:
|
|
295
|
+
"The catalog may be in degraded fallback mode. Retry when live catalog access is restored.",
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return {
|
|
300
|
+
success: true,
|
|
301
|
+
templateId: tid,
|
|
302
|
+
versionId: null,
|
|
303
|
+
previewUrl: template.previewUrl,
|
|
304
|
+
...(template.downloadUrl ? { downloadUrl: template.downloadUrl } : {}),
|
|
305
|
+
title: template.name,
|
|
306
|
+
customized: false,
|
|
307
|
+
summary: `Resolved ${template.name} as a fixed demo. Preview and download URLs point at hosted resources; nothing was opened in any UI.`,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const baseUrl = template.sandboxBaseUrl;
|
|
312
|
+
if (!baseUrl) {
|
|
313
|
+
return {
|
|
314
|
+
success: false,
|
|
315
|
+
templateId: tid,
|
|
316
|
+
versionId: version?.id ?? template.versionId,
|
|
317
|
+
error: `Template "${tid}" has no sandbox URL in the catalog.`,
|
|
318
|
+
retryHint:
|
|
319
|
+
"The catalog may be in degraded fallback mode. Retry when live catalog access is restored.",
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const effectiveVersionId = version?.id ?? template.versionId;
|
|
324
|
+
|
|
325
|
+
if (hasConfig(input.config)) {
|
|
326
|
+
try {
|
|
327
|
+
const sessionUrl = new URL("/api/preview/session", baseUrl);
|
|
328
|
+
if (effectiveVersionId)
|
|
329
|
+
sessionUrl.searchParams.set("v", effectiveVersionId);
|
|
330
|
+
const res = await fetchSandboxResource(sessionUrl.toString(), {
|
|
331
|
+
method: "POST",
|
|
332
|
+
headers: { "Content-Type": "application/json" },
|
|
333
|
+
body: JSON.stringify(input.config),
|
|
334
|
+
});
|
|
335
|
+
if (!res.ok) {
|
|
336
|
+
const details = await res.text();
|
|
337
|
+
return {
|
|
338
|
+
success: false,
|
|
339
|
+
templateId: tid,
|
|
340
|
+
versionId: effectiveVersionId,
|
|
341
|
+
error: `Preview session failed: HTTP ${res.status}`,
|
|
342
|
+
details,
|
|
343
|
+
retryHint:
|
|
344
|
+
"Check validationWarnings for the specific fields that failed. " +
|
|
345
|
+
"Call assistantUITemplateDetails for this template and use configRoots schemas to correct the config. " +
|
|
346
|
+
"Pass only hostUi, assistant, and brandTheme at the top level.",
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
const data = (await res.json()) as {
|
|
350
|
+
previewUrl?: string;
|
|
351
|
+
downloadUrl?: string;
|
|
352
|
+
validationWarnings?: unknown[];
|
|
353
|
+
};
|
|
354
|
+
if (!data.previewUrl) {
|
|
355
|
+
return {
|
|
356
|
+
success: false,
|
|
357
|
+
templateId: tid,
|
|
358
|
+
versionId: effectiveVersionId,
|
|
359
|
+
error: "Session endpoint did not return a previewUrl.",
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
success: true,
|
|
364
|
+
templateId: tid,
|
|
365
|
+
versionId: effectiveVersionId,
|
|
366
|
+
previewUrl: toAbsolute(
|
|
367
|
+
baseUrl,
|
|
368
|
+
withVersion(data.previewUrl, effectiveVersionId ?? undefined),
|
|
369
|
+
),
|
|
370
|
+
downloadUrl: toAbsolute(
|
|
371
|
+
baseUrl,
|
|
372
|
+
withVersion(
|
|
373
|
+
data.downloadUrl ?? "/api/download",
|
|
374
|
+
effectiveVersionId ?? undefined,
|
|
375
|
+
),
|
|
376
|
+
),
|
|
377
|
+
title: version?.name ?? template.name,
|
|
378
|
+
customized: true,
|
|
379
|
+
summary: `Created a configured preview session for ${template.name}. URLs point at the hosted sandbox; nothing was opened in any UI.`,
|
|
380
|
+
validationWarnings: data.validationWarnings ?? [],
|
|
381
|
+
};
|
|
382
|
+
} catch (err) {
|
|
383
|
+
return {
|
|
384
|
+
success: false,
|
|
385
|
+
templateId: tid,
|
|
386
|
+
versionId: effectiveVersionId,
|
|
387
|
+
error: err instanceof Error ? err.message : String(err),
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const previewUrl = version?.previewUrl ?? template.previewUrl;
|
|
393
|
+
const downloadUrl =
|
|
394
|
+
version?.downloadUrl ?? template.downloadUrl ?? `${baseUrl}/api/download`;
|
|
395
|
+
|
|
396
|
+
return {
|
|
397
|
+
success: true,
|
|
398
|
+
templateId: tid,
|
|
399
|
+
versionId: effectiveVersionId,
|
|
400
|
+
previewUrl: previewUrl ?? baseUrl,
|
|
401
|
+
downloadUrl,
|
|
402
|
+
title: version?.name ?? template.name,
|
|
403
|
+
customized: false,
|
|
404
|
+
summary: `Resolved preview and download URLs for ${template.name}. Nothing was opened in any UI.`,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// MCP-safe assistant-ui template catalog types. These mirror the payload served by the docs
|
|
2
|
+
// app at GET /api/xulux/mcp-catalog. The MCP package never imports docs-app
|
|
3
|
+
// internals; the endpoint payload is the contract.
|
|
4
|
+
|
|
5
|
+
export const XULUX_MCP_CATALOG_VERSION = 1;
|
|
6
|
+
|
|
7
|
+
export interface XuluxCatalogVersion {
|
|
8
|
+
id: string;
|
|
9
|
+
entryId: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
previewUrl: string;
|
|
13
|
+
downloadUrl: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface XuluxCatalogTemplate {
|
|
17
|
+
id: string;
|
|
18
|
+
templateId: string;
|
|
19
|
+
versionId: string | null;
|
|
20
|
+
kind: "template" | "example";
|
|
21
|
+
name: string;
|
|
22
|
+
summary: string;
|
|
23
|
+
assistantPlacement: string;
|
|
24
|
+
features: string[];
|
|
25
|
+
customizable: string[];
|
|
26
|
+
versions: XuluxCatalogVersion[];
|
|
27
|
+
previewUrl?: string;
|
|
28
|
+
downloadUrl?: string;
|
|
29
|
+
sandboxBaseUrl?: string;
|
|
30
|
+
configRoots?: Record<string, unknown>;
|
|
31
|
+
rules?: {
|
|
32
|
+
required: string[];
|
|
33
|
+
unsupported?: string[];
|
|
34
|
+
};
|
|
35
|
+
tools?: {
|
|
36
|
+
builtIn: unknown[];
|
|
37
|
+
customToolSupported: boolean;
|
|
38
|
+
renderers: unknown[];
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface XuluxCatalog {
|
|
43
|
+
version: number;
|
|
44
|
+
generatedAt: string;
|
|
45
|
+
docsOrigin: string;
|
|
46
|
+
templates: XuluxCatalogTemplate[];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface XuluxCatalogResult {
|
|
50
|
+
catalog: XuluxCatalog;
|
|
51
|
+
/** True when the bundled fallback catalog was used instead of live data. */
|
|
52
|
+
degraded: boolean;
|
|
53
|
+
/** Present when the live fetch failed and the fallback was used. */
|
|
54
|
+
degradedReason?: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface XuluxCatalogError {
|
|
58
|
+
error: string;
|
|
59
|
+
hint?: string;
|
|
60
|
+
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Hello, assistant-ui
|
|
3
|
-
description: assistant-ui is an open-source AI chat component for React.
|
|
4
|
-
author: Simon Farshid
|
|
5
|
-
date: 2024-07-29T12:00:00
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
import Image from "next/image";
|
|
9
|
-
import { TestimonialContainer } from "@/components/home/testimonials/testimonials";
|
|
10
|
-
import { BLOG_TESTIMONIALS } from "@/components/home/testimonials/data";
|
|
11
|
-
import npmDownloads from "./npm-downloads.png";
|
|
12
|
-
import assistantUi from "./assistant-ui-screenshot.png";
|
|
13
|
-
|
|
14
|
-
After spending the last two years building Gen-AI prototypes and products, I realized that all software will soon have a natural language interface. OpenAI's ChatGPT sets the quality bar high and I wanted to have a similar UX in my own apps. No solution on the market came anywhere close, so I built assistant-ui.
|
|
15
|
-
|
|
16
|
-
assistant-ui is an open-source, embeddable, customizable AI chat component for React web apps. You can use it to build GPT wrappers, in-app copilots, or agentic systems. It supports rich content (markdown, code highlighting, charts, tables), generative UI, message editing, ..., across all the major model providers.
|
|
17
|
-
|
|
18
|
-
<Image
|
|
19
|
-
src={assistantUi}
|
|
20
|
-
alt="screenshot of assistant-ui"
|
|
21
|
-
width={398}
|
|
22
|
-
height={498}
|
|
23
|
-
className="mx-auto rounded-xl border drop-shadow"
|
|
24
|
-
/>
|
|
25
|
-
|
|
26
|
-
Earlier last month, I released the project to the world. The feedback from early adopters has been overwhelmingly positive:
|
|
27
|
-
|
|
28
|
-
<div className="not-prose mx-auto max-w-md">
|
|
29
|
-
<TestimonialContainer testimonials={BLOG_TESTIMONIALS} />
|
|
30
|
-
</div>
|
|
31
|
-
|
|
32
|
-
It didn't take long for developers to start building with assistant-ui. Here are some of my favorite products from the community:
|
|
33
|
-
|
|
34
|
-
- [Helicone](https://helicone.ai/) - open-source LLM observability platform
|
|
35
|
-
- [screenpipe](https://screenpi.pe/) - AI to remember everything you see, say or hear
|
|
36
|
-
- [myresume.guru](http://myresume.guru) - AI resume optimizer to land your dream job
|
|
37
|
-
|
|
38
|
-
With 250+ stars on [GitHub](https://github.com/assistant-ui/assistant-ui) and over 1k [npm](https://www.npmjs.com/package/@assistant-ui/react) weekly downloads, we got a vibrant growing community of developers who care about the user experience.
|
|
39
|
-
|
|
40
|
-
<Image
|
|
41
|
-
src={npmDownloads}
|
|
42
|
-
alt="graph showing 1355 weekly npm downloads"
|
|
43
|
-
width={381}
|
|
44
|
-
height={94}
|
|
45
|
-
className="mx-auto dark:hue-rotate-180 dark:invert"
|
|
46
|
-
/>
|
|
47
|
-
|
|
48
|
-
I want to thank the following contributors who got the project to where it is today:
|
|
49
|
-
|
|
50
|
-
- [@m13v](https://github.com/m13v) for contributing two examples and several how-to videos
|
|
51
|
-
- [@okisdev](https://github.com/okisdev) for multiple bugfixes
|
|
52
|
-
- [@Rajaniraiyn](https://github.com/Rajaniraiyn) for improving streaming support for REST APIs
|
|
53
|
-
- @ccbkai for integrating Chrome's `window.ai` with assistant-ui
|
|
54
|
-
- [@stingfeng](https://github.com/stingfeng/dify-extensions) for building a [Dify](https://dify.ai) integration
|
|
55
|
-
- [@Ephibbs](https://github.com/Ephibbs/flowtoken) for building a Perplexity-style text streaming library ([Demo](https://assistant-ui-flowtoken-demo.vercel.app/))
|
|
56
|
-
- … and so many others
|
|
57
|
-
|
|
58
|
-
assistant-ui builds on top of [Radix UI](https://www.radix-ui.com/), [Tailwind](https://tailwindcss.com/), [shadcn/ui](https://ui.shadcn.com/), [Vercel AI SDK](https://sdk.vercel.ai/docs/introduction) and other amazing open-source projects.
|
|
59
|
-
|
|
60
|
-
Over the coming month, I'll be rolling out multimodal support, so you can use your voice and upload images. There's so much more in the pipeline that I can't wait to unveil!
|
|
61
|
-
|
|
62
|
-
Today, several companies like [Helicone (YC W23)](https://x.com/justinstorre/status/1816849882612904156) are using assistant-ui to power a core part of their product. If your company wants to do the same, please [get in touch](https://cal.com/simon-farshid/assistant-ui).
|
|
63
|
-
|
|
64
|
-
If you're building conversational AI, join us on [Discord](https://discord.gg/S9dwgCNEFs). If you're technical and want to shape how we interact with AIs of the future, [send me an email](mailto:simon@assistant-ui.com).
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: January 2025 Changelog
|
|
3
|
-
description: shadcn/ui, Thread Management, Improvements to AI SDK and LangGraph support
|
|
4
|
-
author: Simon Farshid
|
|
5
|
-
date: 2025-01-31T12:00:00
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
<Callout emoji="🎉">
|
|
9
|
-
This is the first edition of our changelog. We post these updates on a monthly
|
|
10
|
-
basis. If you want more frequent updates about our new features, join our
|
|
11
|
-
Discord where we have a `#changelog` channel that is updated on a daily basis.
|
|
12
|
-
</Callout>
|
|
13
|
-
|
|
14
|
-
## Summary
|
|
15
|
-
|
|
16
|
-
In January, we shipped 36 new versions of our package `@assistant-ui/react`. We also crossed 10k weekly downloads on npm for the first time. 🎉
|
|
17
|
-
|
|
18
|
-
## shadcn/ui CLI support
|
|
19
|
-
|
|
20
|
-
You can now install all components using the shadcn CLI, e.g.
|
|
21
|
-
|
|
22
|
-
```sh
|
|
23
|
-
npx shadcn@latest add "https://r.assistant-ui.com/thread"
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
We began a migration towards distributing our components as unstyled primitives and using the shadcn CLI to drop styles in your project.
|
|
27
|
-
|
|
28
|
-
## Styled components moved to @assistant-ui/react-ui
|
|
29
|
-
|
|
30
|
-
All styled components (Thread, ThreadList, AssistantModal, makeMarkdownText, etc.) have been moved to a new package, `@assistant-ui/ui`.
|
|
31
|
-
|
|
32
|
-
To ease the migration, we added a migration codemod:
|
|
33
|
-
|
|
34
|
-
```sh
|
|
35
|
-
npx assistant-ui upgrade
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
This will update your codebase to use the new package. This new package remains supported, however, based on the learnings from existing users, we recommend all new projects to use our shadcn/ui CLI instead.
|
|
39
|
-
|
|
40
|
-
## Customizing the max-width of the Thread
|
|
41
|
-
|
|
42
|
-
You can now customize the max-width of the thread via `--aui-thread-max-width` CSS variable.
|
|
43
|
-
|
|
44
|
-
## Thread Management
|
|
45
|
-
|
|
46
|
-
One of our main focus areas in this month was on the new Thread Management API. The new ThreadList API is available under `runtime.threads`. It allows you to create, switch to, rename, archive, and delete threads.
|
|
47
|
-
|
|
48
|
-
We shipped a `<ThreadList />` component which gives the user the UI to manage their threads.
|
|
49
|
-
|
|
50
|
-
We also shipped a few hooks `useThreadListItem()`, `useThreadListItemRuntime()`, `useRemoteThreadListRuntime()` and `useCloudThreadListRuntime()`.
|
|
51
|
-
|
|
52
|
-
## Assistant Cloud
|
|
53
|
-
|
|
54
|
-
We rolled out the new Assistant Cloud service to early users. This is a managed service for persistence, chat history, and thread management.
|
|
55
|
-
Our runtimes are being upgraded to support Assistant Cloud natively by letting you pass a `cloud` object to the runtime hook.
|
|
56
|
-
|
|
57
|
-
Keep an eye out for the public announcement of Assistant Cloud in a few days.
|
|
58
|
-
|
|
59
|
-
## Improvements to our LangGraph Integration
|
|
60
|
-
|
|
61
|
-
- We now have full support for LangGraph's `interrupt()`/`Command` API. You can check out the new example repository [here](https://github.com/assistant-ui/assistant-ui-langgraph-interrupt).
|
|
62
|
-
- We now also support starting LangGraph runs without a user message (based on button input or other events).
|
|
63
|
-
- Cancellation of runs is now supported via an `abortSignal` being passed to the LangGraph runtime adapter.
|
|
64
|
-
|
|
65
|
-
## Improvements to our AI SDK Integration
|
|
66
|
-
|
|
67
|
-
We now give you access to annotations and data packets in the assistant message:
|
|
68
|
-
|
|
69
|
-
```tsx
|
|
70
|
-
type AssistantMessage = {
|
|
71
|
-
metadata: {
|
|
72
|
-
unstable_annotations: [...],
|
|
73
|
-
unstable_data: [...],
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## AI SDK recommended for new projects
|
|
79
|
-
|
|
80
|
-
For new projects, we recommend using the AI SDK integration. Previously, we recommended our custom SDK called `useEdgeRuntime`.
|
|
81
|
-
With our improved AI SDK integration, we believe it is time to recommend AI SDK for new projects, giving you access to the AI SDK ecosystem.
|
|
82
|
-
|
|
83
|
-
The edge runtime remains maintained and supported for existing projects.
|
|
84
|
-
|
|
85
|
-
## Misc
|
|
86
|
-
|
|
87
|
-
- **Refactors & API Enhancements**:
|
|
88
|
-
|
|
89
|
-
- Renamed `ModelConfig` to `ModelContext`.
|
|
90
|
-
- Moved `switchToThread / switchToNewThread` under `runtime.threads`.
|
|
91
|
-
- Deprecated `UIContentPart`.
|
|
92
|
-
- `ToolCallContentPart.args` is now a `JSONObject`.
|
|
93
|
-
- `MessagePrimitive.tools.Override` introduced.
|
|
94
|
-
- Added `AppendMessage.sourceId` to provide better tracking.
|
|
95
|
-
- Reverse order of threads in `useRemoteThreadListRuntime` for better visibility.
|
|
96
|
-
- Added `threads.getById` and `threads.main` APIs.
|
|
97
|
-
- Introduced `AssistantCloudThreadHistoryAdapter` to handle cloud-based thread history.
|
|
98
|
-
- Auto-injection of history adapter in the local runtime.
|
|
99
|
-
- Tool call `id` + `args` are now optional in `ThreadMessageLike`.
|
|
100
|
-
- Added `ThreadListPrimitive.Root`.
|
|
101
|
-
- `ComposerRuntime.clearAttachments` API added.
|
|
102
|
-
- Improved input support for IME keyboards (e.g., Chinese, Japanese, Korean).
|
|
103
|
-
- Moved repository to a new GitHub organization (`assistant-ui/assistant-ui`).
|
|
104
|
-
|
|
105
|
-
- **External Store & Data Handling**:
|
|
106
|
-
|
|
107
|
-
- Enhanced `ExternalStoreAdapter` to support metadata and attachments.
|
|
108
|
-
- Renamed `getExternalStoreMessage` to `getExternalStoreMessages`.
|
|
109
|
-
- Tool call `args` streaming support in our Python SDK.
|
|
110
|
-
|
|
111
|
-
- **User Interface & Styling**:
|
|
112
|
-
|
|
113
|
-
- Styled UI assistant message footer.
|
|
114
|
-
- Improved attachment filename handling to prevent overflow.
|
|
115
|
-
- Renamed CSS class to `aui-thread-welcome-suggestions`.
|
|
116
|
-
|
|
117
|
-
- **Performance Optimizations**:
|
|
118
|
-
|
|
119
|
-
- Memoized `MessageRepository.getMessages()` for better efficiency.
|
|
120
|
-
- Marked `ChatAdapter` types as readonly.
|
|
121
|
-
|
|
122
|
-
- **Bug Fixes**:
|
|
123
|
-
|
|
124
|
-
- Fixed event subscription issues in thread lists.
|
|
125
|
-
- Fixed import errors in React server environments.
|
|
126
|
-
- Prevented excessive classes being included via TailwindCSS.
|
|
127
|
-
- Fixed AI SDK annotation packet errors.
|