Skip to content

Commit

Permalink
Update Yandex integration and enhance message handling
Browse files Browse the repository at this point in the history
- Added support for tools in Yandex GPT responses and updated related functions.
- Refactored message transformation logic to accommodate new tool call structures.
- Improved logging for better traceability of requests and responses.
- Updated models to include new fields for tool calls and function arguments.
- Modified .gitignore to include additional test files and scripts.
- Minor adjustments in test files for local development setup.

These changes enhance the functionality and flexibility of the Yandex integration, allowing for more complex interactions with tools and improved response formatting.
  • Loading branch information
all-mute committed Dec 2, 2024
1 parent 3c00f08 commit 6a8c1ee
Show file tree
Hide file tree
Showing 7 changed files with 235 additions and 67 deletions.
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,9 @@ mytest copy.py
mytest copy 2.py
mytest copy 3.py
mytest copy 4.py
mytest copy 5.py
mytest copy 5.py
app/1
app/2
app/_yandex.py
YStest tools.py
ytest tools.py
39 changes: 7 additions & 32 deletions app/app.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from fastapi.responses import RedirectResponse, StreamingResponse
import uvicorn
from fastapi import APIRouter, HTTPException, Request
from app.yandex import generate_yandexgpt_response, generate_yandex_embeddings_response, generate_yandexgpt_stream_response
from app.yandex import generate_yandexgpt_response, generate_yandex_embeddings_response, generate_yandexgpt_stream_response, _adapt_message_for_openai
from app.models import CompletionResponse, TextEmbeddingResponse
import os, sys, time, json
from app.my_logger import logger
Expand All @@ -10,10 +10,7 @@

load_dotenv()

logger.info("My log message XXXX")

# 1. Если вы найдете scheme запроса к openai, пожалуйста, дайте знать tg @nongilgameshj
# 2. Перед тем как придираться к отсутствию валидации и сериализации, пожалуйста, ответьте на вопрос: "А зачем оно в прокси?"
logger.info("App module initiated.")

# Загрузка конфига
with open('config.json', 'r') as f:
Expand Down Expand Up @@ -60,46 +57,24 @@ async def completion(request: Request):
max_tokens = body.get("max_tokens", 2048)
temperature = body.get("temperature", 0.3)
messages = body.get("messages", [])
tools = body.get("tools", None)
stream = body.get("stream", False)

logger.debug(f"Полученные данные: model={model}, max_tokens={max_tokens}, temperature={temperature}, messages={messages}, stream={stream}")
logger.debug(f"Полученные данные: model={model}, max_tokens={max_tokens}, temperature={temperature}, messages={messages}, tools={tools}, stream={stream}")
logger.info(f"Используемая модель: {model}")

# Генерация ответа от Yandex GPT
if stream:

return StreamingResponse(generate_yandexgpt_stream_response(messages, model, temperature, max_tokens, yandex_api_key, folder_id), media_type="text/event-stream")
return StreamingResponse(generate_yandexgpt_stream_response(messages, tools, model, temperature, max_tokens, yandex_api_key, folder_id), media_type="text/event-stream")
else:
yandex_response, yandex_error = await generate_yandexgpt_response(messages, model, temperature, max_tokens, yandex_api_key, folder_id)
yandex_response, yandex_error = await generate_yandexgpt_response(messages, tools, model, temperature, max_tokens, yandex_api_key, folder_id)

if yandex_error:
logger.error(f"Ошибка при генерации ответа от Yandex GPT: {yandex_error}")
return yandex_error

# Формирование ответа в формате OpenAI
openai_format_response = {
"id": "chatcmpl-42",
"object": "chat.completion",
"created": int(time.time()),
"model": f"{model}-by-{yandex_response.modelVersion}",
"system_fingerprint": "42",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": yandex_response.alternatives[0].message.text,
},
"logprobs": None,
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": yandex_response.usage.inputTextTokens,
"completion_tokens": yandex_response.usage.completionTokens,
"total_tokens": yandex_response.usage.totalTokens
}
}

logger.debug("Формирование ответа в формате OpenAI завершено.")
openai_format_response = _adapt_message_for_openai(yandex_response, model)
return openai_format_response

except HTTPException as e:
Expand Down
22 changes: 17 additions & 5 deletions app/models.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,34 @@
from pydantic import BaseModel, Field
from typing import List, Literal
from typing import List, Literal, Dict, Any, Optional, Union

class CompletionOptions(BaseModel):
stream: bool
temperature: float = Field(0.3, ge=0.0, le=1.0)
maxTokens: int = Field(..., gt=0)

class Message(BaseModel):
role: Literal['system', 'assistant', 'user']
role: Literal['system', 'assistant', 'user', 'tool']
text: str

class CompletionRequest(BaseModel):
modelUri: str
completionOptions: CompletionOptions
messages: List[Message]
messages: Union[List[Message], None]

class Function(BaseModel):
name: str
arguments: Any

class FunctionCall(BaseModel):
functionCall: Function

class ToolCallList(BaseModel):
toolCalls: List[FunctionCall]

class AlternativeMessage(BaseModel):
role: Literal['system', 'assistant', 'user']
text: str
text: Union[str, None] = None
toolCallList: Optional[ToolCallList] = None

class Alternative(BaseModel):
message: AlternativeMessage
Expand All @@ -26,7 +37,8 @@ class Alternative(BaseModel):
'ALTERNATIVE_STATUS_PARTIAL',
'ALTERNATIVE_STATUS_TRUNCATED_FINAL',
'ALTERNATIVE_STATUS_FINAL',
'ALTERNATIVE_STATUS_CONTENT_FILTER'
'ALTERNATIVE_STATUS_CONTENT_FILTER',
'ALTERNATIVE_STATUS_TOOL_CALLS'
]

class Usage(BaseModel):
Expand Down
2 changes: 1 addition & 1 deletion app/my_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
log_type = os.getenv("LOG_TYPE", "volume")

# Настраиваем логирование
logger.remove()
#logger.remove()
if log_type == "volume":
# Логи записываются в файл
logger.add("logs/debug.log", format="{time} {level} {message}", level=LOG_LEVEL, rotation="100 MB")
Expand Down
Loading

0 comments on commit 6a8c1ee

Please sign in to comment.