view mrjunejune/inference/sdk_provider_integration_test.py @ 273:e02e2036ef84 default tip

add Layer 2 JRPG component system Add reusable content and window modals, an isolated component sandbox, shared cyberpunk scroll areas, production-safe cache freshness, and server-rendered JRPG panel state. Co-authored-by: Copilot <[email protected]>
author MrJuneJune <me@mrjunejune.com>
date Sat, 08 Aug 2026 02:08:08 -0700
parents 1f9877b637e9
children
line wrap: on
line source

import asyncio
import json
import os
import sys
import tempfile
import threading
import time
import unittest
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer

from copilot import CopilotClient, RuntimeConnection
from copilot.rpc import PermissionDecisionReject

CLI_PATH = os.path.abspath(sys.argv.pop(1))


class ProviderHandler(BaseHTTPRequestHandler):
    requests = []

    def do_POST(self) -> None:
        length = int(self.headers.get("Content-Length", "0"))
        payload = json.loads(self.rfile.read(length))
        self.__class__.requests.append((self.path, payload))
        response_id = f"chatcmpl-{len(self.__class__.requests)}"
        chunks = [
            {
                "id": response_id,
                "object": "chat.completion.chunk",
                "created": int(time.time()),
                "model": "gpt-4",
                "choices": [
                    {
                        "index": 0,
                        "delta": {"role": "assistant", "content": "hello "},
                        "finish_reason": None,
                    }
                ],
            },
            {
                "id": response_id,
                "object": "chat.completion.chunk",
                "created": int(time.time()),
                "model": "gpt-4",
                "choices": [
                    {
                        "index": 0,
                        "delta": {"content": "traveler"},
                        "finish_reason": None,
                    }
                ],
            },
            {
                "id": response_id,
                "object": "chat.completion.chunk",
                "created": int(time.time()),
                "model": "gpt-4",
                "choices": [
                    {
                        "index": 0,
                        "delta": {},
                        "finish_reason": "stop",
                    }
                ],
            },
        ]
        self.send_response(200)
        self.send_header("Content-Type", "text/event-stream")
        self.send_header("Cache-Control", "no-cache")
        self.send_header("Connection", "close")
        self.end_headers()
        for chunk in chunks:
            self.wfile.write(
                f"data: {json.dumps(chunk, separators=(',', ':'))}\n\n".encode()
            )
            self.wfile.flush()
        self.wfile.write(b"data: [DONE]\n\n")
        self.wfile.flush()
        self.close_connection = True

    def log_message(self, _format: str, *_args: object) -> None:
        return


def deny_permission(*_args: object, **_kwargs: object) -> PermissionDecisionReject:
    return PermissionDecisionReject(feedback="No tools are allowed.")


class SdkProviderIntegrationTest(unittest.IsolatedAsyncioTestCase):
    async def test_two_streamed_turns_use_openai_compatible_provider(self) -> None:
        self.assertTrue(os.path.isfile(CLI_PATH))
        ProviderHandler.requests = []
        server = ThreadingHTTPServer(("127.0.0.1", 0), ProviderHandler)
        server_thread = threading.Thread(target=server.serve_forever, daemon=True)
        server_thread.start()
        events = []
        idle = asyncio.Event()

        with tempfile.TemporaryDirectory() as base_directory:
            client = CopilotClient(
                connection=RuntimeConnection.for_stdio(path=CLI_PATH),
                base_directory=base_directory,
                use_logged_in_user=False,
                log_level="error",
                mode="empty",
            )
            try:
                await client.start()
                session = await client.create_session(
                    session_id="provider-integration",
                    on_permission_request=deny_permission,
                    model="gpt-4",
                    provider={
                        "type": "openai",
                        "base_url": (
                            f"http://127.0.0.1:{server.server_port}/v1"
                        ),
                        "wire_api": "completions",
                        "api_key": "local-test-key",
                    },
                    streaming=True,
                    tools=[],
                    available_tools=[],
                    mcp_servers={},
                    enable_config_discovery=False,
                    skip_custom_instructions=True,
                    enable_skills=False,
                    enable_session_store=True,
                    on_event=lambda event: (
                        events.append(event),
                        idle.set()
                        if event.type.value == "session.idle"
                        else None,
                    ),
                )
                for prompt in ("first", "second"):
                    idle.clear()
                    await session.send(prompt)
                    await asyncio.wait_for(idle.wait(), timeout=15)
                await session.disconnect()
            finally:
                await client.stop()
                server.shutdown()
                server.server_close()
                server_thread.join()

        self.assertEqual(len(ProviderHandler.requests), 2)
        self.assertTrue(
            all(path.endswith("/chat/completions")
                for path, _ in ProviderHandler.requests)
        )
        deltas = [
            event.data.delta_content
            for event in events
            if event.type.value == "assistant.message_delta"
        ]
        self.assertEqual(deltas, ["hello ", "traveler", "hello ", "traveler"])
        messages = [
            event.data.content
            for event in events
            if event.type.value == "assistant.message"
        ]
        self.assertEqual(messages, ["hello traveler", "hello traveler"])


if __name__ == "__main__":
    unittest.main()