Skip to content

Vertex AI Streaming not working #3313

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
juandaco opened this issue May 24, 2025 · 0 comments
Open

Vertex AI Streaming not working #3313

juandaco opened this issue May 24, 2025 · 0 comments

Comments

@juandaco
Copy link

Bug description
Streaming responses are not working when using Vertex AI Gemini models. The GRPC streaming seems to be working just fine, but the conversion towards the Flux only happens at the end.

Environment
Spring AI Version: 1.0.0
Java Version: 21

Steps to reproduce
Run the demo project and query it with HTTPie like:

$ http --stream :8080/api/v1/chat?message='Tell me a story about pirates'

You'll see in the logs that the majority of the text messages happen at the same timestamp while the GRPC messages flow constantly.

Expected behavior
A constant flow of messages like it does for OpenAI models.

Minimal Complete Reproducible example
Use the following project to reproduce the issue. You just need to configure Vertex AI authentication:
https://github.com/juandaco/spring-ai-streaming-issue

Sample Logs:

2025-05-24T06:46:45.859-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] OUTBOUND HEADERS: streamId=3 headers=GrpcHttp2OutboundHeaders[:authority: us-central1-aiplatform.googleapis.com:443, :path: /google.cloud.aiplatform.v1.PredictionService/StreamGenerateContent, :method: POST, :scheme: https, content-type: application/grpc, te: trailers, user-agent: model-builder/1.22.0 grpc-java-netty/1.70.0, x-goog-api-client: gl-java/21.0.6__BellSoft gapic/1.22.0--protobuf-3.25.5 gax/2.65.0 grpc/1.70.0 protobuf/3.25.5 cred-type/u, x-goog-request-params: model=projects%2F******%2Flocations%2Fus-central1%2Fpublishers%2Fgoogle%2Fmodels%2Fgemini-2.0-flash, grpc-accept-encoding: gzip, authorization: Bearer ******** x-goog-user-project: *******] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2025-05-24T06:46:45.862-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] OUTBOUND DATA: streamId=3 padding=0 endStream=true length=156 bytes=000000009712270a0475736572121f0a1d54656c6c206d6520612073746f72792061626f7574207069726174657322070d3333333f20012a6370726f6a656374...
2025-05-24T06:46:46.516-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND HEADERS: streamId=3 headers=GrpcHttp2ResponseHeaders[:status: 200, content-type: application/grpc, grpc-accept-encoding: identity, deflate, gzip, content-disposition: attachment, date: Sat, 24 May 2025 11:46:46 GMT, alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000] padding=0 endStream=false
2025-05-24T06:46:46.518-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=84 bytes=000000004f1210120e0a056d6f64656c12050a03546865220240015a1067656d696e692d322e302d666c617368620c08a6e3c6c10610f8c9b5c0016a17707245...
2025-05-24T06:46:46.518-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] OUTBOUND PING: ack=false bytes=1234
2025-05-24T06:46:46.525-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND PING: ack=true bytes=1234
2025-05-24T06:46:46.526-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : Window: 1,048,576
2025-05-24T06:46:46.540-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=98 bytes=000000005d121e121c0a056d6f64656c12130a112073616c74207370726179207374756e67220240015a1067656d696e692d322e302d666c617368620c08a6e3...
2025-05-24T06:46:46.542-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        : The
2025-05-24T06:46:46.591-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=150 bytes=0000000091125212500a056d6f64656c12470a452046696e6ee2809973206661636520617320686520636c756e6720746f207468652072696767696e672c2074...
2025-05-24T06:46:46.694-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=157 bytes=0000000098125912570a056d6f64656c124e0a4c2c206272616964656420686169722061726f756e642068696d206c696b652061206672616e7469632064616e...
2025-05-24T06:46:46.879-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=240 bytes=00000000eb12ab0112a8010a056d6f64656c129e010a9b012053657270656e742a207761732061206d61656c7374726f6d206f662061637469766974792e2043...
2025-05-24T06:46:47.110-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=211 bytes=00000000ce128e01128b010a056d6f64656c1281010a7f20637574207468726f7567682074686520686f776c696e672067616c652e0a0ae2809c486172642074...
2025-05-24T06:46:47.412-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=299 bytes=000000012612e60112e3010a056d6f64656c12d9010ad60169676174652c20746865202a4c6520446961626c65204e6f69722a2c206c6f6f6d6564206f757420...
2025-05-24T06:46:47.720-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=261 bytes=000000010012c00112bd010a056d6f64656c12b3010ab0012077617320637574206f757420666f7220746869732e204865e2809964206265656e20612062616b...
2025-05-24T06:46:48.030-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=361 bytes=000000016412a40212a1020a056d6f64656c1297020a94022061206368616e636520746f20746173746520616476656e747572652c20616e64206865e2809964...
2025-05-24T06:46:48.436-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=354 bytes=000000015d129d02129a020a056d6f64656c1290020a8d02206d696e676c6564207769746820746865206372617368206f662077617665732e2046696e6e2073...
2025-05-24T06:46:48.847-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=343 bytes=0000000152129202128f020a056d6f64656c1285020a82022c206869732068616e6473207472656d626c696e672061732068652072616d6d656420706f776465...
2025-05-24T06:46:49.256-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=361 bytes=000000016412a40212a1020a056d6f64656c1297020a940220666561722ee2809d0a0a54686520626174746c65207261676564206f6e20666f72207768617420...
2025-05-24T06:46:49.666-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=364 bytes=000000016712a70212a4020a056d6f64656c129a020a970220746865206669676874207769746820727574686c65737320656666696369656e63792e0a0a4669...
2025-05-24T06:46:50.076-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=375 bytes=000000017212b20212af020a056d6f64656c12a5020aa2022068696d73656c6620666163652d746f2d6661636520776974682061204672656e6368207361696c...
2025-05-24T06:46:50.383-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=353 bytes=000000015c129c021299020a056d6f64656c128f020a8c022068697320657965732c2062726163696e6720666f722074686520696e6576697461626c652e0a0a...
2025-05-24T06:46:50.792-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=354 bytes=000000015d129d02129a020a056d6f64656c1290020a8d022061696ee2809974206e6f2067616d65206f6620636865636b65727321e2809d204a61636b206261...
2025-05-24T06:46:51.305-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=357 bytes=000000016012a002129d020a056d6f64656c1293020a9002207061727269656420626c6f77732c20646f646765642061747461636b732c20616e64206576656e...
2025-05-24T06:46:51.442-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=381 bytes=000000017812b80212b5020a056d6f64656c12ab020aa8022072656d61696e696e67204672656e6368207361696c6f72732073757272656e64657265642e0a0a...
2025-05-24T06:46:51.816-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=358 bytes=000000016112a102129e020a056d6f64656c1294020a910220627275697365642c20736174206f6e20746865206465636b2c207761746368696e672074686520...
2025-05-24T06:46:52.227-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=344 bytes=00000001531293021290020a056d6f64656c1286020a830220686973206865617274207377656c6c696e6720776974682061206d6978206f6620707269646520...
2025-05-24T06:46:52.572-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=349 bytes=00000001581298021295020a056d6f64656c128b020a8802576520616c6c20646f2c2046696e6e2e20576520616c6c20646f2e2042757420796f75e280997665...
2025-05-24T06:46:52.858-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND DATA: streamId=3 padding=0 endStream=false length=356 bytes=000000015f128a021285020a056d6f64656c12fb010af8012e204865207761732061207069726174652c2061206d656d626572206f6620746865202a53656120...
2025-05-24T06:46:52.863-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND HEADERS: streamId=3 headers=GrpcHttp2ResponseHeaders[grpc-status: 0, endpoint-load-metrics-bin: MVf0/50uCXZAOUtkA1DLg/w/STeR/gKkHtQ/, grpc-server-stats-bin: AAAl6K+KAQAAAA, pc-low-bwd-bin: Q2dJZ0VB, pc-high-bwd-bin: S2dRWUxGQVk, pcx-low-bwd-bin: CgIgEA, pcx-high-bwd-bin: KgQYLFAY] padding=0 endStream=true
2025-05-24T06:46:52.864-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] INBOUND PING: ack=false bytes=926
2025-05-24T06:46:52.865-05:00 DEBUG 16854 --- [spring-ai-streaming-issue] [-worker-ELG-1-2] i.g.n.s.i.grpc.netty.NettyClientHandler  : [id: 0x5e527ba4, L:/192.168.88.4:62761 - R:us-central1-aiplatform.googleapis.com/142.251.129.202:443] OUTBOUND PING: ack=true bytes=926
2025-05-24T06:46:52.872-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  salt spray stung
2025-05-24T06:46:52.872-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  Finn’s face as he clung to the rigging, the wind whipping his long
2025-05-24T06:46:52.872-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        : , braided hair around him like a frantic dancer. Below, the deck of the *Sea
2025-05-24T06:46:52.872-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  Serpent* was a maelstrom of activity. Captain Amelia “Stormbreaker” Blackwood, a woman whose fiery spirit matched her crimson hair, roared orders that
2025-05-24T06:46:52.872-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  cut through the howling gale.

“Hard to starboard, you landlubbers! Show the Frenchies what we’re made of!”

A French fr
2025-05-24T06:46:52.872-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        : igate, the *Le Diable Noir*, loomed out of the churning waves, its cannons already spitting fire. Finn, only fifteen and still new to the pirate life, felt a knot of fear tighten in his stomach. He wasn’t sure he
2025-05-24T06:46:52.872-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  was cut out for this. He’d been a baker’s apprentice back in Tortuga, not a swashbuckling buccaneer. But the *Sea Serpent* had offered him a chance to escape the drudgery,
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  a chance to taste adventure, and he’d taken it. Now, adventure was biting back.

The *Sea Serpent* responded with a ferocious volley of its own. The air filled with the acrid smell of gunpowder and the deafening roar of cannons. Splintered wood flew, and the screams of men
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  mingled with the crash of waves. Finn saw a man beside him fall, a gaping hole in his chest. He flinched, but Captain Blackwood’s sharp gaze snapped him back to attention.

“Don’t just stand there gawking, lad! Help reload the cannons!”

Finn scrambled to obey
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        : , his hands trembling as he rammed powder and shot into the hot barrels. He worked alongside a grizzled pirate named One-Eyed Jack, who winked at him.

“First battle, eh, lad? Don’t worry, it gets easier… well, maybe not easier, but you get used to the
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  fear.”

The battle raged on for what felt like an eternity. The *Sea Serpent* was smaller and faster than the *Le Diable Noir*, allowing them to maneuver around the larger vessel’s broadsides. Captain Blackwood, with a cutlass in her hand and a glint in her eye, directed
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  the fight with ruthless efficiency.

Finally, the *Sea Serpent* managed to grapple the *Le Diable Noir*. Pirates, Finn included, swarmed across the ropes and onto the enemy deck, a tide of cutlasses and pistols. Finn, armed with a rusty cutlass he’d found in the armory, found
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  himself face-to-face with a French sailor, a man with a grim expression and a sword that looked far sharper than his own.

He froze, his mind blank. The sailor lunged, and Finn instinctively ducked, the blade whistling past his ear. He stumbled back, tripping over a fallen spar. He closed
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  his eyes, bracing for the inevitable.

But the blow never came. Instead, he heard a grunt and the thud of a falling body. He opened his eyes to see One-Eyed Jack standing over the fallen sailor, his cutlass dripping with blood.

“Keep your wits about you, lad! This
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  ain’t no game of checkers!” Jack barked, then shoved him forward. “Now get back in the fight!”

Finn, fueled by a surge of adrenaline, charged forward, swinging his cutlass wildly. He didn’t know what he was doing, but he fought with a desperate ferocity. He
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  parried blows, dodged attacks, and even managed to land a few lucky hits.

After what seemed like an age, the French sailors began to falter. Their captain, a tall, imposing man with a scar across his face, fell to Captain Blackwood’s blade. With their leader gone, the
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  remaining French sailors surrendered.

The *Sea Serpent* had won.

As the sun dipped below the horizon, painting the sky in hues of orange and purple, the pirates celebrated their victory. They drank rum, sang shanties, and divided the spoils taken from the *Le Diable Noir*. Finn, exhausted and
2025-05-24T06:46:52.873-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  bruised, sat on the deck, watching the revelry.

Captain Blackwood approached him, her face softened by the fading light. “You did well, Finn,” she said, her voice surprisingly gentle. “For a baker’s apprentice, you showed a lot of grit.”

Finn looked up at her,
2025-05-24T06:46:52.874-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        :  his heart swelling with a mix of pride and relief. He was still scared, but he had survived. He had faced his fear and come out on the other side.

“Thank you, Captain,” he said, his voice hoarse. “I still have a lot to learn.”

Blackwood smiled. “
2025-05-24T06:46:52.874-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        : We all do, Finn. We all do. But you’ve taken your first step on the pirate’s path. Now, get some rest. We sail for Nassau tomorrow.”

As Finn looked out at the vast, endless ocean, he knew his life had changed forever. He was no longer a baker’s apprentice
2025-05-24T06:46:52.874-05:00  INFO 16854 --- [spring-ai-streaming-issue] [oundedElastic-1] art.skylurker.demo.ChatController        : . He was a pirate, a member of the *Sea Serpent* crew. He was a part of something bigger, something dangerous, something… adventurous. And despite the fear, he couldn't help but feel a thrill course through his veins. His journey had just begun.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant