Benchmark zur Extraktionsgenauigkeit
Syncanix macht aus Ihrer API Agent-Capabilities, indem es Ihren Quellcode liest. Das funktioniert nur, wenn die Extraktion genau ist — also messen wir sie, veröffentlichen die Ergebnisse und pinnen jede Zahl auf dieser Seite per Test an das versionierte Eval-Harness. Regressiert ein Extraktor, schlägt der Build fehl, bevor diese Seite irgendetwas übertreiben kann.
Kernergebnisse
Zuletzt verifiziert: 2026-06-11 · 9c09e59f2
Methodik
- Handabgeleitete Ground Truth
Für jedes bewertete Repo lesen wir die Routendefinitionen von Hand und listen jeden echten Endpoint als Methode-Pfad-Paar. Der Extraktor wird gegen diese Liste bewertet: Recall ist der Anteil gefundener echter Endpoints; Precision der Anteil extrahierter Endpoints, die echt sind.
- Strukturelles Matching
Ein Treffer bedeutet HTTP-Methode plus vollständig zusammengesetzter Pfad — gemountete Präfixe inklusive. Pfadparameter werden nach Struktur verglichen, nicht nach Name: :id und {slug} an derselben Position sind gleich.
- Nur statische Analyse
Die Discovery liest Quellcode; sie führt Ihre Anwendung nie aus, inspiziert keinen Traffic und ruft keine Endpoints auf. Jede Zahl hier stammt aus demselben Detect-und-Extract-Pfad, den npx syncanix init ausführt.
- In CI getestet, per Test gepinnt
Die deterministische Fixture-Suite gatet die CI bei jeder Extraktor-Änderung, und die Zahlen dieser Seite sind per Test an die Harness-Ausgabe gepinnt — eine Regression lässt den Build fehlschlagen, bevor sie ausgeliefert werden kann.
Echte öffentliche Repos, bewertet
Zwölf Referenzimplementierungen — überwiegend RealWorld-Apps — mit handabgeleiteter Ground Truth. Die Repos sind öffentlich: Sie können dieselben Routendateien lesen wie wir.
| Framework | Repository | Echte Endpoints | Recall | Precision |
|---|---|---|---|---|
| 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% |
Deterministische Fixture-Suite
Versionierte Fixture-Projekte pro Framework, bewertet per F1 gegen Framework-spezifische Schwellen. Das ist die Suite, die die CI bei jeder Extraktor-Änderung gatet.
| Framework | Fixtures | F1 | Gate-Schwelle |
|---|---|---|---|
| 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, die durch die bewerteten echten Repos statt durch synthetische Fixtures abgedeckt sind: django, flask, rails
Eingebettete Real-World-Fixtures
Vollständige echte Repositories, bei einem gepinnten Commit eingebettet und gegen ein spezifikationsabgeleitetes oder handgelabeltes Orakel bewertet. Die gegatete Metrik ist der strukturelle F1 (Methode + Pfad).
| Framework | Fixture | Struktureller F1 | Ground Truth |
|---|---|---|---|
| FastAPI | fastapi-realworld@029eb77 | 1.000 | openapi |
| Hono | hono-open-api-starter@0d5f3bf | 1.000 | hand-labelled |
| Symfony | symfony-realworld@5ad39de | 1.000 | openapi |
Was diese Zahlen nicht behaupten
- Das bewertete Set sind kuratierte Referenz-Apps, keine Zufallsstichprobe aller Codebasen. Ihr Repo kann abweichen — deshalb schreibt die CLI einen überprüfbaren Katalog, statt um Vertrauen zu bitten.
- Dieser Benchmark misst die strukturelle Extraktion (Methoden und Pfade). Die Qualität der vom LLM verfassten Capability-Beschreibungen wird separat evaluiert und ist nicht Teil dieser Zahlen.
- Die Kennzeichnung von Auth-Anforderungen ist in manchen Extraktoren bewusst konservativ und kann bei öffentlichen Endpoints von einem spezifikationsabgeleiteten Orakel abweichen; die gegatete Metrik ist die strukturelle Genauigkeit.
Selbst überprüfen
Die aussagekräftigste Prüfung ist Ihre eigene Codebasis: Führen Sie die Discovery-CLI aus und prüfen Sie den geschriebenen Katalog — jede extrahierte Capability nennt ihre Quellposition, sodass Sie den Katalog in Minuten gegen Ihre Routendateien diffen können. Der Transparenz halber: Dies sind die internen Harness-Befehle hinter den Zahlen oben (die Extraktoren sind source-available; das Eval-Korpus ist nicht öffentlich):
pnpm --filter syncanix test:f1
pnpm --filter syncanix scan:realFramework-Unterstützung listet jedes Framework und jede Sprache, die die CLI liest — und was zu tun ist, wenn Ihres nicht abgedeckt ist.