Documentació de Concentus
Què fa l'aplicació, per què ho fa així i on cal fer clic. Escrit contra l'app tal com es distribueix — on una cosa és una limitació, ho diu, en comptes de deixar que ho descobreixis tu.
Què és
Una app d'escriptori per construir i executar equips d'agents d'IA.
Dibuixes un flow en un llenç: un activador, un o més agents, i les eines i dades a què poden arribar. Concentus l'executa amb la sessió de Claude que ja tens a la teva màquina — sense servidor per desplegar, sense base de dades per aprovisionar, sense API key per enganxar.
El flow que dibuixes és el flow que s'executa. No hi ha cap fitxer de configuració darrere del dibuix que el pugui contradir, i aquesta és la propietat que fa que un llenç valgui la pena.
Instal·lació
Windows, macOS i Linux. Un instal·lador, res més.
Descarrega'l des de la pàgina de descàrregues i obre'l. L'app porta el seu propi runtime de Java i el seu propi PostgreSQL, així que no hi ha res a instal·lar a banda.
Per executar el backend pel seu compte — un servidor, un contenidor, una màquina davant de la qual no hi seu ningú:
Gestors de paquets
També es pot instal·lar amb un gestor de paquets — cosa que esquiva l'avís de l'SmartScreen que rep una baixada sense signar des del navegador, perquè el fitxer mai no porta la marca d'origen web del navegador:
# Windows — scoop (the bucket lives in the main repository)
scoop bucket add concentus https://github.com/Gergilcan/concentus
scoop install concentus
# Windows — winget
winget install concentus
# macOS — Homebrew
brew tap gergilcan/concentus
brew install --cask concentus
# Anywhere with Node — fetches the right installer from Releases
npx concentus
Actualitzar: winget, brew i els instal·ladors normals conserven l'actualitzador integrat a
l'app; una instal·lació amb scoop s'actualitza amb scoop update concentus.
A Windows, que l'SmartScreen avisi sobre el .exe baixat és normal:
l'instal·lador encara no està signat, i Windows ho diu de tota baixada sense signar. Més
informació → Executa de totes maneres tira endavant; els gestors de paquets de dalt
eviten l'avís del tot. La compilació per a macOS no té cap mur equivalent — està signada i
notaritzada, així que el Gatekeeper l'obre com qualsevol app propera a l'App Store.
El backend a pèl
java -jar concentus-backend.jar
Sense cap entorn, això arrenca un PostgreSQL integrat, genera la seva pròpia clau de
xifratge i demana un primer compte a http://localhost:8080.
Els flows s'executen a través de Claude Code a la màquina que fa anar el backend, o contra l'API d'Anthropic amb una clau. La pantalla de configuració pregunta quina, i instal·la i inicia sessió per tu si tries la primera. Vegeu Pagar les execucions.
Primera arrencada
Crea el compte propietari de la instal·lació.
La primera arrencada mostra una pantalla de configuració. Crea un compte amb un correu i una contrasenya, o inicia sessió amb Google, Microsoft o Discord si n'has registrat algun — en qualsevol cas, la primera identitat que travessa la porta administra la instal·lació.
Tots els que vénen després arriben com a Lector. Arribar amb un compte d'empresa vàlid demostra qui és algú, no què hauria de poder canviar.
La interfície parla anglès, castellà i català. Segueix l'idioma del teu sistema per defecte; la tria viu al costat del tema a Recursos → Configuració, s'aplica a l'instant i pertany a aquest navegador, no a la instal·lació.
En un desplegament davant del qual no hi seu ningú, defineix
CONCENTUS_ADMIN_EMAIL i CONCENTUS_ADMIN_PASSWORD abans de la
primera arrencada. Si no, la finestra entre que el port s'obre i tu hi arribes és una
finestra en què algú altre podria reclamar la instal·lació.
Pagar les execucions
Una subscripció que ja tens, o una clau facturada per token.
La pantalla de configuració ho pregunta un cop, abans d'instal·lar res — perquè la resposta decideix si cal instal·lar res.
La teva subscripció de Claude
L'opció per defecte, i la més barata: els flows s'executen a través de Claude Code en
aquesta màquina, amb la subscripció que ja pagues. No hi ha clau per cuidar, ni segona
factura pel que càpiga a la bossa d'ús no interactiu de Claude Code del teu pla — Anthropic
mesura aquesta bossa per separat de les teves sessions interactives, la pàgina d'Ús mesura
el que ha consumit aquesta màquina, i un flow pot recórrer a una API key o a un model local
quan s'esgota. Necessita la CLI instal·lada i amb la sessió iniciada un cop, i Concentus fa
totes dues coses des de la pantalla de configuració: un botó executa l'instal·lador oficial
d'Anthropic, i s'obre un terminal en el mateix inici de sessió — no en un prompt on
el següent que cal saber és que s'escriu /login.
El binari instal·lat s'afegeix també al teu PATH, així que claude és una ordre
que tens a partir de llavors, i no una cosa que només Concentus sap trobar. A Windows això
és el Path per usuari del registre, escrit directament — mai a través de setx,
que trunca un PATH llarg a 1024 caràcters i s'endú la meitat de les teves eines pel davant.
A Linux i macOS és una línia als fitxers d'arrencada que existeixin, escrita un cop i
marcada perquè una segona instal·lació no n'afegeixi una segona còpia.
Una API key d'Anthropic
Res a instal·lar i sense inici de sessió: l'adequat per a una màquina davant de la qual no hi seu ningú. Enganxa la clau a la pantalla de configuració i es guarda al clauer del sistema operatiu, només en aquella màquina. On no hi ha clauer — un servidor sense sessió d'escriptori — és un fitxer llegible únicament per aquell compte, i la pantalla ho diu en comptes de fingir el contrari.
La pantalla de configuració torna a ser accessible des de Configuració… a la icona
de safata de Concentus. Una clau que ja sigui a l'entorn com a
ANTHROPIC_API_KEY continua funcionant; una de desada a l'app hi té prioritat.
El llenç
On es dibuixa un flow, i què vol dir el dibuix.
Els blocs s'afegeixen des de la paleta de l'esquerra. Un bloc nou es col·loca enganxat a aquell al qual s'acobla — la cadena va d'esquerra a dreta, i les capacitats pengen a sota — i quan exactament un bloc existent pot acceptar legalment la connexió, el cable es dibuixa per tu.
Seleccionar un bloc envolta el que l'alimenta i el que ell alimenta, un salt en cada
direcció. Un doble clic n'obre les propietats; un bloc enfocat amb Tab s'obre
amb Enter.
Desfer, endreçar, guies
Cada canvi al llenç es pot desfer — Ctrl+Z /
Ctrl+Y, o els botons ↶ ↷ — inclòs esborrar un bloc, que abans era
irreversible tret de recarregar sense desar. Una ràfega d'escriptura en un inspector compta
com un pas, i un arrossegament com un pas, així que desfer es mou en les unitats en què
penses.
⌗ Endreçar disposa un flow que va créixer a mà: la cadena d'esquerra a
dreta, les capacitats penjades sota els seus agents — la mateixa forma que dibuixa el llenç
quan col·loca els blocs per tu. Una disposició que odiïs és a un
Ctrl+Z de desaparèixer. En arrossegar, les guies d'alineació
ajusten un bloc a les vores i centres dels seus veïns.
Els cables es tenyeixen segons la sortida de la qual surten: el camí si falla en vermell i discontinu, el camí si no en ambre — perquè a tres passos de distància el camí de l'error i el de l'èxit deixin de semblar idèntics.
Què vol dir un cable
La direcció té significat, així que el llenç rebutja un cable que no en tindria: un agent no pot alimentar el seu servidor MCP, i una base de coneixement no pot alimentar una font SQL, perquè cap dels dos té res a fer amb el que arriba. Només els consumidors — agents, merges, verificadors — poden ser a l'extrem receptor d'una capacitat.
Dues sortides per bloc
Cada bloc que s'executa té una segona sortida sota la principal, i el cable recorda de quina va sortir. En un agent, un subflow, una crida a API, un merge o un verificador és si falla: la branca cablejada allà només s'executa quan el bloc va fallar, i rep el mateix error, amb el nom del bloc que el va produir — «Presupuestos ha fallat: la bústia ha rebutjat la credencial» és una cosa sobre la qual una branca de recuperació pot actuar, i «l'execució ha fallat» no ho és.
Una execució l'error de la qual es va gestionar així es completa. Algú va dibuixar què havia de passar quan surt malament i va passar; deixar l'execució en vermell informaria d'un error desatès per funcionar com es va dissenyar. Sense res cablejat a la sortida d'error, un error es comporta exactament com sempre.
En una condició la segona sortida és si no. La branca principal s'executa quan la prova es compleix, la branca «si no» quan no — una sola prova llegida des de tots dos costats. Abans, «si és urgent fes X, si no Y» requeria dues condicions amb proves oposades, i les dues podien separar-se fins que alguna entrada caigués entre elles. Després d'un «per a cada», la branca «si no» rep els elements rebutjats en comptes de llençar-los a terra.
Teclat
| Tecles | Què fa |
|---|---|
Ctrl + K | Paleta d'ordres — arriba a qualsevol vista o acció |
Ctrl + C / V | Copiar i enganxar blocs. El text seleccionat guanya: el llenç s'aparta |
Ctrl + D | Duplicar el bloc seleccionat |
Ctrl + Z / Y | Desfer / refer qualsevol canvi del llenç, esborrats inclosos |
Delete | Eliminar la selecció (es pot desfer) |
Enter | Obrir les propietats del bloc enfocat |
Esc | Tancar el diàleg de propietats |
Blocs
Cada tipus de caixa, i quan recórrer-hi.
| Bloc | Què és |
|---|---|
| Entrada / activador | D'on surt el text de l'execució: escrit per tu, una programació, un webhook o un correu entrant. |
| Coordinador | El líder: planifica la feina, la reparteix entre els agents connectats a sota i escriu la resposta. Un per flow; la paleta ho diu quan el llenç ja en té un. |
| Agent | Un model amb un system prompt, un nivell d'esforç i un sostre de tokens, que fa una feina en el seu propi context. |
| Verificador | Llegeix un resultat i retorna un veredicte. El seu punt final és un veredicte, no una conversa. |
| Merge | Reconcilia el que van produir diverses branques en una sola resposta. Arriba a MCP igual que un agent. |
| Servidor MCP | Eines que un agent pot cridar. Els servidors HTTP passen per un proxy; els servidors stdio els llança el mateix worker. |
| Repositori | Una còpia git en què treballa l'agent — llegir el codi, canviar-lo, obrir un pull request. |
| Font SQL | Una consulta de només lectura les files de la qual s'injecten com a context abans que l'agent arrenqui. |
| API / endpoint | Qualsevol endpoint HTTP com a eina tipada — des d'un document OpenAPI, o des d'una URL que escrius. |
| Base de coneixement | Documents dels quals l'agent pot recuperar passatges. Vegeu Bases de coneixement. |
| Condició | Envia l'execució per un camí o un altre segons el que realment va tornar. |
| Per a cada | Pren una llista i executa la mateixa branca sobre cada element. |
| Executar un altre flow | Un flow dins d'un flow. Vegeu Subflows. |
| Enviar correu | Envia per SMTP el que li arriba — el resultat, o el d’una branca — a les adreces que indiquis. Les credencials surten del magatzem, mai del fitxer del flow. |
| Nota | Text al llenç per a la persona següent. Les execucions l’ignoren. |
| Grup | Una caixa al voltant de diversos blocs per moure’ls, copiar-los i llegir-los com un de sol. |
Activadors
Quatre maneres d'arrencar una execució.
- Manual — escrius el primer missatge a la consola.
- Programació — una expressió cron, construïda a partir d'opcions senzilles en comptes d'escrita a mà. La targeta del llenç ho diu amb paraules: cada 15 minuts els dies feiners.
- Webhook — una URL amb un secret. Fer-hi un POST arrenca el flow amb el cos de la petició.
- Correu — se sondeja una carpeta IMAP i cada missatge que coincideix arrenca una execució. IMAP i no SMTP, perquè les carpetes, les marques i l'estat de llegit són el que fa possible «processa això un sol cop».
I sense el secret del webhook de l'original. Copiar una programació activa et donaria dos flows saltant cada matí, que no és el que «duplicar» vol dir per a ningú.
Subflows
Un flow dins d'un flow, cablejat de dues maneres.
Cableja un flow cap a un agent i s'executa primer, amb el text amb què va arrencar aquesta execució, i la seva resposta arriba com a context. Cableja'l des d'un agent i s'executa quan aquell agent acaba — un relleu. El dibuix diu quin dels dos, així que no hi ha cap desplegable que el pugui contradir.
L'agent també rep una eina run_flow per al mateix flow, per poder tornar a
preguntar amb les seves pròpies paraules quan la primera resposta planteja un dubte. Les
dues no són redundants: una és el que el flow sempre necessita, l'altra és el que aquesta
execució concreta va resultar necessitar.
Un fill s'executa amb el seu propi pressupost i el seu propi mode de permisos. Els cicles es tallen amb una cadena d'ancestres, i la imbricació s'atura a tres nivells de profunditat.
Workers independents
Un procés per agent, amb l'accés a eines imposat de debò.
Per la via de sessió compartida, una execució local és un sol procés de la CLI per a tot el flow, així que les carpetes de context i les llistes de delegació s'escriuen a les instruccions de cada agent en comptes d'imposar-se: a un agent se li diu quines carpetes i quins agents són seus, i tot i així podria arribar als altres.
Els workers independents són la cosa de debò. Cada agent rep el seu propi procés i la seva pròpia finestra de context, i arriba a MCP a través d'una façana que decideix quines eines pot cridar i si les escriptures es bloquegen (només lectura) o se simulen (dry-run) — imposat pel backend a cada crida, no demanant-ho al model per favor.
Un sostre mana per sobre de tota la resta: execution.max-processes
(Configuració, 10 per defecte) limita el total de processos claude a la
màquina, sigui quina sigui l'execució o el repartiment que els va arrencar. Els límits per
grup es multipliquen — vuit execucions de quatre workers serien trenta-dos processos,
cadascun de centenars de MB — i això limita el producte. Un worker que no hi cap espera un
forat, i la seva execució ho diu; apujar el paràmetre allibera la feina en cua sense
reiniciar.
Què passa entre ells
Dues eines, i res més. share_finding explica als altres workers una cosa que
altrament haurien de descobrir pel seu compte — un fet establert, un carreró sense sortida
que no val la pena repetir, una font que va resultar estar equivocada.
read_findings llegeix el que han dit. Val la pena cridar-la abans de començar
qualsevol cosa que soni a que ja pot estar feta.
Deliberadament estret: notes curtes, sense conversa, i sense manera de preguntar res a un germà i esperar resposta. Un worker que es pogués bloquejar esperant un altre worker seria un worker que pot quedar-se en interbloqueig amb ell. Les notes són esborrany — pertanyen a aquesta execució, no al flow — i el pas de merge les llegeix al costat dels informes, perquè una nota sovint és la raó per la qual un informe diu el que diu.
Quan un agent deixa d'avançar
A un agent que crida la mateixa eina amb els mateixos arguments i obté la mateixa resposta tres cops seguits se li rebutja un cop, i se li diu què ha estat fent. La regla és mateixa eina, mateixos arguments i mateix resultat: un sondeig d'estat la resposta del qual canvia no es toca mai, que és la diferència entre esperar i donar voltes. Els errors també compten — hi ha tan poc a aprendre del quarantè error idèntic com del quarantè èxit idèntic.
És un ressalt, no un mur. El comptador es reinicia després d'un rebuig, així que un agent que de debò està esperant alguna cosa es retarda en comptes d'aturar-se; rebutjar per sempre convertiria una manera d'estalviar diners en una manera de trencar una execució que estava a punt de sortir bé.
Una façana només pot mediar HTTP. Un perfil que retira una eina d'un servidor stdio retira el servidor sencer, perquè no es pot imposar res a un procés que la façana no veu mai.
Bases de coneixement
Material de referència massa gran per lliurar-lo sencer.
Una base de coneixement és una col·lecció amb nom de documents dels quals un agent recupera passatges. És diferent d'una carpeta de context, i la diferència és a quina recórrer en cada cas: una carpeta de context lliura a l'agent els mateixos fitxers — l'adequat quan els fitxers són la feina, com un repositori. Una base de coneixement és per a manuals, polítiques i informes passats, on només s'han d'injectar els passatges rellevants per a la tasca.
Què s'hi pot posar
| Font | Notes |
|---|---|
| Capa de text. Un escaneig sense capa de text passa per OCR si està instal·lat. | |
Word .docx | Paràgrafs i taules. Les taules surten delimitades per barres verticals perquè una cita conservi les columnes. |
| Excel / CSV | Fulls com a files. |
PowerPoint .pptx | Diapositiva a diapositiva, numerades, amb les notes de l'orador — que sovint és on viu la frase que explica una diapositiva de quatre paraules. |
| Text, Markdown, HTML | Tal com estan escrits. |
| Imatges | A través d'OCR, quan està instal·lat. |
| Pàgines web | Per adreça. Vegeu més avall. |
Es poden pujar carpetes senceres d'un cop, amb exclusions per carpeta — una carpeta real
sempre té un .gitignore o una imatge perduda en algun lloc.
Pàgines
Afegeix una pàgina pren una URL. El document s'arxiva sota aquella adreça, així que afegir-lo un altre cop el substitueix en comptes d'arxivar-ne una segona còpia — que és el que fa que Actualitza les pàgines vulgui dir alguna cosa: un clic torna a baixar cada pàgina de la base quan la wiki avança. Els fitxers pujats no es toquen en una actualització; un fitxer que algú va triar no té adreça a la qual tornar.
Es baixa una adreça — els enllaços de la pàgina no se segueixen. Un rastrejador que vagareja ingereix tota la intranet perquè algú va enganxar una pàgina de navegació, i després respon preguntes amb el menú de la cafeteria.
Un servidor que baixa una adreça que tu escrius pot arribar molt més lluny que tu. Les
adreces de loopback, link-local i de metadades del núvol es rebutgen, les redireccions es
tornen a comprovar a cada salt, i un host que no resol falla tancat. Anomena hosts a
knowledge.allowed-web-hosts per admetre els que altrament estarien
bloquejats.
Qui pot llegir una base
Qualsevol altre recurs d'aquí és accessible per a qualsevol que pugui editar flows, i per a la definició d'un agent això és correcte — és configuració. Una base de coneixement no és configuració; és els mateixos documents. Així que una base pot anomenar el rol més baix que la pot llegir, a la mateixa escala que fa servir tota la resta.
Absent vol dir tothom, que és el que volia dir cada base creada abans que això existís i ha de continuar volent dir. S'imposa a l'API, i un altre cop quan una execució injecta una base — contra el rol de qui va arrencar l'execució, no de qui va dibuixar el flow. Un flow sobreviu a la sessió del seu autor, i heretar-ne l'abast faria que cada base restringida fos llegible per qualsevol que pogués prémer Executar al flow adequat.
Fragmentació
Els documents es parteixen per límits de paràgraf a uns 1.500 caràcters, amb 200 caràcters de solapament perquè una frase tallada en un límit continuï apareixent sencera en un dels seus dos fragments. Un sol document s'atura a 2.000 fragments, i ho diu quan passa.
Recuperació
Com es troba un passatge. la part important
Cada consulta executa dues cerques, i es fusionen en comptes de triar entre elles.
Una cerca vectorial no sap distingir un token exacte. Una referència de document, un codi d'error, un nom de fitxer se situen a l'espai d'embeddings al costat de tots els seus veïns, així que demanar una política pel seu número retorna dotze polítiques més. Una cerca per paraules clau la troba a la primera. El cas mirall és igual de comú: cap cerca per paraules clau no fa coincidir «què passa quan algú se'n va» amb un document titulat Offboarding, perquè no comparteixen cap paraula. Executar totes dues no és cobrir-se les espatlles — és l'única manera de respondre les dues preguntes.
keyword (ts_rank_cd, top 50) ─┐
├─ Reciprocal Rank Fusion ─ cross-encoder ─ top k
semantic (cosine, top 50) ─┘
La fusió és per posició, no per puntuació. Una similitud de cosinus i un rang de text de PostgreSQL no són quantitats comparables, i ponderar-les l'una contra l'altra voldria dir inventar-se un tipus de canvi i després ajustar-lo per sempre. Reciprocal Rank Fusion només pregunta com de prop del cim de la seva pròpia llista va posar cada branca un passatge — i un passatge que només va trobar una branca continua aflorant, que és tota la gràcia.
El reranker
Després un cross-encoder reordena els supervivents. Llegeix la pregunta i un passatge junts i puntua el parell, que és el que li permet adonar-se que un passatge descriu el procés correcte per al departament equivocat — una distinció que dos embeddings calculats per separat no poden expressar. Massa lent per a una base sencera; exactament l'adequat per als cinquanta candidats que una cerca ja va trobar.
Els dos models
Tots dos són opcionals, tots dos s'executen dins de l'app, i tots dos es baixen sota demanda des de Recursos → Coneixement. Sense Ollama, sense Docker, sense servidor.
| Model | Mida | Sense ell |
|---|---|---|
| multilingual-e5-small embedding | ~130 MB | La cerca per paraules clau continua funcionant; res no s'ordena per significat. |
| bge-reranker-base reranker | ~282 MB | L'ordre fusionat es manté, i el panell diu què falta. |
Un servidor de models que serveixi bge-m3 es detecta automàticament si en tens un.
Què arriba a l'agent
Els passatges recuperats s'acoblen, no s'enganxen:
- Fusionats — els passatges adjacents s'uneixen sense repetir el solapament entre fragments, que altrament es llegiria com a èmfasi.
- Ordenats per document i posició, mai per puntuació. Un document es llegeix cap endavant; l'ordre per puntuació lliura al model el pas 4, després el pas 1, després el pas 7 i li demana que expliqui el procés.
- Retallats a un pressupost de caràcters per font (
knowledge.context-chars, 12.000 per defecte), i se li diu a l'agent que alguns han quedat fora. - Numerats amb una clau de cita, i el prompt demana aquests marcadors de tornada. Una resposta que ningú no pot contrastar amb les seves fonts és l'error que tot aquest subsistema existeix per evitar.
Tornar a preguntar
L'agent també rep una eina search_knowledge. La precàrrega respon al que el
flow sempre necessita; l'eina respon a la pregunta que només existeix pel que va dir la
primera resposta.
Mesurar la recuperació
Perquè tot canvi en l'ordenació sona a millora.
La prova habitual d'un canvi en la recuperació són tres consultes escrites després de fer-lo. Sota aquest règim una base empitjora en silenci mentre tothom coincideix que es nota més afinada.
Així que una base pot guardar un conjunt daurat: preguntes que algú fa de debò, cadascuna amb el document que la respon. Recursos → Coneixement → Mesura aquesta base. Executar-lo dona tres números, perquè un sol número amaga els dos errors que importen.
| Número | Què vol dir |
|---|---|
| Respostes | Proporció de preguntes en què un document esperat va entrar al top 5. Amb quina freqüència algú hauria obtingut si més no una resposta. |
| Documents trobats | Proporció de tots els documents esperats recuperats. Més baixa que Respostes sempre que una pregunta necessita dos documents i en va tornar un — mitja resposta que el titular amagaria. |
| Qualitat de la posició | 1,00 quan les respostes arriben primer, 0,50 quan segones, 0 quan mai. Un passatge que arriba cinquè gasta el pressupost de context de quatre d'erronis per arribar-hi. |
Executa les mateixes preguntes amb i sense el reranker, que és l'única manera honesta de respondre «valen la pena 282 MB amb els meus documents?» — un benchmark sobre el corpus d'un altre no és evidència sobre el teu. Un error mostra què va tornar en el seu lloc, perquè això és l'explicació i no el veredicte.
El que es mesura és si va tornar el document correcte. Qualificar text generat necessita un model que jutgi un model — una segona cosa que pot equivocar-se, i una factura per execució — i respon a una pregunta diferent: una resposta errònia sobre el passatge correcte és un problema de prompt, mentre que una resposta que sona bé sobre el passatge equivocat és aquest problema, i és el que es cola sense que ningú se n'adoni.
Fonts SQL
Files com a context, abans que l'agent arrenqui.
Un bloc SQL executa una consulta de només lectura i n'injecta les files al context de l'agent connectat. JDBC genèric; PostgreSQL ve inclòs i es poden afegir altres drivers al backend. Prova la consulta des de les propietats del bloc abans d'executar el flow.
Només es permet un únic SELECT, com a defensa en profunditat al costat dels
permisos que imposi la mateixa base de dades. Les credencials es referencien per id des de
Recursos → Credencials, mai no s'escriuen en línia.
Els hosts de loopback, link-local i de metadades del núvol estan bloquejats per defecte.
Afegeix hosts a rag.allowed-jdbc-hosts per permetre'ls — tret de l'adreça de
metadades, que està bloquejada en qualsevol cas.
APIs i MCP
Dues maneres de donar a un agent alguna cosa per cridar.
Servidors MCP
Qualsevol servidor Model Context Protocol, per HTTP o llançat com a procés local. Un catàleg ofereix els habituals amb la seva configuració — les variables que necessiten, el runtime que necessiten instal·lat — en comptes d'una caixa JSON en blanc. Els servidors OAuth guarden els tokens en una credencial xifrada i els renoven enmig d'una execució quan una crida torna amb 401.
Quan un servidor ofereix moltíssimes eines, l'agent rep una eina de cerca en comptes de cent esquemes: demana el que necessita i rep les poques definicions que coincideixen.
Endpoints d'API
Enganxa una URL i es converteix en una eina tipada — sense necessitat de document OpenAPI. Els marcadors de la ruta es converteixen en els arguments, i només s'ofereix un cos on correspon. Amb un document OpenAPI, es llisten les operacions i tries quines pot cridar l'agent.
Execucions i la consola
Què va passar, bloc a bloc.
Cada execució registra els seus esdeveniments, l'entrada i sortida per bloc, els recomptes de tokens i un cost estimat. Un bloc pot tornar a executar-se pel seu compte, amb exactament l'entrada que va rebre — un pas que va fallar al final d'una execució llarga no et costa els vint minuts anteriors — i opcionalment amb un altre model.
Dues execucions es poden comparar de costat. Les execucions, els esdeveniments i la sortida per bloc es persisteixen; els manegadors vius d'una sessió en marxa no, així que reiniciar el backend deixa l'historial intacte i descarta qualsevol cosa a mig vol.
Una estimació a les tarifes per token publicades. Amb una subscripció de Claude és ús equivalent contra la bossa no interactiva del teu pla, no un càrrec; amb l'API s'aproxima al càrrec real.
Aprovacions
Quan una execució ha d'esperar una persona.
El mode de permisos es fixa al coordinador, perquè un sol procés de la CLI executa tot el flow: bypass (l'únic mode que funciona sense supervisió), només pla i demana'm aprovació. Una execució que espera una resposta ho diu, i es pot respondre des de la consola — o des de Slack o Teams, al fil on va arribar la notificació.
Una execució que ja ha lliurat el seu resultat queda tancada a més missatges.
Versions i execucions daurades
Un historial al qual només s'afegeix, i una referència de la qual desviar-se.
Cada desament afegeix una revisió, atribuïda a qui la va fer. L'historial és accessible des d'Historial al tauler: previsualitza una revisió al llenç, o restaura-la — una restauració s'afegeix com a revisió nova en comptes d'esborrar el que va substituir, així que allò sobre què vas restaurar continua a un clic.
Una execució es pot marcar com a execució daurada: una referència del que aquest flow hauria de produir. Les execucions posteriors s'hi comparen, i un flow la sortida del qual s'ha desviat ho diu a la seva targeta.
Replay contra el flow actual
Les execucions daurades comparen sortides; depurar sol necessitar comparar decisions — amb la mateixa entrada, on divergeix el camí? Des de qualsevol execució, ⟲ Replay vs actual passa les sortides per bloc gravades d'aquella execució pel flow tal com està desat avui, sense executar res, i pinta la resposta al llenç: un anell ambre a cada bloc el destí del qual canvia (es va executar i ara se saltaria, o a l'inrevés), un xip que diu en quin sentit i per què, i els blocs que es van executar però ja no existeixen anomenats a la capçalera.
Reprodueix l'encaminament, no els agents — les portes decideixen a partir del text gravat, així que les seves respostes són exactes, però on una decisió necessitaria una sortida que mai no es va gravar, el bloc diu no es pot decidir en comptes d'endevinar.
Marketplace
On es comparteixen i s'instal·len les peces amb què es construeix un flow.
Una vista pròpia, al costat de Studio. La gent publica servidors MCP, agents de biblioteca, façanes, skills, plugins, definicions d'API i plantilles de flow; la resta els instal·la a la seva pròpia organització amb un clic i un flow els fa servir directament. La cerca és instantània i local; filtres per tipus, àmbit, estat i etiqueta; ordre per instal·lacions, més recent o nom. Cada targeta és una línia i un xip d'estat — Instal·lat, Actualitzar, Pendent — i l'explicació viu al tooltip.
Dos àmbits
Un element publicat a aquesta organització el veuen els seus membres i no
necessita aprovació — qualsevol membre pot publicar. Un element publicat
globalment el veuen totes les organitzacions del desplegament quan un
curador l'aprova; fins llavors només el veuen el seu autor i els curadors,
marcat com a pendent, i un rebuig porta una frase que l'autor llegeix. Els curadors són els
administradors de l'organització indicada a l'ajust
marketplace.curator-organization — per defecte la més antiga, la de l'autor. En
un desplegament amb una sola organització el control d'àmbit no es mostra.
Què crea instal·lar
El recurs que l'element descriu, a la teva organització: una definició de servidor MCP (amb el forat de credencial buit i amb nom), un agent de biblioteca, un perfil de façana, una skill, la instal·lació d'un plugin o un flow (en pausa, sense secrets, com un duplicat). Una definició d'API no crea res: l'inspector del bloc API ofereix Fer servir del Marketplace… i n'omple els camps. Les credencials no viatgen mai — publicar un recurs les elimina i diu què ha tret. Els recursos que vénen d'una instal·lació porten un xip Marketplace · vN i ofereixen Actualitzar quan l'autor torna a publicar; desinstal·lar elimina el que la instal·lació va crear.
Què hi ha el primer dia
L'app sembra la seva pròpia biblioteca com a elements integrats: el catàleg d'MCP (Linear, GitHub, els servidors de Google i Microsoft, …), els quatre agents de biblioteca i els vuit flows d'inici. Un element integrat no es pot editar; una actualització de l'app el torna a sembrar, i un que vas esborrar continua esborrat. Publicar, aprovar, rebutjar, instal·lar i desinstal·lar s'escriuen al registre d'auditoria.
Equips i inici de sessió
Qui pot canviar què.
| Rol | Pot |
|---|---|
| Lector | Llegir flows i historial. |
| Operador | Executar flows i respondre aprovacions. |
| Membre | Crear i editar flows i recursos. |
| Administrador | Tot, inclosos membres, configuració i emmagatzematge. |
Imposat a cada petició tant per mètode com per ruta — no només pel que la interfície decideix dibuixar.
Iniciar sessió amb un directori
Microsoft, Google i Discord es registren des de dins de l'app, a Recursos → Membres → Proveïdors d'inici de sessió, i tenen efecte immediat. La pantalla d'inici de sessió mostra els tres tant si estan configurats com si no: un de no registrat diu què necessita en comptes d'enviar algú a un proveïdor que el rebutjarà després d'haver escrit la contrasenya.
Les persones s'aparellen per l'id immutable del mateix proveïdor, mai per la seva adreça — les adreces es reassignen quan la gent se'n va, i aparellar per una acabaria lliurant els flows de qui se'n va anar a qui heretés la bústia. Una adreça que ja té compte s'hi vincula en comptes de duplicar-se.
Tots els registres fallen igual la primera vegada. Copia-la de la pantalla de proveïdors —
es calcula a partir de la petició que estàs fent — i registra exactament aquella cadena. A
Microsoft, el camp on posar-la és web.redirectUris al manifest, perquè el
portal rebutja http:// amb una adreça de loopback.
Diversos comptes alhora
Un navegador pot tenir diversos comptes amb la sessió iniciada i canviar entre ells, amb el rol de cadascun mostrat al costat — que és a més la manera pràctica de comprovar que un permís es compleix de debò. Dos comptes actius alhora necessiten dues finestres, perquè una sessió és una cookie.
Grups
Una organització es pot dividir en grups — l'equip de plataforma, el de suport, el d'un client — a Recursos → Grups. Dues coses segueixen el grup: un recurs (un flow, un servidor MCP, un agent, una façana, una base de coneixement, una credencial, …) pot ser visible per a un sol grup en comptes de per a tota l'organització, triat amb Visible per a al recurs o a la targeta del flow, i el veuen només els membres del grup i els administradors; i un grup té la seva pròpia política i les seves pròpies sobreescriptures dels ajustos que s'apliquen per execució, en capa sobre els de l'organització per als flows que conté. Els administradors creen grups; els gestors d'un grup hi afegeixen i en treuen membres i n'editen els ajustos. Esborrar un grup retorna els seus recursos a l'organització. El Marketplace pot publicar en un grup i instal·lar-hi. Enterprise; amb una llicència Team la pantalla explica per què i el que un grup ja acota continua acotat.
Comptes de servei
Tokens per a màquines — un job de CI, una entrada de cron, un altre sistema — a
Recursos → Comptes de servei. Cadascun actua amb el seu rol a cada petició
i no ocupa seient; el token (csa_…) es mostra un sol cop i es desa amb hash.
El CLI sense interfície el llegeix de CONCENTUS_TOKEN i s’estalvia l’inici
de sessió. Una llicència Team n’admet dos alhora; Enterprise, els que calguin.
Diverses organitzacions
Un desplegament pot allotjar diverses organitzacions, cadascuna amb els seus flows, credencials, execucions i ajustos, a Recursos → Organitzacions. Una persona pot pertànyer a més d’una i canvia des del menú de compte; els seients es compten per persona, no per pertinença. Crear la segona organització és una funció Enterprise — la resta d’aquesta pantalla funciona en Team.
Polítiques d’organització
Regles sobre tots els flows de l’organització, a Recursos → Polítiques: una façana per defecte per als workers independents (s’omple on un bloc no n’indica cap, o es rebutja), un sostre al mode de permisos que qualsevol bloc pot demanar, un pressupost mensual per a tota l’organització al costat del de cada flow, i aprovació abans que un endpoint publicat respongui — fins que un administrador aprova el token desat, l’endpoint respon el mateix 404 que un de no publicat. El doctor del flow avisa de les tres coses abans d’executar. Enterprise; un desplegament Team veu el que hi ha desat, només lectura.
Registre d’auditoria i retenció
Qui va fer què i quan — execucions iniciades i aturades, aprovacions, flows desats i
publicats, membres i rols, credencials (només etiqueta i tipus), ajustos (només la clau),
llicències instal·lades, còpies de seguretat — a Recursos → Auditoria,
llegible per administradors a tots els nivells, amb filtres per autor, tipus i data.
Exportar-lo com a CSV o JSON és Enterprise. La retenció segueix el nivell: un desplegament
Team conserva noranta dies d’execucions, versions de flow i files d’auditoria i purga cada
nit (les execucions daurades i la versió actual de cada flow es queden sempre); Enterprise
ho conserva tot llevat que retention.enterprise-days digui una altra cosa; una
instal·lació gratuïta no es purga mai.
Runners
Execució en una màquina que algú opera, per a un hub que algú ha desplegat.
L'aplicació d'escriptori és un sol backend que és alhora el pla de control i el lloc on
s'executen els flows: el CLI claude corre a la màquina on hi ha la finestra,
amb la sessió que ja hi és. Un runner és aquesta meitat d'execució tota
sola — un procés en una màquina que tu operes (un portàtil que es queda encès, un NAS, un
contenidor al teu propi clúster) que es connecta cap enfora a un backend de
Concentus, el hub, s'hi registra amb un token encunyat allà i executa
els torns del CLI que el hub li lliura. El hub es queda els flows, les execucions, les
aprovacions, les credencials, els grups, les polítiques i la interfície; el runner es
queda la sessió, les carpetes, els clons i els processos. L'aplicació tota sola no canvia
— els runners són per a la forma en què un hub corre en algun lloc (java -jar,
o la imatge Docker) i s'obre en un navegador.
On viu la sessió
Les condicions d'Anthropic no permeten que les credencials d'una subscripció passin per
un tercer, i un hub que guardés el teu claude setup-token seria exactament
això. Així que el hub no guarda mai una sessió de Claude: un runner el registra
qui l'opera, en una màquina que opera, i porta la seva pròpia autenticació — la
sessió del CLI en aquella màquina, CLAUDE_CODE_OAUTH_TOKEN sortit de
claude setup-token, o ANTHROPIC_API_KEY. El hub només sap de
quin tipus és, i la llista ho mostra.
Àmbits
Qui registra un runner tria qui pot executar-hi flows. Organització: tots els seus membres; els registra un administrador. Grup: els seus membres, un administrador, i una programació o un webhook d'un flow que pertanyi al grup; un gestor del grup en pot registrar un, i necessita grups, així que Enterprise. Només jo: el propietari i ningú més — ni un administrador que no en sigui el propietari, ni mai una programació o un webhook. És la màquina d'algú i la sessió d'algú; qualsevol membre en pot registrar un per a si mateix. Els administradors veuen tots els runners; la resta veu els de l'organització, els dels seus grups i els seus.
Arrencar-ne un
Recursos → Runners → + Nou demana un nom i un àmbit i respon amb el token
(crn_…), mostrat un sol cop i desat amb hash, i les tres maneres
d'arrencar-lo amb l'URL del hub ja omplerta:
java -jar concentus-backend.jar runner --url https://hub.example.com --token crn_…
docker run -d -v concentus-runner:/data \
-e CONCENTUS_RUNNER_URL=https://hub.example.com -e CONCENTUS_RUNNER_TOKEN=crn_… \
-e CLAUDE_CODE_OAUTH_TOKEN=… ghcr.io/gergilcan/concentus-runner:latest
O la mateixa aplicació d'escriptori, des de la safata, a Configura… → Servidor:
continua funcionant com fins ara i a més executa per a aquell hub. En mode
runner el jar no arrenca mai Spring — ni base de dades ni port — i surt amb
3 si el token es rebutja, en comptes de reintentar. El que necessita de la
seva banda: git, el CLI claude, LOCAL_CONTEXT_ROOTS
per a les carpetes que els flows hi poden llegir (buit les rebutja totes, com en un hub),
i EXECUTION_MAX_PROCESSES per a quants torns alhora — aplica el seu propi
sostre, no el del hub. Un hub i un runner junts, amb compose, són a
packaging/docker del repositori.
Quin runner fa servir un flow
S'executa a, a la Configuració del flow. Aquest servidor (per defecte): aquí quan el CLI té sessió en aquest backend; si no, el runner en línia menys ocupat que puguis fer servir — el registre ho diu —; si no, una API key o el rebuig. Qualsevol runner: el runner utilitzable en línia menys ocupat; sense cap en línia, l'arrencada falla a l'acte, no hi ha cua. Un runner pel nom: aquell; desconnectat, revocat o no teu per fer-lo servir, i l'arrencada es rebutja anomenant-lo. Només els flows del CLI de Claude van a runners; un model autoallotjat es queda al hub. La primera línia de l'execució anomena el runner, la llista d'execucions porta un xip amb el seu nom, i l'execució es factura com una de local — amb la subscripció d'aquell runner.
Un torn no sobreviu que el runner es desconnecti: després de 45 s sense batec el hub l'acaba com a desconnectat, i el que el runner estava executant acaba de la seva banda amb la sortida perduda. El runner es reconnecta sol; no es reprèn res. Els espais de treball acabats no es netegen al runner, i cap cua espera que un runner es connecti.
Emmagatzematge
Integrat per defecte; una base de dades d'empresa quan la vulguis.
Cada compilació guarda les dades en un PostgreSQL integrat sota el directori de dades de l'app. Això no és un mode demo — és el mateix esquema, les mateixes migracions i el mateix camí de codi que un desplegament en servidor.
Recursos → Emmagatzematge apunta la instal·lació al teu propi PostgreSQL i copia el que ja hi ha, taula per taula, informant del que s'ha mogut. La còpia és una còpia: les dades integrades es queden on eren fins que n'estiguis satisfet.
Les credencials es xifren amb una clau que la instal·lació genera a la primera arrencada i
guarda a secret.key al costat de les dades. Una còpia de la base de dades
sense aquest fitxer restaura files que ningú no pot desxifrar. Defineix
CONCENTUS_SECRET_KEY per guardar-la en un altre lloc — un vault, un secret de
contenidor.
Actualitzacions
Una marca al racó, no un diàleg.
L'app d'escriptori s'actualitza sola: comprova cada quatre hores, baixa en segon pla i instal·la quan surts. Res d'això no interromp res, cosa que també ho feia invisible — així que l'estat ara és a dalt a la dreta de la finestra. Silenciós mentre no hi ha res a dir, un punt verd quan hi ha una versió baixada i esperant. En fer-hi clic diu en quin estat són les coses i ofereix l'única acció que té aquell estat: comprovar ara, o reiniciar i instal·lar.
Un diàleg d'actualització que interromp la feina ensenya la gent a descartar diàlegs d'actualització. Una marca que espera que la vegin no costa res i demà continua allà.
Instal·lar sense que et preguntin res
Prémer instal·lar executa l'instal·lador en silenci: sense assistent, sense pàgina de llicència que ja vas acceptar, i sense preguntar on posar-lo — va on ja és la instal·lació existent. L'app es torna a obrir quan acaba.
Abans que l'instal·lador arrenqui, Concentus acaba el seu propi backend i espera que de debò hagi desaparegut, enduent-se tot l'arbre de processos si demanar-ho per les bones no funciona. Aquesta espera no és cortesia: el runtime de Java inclòs viu dins del directori d'instal·lació, així que un instal·lador que arrenca mentre el backend encara reté aquells fitxers s'atura i informa que l'aplicació continua oberta — darrere d'una finestra que ja ha desaparegut.
Quines versions se t'ofereixen
Una compilació preliminar segueix tant les versions preliminars com les finals, prenent la més nova. Una compilació final només segueix versions finals: qui va instal·lar una versió estable no va demanar que el passessin a una de preliminar.
-beta.N, i això no és cosmètic
electron-updater deriva el canal d'actualització de l'identificador de preliminar de la
versió, i només ofereix una versió final a compilacions el canal de les quals és nul,
alpha o beta — aquests tres noms estan escrits a foc. Amb
qualsevol altre identificador, rc inclòs, una compilació no pot arribar mai a
una versió estable. També ha de dur punt: 0.1.3-beta.1 dona a cada versió del
tren el mateix canal, mentre que 0.1.3-beta1 dona a cadascuna el seu i a
ningú no se li ofereix mai la següent. El flux de publicació rebutja tots dos errors.
Una execució de desenvolupament no té app empaquetada per actualitzar, i una instal·lació
.deb l'actualitza el gestor de paquets del sistema. Totes dues ho diuen i es
retiren en comptes de fallar en bucle.
Configuració
El que abans eren variables d'entorn.
Recursos → Configuració. Un valor es busca en tres llocs, per ordre: el que algú va fixar a l'aplicació, allò amb què es va arrencar el desplegament, i després el valor per defecte integrat. Aquest ordre és el que manté funcionant tots dos públics — un contenidor arrencat per un pipeline continua prenent el seu entorn, i la persona davant de l'app pot canviar el mateix des d'un formulari.
La pantalla diu d'on va sortir cada valor, perquè «8» vol dir tres coses diferents i només una d'elles et toca a tu esborrar-la, i si el canvi espera un reinici — la majoria sí, perquè dimensionen un pool de fils o una política quan arrenca l'aplicació. Els proveïdors d'inici de sessió són l'excepció deliberada: qui acaba d'enganxar un client id vol provar-lo.
Buidar un camp elimina l'anul·lació en comptes de desar-ne una de buida. Els secrets se segellen amb la mateixa clau que protegeix les credencials desades i mai no es tornen a llegir des de l'API.
Aparença és a dalt de la mateixa pantalla — fosc, clar o contrast alt. No és un dels paràmetres de sota: viu en aquest navegador, s'aplica a l'instant en què es tria i no té Desa. Abans era un botó a la capçalera, que rotava de clic en clic entre tres valors, cosa que és molt del racó més valuós de la pantalla per a una cosa que una persona fixa un sol cop.
Traces i mètriques
OpenTelemetry, en les unitats de feina pròpies d'aquesta aplicació.
El framework ja instrumenta el que un framework pot veure. Res d'això no respon a la pregunta que de debò té algú aquí, que és sobre una execució. Així que hi ha sis noms d'span i un sol vocabulari d'atributs:
| Span | Cobreix |
|---|---|
concentus.run | Una execució, des del seu activador fins al seu últim bloc |
concentus.node | Un bloc: un agent, una porta, un subflow, una crida a API |
concentus.worker | Un worker independent en un repartiment en paral·lel |
concentus.tool | Una crida a eina MCP, rebutjos inclosos |
concentus.model | Una petició a un model |
concentus.retrieval | Una cerca de coneixement: totes dues branques, la fusió, qualsevol reordenació |
Els atributs porten identificadors, recomptes i resultats. Una traça acaba al sistema d'un altre, normalment amb una retenció més llarga que qualsevol cosa d'aquí i llegida per gent a qui mai no es va donar accés als flows. El que és útil per depurar i el que és segur d'exportar són conjunts diferents, i on difereixen guanya el més petit.
No s'exporta res fins que s'anomena un col·lector, i està apagat per un interruptor i no per
una adreça en blanc — un endpoint buit no és «enlloc» per a un exportador OTLP, és una URL
invàlida. Configura-ho a Configuració, o amb OTLP_ENABLED i
OTLP_ENDPOINT. Les traces s'exporten en qualsevol pla, instal·lacions
gratuïtes incloses; només l'exportació de mètriques és una funció Enterprise.
Enviar les traces a una eina d'observabilitat LLM
Qualsevol cosa que parli OTLP/HTTP les llegeix, i les orientades a agents agrupen soles els spans d'una execució. L'endpoint i una capçalera són tota la integració.
| On | Endpoint | Capçalera |
|---|---|---|
| Langfuse (cloud) | https://cloud.langfuse.com/api/public/otel/v1/traces | authorization: Basic <base64 de pública:secreta> |
| LangSmith | https://api.smith.langchain.com/otel/v1/traces | x-api-key: <clau> |
| Phoenix (autoallotjat) | http://localhost:6006/v1/traces | cap en local |
| Collector · Tempo · Jaeger | http://localhost:4318/v1/traces | la que demani |
La capçalera authorization té la seva pròpia fila a Configuració. Qualsevol
altra és una propietat de Spring: management.otlp.tracing.headers.x-api-key=….
CLI sense interfície
Executar un flow des d'un script.
pnpm desktop:build # once — builds the jar
export CONCENTUS_EMAIL=you@company.com
export CONCENTUS_PASSWORD=…
# o, per a una màquina: el token d’un compte de servei en comptes d’iniciar sessió
export CONCENTUS_TOKEN=csa_…
node scripts/concentus-run.mjs my-flow.json --input "go"
echo $? # 0 completed · 1 failed · 2 needs a human
Inicia sessió com tota la resta. Un script que pogués fer anar el backend sense credencials
seria un forat, no una comoditat. Prefereix les variables d'entorn a --email /
--password: un argument acaba al log de la feina i a la llista de processos.
Llicències
Què és gratis, què necessita un seient i on va una llicència.
Concentus funciona sense cap llicència instal·lada: la base de dades integrada, un seient. Això no és una prova — res d'això no caduca ni deixa de funcionar, i és amb què arrenca tota instal·lació.
Què no necessita llicència
Tot el que fa servir un individu: el llenç, cada bloc, cada activador, les bases de coneixement, la via del model local — tot, amb el límit d'un seient de dalt. Una llicència individual és gratis i no canvia res de funcional; només posa un nom a la instal·lació. Demana'n una des del lloc web i arriba per correu.
Què necessita una llicència enterprise
Tres coses, totes més enllà d'aquest seient únic per defecte:
- Una base de dades compartida — apuntar la instal·lació a un PostgreSQL al qual es connecta el teu equip, en comptes de l'integrat.
- Membres més enllà del primer — a partir del segon seient.
- SSO — iniciar sessió amb Microsoft, Google o Discord en comptes d'una contrasenya local.
Una llicència Team cobreix fins a deu seients — 25 € per seient al mes, o 20 € per seient al mes si pagues l’any de cop — i es compra amb targeta a la secció de preus: la llicència arriba per correu minuts després del pagament, renovar és tornar a comprar i tots els membres enganxen el mateix token. Inclou tot el que un equip necessita per treballar junt: les tres coses de dalt, el registre d’auditoria en pantalla, comptes de servei, endpoints publicats i els inicis de sessió amb Google i Microsoft.
Enterprise és escala i governança — qualsevol nombre de seients, factura en comptes de targeta, o un contracte: escriu a gila791@hotmail.com. Deu coses són només Enterprise, i cadascuna es diu igual al lloc web, al panell de llicència i a la frase que veus quan una llicència Team no la cobreix:
- Proveïdors d’identitat personalitzats — qualsevol emissor OpenID Connect (Okta, Keycloak, una app d’Entra pròpia). Team té els preajustos de Google i Microsoft.
- Comptes automàtics per a un domini de correu — el primer inici de sessió crea el compte. En Team es convida.
- Exportació de mètriques OpenTelemetry al teu col·lector. Les traces s'exporten en qualsevol pla.
- Polítiques d’organització — vegeu Equips i inici de sessió.
- Exportació del registre d’auditoria com a CSV o JSON.
- Retenció il·limitada — Team conserva noranta dies.
- Diverses organitzacions en un desplegament.
- Comptes de servei il·limitats — Team en té dos.
- Endpoints publicats sense límit de peticions — Team: 60 peticions per minut i token.
- Grups dins d'una organització — recursos visibles per a un sol grup, i ajustos i política propis del grup.
Enterprise és també el nivell per a un desplegament darrere d’un proxy o sense internet: la llicència es verifica sense connexió, la telemetria és opcional i un desplegament en servidor no fa cap crida externa pel seu compte — Claude continua necessitant arribar a Anthropic; un flow amb un model propi no necessita res fora de la xarxa.
On va una llicència
Dues fonts, guanya la primera coincidència:
| Font | Quan fer-la servir |
|---|---|
CONCENTUS_LICENSE |
Una variable d'entorn. Per a un contenidor o un desplegament per script sense disc escrivible digne d'esment — i sempre guanya sobre el fitxer de sota mentre estigui definida. |
license.key |
Al costat del directori de dades de l'app. El que Recursos → Configuració → Llicència escriu per a tota la resta — enganxa el token que et va arribar per correu i l'app escriu el fitxer per tu. |
Caducitat i període de gràcia
Una llicència individual mai no caduca — és gratis, així que no hi ha res que venci. Una llicència enterprise caducada continua funcionant 14 dies més després de la seva data: la renovació és una ordre de compra, no un clic, i un flow que deixa d'executar-se en el moment en què canvia la data — a mitja tarda, a qui estigui de guàrdia — és un error pitjor que un avís durant dues setmanes.
La instal·lació no es bloqueja; baixa al mateix estat d'un seient i base de dades integrada amb què arrenca una instal·lació nova, fins que s'instal·la una llicència renovada.
API HTTP
El que crida la mateixa interfície.
Cada escriptura retorna un token CSRF que arriba com a cookie llegible al primer GET. Una cookie per si sola no demostraria intenció, que és tota la gràcia de la capçalera.
| Mètode | Ruta | Què fa |
|---|---|---|
| GET | /api/account/session | Qui té la sessió iniciada, quins proveïdors existeixen, si aquesta instal·lació necessita el seu primer compte |
| POST | /api/account/setup | Crear aquest primer compte. S'hi nega en quant n'existeix un |
| POST | /api/account/login | Iniciar sessió · /logout |
| GET/POST | /api/account/members | Membres de l'organització admin |
| GET/PUT | /api/account/providers | Registrar Microsoft / Google / Discord admin |
| GET/POST | /api/flows | Llistar i desar flows · /{id}/versions |
| POST | /api/runs | Arrencar una execució · /{id}/events la transmet |
| GET/POST | /api/knowledge | Bases de coneixement · /{id}/documents · /{id}/urls · /{id}/refresh |
| POST | /api/knowledge/{id}/search | Provar una consulta contra una base |
| GET/POST | /api/knowledge/{id}/evals | El conjunt daurat · /evals/run el puntua |
| GET | /api/knowledge/embedder | Els models opcionals · /reranker · …/download |
| GET/PUT | /api/settings | Tot l'ajustable, amb l'origen de cada valor admin |
| GET/POST | /api/storage | On viuen les dades · /migrate les copia admin |
| GET | /api/audit | El registre, filtrat i paginat · /export?format=csv|json admin |
| GET/POST | /api/retention | La finestra en vigor · /run-now purga avui admin |
| GET/POST | /api/organizations | Organitzacions · /{id}/members · /{id}/switch admin |
| GET/POST | /api/service-accounts | Tokens per a màquines · /{id}/revoke admin |
| GET/POST | /api/runners | Runners · /{id}/revoke · /usable — aquells on pots executar flows · /self — l'agent d'aquest mateix backend |
| WS | /ws/runner | La connexió d'un runner, amb el seu token crn_… com a bearer |
| GET/PUT | /api/org-policy | Les regles de l’organització · /publish/{flowId}/approve admin |
| POST | /api/public/flows/{id}/run | Un endpoint publicat, amb el seu token bearer · /runs/{runId} el consulta |
| GET/POST | /api/license | La llicència en vigor i el que desbloqueja · instal·lar un token admin |
Entorn
No es requereix res. Aquestes són les excepcions que val la pena conèixer.
Quatre coses no poden ser paràmetres, perquè són el que cal saber abans que hi hagi on guardar un paràmetre.
| Variable | Quan la necessites |
|---|---|
PERSIST_DB_URLPERSIST_DB_USERPERSIST_DB_PASSWORD |
Apuntar a un PostgreSQL extern des del principi. Si no, es fa servir l'integrat, i la pantalla d'Emmagatzematge et pot moure més tard. |
CONCENTUS_SECRET_KEY |
Guardar la clau de xifratge en un lloc que no sigui secret.key al costat de les dades. |
CONCENTUS_ADMIN_EMAILCONCENTUS_ADMIN_PASSWORD |
Crear el primer compte en un desplegament davant del qual no hi seu ningú. |
APP_DATA_DIR · SERVER_PORT |
On viuen les dades i a quin port escoltar. |
CONCENTUS_RUNNER_URLCONCENTUS_RUNNER_TOKENCONCENTUS_RUNNER_NAME |
Arrencar el jar com a runner (amb runner com a primer argument), o fer que un backend complet actuï també com un. |
CONCENTUS_RUNNER_DATA_DIR · CLAUDE_COMMAND · LOCAL_CONTEXT_ROOTS · EXECUTION_MAX_PROCESSES |
El que un runner guarda de la seva banda: espais de treball i clons, el CLI, les carpetes que pot llegir, quants processos del CLI alhora. |
Tota la resta — longituds de cua, temps d'espera, preus de models, llistes de permesos, l'endpoint OTLP — és un paràmetre, i l'entorn es continua llegint com la capa intermèdia de les tres.