{"record":{"id":"339bca6bbf7a65b9","repo":"spring-projects/spring-ai","slug":"no-sessionid-provided-in-toolsearchrequest-return-339bca","errorCode":null,"errorMessage":"No sessionId provided in ToolSearchRequest, returning empty results","messagePattern":"No sessionId provided in ToolSearchRequest, returning empty results","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"spring-ai-tool-search-tool/src/main/java/org/springframework/ai/tool/toolsearch/index/regex/RegexToolIndex.java","lineNumber":121,"sourceCode":"\t}\n\n\t@Override\n\tpublic void indexTools(String sessionId, List<ToolReference> toolReferences) {\n\t\tSessionIndex sessionIndex = getOrCreateSessionIndex(sessionId);\n\t\tfor (ToolReference ref : toolReferences) {\n\t\t\tString id = String.valueOf(this.counter.getAndIncrement());\n\t\t\tsessionIndex.addTool(new ToolEntry(id, ref.toolName(), ref.summary()));\n\t\t}\n\t\tif (logger.isDebugEnabled()) {\n\t\t\tlogger.debug(\"Added \" + toolReferences.size() + \" tools to session '\" + sessionId + \"'\");\n\t\t}\n\t}\n\n\t@Override\n\tpublic ToolSearchResponse search(ToolSearchRequest toolSearchRequest) {\n\t\tString sessionId = toolSearchRequest.sessionId();\n\t\tif (sessionId == null || sessionId.isBlank()) {\n\t\t\tlogger.warn(\"No sessionId provided in ToolSearchRequest, returning empty results\");\n\t\t\treturn ToolSearchResponse.builder().build();\n\t\t}\n\n\t\tSessionIndex sessionIndex = this.sessionIndexes.get(sessionId);\n\t\tif (sessionIndex == null) {\n\t\t\tlogger.debug(\"No index found for session: \" + sessionId);\n\t\t\treturn ToolSearchResponse.builder().build();\n\t\t}\n\n\t\tString query = toolSearchRequest.query();\n\t\tint maxResults = toolSearchRequest.maxResults() != null ? toolSearchRequest.maxResults() : DEFAULT_MAX_RESULTS;\n\n\t\t// Convert natural language query to regex pattern\n\t\tString regexPattern = convertQueryToRegexPattern(query);\n\t\tif (logger.isDebugEnabled()) {\n\t\t\tlogger.debug(\"Converted query '\" + query + \"' to regex pattern '\" + regexPattern + \"'\");\n\t\t}\n","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/spring-ai-tool-search-tool/src/main/java/org/springframework/ai/tool/toolsearch/index/regex/RegexToolIndex.java#L103-L139","documentation":"RegexToolIndex.search requires a sessionId to select the per-session regex index. When ToolSearchRequest.sessionId is null or blank, it logs this warning and returns an empty ToolSearchResponse, since no session index exists to search. Mirrors the LuceneToolIndex behavior for session-scoped tool indexes.","triggerScenarios":"Calling search on a RegexToolIndex with a ToolSearchRequest whose sessionId is null or empty/blank — typically a manually constructed request omitting sessionId.","commonSituations":"Tests or custom delegates building ToolSearchRequest without a session; callers switching from non-session-scoped search to RegexToolIndex without adapting request construction; session ID lost between layers of the application.","solutions":["Provide a non-blank sessionId on the ToolSearchRequest.","Ensure sessionId is captured and forwarded from the conversation/session context to every tool search call.","Log/validate the request in the caller before invoking search to catch blank session IDs early.","Recognize the empty response as 'rejected due to missing sessionId', not 'no tools matched'."],"exampleFix":"// before\nvar resp = regexToolIndex.search(new ToolSearchRequest(\"find flight tools\", 5, null, null));\n// after\nvar resp = regexToolIndex.search(new ToolSearchRequest(\"find flight tools\", 5, \"session-42\", null));","handlingStrategy":"validation","validationCode":"if (request.sessionId() == null || request.sessionId().isBlank()) {\n    throw new IllegalArgumentException(\"sessionId is required for RegexToolIndex.search\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate ToolSearchRequest fields before calling search.","Propagate session IDs consistently from the agent framework.","Cover session-scoped search in integration tests.","Do not reuse request builders designed for sessionless indexes."],"tags":["tool-search","regex","missing-session-id","empty-result"],"backgroundTag":"empty-required-field","analyzedSha":"98a7beda4f29d80a71c5837eb4053b03a93a46f7","analyzedAt":"2026-09-11T14:15:49.441Z","contentChangedAt":"2026-09-11T14:15:49.441Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}