123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- from __future__ import annotations
- import json
- from aiohttp import ClientSession
- from ..image import to_data_uri
- from ..typing import AsyncResult, Messages, ImagesType
- from ..requests.raise_for_status import raise_for_status
- from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
- from .helper import format_prompt
- from ..providers.response import FinishReason
- class OIVSCode(AsyncGeneratorProvider, ProviderModelMixin):
- label = "OI VSCode Server"
- url = "https://oi-vscode-server.onrender.com"
- api_endpoint = "https://oi-vscode-server.onrender.com/v1/chat/completions"
-
- working = True
- supports_stream = True
- supports_system_message = True
- supports_message_history = True
-
- default_model = "gpt-4o-mini-2024-07-18"
- default_vision_model = default_model
- vision_models = [default_model, "gpt-4o-mini"]
- models = vision_models
-
- model_aliases = {"gpt-4o-mini": "gpt-4o-mini-2024-07-18"}
- @classmethod
- async def create_async_generator(
- cls,
- model: str,
- messages: Messages,
- stream: bool = False,
- images: ImagesType = None,
- proxy: str = None,
- **kwargs
- ) -> AsyncResult:
- headers = {
- "accept": "*/*",
- "accept-language": "en-US,en;q=0.9",
- "content-type": "application/json",
- "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
- }
-
- async with ClientSession(headers=headers) as session:
-
- if images is not None:
- messages[-1]['content'] = [
- {
- "type": "text",
- "text": messages[-1]['content']
- },
- *[
- {
- "type": "image_url",
- "image_url": {
- "url": to_data_uri(image)
- }
- }
- for image, _ in images
- ]
- ]
-
- data = {
- "model": model,
- "stream": stream,
- "messages": messages
- }
-
- async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
- await raise_for_status(response)
-
- full_response = ""
-
- if stream:
- async for line in response.content:
- if line:
- line = line.decode()
- if line.startswith("data: "):
- if line.strip() == "data: [DONE]":
- break
- try:
- data = json.loads(line[6:])
- if content := data["choices"][0]["delta"].get("content"):
- yield content
- full_response += content
- except:
- continue
-
- reason = "length" if len(full_response) > 0 else "stop"
- yield FinishReason(reason)
- else:
- response_data = await response.json()
- full_response = response_data["choices"][0]["message"]["content"]
- yield full_response
-
- reason = "length" if len(full_response) > 0 else "stop"
- yield FinishReason(reason)
|