Tous les produits
Search
Centre de documentation

Tablestore:Memory Dream

Dernière mise à jour :Sep 25, 2026

Dream analyse de manière asynchrone le contenu existant dans un magasin de mémoire pour fusionner, dédupliquer, corriger et réorganiser les données.

Dream prend en charge deux types de magasins de mémoire : structuré et fichier. Les interfaces des tâches sont identiques, mais l'application des résultats diffère.

Magasin de mémoire

Entrée

Méthode de sortie

Magasin de mémoire structuré

Mémoire à long terme et messages bruts

Génère des propositions ou applique des actions de mémoire à long terme selon un seuil de confiance ou un plan approuvé

Magasin de mémoire de fichiers accessible en écriture

Fichiers texte dans une ou plusieurs portées

Écrit automatiquement dans une seule portée de sortie déterministe

Structured memory Dream

Au fil des conversations, la mémoire à long terme peut accumuler des doublons, des incohérences terminologiques, des entrées fusionnables ou des éléments obsolètes. Structured memory Dream affine en arrière-plan la mémoire à long terme ingérée et les messages bruts, puis produit des actions de consolidation applicables, garantissant ainsi la concision et la cohérence du magasin de mémoire au fil du temps. Il prend en charge deux modes : la génération de propositions pour confirmation manuelle préalable, et l'application automatique des actions dès qu'un seuil de confiance est atteint.

How it works

Dream utilise les données du magasin de mémoire comme entrée ; le service les analyse en arrière-plan et produit des actions de consolidation. Selon la cible de consolidation, les tâches se divisent en trois types. Les actions issues des tâches memory sont réécrites dans le magasin de mémoire, tandis que celles des tâches skill / profile sont uniquement produites sous forme d'événements autonomes, ne sont pas écrites dans le magasin de mémoire et sont consommées par l'appelant selon ses besoins.

taskType

Cible de consolidation

Types d'actions produits

memory (par défaut)

Mémoire à long terme : réécriture, fusion, déduplication et suppression des éléments obsolètes. Les actions appliquées mettent directement à jour le magasin de mémoire.

ADD / UPDATE / DELETE / MERGE / NOOP

skill

Extrait des compétences réutilisables des interactions historiques. Les actions sont produites sous forme d'événements et ne sont pas écrites dans le magasin de mémoire.

EMIT_SKILL

profile

Accumule un profil utilisateur structuré. Les actions sont produites sous forme d'événements et ne sont pas écrites dans le magasin de mémoire.

EMIT_PROFILE

Selon le niveau de confiance de votre activité métier envers les résultats de consolidation, choisissez l'un des modes d'application suivants.

applyMode

Comportement

proposal (par défaut)

La consolidation génère uniquement des propositions d'action dans l'état proposed, que l'appelant applique explicitement via ApplyMemoryDreamActions.

safe_auto

Les actions atteignant le seuil de confiance (confidenceThresholds) sont appliquées automatiquement par le service ; les autres restent à l'état de proposition.

plan

Une consolidation à effort élevé génère d'abord un plan incluant une liste d'autorisation de suppression et passe à l'état awaiting_plan_approval ; elle n'est exécutée qu'après approbation par l'appelant.

Remarque
  • applyMode n'est pris en charge que lorsque taskType=memory ; la transmission de skill / profile renvoie une erreur de paramètre 400. Les actions des tâches skill / profile (EMIT_SKILL / EMIT_PROFILE) sont produites sous forme d'événements, ne sont pas écrites dans le magasin de mémoire et sont consommées et gérées par l'appelant — il n'existe aucun flux apply.

  • effort contrôle l'intensité de la consolidation : low (par défaut) exécute une seule analyse bornée ; high autorise plusieurs cycles d'analyse. La consolidation de mémoire avec effort=high doit sélectionner explicitement safe_auto ou plan ; applyMode=plan doit utiliser effort=high.

Quick start

Le workflow complet pour Structured memory Dream est le suivant : créer une tâche de consolidation → interroger l'état de la tâche → examiner les propositions d'action → appliquer les actions. Après application, relisez la mémoire à long terme pour vérifier les résultats.

Le flux d'état typique est : queued → running → planning → (optionnel applying) → completed ; le mode plan passe à l'état awaiting_plan_approval avant l'exécution. Les autres états terminaux incluent completed_with_failures, failed, cancelled. L'exemple suivant utilise le mode proposal :

Console

Étape 1 : Créer une tâche de consolidation

  1. Connectez-vous au magasin de mémoire et, dans le volet de navigation de gauche, sélectionnez Agentic Task > Memory Dream.

  2. Dans le coin supérieur droit, cliquez sur Create Task et configurez les paramètres suivants dans la boîte de dialogue :

    Élément de formulaire

    Description

    Paramètre correspondant

    Type de tâche

    Sélectionnez Memory consolidation.

    taskType=memory

    Portée d'entrée

    Portée à consolider. Vous pouvez utiliser le caractère générique * pour couvrir plusieurs niveaux.

    scopes

    Profondeur de traitement

    Standard (une seule analyse bornée) ou High-effort (plusieurs cycles d'analyse).

    effort=low / high

    Mode d'application

    Générer uniquement des suggestions (recommandé ; appliquer après confirmation manuelle).

    applyMode=proposal

    Mode de portée de sortie

    Conserver la portée d'origine ou Promouvoir la portée.

    scopeOutputMode=preserve_scope / promote_scope

    Instructions de consolidation

    Facultatif. Exigences de consolidation personnalisées.

    instructions

  3. Après soumission, la tâche s'exécute de manière asynchrone et génère un ID de tâche (dreamId). L'état commence à évoluer depuis queued.

    Lorsque vous sélectionnez High-effort pour la profondeur de traitement, le mode d'application doit être safe_auto ou plan (contrainte liée à effort=high ).

Étape 2 : Examiner la tâche et les suggestions

  1. Dans la liste des tâches Memory Dream, attendez que l'état de la tâche cible devienne Completed (completed). Cliquez sur Refresh pour mettre à jour l'état.

  2. Cliquez sur la tâche pour ouvrir ses détails et afficher la action list produite. Chaque action contient le type d'action (ADD / UPDATE / DELETE / MERGE / NOOP), la mémoire cible, le nouveau contenu consolidé, la raison (reason), la confiance (confidence) et l'état.

  3. En mode proposal, toutes les actions sont initialement à l'état To be applied (proposed) et ne modifient pas le magasin de mémoire tant qu'elles ne sont pas appliquées.

Étape 3 : Appliquer les actions et vérifier

  1. Dans les détails de la tâche, sélectionnez les actions à appliquer (NOOP signifie qu'aucune modification n'est nécessaire et peut rester non sélectionné).

  2. Cliquez sur Apply. Le service met à jour la mémoire à long terme selon les actions sélectionnées. Les actions DELETE sont irréversibles après suppression.

  3. En mode plan, vous devez d'abord approuver la liste d'autorisation de suppression dans le plan avant l'exécution.

  4. Après application, relisez la liste des mémoires sous Memory data management > Long-term memory pour confirmer que les résultats de consolidation répondent aux attentes.

SDK

Appelez les quatre interfaces dans l'ordre : créer la tâche, interroger l'état, examiner les propositions d'action et appliquer les actions.

Python

from tablestore_agent_storage import AgentStorageClient

client = AgentStorageClient(
    api_key="<your-api-key>",
    ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
    ots_instance_name="<instance-name>",
)

# 1. Create the consolidation task
resp = client.create_memory_dream_task({
    "memoryStoreName": "agent_memory",
    "scopes": [{"appId": "app-001", "tenantId": "user-001", "agentId": "assistant", "runId": "session-001"}],
    "taskType": "memory",
    "effort": "low",
    "applyMode": "proposal",
    "instructions": "Merge duplicate memories and delete outdated items",
    "clientToken": "dream-001",
})
dream_id = resp.get("dreamId")

# 2. Poll the task status until it reaches a terminal state
task = client.get_memory_dream_task({
    "memoryStoreName": "agent_memory",
    "dreamId": dream_id,
})
print(f"status: {task.get('status')}, actions: {task.get('actions')}")

# 3. Review action proposals
actions = client.list_memory_dream_actions({
    "memoryStoreName": "agent_memory",
    "dreamId": dream_id,
    "limit": 100,
}).get("actions", [])

# 4. Apply the selected actions (skip NOOP)
client.apply_memory_dream_actions({
    "memoryStoreName": "agent_memory",
    "dreamId": dream_id,
    "mode": "actions",
    "actionIds": [a["actionId"] for a in actions if a["action"] != "NOOP"],
    "applier": "operator-001",
})

TypeScript

import { AgentStorageClient } from '@tablestore/agent-storage';

const client = new AgentStorageClient({
  apiKey: '<your-api-key>',
  endpoint: 'https://<instance>.<region>.ots.aliyuncs.com',
  instanceName: '<instance-name>',
});

// 1. Create the consolidation task
const created = await client.createMemoryDreamTask({
  memoryStoreName: 'agent_memory',
  scopes: [{ appId: 'app-001', tenantId: 'user-001', agentId: 'assistant', runId: 'session-001' }],
  taskType: 'memory',
  effort: 'low',
  applyMode: 'proposal',
  instructions: 'Merge duplicate memories and delete outdated items',
  clientToken: 'dream-001',
});
const dreamId = created.dreamId;

// 2. Poll the task status until it reaches a terminal state
const task = await client.getMemoryDreamTask({
  memoryStoreName: 'agent_memory',
  dreamId,
});
console.log(task.status, task.actions);

// 3. Review action proposals
const { actions } = await client.listMemoryDreamActions({
  memoryStoreName: 'agent_memory',
  dreamId,
  limit: 100,
});

// 4. Apply the selected actions (skip NOOP)
await client.applyMemoryDreamActions({
  memoryStoreName: 'agent_memory',
  dreamId,
  mode: 'actions',
  actionIds: actions.filter((a) => a.action !== 'NOOP').map((a) => a.actionId),
  applier: 'operator-001',
});

Key parameters

Le tableau suivant répertorie les principaux paramètres pour la création d'une tâche de consolidation. Pour la plage de valeurs de chaque paramètre, consultez Limitations and notes.

Paramètre

Description

scopes

Liste des portées à consolider. Obligatoire. Jusqu'à 20.

actionIds

Liste des ID d'action lors de l'application des actions. Obligatoire pour ApplyMemoryDreamActions ; un tableau vide n'est pas autorisé. Obtenez-le à partir de la réponse ListMemoryDreamActions.

confidenceThresholds

Seuils d'application automatique. Les clés sont add / update / merge, avec des valeurs comprises entre 0~1. Les actions DELETE ne prennent pas en charge les seuils automatiques et restent toujours à l'état de proposition.

scopeOutputMode

Emplacement des résultats de consolidation : preserve_scope (par défaut, conserve la portée d'origine) / promote_scope (promotion vers un niveau supérieur).

incremental

true consolide de manière incrémentielle à partir de la dernière progression traitée avec succès (adapté au déclenchement programmé) ; la valeur par défaut false consolide l'intégralité des données.

minTimestamp / maxTimestamp

Limiter la plage horaire des messages à consolider.

maxSessions

Nombre maximal de sessions traitées lors d'une seule consolidation.

maxMessages

Nombre maximal de messages traités lors d'une seule consolidation.

maxMemories

Nombre maximal de mémoires traitées lors d'une seule consolidation.

expandedScopeLimit

Nombre maximal de portées après expansion.

instructions

Instructions de consolidation personnalisées. Jusqu'à 4 000 caractères.

Usage recommendations

  • Ne bloquez pas les chemins de requête en ligne en attendant les résultats de consolidation. Les tâches de consolidation s'exécutent de manière asynchrone en arrière-plan ; interrogez GetMemoryDreamTask pour obtenir la progression.

  • En production, privilégiez le mode proposal et n'appliquez qu'après confirmation manuelle ou programmatique avec apply. Lorsque vous avez suffisamment confiance dans les résultats, définissez des seuils raisonnables pour add / update / merge dans confidenceThresholds et activez le mode safe_auto.

  • Pour une consolidation programmée, utilisez incremental=true afin d'éviter de retraiter l'intégralité des données à chaque fois.

File memory Dream

File memory Dream consolide de manière asynchrone les fichiers texte dans un magasin de mémoire de fichiers accessible en écriture. Il peut lire les fichiers existants depuis une ou plusieurs portées et écrire automatiquement le résultat complet (dédupliqué, résumé, corrigé et réorganisé) dans une seule portée de sortie déterministe.

Applicability

Avant d'utiliser File memory Dream, assurez-vous que le magasin de mémoire remplit les conditions suivantes :

  • Le magasin de mémoire a été créé avec inputType=file et outputTypes=["file"]. Les fichiers en lecture seule générés à partir de messages ne prennent pas en charge File Dream.

  • L'entrée et la sortie doivent appartenir au même magasin de mémoire. L'entrée peut couvrir plusieurs portées, mais la sortie doit être une portée complète à quatre niveaux sans caractères génériques.

  • Seuls les fichiers texte UTF-8 sont consolidés ; les fichiers binaires et le chemin système /.wiki/ sont exclus de la consolidation.

  • Une seule tâche accepte jusqu'à 8 sélecteurs de portée. Les portées avec caractères génériques sont développées niveau par niveau depuis la droite, et le nombre de portées développées est limité par expandedScopeLimit.

Les scénarios adaptés à File Dream incluent la fusion de plusieurs enregistrements d'exécution du même agent dans un manuel partagé, la consolidation des conventions de projet provenant de plusieurs agents, la fusion de fichiers dupliqués ou la réorganisation des répertoires tout en préservant les différences sources.

Quick start

L'exemple suivant consolide tous les enregistrements d'exécution de deux agents dans une portée partagée.

Python

from tablestore_agent_storage import AgentStorageClient

client = AgentStorageClient(
    api_key="<your-api-key>",
    ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
    ots_instance_name="<instance-name>",
)

output_scope = {
    "appId": "project-app",
    "tenantId": "team-a",
    "agentId": "shared-agent",
    "runId": "knowledge",
}

# 1. Create the task: read files from multiple input scopes; the consolidated result is automatically written to the single output scope
resp = client.create_memory_dream_task({
    "memoryStoreName": "agent_files",
    "scopes": [
        {"appId": "project-app", "tenantId": "team-a", "agentId": "research-agent", "runId": "*"},
        {"appId": "project-app", "tenantId": "team-a", "agentId": "coding-agent", "runId": "*"},
    ],
    "outputScope": output_scope,
    "instructions": "Organize project materials by topic and remove duplicate content; when conflicts exist, preserve the applicable scope and the differences.",
    "maxItems": 1000,
    "expandedScopeLimit": 200,
    "clientToken": "project-file-dream-001",
})
dream_id = resp.get("dreamId")

# 2. Poll the task until it reaches a terminal state
task = client.get_memory_dream_task({
    "memoryStoreName": "agent_files",
    "dreamId": dream_id,
})
print(f"status: {task.get('status')}, actions: {task.get('actions')}")

# 3. Check the file changes actually performed by the service
actions = client.list_memory_dream_actions({
    "memoryStoreName": "agent_files",
    "dreamId": dream_id,
    "limit": 100,
}).get("actions", [])

# 4. Read back the result files under the output scope
items = client.list_items({
    "memoryStoreName": "agent_files",
    "scope": output_scope,
    "limit": 100,
}).get("items", [])
for it in items:
    doc = client.get_item({
        "memoryStoreName": "agent_files",
        "scope": output_scope,
        "path": it["path"],
    })
    print(doc.get("path"), doc.get("content"))

TypeScript

import { AgentStorageClient } from '@tablestore/agent-storage';

const client = new AgentStorageClient({
  apiKey: '<your-api-key>',
  endpoint: 'https://<instance>.<region>.ots.aliyuncs.com',
  instanceName: '<instance-name>',
});

const outputScope = {
  appId: 'project-app',
  tenantId: 'team-a',
  agentId: 'shared-agent',
  runId: 'knowledge',
};

// 1. Create the task: read files from multiple input scopes; the consolidated result is automatically written to the single output scope
const created = await client.createMemoryDreamTask({
  memoryStoreName: 'agent_files',
  scopes: [
    { appId: 'project-app', tenantId: 'team-a', agentId: 'research-agent', runId: '*' },
    { appId: 'project-app', tenantId: 'team-a', agentId: 'coding-agent', runId: '*' },
  ],
  outputScope,
  instructions: 'Organize project materials by topic and remove duplicate content; when conflicts exist, preserve the applicable scope and the differences.',
  maxItems: 1000,
  expandedScopeLimit: 200,
  clientToken: 'project-file-dream-001',
});
const dreamId = created.dreamId;

// 2. Poll the task until it reaches a terminal state
const task = await client.getMemoryDreamTask({
  memoryStoreName: 'agent_files',
  dreamId,
});
console.log(task.status, task.actions);

// 3. Check the file changes actually performed by the service
const { actions } = await client.listMemoryDreamActions({
  memoryStoreName: 'agent_files',
  dreamId,
  limit: 100,
});

// 4. Read back the result files under the output scope
const { items } = await client.listItems({
  memoryStoreName: 'agent_files',
  scope: outputScope,
  limit: 100,
});
for (const it of items) {
  const doc = await client.getItem({
    memoryStoreName: 'agent_files',
    scope: outputScope,
    path: it.path,
  });
  console.log(doc.path, doc.content);
}
  • Pour File Dream, taskType est fixé à memory (peut être omis), effort est fixé à high, applyMode est fixé à auto (tous peuvent être omis). Ne transmettez pas de fenêtres temporelles de message, ni incremental, scopeOutputMode, confidenceThresholds, maxSessions, maxMessages ou maxMemories. Réutilisez le même clientToken lors de la nouvelle tentative de la même requête métier pour éviter de créer des tâches en double.

  • get_memory_dream_task renvoie les sélecteurs d'entrée, les portées réellement développées, la portée de sortie et le nombre de fichiers figés. Les états terminaux incluent completed, completed_with_failures, failed, cancelled ; seul l'état completed avec zéro action échouée compte comme une réussite totale.

  • Les actions de fichier utilisent ADD, UPDATE, DELETE ; un renommage apparaît comme une action UPDATE avec un nouveau path. itemChange.sourceVersionIds enregistre les versions de fichier sur lesquelles la consolidation s'est basée et renvoie resultItemId et resultVersionId en cas d'écriture réussie. Si list_memory_dream_actions renvoie un nextToken, continuez la pagination jusqu'à ce qu'il soit vide.

  • Les actions de fichier sont appliquées automatiquement pendant l'exécution de la tâche et ne nécessitent aucune confirmation manuelle. Ne jugez pas la qualité de la consolidation uniquement sur la base de l'état de la tâche ou du nombre d'actions ; relisez le répertoire de sortie, le contenu, les versions et les sources pour confirmer qu'ils répondent à vos exigences métier.

Limits and considerations

Élément

Limite ou comportement

Sélecteurs de portée d'entrée

1 à 8

Portée de sortie

Une seule portée complète à quatre niveaux ; les caractères génériques ne sont pas autorisés

expandedScopeLimit

Par défaut 200, maximum 1 000

maxItems

Par défaut 1 000, maximum 5 000 ; inclut les fichiers d'entrée dédupliqués et les fichiers existants dans la portée de sortie

instructions

Jusqu'à 4 000 octets (UTF-8)

Type de fichier

Fichiers texte UTF-8 uniquement ; jusqu'à 100 KiB par fichier

Chemin système

Ne lit pas et n'écrit pas dans /.wiki/

Méthode d'application

Écriture automatique ; proposal, safe_auto, plan et l'application manuelle ne sont pas pris en charge

Pendant l'exécution de la tâche, chaque mise à jour et suppression utilise les versions de fichier pour la protection contre les accès concurrents. Lorsque d'autres appelants modifient simultanément les fichiers de sortie, les actions peuvent échouer ; relisez les fichiers actuels, puis créez une nouvelle tâche de consolidation.

L'annulation ou l'échec n'annule pas les actions de fichier déjà appliquées. Lors de la gestion d'un état terminal non réussi, listez d'abord toutes les actions et relisez la portée de sortie, puis décidez s'il faut conserver, corriger ou reconsolider.