Le SDK Agent Storage de Tablestore offre un accès unifié aux API Memory Store, file memory et Knowledge Base pour les agents d'IA. Il prend en charge Python et TypeScript et simplifie l'authentification des services grâce aux clés API.
Différences par rapport au SDK Tablestore
Le SDK Agent Storage est distinct du SDK Tablestore et se concentre sur le stockage pour agents. Le tableau suivant répertorie les principales différences.
|
Dimension |
SDK Tablestore |
SDK Agent Storage |
|
Package |
Python : |
Python : |
|
Classe client |
|
|
|
Portée |
Toutes les API Tablestore, y compris les API Memory Store |
API du service de stockage pour agents pour Memory Store, file memory et Knowledge Base |
|
Authentification |
AccessKey (AK/SK) |
Clé API ou AccessKey (AK/SK) |
Installation et configuration
Prérequis
Une instance Tablestore avec son endpoint HTTPS et son nom d'instance
Pour l'authentification par clé API : une clé API créée sur l'instance cible. L'utilisateur RAM associé à la clé API doit disposer de l'autorisation
ots:CallWithBearerToken. La clé API hérite des stratégies RAM de l'utilisateur.Pour les fonctionnalités Knowledge Base : un compartiment Object Storage Service (OSS) pour les documents sources. Le SDK nécessite des identifiants AccessKey OSS pour télécharger les documents. Spécifiez les paramètres
oss_endpointetoss_bucketlors de l'initialisation du client.
Installation
Installez le package correspondant à votre langage. Les API Item de file memory nécessitent le SDK Python version 1.0.10 ou ultérieure, ou le SDK TypeScript version 0.0.11 ou ultérieure.
Python
pip install tablestore-agent-storage
TypeScript/Node.js
npm install @tablestore/agent-storage
Authentification
Le SDK Agent Storage prend en charge deux méthodes d'authentification.
|
Méthode |
Cas d'utilisation |
API prises en charge |
Transport |
|
AccessKey (AK/SK) |
Accès complet, incluant la gestion des tables et les opérations sur les données |
Toutes les API Tablestore |
HTTP ou HTTPS |
|
Clé API |
Intégration légère pour les applications d'IA sans gestion des identifiants AccessKey |
API du service de stockage pour agents |
HTTPS uniquement |
Pour plus d'informations sur la création et l'autorisation des clés API, consultez la rubrique Gestion des clés API.
Initialiser le client
L'authentification par clé API est recommandée. Les téléchargements vers Knowledge Base et d'autres API Tablestore nécessitent des identifiants AccessKey et une configuration OSS.
Clé API (recommandé)
Initialisez le client avec le paramètre api_key et les informations de l'instance. L'endpoint doit utiliser HTTPS.
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>",
)
resp = client.list_memory_stores({})
for store in resp["stores"]:
print(store["memoryStoreName"])
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 resp = await client.listMemoryStores({});
for (const store of resp.stores) {
console.log(store.memoryStoreName);
}
cURL
Transmettez la clé API dans l'en-tête de requête x-ots-apikey.
curl -X POST 'https://<instance>.<region>.ots.aliyuncs.com/ListMemoryStores' \
-H 'x-ots-instancename: <instance-name>' \
-H 'x-ots-apikey: <your-api-key>' \
-H 'Content-Type: application/json' \
-d '{}'
AccessKey
Utilisez l'authentification AccessKey pour accéder à toutes les API Tablestore ou pour télécharger des documents Knowledge Base vers OSS.
Python
from tablestore_agent_storage import AgentStorageClient
client = AgentStorageClient(
access_key_id="<AccessKey ID>",
access_key_secret="<AccessKey Secret>",
ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
ots_instance_name="<instance-name>",
# Configure OSS to use Knowledge Base features
oss_endpoint="https://oss-<region>.aliyuncs.com",
oss_bucket_name="<bucket-name>",
)
TypeScript
import { AgentStorageClient } from '@tablestore/agent-storage';
const client = new AgentStorageClient({
endpoint: 'https://<instance>.<region>.ots.aliyuncs.com',
instanceName: '<instance-name>',
accessKeyId: process.env.OTS_ACCESS_KEY_ID,
accessKeySecret: process.env.OTS_ACCESS_KEY_SECRET,
});
Exemples Knowledge Base
Knowledge Base découpe et vectorise automatiquement les documents et prend en charge la récupération hybride pour la réponse aux questions en entreprise et la génération augmentée par récupération (RAG). Les documents sources sont stockés dans OSS, tandis que Tablestore gère l'indexation et la récupération des fragments. Configurez OSS et Tablestore avant utilisation.
Si vous ne spécifiez pas de modèle d'incorporation lors de la création d'une base de connaissances, le SDK utilise Alibaba Cloud Model Studio text-embedding-v4 avec 1 024 dimensions. La récupération hybride, qui combine la recherche vectorielle et la recherche en texte intégral, est activée par défaut.
Python
from tablestore_agent_storage import AgentStorageClient
client = AgentStorageClient(
access_key_id="<AccessKey ID>",
access_key_secret="<AccessKey Secret>",
oss_endpoint="https://oss-<region>.aliyuncs.com",
oss_bucket_name="<bucket-name>",
ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
ots_instance_name="<instance-name>",
)
# 1. Create a knowledge base. The default embedding model is Model Studio
# text-embedding-v4, and the default retrieval method is hybrid retrieval.
client.create_knowledge_base({
"knowledgeBaseName": "product_kb",
"description": "Product knowledge base",
})
# 2. Upload local documents. The SDK uploads files to OSS before chunking
# and vectorization.
client.upload_documents({
"knowledgeBaseName": "product_kb",
"documents": [
{
"documentId": "doc-guide-001",
"filePath": "./docs/product-overview.txt",
},
{
"documentId": "doc-guide-002",
"filePath": "./docs/sdk-intro.txt",
},
],
})
# 3. List documents in the knowledge base
resp = client.list_documents({
"knowledgeBaseName": "product_kb",
"maxResults": 10,
})
for doc in resp["data"]["documentDetails"]:
print(doc.get("documentId"), doc.get("ossKey"), doc.get("status"))
# 4. Retrieve documents
from tablestore_agent_storage.models import RetrieveRequest, RetrievalQuery
req = RetrieveRequest(
knowledge_base_name="product_kb",
retrieval_query=RetrievalQuery(text="What is Agent Storage SDK used for?"),
)
result = client.retrieve(req)
for hit in result["data"]["retrievalResults"]:
print(hit)
# 5. Delete documents
client.delete_documents({
"knowledgeBaseName": "product_kb",
"documents": [{"documentId": "doc-guide-001"}],
})
# 6. Delete the knowledge base
client.delete_knowledge_base({"knowledgeBaseName": "product_kb"})
TypeScript
import { NodeAgentStorageClient } from '@tablestore/agent-storage/node';
const client = new NodeAgentStorageClient({
accessKeyId: '<AccessKey ID>',
accessKeySecret: '<AccessKey Secret>',
endpoint: 'https://<instance>.<region>.ots.aliyuncs.com',
instanceName: '<instance-name>',
ossEndpoint: 'https://oss-<region>.aliyuncs.com',
ossBucketName: '<bucket-name>',
ossAccessKeyId: '<AccessKey ID>',
ossAccessKeySecret: '<AccessKey Secret>',
});
// 1. Create a knowledge base. The default embedding model is Model Studio
// text-embedding-v4, and the default retrieval method is hybrid retrieval.
await client.createKnowledgeBase({
knowledgeBaseName: 'product_kb',
description: 'Product knowledge base',
});
// 2. Upload local documents. The SDK uploads files to OSS before chunking
// and vectorization. The service generates docId during upload. The
// TypeScript SDK does not accept a custom documentId.
await client.uploadDocuments({
knowledgeBaseName: 'product_kb',
documents: [
{ filePath: './docs/product-overview.txt' },
{ filePath: './docs/sdk-intro.txt' },
],
});
// 3. List documents in the knowledge base
const resp = await client.listDocuments({
knowledgeBaseName: 'product_kb',
maxResults: 10,
});
for (const doc of resp.data.documentDetails) {
console.log(doc.docId, doc.ossKey, doc.status);
}
// 4. Retrieve documents
const result = await client.retrieve({
knowledgeBaseName: 'product_kb',
retrievalQuery: { text: 'What is Agent Storage SDK used for?' },
});
for (const hit of result.data.retrievalResults) {
console.log(hit);
}
// 5. Delete documents by the ossKey returned in the previous step
await client.deleteDocuments({
knowledgeBaseName: 'product_kb',
documents: [{ ossKey: '<oss-key-from-list>' }],
});
// 6. Delete the knowledge base
await client.deleteKnowledgeBase({ knowledgeBaseName: 'product_kb' });
Le découpage et la vectorisation des documents s'exécutent de manière asynchrone après le téléchargement. Interrogez le champ status avec list_documents (listDocuments en TypeScript) pour vérifier la progression de l'indexation.
Exemples Memory Store
Memory Store conserve les mémoires de conversation multi-tours pour les agents d'IA et prend en charge la récupération sémantique basée sur des vecteurs. Les méthodes du SDK correspondent aux opérations de l'API REST. Les méthodes Python utilisent le format snake_case, les méthodes TypeScript utilisent le format camelCase et les paramètres correspondent à la spécification de l'API.
Python
# 1. Create a memory store
client.create_memory_store({
"memoryStoreName": "agent_memory",
"description": "Long-term memory store for agents",
"extractInstructions": "Focus on the user's dietary preferences and travel habits",
})
# 2. Write memories
client.add_memories({
"memoryStoreName": "agent_memory",
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "assistant",
"runId": "session-001",
},
"messages": [
{"role": "user", "content": "I like Americano coffee"},
],
"sync": True,
})
# 3. Search memories
result = client.search_memories({
"memoryStoreName": "agent_memory",
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "*",
"runId": "*",
},
"query": "What beverages does the user like?",
"topK": 5,
"includeEvidence": True,
"minSimilarity": 0.3,
})
for hit in result["data"]["memories"]:
print(hit["content"], hit["similarity"])
# 4. List scopes in the memory store
scopes = client.list_memory_store_scopes({
"memoryStoreName": "agent_memory",
"scope": {
"appId": "app-001",
"tenantId": "*",
"agentId": "*",
"runId": "*",
},
})
for scope in scopes["scopes"]:
print(scope)
# 5. List memory stores
resp = client.list_memory_stores({})
for store in resp["stores"]:
print(store["memoryStoreName"])
TypeScript
// 1. Create a memory store
await client.createMemoryStore({
memoryStoreName: 'agent_memory',
description: 'Long-term memory store for agents',
});
// 2. Write memories
await client.addMemories({
memoryStoreName: 'agent_memory',
scope: {
appId: 'app-001',
tenantId: 'user-001',
agentId: 'assistant',
runId: 'session-001',
},
messages: [{ role: 'user', content: 'I like Americano coffee' }],
sync: true,
});
// 3. Search memories
const result = await client.searchMemories({
memoryStoreName: 'agent_memory',
scope: { appId: 'app-001', tenantId: 'user-001', agentId: '*', runId: '*' },
query: 'What beverages does the user like?',
topK: 5,
includeEvidence: true,
});
for (const hit of result.data.memories) {
console.log(hit.content, hit.similarity);
}
// 4. List scopes in the memory store
const scopes = await client.listMemoryStoreScopes({
memoryStoreName: 'agent_memory',
scope: { appId: 'app-001', tenantId: '*', agentId: '*', runId: '*' },
});
for (const scope of scopes.scopes) {
console.log(scope);
}
Le SDK fournit également des méthodes pour mettre à jour et supprimer des magasins de mémoire, obtenir et mettre à jour des mémoires individuelles, interroger des tâches asynchrones et consolider des mémoires avec Dream. Pour toutes les opérations et tous les paramètres, consultez la rubrique API de stockage de mémoire.
Exemples file memory
File memory organise le contexte à long terme par chemin de fichier et peut stocker des profils utilisateur, des résumés de conversation et des fichiers de travail d'agent. Le SDK ajoute automatiquement le type memoryfile requis par les API Item. Spécifiez uniquement le magasin de mémoire, l'étendue, le chemin et le contenu.
|
Opération |
Python |
TypeScript |
|
Créer un fichier |
|
|
|
Répertorier les fichiers |
|
|
|
Lire un fichier ou ses métadonnées |
|
|
|
Mettre à jour le contenu ou renommer un fichier |
|
|
|
Supprimer un fichier |
|
|
|
Répertorier les versions historiques |
|
|
|
Lire une version historique |
|
|
|
Caviarder une version historique |
|
|
Toutes les opérations sur les fichiers nécessitent une étendue complète à quatre niveaux avec appId, tenantId, agentId et runId. Le caractère générique * n'est pas pris en charge.
Le caviardage des versions historiques est irréversible. Il supprime le chemin, le contenu, le condensé et la taille uniquement de la version historique spécifiée et ne modifie pas le fichier actuel.
Les exemples suivants supposent que le client est initialisé.
Python
scope = {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "assistant",
"runId": "session-001",
}
client.create_memory_store({
"memoryStoreName": "agent_files",
"storageMode": "filemem",
})
created = client.add_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"content": "# User preferences\n\n- Likes Americano coffee\n",
})
page = client.list_items({
"memoryStoreName": "agent_files",
"scope": scope,
"pathPrefix": "/profile/",
})
current = client.get_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"includeContent": False,
})
updated = client.update_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"content": "# User preferences\n\n- Likes latte\n",
"expectedSha256": current["contentSha256"],
})
renamed = client.update_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/preferences.md",
"newPath": "/profile/user-preferences.md",
"expectedSha256": updated["contentSha256"],
})
versions = client.list_item_versions({
"memoryStoreName": "agent_files",
"scope": scope,
"itemId": created["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"],
})
client.redact_item_version({
"memoryStoreName": "agent_files",
"scope": scope,
"itemId": version["itemId"],
"versionId": version["versionId"],
"versionSeq": version["versionSeq"],
"sessionId": "privacy-job-001",
})
client.delete_item({
"memoryStoreName": "agent_files",
"scope": scope,
"path": "/profile/user-preferences.md",
"expectedSha256": renamed["contentSha256"],
})
print(page["items"], snapshot.get("content"))
TypeScript
const scope = {
appId: 'app-001',
tenantId: 'user-001',
agentId: 'assistant',
runId: 'session-001',
};
await client.createMemoryStore({
memoryStoreName: 'agent_files',
storageMode: 'filemem',
});
const created = await client.addItem({
memoryStoreName: 'agent_files',
scope,
path: '/profile/preferences.md',
content: '# User preferences\n\n- Likes Americano coffee\n',
});
const page = await client.listItems({
memoryStoreName: 'agent_files',
scope,
pathPrefix: '/profile/',
});
const current = await client.getItem({
memoryStoreName: 'agent_files',
scope,
path: '/profile/preferences.md',
includeContent: false,
});
const updated = await client.updateItem({
memoryStoreName: 'agent_files',
scope,
path: '/profile/preferences.md',
content: '# User preferences\n\n- Likes latte\n',
expectedSha256: current.contentSha256,
});
const renamed = await client.updateItem({
memoryStoreName: 'agent_files',
scope,
path: '/profile/preferences.md',
newPath: '/profile/user-preferences.md',
expectedSha256: updated.contentSha256,
});
const versions = await client.listItemVersions({
memoryStoreName: 'agent_files',
scope,
itemId: created.itemId,
limit: 20,
});
const version = versions.versions[0];
const snapshot = await client.getItemVersion({
memoryStoreName: 'agent_files',
scope,
itemId: version.itemId,
versionId: version.versionId,
versionSeq: version.versionSeq,
});
await client.redactItemVersion({
memoryStoreName: 'agent_files',
scope,
itemId: version.itemId,
versionId: version.versionId,
versionSeq: version.versionSeq,
sessionId: 'privacy-job-001',
});
await client.deleteItem({
memoryStoreName: 'agent_files',
scope,
path: '/profile/user-preferences.md',
expectedSha256: renamed.contentSha256,
});
console.log(page.items, snapshot.content);
expectedSha256 est un paramètre optionnel de contrôle de concurrence. Si plusieurs appelants peuvent modifier le même chemin, transmettez le dernier contentSha256. Si le condensé ne correspond pas, lisez le dernier fichier avant de décider de réessayer.
Exemples de vue de fichier
Après avoir créé un magasin de mémoire en mode file+ots, utilisez les API de mémoire structurée pour écrire, rechercher et mettre à jour des mémoires. Les API Item fournissent un accès en lecture aux vues de fichiers générées par le service.
client.create_memory_store({
"memoryStoreName": "agent_memory",
"storageMode": "file+ots",
})
Répertoriez les fichiers avec une étendue complète et lisez le contenu du fichier par chemin.
page = client.list_items({
"memoryStoreName": "agent_memory",
"scope": scope,
})
for entry in page["items"]:
item = client.get_item({
"memoryStoreName": "agent_memory",
"scope": scope,
"path": entry["path"],
})
print(item["path"], item["content"])
Si list_items renvoie readOnly: true, la vue de fichier est en lecture seule. Maintenez les mémoires sources avec les API de mémoire structurée telles que add_memories, update_memory et delete_memory. Les méthodes d'écriture contre la vue de fichier renvoient READ_ONLY_STORE.