Skip to content

Neo4j ChatMemoryRepository throw Exception: Invalid input '$' #3825

Open
@CloudSen

Description

@CloudSen

Bug description
I injected Neo4jChatMemoryRepository, When call chatMemory.get() function, it throws exception:

[Request processing failed: org.neo4j.driver.exceptions.ClientException: Invalid input '$': expected "%", "(" or an identifier (line 1, column 10 (offset: 9))
"MATCH (s:$($sessionLabel) {id:$conversationId})-[r:HAS_MESSAGE]->(m:$($messageLabel))"
          ^] with root cause

org.neo4j.driver.exceptions.ClientException: Invalid input '$': expected "%", "(" or an identifier (line 1, column 10 (offset: 9))
"MATCH (s:$($sessionLabel) {id:$conversationId})-[r:HAS_MESSAGE]->(m:$($messageLabel))"
          ^
        at org.neo4j.driver.internal.util.Futures.blockingGet(Futures.java:64) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.InternalTransaction.run(InternalTransaction.java:55) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.DelegatingTransactionContext.run(DelegatingTransactionContext.java:56) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.InternalExecutableQuery.lambda$execute$0(InternalExecutableQuery.java:82) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.InternalSession.lambda$execute$4(InternalSession.java:161) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.InternalSession.lambda$transaction$5(InternalSession.java:178) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.retry.ExponentialBackoffRetryLogic.retry(ExponentialBackoffRetryLogic.java:112) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.InternalSession.transaction(InternalSession.java:175) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.InternalSession.execute(InternalSession.java:160) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.internal.InternalExecutableQuery.execute(InternalExecutableQuery.java:95) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.neo4j.driver.ExecutableQuery.execute(ExecutableQuery.java:150) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
        at org.springframework.ai.chat.memory.repository.neo4j.Neo4jChatMemoryRepository.findByConversationId(Neo4jChatMemoryRepository.java:87) ~[spring-ai-model-chat-memory-repository-neo4j-1.0.0.jar:1.0.0]
        at org.springframework.ai.chat.memory.MessageWindowChatMemory.add(MessageWindowChatMemory.java:63) ~[spring-ai-model-1.0.0.jar:1.0.0]
        at org.springframework.ai.chat.memory.ChatMemory.add(ChatMemory.java:46) ~[spring-ai-model-1.0.0.jar:1.0.0]
        at cn.cisdigital.datakits.ai.demo.memory.neo4j.controller.StreamingChatNeo4jController.multipleChat(StreamingChatNeo4jController.java:39) ~[classes/:na]
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-6.2.8.jar:6.2.8]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191) ~[spring-web-6.2.8.jar:6.2.8]
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.42.jar:6.0]
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.8.jar:6.2.8]
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.42.jar:6.0]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.8.jar:6.2.8]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.8.jar:6.2.8]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.8.jar:6.2.8]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.8.jar:6.2.8]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.8.jar:6.2.8]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.8.jar:6.2.8]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.42.jar:10.1.42]
        at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
        Suppressed: org.neo4j.driver.internal.util.ErrorUtil$InternalExceptionCause: null
                at org.neo4j.driver.internal.adaptedbolt.ErrorMapper.mapToNeo4jException(ErrorMapper.java:222) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
                at org.neo4j.driver.internal.adaptedbolt.ErrorMapper.mapBoltFailureException(ErrorMapper.java:139) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
                at org.neo4j.driver.internal.adaptedbolt.RoutedErrorMapper.mapBoltFailureException(RoutedErrorMapper.java:61) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
                at org.neo4j.driver.internal.adaptedbolt.ErrorMapper.map(ErrorMapper.java:79) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
                at org.neo4j.driver.internal.adaptedbolt.AdaptingDriverResponseHandler.onError(AdaptingDriverResponseHandler.java:52) ~[neo4j-java-driver-5.28.5.jar:5.28.5-9d0315e00d46b259c2355be35c89acfa9a30fc0a]
                at org.neo4j.bolt.connection.routed.impl.RoutedBoltConnection$1.onError(RoutedBoltConnection.java:191) ~[neo4j-bolt-connection-routed-2.0.0.jar:na]
                at org.neo4j.bolt.connection.pooled.impl.PooledBoltConnection$1.onError(PooledBoltConnection.java:193) ~[neo4j-bolt-connection-pooled-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.BoltConnectionImpl$ResponseHandleImpl.lambda$onError$1(BoltConnectionImpl.java:611) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.BoltConnectionImpl$ResponseHandleImpl.runIgnoringError(BoltConnectionImpl.java:742) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.BoltConnectionImpl$ResponseHandleImpl.onError(BoltConnectionImpl.java:611) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.BoltConnectionImpl$4.onError(BoltConnectionImpl.java:239) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.messaging.v3.BoltProtocolV3.lambda$run$10(BoltProtocolV3.java:389) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[na:na]
                at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[na:na]
                at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[na:na]
                at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2194) ~[na:na]
                at org.neo4j.bolt.connection.netty.impl.handlers.RunResponseHandler.onFailure(RunResponseHandler.java:50) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.async.inbound.InboundMessageDispatcher.handleFailureMessage(InboundMessageDispatcher.java:109) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.messaging.common.CommonMessageReader.unpackFailureMessage(CommonMessageReader.java:80) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.messaging.common.CommonMessageReader.read(CommonMessageReader.java:53) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:81) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at org.neo4j.bolt.connection.netty.impl.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:34) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
                at org.neo4j.bolt.connection.netty.impl.async.inbound.MessageDecoder.channelRead(MessageDecoder.java:40) ~[neo4j-bolt-connection-netty-2.0.0.jar:na]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:333) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:455) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290) ~[netty-codec-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:289) ~[netty-handler-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:796) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:732) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:658) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998) ~[netty-common-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.122.Final.jar:4.1.122.Final]
                at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.122.Final.jar:4.1.122.Final]
                ... 1 common frames omitted
Image

Environment
Java: 21
spring-ai version: 1.0.0
Neo4j Server version: 5.16.0 (community)

Minimal Complete Reproducible example
code:

@RestController
@RequestMapping("/v1/chat")
public class StreamingChatNeo4jController {

    private final ChatClient chatClient;
    private final ChatMemory chatMemory;

    public StreamingChatNeo4jController(ChatClient.Builder chatClientBuilder, Neo4jChatMemoryRepository chatMemoryRepository) {
        this.chatClient = chatClientBuilder.defaultSystem("Brief answer").build();
        chatMemory = MessageWindowChatMemory.builder()
                .chatMemoryRepository(chatMemoryRepository)
                .maxMessages(500)
                .build();
    }

    @GetMapping(value = "/completions", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> multipleChat(
            @RequestParam(value = "modelName") String modelName,
            @RequestParam("userInput") String userInput,
            @RequestParam(value = "sessionId") String sessionId) {

        var chatOptions = OpenAiChatOptions.builder().model(modelName).build();
        chatMemory.add(sessionId, new UserMessage(userInput));
        var responseContent = new StringBuilder();
        return this.chatClient
                .prompt()
                .messages(chatMemory.get(sessionId))
                .options(chatOptions)
                .stream()
                .content()
                .doOnNext(responseContent::append)
                .doOnComplete(() -> chatMemory.add(sessionId, new AssistantMessage(responseContent.toString())));
    }
}

yaml:

server:
  port: 8080

  servlet:
    context-path: /ai

spring:
  application:
    name: app-datakits-ai
  ai:
    openai:
      base-url: xxx
      api-key: sk-xxx
    chat:
      memory:
        repository:
          neo4j:
            session-label: Session
            message-label: Message
            tool-call-label: ToolCall
            tool-response-label: ToolResponse
            metadata-label: Metadata
            media-label: Media
  neo4j:
    uri: 'neo4j://xxx'
    authentication:
      username: neo4j
      password: xxx

pom dependencies:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.ai</groupId>
      <artifactId>spring-ai-starter-model-chat-memory-repository-neo4j</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.ai</groupId>
      <artifactId>spring-ai-starter-model-openai</artifactId>
    </dependency>

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions