CLAUDE_WORKFLOW_GUIDE.mdβ’19.1 kB
# π€ Guida Claude: Workflow Interattivo PrT Assignment
Questa guida spiega come **Claude** (o qualsiasi AI assistant) deve usare i tool MCP per creare procedure Visum in modo interattivo con l'utente.
## π Indice
1. [Workflow Completo](#workflow-completo)
2. [Tool Disponibili](#tool-disponibili)
3. [Pattern di Interazione](#pattern-di-interazione)
4. [Esempi di Conversazione](#esempi-di-conversazione)
5. [Gestione Errori](#gestione-errori)
6. [Best Practices](#best-practices)
---
## π― Workflow Completo
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. UTENTE: "Crea una procedura di assegnazione al trasporto β
β privato" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 2. CLAUDE: Chiama visum_create_procedure β
β β’ Tipo: PrT_Assignment β
β β’ Nota la POSIZIONE EFFETTIVA restituita (es: 580) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 3. CLAUDE: "Ho creato la procedura alla posizione 580. β
β Vuoi configurare i demand segments?" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 4. UTENTE: "SΓ¬, mostrami i segments disponibili" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 5. CLAUDE: Chiama visum_list_demand_segments β
β β’ Mostra lista numerata (1-36) β
β β’ Spiega le 4 opzioni di selezione β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 6. UTENTE: Sceglie una delle 4 opzioni: β
β β’ "Tutti" β dsegset: "ALL" β
β β’ "Solo C" β filterMode: "C" β
β β’ "1-10,15" β segmentNumbers: "1-10,15" β
β β’ "C_CORRETTA_AM,..." β dsegset: "C_CORRETTA_AM,..." β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 7. CLAUDE: Chiama visum_configure_dsegset β
β β’ procedurePosition: 580 (quella del passo 2!) β
β β’ Parametro appropriato basato su scelta utente β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 8. CLAUDE: "β
Configurati N segments. La procedura alla β
β posizione 580 Γ¨ pronta per l'esecuzione!" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
---
## π οΈ Tool Disponibili
### 1. `visum_create_procedure`
**Scopo:** Crea una nuova procedura Visum.
**Parametri:**
```typescript
{
projectId: string, // ID del progetto Visum aperto
procedureType: "PrT_Assignment" | "PuT_Assignment" | "Demand_Model" | "Matrix_Calculation",
position?: number, // Opzionale, default: 20 (viene ignorato, Γ¨ solo per backward compatibility)
parameters?: object // Opzionale, parametri aggiuntivi
}
```
**Risposta Importante:**
```json
{
"actual_position": 580, // β οΈ QUESTA Γ LA POSIZIONE REALE!
"requested_position": 20,
"message": "...created successfully at position 580..."
}
```
**β οΈ IMPORTANTE:**
- La procedura NON viene creata alla posizione richiesta!
- Visum aggiunge la procedura alla FINE (ultima posizione disponibile)
- **Devi usare `actual_position` per i passi successivi!**
**Esempio di chiamata:**
```json
{
"name": "visum_create_procedure",
"arguments": {
"projectId": "100625_Versione_base_v0.3_sub_ok_priv_10176442",
"procedureType": "PrT_Assignment"
}
}
```
---
### 2. `visum_list_demand_segments`
**Scopo:** Elenca tutti i demand segments PrT disponibili con numerazione.
**Parametri:**
```typescript
{
projectId: string,
filterMode?: string // Opzionale: "C", "H", ecc.
}
```
**Risposta:**
- Lista numerata da 1 a N (es: 36 segments)
- Segments raggruppati per modo (C, H, etc.)
- DSEGSET completo per tutti i segments
- 4 opzioni per la selezione
**Output Tipico:**
```
Mode C (Car β TSys CAR):
1. C_CORRETTA_AM
2. C_CORRETTA_IP1
...
24. C_NESTED_S
Mode H (HGV β TSys HGV):
25. H_CORRETTA_AM
...
36. H_INIZIALE_S
π‘ Come procedere:
Opzione 1 - Tutti i segments: "tutti"
Opzione 2 - Solo un modo: "Solo C"
Opzione 3 - Selezione numerica: "1,2,3" o "1-10"
Opzione 4 - Copia manuale: copia i codici
```
**Esempio di chiamata:**
```json
{
"name": "visum_list_demand_segments",
"arguments": {
"projectId": "100625_Versione_base_v0.3_sub_ok_priv_10176442"
}
}
```
---
### 3. `visum_configure_dsegset`
**Scopo:** Configura i demand segments su una procedura PrT Assignment.
**Parametri (Uno dei seguenti):**
```typescript
{
projectId: string,
procedurePosition: number, // β οΈ Usa actual_position dal passo 1!
// OPZIONE 1: Keyword "ALL"
dsegset?: "ALL" | "tutti",
// OPZIONE 2: Filtro per modo
filterMode?: "C" | "H",
// OPZIONE 3: Selezione numerica
segmentNumbers?: "1,2,3" | "1-10" | "1-10,15,20",
// OPZIONE 4: DSEGSET esplicito
dsegset?: "C_CORRETTA_AM,C_CORRETTA_IP1,...",
// Parametri aggiuntivi opzionali
numIterations?: number,
precisionDemand?: number
}
```
**Mapping Risposta Utente β Parametro:**
| Risposta Utente | Parametro da usare |
|-----------------|-------------------|
| "tutti", "ALL", "usa tutti" | `dsegset: "ALL"` |
| "solo C", "Solo modo C" | `filterMode: "C"` |
| "1,2,3", "1-10", "1-5,10-15" | `segmentNumbers: "1-10"` |
| "C_CORRETTA_AM,..." | `dsegset: "C_CORRETTA_AM,..."` |
**Esempio di chiamata:**
```json
{
"name": "visum_configure_dsegset",
"arguments": {
"projectId": "100625_Versione_base_v0.3_sub_ok_priv_10176442",
"procedurePosition": 580,
"segmentNumbers": "1-10"
}
}
```
---
## π¬ Pattern di Interazione
### Pattern 1: Creazione Base
```
UTENTE: "Crea una procedura di assegnazione PrT"
CLAUDE FLOW:
1. Chiama visum_create_procedure con tipo PrT_Assignment
2. Estrae actual_position dalla risposta (es: 580)
3. Risponde: "β
Ho creato una procedura PrT Assignment alla posizione 580.
Vuoi configurare i demand segments ora?"
UTENTE: "Sì"
CLAUDE FLOW:
4. Chiama visum_list_demand_segments
5. Mostra la lista numerata all'utente
6. Spiega le 4 opzioni di selezione
7. Aspetta la scelta dell'utente
UTENTE: "Usa i primi 10"
CLAUDE FLOW:
8. Interpreta "primi 10" β segmentNumbers: "1-10"
9. Chiama visum_configure_dsegset con:
- procedurePosition: 580
- segmentNumbers: "1-10"
10. Conferma: "β
Configurati 10 demand segments sulla procedura 580!"
```
### Pattern 2: Lista Prima, Poi Crea
```
UTENTE: "Quali demand segments PrT sono disponibili?"
CLAUDE FLOW:
1. Chiama visum_list_demand_segments
2. Mostra la lista completa
3. Risponde: "Ho trovato 36 demand segments. Vuoi creare una procedura
di assegnazione con alcuni di questi?"
UTENTE: "Sì, crea una procedura con solo il modo C"
CLAUDE FLOW:
4. Chiama visum_create_procedure
5. Estrae actual_position (es: 581)
6. Chiama subito visum_configure_dsegset con:
- procedurePosition: 581
- filterMode: "C"
7. Conferma: "β
Creata procedura alla posizione 581 con 24 segments modo C!"
```
### Pattern 3: Configurazione Avanzata
```
UTENTE: "Crea una procedura PrT con i segments CORRETTA del modo C"
CLAUDE FLOW:
1. Chiama visum_create_procedure β posizione 582
2. Chiama visum_list_demand_segments
3. Identifica quali sono i "CORRETTA" del modo C:
- 1. C_CORRETTA_AM
- 2. C_CORRETTA_IP1
- 3. C_CORRETTA_IP2
- 4. C_CORRETTA_IP3
- 5. C_CORRETTA_PM
- 6. C_CORRETTA_S
4. Chiama visum_configure_dsegset con:
- procedurePosition: 582
- segmentNumbers: "1-6"
5. Conferma i segments configurati
```
---
## π Esempi di Conversazione
### Esempio 1: Workflow Base
```
π€ UTENTE:
Crea una procedura di assegnazione al trasporto privato
π€ CLAUDE:
[Chiama: visum_create_procedure con PrT_Assignment]
[Riceve: actual_position = 580]
Perfetto! Ho creato una procedura PrT Assignment alla posizione 580.
Vuoi configurare i demand segments per questa procedura?
Se sì, posso mostrarti i segments disponibili.
π€ UTENTE:
Sì, mostrami i segments
π€ CLAUDE:
[Chiama: visum_list_demand_segments]
[Riceve: 36 segments, 24 modo C + 12 modo H]
Ho trovato 36 demand segments disponibili:
**Modo C (Car):** segments 1-24
1. C_CORRETTA_AM
2. C_CORRETTA_IP1
...
24. C_NESTED_S
**Modo H (HGV):** segments 25-36
25. H_CORRETTA_AM
...
36. H_INIZIALE_S
Come vuoi procedere?
**Opzione 1:** "tutti" - Usa tutti e 36 i segments
**Opzione 2:** "solo C" o "solo H" - Filtra per modo
**Opzione 3:** "1-10" o "1,5,10-15" - Seleziona per numeri
**Opzione 4:** Copia e incolla i codici specifici
π€ UTENTE:
Solo modo C
π€ CLAUDE:
[Chiama: visum_configure_dsegset con filterMode: "C", procedurePosition: 580]
[Riceve: 24 segments configurati]
β
Perfetto! Ho configurato la procedura alla posizione 580 con tutti
e 24 i demand segments del modo C (Car).
La procedura Γ¨ pronta per l'esecuzione. Puoi trovarla in Visum:
Procedures β Operations β Posizione 580
```
### Esempio 2: Richiesta Specifica
```
π€ UTENTE:
Crea assegnazione PrT solo per i primi 5 time slots del modo car
π€ CLAUDE:
[Chiama: visum_list_demand_segments per capire quali sono]
[Identifica: 1-5 = C_CORRETTA_AM, IP1, IP2, IP3, PM]
[Chiama: visum_create_procedure]
[Riceve: actual_position = 583]
[Chiama: visum_configure_dsegset con segmentNumbers: "1-5"]
β
Ho creato una procedura PrT Assignment alla posizione 583
configurata con i primi 5 time slots del modo Car:
1. C_CORRETTA_AM
2. C_CORRETTA_IP1
3. C_CORRETTA_IP2
4. C_CORRETTA_IP3
5. C_CORRETTA_PM
La procedura Γ¨ pronta!
```
### Esempio 3: Modifica Successiva
```
π€ UTENTE:
Cambia la procedura 580 per usare solo i segments INIZIALE
π€ CLAUDE:
[Chiama: visum_list_demand_segments]
[Identifica INIZIALE nel modo C: posizioni 7-12]
[Chiama: visum_configure_dsegset con:
procedurePosition: 580,
segmentNumbers: "7-12"]
β
Ho riconfigurato la procedura alla posizione 580.
Ora usa solo i 6 segments INIZIALE del modo C:
7. C_INIZIALE_AM
8. C_INIZIALE_IP1
9. C_INIZIALE_IP2
10. C_INIZIALE_IP3
11. C_INIZIALE_PM
12. C_INIZIALE_S
```
---
## β οΈ Gestione Errori
### Errore 1: Posizione non trovata
```json
{
"error": "OPERATION: ItemByKey failed for position 999"
}
```
**Causa:** Stai usando una posizione inesistente.
**Soluzione Claude:**
```
β La posizione 999 non esiste.
Ricordi la posizione restituita quando hai creato la procedura?
Dovrebbe essere un numero tipo 576-580.
```
### Errore 2: Progetto non aperto
```json
{
"error": "Project with ID ... not found"
}
```
**Soluzione Claude:**
```
β Il progetto Visum non Γ¨ aperto.
Vuoi che lo apra? [Usa visum_project_open tool]
```
### Errore 3: ALL keyword fallisce
```json
{
"error": "Failed to get all segments"
}
```
**Soluzione Claude:**
```
β οΈ C'Γ¨ stato un problema con la keyword "ALL".
Posso usare un metodo alternativo:
- Filtro per modo C: configura tutti i 24 segments Car
- Filtro per modo H: configura tutti i 12 segments HGV
Quale preferisci?
```
---
## β
Best Practices per Claude
### 1. **Sempre Salvare actual_position**
```javascript
// β SBAGLIATO:
const position = 20; // Posizione richiesta
configureDsegset(position); // Questa fallirΓ !
// β
CORRETTO:
const response = await createProcedure();
const actualPosition = response.result.actual_position; // 580
configureDsegset(actualPosition); // Questa funziona!
```
### 2. **Mostrare sempre la lista prima**
```
// β
BUONO:
"Ho trovato 36 segments. Ecco la lista numerata..."
[mostra lista]
"Come vuoi procedere?"
// β CATTIVO:
"Configuro tutti i segments automaticamente"
[chiama configure senza chiedere]
```
### 3. **Interpretare le richieste utente**
| Richiesta Vaga | Interpretazione | Azione |
|----------------|-----------------|---------|
| "tutti" | Tutti i segments | `dsegset: "ALL"` o `filterMode` per entrambi |
| "primi 10" | Segments 1-10 | `segmentNumbers: "1-10"` |
| "solo car" | Modo C | `filterMode: "C"` |
| "CORRETTA" | Segments con nome CORRETTA | Identifica numeri e usa `segmentNumbers` |
| "AM e PM" | Time slots AM e PM | Identifica numeri (1,5,7,11,...) |
### 4. **Confermare sempre**
```
β
"Ho configurato 10 demand segments sulla procedura 580"
β
"La procedura Γ¨ pronta alla posizione 580"
β
"Puoi trovarla in Visum: Procedures β Operations β 580"
```
### 5. **Gestire richieste ambigue**
```
π€ UTENTE: "Configura alcuni segments"
π€ CLAUDE: β Non procedere automaticamente!
β
Invece:
"Quali segments vuoi configurare? Posso mostrarti la lista
numerata per aiutarti a scegliere."
```
---
## π Workflow Completo Codificato
```typescript
// Pseudo-codice per Claude
async function handlePrTAssignmentRequest(userRequest: string) {
// Step 1: Crea la procedura
const createResponse = await mcp.call("visum_create_procedure", {
projectId: getCurrentProjectId(),
procedureType: "PrT_Assignment"
});
const procedurePosition = createResponse.result.actual_position;
// Step 2: Conferma e chiedi se configurare
await sendMessage(`β
Ho creato una procedura PrT Assignment alla posizione ${procedurePosition}.
Vuoi configurare i demand segments?`);
const userWantsConfigure = await waitForUserResponse();
if (!userWantsConfigure) return;
// Step 3: Mostra lista segments
const listResponse = await mcp.call("visum_list_demand_segments", {
projectId: getCurrentProjectId()
});
await sendMessage(formatSegmentList(listResponse));
await sendMessage(`Come vuoi procedere?
1. "tutti" - Tutti i segments
2. "solo C" - Solo modo Car
3. "1-10" - Selezione numerica
4. Copia i codici specifici`);
// Step 4: Aspetta scelta utente
const userChoice = await waitForUserResponse();
// Step 5: Interpreta la scelta
const configParams = interpretUserChoice(userChoice);
configParams.projectId = getCurrentProjectId();
configParams.procedurePosition = procedurePosition; // β οΈ IMPORTANTE!
// Step 6: Configura DSEGSET
const configResponse = await mcp.call("visum_configure_dsegset", configParams);
// Step 7: Conferma finale
const segmentCount = extractSegmentCount(configResponse);
await sendMessage(`β
Configurati ${segmentCount} demand segments sulla procedura ${procedurePosition}!
La procedura Γ¨ pronta per l'esecuzione.`);
}
function interpretUserChoice(choice: string): object {
const lower = choice.toLowerCase();
if (lower.includes("tutti") || lower.includes("all")) {
return { filterMode: "C" }; // Usa filterMode invece di ALL che ha bug
}
if (lower.includes("solo c") || lower.includes("car")) {
return { filterMode: "C" };
}
if (lower.includes("solo h") || lower.includes("hgv")) {
return { filterMode: "H" };
}
// Check se Γ¨ notazione numerica
if (/^\d+(-\d+)?(,\d+(-\d+)?)*$/.test(choice.trim())) {
return { segmentNumbers: choice.trim() };
}
// Altrimenti assume sia DSEGSET esplicito
return { dsegset: choice };
}
```
---
## π Riferimenti
- **VISUM_PROCEDURES_API.md** - Documentazione API completa
- **WORKFLOW_PRT_ASSIGNMENT.md** - Workflow step-by-step
- **MCP_QUICK_CALL.md** - Come testare i tool manualmente
- **test-workflow.py** - Script di test automatico
---
## π― Checklist per Claude
Prima di procedere, verifica:
- [ ] Ho chiamato `visum_create_procedure`?
- [ ] Ho salvato la `actual_position` restituita?
- [ ] Ho mostrato la lista segments all'utente?
- [ ] Ho spiegato le 4 opzioni di selezione?
- [ ] Ho interpretato correttamente la scelta utente?
- [ ] Sto usando `actual_position` (non 20!) per `visum_configure_dsegset`?
- [ ] Ho confermato l'operazione all'utente?
- [ ] Ho indicato dove trovare la procedura in Visum?
---
**Versione:** 1.0
**Data:** 2025-10-10
**Autore:** Visum Thinker MCP Server
**Status:** β
Pronto per Produzione