@tambo-ai/react 0.74.1 → 0.75.0
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/README.md +46 -449
- package/dist/hoc/with-tambo-interactable.d.ts +8 -0
- package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/dist/hoc/with-tambo-interactable.js +5 -2
- package/dist/hoc/with-tambo-interactable.js.map +1 -1
- package/dist/hoc/with-tambo-interactable.test.js +12 -0
- package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
- package/dist/hooks/use-tambo-voice.test.js +3 -0
- package/dist/hooks/use-tambo-voice.test.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +69 -0
- package/dist/mcp/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.test.js +24 -0
- package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/dist/mcp/use-mcp-servers.test.js +9 -0
- package/dist/mcp/use-mcp-servers.test.js.map +1 -1
- package/dist/model/component-metadata.d.ts +4 -4
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +6 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +4 -1
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +8 -0
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.test.js +47 -0
- package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +4 -1
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-stubs.d.ts.map +1 -1
- package/dist/providers/tambo-stubs.js +3 -0
- package/dist/providers/tambo-stubs.js.map +1 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +3 -0
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/tambo-thread-provider.test.js +3 -0
- package/dist/providers/tambo-thread-provider.test.js.map +1 -1
- package/dist/util/registry-validators.js +1 -1
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/util/resource-content-resolver.test.js +1 -1
- package/dist/util/resource-content-resolver.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.js +48 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +105 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +68 -21
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +8 -0
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +86 -9
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +4 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.js +4 -0
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +6 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +11 -0
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +5 -0
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +13 -0
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +4 -1
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +5 -2
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +16 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +42 -5
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +19 -2
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +6 -0
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +50 -11
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +9 -0
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +4 -0
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +10 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/auth.d.ts +24 -0
- package/dist/v1/types/auth.d.ts.map +1 -0
- package/dist/v1/types/auth.js +3 -0
- package/dist/v1/types/auth.js.map +1 -0
- package/dist/v1/types/message.d.ts +12 -0
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/types/tool-choice.d.ts +8 -0
- package/dist/v1/types/tool-choice.d.ts.map +1 -0
- package/dist/v1/types/tool-choice.js +3 -0
- package/dist/v1/types/tool-choice.js.map +1 -0
- package/dist/v1/utils/event-accumulator.d.ts +28 -2
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
- package/dist/v1/utils/event-accumulator.js +67 -15
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +106 -0
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/keyed-throttle.d.ts +42 -0
- package/dist/v1/utils/keyed-throttle.d.ts.map +1 -0
- package/dist/v1/utils/keyed-throttle.js +86 -0
- package/dist/v1/utils/keyed-throttle.js.map +1 -0
- package/dist/v1/utils/keyed-throttle.test.d.ts +2 -0
- package/dist/v1/utils/keyed-throttle.test.d.ts.map +1 -0
- package/dist/v1/utils/keyed-throttle.test.js +147 -0
- package/dist/v1/utils/keyed-throttle.test.js.map +1 -0
- package/dist/v1/utils/registry-conversion.d.ts.map +1 -1
- package/dist/v1/utils/registry-conversion.js +2 -0
- package/dist/v1/utils/registry-conversion.js.map +1 -1
- package/dist/v1/utils/registry-conversion.test.js +23 -0
- package/dist/v1/utils/registry-conversion.test.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.d.ts +10 -0
- package/dist/v1/utils/tool-call-tracker.d.ts.map +1 -1
- package/dist/v1/utils/tool-call-tracker.js +13 -0
- package/dist/v1/utils/tool-call-tracker.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.test.d.ts +2 -0
- package/dist/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
- package/dist/v1/utils/tool-call-tracker.test.js +67 -0
- package/dist/v1/utils/tool-call-tracker.test.js.map +1 -0
- package/dist/v1/utils/tool-executor.d.ts +34 -0
- package/dist/v1/utils/tool-executor.d.ts.map +1 -1
- package/dist/v1/utils/tool-executor.js +55 -0
- package/dist/v1/utils/tool-executor.js.map +1 -1
- package/dist/v1/utils/tool-executor.test.js +211 -0
- package/dist/v1/utils/tool-executor.test.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.d.ts +8 -0
- package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/esm/hoc/with-tambo-interactable.js +5 -2
- package/esm/hoc/with-tambo-interactable.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.test.js +12 -0
- package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
- package/esm/hooks/use-tambo-voice.test.js +3 -0
- package/esm/hooks/use-tambo-voice.test.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +69 -0
- package/esm/mcp/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.test.js +24 -0
- package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/esm/mcp/use-mcp-servers.test.js +9 -0
- package/esm/mcp/use-mcp-servers.test.js.map +1 -1
- package/esm/model/component-metadata.d.ts +4 -4
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +6 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +4 -1
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +8 -0
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.test.js +47 -0
- package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +4 -1
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-stubs.d.ts.map +1 -1
- package/esm/providers/tambo-stubs.js +3 -0
- package/esm/providers/tambo-stubs.js.map +1 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +3 -0
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/tambo-thread-provider.test.js +3 -0
- package/esm/providers/tambo-thread-provider.test.js.map +1 -1
- package/esm/util/registry-validators.js +1 -1
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/util/resource-content-resolver.test.js +1 -1
- package/esm/util/resource-content-resolver.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.js +45 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +100 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +68 -21
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +8 -0
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +87 -10
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +2 -2
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +4 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.js +4 -0
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -0
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +11 -0
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +5 -0
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +13 -0
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +4 -1
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +3 -1
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +16 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +43 -6
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +19 -2
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +6 -0
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +51 -12
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +9 -0
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +4 -0
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +10 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/auth.d.ts +24 -0
- package/esm/v1/types/auth.d.ts.map +1 -0
- package/esm/v1/types/auth.js +2 -0
- package/esm/v1/types/auth.js.map +1 -0
- package/esm/v1/types/message.d.ts +12 -0
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/types/tool-choice.d.ts +8 -0
- package/esm/v1/types/tool-choice.d.ts.map +1 -0
- package/esm/v1/types/tool-choice.js +2 -0
- package/esm/v1/types/tool-choice.js.map +1 -0
- package/esm/v1/utils/event-accumulator.d.ts +28 -2
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
- package/esm/v1/utils/event-accumulator.js +66 -15
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +106 -0
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/keyed-throttle.d.ts +42 -0
- package/esm/v1/utils/keyed-throttle.d.ts.map +1 -0
- package/esm/v1/utils/keyed-throttle.js +83 -0
- package/esm/v1/utils/keyed-throttle.js.map +1 -0
- package/esm/v1/utils/keyed-throttle.test.d.ts +2 -0
- package/esm/v1/utils/keyed-throttle.test.d.ts.map +1 -0
- package/esm/v1/utils/keyed-throttle.test.js +145 -0
- package/esm/v1/utils/keyed-throttle.test.js.map +1 -0
- package/esm/v1/utils/registry-conversion.d.ts.map +1 -1
- package/esm/v1/utils/registry-conversion.js +2 -0
- package/esm/v1/utils/registry-conversion.js.map +1 -1
- package/esm/v1/utils/registry-conversion.test.js +23 -0
- package/esm/v1/utils/registry-conversion.test.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.d.ts +10 -0
- package/esm/v1/utils/tool-call-tracker.d.ts.map +1 -1
- package/esm/v1/utils/tool-call-tracker.js +13 -0
- package/esm/v1/utils/tool-call-tracker.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.test.d.ts +2 -0
- package/esm/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
- package/esm/v1/utils/tool-call-tracker.test.js +65 -0
- package/esm/v1/utils/tool-call-tracker.test.js.map +1 -0
- package/esm/v1/utils/tool-executor.d.ts +34 -0
- package/esm/v1/utils/tool-executor.d.ts.map +1 -1
- package/esm/v1/utils/tool-executor.js +53 -0
- package/esm/v1/utils/tool-executor.js.map +1 -1
- package/esm/v1/utils/tool-executor.test.js +212 -1
- package/esm/v1/utils/tool-executor.test.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<h1>@tambo-ai/react</h1>
|
|
3
|
-
<h3>
|
|
4
|
-
<p>
|
|
3
|
+
<h3>Build agents that speak your UI</h3>
|
|
4
|
+
<p>The open-source generative UI toolkit for React.</p>
|
|
5
5
|
</div>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="https://www.npmjs.com/package/@tambo-ai/react"><img src="https://img.shields.io/npm/v/%40tambo-ai%2Freact?logo=npm" alt="npm version" /></a>
|
|
9
9
|
<a href="https://github.com/tambo-ai/tambo/blob/main/LICENSE"><img src="https://img.shields.io/github/license/tambo-ai/tambo" alt="License" /></a>
|
|
10
|
+
<a href="https://github.com/tambo-ai/tambo"><img src="https://img.shields.io/github/stars/tambo-ai/tambo" alt="GitHub stars" /></a>
|
|
10
11
|
<a href="https://discord.gg/dJNvPEHth6"><img src="https://img.shields.io/discord/1251581895414911016?color=7289da&label=discord" alt="Discord"></a>
|
|
11
12
|
</p>
|
|
12
13
|
|
|
13
14
|
<p align="center">
|
|
14
|
-
<a href="https://
|
|
15
|
-
<a href="https://docs.tambo.co
|
|
15
|
+
<a href="https://github.com/tambo-ai/tambo">⭐ Star us on GitHub</a> •
|
|
16
|
+
<a href="https://docs.tambo.co">Docs</a> •
|
|
16
17
|
<a href="https://discord.gg/dJNvPEHth6">Discord</a>
|
|
17
18
|
</p>
|
|
18
19
|
|
|
@@ -20,54 +21,23 @@
|
|
|
20
21
|
|
|
21
22
|
## What is Tambo?
|
|
22
23
|
|
|
23
|
-
Tambo is a
|
|
24
|
+
Tambo is a React toolkit for building agents that render UI (also known as generative UI).
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Most software is built around a one-size-fits-all mental model that doesn't fit every user.
|
|
28
|
-
|
|
29
|
-
**Users shouldn't have to learn your app.** Generative UI shows the right components based on what someone is trying to do. First-time users and power users see different things.
|
|
30
|
-
|
|
31
|
-
**Users shouldn't have to click through your workflows.** "Show me sales from last quarter grouped by region" should just work. The AI translates what users want into the right interface.
|
|
32
|
-
|
|
33
|
-
```tsx
|
|
34
|
-
const components: TamboComponent[] = [{
|
|
35
|
-
name: "Graph",
|
|
36
|
-
description: "Displays data as charts",
|
|
37
|
-
component: Graph,
|
|
38
|
-
propsSchema: z.object({ data: z.array(...), type: z.enum(["line", "bar", "pie"]) })
|
|
39
|
-
}];
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Key Benefits
|
|
43
|
-
|
|
44
|
-
- **No AI Expertise Needed** - If you can write React, you can build generative UIs
|
|
45
|
-
- **MCP-Native Architecture** - Built-in Model Context Protocol support
|
|
46
|
-
- **Bring Your Own LLM** - Works with OpenAI, Anthropic, Google, Mistral, or any OpenAI-compatible provider
|
|
47
|
-
- **Dual Build Output** - CommonJS and ESM modules for broad compatibility
|
|
48
|
-
- **Type-Safe** - Full TypeScript support with Zod schemas
|
|
26
|
+
Register your components with Zod schemas. The agent picks the right one and streams the props so users can interact with them. "Show me sales by region" renders your `<Chart>`. "Add a task" updates your `<TaskBoard>`.
|
|
49
27
|
|
|
50
28
|
## Installation
|
|
51
29
|
|
|
52
|
-
### Create New App
|
|
53
|
-
|
|
54
30
|
```bash
|
|
55
|
-
|
|
31
|
+
npm create tambo-app my-tambo-app
|
|
56
32
|
cd my-tambo-app
|
|
33
|
+
npx tambo init # choose cloud or self-hosted
|
|
57
34
|
npm run dev
|
|
58
35
|
```
|
|
59
36
|
|
|
60
|
-
|
|
37
|
+
Or add to an existing project:
|
|
61
38
|
|
|
62
39
|
```bash
|
|
63
40
|
npm install @tambo-ai/react
|
|
64
|
-
# or
|
|
65
|
-
yarn add @tambo-ai/react
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Then initialize:
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
41
|
npx tambo init
|
|
72
42
|
```
|
|
73
43
|
|
|
@@ -81,11 +51,11 @@ import {
|
|
|
81
51
|
} from "@tambo-ai/react";
|
|
82
52
|
import { z } from "zod/v4";
|
|
83
53
|
|
|
84
|
-
// 1. Register
|
|
54
|
+
// 1. Register components with Zod schemas
|
|
85
55
|
const components = [
|
|
86
56
|
{
|
|
87
57
|
name: "Graph",
|
|
88
|
-
description: "Displays data as charts
|
|
58
|
+
description: "Displays data as charts",
|
|
89
59
|
component: Graph,
|
|
90
60
|
propsSchema: z.object({
|
|
91
61
|
data: z.array(z.object({ name: z.string(), value: z.number() })),
|
|
@@ -95,438 +65,65 @@ const components = [
|
|
|
95
65
|
];
|
|
96
66
|
|
|
97
67
|
// 2. Wrap your app
|
|
98
|
-
function App() {
|
|
99
|
-
return (
|
|
100
|
-
<TamboProvider
|
|
101
|
-
apiKey={process.env.NEXT_PUBLIC_TAMBO_API_KEY!}
|
|
102
|
-
components={components}
|
|
103
|
-
>
|
|
104
|
-
<ChatInterface />
|
|
105
|
-
</TamboProvider>
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// 3. Use hooks to build your UI
|
|
110
|
-
function ChatInterface() {
|
|
111
|
-
const { thread } = useTamboThread();
|
|
112
|
-
const { value, setValue, submit, isPending } = useTamboThreadInput();
|
|
113
|
-
|
|
114
|
-
return (
|
|
115
|
-
<div>
|
|
116
|
-
{thread.messages.map((message) => (
|
|
117
|
-
<div key={message.id}>
|
|
118
|
-
{Array.isArray(message.content) ? (
|
|
119
|
-
message.content.map((part, i) =>
|
|
120
|
-
part.type === "text" ? <p key={i}>{part.text}</p> : null,
|
|
121
|
-
)
|
|
122
|
-
) : (
|
|
123
|
-
<p>{String(message.content)}</p>
|
|
124
|
-
)}
|
|
125
|
-
{message.renderedComponent}
|
|
126
|
-
</div>
|
|
127
|
-
))}
|
|
128
|
-
<input value={value} onChange={(e) => setValue(e.target.value)} />
|
|
129
|
-
<button onClick={() => submit()} disabled={isPending}>
|
|
130
|
-
Send
|
|
131
|
-
</button>
|
|
132
|
-
</div>
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
[→ Full tutorial](https://docs.tambo.co/getting-started/quickstart)
|
|
138
|
-
|
|
139
|
-
## Core Concepts
|
|
140
|
-
|
|
141
|
-
### Component Registration
|
|
142
|
-
|
|
143
|
-
Register React components with Zod schemas for type-safe props:
|
|
144
|
-
|
|
145
|
-
```tsx
|
|
146
|
-
import { type TamboComponent } from "@tambo-ai/react";
|
|
147
|
-
|
|
148
|
-
const components: TamboComponent[] = [
|
|
149
|
-
{
|
|
150
|
-
name: "WeatherCard",
|
|
151
|
-
description: "Displays weather information with temperature and conditions",
|
|
152
|
-
component: WeatherCard,
|
|
153
|
-
propsSchema: z.object({
|
|
154
|
-
location: z.string(),
|
|
155
|
-
temperature: z.number(),
|
|
156
|
-
condition: z.string(),
|
|
157
|
-
}),
|
|
158
|
-
},
|
|
159
|
-
];
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
[→ Learn more about components](https://docs.tambo.co/concepts/generative-interfaces)
|
|
163
|
-
|
|
164
|
-
### Provider Setup
|
|
165
|
-
|
|
166
|
-
Wrap your app with `TamboProvider` to enable AI capabilities:
|
|
167
|
-
|
|
168
|
-
```tsx
|
|
169
68
|
<TamboProvider
|
|
170
69
|
apiKey={process.env.NEXT_PUBLIC_TAMBO_API_KEY!}
|
|
171
70
|
components={components}
|
|
172
|
-
tools={tools} // optional
|
|
173
|
-
userToken={userToken} // optional
|
|
174
|
-
>
|
|
175
|
-
<YourApp />
|
|
176
|
-
</TamboProvider>
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
[→ See all provider options](https://docs.tambo.co/reference/react-sdk/providers)
|
|
180
|
-
|
|
181
|
-
### Hooks
|
|
182
|
-
|
|
183
|
-
| Hook | Description |
|
|
184
|
-
| -------------------------- | -------------------------------------------------- |
|
|
185
|
-
| `useTamboThread()` | Access current thread and messages |
|
|
186
|
-
| `useTamboThreadInput()` | Handle user input and message submission |
|
|
187
|
-
| `useTamboCurrentMessage()` | Access current message context (inside components) |
|
|
188
|
-
| `useTamboComponentState()` | Persistent component state across renders |
|
|
189
|
-
| `useTamboStreamStatus()` | Monitor streaming status for progressive loading |
|
|
190
|
-
| `useTamboSuggestions()` | Generate contextual suggestions |
|
|
191
|
-
|
|
192
|
-
[→ API Reference](https://docs.tambo.co/reference/react-sdk)
|
|
193
|
-
|
|
194
|
-
## Key Features
|
|
195
|
-
|
|
196
|
-
### Generative Components
|
|
197
|
-
|
|
198
|
-
**Generative components** render once in response to a message. Charts, summaries, data visualizations.
|
|
199
|
-
|
|
200
|
-
```tsx
|
|
201
|
-
const components: TamboComponent[] = [
|
|
202
|
-
{
|
|
203
|
-
name: "Graph",
|
|
204
|
-
description: "Displays data as charts",
|
|
205
|
-
component: Graph,
|
|
206
|
-
propsSchema: z.object({
|
|
207
|
-
data: z.array(z.object({ name: z.string(), value: z.number() })),
|
|
208
|
-
type: z.enum(["line", "bar", "pie"]),
|
|
209
|
-
}),
|
|
210
|
-
},
|
|
211
|
-
];
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
[→ Learn more about components](https://docs.tambo.co/concepts/generative-interfaces)
|
|
215
|
-
|
|
216
|
-
### Interactable Components
|
|
217
|
-
|
|
218
|
-
**Interactable components** persist and update as users refine requests. Shopping carts, spreadsheets, task boards.
|
|
219
|
-
|
|
220
|
-
```tsx
|
|
221
|
-
import { withInteractable } from "@tambo-ai/react";
|
|
222
|
-
|
|
223
|
-
const InteractableNote = withInteractable(Note, {
|
|
224
|
-
componentName: "Note",
|
|
225
|
-
description: "A note supporting title, content, and color modifications",
|
|
226
|
-
propsSchema: z.object({
|
|
227
|
-
title: z.string(),
|
|
228
|
-
content: z.string(),
|
|
229
|
-
color: z.enum(["white", "yellow", "blue", "green"]).optional(),
|
|
230
|
-
}),
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
// Pre-place in your UI or let AI generate dynamically
|
|
234
|
-
<InteractableNote id="note-1" title="My Note" content="Content here" />;
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
[→ Learn more about interactable components](https://docs.tambo.co/concepts/generative-interfaces/interactable-components)
|
|
238
|
-
|
|
239
|
-
### MCP Integration
|
|
240
|
-
|
|
241
|
-
Connect to Linear, Slack, databases, or your own MCP servers. Tambo supports the full MCP protocol: tools, prompts, elicitations, and sampling.
|
|
242
|
-
|
|
243
|
-
```tsx
|
|
244
|
-
import { MCPTransport } from "@tambo-ai/react/mcp";
|
|
245
|
-
|
|
246
|
-
const mcpServers = [
|
|
247
|
-
{
|
|
248
|
-
name: "filesystem",
|
|
249
|
-
url: "http://localhost:8261/mcp",
|
|
250
|
-
transport: MCPTransport.HTTP,
|
|
251
|
-
},
|
|
252
|
-
];
|
|
253
|
-
|
|
254
|
-
<TamboProvider components={components} mcpServers={mcpServers}>
|
|
255
|
-
<App />
|
|
256
|
-
</TamboProvider>;
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
[→ Learn more about MCP](https://docs.tambo.co/concepts/model-context-protocol)
|
|
260
|
-
|
|
261
|
-
> **Dependency note**
|
|
262
|
-
>
|
|
263
|
-
> The `@modelcontextprotocol/sdk` is included automatically when you install `@tambo-ai/react`. However, if you import from the `@tambo-ai/react/mcp` subpath and use features that require schema validation (like component props schemas), you'll need to install `zod` and `zod-to-json-schema` as optional peer dependencies:
|
|
264
|
-
>
|
|
265
|
-
> ```bash
|
|
266
|
-
> npm install zod@^4.0.0 zod-to-json-schema@^3.25.0
|
|
267
|
-
> ```
|
|
268
71
|
>
|
|
269
|
-
> `zod` can also be `^3.25` if you prefer Zod 3; both `^3.25` and `^4.0` satisfy the SDK's `zod/v3` subpath constraints.
|
|
270
|
-
|
|
271
|
-
### Local Tools
|
|
272
|
-
|
|
273
|
-
Sometimes you need functions that run in the browser. DOM manipulation, authenticated fetches, accessing React state. Define them as tools and the AI can call them.
|
|
274
|
-
|
|
275
|
-
```tsx
|
|
276
|
-
import { z } from "zod/v4";
|
|
277
|
-
import { defineTool } from "@tambo-ai/react";
|
|
278
|
-
|
|
279
|
-
const tools = [
|
|
280
|
-
defineTool({
|
|
281
|
-
name: "getWeather",
|
|
282
|
-
description: "Fetches weather data for a location",
|
|
283
|
-
tool: async ({ location }) =>
|
|
284
|
-
fetch(`/api/weather?q=${location}`).then((r) => r.json()),
|
|
285
|
-
inputSchema: z.object({
|
|
286
|
-
location: z.string(),
|
|
287
|
-
}),
|
|
288
|
-
outputSchema: z.object({
|
|
289
|
-
temperature: z.number(),
|
|
290
|
-
condition: z.string(),
|
|
291
|
-
location: z.string(),
|
|
292
|
-
}),
|
|
293
|
-
}),
|
|
294
|
-
];
|
|
295
|
-
|
|
296
|
-
<TamboProvider tools={tools} components={components}>
|
|
297
72
|
<App />
|
|
298
73
|
</TamboProvider>;
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
[→ Learn more about tools](https://docs.tambo.co/guides/take-actions/register-tools)
|
|
302
|
-
|
|
303
|
-
#### Advanced: Transforming Tool Responses
|
|
304
74
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
const tools: TamboTool[] = [
|
|
309
|
-
{
|
|
310
|
-
name: "getImageData",
|
|
311
|
-
description: "Fetches image data with metadata",
|
|
312
|
-
tool: async (params: { imageId: string }) => {
|
|
313
|
-
const data = await fetchImageData(params.imageId);
|
|
314
|
-
return { url: data.imageUrl, description: data.description };
|
|
315
|
-
},
|
|
316
|
-
inputSchema: z.object({
|
|
317
|
-
imageId: z.string(),
|
|
318
|
-
}),
|
|
319
|
-
outputSchema: z.object({ url: z.string(), description: z.string() }),
|
|
320
|
-
transformToContent: (result) => [
|
|
321
|
-
{ type: "text", text: result.description },
|
|
322
|
-
{ type: "image_url", image_url: { url: result.url } },
|
|
323
|
-
],
|
|
324
|
-
},
|
|
325
|
-
];
|
|
75
|
+
// 3. Use hooks
|
|
76
|
+
const { value, setValue, submit, isPending } = useTamboThreadInput();
|
|
77
|
+
const { thread } = useTamboThread();
|
|
326
78
|
```
|
|
327
79
|
|
|
328
|
-
|
|
80
|
+
## Key Hooks
|
|
329
81
|
|
|
330
|
-
|
|
82
|
+
| Hook | Description |
|
|
83
|
+
| -------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
|
|
84
|
+
| [`useTamboThread()`](https://docs.tambo.co/concepts/conversation-storage) | Access current thread and messages |
|
|
85
|
+
| [`useTamboThreadInput()`](https://docs.tambo.co/reference/react-sdk/hooks#usetambothreadinput) | Handle user input and message submission |
|
|
86
|
+
| [`useTamboStreamStatus()`](https://docs.tambo.co/reference/react-sdk/hooks#usetambostreamstatus) | Monitor streaming status for progressive loading |
|
|
87
|
+
| [`useTamboSuggestions()`](https://docs.tambo.co/concepts/suggestions) | Generate contextual suggestions |
|
|
88
|
+
| [`useTamboComponentState()`](https://docs.tambo.co/concepts/generative-interfaces/component-state) | Persistent component state across renders |
|
|
331
89
|
|
|
332
|
-
|
|
90
|
+
## Features
|
|
333
91
|
|
|
334
|
-
|
|
92
|
+
- **[Generative Components](https://docs.tambo.co/concepts/generative-interfaces/generative-components)** - AI renders the right component based on conversation
|
|
93
|
+
- **[Interactable Components](https://docs.tambo.co/concepts/generative-interfaces/interactable-components)** - Persistent stateful components that update as users refine requests
|
|
94
|
+
- **[MCP Integration](https://docs.tambo.co/concepts/model-context-protocol)** - Connect to Linear, Slack, databases, or your own MCP servers
|
|
95
|
+
- **[Local Tools](https://docs.tambo.co/guides/take-actions/register-tools)** - Define browser-side functions the AI can call
|
|
96
|
+
- **[Streaming](https://docs.tambo.co/reference/react-sdk/hooks#usetambostreamstatus)** - Props stream to components as the LLM generates them
|
|
335
97
|
|
|
336
|
-
|
|
98
|
+
## MCP Dependency Note
|
|
337
99
|
|
|
338
|
-
|
|
339
|
-
import { type ListResourceItem } from "@tambo-ai/react";
|
|
340
|
-
|
|
341
|
-
const resources: ListResourceItem[] = [
|
|
342
|
-
{
|
|
343
|
-
uri: "file:///config/app-settings.json",
|
|
344
|
-
name: "App Settings",
|
|
345
|
-
description: "Current application configuration",
|
|
346
|
-
mimeType: "application/json",
|
|
347
|
-
},
|
|
348
|
-
{
|
|
349
|
-
uri: "file:///docs/user-guide.md",
|
|
350
|
-
name: "User Guide",
|
|
351
|
-
description: "Getting started documentation",
|
|
352
|
-
mimeType: "text/markdown",
|
|
353
|
-
},
|
|
354
|
-
];
|
|
100
|
+
`@modelcontextprotocol/sdk` is included automatically when you install `@tambo-ai/react`.
|
|
355
101
|
|
|
356
|
-
|
|
357
|
-
<App />
|
|
358
|
-
</TamboProvider>;
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
#### Dynamic Resources
|
|
362
|
-
|
|
363
|
-
For resources that need to be fetched or computed at runtime, provide `listResources` and `getResource` functions:
|
|
364
|
-
|
|
365
|
-
```tsx
|
|
366
|
-
import { type ResourceSource, type ReadResourceResult } from "@tambo-ai/react";
|
|
367
|
-
|
|
368
|
-
const listResources = async (search?: string) => {
|
|
369
|
-
const allDocs = await fetchUserDocuments();
|
|
370
|
-
return allDocs
|
|
371
|
-
.filter((doc) => !search || doc.name.includes(search))
|
|
372
|
-
.map((doc) => ({
|
|
373
|
-
uri: `file:///docs/${doc.id}`,
|
|
374
|
-
name: doc.name,
|
|
375
|
-
description: doc.summary,
|
|
376
|
-
mimeType: "text/markdown",
|
|
377
|
-
}));
|
|
378
|
-
};
|
|
379
|
-
|
|
380
|
-
const getResource = async (uri: string): Promise<ReadResourceResult> => {
|
|
381
|
-
const docId = uri.split("/").pop();
|
|
382
|
-
const content = await fetchDocumentContent(docId);
|
|
383
|
-
return {
|
|
384
|
-
contents: [
|
|
385
|
-
{
|
|
386
|
-
uri,
|
|
387
|
-
mimeType: "text/markdown",
|
|
388
|
-
text: content,
|
|
389
|
-
},
|
|
390
|
-
],
|
|
391
|
-
};
|
|
392
|
-
};
|
|
393
|
-
|
|
394
|
-
<TamboProvider listResources={listResources} getResource={getResource}>
|
|
395
|
-
<App />
|
|
396
|
-
</TamboProvider>;
|
|
397
|
-
```
|
|
102
|
+
If you import from `@tambo-ai/react/mcp` **and** use features that require schema validation (like component prop schemas via `propsSchema`, or tool schemas via `inputSchema`/`outputSchema`), install the optional peer dependencies:
|
|
398
103
|
|
|
399
|
-
|
|
104
|
+
Zod 3 (`^3.25.76`) and Zod 4 (`^4`) are both supported. We recommend Zod 4 for new projects. `zod-to-json-schema@^3.25.1` is tested and known to support both.
|
|
400
105
|
|
|
401
|
-
|
|
106
|
+
Install **exactly one** of the following (do not install both Zod 3 and Zod 4):
|
|
402
107
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
const { registerResource, registerResourceSource } = useTamboRegistry();
|
|
407
|
-
|
|
408
|
-
// Register a single resource
|
|
409
|
-
registerResource({
|
|
410
|
-
uri: "file:///runtime/state.json",
|
|
411
|
-
name: "Application State",
|
|
412
|
-
mimeType: "application/json",
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
// Register a dynamic source
|
|
416
|
-
registerResourceSource({
|
|
417
|
-
listResources: async () => [...],
|
|
418
|
-
getResource: async (uri) => ({ contents: [...] }),
|
|
419
|
-
});
|
|
420
|
-
```
|
|
421
|
-
|
|
422
|
-
#### Resource vs MCP Server
|
|
423
|
-
|
|
424
|
-
- **Local resources**: Fast, simple, runs in the browser. Great for app state, config, cached data.
|
|
425
|
-
- **MCP servers**: Full protocol support, server-side execution. Use for databases, APIs, external services.
|
|
426
|
-
|
|
427
|
-
Local resources appear in `useTamboMcpResourceList()` alongside MCP resources, with MCP resources always prefixed by their serverKey.
|
|
428
|
-
|
|
429
|
-
[→ Learn more about resources](https://docs.tambo.co/concepts/model-context-protocol/features#resources)
|
|
430
|
-
|
|
431
|
-
### Streaming Status
|
|
432
|
-
|
|
433
|
-
Monitor streaming status for progressive loading:
|
|
434
|
-
|
|
435
|
-
```tsx
|
|
436
|
-
import { useTamboStreamStatus } from "@tambo-ai/react";
|
|
437
|
-
|
|
438
|
-
function LoadingComponent({ title, data }) {
|
|
439
|
-
const { streamStatus, propStatus } = useTamboStreamStatus();
|
|
440
|
-
|
|
441
|
-
// Show spinner until complete
|
|
442
|
-
if (!streamStatus.isSuccess) return <Spinner />;
|
|
443
|
-
|
|
444
|
-
// Or show each prop as it arrives
|
|
445
|
-
return (
|
|
446
|
-
<div>
|
|
447
|
-
{propStatus["title"]?.isSuccess && <h3>{title}</h3>}
|
|
448
|
-
{propStatus["data"]?.isSuccess && <Chart data={data} />}
|
|
449
|
-
</div>
|
|
450
|
-
);
|
|
451
|
-
}
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
[→ Learn more about streaming](https://docs.tambo.co/concepts/generative-interfaces/component-state)
|
|
455
|
-
|
|
456
|
-
### Context, Auth, and Suggestions
|
|
457
|
-
|
|
458
|
-
**Additional context** lets you pass metadata to give the AI better responses. User state, app settings, current page. **User authentication** passes tokens from your auth provider. **Suggestions** generates prompts users can click based on what they're doing.
|
|
459
|
-
|
|
460
|
-
```tsx
|
|
461
|
-
<TamboProvider
|
|
462
|
-
userToken={userToken}
|
|
463
|
-
contextHelpers={{
|
|
464
|
-
selectedItems: () => ({
|
|
465
|
-
key: "selectedItems",
|
|
466
|
-
value: selectedItems.map((i) => i.name).join(", "),
|
|
467
|
-
}),
|
|
468
|
-
currentPage: () => ({ key: "page", value: window.location.pathname }),
|
|
469
|
-
}}
|
|
470
|
-
/>
|
|
471
|
-
```
|
|
472
|
-
|
|
473
|
-
```tsx
|
|
474
|
-
const { suggestions, accept } = useTamboSuggestions({ maxSuggestions: 3 });
|
|
108
|
+
```bash
|
|
109
|
+
# Recommended (Zod 4)
|
|
110
|
+
npm install zod@^4 zod-to-json-schema@^3.25.1
|
|
475
111
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
{s.title}
|
|
479
|
-
</button>
|
|
480
|
-
));
|
|
112
|
+
# Or, for existing projects using Zod 3
|
|
113
|
+
npm install zod@^3.25.76 zod-to-json-schema@^3.25.1
|
|
481
114
|
```
|
|
482
115
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
### Supported LLM Providers
|
|
486
|
-
|
|
487
|
-
OpenAI, Anthropic, Google Gemini, Mistral, Groq, and any OpenAI-compatible provider. [Full list](https://docs.tambo.co/reference/llm-providers). Missing one? [Let us know](https://github.com/tambo-ai/tambo/issues).
|
|
488
|
-
|
|
489
|
-
## When to Use This SDK
|
|
490
|
-
|
|
491
|
-
Use `@tambo-ai/react` directly when you need:
|
|
492
|
-
|
|
493
|
-
- **Custom implementations** - Build your own chat interface or UI patterns
|
|
494
|
-
- **Existing design systems** - Integrate with your component library
|
|
495
|
-
- **Fine-grained control** - Customize rendering, state, and behavior
|
|
496
|
-
- **Non-Next.js frameworks** - Works with any React setup
|
|
497
|
-
|
|
498
|
-
For quick starts with pre-built components, use:
|
|
499
|
-
|
|
500
|
-
- `npx tambo create-app` - Full-featured template with UI components
|
|
501
|
-
- [Tambo UI Library](https://ui.tambo.co) - Copy/paste production-ready components
|
|
502
|
-
|
|
503
|
-
## Build Output
|
|
504
|
-
|
|
505
|
-
This package provides dual build outputs for broad compatibility:
|
|
506
|
-
|
|
507
|
-
- **CommonJS** (`dist/`) - For Node.js and older bundlers
|
|
508
|
-
- **ESM** (`esm/`) - For modern bundlers and native ES modules
|
|
509
|
-
|
|
510
|
-
TypeScript definitions included for both outputs.
|
|
511
|
-
|
|
512
|
-
## Community & Support
|
|
513
|
-
|
|
514
|
-
- **Discord:** [Join our community](https://discord.gg/dJNvPEHth6) for help and discussions
|
|
515
|
-
- **GitHub:** [Star the repo](https://github.com/tambo-ai/tambo) and contribute
|
|
516
|
-
- **Showcase:** See [projects built with Tambo](https://github.com/tambo-ai/tambo#built-with-tambo)
|
|
517
|
-
|
|
518
|
-
## Documentation
|
|
116
|
+
## Learn More
|
|
519
117
|
|
|
520
|
-
- [
|
|
521
|
-
- [
|
|
522
|
-
- [
|
|
523
|
-
- [
|
|
524
|
-
- [UI Library](https://ui.tambo.co)
|
|
118
|
+
- **[GitHub](https://github.com/tambo-ai/tambo)** - Full documentation, examples, and ⭐ star us!
|
|
119
|
+
- **[Docs](https://docs.tambo.co)** - Guides and API reference
|
|
120
|
+
- **[UI Library](https://ui.tambo.co)** - Pre-built components
|
|
121
|
+
- **[Discord](https://discord.gg/dJNvPEHth6)** - Community and support
|
|
525
122
|
|
|
526
123
|
## License
|
|
527
124
|
|
|
528
|
-
MIT
|
|
125
|
+
MIT - see [LICENSE](https://github.com/tambo-ai/tambo/blob/main/LICENSE)
|
|
529
126
|
|
|
530
127
|
---
|
|
531
128
|
|
|
532
|
-
**
|
|
129
|
+
**For AI/LLM agents:** [docs.tambo.co/llms.txt](https://docs.tambo.co/llms.txt)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import type { ToolAnnotations } from "../model/component-metadata";
|
|
2
3
|
import { SupportedSchema } from "../schema";
|
|
3
4
|
export interface InteractableConfig<Props = Record<string, unknown>, State = Record<string, unknown>> {
|
|
4
5
|
/**
|
|
@@ -20,6 +21,13 @@ export interface InteractableConfig<Props = Record<string, unknown>, State = Rec
|
|
|
20
21
|
* validated against this schema.
|
|
21
22
|
*/
|
|
22
23
|
stateSchema?: SupportedSchema<State>;
|
|
24
|
+
/**
|
|
25
|
+
* Optional annotations for the interactable component's auto-registered tools
|
|
26
|
+
* (props update and state update). By default, `tamboStreamableHint` is `true`
|
|
27
|
+
* so props/state updates stream in real-time. Set `{ tamboStreamableHint: false }`
|
|
28
|
+
* to disable streaming for this component's tools.
|
|
29
|
+
*/
|
|
30
|
+
annotations?: ToolAnnotations;
|
|
23
31
|
}
|
|
24
32
|
/**
|
|
25
33
|
* Props injected by withTamboInteractable HOC. These can be passed to the wrapped
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-tambo-interactable.d.ts","sourceRoot":"","sources":["../../src/hoc/with-tambo-interactable.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmD,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"with-tambo-interactable.d.ts","sourceRoot":"","sources":["../../src/hoc/with-tambo-interactable.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,WAAW,kBAAkB,CACjC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,SAAS,MAAM,EACjE,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EACrD,MAAM,EAAE,kBAAkB,yDA8H3B"}
|
|
@@ -38,6 +38,7 @@ exports.withTamboInteractable = withTamboInteractable;
|
|
|
38
38
|
const react_1 = __importStar(require("react"));
|
|
39
39
|
const use_current_message_1 = require("../hooks/use-current-message");
|
|
40
40
|
const tambo_interactable_provider_1 = require("../providers/tambo-interactable-provider");
|
|
41
|
+
const component_renderer_1 = require("../v1/utils/component-renderer");
|
|
41
42
|
/**
|
|
42
43
|
* Higher-Order Component that makes any component interactable by tambo.
|
|
43
44
|
* @param WrappedComponent - The component to make interactable
|
|
@@ -98,6 +99,7 @@ function withTamboInteractable(WrappedComponent, config) {
|
|
|
98
99
|
props: componentProps,
|
|
99
100
|
propsSchema: config.propsSchema,
|
|
100
101
|
stateSchema: config.stateSchema,
|
|
102
|
+
annotations: config.annotations,
|
|
101
103
|
});
|
|
102
104
|
setInteractableId(id);
|
|
103
105
|
onInteractableReady?.(id);
|
|
@@ -146,13 +148,14 @@ function withTamboInteractable(WrappedComponent, config) {
|
|
|
146
148
|
},
|
|
147
149
|
componentState: {},
|
|
148
150
|
};
|
|
149
|
-
// Wrap with TamboMessageProvider including interactable metadata
|
|
151
|
+
// Wrap with TamboMessageProvider and V1ComponentContentProvider including interactable metadata
|
|
150
152
|
return (react_1.default.createElement(use_current_message_1.TamboMessageProvider, { message: minimalMessage, interactableMetadata: {
|
|
151
153
|
id: interactableId,
|
|
152
154
|
componentName: config.componentName,
|
|
153
155
|
description: config.description,
|
|
154
156
|
} },
|
|
155
|
-
react_1.default.createElement(
|
|
157
|
+
react_1.default.createElement(component_renderer_1.V1ComponentContentProvider, { componentId: interactableId, threadId: "", messageId: "", componentName: config.componentName },
|
|
158
|
+
react_1.default.createElement(WrappedComponent, { ...effectiveProps }))));
|
|
156
159
|
};
|
|
157
160
|
TamboInteractableWrapper.displayName = `withTamboInteractable(${displayName})`;
|
|
158
161
|
return TamboInteractableWrapper;
|