Benchmark de précision d’extraction
Syncanix transforme votre API en capacités pour agents en lisant votre code source. Cela ne fonctionne que si l’extraction est précise : nous la mesurons donc, publions les résultats et épinglons par des tests chaque chiffre de cette page au harnais d’évaluation versionné. Si un extracteur régresse, le build échoue avant que cette page ne puisse rien exagérer.
Résultats principaux
Dernière vérification : 2026-06-11 · 9c09e59f2
Méthodologie
- Vérité terrain dérivée à la main
Pour chaque dépôt noté, nous lisons à la main ses définitions de routes et listons chaque endpoint réel comme une paire méthode + chemin. L’extracteur est noté contre cette liste : le rappel est la part d’endpoints réels trouvés ; la précision, la part d’endpoints extraits qui sont réels.
- Correspondance structurelle
Une correspondance signifie la méthode HTTP plus le chemin complet composé, préfixes montés inclus. Les paramètres de chemin sont comparés par structure, pas par nom : :id et {slug} à la même position sont égaux.
- Analyse statique uniquement
La découverte lit le code source ; elle n’exécute jamais votre application, n’inspecte pas votre trafic et n’appelle pas vos endpoints. Chaque chiffre ici provient du même chemin de détection et d’extraction que npx syncanix init exécute.
- Testé en CI, épinglé par des tests
La suite déterministe de fixtures bloque la CI à chaque changement d’extracteur, et les chiffres de cette page sont épinglés à la sortie du harnais par des tests : une régression fait échouer le build avant de pouvoir être publiée.
Vrais dépôts publics, notés
Douze implémentations de référence — surtout des applications RealWorld — avec vérité terrain dérivée à la main. Les dépôts sont publics : vous pouvez lire les mêmes fichiers de routes que nous.
| Framework | Dépôt | Endpoints réels | Rappel | Précision |
|---|---|---|---|---|
| Express | gothinkster/node-express-realworld-example-app | 20 | 100% | 100% |
| NestJS | lujakob/nestjs-realworld-example-app | 21 | 100% | 100% |
| FastAPI | nsidnev/fastapi-realworld-example-app | 19 | 100% | 100% |
| Flask | gothinkster/flask-realworld-example-app | 19 | 100% | 100% |
| Django | gothinkster/django-realworld-example-app | 23 | 100% | 100% |
| Rails | gothinkster/rails-realworld-example-app | 20 | 100% | 100% |
| Laravel | f1amy/laravel-realworld-example-app | 19 | 100% | 100% |
| Gin | gothinkster/golang-gin-realworld-example-app | 20 | 100% | 100% |
| Spring Boot | gothinkster/spring-boot-realworld-example-app | 19 | 100% | 100% |
| Actix | snamiki1212/realworld-v1-rust-actix-web-diesel | 20 | 100% | 100% |
| ASP.NET Core | gothinkster/aspnetcore-realworld-example-app | 19 | 100% | 100% |
| GraphQL | howtographql/graphql-js | 8 | 100% | 100% |
Suite déterministe de fixtures
Des projets fixtures versionnés par framework, notés en F1 contre des seuils par framework. C’est la suite qui bloque la CI à chaque changement d’extracteur.
| Framework | Fixtures | F1 | Seuil de gate |
|---|---|---|---|
| nestjs | 5 | 1.000 | 0.92 |
| express | 3 | 1.000 | 0.85 |
| fastapi | 8 | 1.000 | 0.92 |
| nextjs | 8 | 1.000 | 0.92 |
| graphql | 5 | 1.000 | 1.00 |
| grpc | 1 | 1.000 | 0.92 |
| trpc | 2 | 1.000 | 0.92 |
| websocket | 2 | 1.000 | 0.85 |
| springboot | 1 | 1.000 | 0.85 |
| phoenix | 1 | 1.000 | 0.85 |
| gin | 2 | 1.000 | 0.85 |
| actix | 1 | 1.000 | 0.85 |
| axum | 2 | 1.000 | 0.85 |
| laravel | 1 | 1.000 | 0.85 |
| aspnet | 1 | 1.000 | 0.85 |
| vapor | 1 | 1.000 | 0.75 |
| play | 1 | 1.000 | 0.75 |
| compojure | 1 | 1.000 | 0.75 |
| dream | 1 | 1.000 | 0.75 |
| servant | 1 | 1.000 | 0.75 |
| cowboy | 1 | 1.000 | 0.75 |
| plumber | 1 | 1.000 | 0.75 |
| lapis | 1 | 1.000 | 0.75 |
Frameworks couverts par les dépôts réels notés plutôt que par des fixtures synthétiques : django, flask, rails
Fixtures réelles embarquées
Des dépôts réels complets embarqués à un commit épinglé et notés contre un oracle dérivé de la spécification ou étiqueté à la main. La métrique à seuil est le F1 structurel (méthode + chemin).
| Framework | Fixture | F1 structurel | Vérité terrain |
|---|---|---|---|
| FastAPI | fastapi-realworld@029eb77 | 1.000 | openapi |
| Hono | hono-open-api-starter@0d5f3bf | 1.000 | hand-labelled |
| Symfony | symfony-realworld@5ad39de | 1.000 | openapi |
Ce que ces chiffres ne prétendent pas
- L’ensemble noté est constitué d’applications de référence choisies, pas d’un échantillon aléatoire de tous les codes. Votre dépôt peut différer — c’est pourquoi la CLI écrit un catalogue relisible au lieu de demander votre confiance.
- Ce benchmark mesure l’extraction structurelle (méthodes et chemins). La qualité des descriptions de capacités rédigées par le LLM est évaluée séparément et ne fait pas partie de ces chiffres.
- L’étiquetage des exigences d’authentification est volontairement conservateur dans certains extracteurs et peut diverger d’un oracle dérivé de la spécification sur des endpoints publics ; la métrique à seuil est la pr écision structurelle.
Vérifiez-le vous-même
La vérification la plus parlante est votre propre code : lancez la CLI de découverte et relisez le catalogue qu’elle écrit — chaque capacité extraite cite son emplacement dans le code, vous pouvez donc comparer le catalogue à vos fichiers de routes en quelques minutes. Par transparence, voici les commandes internes du harnais derrière les chiffres ci-dessus (les extracteurs sont source-available ; le corpus d’évaluation n’est pas public) :
pnpm --filter syncanix test:f1
pnpm --filter syncanix scan:realFrameworks pris en charge liste chaque framework et langage que lit la CLI — et quoi faire si le vôtre n’est pas couvert.