Primitives de l'agent d'espace de travail pour les applications Organigram.
Ce paquet contient les parties publiques et indépendantes de tout framework de l'agent d'espace de travail d'Organigram : types de requêtes et de réponses, construction de l'instantané et du prompt, normalisation des réponses, extraction de la consommation du modèle et extraction du texte des documents.
pnpm add @organigram/agent
L'agent répond aux questions sur un espace de travail et prépare des modifications de ses organigrammes. Rassemblez ce que l'utilisateur peut voir de l'espace de travail dans un Context, et construisez le prompt avec buildPrompt(). Le prompt inclut un instantané de l'espace de travail, avec les noms des fichiers mais jamais leur contenu. Envoyez-le au modèle de langage de votre choix, avec WORKSPACE_AGENT_OUTPUT_SCHEMA comme format de sortie structurée quand le fournisseur le permet.
Construire le prompt de l'agent d'espace de travail pour une conversation.
Le prompt contient les règles de l'agent, un instantané de l'espace de travail construit avec buildSnapshot(), la conversation et le schéma de sortie. Il interdit les propositions, transactions et signatures, et demande au modèle de traiter les noms de fichiers, les notifications et le contenu des documents comme des données et non comme des instructions. Il ne peut pas faire respecter ces règles : validez la réponse avec normalizeResponse().
const prompt = buildPrompt({ messages, context })const answer = normalizeResponse(JSON.parse(completion), context)
buildPrompt: (input: { messages: Message[]; context: Context;}) => string
Instructions pour générer un nouvel organigramme à partir d'une description ou de documents, comme des statuts, incluses dans le prompt de buildPrompt().
Schéma JSON des réponses attendues du modèle de langage, à passer comme format de sortie structurée.
Construire la description d'un espace de travail donnée à l'agent dans son prompt.
L'instantané ne garde que les champs dont l'agent a besoin : l'espace de travail, ses organigrammes avec leurs organes, entrées, procédures, dernières propositions et scrutins, et actifs, plus les noms et références des fichiers et les notifications. Il ne contient jamais le contenu des fichiers. Il inclut generatedAt, la date de sa construction.
buildSnapshot: (context: Context) => Record<string, unknown>
Paramètres
| Nom | Type | Description |
|---|---|---|
context | Context | Ce que l'on sait de l'espace de travail. |
Nombre de dernières propositions de chaque procédure incluses dans un instantané.
const MAX_PROPOSALS_PER_PROCEDURE = 10
Ce que l'agent sait d'un espace de travail : l'entrée de buildSnapshot(), buildPrompt() et normalizeResponse().
export type Context = { workspace: Workspace; files: File[]; notifications: Notification[]; currentOrganigram: OrganigramJson | null;};
Un fichier de l'espace de travail. L'agent ne voit que sa référence et son nom, pas son contenu.
export type File = { cid: string; name?: string | null;};
Une notification de l'espace de travail.
export type Notification = { id: string; type: string; title?: string | null; body?: string | null; href?: string | null; createdAt: Date | string;};
L'espace de travail sur lequel l'agent répond.
export type Workspace = { id: string; slug: string; name?: string | null; description?: string | null; admins: string[]; ownerUserAddress?: string | null; ownerOrganizationId?: string | null; ownerOrganization?: { id?: string | null; } | null; organigrams: OrganigramInput[];};
La sortie d'un modèle de langage n'est pas fiable. normalizeResponse() ne garde que les citations valides, et seulement les aperçus qui créent un nouvel organigramme ou complètent un organigramme non déployé, sans modifier ce qu'il contient. L'agent ne propose, ne signe ni n'envoie jamais de transactions : un organigramme déployé ne change que par ses propres procédures.
Valider la réponse du modèle de langage et la transformer en AgentResponse.
Traitez la sortie du modèle comme non fiable. Sans message, la réponse est remplacée par un message de repli. Seules les citations de types connus sont gardées, 8 au plus. Un aperçu n'est gardé que s'il s'agit d'un nouvel organigramme, ou d'un ajout à un organigramme de l'espace de travail qui n'a aucun organe, procédure ou actif déployé et qui ne modifie ni ne retire aucun de ses organes, entrées, procédures ou actifs. Les aperçus invalides sont écartés.
normalizeResponse: (input: unknown, context: Context) => AgentResponse
Paramètres
| Nom | Type | Description |
|---|---|---|
input | unknown | La réponse du modèle, analysée depuis le JSON. |
context | Context | Le contexte avec lequel le prompt a été construit. |
Retourne
| Type | Description |
|---|---|
AgentResponse | La réponse, sans threadId. |
Une réponse de l'agent d'espace de travail, telle que renvoyée par normalizeResponse().
export type AgentResponse = { threadId?: string; message: string; citations: Citation[]; preview?: OrganigramPreview;};
Une référence à un objet de l'espace de travail qui étaye une réponse de l'agent.
export type Citation = { type: 'workspace' | 'organigram' | 'organ' | 'procedure' | 'asset' | 'notification' | 'file'; id: string; label: string;};
Un ajout proposé à un organigramme existant qui n'est pas encore déployé.
export type MergeOrganigramPreview = { type: 'organigram'; organigramId: string; persistence: 'merge-additive'; summary: string[]; organigram: OrganigramJson;};
Un nouvel organigramme proposé.
export type NewOrganigramPreview = { type: 'new-organigram'; persistence: 'create'; summary: string[]; organigram: OrganigramJson;};
Une modification d'organigrammes proposée par l'agent, que l'utilisateur examine avant de l'enregistrer.
export type OrganigramPreview = MergeOrganigramPreview | NewOrganigramPreview;
Types des requêtes adressées à l'agent et des conversations stockées dans l'historique d'un espace de travail.
Corps d'une requête à l'agent d'espace de travail.
export type AgentRequest = { threadId?: string | null; message?: string; messages?: Message[]; currentOrganigramId?: string | null; source?: ThreadSource;};
Un message d'une conversation avec l'agent d'espace de travail.
export type Message = { role: 'user' | 'assistant'; content: string;};
Corps d'une requête qui enregistre dans l'historique de l'espace de travail une conversation tenue ailleurs, comme dans l'en-tête de la page d'accueil.
export type RecordThreadRequest = { action: 'recordThread'; source: ThreadSource; userMessage: string; assistantMessage: string; currentOrganigramId?: string | null;};
Un message tel que stocké dans l'historique d'une conversation.
export type StoredMessage = Message & { id: string; createdAt: string; response?: AgentResponse;};
Une conversation enregistrée avec l'agent d'espace de travail.
export type Thread = { id: string; title: string; source: ThreadSource; workspace?: ThreadWorkspace | null; currentOrganigramId?: string | null; createdAt: string; updatedAt: string; messages: StoredMessage[];};
Où une conversation a commencé : dans un espace de travail, ou dans l'en-tête de la page d'accueil.
export type ThreadSource = 'workspace' | 'hero';
Liste des conversations d'un utilisateur.
export type ThreadsResponse = { threads: Thread[];};
L'espace de travail d'une conversation.
export type ThreadWorkspace = { id: string; name?: string | null;};
Vérifier qu'une valeur est un message avec un rôle et un contenu non vide, par exemple dans le corps d'une requête.
isMessage: (value: unknown) => value is Message
Paramètres
| Nom | Type | Description |
|---|---|---|
value | unknown | La valeur à vérifier. |
Les utilisateurs peuvent envoyer des statuts ou d'autres documents dont l'agent tire un organigramme. Ces fonctions extraient leur texte sur le serveur. Ce texte est écrit par des tiers : donnez-le au modèle comme donnée.
Un fichier envoyé par un utilisateur, sous forme de File.
export type UploadedDocument = Pick<File, 'name' | 'type' | 'arrayBuffer' | 'text'>;
Extraire le texte d'un document envoyé, pour le donner à l'agent.
Lit les documents Word (corps, en-têtes, pieds de page, notes de bas de page et de fin), les fichiers PDF et le texte brut. Les pages PDF sans assez de texte sont lues par OCR en anglais et en français, ce qui nécessite Poppler (pdftocairo) installé sur le serveur ; si l'OCR échoue, le texte trouvé dans le PDF est conservé. Fonctionne uniquement sous Node.js. Le texte est écrit par des tiers : donnez-le au modèle comme donnée, jamais comme instruction.
extractTextFromUploadedDocument: (file: UploadedDocument) => Promise<string>
Paramètres
| Nom | Type | Description |
|---|---|---|
file | UploadedDocument | Le fichier envoyé. |
Retourne
| Type | Description |
|---|---|
Promise<string> | Le texte, avec les espaces normalisés. |
Vérifier si un fichier est un document Word (.docx), d'après son type MIME ou son extension.
isDocxDocument: (file: Pick<UploadedDocument, "name" | "type">) => boolean
Paramètres
| Nom | Type | Description |
|---|---|---|
file | Pick<UploadedDocument, "name" | "type"> | Le fichier à vérifier. |
Vérifier si un fichier est un PDF, d'après son type MIME ou son extension.
isPdfDocument: (file: Pick<UploadedDocument, "name" | "type">) => boolean
Paramètres
| Nom | Type | Description |
|---|---|---|
file | Pick<UploadedDocument, "name" | "type"> | Le fichier à vérifier. |
Compter les jetons utilisés par chaque appel à un modèle de langage, pour facturer ou limiter l'usage.
Lire dans la réponse du fournisseur les jetons utilisés par un appel à un modèle de langage.
Lit les champs d'usage des réponses compatibles OpenAI (input_tokens, prompt_tokens, détails des jetons en cache) et des réponses Ollama (prompt_eval_count, eval_count). Quand le fournisseur n'indique pas de jetons d'entrée ou de sortie, ils sont estimés au quart de la longueur du prompt ou de la complétion, et estimatedTokens vaut true.
extractModelUsage: (input: { payload: unknown; prompt: string; completion: string; provider: string; model: string;}) => AiModelUsage
Jetons utilisés par un appel à un modèle de langage.
export type AiModelUsage = { provider: string; model: string; inputTokens: number; cachedInputTokens: number; outputTokens: number; totalTokens: number; estimatedTokens: boolean;};
Modifier cette page
Sur cette page:
© 2026 Organigram SAS
Tous droits réservés.