La mémoire de fichiers permet aux agents d'IA de lire le contexte à long terme sous forme de fichiers. Les applications peuvent gérer directement les fichiers ou laisser le service de magasin de mémoire convertir les messages de conversation en fichiers en lecture seule.
Fonctionnalités
Le service de magasin de mémoire offre les capacités de fichier suivantes.
|
Capacité |
Type de magasin de mémoire |
Opérations sur les fichiers |
Cas d'utilisation |
|
Conversion de conversation en fichier |
|
Lister, lire et rechercher des fichiers en lecture seule générés par le service |
Poursuivre l'écriture via des messages tout en permettant à l'agent de lire la mémoire sous forme de fichiers |
|
Gestion directe des fichiers |
|
Créer, lire, mettre à jour, renommer, supprimer et gérer les versions |
Mémoire Markdown existante ou besoin d'organiser indépendamment les répertoires et les versions |
|
Organisation intelligente des fichiers |
|
Lire des fichiers texte sur plusieurs périmètres et écrire automatiquement dans un périmètre de sortie déterministe |
Dédupliquer, résumer, corriger, fusionner ou réorganiser des fichiers existants |
Sous Linux, vous pouvez également utiliser agent-memory-fuse pour monter la mémoire de fichiers en tant que répertoire local, ce qui permet aux agents et aux applications d'accéder à la mémoire via des opérations de fichier standard.
Prérequis
Vous avez créé une instance AgentStorage et obtenu le endpoint ainsi que le nom de l'instance.
Le SDK Agent Storage est installé : Python >=
1.0.10, TypeScript >=0.0.13
Démarrage rapide
Les exemples suivants détaillent l'installation du SDK, la configuration des identifiants, l'initialisation du client et l'utilisation des fonctionnalités de fichier pour créer un magasin de mémoire de fichiers, écrire un fichier Markdown et le relire. Pour plus d'opérations telles que la liste, la mise à jour et la suppression, consultez la section Opérations courantes sur les fichiers ci-dessous.
Python
from tablestore_agent_storage import AgentStorageClient
client = AgentStorageClient(
api_key="your-api-key",
ots_endpoint="https://your-instance.cn-beijing.ots.aliyuncs.com",
ots_instance_name="your-instance-name",
)
scope = {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "assistant",
"runId": "session-001",
}
client.create_memory_store({
"memoryStoreName": "agent_files",
"storageMode": "filemem",
})
client.add_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"content": "# User preferences\n\n- Prefers Americano coffee\n- Prefers concise responses\n",
})
item = client.get_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"view": "full",
})
print(item["content"])
TypeScript
import { AgentStorageClient } from '@tablestore/agent-storage';
async function main() {
const client = new AgentStorageClient({
apiKey: 'your-api-key',
endpoint: 'https://your-instance.cn-beijing.ots.aliyuncs.com',
instanceName: 'your-instance-name',
});
const scope = {
appId: 'app-001',
tenantId: 'user-001',
agentId: 'assistant',
runId: 'session-001',
};
await client.createMemoryStore({
memoryStoreName: 'agent_files',
storageMode: 'filemem',
});
await client.addItem({
memoryStoreName: 'agent_files',
scope,
path: '/profile/preferences.md',
content: '# User preferences\n\n- Prefers Americano coffee\n- Prefers concise responses\n',
});
const item = await client.getItem({
memoryStoreName: 'agent_files',
scope,
path: '/profile/preferences.md',
view: 'full',
});
console.log(item.content);
}
void main();
storageMode est un paramètre obligatoire lors de la création d'un magasin de mémoire et ne peut pas être modifié après la création. Les opérations ultérieures sur les fichiers n'ont pas besoin de transmettre à nouveau ce paramètre ; le SDK Agent Storage remplit automatiquement les champs de type requis par les interfaces Item.
Convertir les conversations en fichiers de mémoire en lecture seule
Si votre application écrit déjà des conversations via AddMemories, vous pouvez laisser le service générer de manière asynchrone des fichiers de mémoire en lecture seule sans avoir à maintenir vous-même le contenu des fichiers.
Les quatre étapes suivantes peuvent toutes être effectuées dans la console ou via le SDK. Chaque étape présente les deux méthodes (les exemples SDK utilisent Python).
1. Créer un magasin de mémoire
Créez un magasin de mémoire qui produit à la fois une mémoire structurée et des fichiers :
Console
Connectez-vous à la console Agent Storage, accédez à Memory store management et cliquez sur Create memory store.
Pour Input type, sélectionnez Short-term messages. Pour Output type, sélectionnez File memory (vous pouvez également sélectionner Structured memory si vous avez besoin d'une récupération sémantique simultanée).
Cliquez sur OK pour terminer la création.
SDK
from tablestore_agent_storage import AgentStorageClient
client = AgentStorageClient(
api_key="your-api-key",
ots_endpoint="https://your-instance.cn-beijing.ots.aliyuncs.com",
ots_instance_name="your-instance-name",
)
client.create_memory_store({
"memoryStoreName": "agent_memory",
"description": "Conversation memory for an agent",
"inputType": "messages",
"outputTypes": ["structured", "file"],
})
Si vous n'avez besoin que de fichiers, définissez outputTypes sur ["file"]. inputType ne peut pas être modifié après la création. Les magasins de mémoire utilisant messages comme entrée peuvent ajuster outputTypes via UpdateMemoryStore.
2. Écrire des conversations
Écrivez des messages de conversation dans le magasin de mémoire. Le service génère des fichiers en lecture seule de manière asynchrone.
Console
Ouvrez le magasin de mémoire de fichiers, accédez à la page Short-term memory et cliquez sur Write memory.
Pour Input mode, sélectionnez Conversation messages (JSON). Remplissez le périmètre complet à quatre niveaux (Application appId, Tenant/User tenantId, Agent agentId, Session runId).
Collez le JSON des messages de conversation et cliquez sur OK pour soumettre. Les fichiers sont générés de manière asynchrone. Après la soumission, vous pouvez vérifier l'état de la tâche de génération sur la page Request log.
SDK
Appelez AddMemories pour écrire des messages. La sortie de fichier ne prend en charge que la génération asynchrone, donc sync doit être false ou omis.
resp = client.add_memories({
"memoryStoreName": "agent_memory",
"scope": {
"appId": "shopping-app",
"tenantId": "user-001",
"agentId": "shopping-assistant",
"runId": "session-001",
},
"messages": [
{"role": "user", "content": "I usually drink Americano coffee without sugar."},
{"role": "assistant", "content": "Okay, I will remember your beverage preference."},
],
"sync": False,
})
request_id = resp["requestId"]
Enregistrez le requestId de la réponse. Transmettre sync=true renvoie 400 INVALID_PARAMETER.
3. Attendre la fin de la génération des fichiers
Interrogez l'état de la tâche de génération pour confirmer que le service a généré les fichiers en lecture seule.
Console
Ouvrez le magasin de mémoire de fichiers et accédez à la page Request log.
Trouvez l'enregistrement correspondant grâce au
Request IDenregistré lors de l'écriture, vérifiez la colonne Status et attendez que l'état deviennecompleted.
SDK
Utilisez le requestId renvoyé par AddMemories pour appeler GetMemoryTask :
task = client.get_memory_task({
"memoryStoreName": "agent_memory",
"requestId": request_id,
})
print(task["task"]["status"])
Lorsque task.status est completed, toutes les sorties configurées ont été générées. Pour les magasins de mémoire à double sortie, la tâche globale est completed uniquement après la génération de la mémoire structurée et des fichiers.
4. Lister et lire les fichiers
Utilisez le périmètre exact à quatre niveaux de l'opération d'écriture pour parcourir les fichiers en lecture seule générés par le service. Les fichiers générés par le service ne prennent pas en charge les périmètres avec caractères génériques.
Console
Connectez-vous à la console Agent Storage, ouvrez le magasin de mémoire de fichiers et accédez à la page Long-term memory.
Basculez vers File memory et sélectionnez le périmètre complet utilisé lors de l'écriture.
Parcourez les fichiers en lecture seule générés dans l'arborescence des fichiers. Cliquez sur un fichier pour afficher son contenu et l'historique des versions.
SDK
Appelez ListItems pour lister les fichiers, puis lisez chacun d'eux.
scope = {
"appId": "shopping-app",
"tenantId": "user-001",
"agentId": "shopping-assistant",
"runId": "session-001",
}
page = client.list_items({
"type": "memoryfile",
"memoryStoreName": "agent_memory",
"scope": scope,
"limit": 20,
})
# Get the actual path from items, then read the content
for entry in page["items"]:
item = client.get_item({
"type": "memoryfile",
"memoryStoreName": "agent_memory",
"scope": scope,
"path": entry["path"],
"view": "full",
})
print(item["path"], item["content"])
Lorsque readOnly de niveau supérieur dans la réponse est true, ces fichiers sont maintenus par le service. La lecture du contenu nécessite de définir view=full.
L'appel des interfaces de création, de mise à jour, de renommage ou de suppression sur ces fichiers renvoie 409 READ_ONLY_STORE. Pour modifier le contenu, continuez à écrire des conversations ou maintenez la mémoire source via les interfaces de mémoire structurée.
Monter en tant que répertoire local via FUSE
agent-memory-fuse mappe un magasin de mémoire de fichiers et un périmètre exact dans une instance Tablestore vers un répertoire local Linux. Après le montage, les agents et les applications peuvent utiliser ls, cat, des éditeurs ou des API de fichiers pour lire et écrire dans la mémoire sans intégrer le SDK Agent Storage dans l'application.
Chaque montage correspond à un seul (instance, memoryStoreName, scope). Cet outil est conçu pour la mémoire de fichiers, et non comme un système de fichiers POSIX polyvalent.
Préparer l'environnement
Obtenez l'exécutable Linux
agent-memory-fusecorrespondant à l'architecture de votre environnement d'exécution et ajoutez les permissions d'exécution.FUSE est activé dans le noyau Linux et l'utilisateur actuel ou le conteneur peut accéder à
/dev/fuse.fusermount3est installé. Sur certains systèmes, le nom de la commande estfusermount.Un magasin de mémoire de fichiers avec
storageMode=filemema été créé. Préparez le endpoint HTTPS de l'instance, le nom de l'instance et le périmètre complet à quatre niveaux.Une clé API, un AccessKey ou des identifiants temporaires STS sont prêts. Les clés API doivent être utilisées avec des endpoints HTTPS.
L'exécution dans un conteneur nécessite généralement de mapper /dev/fuse et d'accorder CAP_SYS_ADMIN ou des permissions de montage d'espace utilisateur équivalentes. Utilisez une configuration avec le principe du moindre privilège en fonction de votre environnement d'exécution.
chmod +x ./agent-memory-fuse
mkdir -p /mnt/agent-memory
Monter la mémoire de fichiers
Exécutez la commande suivante. Le périmètre dans l'exemple correspond à l'objet scope du démarrage rapide. Utilisez des guillemets pour entourer le périmètre complet afin d'éviter que le shell n'interprète incorrectement les caractères spéciaux.
./agent-memory-fuse mount \
--endpoint https://your-instance.cn-beijing.ots.aliyuncs.com \
--instance your-instance-name \
--credential apikey:your-api-key \
--store agent_files \
--scope 'app-001#user-001#assistant#session-001' \
--session fuse-session-001 \
/mnt/agent-memory
La commande de montage s'exécute au premier plan et gère le cycle de vie du montage. Le journal suivant indique que le chargement initial du répertoire et le montage ont réussi.
mounted /mnt/agent-memory: store=agent_files files=1 readOnly=false
Maintenez ce processus en cours d'exécution et accédez au répertoire monté depuis un autre terminal ou processus métier. En production, utilisez systemd ou un système d'orchestration de conteneurs pour gérer le processus. Ne terminez pas brutalement le processus tant que le montage est encore utilisé.
Les principaux paramètres sont les suivants.
|
Paramètre |
Description |
|
|
Endpoint HTTPS de l'instance Tablestore |
|
|
Nom de l'instance Tablestore |
|
|
|
|
|
Nom du magasin de mémoire avec |
|
|
Périmètre exact séparé par |
|
|
Identifiant de session pour ce montage, utilisé pour l'attribution de version côté serveur. Différentes sessions d'écriture doivent utiliser des valeurs différentes. |
|
|
Facultatif. Restreint ce montage en lecture seule. |
|
Dernier argument positionnel |
Répertoire de montage local |
--credential contient des informations sensibles. L'exemple montre uniquement le format du paramètre. N'écrivez pas d'identifiants réels dans le code, les images, les journaux ou les scripts partagés. Privilégiez les identifiants à courte durée de vie avec des permissions restreintes.
Lire et écrire des fichiers
Une fois le montage réussi, vous pouvez lire, créer, modifier, renommer et supprimer des fichiers comme dans un répertoire classique.
# View existing server-side files
find /mnt/agent-memory -type f
cat /mnt/agent-memory/profile/preferences.md
# Create or update files
mkdir -p /mnt/agent-memory/projects/alpha
printf '%s\n' '# Project decisions' '' '- Use an event-driven architecture' \
> /mnt/agent-memory/projects/alpha/decisions.md
cat /mnt/agent-memory/projects/alpha/decisions.md
# Rename and delete files
mv /mnt/agent-memory/projects/alpha/decisions.md \
/mnt/agent-memory/projects/alpha/architecture.md
rm /mnt/agent-memory/projects/alpha/architecture.md
Les fichiers sont synchronisés avec le serveur lors de flush, fsync ou close. Les applications de production doivent vérifier les valeurs de retour de fsync et close. Certaines redirections de shell ne signalent pas les erreurs lors de l'étape close. Pour les écritures importantes, relisez le fichier après achèvement pour confirmer.
Les répertoires sont formés à partir des préfixes de chemin de fichier. Les répertoires contenant des fichiers peuvent être restaurés entre les processus et les remontages. Les répertoires vides existent uniquement au sein du processus de montage actuel.
Montage en lecture seule
Si l'agent a seulement besoin de lire la mémoire, ajoutez --read-only avant l'argument du répertoire de montage.
./agent-memory-fuse mount \
--endpoint https://your-instance.cn-beijing.ots.aliyuncs.com \
--instance your-instance-name \
--credential apikey:your-api-key \
--store agent_files \
--scope 'app-001#user-001#assistant#session-001' \
--session fuse-reader-001 \
--read-only \
/mnt/agent-memory
Pour les vues de fichiers en lecture seule générées à partir de la mémoire structurée, le serveur bascule automatiquement le montage en lecture seule. Les opérations d'écriture sur un montage en lecture seule renvoient EROFS.
Rotation des identifiants STS
Lors du montage avec des identifiants STS, vous pouvez effectuer la rotation complète de l'AccessKey ID, de l'AccessKey Secret et du STS Token sans démonter le répertoire. Le fournisseur d'identifiants doit écrire le JSON suivant sur la sortie standard et le canaliser vers la commande de rotation.
{"accessKeyId":"new-access-key-id","accessKeySecret":"new-access-key-secret","stsToken":"new-sts-token"}
your-credential-provider | \
./agent-memory-fuse rotate-credential --mountpoint /mnt/agent-memory
La commande de rotation lit les identifiants depuis l'entrée standard pour éviter de placer de nouveaux identifiants dans les arguments de ligne de commande. Une commande réussie indique que les nouveaux identifiants ont été installés dans le processus de montage local. La validité des identifiants sera confirmée lors des requêtes de fichiers suivantes. Seuls les processus de confiance peuvent accéder au point de montage et effectuer la rotation des identifiants.
Démonter la mémoire de fichiers
Après avoir terminé les opérations sur les fichiers et fermé tous les fichiers ouverts, exécutez la commande suivante.
./agent-memory-fuse umount /mnt/agent-memory
Une fois le démontage réussi, le processus de montage au premier plan se termine. Si le système ne dispose ni de fusermount3 ni de fusermount, la commande de démontage renvoie une erreur. Installez d'abord les outils userspace FUSE.
Limites et dépannage
Seul le texte UTF-8 valide est pris en charge. La taille maximale d'un seul fichier est de 100 KiB. Le dépassement de ces limites renvoie respectivement
EILSEQouEFBIG.Chaque périmètre prend en charge un maximum de 2 000 fichiers actuels par défaut. Lorsque le quota est atteint, les écritures renvoient
ENOSPC.Lorsque plusieurs clients modifient simultanément le même fichier, les handles de fichier obsolètes peuvent renvoyer
ESTALE. Rouvrez et lisez le dernier contenu avant de décider de réessayer.Des identifiants invalides ou un STS Token expiré renvoient
EACCES. Effectuez une rotation des identifiants ou remontez avec des identifiants valides.Une limitation de débit du service ou une brève indisponibilité peut renvoyer
EAGAIN. L'outil effectue d'abord des tentatives limitées. Les applications doivent toujours utiliser des stratégies de backoff pour gérer les erreurs finales.Les liens symboliques, les liens physiques, les ACL, les attributs étendus, les fichiers clairsemés et les verrous de fichiers inter-sessions ne sont pas pris en charge.
Si vous voyez
operation not permittedou si vous ne pouvez pas ouvrir/dev/fuse, vérifiez le mappage des périphériques, les permissions de l'utilisateur actuel et les capacités de montage du conteneur.Si vous voyez une erreur
initial directory load, vérifiez si le endpoint, le nom de l'instance, les identifiants, le nom du magasin de mémoire et le périmètre correspondent.
Emplacement des fichiers
Un fichier est identifié conjointement par le magasin de mémoire, le périmètre et le chemin.
memoryStoreName: Le nom du magasin de mémoire.scope: Le périmètre auquel appartient le fichier. Vous devez fournir leappId, letenantId, l'agentIdet lerunIdcomplets. Le caractère générique*n'est pas pris en charge.path: Le chemin du fichier au sein du périmètre. Nous recommandons d'utiliser des chemins sémantiques avec un/initial, tels que/profile/preferences.mdou/projects/alpha/decisions.md.
Le même chemin peut être utilisé dans différents périmètres. Le contenu des fichiers est isolé entre les périmètres. L'itemId renvoyé par l'interface de liste est l'identifiant stable du fichier et est requis lors de l'interrogation des versions historiques.
Opérations courantes sur les fichiers
Les opérations suivantes peuvent être effectuées dans la console ou via le SDK. Toutes les opérations de la console se trouvent sur la page Long-term memory du magasin de mémoire de fichiers : sélectionnez d'abord l'Application (appId) et le Tenant/User (tenantId) (l'Agent et la Session peuvent être définis sur « All » pour la navigation ; la création ou le téléchargement de fichiers nécessite un périmètre complet à quatre niveaux), parcourez la liste des fichiers par Path prefix à gauche et cliquez sur un fichier pour afficher son contenu, ses métadonnées et l'historique des versions à droite. Les exemples SDK utilisent le client, le scope et le magasin de mémoire agent_files du démarrage rapide.
Lire uniquement les métadonnées
Console
Sélectionnez le fichier cible dans la liste des fichiers à gauche. Le panneau de détails à droite affiche directement le contenu du fichier, l'Creation time, l'Update time et l'actuel Version ID. Aucune opération supplémentaire n'est nécessaire pour afficher les métadonnées.
SDK
Définissez includeContent sur False. La réponse n'inclura pas content, ce qui convient pour vérifier les résumés de fichiers et les heures de mise à jour.
current = client.get_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"includeContent": False,
})
print(current["contentSha256"], current["updatedAt"])
Mettre à jour le contenu d'un fichier
Console
Sélectionnez le fichier, cliquez sur Edit or replace data, modifiez le File content et enregistrez. La console effectue une validation de concurrence basée sur la version actuelle. Si le fichier a été modifié par une autre requête, l'enregistrement échoue. Refresh et réessayez.
SDK
Pour les scénarios d'écriture concurrente, nous recommandons de transmettre le contentSha256 de la dernière lecture en tant que expectedSha256. Lorsque le fichier a été modifié par une autre requête, le service rejette l'écrasement. L'application doit relire le fichier puis décider de réessayer.
updated = client.update_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"content": "# User preferences\n\n- Prefers latte\n- Prefers concise responses\n",
"expectedSha256": current["contentSha256"],
})
Renommer un fichier
Console
Sélectionnez le fichier, cliquez sur Rename, saisissez le nouveau File path et confirmez. Si le chemin cible existe déjà, un conflit est signalé.
SDK
UpdateItem gère à la fois les mises à jour de contenu et les renommages. Une seule requête doit spécifier exactement l'un des éléments content ou newPath.
renamed = client.update_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"newPath": "/profile/user-preferences.md",
"expectedSha256": updated["contentSha256"],
})
Lorsque le chemin cible existe déjà, un conflit est renvoyé par défaut. Définissez "overwrite": True uniquement lorsque l'activité métier confirme que le remplacement du fichier cible est autorisé.
Lister les fichiers avec pagination
Console
Sur la page Long-term memory, après avoir sélectionné un périmètre, filtrez et parcourez la liste des fichiers par Path prefix à gauche avec pagination. Cliquez sur Refresh pour obtenir la dernière liste.
SDK
ListItems renvoie 100 fichiers par page par défaut, avec un maximum de 500 par page. Lorsque la réponse inclut nextToken, transmettez-le tel quel dans la requête suivante.
next_token = None
while True:
request = {
"memoryStoreName": "agent_files",
"scope": scope,
"pathPrefix": "/profile/",
"limit": 100,
}
if next_token:
request["nextToken"] = next_token
page = client.list_items(request)
for entry in page["items"]:
print(entry["path"])
next_token = page.get("nextToken")
if not next_token:
break
Supprimer un fichier
Console
Sélectionnez le fichier, cliquez sur Delete et confirmez. La suppression retire le fichier actuel et crée une version de suppression. Les versions historiques peuvent toujours être consultées dans l'Version history.
SDK
client.delete_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/user-preferences.md",
"expectedSha256": renamed["contentSha256"],
})
L'opération de suppression retire le fichier actuel, mais les versions historiques peuvent toujours être interrogées par ID de fichier.
Interroger les versions historiques
Chaque opération de création, de mise à jour, de renommage ou de suppression crée une version historique immuable. Obtenez d'abord l'itemId du fichier actuel ou d'une réponse précédemment enregistrée, puis listez les versions.
versions = client.list_item_versions({
"memoryStoreName": "agent_files",
"scope": scope,
"itemId": renamed["itemId"],
"limit": 20,
})
version = versions["versions"][0]
snapshot = client.get_item_version({
"memoryStoreName": "agent_files",
"scope": scope,
"itemId": version["itemId"],
"versionId": version["versionId"],
"versionSeq": version["versionSeq"],
})
print(snapshot.get("content"))
Vous pouvez utiliser operation pour filtrer les versions created, modified ou deleted. La liste des versions ne renvoie pas le contenu. Appelez GetItemVersion pour lire un instantané spécifique.
Caviarder les versions historiques
Le caviardage est irréversible. Avant d'exécuter, confirmez que vous avez sélectionné la bonne version historique.
RedactItemVersion efface le chemin, le contenu, le hachage de contenu et la taille d'un instantané historique. Il conserve le type d'opération, la séquence de version, l'heure de création et les informations d'audit de caviardage. Les requêtes répétées sont idempotentes. Le caviardage ne modifie pas le fichier actuel et ne crée pas de nouvelle version.
redacted = client.redact_item_version({
"memoryStoreName": "agent_files",
"scope": scope,
"itemId": version["itemId"],
"versionId": version["versionId"],
"versionSeq": version["versionSeq"],
"sessionId": "privacy-job-001",
})
print(redacted["redacted"], redacted["redactedAt"])
Après le caviardage, l'appel à GetItemVersion renvoie toujours la version, mais elle n'inclut plus content.
Lire la vue fichier de la mémoire structurée
Si votre application écrit des conversations ou du texte dans le service et utilise des interfaces de mémoire structurée pour la récupération sémantique, la même mémoire peut également être parcourue sous forme de fichiers par l'agent.
Continuez à écrire et à maintenir les données via des interfaces de mémoire structurée telles que
AddMemories,UpdateMemoryetDeleteMemory.Utilisez les fonctions
list_itemsetget_itemdu SDK Agent Storage pour lister et lire les fichiers générés.-
Lorsque la réponse
ListItemsinclutreadOnly: true, la vue fichier actuelle est en lecture seule. Les opérations de création, de mise à jour, de renommage, de suppression et de version ne sont pas prises en charge.page = client.list_items({ "memoryStoreName": "agent_memory", "scope": scope, }) if page.get("readOnly"): for entry in page["items"]: item = client.get_item({ "memoryStoreName": "agent_memory", "scope": scope, "path": entry["path"], }) print(item["path"], item["content"])
Les opérations d'écriture de fichiers sur une vue fichier en lecture seule renvoient READ_ONLY_STORE. Dans ce cas, modifiez la mémoire source via les interfaces de mémoire structurée.
Erreurs courantes
|
Code d'erreur |
Cause courante |
Correction suggérée |
|
|
Périmètre incomplet, chemin invalide ou la requête de mise à jour a fourni à la fois |
Vérifiez le périmètre complet à quatre niveaux, le chemin et la branche de requête |
|
|
Le magasin de mémoire, le périmètre, le chemin ou la version n'existe pas |
Vérifiez les informations d'emplacement du fichier. Ne réutilisez pas les identifiants de fichier entre les périmètres. |
|
|
Le chemin cible pour la création ou le renommage existe déjà |
Utilisez un chemin différent. Activez l'écrasement uniquement lorsque l'activité métier le confirme. |
|
|
Le fichier a été modifié par une autre requête |
Relisez le fichier et décidez de réessayer en fonction du dernier contenu |
|
|
Des modifications concurrentes se produisent dans le même périmètre |
Réessayez après un bref délai et relisez le dernier fichier |
|
|
Tentative de modification d'une vue fichier en lecture seule |
Utilisez plutôt les interfaces de mémoire structurée pour mettre à jour la mémoire source |
Limites
Seul le texte UTF-8 valide est pris en charge. La taille maximale d'un seul fichier est de 100 KiB.
Le chemin normalisé peut atteindre 800 octets. Les chemins ne peuvent pas pointer vers le répertoire racine et ne peuvent pas contenir de segments de chemin vides,
.,..ou de caractères NUL.Chaque périmètre prend en charge un maximum de 2 000 fichiers actuels par défaut.
Toutes les interfaces Item nécessitent un périmètre complet à quatre niveaux. Les caractères génériques ne sont pas pris en charge.
Les versions historiques caviardées ne peuvent pas être restaurées.