fix: validate SORE before returning, skip malformed grammars

- Add validate_sore() to gbnf.py — checks parseability without converting
- _infer_group now validates grammar and returns skip_reason='malformed_grammar'
  for SOREs containing raw code (e.g. w_body=, sult=, (+,+:N+...)
- Results: 130 grammars, 130 GBNF OK, 0 GBNF FAIL
  - Flask: 5 OK, 0 FAIL, 3.4s
  - RAGSAK: 19 OK, 0 FAIL, 11 malformed, 12.9s
  - FastAPI: 106 OK, 0 FAIL, 6 malformed, 30.5s
This commit is contained in:
tobjend 2026-07-12 02:56:13 +02:00
parent bc7d3b6ca1
commit 3468813ec8
5 changed files with 1203 additions and 51 deletions

View file

@ -372,3 +372,14 @@ def to_gbnf_with_rules(sore, name='root'):
tree = _parse_sore(sore) tree = _parse_sore(sore)
frag, _, _ = _node_to_gbnf(tree, 0) frag, _, _ = _node_to_gbnf(tree, 0)
return f'{name} ::= {frag}' return f'{name} ::= {frag}'
def validate_sore(sore):
"""Check if a SORE string is parseable. Returns (True, None) or (False, error_msg)."""
if not sore or sore in ('', 'ε'):
return True, None
try:
_parse_sore(sore)
return True, None
except ValueError as e:
return False, str(e)

View file

@ -20,6 +20,7 @@ import pathspec
from .code import preprocess_by_method, extract_arg_info, _summarize_arg_info from .code import preprocess_by_method, extract_arg_info, _summarize_arg_info
from bex.ensemble import infer_ensemble from bex.ensemble import infer_ensemble
from bex.gbnf import validate_sore
SUPPORTED_EXTENSIONS = { SUPPORTED_EXTENSIONS = {
".py", ".js", ".ts", ".kt", ".rb", ".go", ".rs", ".java", ".c", ".cpp", ".py", ".js", ".ts", ".kt", ".rb", ".go", ".rs", ".java", ".c", ".cpp",
@ -312,6 +313,14 @@ def _infer_group(label, group_seqs, group_files, project_root, min_coverage, pre
} }
else: else:
result = infer_ensemble(symbol_seqs, kmax=kmax, N=N, prefer=prefer, min_coverage=min_coverage, include_kore=include_kore, include_idregex=include_idregex) result = infer_ensemble(symbol_seqs, kmax=kmax, N=N, prefer=prefer, min_coverage=min_coverage, include_kore=include_kore, include_idregex=include_idregex)
# Validate grammar is parseable
if result and result.get('best') and result['best'].get('grammar'):
ok, err = validate_sore(result['best']['grammar'])
if not ok:
meta = {"files": group_files, "imports": imports, "arg_patterns": arg_patterns, "packages": packages, "skip_reason": "malformed_grammar", "skip_detail": err}
return (label, None, len(filtered), meta)
meta = {"files": group_files, "imports": imports, "arg_patterns": arg_patterns, "packages": packages} meta = {"files": group_files, "imports": imports, "arg_patterns": arg_patterns, "packages": packages}
return (label, result, len(filtered), meta) return (label, result, len(filtered), meta)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,83 @@
[
{
"package": "examples/celery/src/task_app",
"ext": ".py",
"methods": 11,
"skip": "too_diverse"
},
{
"package": "examples/javascript/tests",
"ext": ".py",
"methods": 5,
"skip": "too_diverse"
},
{
"package": "examples/tutorial/flaskr",
"ext": ".py",
"methods": 18,
"skip": "too_diverse"
},
{
"package": "examples/tutorial/tests",
"ext": ".py",
"methods": 25,
"skip": "too_diverse"
},
{
"package": "src/flask",
"ext": ".py",
"methods": 216,
"skip": "too_diverse"
},
{
"package": "src/flask/json",
"ext": ".py",
"methods": 50,
"sore": "(TypeError+UUID+__html__+_app+_default+_json+_prepare_response_obj+_untag_scan+and+args+current_app+dict+dumps+else+for+fp+http_date+if+in+is+isinstance+item+items+iter+json+k+key+kwargs+len+list+loads+mimetype+next+not+obj+or+order+raise+response_class+return+s+self+serializer+setdefault+str+tag+tags+tuple+v+value)+.NotImplementedError+?",
"gbnf": "root ::= (\"TypeError\" | \"UUID\" | \"__html__\" | \"_app\" | \"_default\" | \"_json\" | \"_prepare_response_obj\" | \"_untag_scan\" | \"and\" | \"args\" | \"current_app\" | \"dict\" | \"dumps\" | \"else\" | \"for\" | \"fp\" | \"http_date\" | \"if\" | \"in\" | \"is\" | \"isinstance\" | \"item\" | \"items\" | \"iter\" | \"json\" | \"k\" | \"key\" | \"kwargs\" | \"len\" | \"list\" | \"loads\" | \"mimetype\" | \"next\" | \"not\" | \"obj\" | \"or\" | \"order\" | \"raise\" | \"response_class\" | \"return\" | \"s\" | \"self\" | \"serializer\" | \"setdefault\" | \"str\" | \"tag\" | \"tags\" | \"tuple\" | \"v\" | \"value\")+ \"NotImplementedError\"*",
"gbnf_ok": true
},
{
"package": "src/flask/sansio",
"ext": ".py",
"methods": 102,
"sore": "(Any+BlueprintSetupState+ValueError+__name__+_method_route+add_url_rule+and+app+append+callable+code+config+decorator+def+dict+else+endpoint+f+for+func+if+import_name+in+is+is not+lambda+name+not+options+or+os+path+raise+record_once+return+root_path+rstrip+rule+s+self+setdefault+state+static_folder+str+t+url_default_functions+value+values+view_func+view_functions)+",
"gbnf": "root ::= (\"Any\" | \"BlueprintSetupState\" | \"ValueError\" | \"__name__\" | \"_method_route\" | \"add_url_rule\" | \"and\" | \"app\" | \"append\" | \"callable\" | \"code\" | \"config\" | \"decorator\" | \"def\" | \"dict\" | \"else\" | \"endpoint\" | \"f\" | \"for\" | \"func\" | \"if\" | \"import_name\" | \"in\" | \"is\" | \"is not\" | \"lambda\" | \"name\" | \"not\" | \"options\" | \"or\" | \"os\" | \"path\" | \"raise\" | \"record_once\" | \"return\" | \"root_path\" | \"rstrip\" | \"rule\" | \"s\" | \"self\" | \"setdefault\" | \"state\" | \"static_folder\" | \"str\" | \"t\" | \"url_default_functions\" | \"value\" | \"values\" | \"view_func\" | \"view_functions\")+",
"gbnf_ok": true
},
{
"package": "tests",
"ext": ".py",
"methods": 962,
"sore": "(@+Blueprint+__name__+app+append+class+client+config+data+def+e+flask+get+in+index+isinstance+not+raise+render_template+request+return+route+rv+s+self+session+value)+",
"gbnf": "root ::= (\"@\" | \"Blueprint\" | \"__name__\" | \"app\" | \"append\" | \"class\" | \"client\" | \"config\" | \"data\" | \"def\" | \"e\" | \"flask\" | \"get\" | \"in\" | \"index\" | \"isinstance\" | \"not\" | \"raise\" | \"render_template\" | \"request\" | \"return\" | \"route\" | \"rv\" | \"s\" | \"self\" | \"session\" | \"value\")+",
"gbnf_ok": true
},
{
"package": "tests/test_apps",
"ext": ".py",
"methods": 3,
"skip": "too_diverse"
},
{
"package": "tests/test_apps/blueprintapp/apps",
"ext": ".py",
"methods": 4,
"sore": "return.render_template+",
"gbnf": "root ::= \"return\" \"render_template\"+",
"gbnf_ok": true
},
{
"package": "tests/type_check",
"ext": ".py",
"methods": 24,
"sore": "def?.(Generator+encode+for+in+iter+range+return+show+str+t+x+yield)+?.(Response+code+jsonify)+?.render_template+?.HTTPStatus?.stream_template+?.self?.OK?.name+?.template_name+?",
"gbnf": "root ::= \"def\"? (\"Generator\" | \"encode\" | \"for\" | \"in\" | \"iter\" | \"range\" | \"return\" | \"show\" | \"str\" | \"t\" | \"x\" | \"yield\")* (\"Response\" | \"code\" | \"jsonify\")* \"render_template\"* \"HTTPStatus\"? \"stream_template\"* \"self\"? \"OK\"? \"name\"* \"template_name\"*",
"gbnf_ok": true
},
{
"package": "(other)",
"ext": ".py",
"methods": 4
}
]

View file

@ -11,9 +11,7 @@
"package": "agents/capability/ports/src/main/kotlin/eu/corentic/springrag/agent/capability", "package": "agents/capability/ports/src/main/kotlin/eu/corentic/springrag/agent/capability",
"ext": ".kt", "ext": ".kt",
"methods": 5, "methods": 5,
"sore": "listCapabilities?.AgentExecutionContext?.DescribedAgentCapability?.firstOrNull+?.TransportExposedAgentCapability?.id?.return AgentCapabilityDescriptor(\n id = id,\n capabilityType = capabilityType,\n displayName = describedCapability?.displayName ?: id,\n description = describedCapability?.description,\n exposedOverHttp = exposedCapability?.exposedOverHttp ?: false,\n exposedOverMcp = exposedCapability?.exposedOverMcp ?: false\n )?.AgentCapabilityDescriptor?.displayName?.description?.exposedOverHttp?.exposedOverMcp?", "skip": "malformed_grammar"
"gbnf_error": "Expected RPAREN, got ('LITERAL', ': id, description = describedCapability')",
"gbnf_ok": false
}, },
{ {
"package": "agents/capability/support/src/main/kotlin/eu/corentic/springrag/agent/capability/support", "package": "agents/capability/support/src/main/kotlin/eu/corentic/springrag/agent/capability/support",
@ -45,8 +43,8 @@
"package": "agents/rag/embabel/src/main/kotlin/eu/corentic/springrag/agent/rag/embabel", "package": "agents/rag/embabel/src/main/kotlin/eu/corentic/springrag/agent/rag/embabel",
"ext": ".kt", "ext": ".kt",
"methods": 58, "methods": 58,
"sore": "shouldRetrieve?.buildObservationContext?.(ASK+ChatResponse+EmbabelJudgeDecision+Exception+JudgeOutcome+ResponseDraft+RetrievedEvidence+String+WORKFLOW_ORIGIN_CAPABILITY_KEY+WORKFLOW_TRANSPORT_KEY+advisors+agent+agents+allowAsk+allowRetrieve+applyRetrieveCost+askCost+asksSoFar+budgetRemaining+build+builder+call+canAffordRetrieve+catch+chatOptions+confidence+consumeBudget+contains+content+conversationId+copy+debug+decision+decisionState+docs+draftAnswer+else+emptyList+enoughEvidence+entity+equals+error+evidence+expandContext+find+get+if+ifBlank+info+invoke+isEmpty+isNotBlank+isNotEmpty+isNullOrBlank+java+joinToString+knowledgeBaseId+length+let+lowercase+maxRetrievalRounds+memoryContext+message+name+nextAction+of+options+orEmpty+originCapabilityId+param+prompt+promptClient+refinedQuery+removePrefix+removeSuffix+request+resultOfType+retrievalRounds+retrieve+retrieveCost+return false+return null+return this+return true+run+runWithCircuitBreaker+simpleName+size+system+take+takeIf+text+transport+trim+trimIndent+try+user+warn+withConversationId+withObservationContext+withWorkflowStep)+?.map+?.hasDefaultKb?.coerceIn+?", "sore": "buildObservationContext?.shouldRetrieve?.(ASK+ChatResponse+EmbabelJudgeDecision+Exception+JudgeOutcome+ResponseDraft+RetrievedEvidence+String+WORKFLOW_ORIGIN_CAPABILITY_KEY+WORKFLOW_TRANSPORT_KEY+advisors+agent+agents+allowAsk+allowRetrieve+applyRetrieveCost+askCost+asksSoFar+budgetRemaining+build+builder+call+canAffordRetrieve+catch+chatOptions+confidence+consumeBudget+contains+content+conversationId+copy+debug+decision+decisionState+docs+draftAnswer+else+emptyList+enoughEvidence+entity+equals+error+evidence+expandContext+find+get+if+ifBlank+info+invoke+isEmpty+isNotBlank+isNotEmpty+isNullOrBlank+java+joinToString+knowledgeBaseId+length+let+lowercase+maxRetrievalRounds+memoryContext+message+name+nextAction+of+options+orEmpty+originCapabilityId+param+prompt+promptClient+refinedQuery+removePrefix+removeSuffix+request+resultOfType+retrievalRounds+retrieve+retrieveCost+return false+return null+return this+return true+run+runWithCircuitBreaker+simpleName+size+system+take+takeIf+text+transport+trim+trimIndent+try+user+warn+withConversationId+withObservationContext+withWorkflowStep)+?.map+?.hasDefaultKb?.coerceIn+?",
"gbnf": "root ::= \"shouldRetrieve\"? \"buildObservationContext\"? (\"ASK\" | \"ChatResponse\" | \"EmbabelJudgeDecision\" | \"Exception\" | \"JudgeOutcome\" | \"ResponseDraft\" | \"RetrievedEvidence\" | \"String\" | \"WORKFLOW_ORIGIN_CAPABILITY_KEY\" | \"WORKFLOW_TRANSPORT_KEY\" | \"advisors\" | \"agent\" | \"agents\" | \"allowAsk\" | \"allowRetrieve\" | \"applyRetrieveCost\" | \"askCost\" | \"asksSoFar\" | \"budgetRemaining\" | \"build\" | \"builder\" | \"call\" | \"canAffordRetrieve\" | \"catch\" | \"chatOptions\" | \"confidence\" | \"consumeBudget\" | \"contains\" | \"content\" | \"conversationId\" | \"copy\" | \"debug\" | \"decision\" | \"decisionState\" | \"docs\" | \"draftAnswer\" | \"else\" | \"emptyList\" | \"enoughEvidence\" | \"entity\" | \"equals\" | \"error\" | \"evidence\" | \"expandContext\" | \"find\" | \"get\" | \"if\" | \"ifBlank\" | \"info\" | \"invoke\" | \"isEmpty\" | \"isNotBlank\" | \"isNotEmpty\" | \"isNullOrBlank\" | \"java\" | \"joinToString\" | \"knowledgeBaseId\" | \"length\" | \"let\" | \"lowercase\" | \"maxRetrievalRounds\" | \"memoryContext\" | \"message\" | \"name\" | \"nextAction\" | \"of\" | \"options\" | \"orEmpty\" | \"originCapabilityId\" | \"param\" | \"prompt\" | \"promptClient\" | \"refinedQuery\" | \"removePrefix\" | \"removeSuffix\" | \"request\" | \"resultOfType\" | \"retrievalRounds\" | \"retrieve\" | \"retrieveCost\" | \"return false\" | \"return null\" | \"return this\" | \"return true\" | \"run\" | \"runWithCircuitBreaker\" | \"simpleName\" | \"size\" | \"system\" | \"take\" | \"takeIf\" | \"text\" | \"transport\" | \"trim\" | \"trimIndent\" | \"try\" | \"user\" | \"warn\" | \"withConversationId\" | \"withObservationContext\" | \"withWorkflowStep\")* \"map\"* \"hasDefaultKb\"? \"coerceIn\"*", "gbnf": "root ::= \"buildObservationContext\"? \"shouldRetrieve\"? (\"ASK\" | \"ChatResponse\" | \"EmbabelJudgeDecision\" | \"Exception\" | \"JudgeOutcome\" | \"ResponseDraft\" | \"RetrievedEvidence\" | \"String\" | \"WORKFLOW_ORIGIN_CAPABILITY_KEY\" | \"WORKFLOW_TRANSPORT_KEY\" | \"advisors\" | \"agent\" | \"agents\" | \"allowAsk\" | \"allowRetrieve\" | \"applyRetrieveCost\" | \"askCost\" | \"asksSoFar\" | \"budgetRemaining\" | \"build\" | \"builder\" | \"call\" | \"canAffordRetrieve\" | \"catch\" | \"chatOptions\" | \"confidence\" | \"consumeBudget\" | \"contains\" | \"content\" | \"conversationId\" | \"copy\" | \"debug\" | \"decision\" | \"decisionState\" | \"docs\" | \"draftAnswer\" | \"else\" | \"emptyList\" | \"enoughEvidence\" | \"entity\" | \"equals\" | \"error\" | \"evidence\" | \"expandContext\" | \"find\" | \"get\" | \"if\" | \"ifBlank\" | \"info\" | \"invoke\" | \"isEmpty\" | \"isNotBlank\" | \"isNotEmpty\" | \"isNullOrBlank\" | \"java\" | \"joinToString\" | \"knowledgeBaseId\" | \"length\" | \"let\" | \"lowercase\" | \"maxRetrievalRounds\" | \"memoryContext\" | \"message\" | \"name\" | \"nextAction\" | \"of\" | \"options\" | \"orEmpty\" | \"originCapabilityId\" | \"param\" | \"prompt\" | \"promptClient\" | \"refinedQuery\" | \"removePrefix\" | \"removeSuffix\" | \"request\" | \"resultOfType\" | \"retrievalRounds\" | \"retrieve\" | \"retrieveCost\" | \"return false\" | \"return null\" | \"return this\" | \"return true\" | \"run\" | \"runWithCircuitBreaker\" | \"simpleName\" | \"size\" | \"system\" | \"take\" | \"takeIf\" | \"text\" | \"transport\" | \"trim\" | \"trimIndent\" | \"try\" | \"user\" | \"warn\" | \"withConversationId\" | \"withObservationContext\" | \"withWorkflowStep\")* \"map\"* \"hasDefaultKb\"? \"coerceIn\"*",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
@ -59,9 +57,7 @@
"package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/agent/rag/embabel", "package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/agent/rag/embabel",
"ext": ".kt", "ext": ".kt",
"methods": 36, "methods": 36,
"sore": "very?.messageWindowMemory?.removeFirst+?.ery {?.unmockkAll?.(mockkObject+runTest)?.istKnowledgeBases(+?.add+?.return ChatResponse(listOf(Generation(AssistantMessage(content))))?.stKnowledgeBases()+?.(agRequest(+equest.+f(+heckKnowledgeBase(+nowledgeBaseId)+ssertEquals(+ssertNull()+?.(ASSISTANT+Agent+AgentProcess+AssistantMessage+ChatGraphLookupPort+ChatResponse+Companion+ConversationMemoryContext+DEFAULT_CONVERSATION_ID+DefaultEmbabelRagResponseInvoker+DirectAnswerDecision+EmbabelJudgeDecision+EmbabelLibreChatRetrievalAgent+EmbabelPlatformRagAgent+EmbabelRagDecisionPolicy+EmbabelRagWorkflowAgentProperties+EmbabelWorkflowObservationContext+EmbabelWorkflowObservationConvention+EmbabelWorkflowPromptService+Generation+InMemoryChatMemoryRepository+JudgeOutcome+LibreChatRetrievalRequest+NOOP+NoOpCircuitBreakerFactory+PageTextElement+ProcessOptions+Prompt+RagDecisionState+RagInvocation+RagRequest+RecordingChatModel+RetrievalPort+RetrievalQueryDraft+RetrievedEvidence+SpringAiEmbabelWorkflowPromptService+USER+UserMessage+VectorChunk+VectorDocumentPort+WORKFLOW_ORIGIN_CAPABILITY_KEY+WORKFLOW_STEP_KEY+WORKFLOW_TRANSPORT_KEY+advisors+agents+answer+any+anyMatch+applyRetrieveCost+asKnowledgeBaseId+assertEquals+assertNull+assertTrue+blackboard+build+builder+capture+captured+chatMemoryRepository+contains+context+contextId+conversationId+copy+createAgentProcessFrom+decision+decisionState+docs+draftAnswer+draftClarification+emptyList+enoughEvidence+every+executionContext+findExpandedTableMarkdown+findTextOnSamePage+first+get+getLowCardinalityKeyValues+http+invoke+isEmpty+java+judgeDecision+judgeEvidence+key+knowledgeBaseId+last+listOf+mapOf+maxMessages+message+messageType+mockk+name+nextAction+normalize+of+options+orEmpty+outcome+prompt+prompts+query+request+requireNotNull+resultOfType+retrievalRounds+retrieveInitialEvidence+retrieveMoreEvidence+run+searchByJobIds+searchSimilar+single+size+slot+stream+systemMessage+text+userMessage+value+verify)+?.ptyList()+?.vailableKnowledgeBases.?.gRequest(m?.ize)?.eckKnowledgeBase(r+?.ckKnowledgeBase(re+?.(sertEquals(f+sertNull(o)?.sertEquals(K?.ertEquals(Kn?.(\"+?.\"k+?.(owledgeBaseId =+quest.k+sDefaultKb)+sertEquals(t)+?.uest.kn?.owledgeBaseId)?.wledgeBaseId)?", "skip": "malformed_grammar"
"gbnf_error": "Unexpected token: ('PLUS', '+')",
"gbnf_ok": false
}, },
{ {
"package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/testsupport", "package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/testsupport",
@ -169,9 +165,7 @@
"package": "app/src/e2eTest/kotlin/eu/corentic/springrag/e2e/cucumber/steps", "package": "app/src/e2eTest/kotlin/eu/corentic/springrag/e2e/cucumber/steps",
"ext": ".kt", "ext": ".kt",
"methods": 17, "methods": 17,
"sore": "(File+absoluteFile+listOf)+?.@?.randomUUID+?.requireNotNull+?.createKnowledgeBase?.(pollJobToCompletion+reset)+?.for?.Suppress+?.toString+?.currentTimeMillis+?.if?.substring+?.exists+?.registerUser?.return f?.login?.(APPLICATION_JSON+Any+MULTIPART_FORM_DATA+Map+MultipartBodyBuilder+String+assertNotNull+atMost+await+blockFirst+body+bodyValue+build+contentType+currentJobId+else+error+exchange+expectBody+expectStatus+findTestFile+fromMultipartData+get+header+isAccepted+isCreated+isOk+java+knowledgeBaseId+mapOf+name+ofMinutes+ofSeconds+part+pollInterval+post+readBytes+responseBody+return body ?: error(\"Create KB response body was null\")+return response?.get(\"answer\") as? String ?: \"\"+return response?.get(\"token\") as? String\n ?: error(\"Login response missing token\")+return@until false+returnResult+secondKnowledgeBaseId+status+until+uri+value+when)+?.authToken?.lastChatResponse?.assertEquals?.chat?", "skip": "malformed_grammar"
"gbnf_error": "Expected RPAREN, got ('LITERAL', ': error')",
"gbnf_ok": false
}, },
{ {
"package": "app/src/integrationTest/kotlin/eu/corentic/springrag/config", "package": "app/src/integrationTest/kotlin/eu/corentic/springrag/config",
@ -203,17 +197,13 @@
"package": "app/src/systemTest/kotlin/eu/corentic/springrag/system", "package": "app/src/systemTest/kotlin/eu/corentic/springrag/system",
"ext": ".kt", "ext": ".kt",
"methods": 46, "methods": 46,
"sore": "queryForObject+?.session+?.MultipartBodyBuilder?.(createKnowledgeBase+newClient+runBlocking)+?.Long+?.use+?.part+?.run+?.readBytes+?.parameters+?.header+?.(COMPLETED+CallToolRequest+ClassPathResource+FAILED+IllegalStateException+JobStatus+List+MULTIPART_FORM_DATA+Map+McpSchema+PARTIAL_SUCCESS+String+TextContent+VectorChunk+absolutePath+add+adminClient+any+asJobId+assertEquals+assertNotEquals+assertNotNull+assertTrue+atMost+await+blockFirst+body+bodyValue+build+callTool+contains+content+contentType+copyTestDocument+count+countKnowledgeBaseNodes+countNodesByJobId+delete+documents+else+error+exchange+exists+expectBody+expectStatus+fail+fetchByJobId+file+filename+filter+first+fromMultipartData+get+getJobStatus+if+isAccepted+isCreated+isEmpty+isNoContent+isNotEmpty+isOk+java+length+listOf+map+mapNotNull+mapOf+metadata+mutate+name+ofMinutes+ofSeconds+path+pollInterval+post+queryParam+responseBody+responseTimeout+result+return response?.get(\"id\") as? String\n ?: error(\"Create knowledge base response missing id: $response\")+return response?.get(\"jobId\") as? String\n ?: error(\"Upload response missing jobId: $response\")+return terminalStatus ?: error(\"Job $jobId did not reach a terminal state in time\")+returnResult+searchSimilar+single+size+startJob+status+structuredContent+take+text+throw+try+until+uploadAsync+uploadAsyncMulti+uploadAsyncToKb+uri+value+waitForCompletedJob+waitForIndexedChunks+waitForTerminalStatus+waitUntil+when)+.finally?.asLong+?.toPath+?.closeGracefully+?.resolve+?.copy+?.REPLACE_EXISTING?.return target.toFile()?.toFile+?", "skip": "malformed_grammar"
"gbnf_error": "Expected RPAREN, got ('LITERAL', 'as')",
"gbnf_ok": false
}, },
{ {
"package": "app/src/test/kotlin/eu/corentic/springrag/architecture", "package": "app/src/test/kotlin/eu/corentic/springrag/architecture",
"ext": ".kt", "ext": ".kt",
"methods": 87, "methods": 87,
"sore": "eFromProject()+?.(filesIn+productionClasses+scopeFromProject)+?.ses()+?.(any+assertTrue+containingFile+contains+endsWith+exists+fileName+filter+filterNot+flatMap+forEach+functions+hasImport+if+listOf+name+path+productionFiles+readString+resideInPackage+resolve+startsWith+text+toString)+?.(.con+==+rtTrue(+t { i)+?", "skip": "malformed_grammar"
"gbnf_error": "Unexpected token: ('RPAREN', ')')",
"gbnf_ok": false
}, },
{ {
"package": "app/src/test/kotlin/eu/corentic/springrag/config", "package": "app/src/test/kotlin/eu/corentic/springrag/config",
@ -255,9 +245,7 @@
"package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller", "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller",
"ext": ".kt", "ext": ".kt",
"methods": 58, "methods": 58,
"sore": "getJobStatus+?.bindingResult?.return ResponseEntity.noContent().build()?.(mutableListOf+return ResponseEntity.ok(response))+?.return if (status != null) {\n ResponseEntity.ok(status)\n } else {\n ResponseEntity.notFound().build()\n }?.fieldErrors?.noContent+?.joinToString+?.field?.defaultMessage?.(BAD_REQUEST+CONFLICT+CREATED+DataBuffer+ErrorResponse+InvalidUploadRequestException+KnowledgeBaseNotFoundException+NOT_FOUND+PAYLOAD_TOO_LARGE+RuntimeException+TimeoutCancellationException+accepted+add+agentId+batchUploadRoot+body+buffer+catch+cleanupManagedUpload+content+conversationId+core+else+error+errorCode+filename+handle+headers+if+io+knowledgeBaseExists+knowledgeBaseId+map+mapOf+maxFileError+maxUploadBytes+message+name+next+of+ok+password+randomUUID+readableByteCount+registerBatch+release+return ResponseEntity.status(HttpStatus.BAD_REQUEST)\n .body(ErrorResponse(\"VALIDATION_ERROR\", \"Validation failed\", errors))+size+springframework+startBulkJob+startJob+status+throw+throw KnowledgeBaseNotFoundException(knowledgeBaseId)+throw e+toString+try+username+value+warn+withTimeout)+?.ChatResponse?.let+?.notFound+?.emptyList+?.write+?.build+?.then+?.awaitSingleOrNull+?", "skip": "malformed_grammar"
"gbnf_error": "Unexpected token: ('RPAREN', ')')",
"gbnf_ok": false
}, },
{ {
"package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller/librechat", "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller/librechat",
@ -275,8 +263,8 @@
"package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/config", "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/config",
"ext": ".kt", "ext": ".kt",
"methods": 4, "methods": 4,
"sore": "bindToWebHandler+?.webTestClient?.from+?.WebHandler?.post+?.(OK+response+setStatusCode)+?.setComplete+?.webFilter+?.build+?.(AtomicReference+String)+?.WebFilterChain?.(assertEquals+assertNull+block+empty+filter+get+set)+?.uri+?.exchange+?.expectStatus+?.isOk?", "sore": "bindToWebHandler+?.from+?.webTestClient?.WebHandler?.post+?.(OK+response+setStatusCode)+?.setComplete+?.webFilter+?.build+?.(AtomicReference+String)+?.WebFilterChain?.(assertEquals+assertNull+block+empty+filter+get+set)+?.uri+?.exchange+?.expectStatus+?.isOk?",
"gbnf": "root ::= \"bindToWebHandler\"* \"webTestClient\"? \"from\"* \"WebHandler\"? \"post\"* (\"OK\" | \"response\" | \"setStatusCode\")* \"setComplete\"* \"webFilter\"* \"build\"* (\"AtomicReference\" | \"String\")* \"WebFilterChain\"? (\"assertEquals\" | \"assertNull\" | \"block\" | \"empty\" | \"filter\" | \"get\" | \"set\")* \"uri\"* \"exchange\"* \"expectStatus\"* \"isOk\"?", "gbnf": "root ::= \"bindToWebHandler\"* \"from\"* \"webTestClient\"? \"WebHandler\"? \"post\"* (\"OK\" | \"response\" | \"setStatusCode\")* \"setComplete\"* \"webFilter\"* \"build\"* (\"AtomicReference\" | \"String\")* \"WebFilterChain\"? (\"assertEquals\" | \"assertNull\" | \"block\" | \"empty\" | \"filter\" | \"get\" | \"set\")* \"uri\"* \"exchange\"* \"expectStatus\"* \"isOk\"?",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
@ -329,16 +317,16 @@
"package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/config", "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/config",
"ext": ".kt", "ext": ".kt",
"methods": 6, "methods": 6,
"sore": "assertThrows?.IllegalArgumentException?.java?.OllamaClientProperties?.EmbabelAiHttpClientProperties?.Timeout+?.(assertEquals+baseUrl+ofSeconds+readTimeout+writeTimeout)+.timeout?.connectTimeout?.read?", "sore": "assertThrows?.IllegalArgumentException?.java?.EmbabelAiHttpClientProperties?.OllamaClientProperties?.Timeout+?.(assertEquals+baseUrl+ofSeconds+readTimeout+writeTimeout)+.timeout?.connectTimeout?.read?",
"gbnf": "root ::= \"assertThrows\"? \"IllegalArgumentException\"? \"java\"? \"OllamaClientProperties\"? \"EmbabelAiHttpClientProperties\"? \"Timeout\"* (\"assertEquals\" | \"baseUrl\" | \"ofSeconds\" | \"readTimeout\" | \"writeTimeout\")+ \"timeout\"? \"connectTimeout\"? \"read\"?", "gbnf": "root ::= \"assertThrows\"? \"IllegalArgumentException\"? \"java\"? \"EmbabelAiHttpClientProperties\"? \"OllamaClientProperties\"? \"Timeout\"* (\"assertEquals\" | \"baseUrl\" | \"ofSeconds\" | \"readTimeout\" | \"writeTimeout\")+ \"timeout\"? \"connectTimeout\"? \"read\"?",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
"package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/health", "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/health",
"ext": ".kt", "ext": ".kt",
"methods": 4, "methods": 4,
"sore": "`when`.listModels+.thenThrow+?.thenReturn+?.RuntimeException?.ListModelResponse+?.listOf+?.(Model+now)+?.requireNotNull+.OllamaHealthIndicator.NoOpCircuitBreakerFactory.health+.block+.assertEquals.status.code", "sore": "`when`.listModels+.thenReturn+?.thenThrow+?.ListModelResponse+?.RuntimeException?.listOf+?.(Model+now)+?.requireNotNull+.OllamaHealthIndicator.NoOpCircuitBreakerFactory.health+.block+.assertEquals.status.code",
"gbnf": "root ::= \"`when`\" \"listModels\"+ \"thenThrow\"* \"thenReturn\"* \"RuntimeException\"? \"ListModelResponse\"* \"listOf\"* (\"Model\" | \"now\")* \"requireNotNull\"+ \"OllamaHealthIndicator\" \"NoOpCircuitBreakerFactory\" \"health\"+ \"block\"+ \"assertEquals\" \"status\" \"code\"", "gbnf": "root ::= \"`when`\" \"listModels\"+ \"thenReturn\"* \"thenThrow\"* \"ListModelResponse\"* \"RuntimeException\"? \"listOf\"* (\"Model\" | \"now\")* \"requireNotNull\"+ \"OllamaHealthIndicator\" \"NoOpCircuitBreakerFactory\" \"health\"+ \"block\"+ \"assertEquals\" \"status\" \"code\"",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
@ -387,8 +375,8 @@
"package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/config", "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/config",
"ext": ".kt", "ext": ".kt",
"methods": 12, "methods": 12,
"sore": "DoclingConfig?.doclingServeApi+?.PipelineOptions?.trimIndent+?.baseUrl?.assertNotNull+?.(assertNull+concurrency+layoutBatchSize+ocrBatchSize+tableBatchSize)+?.lines+?.(imageExportMode+includeImages+options+useS3Target)+?.toString+?.documentTimeout?.(indexOfFirst+startsWith+trimStart)+?.s3Target?.(assertThat+contains+doesNotContain+isGreaterThan)+?.bucket?.assertThatThrownBy?.validateCriticalSettings+?.isInstanceOf+?.IllegalStateException?.java?.hasMessageContaining+?", "sore": "DoclingConfig?.doclingServeApi+?.trimIndent+?.PipelineOptions?.baseUrl?.assertNotNull+?.lines+?.(assertNull+concurrency+layoutBatchSize+ocrBatchSize+tableBatchSize)+?.(imageExportMode+includeImages+options+useS3Target)+?.toString+?.(indexOfFirst+startsWith+trimStart)+?.documentTimeout?.s3Target?.(assertThat+contains+doesNotContain+isGreaterThan)+?.bucket?.assertThatThrownBy?.validateCriticalSettings+?.isInstanceOf+?.IllegalStateException?.java?.hasMessageContaining+?",
"gbnf": "root ::= \"DoclingConfig\"? \"doclingServeApi\"* \"PipelineOptions\"? \"trimIndent\"* \"baseUrl\"? \"assertNotNull\"* (\"assertNull\" | \"concurrency\" | \"layoutBatchSize\" | \"ocrBatchSize\" | \"tableBatchSize\")* \"lines\"* (\"imageExportMode\" | \"includeImages\" | \"options\" | \"useS3Target\")* \"toString\"* \"documentTimeout\"? (\"indexOfFirst\" | \"startsWith\" | \"trimStart\")* \"s3Target\"? (\"assertThat\" | \"contains\" | \"doesNotContain\" | \"isGreaterThan\")* \"bucket\"? \"assertThatThrownBy\"? \"validateCriticalSettings\"* \"isInstanceOf\"* \"IllegalStateException\"? \"java\"? \"hasMessageContaining\"*", "gbnf": "root ::= \"DoclingConfig\"? \"doclingServeApi\"* \"trimIndent\"* \"PipelineOptions\"? \"baseUrl\"? \"assertNotNull\"* \"lines\"* (\"assertNull\" | \"concurrency\" | \"layoutBatchSize\" | \"ocrBatchSize\" | \"tableBatchSize\")* (\"imageExportMode\" | \"includeImages\" | \"options\" | \"useS3Target\")* \"toString\"* (\"indexOfFirst\" | \"startsWith\" | \"trimStart\")* \"documentTimeout\"? \"s3Target\"? (\"assertThat\" | \"contains\" | \"doesNotContain\" | \"isGreaterThan\")* \"bucket\"? \"assertThatThrownBy\"? \"validateCriticalSettings\"* \"isInstanceOf\"* \"IllegalStateException\"? \"java\"? \"hasMessageContaining\"*",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
@ -425,9 +413,7 @@
"package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/repository", "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/repository",
"ext": ".kt", "ext": ".kt",
"methods": 24, "methods": 24,
"sore": "n(+?.ace(\"\\\\+?.ithCircuitBreaker { v?.peFilterValue(val?.mutableListOf+?.Document?.debug+?.((+Empty()+stinct()+turn)+?.VectorChunk?.pplier {?.ace(\"'\"+?.te(fil+?.String+?.orEmpty+?.size?.turn emptyList()?.inToString(s+?.NotEmpty()+?.toMap+?.tion()?.toMutableMap+?.(add+build+builder+distinct+emptyList+escapeFilterValue+filterExpression+if+isEmpty+isNullOrEmpty+joinToString+query+return emptyList()+return runWithCircuitBreaker { vectorStore.similaritySearch(request).map { it.toVectorChunk() } }+runWithCircuitBreaker+topK+value)+?.ptyList()+?.legalStateException(\"?.apply+?.similaritySearch+?.inToString(\"+?.rn {+?.putIfAbsent?.map+?.capeFilterValue(i?.ssage}\"?.(toSpringDocument+toVectorChunk)+?.ilder()+?.w cause?.ery(\"+?.w cau?.pK(5+?.pK(1+?.ze)?.lterExpression(\"+?.lterExpression(f+?.lterExpression(+?.(capeFilterValue(j+capeFilterValue(k)?.capeFilterValue(d?.inToString(+?.capeFilterValue(l?.lue)}?.leteByFilter(f?.ild()+?.lterEquals(M?.turn runWithCircuitBreaker { vectorStore.similaritySearch(request).map { it.toVectorChunk() } }?.lue))?.nWithCircuitBreaker {?.milaritySearch(r+?.lete(i+?.p {+?.VectorChunk()+?", "skip": "malformed_grammar"
"gbnf_error": "Unexpected token: ('PLUS', '+')",
"gbnf_ok": false
}, },
{ {
"package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/agent", "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/agent",
@ -453,17 +439,13 @@
"package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/port/adapter", "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/port/adapter",
"ext": ".kt", "ext": ".kt",
"methods": 45, "methods": 45,
"sore": "(Regex+emptyList+if+isNullOrBlank+replace+return emptyList())+?.save+?.deleteByJobId+?.of+?.findById+?.toNode+?.value+?.map+?.orElse+?.text?.toDomain+?.let+?.storageUri?.(imageType+pageNo)+?", "skip": "malformed_grammar"
"gbnf_error": "Unexpected token: ('RPAREN', ')')",
"gbnf_ok": false
}, },
{ {
"package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/storage", "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/storage",
"ext": ".kt", "ext": ".kt",
"methods": 40, "methods": 40,
"sore": "replace+?.loadObject?.when?.buildImageKey?.(listObjects+return parseStorageUri(storageUri)\n ?: S3Location(bucket = properties.bucket, key = storageUri.trimStart('/')))?.ifBlank+?.return storeObject(key, bytes, contentTypeFor(format))?.lowercase+?.storeObject?.return StorageUri.of(\"images/${jobId.value}/$sanitizedId.$extension\")?.contentTypeFor?.(BlobListOption+GcsLocation+NoSuchBucketException+ObjectIdentifier+S3Exception+S3Location+amazon+awssdk+bucket+build+builder+catch+chunked+contentType+contents+create+credentialsProvider+delete+deleteObject+deleteObjects+else+fromBytes+get+getObject+headObject+if+isBlank+isEmpty+iterateAll+key+list+listObjectsV2+map+mapNotNull+model+name+objects+of+parseS3Location+parseStorageUri+prefix+putObject+readAllBytes+region+resolveLocation+return 0+return StorageUri.of(\"s3://${location.bucket}/${location.key}\")+return false+return null+return parseS3Location(storageUri, properties.bucket)\n ?: run {\n if (storageUri.startsWith(\"s3://\")) {\n logger.warn { \"Invalid storage URI: $storageUri\" }\n }\n null\n }+return response.contents().map { obj -> StorageUri.of(\"s3://${location.bucket}/${obj.key()}\") }+return try {\n s3Client.deleteObject(\n DeleteObjectRequest.builder()\n .bucket(location.bucket)\n .key(location.key)\n .build()\n )\n true\n } catch (ex: S3Exception) {\n if (ex.statusCode() == 404) false else throw ex\n }+return try {\n s3Client.getObject({ builder ->\n builder.bucket(location.bucket).key(location.key)\n }).readAllBytes()\n } catch (ex: NoSuchBucketException) {\n logger.warn { \"S3 bucket missing for object retrieval: ${location.bucket}\" }\n null\n } catch (ex: S3Exception) {\n logger.warn(ex) { \"Failed to load object from S3: ${storageUri.value}\" }\n null\n }+return try {\n s3Client.headObject(\n HeadObjectRequest.builder()\n .bucket(location.bucket)\n .key(location.key)\n .build()\n )\n true\n } catch (_: NoSuchBucketException) {\n false\n } catch (ex: S3Exception) {\n if (ex.statusCode() == 404) false else throw ex\n }+run+s3+services+startsWith+statusCode+sumOf+toList+trimEnd+trimStart+try+value+warn)+?.size?.throw ex?.throw?", "skip": "malformed_grammar"
"gbnf_error": "Expected RPAREN, got ('LITERAL', '')",
"gbnf_ok": false
}, },
{ {
"package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/config", "package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/config",
@ -493,8 +475,8 @@
"package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/health", "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/health",
"ext": ".kt", "ext": ".kt",
"methods": 6, "methods": 6,
"sore": "(HealthCheckReply+`when`+collectionExistsAsync+getDefaultInstance+healthCheckAsync+immediateFuture+thenReturn+verifyConnectivityAsync)+.failedFuture+?.immediateFailedFuture+?.completedFuture+?.IllegalStateException?.(InterruptedException+TimeoutException)?.(Neo4jDriverHealthIndicator+QdrantVectorStoreHealthIndicator+assertEquals+assertTrue+block+code+currentThread+health+interrupted+isInterrupted+requireNotNull+status)+", "sore": "(HealthCheckReply+`when`+collectionExistsAsync+getDefaultInstance+healthCheckAsync+immediateFuture+thenReturn+verifyConnectivityAsync)+.completedFuture+?.failedFuture+?.immediateFailedFuture+?.IllegalStateException?.(InterruptedException+TimeoutException)?.(Neo4jDriverHealthIndicator+QdrantVectorStoreHealthIndicator+assertEquals+assertTrue+block+code+currentThread+health+interrupted+isInterrupted+requireNotNull+status)+",
"gbnf": "root ::= (\"HealthCheckReply\" | \"`when`\" | \"collectionExistsAsync\" | \"getDefaultInstance\" | \"healthCheckAsync\" | \"immediateFuture\" | \"thenReturn\" | \"verifyConnectivityAsync\")+ \"failedFuture\"* \"immediateFailedFuture\"* \"completedFuture\"* \"IllegalStateException\"? (\"InterruptedException\" | \"TimeoutException\")? (\"Neo4jDriverHealthIndicator\" | \"QdrantVectorStoreHealthIndicator\" | \"assertEquals\" | \"assertTrue\" | \"block\" | \"code\" | \"currentThread\" | \"health\" | \"interrupted\" | \"isInterrupted\" | \"requireNotNull\" | \"status\")+", "gbnf": "root ::= (\"HealthCheckReply\" | \"`when`\" | \"collectionExistsAsync\" | \"getDefaultInstance\" | \"healthCheckAsync\" | \"immediateFuture\" | \"thenReturn\" | \"verifyConnectivityAsync\")+ \"completedFuture\"* \"failedFuture\"* \"immediateFailedFuture\"* \"IllegalStateException\"? (\"InterruptedException\" | \"TimeoutException\")? (\"Neo4jDriverHealthIndicator\" | \"QdrantVectorStoreHealthIndicator\" | \"assertEquals\" | \"assertTrue\" | \"block\" | \"code\" | \"currentThread\" | \"health\" | \"interrupted\" | \"isInterrupted\" | \"requireNotNull\" | \"status\")+",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
@ -521,8 +503,8 @@
"package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/graph", "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/graph",
"ext": ".kt", "ext": ".kt",
"methods": 30, "methods": 30,
"sore": "assertThrows?.GraphDocument?.IllegalArgumentException?.java?.(DocumentGraphJob+DocumentJobNode+GraphImagePayload+GraphPage+GraphPictureElement+GraphTableElement+GraphTextElement+Instant+String+activateDocument+activateDocumentGraph+adjustCounters+adjustSizeInBytes+any+arg+asDocumentId+asFilename+asJobId+asKnowledgeBaseId+asLogicalDocumentId+asStorageUri+assertDoesNotThrow+byteArrayOf+capture+corentic+countActiveDocumentsByLogicalDocumentId+countActiveElementsByLogicalDocumentId+createBelongsToRelationship+deactivateByLogicalDocumentId+deactivateByLogicalDocumentIdExcept+deleteByJobId+deleteObject+deleteObjects+emptyGraphDocument+emptyList+eu+every+existsById+findByJobId+findByKnowledgeBaseId+findByLogicalDocumentId+findOrCreateInactive+forEach+graph+isActive+listOf+minusSeconds+model+now+parse+repeat+saveDocumentGraph+slot+springrag+stageDocumentGraph+storeDocumentGraph+storeImage+stubDocumentGraphJob+sumActiveFileSizeBytesByLogicalDocumentId+time+value+verify+verifyOrder)+?.GraphIngestionOrchestrator?.captured?.NoOpCircuitBreakerFactory?.(assertEquals+assertNotNull+assertNull+doclingId+first+height+imageData+imageType+page+pageNo+pages+pictureElements+rendering+size+storageUri+textElements+width)+?.text?", "sore": "GraphDocument?.assertThrows?.IllegalArgumentException?.java?.(DocumentGraphJob+DocumentJobNode+GraphImagePayload+GraphPage+GraphPictureElement+GraphTableElement+GraphTextElement+Instant+String+activateDocument+activateDocumentGraph+adjustCounters+adjustSizeInBytes+any+arg+asDocumentId+asFilename+asJobId+asKnowledgeBaseId+asLogicalDocumentId+asStorageUri+assertDoesNotThrow+byteArrayOf+capture+corentic+countActiveDocumentsByLogicalDocumentId+countActiveElementsByLogicalDocumentId+createBelongsToRelationship+deactivateByLogicalDocumentId+deactivateByLogicalDocumentIdExcept+deleteByJobId+deleteObject+deleteObjects+emptyGraphDocument+emptyList+eu+every+existsById+findByJobId+findByKnowledgeBaseId+findByLogicalDocumentId+findOrCreateInactive+forEach+graph+isActive+listOf+minusSeconds+model+now+parse+repeat+saveDocumentGraph+slot+springrag+stageDocumentGraph+storeDocumentGraph+storeImage+stubDocumentGraphJob+sumActiveFileSizeBytesByLogicalDocumentId+time+value+verify+verifyOrder)+?.captured?.GraphIngestionOrchestrator?.(assertEquals+assertNotNull+assertNull+doclingId+first+height+imageData+imageType+page+pageNo+pages+pictureElements+rendering+size+storageUri+textElements+width)+?.NoOpCircuitBreakerFactory?.text?",
"gbnf": "root ::= \"assertThrows\"? \"GraphDocument\"? \"IllegalArgumentException\"? \"java\"? (\"DocumentGraphJob\" | \"DocumentJobNode\" | \"GraphImagePayload\" | \"GraphPage\" | \"GraphPictureElement\" | \"GraphTableElement\" | \"GraphTextElement\" | \"Instant\" | \"String\" | \"activateDocument\" | \"activateDocumentGraph\" | \"adjustCounters\" | \"adjustSizeInBytes\" | \"any\" | \"arg\" | \"asDocumentId\" | \"asFilename\" | \"asJobId\" | \"asKnowledgeBaseId\" | \"asLogicalDocumentId\" | \"asStorageUri\" | \"assertDoesNotThrow\" | \"byteArrayOf\" | \"capture\" | \"corentic\" | \"countActiveDocumentsByLogicalDocumentId\" | \"countActiveElementsByLogicalDocumentId\" | \"createBelongsToRelationship\" | \"deactivateByLogicalDocumentId\" | \"deactivateByLogicalDocumentIdExcept\" | \"deleteByJobId\" | \"deleteObject\" | \"deleteObjects\" | \"emptyGraphDocument\" | \"emptyList\" | \"eu\" | \"every\" | \"existsById\" | \"findByJobId\" | \"findByKnowledgeBaseId\" | \"findByLogicalDocumentId\" | \"findOrCreateInactive\" | \"forEach\" | \"graph\" | \"isActive\" | \"listOf\" | \"minusSeconds\" | \"model\" | \"now\" | \"parse\" | \"repeat\" | \"saveDocumentGraph\" | \"slot\" | \"springrag\" | \"stageDocumentGraph\" | \"storeDocumentGraph\" | \"storeImage\" | \"stubDocumentGraphJob\" | \"sumActiveFileSizeBytesByLogicalDocumentId\" | \"time\" | \"value\" | \"verify\" | \"verifyOrder\")* \"GraphIngestionOrchestrator\"? \"captured\"? \"NoOpCircuitBreakerFactory\"? (\"assertEquals\" | \"assertNotNull\" | \"assertNull\" | \"doclingId\" | \"first\" | \"height\" | \"imageData\" | \"imageType\" | \"page\" | \"pageNo\" | \"pages\" | \"pictureElements\" | \"rendering\" | \"size\" | \"storageUri\" | \"textElements\" | \"width\")* \"text\"?", "gbnf": "root ::= \"GraphDocument\"? \"assertThrows\"? \"IllegalArgumentException\"? \"java\"? (\"DocumentGraphJob\" | \"DocumentJobNode\" | \"GraphImagePayload\" | \"GraphPage\" | \"GraphPictureElement\" | \"GraphTableElement\" | \"GraphTextElement\" | \"Instant\" | \"String\" | \"activateDocument\" | \"activateDocumentGraph\" | \"adjustCounters\" | \"adjustSizeInBytes\" | \"any\" | \"arg\" | \"asDocumentId\" | \"asFilename\" | \"asJobId\" | \"asKnowledgeBaseId\" | \"asLogicalDocumentId\" | \"asStorageUri\" | \"assertDoesNotThrow\" | \"byteArrayOf\" | \"capture\" | \"corentic\" | \"countActiveDocumentsByLogicalDocumentId\" | \"countActiveElementsByLogicalDocumentId\" | \"createBelongsToRelationship\" | \"deactivateByLogicalDocumentId\" | \"deactivateByLogicalDocumentIdExcept\" | \"deleteByJobId\" | \"deleteObject\" | \"deleteObjects\" | \"emptyGraphDocument\" | \"emptyList\" | \"eu\" | \"every\" | \"existsById\" | \"findByJobId\" | \"findByKnowledgeBaseId\" | \"findByLogicalDocumentId\" | \"findOrCreateInactive\" | \"forEach\" | \"graph\" | \"isActive\" | \"listOf\" | \"minusSeconds\" | \"model\" | \"now\" | \"parse\" | \"repeat\" | \"saveDocumentGraph\" | \"slot\" | \"springrag\" | \"stageDocumentGraph\" | \"storeDocumentGraph\" | \"storeImage\" | \"stubDocumentGraphJob\" | \"sumActiveFileSizeBytesByLogicalDocumentId\" | \"time\" | \"value\" | \"verify\" | \"verifyOrder\")* \"captured\"? \"GraphIngestionOrchestrator\"? (\"assertEquals\" | \"assertNotNull\" | \"assertNull\" | \"doclingId\" | \"first\" | \"height\" | \"imageData\" | \"imageType\" | \"page\" | \"pageNo\" | \"pages\" | \"pictureElements\" | \"rendering\" | \"size\" | \"storageUri\" | \"textElements\" | \"width\")* \"NoOpCircuitBreakerFactory\"? \"text\"?",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
@ -555,9 +537,7 @@
"package": "modules/chat/src/main/kotlin/eu/corentic/springrag/service/chat", "package": "modules/chat/src/main/kotlin/eu/corentic/springrag/service/chat",
"ext": ".kt", "ext": ".kt",
"methods": 6, "methods": 6,
"sore": "let+?.info+?.KnowledgeBaseId?.defaultAgentId+?.(RagInvocation+RagRequest+invoke+return ragAgentInvocationGateway.invoke(\n RagInvocation(\n request = request,\n executionContext = AgentExecutionContext.http()\n )\n )+return ragAgentInvocationGateway.invoke(\n RagInvocation(\n request = request,\n executionContext = AgentExecutionContext.http(contextId = conversationId)\n )\n ))+?.listCapabilities+?.http+?.map+?.filter+?.id?.AgentCapabilityDescriptor?", "skip": "malformed_grammar"
"gbnf_error": "Unexpected token: ('RPAREN', ')')",
"gbnf_ok": false
}, },
{ {
"package": "modules/chat/src/systemTest/kotlin/eu/corentic/springrag/config", "package": "modules/chat/src/systemTest/kotlin/eu/corentic/springrag/config",
@ -587,8 +567,8 @@
"package": "modules/common/src/main/kotlin/eu/corentic/springrag/common/ids", "package": "modules/common/src/main/kotlin/eu/corentic/springrag/common/ids",
"ext": ".kt", "ext": ".kt",
"methods": 18, "methods": 18,
"sore": "of+?.(removeSuffix+trim)+?.requireNonBlankNoWhitespace?.(DocumentId+JobId+KnowledgeBaseId+LogicalDocumentId)?.trimStart+?.requireSafeId?.return StorageUri(\"$base/$relative\")?.StorageUri?.requireNonBlank?.(contains+isNotEmpty+require)+?.return Filename(normalized)?.any+?.matches+?.return BatchId(normalized)?.Filename?.isWhitespace+?.BatchId?.return normalized?", "sore": "of+?.requireNonBlankNoWhitespace?.(removeSuffix+trim)+?.(DocumentId+JobId+KnowledgeBaseId+LogicalDocumentId)?.trimStart+?.requireSafeId?.return StorageUri(\"$base/$relative\")?.StorageUri?.requireNonBlank?.(contains+isNotEmpty+require)+?.matches+?.return BatchId(normalized)?.any+?.return Filename(normalized)?.BatchId?.isWhitespace+?.Filename?.return normalized?",
"gbnf": "root ::= \"of\"* (\"removeSuffix\" | \"trim\")* \"requireNonBlankNoWhitespace\"? (\"DocumentId\" | \"JobId\" | \"KnowledgeBaseId\" | \"LogicalDocumentId\")? \"trimStart\"* \"requireSafeId\"? \"return StorageUri\" \"\\\"$base/$relative\\\"\"? \"StorageUri\"? \"requireNonBlank\"? (\"contains\" | \"isNotEmpty\" | \"require\")* \"return Filename\" \"normalized\"? \"any\"* \"matches\"* \"return BatchId\" \"normalized\"? \"Filename\"? \"isWhitespace\"* \"BatchId\"? \"return normalized\"?", "gbnf": "root ::= \"of\"* \"requireNonBlankNoWhitespace\"? (\"removeSuffix\" | \"trim\")* (\"DocumentId\" | \"JobId\" | \"KnowledgeBaseId\" | \"LogicalDocumentId\")? \"trimStart\"* \"requireSafeId\"? \"return StorageUri\" \"\\\"$base/$relative\\\"\"? \"StorageUri\"? \"requireNonBlank\"? (\"contains\" | \"isNotEmpty\" | \"require\")* \"matches\"* \"return BatchId\" \"normalized\"? \"any\"* \"return Filename\" \"normalized\"? \"BatchId\"? \"isWhitespace\"* \"Filename\"? \"return normalized\"?",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
@ -759,8 +739,8 @@
"package": "modules/security/src/test/kotlin/eu/corentic/springrag/security/service", "package": "modules/security/src/test/kotlin/eu/corentic/springrag/security/service",
"ext": ".kt", "ext": ".kt",
"methods": 15, "methods": 15,
"sore": "(encode+every+existsByUsername)+?.JwtService?.init+?.JwtProperties?.UserService?.hmacShaKeyFor+?.generateToken+?.toByteArray+?.assertFalse?.UTF_8?.builder+?.subject+?.issuedAt+?.(Date+expiration)+?.currentTimeMillis+?.signWith+?.compact+?.(Err+Outcome+PasswordPolicyViolationException+ROLE_USER+String+UserAlreadyExistsException+any+assertEquals+assertThrows+assertTrue+authorities+authority+emptyList+error+extractAuthorities+extractUsername+firstArg+getOrThrow+java+listOf+map+match+parseToken+password+registerUser+role+save+username+validateToken+verify)+?.errorCode?.JwtValidationError?.(Expired+InvalidSignature+Malformed)?", "sore": "(encode+every+existsByUsername)+?.init+?.JwtService?.UserService?.JwtProperties?.hmacShaKeyFor+?.generateToken+?.toByteArray+?.assertFalse?.UTF_8?.builder+?.subject+?.issuedAt+?.(Date+expiration)+?.currentTimeMillis+?.signWith+?.compact+?.(Err+Outcome+PasswordPolicyViolationException+ROLE_USER+String+UserAlreadyExistsException+any+assertEquals+assertThrows+assertTrue+authorities+authority+emptyList+error+extractAuthorities+extractUsername+firstArg+getOrThrow+java+listOf+map+match+parseToken+password+registerUser+role+save+username+validateToken+verify)+?.errorCode?.JwtValidationError?.(Expired+InvalidSignature+Malformed)?",
"gbnf": "root ::= (\"encode\" | \"every\" | \"existsByUsername\")* \"JwtService\"? \"init\"* \"JwtProperties\"? \"UserService\"? \"hmacShaKeyFor\"* \"generateToken\"* \"toByteArray\"* \"assertFalse\"? \"UTF_8\"? \"builder\"* \"subject\"* \"issuedAt\"* (\"Date\" | \"expiration\")* \"currentTimeMillis\"* \"signWith\"* \"compact\"* (\"Err\" | \"Outcome\" | \"PasswordPolicyViolationException\" | \"ROLE_USER\" | \"String\" | \"UserAlreadyExistsException\" | \"any\" | \"assertEquals\" | \"assertThrows\" | \"assertTrue\" | \"authorities\" | \"authority\" | \"emptyList\" | \"error\" | \"extractAuthorities\" | \"extractUsername\" | \"firstArg\" | \"getOrThrow\" | \"java\" | \"listOf\" | \"map\" | \"match\" | \"parseToken\" | \"password\" | \"registerUser\" | \"role\" | \"save\" | \"username\" | \"validateToken\" | \"verify\")* \"errorCode\"? \"JwtValidationError\"? (\"Expired\" | \"InvalidSignature\" | \"Malformed\")?", "gbnf": "root ::= (\"encode\" | \"every\" | \"existsByUsername\")* \"init\"* \"JwtService\"? \"UserService\"? \"JwtProperties\"? \"hmacShaKeyFor\"* \"generateToken\"* \"toByteArray\"* \"assertFalse\"? \"UTF_8\"? \"builder\"* \"subject\"* \"issuedAt\"* (\"Date\" | \"expiration\")* \"currentTimeMillis\"* \"signWith\"* \"compact\"* (\"Err\" | \"Outcome\" | \"PasswordPolicyViolationException\" | \"ROLE_USER\" | \"String\" | \"UserAlreadyExistsException\" | \"any\" | \"assertEquals\" | \"assertThrows\" | \"assertTrue\" | \"authorities\" | \"authority\" | \"emptyList\" | \"error\" | \"extractAuthorities\" | \"extractUsername\" | \"firstArg\" | \"getOrThrow\" | \"java\" | \"listOf\" | \"map\" | \"match\" | \"parseToken\" | \"password\" | \"registerUser\" | \"role\" | \"save\" | \"username\" | \"validateToken\" | \"verify\")* \"errorCode\"? \"JwtValidationError\"? (\"Expired\" | \"InvalidSignature\" | \"Malformed\")?",
"gbnf_ok": true "gbnf_ok": true
}, },
{ {
@ -809,8 +789,6 @@
"package": "tools/setup-ui", "package": "tools/setup-ui",
"ext": ".go", "ext": ".go",
"methods": 44, "methods": 44,
"sore": "g)?.wStyle()+?.([]s+?.(ng{}+rr)+?.lor(\"+?.ng, 0,+?.i :?.m.s+?..s?.s[i].?.(\"BA+\"NE+\"SP+(cfg+Cmd+Index = i+Quit+StepModel()+String+Update+View+_,+al+case+cfg+edKeys(cfg+en+errMessage+fg+if+iles, \",+input+key+kind+lServices, \",+lServicesMode ==+ldRun(&m.+list+menu+mode+model+nd(cfg+optionItem+oyChoice !=+oyChoice ==+return+rn\n\t\t}+rn \"\"+rn tru+shouldStart+shouldWriteEnv+stepIndex+steps+switch+syncStepModel+te+tea+title+{)+?.ocalService(\"ol+?.map?.rn str?.turn s?.string+?.(lin+?.in([+?.ader(\"+?", "skip": "malformed_grammar"
"gbnf": "root ::= \"g\"",
"gbnf_ok": true
} }
] ]