Skip to content
This repository was archived by the owner on Jun 5, 2025. It is now read-only.

Commit db4d40b

Browse files
committed
Fix copilot errors which cause client to hangup during FIM
1 parent eb5cd04 commit db4d40b

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

src/codegate/providers/copilot/provider.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,7 @@ def __init__(self, proxy: CopilotProvider):
659659
def connection_made(self, transport: asyncio.Transport) -> None:
660660
"""Handle successful connection to target"""
661661
self.transport = transport
662+
logger.debug(f"Target transport peer: {transport.get_extra_info('peername')}")
662663
self.proxy.target_transport = transport
663664

664665
def _ensure_output_processor(self) -> None:
@@ -703,9 +704,10 @@ async def stream_iterator():
703704
streaming_choices.append(
704705
StreamingChoices(
705706
finish_reason=choice.get("finish_reason", None),
706-
index=0,
707+
index=choice.get("index", 0),
707708
delta=Delta(content=content, role="assistant"),
708-
logprobs=None,
709+
logprobs=choice.get("logprobs", None),
710+
p=choice.get("p", None),
709711
)
710712
)
711713

@@ -716,12 +718,13 @@ async def stream_iterator():
716718
created=record_content.get("created", 0),
717719
model=record_content.get("model", ""),
718720
object="chat.completion.chunk",
721+
stream=True,
719722
)
720723
yield mr
721724

722725
async for record in self.output_pipeline_instance.process_stream(stream_iterator()):
723726
chunk = record.model_dump_json(exclude_none=True, exclude_unset=True)
724-
sse_data = f"data:{chunk}\n\n".encode("utf-8")
727+
sse_data = f"data: {chunk}\n\n".encode("utf-8")
725728
chunk_size = hex(len(sse_data))[2:] + "\r\n"
726729
self._proxy_transport_write(chunk_size.encode())
727730
self._proxy_transport_write(sse_data)
@@ -764,6 +767,10 @@ def _proxy_transport_write(self, data: bytes):
764767
logger.error("Proxy transport not available")
765768
return
766769
self.proxy.transport.write(data)
770+
# print("DEBUG =================================")
771+
# print(data)
772+
# print("DEBUG =================================")
773+
767774

768775
def data_received(self, data: bytes) -> None:
769776
"""Handle data received from target"""
@@ -781,11 +788,21 @@ def data_received(self, data: bytes) -> None:
781788
if header_end != -1:
782789
self.headers_sent = True
783790
# Send headers first
784-
headers = data[: header_end + 4]
791+
headers = data[: header_end]
792+
793+
# If Transfer-Encoding is not present, add it
794+
if b"Transfer-Encoding:" not in headers:
795+
headers = headers + b"\r\nTransfer-Encoding: chunked"
796+
797+
headers = headers + b"\r\n\r\n"
798+
785799
self._proxy_transport_write(headers)
786800
logger.debug(f"Headers sent: {headers}")
787801

788802
data = data[header_end + 4 :]
803+
# print("DEBUG =================================")
804+
# print(data)
805+
# print("DEBUG =================================")
789806

790807
self._process_chunk(data)
791808

src/codegate/providers/copilot/streaming.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def process_chunk(self, chunk: bytes) -> list:
4242
data = json.loads(data_content)
4343
records.append({"type": "data", "content": data})
4444
except json.JSONDecodeError:
45-
print(f"Failed to parse JSON: {data_content}")
45+
logger.debug(f"Failed to parse JSON: {data_content}")
4646

4747
return records
4848

0 commit comments

Comments
 (0)