Saltar al contenido principal

@agentskit/react

Interfaz de chat para React basada en @agentskit/core. Ofrece tres hooks y siete componentes sin estilo (headless) que se maquetan con variables CSS.

Cuándo usarlo

  • Chat con streaming en el navegador con adaptadores LLM intercambiables y, opcionalmente, herramientas, memoria, RAG y skills.
  • Quieres marcado headless (data-ak-*) y tu propio CSS o sistema de diseño.

Considera @agentskit/ink para aplicaciones de terminal y @agentskit/runtime para agentes sin interfaz y sin React.

Instalación

npm install @agentskit/react @agentskit/core
# optional: real AI providers
npm install @agentskit/adapters

Hooks

useChat

El hook principal. Crea y gestiona una sesión de chat completa.

import { useChat } from '@agentskit/react'

const chat = useChat({
adapter: myAdapter, // required — AdapterFactory
systemPrompt: 'You are...', // optional
memory: myMemory, // optional — ChatMemory
tools: [...], // optional — ToolDefinition[]
})

Configuración de useChat (ChatConfig)

OpciónTipoDescripción
adapterAdapterFactoryObligatorio. Fábrica de proveedor desde @agentskit/adapters o personalizada.
systemPromptstringSe antepone como mensaje de sistema al enviar.
temperaturenumberSe pasa al adaptador cuando está soportado.
maxTokensnumberLímite superior de longitud de la respuesta cuando está soportado.
toolsToolDefinition[]Funciones que el modelo puede invocar; los resultados vuelven como mensajes de herramienta.
skillsSkillDefinition[]Amplían el system prompt e inyectan herramientas de skill antes del envío.
memoryChatMemoryPersiste y recarga Message[] entre sesiones (Memoria).
retrieverRetrieverInyecta contexto recuperado en cada turno (RAG).
initialMessagesMessage[]Semilla la transcripción antes del primer mensaje del usuario.
onMessagecallbackSe invoca con cada Message persistido cuando el controlador actualiza el historial.
onErrorcallbackErrores de stream o de herramientas.
onToolCallcallbackObservar o interceptar la ejecución de herramientas (Herramientas).
observersObserver[]Flujo de eventos de bajo nivel (Observabilidad).

El hook también expone métodos del controlador como approve / deny para herramientas con humano en el bucle cuando las definiciones de herramienta solicitan confirmación.

Devuelve un objeto ChatReturn:

PropiedadTipoDescripción
messagesMessage[]Historial completo de la conversación
inputstringValor actual del campo de entrada
status'idle' | 'streaming' | 'error'Estado de la sesión
errorError | nullÚltimo error, si lo hay
send(text)(text: string) => voidEnviar un mensaje
stop()() => voidAbortar el stream actual
retry()() => voidReintentar la última petición
setInput(val)(val: string) => voidActualizar el valor de entrada
clear()() => voidVaciar la conversación
approve(id) / deny(id, reason?)Confirmar o rechazar llamadas a herramienta pendientes cuando aplique.

useStream

Hook de más bajo nivel para consumir un único StreamSource directamente.

import { useStream } from '@agentskit/react'

const { text, status, error, stop } = useStream(source, {
onChunk: (chunk) => console.log(chunk),
onComplete: (full) => console.log('done', full),
onError: (err) => console.error(err),
})

useReactive

Contenedor de estado reactivo que dispara re-renderizados ante mutaciones de propiedades.

import { useReactive } from '@agentskit/react'

const state = useReactive({ count: 0, label: 'hello' })
// Mutate directly — component re-renders automatically
state.count++

Ejemplo completo (adaptador demo — sin API key)

import { useChat, ChatContainer, Message, InputBar, ThinkingIndicator } from '@agentskit/react'
import type { AdapterFactory } from '@agentskit/react'
import '@agentskit/react/theme'

function createDemoAdapter(): AdapterFactory {
return {
createSource: ({ messages }) => {
let cancelled = false
return {
stream: async function* () {
const last = [...messages].reverse().find(m => m.role === 'user')
const reply = `You said: "${last?.content ?? ''}". This is a demo response.`
for (const chunk of reply.match(/.{1,20}/g) ?? []) {
if (cancelled) return
await new Promise(r => setTimeout(r, 40))
yield { type: 'text' as const, content: chunk }
}
yield { type: 'done' as const }
},
abort: () => { cancelled = true },
}
},
}
}

export default function App() {
const chat = useChat({
adapter: createDemoAdapter(),
systemPrompt: 'You are a helpful assistant.',
})

return (
<ChatContainer>
{chat.messages.map(msg => (
<Message key={msg.id} message={msg} />
))}
<ThinkingIndicator visible={chat.status === 'streaming'} />
<InputBar chat={chat} placeholder="Say something..." />
</ChatContainer>
)
}

Cambiar a un proveedor real

Sustituye el adaptador — no cambia nada más:

import { anthropic } from '@agentskit/adapters'

const chat = useChat({
adapter: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY, model: 'claude-sonnet-4-6' }),
})
import { openai } from '@agentskit/adapters'

const chat = useChat({
adapter: openai({ apiKey: process.env.OPENAI_API_KEY, model: 'gpt-4o' }),
})

Atributos data-ak-*

Cada componente emite atributos data-ak-* para que puedas dar estilo o seleccionarlos sin clases:

AtributoElementoValores
data-ak-chat-container<div> contenedor
data-ak-messagecontenedor del mensaje
data-ak-rolecontenedor del mensajeuser, assistant, system, tool
data-ak-statuscontenedor del mensajeidle, streaming, done, error
data-ak-contentcuerpo del mensaje
data-ak-avatarslot del avatar
data-ak-actionsslot de acciones
data-ak-input-barcontenedor del formulario
data-ak-inputtextarea
data-ak-sendbotón de envío
data-ak-thinkingdiv de “thinking”
data-ak-markdowncontenedor markdown
data-ak-streamingcontenedor markdowntrue mientras hay streaming
data-ak-code-blockcontenedor del bloque de código
data-ak-languagecontenedor del bloque de códigocadena del lenguaje
data-ak-copybotón copiar
data-ak-tool-callcontenedor de la llamada a herramienta
data-ak-tool-statuscontenedor de la llamada a herramientapending, running, done, error

Consulta Temas para la referencia completa de variables CSS.

Composición

  • Prefiere envoltorios presentacionales pequeños alrededor de ChatContainer, Message e InputBar en lugar de bifurcar el interior.
  • Usa data-ak-* para tokens de tema; para MUI/shadcn, ve Chat MUI y Chat shadcn.
  • ToolCallView y Markdown aceptan props estándar — combínalos con tu router para enlaces profundos dentro del contenido del asistente.

Notas de producción

  • Mantén las API keys en el servidor cuando sea posible (route handlers, server actions); usa vercelAI o un BFF fino que devuelva un stream.
  • Alinea las versiones de @agentskit/* en el mismo minor para evitar desajustes de tipos con core.

Solución de problemas

SíntomaCausa probable
Mensajes duplicados en React Strict ModeEsperable en desarrollo; en producción debería coincidir con un solo montaje. Si no, asegura un solo useChat por id de sesión.
Stream atascado en streamingEl adaptador no emitió { type: 'done' } o la red colgó; llama a stop() e inspecciona abort del adaptador.
Las herramientas nunca se invocandescription / schema débiles; el modelo puede ignorarlos. Refuerza el schema y el system prompt.
Faltan estilosImporta @agentskit/react/theme o define variables CSS desde Temas.

Ver también

Empieza aquí · Paquetes · TypeDoc (@agentskit/react) · Componentes · Temas · Ink · @agentskit/core