From 1dcc346477819e217e0ba9af69c524c10b3e9dee Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 18 Nov 2024 10:13:42 +0100 Subject: [PATCH 01/70] Add message entity and logic --- .../www1/hephaestus/chat/message/Message.java | 42 ++++++++++++ .../chat/message/MessageController.java | 23 +++++++ .../hephaestus/chat/message/MessageDTO.java | 26 ++++++++ .../chat/message/MessageRepository.java | 12 ++++ .../chat/message/MessageService.java | 65 +++++++++++++++++++ 5 files changed, 168 insertions(+) create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java new file mode 100644 index 00000000..3e7250f3 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -0,0 +1,42 @@ +package de.tum.in.www1.hephaestus.chat.message; + +import jakarta.persistence.*; +import java.time.ZonedDateTime; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.lang.NonNull; + +import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; +import de.tum.in.www1.hephaestus.chat.Chat; + + +@Entity +@Table(name = "message") +@Getter +@Setter +@ToString(callSuper = true) +@RequiredArgsConstructor +public class Message extends BaseGitServiceEntity { + @NonNull + @Column(name = "sent_at") + private final ZonedDateTime sentAt; + + @NonNull + @Enumerated(EnumType.STRING) + private MessageSender sender; + + @NonNull + @Column(name = "content") + private String content; + + @NonNull + @ManyToOne(optional = false) + @JoinColumn(name = "chat_id") + private Chat chat; + + public enum MessageSender { + SYSTEM, USER + } +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java new file mode 100644 index 00000000..695fece2 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java @@ -0,0 +1,23 @@ +package de.tum.in.www1.hephaestus.chat.message; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/message") +public class MessageController { + private final MessageService messageService; + + public MessageController(MessageService messageService) { + this.messageService = messageService; + } + + @PostMapping + public ResponseEntity sendMessage(@RequestBody MessageDTO messageDTO) { + MessageDTO savedMessage = messageService.sendMessage(messageDTO); + return ResponseEntity.ok(savedMessage); + } +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java new file mode 100644 index 00000000..42f5a80c --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java @@ -0,0 +1,26 @@ +package de.tum.in.www1.hephaestus.chat.message; + +import java.time.ZonedDateTime; + +import org.springframework.lang.NonNull; +import com.fasterxml.jackson.annotation.JsonInclude; + +import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; + +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public record MessageDTO( + @NonNull Long id, + @NonNull ZonedDateTime sentAt, + @NonNull MessageSender sender, + @NonNull String content, + @NonNull Long chatId) { + + public MessageDTO(Message message) { + this( + message.getId(), + message.getSentAt(), + message.getSender(), + message.getContent(), + message.getChat().getId()); + } +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java new file mode 100644 index 00000000..f9d58d8e --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java @@ -0,0 +1,12 @@ +package de.tum.in.www1.hephaestus.chat.message; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface MessageRepository extends JpaRepository { + List findByChatId(Long chatId); + List findByChatIdAndContentContaining(Long chatId, String keyword); +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java new file mode 100644 index 00000000..23f07ea9 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -0,0 +1,65 @@ +package de.tum.in.www1.hephaestus.chat.message; + +import java.time.ZonedDateTime; + +import org.springframework.stereotype.Service; + +import de.tum.in.www1.hephaestus.chat.Chat; +import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; +import de.tum.in.www1.hephaestus.intelligenceservice.api.DefaultApi; +import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatRequest; +import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatResponse; +import de.tum.in.www1.hephaestus.chat.ChatRepository; + + + +/** + * Service for managing messages. + */ +@Service +public class MessageService { + + private final ChatRepository chatRepository; + private final MessageRepository messageRepository; + private final DefaultApi chatApiClient; + + public MessageService(ChatRepository chatRepository, MessageRepository messageRepository) { + this.chatRepository = chatRepository; + this.messageRepository = messageRepository; + this.chatApiClient = new DefaultApi(); + } + + /** + * Sends a message, saves it, and generates a bot response. + */ + public MessageDTO sendMessage(MessageDTO messageDTO) { + Chat chat = chatRepository.findById(messageDTO.chatId()) + .orElseThrow(() -> new IllegalArgumentException("Chat not found")); + + Message userMessage = new Message(ZonedDateTime.now(), MessageSender.USER, messageDTO.content(), chat); + messageRepository.save(userMessage); + + String systemResponse = generateResponse(messageDTO.chatId(), messageDTO.content()); + + Message systemMessage = new Message(ZonedDateTime.now(), MessageSender.SYSTEM, systemResponse, chat); + messageRepository.save(systemMessage); + + return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), systemMessage.getContent(), systemMessage.getChat().getId()); + } + + /** + * Calls the Python FastAPI service to generate a bot response. + */ + private String generateResponse(Long chatId, String messageContent) { + ChatRequest chatRequest = new ChatRequest(); + chatRequest.setChatId(chatId.toString()); + chatRequest.setMessageContent(messageContent); + + try { + ChatResponse chatResponse = chatApiClient.chatChatPost(chatRequest); + return chatResponse.getMessageContent(); + } catch (Exception e) { + throw new RuntimeException("Error communicating with intelligence service: " + e.getMessage(), e); + } + } +} \ No newline at end of file From ddcca9859f5e6452a7222798ddef789bf73e8d6b Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 18 Nov 2024 10:15:37 +0100 Subject: [PATCH 02/70] Change step model --- server/intelligence-service/app/model.py | 26 ++++++------------------ 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/server/intelligence-service/app/model.py b/server/intelligence-service/app/model.py index 59fb8638..557bb603 100644 --- a/server/intelligence-service/app/model.py +++ b/server/intelligence-service/app/model.py @@ -44,10 +44,11 @@ class State(TypedDict): "You are an AI mentor helping a students working on the software engineering projects." + "You need to guide the student through the set of three questions regarding their work on the project during the last week (sprint)." + "Steps are the indicator of your current task in the conversation with the student. Your current step is {step}. Just follow the instructions and focus on the current step." - + "If your step is 0: greet the student and ask about the overall progress on the project." - + "If your step is 1: ask the student about the challenges faced during the sprint reffering to what he saied about progress." - + "If your step is 2: ask about the plan for the next sprint." - + "If your step is >2: continue the conversation trying to assist the student.", + + "If your step is 0: greet the student and say you are happy to start the reflective session." + + "If your step is 1: ask the student about the overall progress on the project." + + "If your step is 2: ask the student about the challenges faced during the sprint reffering to what he saied about progress." + + "If your step is 3: ask about the plan for the next sprint." + + "If your step is >3: continue the conversation trying to assist the student.", ), MessagesPlaceholder(variable_name="messages"), ] @@ -60,7 +61,7 @@ class State(TypedDict): token_counter=model, include_system=True, allow_partial=False, - start_on="human", + start_on="human", # TODO: change to "system" ) @@ -78,21 +79,6 @@ def call_model(state: State): app = workflow.compile(checkpointer=memory) -def start_chat(input_message: str): - messages = [HumanMessage(input_message)] - state = State(messages=messages, step=0) - thread_id = "chat_" + str(randint(0, 9999)) - config = {"configurable": {"thread_id": thread_id}} - - output = app.invoke( - {"messages": state["messages"], "step": state["step"]}, - config, - ) - - state["messages"] += output.get("messages", []) - return {"thread_id": thread_id, "state": state, "response": output} - - def chat(thread_id: str, input_message: str, state: State): config = {"configurable": {"thread_id": thread_id}} # append the new human message to the conversation From 19bcd9f44d1e030a4eb7dfb1152e0973da2f00d5 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 18 Nov 2024 10:16:37 +0100 Subject: [PATCH 03/70] Update chat logic --- .../de/tum/in/www1/hephaestus/chat/Chat.java | 33 +++++++ .../www1/hephaestus/chat/ChatController.java | 33 +++++++ .../tum/in/www1/hephaestus/chat/ChatDTO.java | 23 +++++ .../www1/hephaestus/chat/ChatRepository.java | 42 +++++++++ .../in/www1/hephaestus/chat/ChatService.java | 44 +++++++++ .../model/ChatRequest.java | 91 +++++++------------ .../model/ChatResponse.java | 91 +++++++------------ server/intelligence-service/app/main.py | 40 +++----- server/intelligence-service/openapi.yaml | 30 +++--- 9 files changed, 268 insertions(+), 159 deletions(-) create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatRepository.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatService.java diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java new file mode 100644 index 00000000..8f106a99 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java @@ -0,0 +1,33 @@ +package de.tum.in.www1.hephaestus.chat; + +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import jakarta.persistence.*; +import de.tum.in.www1.hephaestus.chat.message.Message; +import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; +import de.tum.in.www1.hephaestus.gitprovider.user.User; + + +@Entity +@Table(name = "chat") +@Getter +@Setter +@ToString(callSuper = true) +@NoArgsConstructor +public class Chat extends BaseGitServiceEntity { + + @OrderColumn(name = "message_order") + @OneToMany(mappedBy = "chat") + private List messages = new ArrayList<>(); + + @Column(name = "creation_date") + private ZonedDateTime creationDate = ZonedDateTime.now(); + + @OneToOne + private User user; +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java new file mode 100644 index 00000000..c79e86b3 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java @@ -0,0 +1,33 @@ +package de.tum.in.www1.hephaestus.chat; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import de.tum.in.www1.hephaestus.gitprovider.user.User; + +import org.springframework.http.ResponseEntity; + +@RestController +@RequestMapping("/chat") +public class ChatController { + + private final ChatService chatService; + + public ChatController(ChatService chatService) { + this.chatService = chatService; + } + + @PostMapping + public ResponseEntity createChat(@RequestBody User user) { + return ResponseEntity.ok(chatService.createChat(user)); + } + + @GetMapping + public ResponseEntity getChat(@PathVariable Long chatId) { + return ResponseEntity.ok(chatService.findChatById(chatId).get()); + } +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java new file mode 100644 index 00000000..c19d8548 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java @@ -0,0 +1,23 @@ +package de.tum.in.www1.hephaestus.chat; + +import java.time.ZonedDateTime; + +import org.springframework.lang.NonNull; +import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.List; + +import de.tum.in.www1.hephaestus.chat.message.Message; +import de.tum.in.www1.hephaestus.gitprovider.user.User; + + +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public record ChatDTO ( + @NonNull Long id, + @NonNull List messages, + @NonNull User user, + @NonNull ZonedDateTime creationDate){ + + public ChatDTO(Chat chat) { + this(chat.getId(), chat.getMessages(), chat.getUser(), chat.getCreationDate()); + } + } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatRepository.java new file mode 100644 index 00000000..20770259 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatRepository.java @@ -0,0 +1,42 @@ +package de.tum.in.www1.hephaestus.chat; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; +import jakarta.persistence.EntityNotFoundException; +import jakarta.validation.constraints.NotNull; +import org.springframework.stereotype.Repository; + +@Repository +public interface ChatRepository extends JpaRepository { + + @Query(""" + SELECT c + FROM Chat c + LEFT JOIN FETCH c.messages m + WHERE c.id = :chatId + """) + Optional findByIdWithMessages(@Param("chatId") long chatId); + + @Query(""" + SELECT c + FROM Chat c + LEFT JOIN FETCH c.messages m + LEFT JOIN FETCH m.content content + WHERE c.id = :chatId + """) + Chat findByIdWithMessagesAndContents(@Param("chatId") long chatId); + + private Chat getValueElseThrow(Optional optional, long chatId) { + return optional.orElseThrow(() -> + new EntityNotFoundException("Chat entity with id " + chatId + " was not found.") + ); + } + + @NotNull + default Chat findByIdWithMessagesElseThrow(long chatId) throws EntityNotFoundException { + return getValueElseThrow(findByIdWithMessages(chatId), chatId); + } +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatService.java new file mode 100644 index 00000000..17433a7f --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatService.java @@ -0,0 +1,44 @@ +package de.tum.in.www1.hephaestus.chat; + +import org.springframework.stereotype.Service; + +import de.tum.in.www1.hephaestus.gitprovider.user.User; +import java.time.OffsetDateTime; +import java.util.Optional; + +/** + * Service for managing chats. + */ +@Service +public class ChatService { + + private final ChatRepository chatRepository; + + public ChatService(ChatRepository chatRepository) { + this.chatRepository = chatRepository; + } + + /** + * Creates a new chat for the given user. + * + * @param user The user the chat belongs to + * @return The created chat + */ + public ChatDTO createChat(User user) { + Chat chat = new Chat(); + chat.setUser(user); + chat.setCreatedAt(OffsetDateTime.now()); + return new ChatDTO(chatRepository.save(chat)); + } + + /** + * Finds a chat by its ID. + * + * @param chatId The ID of the chat to find + * @return The chat entity if found, otherwise throws an exception + */ + public Optional findChatById(Long chatId) { + return chatRepository.findById(chatId).map(ChatDTO::new); + } + +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java index 2a35c7bd..1983f041 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java @@ -20,10 +20,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.annotation.JsonValue; -import org.openapitools.jackson.nullable.JsonNullable; -import com.fasterxml.jackson.annotation.JsonIgnore; -import org.openapitools.jackson.nullable.JsonNullable; -import java.util.NoSuchElementException; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonTypeName; import org.hibernate.validator.constraints.*; @@ -32,76 +28,68 @@ * ChatRequest */ @JsonPropertyOrder({ - ChatRequest.JSON_PROPERTY_MESSAGE, - ChatRequest.JSON_PROPERTY_THREAD_ID + ChatRequest.JSON_PROPERTY_CHAT_ID, + ChatRequest.JSON_PROPERTY_MESSAGE_CONTENT }) @jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0") public class ChatRequest { - public static final String JSON_PROPERTY_MESSAGE = "message"; - private String message; + public static final String JSON_PROPERTY_CHAT_ID = "chat_id"; + private String chatId; - public static final String JSON_PROPERTY_THREAD_ID = "thread_id"; - private JsonNullable threadId = JsonNullable.undefined(); + public static final String JSON_PROPERTY_MESSAGE_CONTENT = "message_content"; + private String messageContent; public ChatRequest() { } - public ChatRequest message(String message) { + public ChatRequest chatId(String chatId) { - this.message = message; + this.chatId = chatId; return this; } /** - * Get message - * @return message + * Get chatId + * @return chatId */ @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_MESSAGE) + @JsonProperty(JSON_PROPERTY_CHAT_ID) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getMessage() { - return message; + public String getChatId() { + return chatId; } - @JsonProperty(JSON_PROPERTY_MESSAGE) + @JsonProperty(JSON_PROPERTY_CHAT_ID) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setMessage(String message) { - this.message = message; + public void setChatId(String chatId) { + this.chatId = chatId; } - public ChatRequest threadId(String threadId) { - this.threadId = JsonNullable.of(threadId); + public ChatRequest messageContent(String messageContent) { + this.messageContent = messageContent; return this; } /** - * Get threadId - * @return threadId + * Get messageContent + * @return messageContent */ - @jakarta.annotation.Nullable - @JsonIgnore + @jakarta.annotation.Nonnull + @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) + @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getThreadId() { - return threadId.orElse(null); + public String getMessageContent() { + return messageContent; } - @JsonProperty(JSON_PROPERTY_THREAD_ID) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - - public JsonNullable getThreadId_JsonNullable() { - return threadId; - } - - @JsonProperty(JSON_PROPERTY_THREAD_ID) - public void setThreadId_JsonNullable(JsonNullable threadId) { - this.threadId = threadId; - } - public void setThreadId(String threadId) { - this.threadId = JsonNullable.of(threadId); + @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; } @Override @@ -113,32 +101,21 @@ public boolean equals(Object o) { return false; } ChatRequest chatRequest = (ChatRequest) o; - return Objects.equals(this.message, chatRequest.message) && - equalsNullable(this.threadId, chatRequest.threadId); - } - - private static boolean equalsNullable(JsonNullable a, JsonNullable b) { - return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get())); + return Objects.equals(this.chatId, chatRequest.chatId) && + Objects.equals(this.messageContent, chatRequest.messageContent); } @Override public int hashCode() { - return Objects.hash(message, hashCodeNullable(threadId)); - } - - private static int hashCodeNullable(JsonNullable a) { - if (a == null) { - return 1; - } - return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31; + return Objects.hash(chatId, messageContent); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class ChatRequest {\n"); - sb.append(" message: ").append(toIndentedString(message)).append("\n"); - sb.append(" threadId: ").append(toIndentedString(threadId)).append("\n"); + sb.append(" chatId: ").append(toIndentedString(chatId)).append("\n"); + sb.append(" messageContent: ").append(toIndentedString(messageContent)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java index 5f615747..a6f7e5fd 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java @@ -20,10 +20,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.annotation.JsonValue; -import org.openapitools.jackson.nullable.JsonNullable; -import com.fasterxml.jackson.annotation.JsonIgnore; -import org.openapitools.jackson.nullable.JsonNullable; -import java.util.NoSuchElementException; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonTypeName; import org.hibernate.validator.constraints.*; @@ -32,76 +28,68 @@ * ChatResponse */ @JsonPropertyOrder({ - ChatResponse.JSON_PROPERTY_RESPONSE, - ChatResponse.JSON_PROPERTY_THREAD_ID + ChatResponse.JSON_PROPERTY_CHAT_ID, + ChatResponse.JSON_PROPERTY_MESSAGE_CONTENT }) @jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0") public class ChatResponse { - public static final String JSON_PROPERTY_RESPONSE = "response"; - private String response; + public static final String JSON_PROPERTY_CHAT_ID = "chat_id"; + private String chatId; - public static final String JSON_PROPERTY_THREAD_ID = "thread_id"; - private JsonNullable threadId = JsonNullable.undefined(); + public static final String JSON_PROPERTY_MESSAGE_CONTENT = "message_content"; + private String messageContent; public ChatResponse() { } - public ChatResponse response(String response) { + public ChatResponse chatId(String chatId) { - this.response = response; + this.chatId = chatId; return this; } /** - * Get response - * @return response + * Get chatId + * @return chatId */ @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_RESPONSE) + @JsonProperty(JSON_PROPERTY_CHAT_ID) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getResponse() { - return response; + public String getChatId() { + return chatId; } - @JsonProperty(JSON_PROPERTY_RESPONSE) + @JsonProperty(JSON_PROPERTY_CHAT_ID) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setResponse(String response) { - this.response = response; + public void setChatId(String chatId) { + this.chatId = chatId; } - public ChatResponse threadId(String threadId) { - this.threadId = JsonNullable.of(threadId); + public ChatResponse messageContent(String messageContent) { + this.messageContent = messageContent; return this; } /** - * Get threadId - * @return threadId + * Get messageContent + * @return messageContent */ - @jakarta.annotation.Nullable - @JsonIgnore + @jakarta.annotation.Nonnull + @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) + @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getThreadId() { - return threadId.orElse(null); + public String getMessageContent() { + return messageContent; } - @JsonProperty(JSON_PROPERTY_THREAD_ID) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - - public JsonNullable getThreadId_JsonNullable() { - return threadId; - } - - @JsonProperty(JSON_PROPERTY_THREAD_ID) - public void setThreadId_JsonNullable(JsonNullable threadId) { - this.threadId = threadId; - } - public void setThreadId(String threadId) { - this.threadId = JsonNullable.of(threadId); + @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; } @Override @@ -113,32 +101,21 @@ public boolean equals(Object o) { return false; } ChatResponse chatResponse = (ChatResponse) o; - return Objects.equals(this.response, chatResponse.response) && - equalsNullable(this.threadId, chatResponse.threadId); - } - - private static boolean equalsNullable(JsonNullable a, JsonNullable b) { - return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get())); + return Objects.equals(this.chatId, chatResponse.chatId) && + Objects.equals(this.messageContent, chatResponse.messageContent); } @Override public int hashCode() { - return Objects.hash(response, hashCodeNullable(threadId)); - } - - private static int hashCodeNullable(JsonNullable a) { - if (a == null) { - return 1; - } - return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31; + return Objects.hash(chatId, messageContent); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class ChatResponse {\n"); - sb.append(" response: ").append(toIndentedString(response)).append("\n"); - sb.append(" threadId: ").append(toIndentedString(threadId)).append("\n"); + sb.append(" chatId: ").append(toIndentedString(chatId)).append("\n"); + sb.append(" messageContent: ").append(toIndentedString(messageContent)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 986a4cdb..ebad22c2 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -1,7 +1,6 @@ -from fastapi import FastAPI, HTTPException +from fastapi import FastAPI from pydantic import BaseModel -from .model import start_chat as start_chat_function, chat as chat_function -from typing import Dict, Optional +from .model import chat app = FastAPI( title="Hephaestus Intelligence Service API", @@ -10,18 +9,14 @@ contact={"name": "Felix T.J. Dietrich", "email": "felixtj.dietrich@tum.de"}, ) -# Global dictionary to store conversation states -conversations: Dict[str, dict] = {} - - class ChatRequest(BaseModel): - message: str - thread_id: Optional[str] = None + chat_id: str + message_content: str class ChatResponse(BaseModel): - response: str - thread_id: Optional[str] = None + chat_id: str + message_content: str @app.post( @@ -30,23 +25,10 @@ class ChatResponse(BaseModel): summary="Start and continue a chat session with an LLM.", ) async def chat(request: ChatRequest): - if request.thread_id is None: - # Start a new chat session - result = start_chat_function(request.message) - thread_id = result["thread_id"] - state = result["state"] - response_message = result["response"]["messages"][-1].content - conversations[thread_id] = state - return ChatResponse(thread_id=thread_id, response=response_message) - else: - thread_id = request.thread_id - # Check if the thread_id exists - if thread_id not in conversations: - raise HTTPException(status_code=404, detail="Thread ID not found") - state = conversations[thread_id] - user_input = request.message - result = chat_function(thread_id, user_input, state) + # TODO: Add state management when implementing more complex chat logic + state = 0 + user_input = request.message_content + result = chat(request.chat_id, user_input, state) state = result["state"] response_message = result["response"]["messages"][-1].content - conversations[thread_id] = state - return ChatResponse(response=response_message) + return ChatResponse(chat_id=request.chat_id, message_content=response_message) \ No newline at end of file diff --git a/server/intelligence-service/openapi.yaml b/server/intelligence-service/openapi.yaml index 0f802b7e..a42f9d9c 100644 --- a/server/intelligence-service/openapi.yaml +++ b/server/intelligence-service/openapi.yaml @@ -2,30 +2,28 @@ components: schemas: ChatRequest: properties: - message: - title: Message + chat_id: + title: Chat Id + type: string + message_content: + title: Message Content type: string - thread_id: - anyOf: - - type: string - - type: 'null' - title: Thread Id required: - - message + - chat_id + - message_content title: ChatRequest type: object ChatResponse: properties: - response: - title: Response + chat_id: + title: Chat Id + type: string + message_content: + title: Message Content type: string - thread_id: - anyOf: - - type: string - - type: 'null' - title: Thread Id required: - - response + - chat_id + - message_content title: ChatResponse type: object HTTPValidationError: From 811800f134adfd319378187549488a01987f071f Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 19 Nov 2024 09:38:25 +0100 Subject: [PATCH 04/70] Fix openai generation error --- .../java/de/tum/in/www1/hephaestus/chat/Chat.java | 2 ++ .../tum/in/www1/hephaestus/chat/ChatController.java | 11 +++++++---- .../java/de/tum/in/www1/hephaestus/chat/ChatDTO.java | 6 +++--- .../tum/in/www1/hephaestus/chat/message/Message.java | 3 +-- .../in/www1/hephaestus/chat/message/MessageDTO.java | 6 ++++-- .../www1/hephaestus/chat/message/MessageService.java | 10 +++++----- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java index 8f106a99..33509c26 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java @@ -12,6 +12,8 @@ import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; import de.tum.in.www1.hephaestus.gitprovider.user.User; +import java.util.Optional; + @Entity @Table(name = "chat") diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java index c79e86b3..a0612e9d 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java @@ -7,8 +7,9 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import de.tum.in.www1.hephaestus.gitprovider.user.User; +import java.util.Optional; +import de.tum.in.www1.hephaestus.gitprovider.user.User; import org.springframework.http.ResponseEntity; @RestController @@ -23,11 +24,13 @@ public ChatController(ChatService chatService) { @PostMapping public ResponseEntity createChat(@RequestBody User user) { - return ResponseEntity.ok(chatService.createChat(user)); + ChatDTO chat = chatService.createChat(user); + return ResponseEntity.ok(chat); } - @GetMapping + @GetMapping("/chat/{chatId}") public ResponseEntity getChat(@PathVariable Long chatId) { - return ResponseEntity.ok(chatService.findChatById(chatId).get()); + Optional chat = chatService.findChatById(chatId); + return ResponseEntity.ok(chat.get()); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java index c19d8548..c150ffd3 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java @@ -7,17 +7,17 @@ import java.util.List; import de.tum.in.www1.hephaestus.chat.message.Message; -import de.tum.in.www1.hephaestus.gitprovider.user.User; +import de.tum.in.www1.hephaestus.gitprovider.user.UserInfoDTO; @JsonInclude(JsonInclude.Include.NON_EMPTY) public record ChatDTO ( @NonNull Long id, @NonNull List messages, - @NonNull User user, + @NonNull UserInfoDTO user, @NonNull ZonedDateTime creationDate){ public ChatDTO(Chat chat) { - this(chat.getId(), chat.getMessages(), chat.getUser(), chat.getCreationDate()); + this(chat.getId(), chat.getMessages(), UserInfoDTO.fromUser(chat.getUser()), chat.getCreationDate()); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index 3e7250f3..0dd4d308 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -11,7 +11,6 @@ import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; import de.tum.in.www1.hephaestus.chat.Chat; - @Entity @Table(name = "message") @Getter @@ -32,7 +31,7 @@ public class Message extends BaseGitServiceEntity { private String content; @NonNull - @ManyToOne(optional = false) + @ManyToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "chat_id") private Chat chat; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java index 42f5a80c..57182345 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.annotation.JsonInclude; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; +import de.tum.in.www1.hephaestus.chat.Chat; + @JsonInclude(JsonInclude.Include.NON_EMPTY) public record MessageDTO( @@ -13,7 +15,7 @@ public record MessageDTO( @NonNull ZonedDateTime sentAt, @NonNull MessageSender sender, @NonNull String content, - @NonNull Long chatId) { + @NonNull Chat chat) { public MessageDTO(Message message) { this( @@ -21,6 +23,6 @@ public MessageDTO(Message message) { message.getSentAt(), message.getSender(), message.getContent(), - message.getChat().getId()); + message.getChat()); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 23f07ea9..b99f1a92 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -33,26 +33,26 @@ public MessageService(ChatRepository chatRepository, MessageRepository messageRe * Sends a message, saves it, and generates a bot response. */ public MessageDTO sendMessage(MessageDTO messageDTO) { - Chat chat = chatRepository.findById(messageDTO.chatId()) + Chat chat = chatRepository.findById(messageDTO.chat().getId()) .orElseThrow(() -> new IllegalArgumentException("Chat not found")); Message userMessage = new Message(ZonedDateTime.now(), MessageSender.USER, messageDTO.content(), chat); messageRepository.save(userMessage); - String systemResponse = generateResponse(messageDTO.chatId(), messageDTO.content()); + String systemResponse = generateResponse(messageDTO.chat(), messageDTO.content()); Message systemMessage = new Message(ZonedDateTime.now(), MessageSender.SYSTEM, systemResponse, chat); messageRepository.save(systemMessage); - return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), systemMessage.getContent(), systemMessage.getChat().getId()); + return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), systemMessage.getContent(), systemMessage.getChat()); } /** * Calls the Python FastAPI service to generate a bot response. */ - private String generateResponse(Long chatId, String messageContent) { + private String generateResponse(Chat chat, String messageContent) { ChatRequest chatRequest = new ChatRequest(); - chatRequest.setChatId(chatId.toString()); + chatRequest.setChatId(chat.getId().toString()); chatRequest.setMessageContent(messageContent); try { From 7ac6de2135c3bdf932e4cb48213848a307b1f7a1 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 19 Nov 2024 09:45:43 +0100 Subject: [PATCH 05/70] Delete unused imports --- .../src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java index 33509c26..8f106a99 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java @@ -12,8 +12,6 @@ import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; import de.tum.in.www1.hephaestus.gitprovider.user.User; -import java.util.Optional; - @Entity @Table(name = "chat") From 945bc30c7d5cab960531524fa99712ee1b75d16e Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 19 Nov 2024 09:47:17 +0100 Subject: [PATCH 06/70] Add chat and message --- .../hephaestus/ClassImportIntegratorIntegratorProvider.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java index d3180a5d..d7491412 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java @@ -14,6 +14,8 @@ import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewInfoDTO; import de.tum.in.www1.hephaestus.gitprovider.repository.RepositoryInfoDTO; import de.tum.in.www1.hephaestus.gitprovider.user.UserInfoDTO; +import de.tum.in.www1.hephaestus.chat.ChatDTO; +import de.tum.in.www1.hephaestus.chat.message.MessageDTO; import io.hypersistence.utils.hibernate.type.util.ClassImportIntegrator; public class ClassImportIntegratorIntegratorProvider implements IntegratorProvider { @@ -31,6 +33,8 @@ public List getIntegrators() { classes.add(IssueCommentInfoDTO.class); classes.add(PullRequestReviewInfoDTO.class); classes.add(RepositoryInfoDTO.class); + classes.add(MessageDTO.class); + classes.add(ChatDTO.class); return List.of(new ClassImportIntegrator(classes)); } From 4a5c2873bca068d39447719badd3dddb378d200c Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 19 Nov 2024 12:21:13 +0100 Subject: [PATCH 07/70] Rename chat to session --- server/application-server/openapi.yaml | 99 +++++++++++++++++++ ...assImportIntegratorIntegratorProvider.java | 4 +- .../www1/hephaestus/chat/ChatController.java | 36 ------- .../www1/hephaestus/chat/ChatRepository.java | 42 -------- .../in/www1/hephaestus/chat/ChatService.java | 44 --------- .../chat/{Chat.java => Session.java} | 6 +- .../hephaestus/chat/SessionController.java | 36 +++++++ .../chat/{ChatDTO.java => SessionDTO.java} | 6 +- .../hephaestus/chat/SessionRepository.java | 42 ++++++++ .../www1/hephaestus/chat/SessionService.java | 44 +++++++++ .../www1/hephaestus/chat/message/Message.java | 6 +- .../chat/message/MessageController.java | 1 + .../hephaestus/chat/message/MessageDTO.java | 6 +- .../chat/message/MessageRepository.java | 4 +- .../chat/message/MessageService.java | 35 ++++--- .../model/ChatRequest.java | 58 +++++------ .../model/ChatResponse.java | 58 +++++------ server/intelligence-service/app/main.py | 8 +- server/intelligence-service/openapi.yaml | 16 +-- 19 files changed, 325 insertions(+), 226 deletions(-) delete mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java delete mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatRepository.java delete mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatService.java rename server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/{Chat.java => Session.java} (86%) create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java rename server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/{ChatDTO.java => SessionDTO.java} (71%) create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index c9fb4d0e..726ce372 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -13,6 +13,42 @@ servers: - url: / description: Default Server URL paths: + /session: + post: + tags: + - session + operationId: createSession + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/User" + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/Session" + /message: + post: + tags: + - message + operationId: sendMessage + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/MessageDTO" + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/Message" /user/{login}/profile: get: tags: @@ -31,6 +67,25 @@ paths: application/json: schema: $ref: "#/components/schemas/UserProfile" + /session/session/{sessionId}: + get: + tags: + - session + operationId: getSession + parameters: + - name: sessionId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/Session" /meta: get: tags: @@ -181,6 +236,30 @@ components: type: string color: type: string + Message: + required: + - content + - id + - sender + - sentAt + - session + type: object + properties: + id: + type: integer + format: int64 + sentAt: + type: string + format: date-time + sender: + type: string + enum: + - SYSTEM + - USER + content: + type: string + session: + $ref: "#/components/schemas/Session" UserProfile: required: - contributedRepositories @@ -379,3 +458,23 @@ components: numberOfCodeComments: type: integer format: int32 + Session: + required: + - creationDate + - id + - messages + - user + type: object + properties: + id: + type: integer + format: int64 + messages: + type: array + items: + $ref: "#/components/schemas/Message" + user: + $ref: "#/components/schemas/UserInfo" + creationDate: + type: string + format: date-time diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java index d7491412..b0db905b 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java @@ -14,7 +14,7 @@ import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewInfoDTO; import de.tum.in.www1.hephaestus.gitprovider.repository.RepositoryInfoDTO; import de.tum.in.www1.hephaestus.gitprovider.user.UserInfoDTO; -import de.tum.in.www1.hephaestus.chat.ChatDTO; +import de.tum.in.www1.hephaestus.chat.SessionDTO; import de.tum.in.www1.hephaestus.chat.message.MessageDTO; import io.hypersistence.utils.hibernate.type.util.ClassImportIntegrator; @@ -34,7 +34,7 @@ public List getIntegrators() { classes.add(PullRequestReviewInfoDTO.class); classes.add(RepositoryInfoDTO.class); classes.add(MessageDTO.class); - classes.add(ChatDTO.class); + classes.add(SessionDTO.class); return List.of(new ClassImportIntegrator(classes)); } diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java deleted file mode 100644 index a0612e9d..00000000 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatController.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.tum.in.www1.hephaestus.chat; - -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; - -import java.util.Optional; - -import de.tum.in.www1.hephaestus.gitprovider.user.User; -import org.springframework.http.ResponseEntity; - -@RestController -@RequestMapping("/chat") -public class ChatController { - - private final ChatService chatService; - - public ChatController(ChatService chatService) { - this.chatService = chatService; - } - - @PostMapping - public ResponseEntity createChat(@RequestBody User user) { - ChatDTO chat = chatService.createChat(user); - return ResponseEntity.ok(chat); - } - - @GetMapping("/chat/{chatId}") - public ResponseEntity getChat(@PathVariable Long chatId) { - Optional chat = chatService.findChatById(chatId); - return ResponseEntity.ok(chat.get()); - } -} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatRepository.java deleted file mode 100644 index 20770259..00000000 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatRepository.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.tum.in.www1.hephaestus.chat; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.Optional; -import jakarta.persistence.EntityNotFoundException; -import jakarta.validation.constraints.NotNull; -import org.springframework.stereotype.Repository; - -@Repository -public interface ChatRepository extends JpaRepository { - - @Query(""" - SELECT c - FROM Chat c - LEFT JOIN FETCH c.messages m - WHERE c.id = :chatId - """) - Optional findByIdWithMessages(@Param("chatId") long chatId); - - @Query(""" - SELECT c - FROM Chat c - LEFT JOIN FETCH c.messages m - LEFT JOIN FETCH m.content content - WHERE c.id = :chatId - """) - Chat findByIdWithMessagesAndContents(@Param("chatId") long chatId); - - private Chat getValueElseThrow(Optional optional, long chatId) { - return optional.orElseThrow(() -> - new EntityNotFoundException("Chat entity with id " + chatId + " was not found.") - ); - } - - @NotNull - default Chat findByIdWithMessagesElseThrow(long chatId) throws EntityNotFoundException { - return getValueElseThrow(findByIdWithMessages(chatId), chatId); - } -} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatService.java deleted file mode 100644 index 17433a7f..00000000 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatService.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.tum.in.www1.hephaestus.chat; - -import org.springframework.stereotype.Service; - -import de.tum.in.www1.hephaestus.gitprovider.user.User; -import java.time.OffsetDateTime; -import java.util.Optional; - -/** - * Service for managing chats. - */ -@Service -public class ChatService { - - private final ChatRepository chatRepository; - - public ChatService(ChatRepository chatRepository) { - this.chatRepository = chatRepository; - } - - /** - * Creates a new chat for the given user. - * - * @param user The user the chat belongs to - * @return The created chat - */ - public ChatDTO createChat(User user) { - Chat chat = new Chat(); - chat.setUser(user); - chat.setCreatedAt(OffsetDateTime.now()); - return new ChatDTO(chatRepository.save(chat)); - } - - /** - * Finds a chat by its ID. - * - * @param chatId The ID of the chat to find - * @return The chat entity if found, otherwise throws an exception - */ - public Optional findChatById(Long chatId) { - return chatRepository.findById(chatId).map(ChatDTO::new); - } - -} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java similarity index 86% rename from server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java rename to server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java index 8f106a99..4ba01fff 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Chat.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java @@ -14,15 +14,15 @@ @Entity -@Table(name = "chat") +@Table(name = "session") @Getter @Setter @ToString(callSuper = true) @NoArgsConstructor -public class Chat extends BaseGitServiceEntity { +public class Session extends BaseGitServiceEntity { @OrderColumn(name = "message_order") - @OneToMany(mappedBy = "chat") + @OneToMany(mappedBy = "session") private List messages = new ArrayList<>(); @Column(name = "creation_date") diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java new file mode 100644 index 00000000..69db745e --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java @@ -0,0 +1,36 @@ +package de.tum.in.www1.hephaestus.chat; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.Optional; + +import de.tum.in.www1.hephaestus.gitprovider.user.User; +import org.springframework.http.ResponseEntity; + +@RestController +@RequestMapping("/session") +public class SessionController { + + private final SessionService sessionService; + + public SessionController(SessionService sessionService) { + this.sessionService = sessionService; + } + + @PostMapping + public ResponseEntity createSession(@RequestBody User user) { + SessionDTO session = sessionService.createSession(user); + return ResponseEntity.ok(session); + } + + @GetMapping("/session/{sessionId}") + public ResponseEntity getSession(@PathVariable Long sessionId) { + Optional session = sessionService.findSessionById(sessionId); + return ResponseEntity.ok(session.get()); + } +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java similarity index 71% rename from server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java rename to server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java index c150ffd3..5f1dac38 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/ChatDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java @@ -11,13 +11,13 @@ @JsonInclude(JsonInclude.Include.NON_EMPTY) -public record ChatDTO ( +public record SessionDTO ( @NonNull Long id, @NonNull List messages, @NonNull UserInfoDTO user, @NonNull ZonedDateTime creationDate){ - public ChatDTO(Chat chat) { - this(chat.getId(), chat.getMessages(), UserInfoDTO.fromUser(chat.getUser()), chat.getCreationDate()); + public SessionDTO(Session session) { + this(session.getId(), session.getMessages(), UserInfoDTO.fromUser(session.getUser()), session.getCreationDate()); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java new file mode 100644 index 00000000..7824048d --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java @@ -0,0 +1,42 @@ +package de.tum.in.www1.hephaestus.chat; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; +import jakarta.persistence.EntityNotFoundException; +import jakarta.validation.constraints.NotNull; +import org.springframework.stereotype.Repository; + +@Repository +public interface SessionRepository extends JpaRepository { + + @Query(""" + SELECT s + FROM Session s + LEFT JOIN FETCH s.messages m + WHERE s.id = :sessionId + """) + Optional findByIdWithMessages(@Param("sessionId") long sessionId); + + @Query(""" + SELECT s + FROM Session s + LEFT JOIN FETCH s.messages m + LEFT JOIN FETCH m.content c + WHERE s.id = :sessionId + """) + Session findByIdWithMessagesAndContents(@Param("sessionId") long sessionId); + + private Session getValueElseThrow(Optional optional, long sessionId) { + return optional.orElseThrow(() -> + new EntityNotFoundException("Session entity with id " + sessionId + " was not found.") + ); + } + + @NotNull + default Session findByIdWithMessagesElseThrow(long sessionId) throws EntityNotFoundException { + return getValueElseThrow(findByIdWithMessages(sessionId), sessionId); + } +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java new file mode 100644 index 00000000..5a6e43f3 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java @@ -0,0 +1,44 @@ +package de.tum.in.www1.hephaestus.chat; + +import org.springframework.stereotype.Service; + +import de.tum.in.www1.hephaestus.gitprovider.user.User; +import java.time.OffsetDateTime; +import java.util.Optional; + +/** + * Service for managing sessions. + */ +@Service +public class SessionService { + + private final SessionRepository sessionRepository; + + public SessionService(SessionRepository sessionRepository) { + this.sessionRepository = sessionRepository; + } + + /** + * Creates a new session for the given user. + * + * @param user The user the session belongs to + * @return The created session + */ + public SessionDTO createSession(User user) { + Session session = new Session(); + session.setUser(user); + session.setCreatedAt(OffsetDateTime.now()); + return new SessionDTO(sessionRepository.save(session)); + } + + /** + * Finds a session by its ID. + * + * @param sessionId The ID of the session to find + * @return The session entity if found, otherwise throws an exception + */ + public Optional findSessionById(Long sessionId) { + return sessionRepository.findById(sessionId).map(SessionDTO::new); + } + +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index 0dd4d308..b61148ec 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -9,7 +9,7 @@ import org.springframework.lang.NonNull; import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; -import de.tum.in.www1.hephaestus.chat.Chat; +import de.tum.in.www1.hephaestus.chat.Session; @Entity @Table(name = "message") @@ -32,8 +32,8 @@ public class Message extends BaseGitServiceEntity { @NonNull @ManyToOne(optional = false, fetch = FetchType.LAZY) - @JoinColumn(name = "chat_id") - private Chat chat; + @JoinColumn(name = "session_id") + private Session session; public enum MessageSender { SYSTEM, USER diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java index 695fece2..bc91a8a9 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java @@ -15,6 +15,7 @@ public MessageController(MessageService messageService) { this.messageService = messageService; } + // TODO: Pathvariable with session_id @PostMapping public ResponseEntity sendMessage(@RequestBody MessageDTO messageDTO) { MessageDTO savedMessage = messageService.sendMessage(messageDTO); diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java index 57182345..0cd4011f 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; -import de.tum.in.www1.hephaestus.chat.Chat; +import de.tum.in.www1.hephaestus.chat.SessionDTO; @JsonInclude(JsonInclude.Include.NON_EMPTY) @@ -15,7 +15,7 @@ public record MessageDTO( @NonNull ZonedDateTime sentAt, @NonNull MessageSender sender, @NonNull String content, - @NonNull Chat chat) { + @NonNull SessionDTO session) { public MessageDTO(Message message) { this( @@ -23,6 +23,6 @@ public MessageDTO(Message message) { message.getSentAt(), message.getSender(), message.getContent(), - message.getChat()); + new SessionDTO(message.getSession())); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java index f9d58d8e..e084966f 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java @@ -7,6 +7,6 @@ @Repository public interface MessageRepository extends JpaRepository { - List findByChatId(Long chatId); - List findByChatIdAndContentContaining(Long chatId, String keyword); + List findBySessionId(Long sessionId); + List findBySessionIdAndContentContaining(Long sessionId, String keyword); } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index b99f1a92..122ea088 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -4,14 +4,13 @@ import org.springframework.stereotype.Service; -import de.tum.in.www1.hephaestus.chat.Chat; +import de.tum.in.www1.hephaestus.chat.Session; +import de.tum.in.www1.hephaestus.chat.SessionDTO; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; import de.tum.in.www1.hephaestus.intelligenceservice.api.DefaultApi; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatRequest; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatResponse; -import de.tum.in.www1.hephaestus.chat.ChatRepository; - - +import de.tum.in.www1.hephaestus.chat.SessionRepository; /** * Service for managing messages. @@ -19,44 +18,44 @@ @Service public class MessageService { - private final ChatRepository chatRepository; + private final SessionRepository sessionRepository; private final MessageRepository messageRepository; - private final DefaultApi chatApiClient; + private final DefaultApi sessionApiClient; - public MessageService(ChatRepository chatRepository, MessageRepository messageRepository) { - this.chatRepository = chatRepository; + public MessageService(SessionRepository sessionRepository, MessageRepository messageRepository) { + this.sessionRepository = sessionRepository; this.messageRepository = messageRepository; - this.chatApiClient = new DefaultApi(); + this.sessionApiClient = new DefaultApi(); } /** * Sends a message, saves it, and generates a bot response. */ public MessageDTO sendMessage(MessageDTO messageDTO) { - Chat chat = chatRepository.findById(messageDTO.chat().getId()) - .orElseThrow(() -> new IllegalArgumentException("Chat not found")); + Session session = sessionRepository.findById(messageDTO.session().id()) + .orElseThrow(() -> new IllegalArgumentException("Session not found")); - Message userMessage = new Message(ZonedDateTime.now(), MessageSender.USER, messageDTO.content(), chat); + Message userMessage = new Message(ZonedDateTime.now(), MessageSender.USER, messageDTO.content(), session); messageRepository.save(userMessage); - String systemResponse = generateResponse(messageDTO.chat(), messageDTO.content()); + String systemResponse = generateResponse(messageDTO.session(), messageDTO.content()); - Message systemMessage = new Message(ZonedDateTime.now(), MessageSender.SYSTEM, systemResponse, chat); + Message systemMessage = new Message(ZonedDateTime.now(), MessageSender.SYSTEM, systemResponse, session); messageRepository.save(systemMessage); - return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), systemMessage.getContent(), systemMessage.getChat()); + return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), systemMessage.getContent(), new SessionDTO(systemMessage.getSession())); } /** * Calls the Python FastAPI service to generate a bot response. */ - private String generateResponse(Chat chat, String messageContent) { + private String generateResponse(SessionDTO session, String messageContent) { ChatRequest chatRequest = new ChatRequest(); - chatRequest.setChatId(chat.getId().toString()); + chatRequest.setSessionId(session.id().toString()); chatRequest.setMessageContent(messageContent); try { - ChatResponse chatResponse = chatApiClient.chatChatPost(chatRequest); + ChatResponse chatResponse = sessionApiClient.chatChatPost(chatRequest); return chatResponse.getMessageContent(); } catch (Exception e) { throw new RuntimeException("Error communicating with intelligence service: " + e.getMessage(), e); diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java index 1983f041..c2cef448 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java @@ -28,68 +28,68 @@ * ChatRequest */ @JsonPropertyOrder({ - ChatRequest.JSON_PROPERTY_CHAT_ID, - ChatRequest.JSON_PROPERTY_MESSAGE_CONTENT + ChatRequest.JSON_PROPERTY_MESSAGE_CONTENT, + ChatRequest.JSON_PROPERTY_SESSION_ID }) @jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0") public class ChatRequest { - public static final String JSON_PROPERTY_CHAT_ID = "chat_id"; - private String chatId; - public static final String JSON_PROPERTY_MESSAGE_CONTENT = "message_content"; private String messageContent; + public static final String JSON_PROPERTY_SESSION_ID = "session_id"; + private String sessionId; + public ChatRequest() { } - public ChatRequest chatId(String chatId) { + public ChatRequest messageContent(String messageContent) { - this.chatId = chatId; + this.messageContent = messageContent; return this; } /** - * Get chatId - * @return chatId + * Get messageContent + * @return messageContent */ @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_CHAT_ID) + @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getChatId() { - return chatId; + public String getMessageContent() { + return messageContent; } - @JsonProperty(JSON_PROPERTY_CHAT_ID) + @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setChatId(String chatId) { - this.chatId = chatId; + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; } - public ChatRequest messageContent(String messageContent) { + public ChatRequest sessionId(String sessionId) { - this.messageContent = messageContent; + this.sessionId = sessionId; return this; } /** - * Get messageContent - * @return messageContent + * Get sessionId + * @return sessionId */ @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) + @JsonProperty(JSON_PROPERTY_SESSION_ID) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getMessageContent() { - return messageContent; + public String getSessionId() { + return sessionId; } - @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) + @JsonProperty(JSON_PROPERTY_SESSION_ID) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setMessageContent(String messageContent) { - this.messageContent = messageContent; + public void setSessionId(String sessionId) { + this.sessionId = sessionId; } @Override @@ -101,21 +101,21 @@ public boolean equals(Object o) { return false; } ChatRequest chatRequest = (ChatRequest) o; - return Objects.equals(this.chatId, chatRequest.chatId) && - Objects.equals(this.messageContent, chatRequest.messageContent); + return Objects.equals(this.messageContent, chatRequest.messageContent) && + Objects.equals(this.sessionId, chatRequest.sessionId); } @Override public int hashCode() { - return Objects.hash(chatId, messageContent); + return Objects.hash(messageContent, sessionId); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class ChatRequest {\n"); - sb.append(" chatId: ").append(toIndentedString(chatId)).append("\n"); sb.append(" messageContent: ").append(toIndentedString(messageContent)).append("\n"); + sb.append(" sessionId: ").append(toIndentedString(sessionId)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java index a6f7e5fd..735f22cb 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java @@ -28,68 +28,68 @@ * ChatResponse */ @JsonPropertyOrder({ - ChatResponse.JSON_PROPERTY_CHAT_ID, - ChatResponse.JSON_PROPERTY_MESSAGE_CONTENT + ChatResponse.JSON_PROPERTY_MESSAGE_CONTENT, + ChatResponse.JSON_PROPERTY_SESSION_ID }) @jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0") public class ChatResponse { - public static final String JSON_PROPERTY_CHAT_ID = "chat_id"; - private String chatId; - public static final String JSON_PROPERTY_MESSAGE_CONTENT = "message_content"; private String messageContent; + public static final String JSON_PROPERTY_SESSION_ID = "session_id"; + private String sessionId; + public ChatResponse() { } - public ChatResponse chatId(String chatId) { + public ChatResponse messageContent(String messageContent) { - this.chatId = chatId; + this.messageContent = messageContent; return this; } /** - * Get chatId - * @return chatId + * Get messageContent + * @return messageContent */ @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_CHAT_ID) + @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getChatId() { - return chatId; + public String getMessageContent() { + return messageContent; } - @JsonProperty(JSON_PROPERTY_CHAT_ID) + @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setChatId(String chatId) { - this.chatId = chatId; + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; } - public ChatResponse messageContent(String messageContent) { + public ChatResponse sessionId(String sessionId) { - this.messageContent = messageContent; + this.sessionId = sessionId; return this; } /** - * Get messageContent - * @return messageContent + * Get sessionId + * @return sessionId */ @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) + @JsonProperty(JSON_PROPERTY_SESSION_ID) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getMessageContent() { - return messageContent; + public String getSessionId() { + return sessionId; } - @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) + @JsonProperty(JSON_PROPERTY_SESSION_ID) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setMessageContent(String messageContent) { - this.messageContent = messageContent; + public void setSessionId(String sessionId) { + this.sessionId = sessionId; } @Override @@ -101,21 +101,21 @@ public boolean equals(Object o) { return false; } ChatResponse chatResponse = (ChatResponse) o; - return Objects.equals(this.chatId, chatResponse.chatId) && - Objects.equals(this.messageContent, chatResponse.messageContent); + return Objects.equals(this.messageContent, chatResponse.messageContent) && + Objects.equals(this.sessionId, chatResponse.sessionId); } @Override public int hashCode() { - return Objects.hash(chatId, messageContent); + return Objects.hash(messageContent, sessionId); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class ChatResponse {\n"); - sb.append(" chatId: ").append(toIndentedString(chatId)).append("\n"); sb.append(" messageContent: ").append(toIndentedString(messageContent)).append("\n"); + sb.append(" sessionId: ").append(toIndentedString(sessionId)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index ebad22c2..97f645db 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -10,12 +10,12 @@ ) class ChatRequest(BaseModel): - chat_id: str + session_id: str message_content: str class ChatResponse(BaseModel): - chat_id: str + session_id: str message_content: str @@ -28,7 +28,7 @@ async def chat(request: ChatRequest): # TODO: Add state management when implementing more complex chat logic state = 0 user_input = request.message_content - result = chat(request.chat_id, user_input, state) + result = chat(request.session_id, user_input, state) state = result["state"] response_message = result["response"]["messages"][-1].content - return ChatResponse(chat_id=request.chat_id, message_content=response_message) \ No newline at end of file + return ChatResponse(session_id=request.session_id, message_content=response_message) \ No newline at end of file diff --git a/server/intelligence-service/openapi.yaml b/server/intelligence-service/openapi.yaml index a42f9d9c..6cefd792 100644 --- a/server/intelligence-service/openapi.yaml +++ b/server/intelligence-service/openapi.yaml @@ -2,27 +2,27 @@ components: schemas: ChatRequest: properties: - chat_id: - title: Chat Id - type: string message_content: title: Message Content type: string + session_id: + title: Session Id + type: string required: - - chat_id + - session_id - message_content title: ChatRequest type: object ChatResponse: properties: - chat_id: - title: Chat Id - type: string message_content: title: Message Content type: string + session_id: + title: Session Id + type: string required: - - chat_id + - session_id - message_content title: ChatResponse type: object From 918ade518920d548f72fa49e7f7483c23f0ab290 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 19 Nov 2024 13:50:20 +0100 Subject: [PATCH 08/70] #124 bug fix --- .../www1/hephaestus/OpenAPIConfiguration.java | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/OpenAPIConfiguration.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/OpenAPIConfiguration.java index a225cbe5..0323e4b2 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/OpenAPIConfiguration.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/OpenAPIConfiguration.java @@ -1,39 +1,29 @@ package de.tum.in.www1.hephaestus; +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Contact; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.info.License; +import io.swagger.v3.oas.annotations.servers.Server; +import io.swagger.v3.oas.models.media.Schema; import java.util.Map; import java.util.stream.Collectors; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springdoc.core.customizers.OpenApiCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.info.Contact; -import io.swagger.v3.oas.annotations.info.Info; -import io.swagger.v3.oas.annotations.info.License; -import io.swagger.v3.oas.annotations.servers.Server; -import io.swagger.v3.oas.models.media.Schema; - @Configuration @OpenAPIDefinition( info = @Info( - title = "Hephaestus API", - description = "API documentation for the Hephaestus application server.", + title = "Hephaestus API", + description = "API documentation for the Hephaestus application server.", version = "0.0.1", - contact = @Contact( - name = "Felix T.J. Dietrich", - email = "felixtj.dietrich@tum.de" - ), - license = @License( - name = "MIT License", - url = "https://github.com/ls1intum/Hephaestus/blob/develop/LICENSE" - ) - ), - servers = { - @Server(url = "/", description = "Default Server URL"), - } + contact = @Contact(name = "Felix T.J. Dietrich", email = "felixtj.dietrich@tum.de"), + license = @License(name = "MIT License", url = "https://github.com/ls1intum/Hephaestus/blob/develop/LICENSE") + ), + servers = { @Server(url = "/", description = "Default Server URL") } ) public class OpenAPIConfiguration { @@ -41,24 +31,29 @@ public class OpenAPIConfiguration { @Bean public OpenApiCustomizer schemaCustomizer() { - return openApi -> { + return openApi -> { var components = openApi.getComponents(); // Only include schemas with DTO suffix and remove the suffix var schemas = components - .getSchemas() - .entrySet() - .stream() - .filter(entry -> entry.getKey().endsWith("DTO")) - .collect(Collectors.toMap(entry -> entry.getKey().substring(0, entry.getKey().length() - 3), - entry -> { - var schema = entry.getValue(); - schema.setName(entry.getKey().substring(0, entry.getKey().length() - 3)); - return schema; - })); + .getSchemas() + .entrySet() + .stream() + .filter(entry -> entry.getKey().endsWith("DTO")) + .collect( + Collectors.toMap( + entry -> entry.getKey().substring(0, entry.getKey().length() - 3), + entry -> { + var schema = entry.getValue(); + schema.setName(entry.getKey().substring(0, entry.getKey().length() - 3)); + return schema; + } + ) + ); // Remove DTO suffix from attribute names schemas.forEach((key, value) -> { + @SuppressWarnings("unchecked") Map> properties = value.getProperties(); if (properties != null) { properties.forEach((propertyKey, propertyValue) -> { @@ -72,25 +67,30 @@ public OpenApiCustomizer schemaCustomizer() { var paths = openApi.getPaths(); paths.forEach((path, pathItem) -> { logger.info(path); - pathItem.readOperations().forEach(operation -> { - // Remove DTO suffix from reponse schemas - var responses = operation.getResponses(); - responses.forEach((responseCode, response) -> { - var content = response.getContent(); - content.forEach((contentType, mediaType) -> { - removeDTOSuffixesFromSchemaRecursively(mediaType.getSchema()); - + pathItem + .readOperations() + .forEach(operation -> { + // Remove DTO suffix from reponse schemas + var responses = operation.getResponses(); + responses.forEach((responseCode, response) -> { + var content = response.getContent(); + content.forEach((contentType, mediaType) -> { + removeDTOSuffixesFromSchemaRecursively(mediaType.getSchema()); + }); }); - }); + if (operation.getRequestBody() != null) { + var requestBodyContent = operation.getRequestBody().getContent(); + requestBodyContent.forEach((contentType, mediaType) -> { + removeDTOSuffixesFromSchemaRecursively(mediaType.getSchema()); + }); + } - // Remove -controller suffix from tags - operation.setTags(operation.getTags() - .stream() - .map(tag -> tag.substring(0, tag.length() - 11)).toList()); - }); + // Remove -controller suffix from tags + operation.setTags( + operation.getTags().stream().map(tag -> tag.substring(0, tag.length() - 11)).toList() + ); + }); }); - - }; } From a7a71306615eef92f9757ce1b57687a6e21b9891 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 19 Nov 2024 13:50:39 +0100 Subject: [PATCH 09/70] Add new specs for chat --- server/application-server/openapi.yaml | 4 +- .../tum/in/www1/hephaestus/chat/Session.java | 9 +- .../hephaestus/chat/SessionController.java | 6 +- .../in/www1/hephaestus/chat/SessionDTO.java | 25 +- .../hephaestus/chat/SessionRepository.java | 5 +- .../www1/hephaestus/chat/SessionService.java | 15 +- .../www1/hephaestus/chat/message/Message.java | 6 +- .../chat/message/MessageController.java | 2 +- .../hephaestus/chat/message/MessageDTO.java | 19 +- .../chat/message/MessageRepository.java | 3 +- .../chat/message/MessageService.java | 3 +- .../hephaestus/gitprovider/user/User.java | 5 + .../modules/openapi/.openapi-generator/FILES | 6 + .../src/app/core/modules/openapi/api/api.ts | 8 +- .../modules/openapi/api/message.service.ts | 171 +++++++++++++ .../openapi/api/message.serviceInterface.ts | 34 +++ .../modules/openapi/api/session.service.ts | 234 ++++++++++++++++++ .../openapi/api/session.serviceInterface.ts | 41 +++ .../app/core/modules/openapi/model/message.ts | 30 +++ .../app/core/modules/openapi/model/models.ts | 2 + .../app/core/modules/openapi/model/session.ts | 22 ++ 21 files changed, 607 insertions(+), 43 deletions(-) create mode 100644 webapp/src/app/core/modules/openapi/api/message.service.ts create mode 100644 webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts create mode 100644 webapp/src/app/core/modules/openapi/api/session.service.ts create mode 100644 webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts create mode 100644 webapp/src/app/core/modules/openapi/model/message.ts create mode 100644 webapp/src/app/core/modules/openapi/model/session.ts diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index 726ce372..6591cfac 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -22,7 +22,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/User" + type: string required: true responses: "200": @@ -40,7 +40,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/MessageDTO" + $ref: "#/components/schemas/Message" required: true responses: "200": diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java index 4ba01fff..2dbf2cbf 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java @@ -2,7 +2,9 @@ import java.time.ZonedDateTime; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -12,12 +14,11 @@ import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; import de.tum.in.www1.hephaestus.gitprovider.user.User; - @Entity @Table(name = "session") @Getter @Setter -@ToString(callSuper = true) +@ToString(callSuper = true) @NoArgsConstructor public class Session extends BaseGitServiceEntity { @@ -28,6 +29,8 @@ public class Session extends BaseGitServiceEntity { @Column(name = "creation_date") private ZonedDateTime creationDate = ZonedDateTime.now(); - @OneToOne + @ManyToOne + @JoinColumn(name = "user_id") + @ToString.Exclude private User user; } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java index 69db745e..86cc950e 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java @@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import java.util.Optional; +import java.util.Optional; import de.tum.in.www1.hephaestus.gitprovider.user.User; import org.springframework.http.ResponseEntity; @@ -23,8 +23,8 @@ public SessionController(SessionService sessionService) { } @PostMapping - public ResponseEntity createSession(@RequestBody User user) { - SessionDTO session = sessionService.createSession(user); + public ResponseEntity createSession(@RequestBody String login) { + SessionDTO session = sessionService.createSession(login); return ResponseEntity.ok(session); } diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java index 5f1dac38..e20ad064 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java @@ -6,18 +6,21 @@ import com.fasterxml.jackson.annotation.JsonInclude; import java.util.List; -import de.tum.in.www1.hephaestus.chat.message.Message; +import de.tum.in.www1.hephaestus.chat.message.MessageDTO; import de.tum.in.www1.hephaestus.gitprovider.user.UserInfoDTO; - @JsonInclude(JsonInclude.Include.NON_EMPTY) -public record SessionDTO ( - @NonNull Long id, - @NonNull List messages, - @NonNull UserInfoDTO user, - @NonNull ZonedDateTime creationDate){ +public record SessionDTO( + @NonNull Long id, + @NonNull List messages, + @NonNull UserInfoDTO user, + @NonNull ZonedDateTime creationDate) { - public SessionDTO(Session session) { - this(session.getId(), session.getMessages(), UserInfoDTO.fromUser(session.getUser()), session.getCreationDate()); - } - } \ No newline at end of file + public static SessionDTO fromSession(Session session) { + return new SessionDTO( + session.getId(), + session.getMessages().stream().map(MessageDTO::fromMessage).toList(), + UserInfoDTO.fromUser(session.getUser()), + session.getCreationDate()); + } +} \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java index 7824048d..13b84b8b 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java @@ -30,9 +30,8 @@ public interface SessionRepository extends JpaRepository { Session findByIdWithMessagesAndContents(@Param("sessionId") long sessionId); private Session getValueElseThrow(Optional optional, long sessionId) { - return optional.orElseThrow(() -> - new EntityNotFoundException("Session entity with id " + sessionId + " was not found.") - ); + return optional.orElseThrow( + () -> new EntityNotFoundException("Session entity with id " + sessionId + " was not found.")); } @NotNull diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java index 5a6e43f3..dce06efd 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java @@ -1,8 +1,10 @@ package de.tum.in.www1.hephaestus.chat; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.tum.in.www1.hephaestus.gitprovider.user.User; +import de.tum.in.www1.hephaestus.gitprovider.user.UserRepository; import java.time.OffsetDateTime; import java.util.Optional; @@ -13,6 +15,8 @@ public class SessionService { private final SessionRepository sessionRepository; + @Autowired + private UserRepository userRepository; public SessionService(SessionRepository sessionRepository) { this.sessionRepository = sessionRepository; @@ -24,11 +28,14 @@ public SessionService(SessionRepository sessionRepository) { * @param user The user the session belongs to * @return The created session */ - public SessionDTO createSession(User user) { + public SessionDTO createSession(String login) { Session session = new Session(); - session.setUser(user); + var user = userRepository.findByLogin(login); + if (user.isPresent()){ + session.setUser(user.get()); + } session.setCreatedAt(OffsetDateTime.now()); - return new SessionDTO(sessionRepository.save(session)); + return SessionDTO.fromSession(sessionRepository.save(session)); } /** @@ -38,7 +45,7 @@ public SessionDTO createSession(User user) { * @return The session entity if found, otherwise throws an exception */ public Optional findSessionById(Long sessionId) { - return sessionRepository.findById(sessionId).map(SessionDTO::new); + return sessionRepository.findById(sessionId).map(SessionDTO::fromSession); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index b61148ec..acdca4f7 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -15,7 +15,7 @@ @Table(name = "message") @Getter @Setter -@ToString(callSuper = true) +@ToString(callSuper = true) @RequiredArgsConstructor public class Message extends BaseGitServiceEntity { @NonNull @@ -32,8 +32,8 @@ public class Message extends BaseGitServiceEntity { @NonNull @ManyToOne(optional = false, fetch = FetchType.LAZY) - @JoinColumn(name = "session_id") - private Session session; + @JoinColumn(name = "session_id") + private Session session; public enum MessageSender { SYSTEM, USER diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java index bc91a8a9..c369fea6 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java @@ -15,7 +15,7 @@ public MessageController(MessageService messageService) { this.messageService = messageService; } - // TODO: Pathvariable with session_id + // TODO: Pathvariable with session_id @PostMapping public ResponseEntity sendMessage(@RequestBody MessageDTO messageDTO) { MessageDTO savedMessage = messageService.sendMessage(messageDTO); diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java index 0cd4011f..b515c7d6 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java @@ -8,21 +8,20 @@ import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; import de.tum.in.www1.hephaestus.chat.SessionDTO; - @JsonInclude(JsonInclude.Include.NON_EMPTY) public record MessageDTO( - @NonNull Long id, - @NonNull ZonedDateTime sentAt, - @NonNull MessageSender sender, - @NonNull String content, - @NonNull SessionDTO session) { + @NonNull Long id, + @NonNull ZonedDateTime sentAt, + @NonNull MessageSender sender, + @NonNull String content, + @NonNull SessionDTO session) { - public MessageDTO(Message message) { - this( + public static MessageDTO fromMessage(Message message) { + return new MessageDTO( message.getId(), message.getSentAt(), message.getSender(), message.getContent(), - new SessionDTO(message.getSession())); - } + SessionDTO.fromSession(message.getSession())); + } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java index e084966f..c40c0f28 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java @@ -6,7 +6,8 @@ import java.util.List; @Repository -public interface MessageRepository extends JpaRepository { +public interface MessageRepository extends JpaRepository { List findBySessionId(Long sessionId); + List findBySessionIdAndContentContaining(Long sessionId, String keyword); } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 122ea088..77907116 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -43,7 +43,8 @@ public MessageDTO sendMessage(MessageDTO messageDTO) { Message systemMessage = new Message(ZonedDateTime.now(), MessageSender.SYSTEM, systemResponse, session); messageRepository.save(systemMessage); - return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), systemMessage.getContent(), new SessionDTO(systemMessage.getSession())); + return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), + systemMessage.getContent(), SessionDTO.fromSession(systemMessage.getSession())); } /** diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/user/User.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/user/User.java index e3155308..2cf5d8b2 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/user/User.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/user/User.java @@ -19,6 +19,7 @@ import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; import de.tum.in.www1.hephaestus.gitprovider.issue.Issue; +import de.tum.in.www1.hephaestus.chat.Session; import de.tum.in.www1.hephaestus.gitprovider.issuecomment.IssueComment; import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequest; import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReview; @@ -88,6 +89,10 @@ public class User extends BaseGitServiceEntity { @OneToMany(mappedBy = "author") @ToString.Exclude private Set reviews = new HashSet<>(); + + @OneToMany(mappedBy = "user") + @ToString.Exclude + private Set sessions = new HashSet<>(); @OneToMany(mappedBy = "author") @ToString.Exclude diff --git a/webapp/src/app/core/modules/openapi/.openapi-generator/FILES b/webapp/src/app/core/modules/openapi/.openapi-generator/FILES index 060dd8c4..94972e13 100644 --- a/webapp/src/app/core/modules/openapi/.openapi-generator/FILES +++ b/webapp/src/app/core/modules/openapi/.openapi-generator/FILES @@ -7,8 +7,12 @@ api/admin.serviceInterface.ts api/api.ts api/leaderboard.service.ts api/leaderboard.serviceInterface.ts +api/message.service.ts +api/message.serviceInterface.ts api/meta.service.ts api/meta.serviceInterface.ts +api/session.service.ts +api/session.serviceInterface.ts api/user.service.ts api/user.serviceInterface.ts configuration.ts @@ -18,12 +22,14 @@ index.ts model/auth-user-info.ts model/label-info.ts model/leaderboard-entry.ts +model/message.ts model/meta-data.ts model/models.ts model/pull-request-base-info.ts model/pull-request-info.ts model/pull-request-review-info.ts model/repository-info.ts +model/session.ts model/user-info.ts model/user-profile.ts param.ts diff --git a/webapp/src/app/core/modules/openapi/api/api.ts b/webapp/src/app/core/modules/openapi/api/api.ts index c5aae02f..df673ce7 100644 --- a/webapp/src/app/core/modules/openapi/api/api.ts +++ b/webapp/src/app/core/modules/openapi/api/api.ts @@ -4,10 +4,16 @@ export * from './admin.serviceInterface'; export * from './leaderboard.service'; import { LeaderboardService } from './leaderboard.service'; export * from './leaderboard.serviceInterface'; +export * from './message.service'; +import { MessageService } from './message.service'; +export * from './message.serviceInterface'; export * from './meta.service'; import { MetaService } from './meta.service'; export * from './meta.serviceInterface'; +export * from './session.service'; +import { SessionService } from './session.service'; +export * from './session.serviceInterface'; export * from './user.service'; import { UserService } from './user.service'; export * from './user.serviceInterface'; -export const APIS = [AdminService, LeaderboardService, MetaService, UserService]; +export const APIS = [AdminService, LeaderboardService, MessageService, MetaService, SessionService, UserService]; diff --git a/webapp/src/app/core/modules/openapi/api/message.service.ts b/webapp/src/app/core/modules/openapi/api/message.service.ts new file mode 100644 index 00000000..0f9329f3 --- /dev/null +++ b/webapp/src/app/core/modules/openapi/api/message.service.ts @@ -0,0 +1,171 @@ +/** + * Hephaestus API + * API documentation for the Hephaestus application server. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: felixtj.dietrich@tum.de + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec, HttpContext + } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +// @ts-ignore +import { Message } from '../model/message'; + +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; +import { + MessageServiceInterface +} from './message.serviceInterface'; + + + +@Injectable({ + providedIn: 'root' +}) +export class MessageService implements MessageServiceInterface { + + protected basePath = 'http://localhost'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + const firstBasePath = Array.isArray(basePath) ? basePath[0] : undefined; + if (firstBasePath != undefined) { + basePath = firstBasePath; + } + + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + // @ts-ignore + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * @param message + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public sendMessage(message: Message, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public sendMessage(message: Message, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public sendMessage(message: Message, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public sendMessage(message: Message, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + if (message === null || message === undefined) { + throw new Error('Required parameter message was null or undefined when calling sendMessage.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + let localVarTransferCache: boolean | undefined = options && options.transferCache; + if (localVarTransferCache === undefined) { + localVarTransferCache = true; + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/message`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: message, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + transferCache: localVarTransferCache, + reportProgress: reportProgress + } + ); + } + +} diff --git a/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts b/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts new file mode 100644 index 00000000..1290c529 --- /dev/null +++ b/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts @@ -0,0 +1,34 @@ +/** + * Hephaestus API + * API documentation for the Hephaestus application server. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: felixtj.dietrich@tum.de + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { HttpHeaders } from '@angular/common/http'; + +import { Observable } from 'rxjs'; + +import { Message } from '../model/models'; + + +import { Configuration } from '../configuration'; + + + +export interface MessageServiceInterface { + defaultHeaders: HttpHeaders; + configuration: Configuration; + + /** + * + * + * @param message + */ + sendMessage(message: Message, extraHttpRequestParams?: any): Observable; + +} diff --git a/webapp/src/app/core/modules/openapi/api/session.service.ts b/webapp/src/app/core/modules/openapi/api/session.service.ts new file mode 100644 index 00000000..64f5a4ee --- /dev/null +++ b/webapp/src/app/core/modules/openapi/api/session.service.ts @@ -0,0 +1,234 @@ +/** + * Hephaestus API + * API documentation for the Hephaestus application server. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: felixtj.dietrich@tum.de + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec, HttpContext + } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +// @ts-ignore +import { Session } from '../model/session'; + +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; +import { + SessionServiceInterface +} from './session.serviceInterface'; + + + +@Injectable({ + providedIn: 'root' +}) +export class SessionService implements SessionServiceInterface { + + protected basePath = 'http://localhost'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + const firstBasePath = Array.isArray(basePath) ? basePath[0] : undefined; + if (firstBasePath != undefined) { + basePath = firstBasePath; + } + + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + // @ts-ignore + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * @param body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public createSession(body: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public createSession(body: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createSession(body: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createSession(body: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + if (body === null || body === undefined) { + throw new Error('Required parameter body was null or undefined when calling createSession.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + let localVarTransferCache: boolean | undefined = options && options.transferCache; + if (localVarTransferCache === undefined) { + localVarTransferCache = true; + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/session`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: body, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + transferCache: localVarTransferCache, + reportProgress: reportProgress + } + ); + } + + /** + * @param sessionId + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getSession(sessionId: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public getSession(sessionId: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public getSession(sessionId: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public getSession(sessionId: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + if (sessionId === null || sessionId === undefined) { + throw new Error('Required parameter sessionId was null or undefined when calling getSession.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + let localVarTransferCache: boolean | undefined = options && options.transferCache; + if (localVarTransferCache === undefined) { + localVarTransferCache = true; + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/session/session/${this.configuration.encodeParam({name: "sessionId", value: sessionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int64"})}`; + return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + transferCache: localVarTransferCache, + reportProgress: reportProgress + } + ); + } + +} diff --git a/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts b/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts new file mode 100644 index 00000000..939f9bcf --- /dev/null +++ b/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts @@ -0,0 +1,41 @@ +/** + * Hephaestus API + * API documentation for the Hephaestus application server. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: felixtj.dietrich@tum.de + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { HttpHeaders } from '@angular/common/http'; + +import { Observable } from 'rxjs'; + +import { Session } from '../model/models'; + + +import { Configuration } from '../configuration'; + + + +export interface SessionServiceInterface { + defaultHeaders: HttpHeaders; + configuration: Configuration; + + /** + * + * + * @param body + */ + createSession(body: string, extraHttpRequestParams?: any): Observable; + + /** + * + * + * @param sessionId + */ + getSession(sessionId: number, extraHttpRequestParams?: any): Observable; + +} diff --git a/webapp/src/app/core/modules/openapi/model/message.ts b/webapp/src/app/core/modules/openapi/model/message.ts new file mode 100644 index 00000000..433adabc --- /dev/null +++ b/webapp/src/app/core/modules/openapi/model/message.ts @@ -0,0 +1,30 @@ +/** + * Hephaestus API + * API documentation for the Hephaestus application server. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: felixtj.dietrich@tum.de + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Session } from './session'; + + +export interface Message { + id: number; + sentAt: string; + sender: Message.SenderEnum; + content: string; + session: Session; +} +export namespace Message { + export type SenderEnum = 'SYSTEM' | 'USER'; + export const SenderEnum = { + System: 'SYSTEM' as SenderEnum, + User: 'USER' as SenderEnum + }; +} + + diff --git a/webapp/src/app/core/modules/openapi/model/models.ts b/webapp/src/app/core/modules/openapi/model/models.ts index b374d5fc..21469675 100644 --- a/webapp/src/app/core/modules/openapi/model/models.ts +++ b/webapp/src/app/core/modules/openapi/model/models.ts @@ -1,10 +1,12 @@ export * from './auth-user-info'; export * from './label-info'; export * from './leaderboard-entry'; +export * from './message'; export * from './meta-data'; export * from './pull-request-base-info'; export * from './pull-request-info'; export * from './pull-request-review-info'; export * from './repository-info'; +export * from './session'; export * from './user-info'; export * from './user-profile'; diff --git a/webapp/src/app/core/modules/openapi/model/session.ts b/webapp/src/app/core/modules/openapi/model/session.ts new file mode 100644 index 00000000..ca2b16ce --- /dev/null +++ b/webapp/src/app/core/modules/openapi/model/session.ts @@ -0,0 +1,22 @@ +/** + * Hephaestus API + * API documentation for the Hephaestus application server. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: felixtj.dietrich@tum.de + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Message } from './message'; +import { UserInfo } from './user-info'; + + +export interface Session { + id: number; + messages: Array; + user: UserInfo; + creationDate: string; +} + From 246bd3b766d3e6f885f12793a13a87881776b23f Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 19 Nov 2024 15:42:15 +0100 Subject: [PATCH 10/70] Change placement of sesion --- .../ClassImportIntegratorIntegratorProvider.java | 2 +- .../de/tum/in/www1/hephaestus/chat/message/Message.java | 3 +-- .../de/tum/in/www1/hephaestus/chat/message/MessageDTO.java | 2 +- .../in/www1/hephaestus/chat/message/MessageService.java | 7 +++---- .../tum/in/www1/hephaestus/chat/{ => session}/Session.java | 2 +- .../hephaestus/chat/{ => session}/SessionController.java | 2 +- .../in/www1/hephaestus/chat/{ => session}/SessionDTO.java | 2 +- .../hephaestus/chat/{ => session}/SessionRepository.java | 2 +- .../www1/hephaestus/chat/{ => session}/SessionService.java | 2 +- .../de/tum/in/www1/hephaestus/gitprovider/user/User.java | 3 +-- 10 files changed, 12 insertions(+), 15 deletions(-) rename server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/{ => session}/Session.java (95%) rename server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/{ => session}/SessionController.java (96%) rename server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/{ => session}/SessionDTO.java (94%) rename server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/{ => session}/SessionRepository.java (96%) rename server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/{ => session}/SessionService.java (96%) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java index b0db905b..b800fbd7 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/ClassImportIntegratorIntegratorProvider.java @@ -14,8 +14,8 @@ import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReviewInfoDTO; import de.tum.in.www1.hephaestus.gitprovider.repository.RepositoryInfoDTO; import de.tum.in.www1.hephaestus.gitprovider.user.UserInfoDTO; -import de.tum.in.www1.hephaestus.chat.SessionDTO; import de.tum.in.www1.hephaestus.chat.message.MessageDTO; +import de.tum.in.www1.hephaestus.chat.session.SessionDTO; import io.hypersistence.utils.hibernate.type.util.ClassImportIntegrator; public class ClassImportIntegratorIntegratorProvider implements IntegratorProvider { diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index acdca4f7..86f8c2fb 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -7,9 +7,8 @@ import lombok.Setter; import lombok.ToString; import org.springframework.lang.NonNull; - +import de.tum.in.www1.hephaestus.chat.session.Session; import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; -import de.tum.in.www1.hephaestus.chat.Session; @Entity @Table(name = "message") diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java index b515c7d6..0b0d44ca 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; -import de.tum.in.www1.hephaestus.chat.SessionDTO; +import de.tum.in.www1.hephaestus.chat.session.SessionDTO; @JsonInclude(JsonInclude.Include.NON_EMPTY) public record MessageDTO( diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 77907116..506ca8d7 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -3,14 +3,13 @@ import java.time.ZonedDateTime; import org.springframework.stereotype.Service; - -import de.tum.in.www1.hephaestus.chat.Session; -import de.tum.in.www1.hephaestus.chat.SessionDTO; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; +import de.tum.in.www1.hephaestus.chat.session.Session; +import de.tum.in.www1.hephaestus.chat.session.SessionDTO; +import de.tum.in.www1.hephaestus.chat.session.SessionRepository; import de.tum.in.www1.hephaestus.intelligenceservice.api.DefaultApi; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatRequest; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatResponse; -import de.tum.in.www1.hephaestus.chat.SessionRepository; /** * Service for managing messages. diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java similarity index 95% rename from server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java rename to server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index 2dbf2cbf..f72fef7c 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -1,4 +1,4 @@ -package de.tum.in.www1.hephaestus.chat; +package de.tum.in.www1.hephaestus.chat.session; import java.time.ZonedDateTime; import java.util.ArrayList; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java similarity index 96% rename from server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java rename to server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java index 86cc950e..60dca3ba 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java @@ -1,4 +1,4 @@ -package de.tum.in.www1.hephaestus.chat; +package de.tum.in.www1.hephaestus.chat.session; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java similarity index 94% rename from server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java rename to server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java index e20ad064..d31244ea 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java @@ -1,4 +1,4 @@ -package de.tum.in.www1.hephaestus.chat; +package de.tum.in.www1.hephaestus.chat.session; import java.time.ZonedDateTime; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java similarity index 96% rename from server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java rename to server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java index 13b84b8b..3a702c5f 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java @@ -1,4 +1,4 @@ -package de.tum.in.www1.hephaestus.chat; +package de.tum.in.www1.hephaestus.chat.session; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java similarity index 96% rename from server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java rename to server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index dce06efd..fd44f399 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -1,4 +1,4 @@ -package de.tum.in.www1.hephaestus.chat; +package de.tum.in.www1.hephaestus.chat.session; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/user/User.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/user/User.java index 2cf5d8b2..9ebf8a5d 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/user/User.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/gitprovider/user/User.java @@ -16,10 +16,9 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; - +import de.tum.in.www1.hephaestus.chat.session.Session; import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; import de.tum.in.www1.hephaestus.gitprovider.issue.Issue; -import de.tum.in.www1.hephaestus.chat.Session; import de.tum.in.www1.hephaestus.gitprovider.issuecomment.IssueComment; import de.tum.in.www1.hephaestus.gitprovider.pullrequest.PullRequest; import de.tum.in.www1.hephaestus.gitprovider.pullrequestreview.PullRequestReview; From 12acb52a077561e64784ff0176624d80ccbec87f Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 19 Nov 2024 15:47:53 +0100 Subject: [PATCH 11/70] Delete unused imports --- .../java/de/tum/in/www1/hephaestus/chat/session/Session.java | 2 -- .../tum/in/www1/hephaestus/chat/session/SessionController.java | 1 - .../de/tum/in/www1/hephaestus/chat/session/SessionService.java | 1 - 3 files changed, 4 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index f72fef7c..f9e9a6f4 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -2,9 +2,7 @@ import java.time.ZonedDateTime; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java index 60dca3ba..66268376 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java @@ -9,7 +9,6 @@ import java.util.Optional; -import de.tum.in.www1.hephaestus.gitprovider.user.User; import org.springframework.http.ResponseEntity; @RestController diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index fd44f399..6747a33e 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -3,7 +3,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import de.tum.in.www1.hephaestus.gitprovider.user.User; import de.tum.in.www1.hephaestus.gitprovider.user.UserRepository; import java.time.OffsetDateTime; import java.util.Optional; From 0f8f5a0c5de74913000a3dfe2cedfd9a0129fb69 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Thu, 21 Nov 2024 12:28:27 +0100 Subject: [PATCH 12/70] Uodate chat logic --- server/application-server/openapi.yaml | 75 ++++++++++++------- .../chat/message/MessageController.java | 19 +++-- .../hephaestus/chat/message/MessageDTO.java | 5 +- .../chat/message/MessageRepository.java | 2 - .../chat/message/MessageService.java | 28 +++---- .../chat/session/SessionController.java | 20 +++-- .../hephaestus/chat/session/SessionDTO.java | 5 +- .../chat/session/SessionRepository.java | 35 +-------- .../chat/session/SessionService.java | 37 ++++----- .../modules/openapi/api/message.service.ts | 75 +++++++++++++++++-- .../openapi/api/message.serviceInterface.ts | 9 ++- .../modules/openapi/api/session.service.ts | 35 +++++---- .../openapi/api/session.serviceInterface.ts | 6 +- .../app/core/modules/openapi/model/message.ts | 3 +- .../app/core/modules/openapi/model/session.ts | 3 +- 15 files changed, 220 insertions(+), 137 deletions(-) diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index 6591cfac..7cdec2d3 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -13,7 +13,27 @@ servers: - url: / description: Default Server URL paths: - /session: + /sessions: + get: + tags: + - session + operationId: getSessions + parameters: + - name: userId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Session" post: tags: - session @@ -22,7 +42,8 @@ paths: content: application/json: schema: - type: string + type: integer + format: int64 required: true responses: "200": @@ -31,11 +52,11 @@ paths: application/json: schema: $ref: "#/components/schemas/Session" - /message: + /messages: post: tags: - message - operationId: sendMessage + operationId: createMessage requestBody: content: application/json: @@ -67,37 +88,39 @@ paths: application/json: schema: $ref: "#/components/schemas/UserProfile" - /session/session/{sessionId}: + /meta: get: tags: - - session - operationId: getSession - parameters: - - name: sessionId - in: path - required: true - schema: - type: integer - format: int64 + - meta + operationId: getMetaData responses: "200": description: OK content: application/json: schema: - $ref: "#/components/schemas/Session" - /meta: + $ref: "#/components/schemas/MetaData" + /messages/{sessionId}: get: tags: - - meta - operationId: getMetaData + - message + operationId: getMessages + parameters: + - name: sessionId + in: path + required: true + schema: + type: integer + format: int64 responses: "200": description: OK content: application/json: schema: - $ref: "#/components/schemas/MetaData" + type: array + items: + $ref: "#/components/schemas/Message" /leaderboard: get: tags: @@ -242,7 +265,7 @@ components: - id - sender - sentAt - - session + - sessionId type: object properties: id: @@ -258,8 +281,9 @@ components: - USER content: type: string - session: - $ref: "#/components/schemas/Session" + sessionId: + type: integer + format: int64 UserProfile: required: - contributedRepositories @@ -463,7 +487,7 @@ components: - creationDate - id - messages - - user + - userId type: object properties: id: @@ -473,8 +497,9 @@ components: type: array items: $ref: "#/components/schemas/Message" - user: - $ref: "#/components/schemas/UserInfo" + userId: + type: integer + format: int64 creationDate: type: string format: date-time diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java index c369fea6..5275c21a 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java @@ -1,13 +1,17 @@ package de.tum.in.www1.hephaestus.chat.message; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController -@RequestMapping("/message") +@RequestMapping("/messages") public class MessageController { private final MessageService messageService; @@ -15,10 +19,15 @@ public MessageController(MessageService messageService) { this.messageService = messageService; } - // TODO: Pathvariable with session_id + @GetMapping("/{sessionId}") + public ResponseEntity> getMessages(@PathVariable Long sessionId) { + List messages = messageService.getMessagesBySessionId(sessionId); + return ResponseEntity.ok(messages); + } + @PostMapping - public ResponseEntity sendMessage(@RequestBody MessageDTO messageDTO) { - MessageDTO savedMessage = messageService.sendMessage(messageDTO); - return ResponseEntity.ok(savedMessage); + public ResponseEntity createMessage(@RequestBody MessageDTO message) { + MessageDTO createdMessage = messageService.sendMessage(message); + return ResponseEntity.ok(createdMessage); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java index 0b0d44ca..925e8fbe 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java @@ -6,7 +6,6 @@ import com.fasterxml.jackson.annotation.JsonInclude; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; -import de.tum.in.www1.hephaestus.chat.session.SessionDTO; @JsonInclude(JsonInclude.Include.NON_EMPTY) public record MessageDTO( @@ -14,7 +13,7 @@ public record MessageDTO( @NonNull ZonedDateTime sentAt, @NonNull MessageSender sender, @NonNull String content, - @NonNull SessionDTO session) { + @NonNull Long sessionId) { public static MessageDTO fromMessage(Message message) { return new MessageDTO( @@ -22,6 +21,6 @@ public static MessageDTO fromMessage(Message message) { message.getSentAt(), message.getSender(), message.getContent(), - SessionDTO.fromSession(message.getSession())); + message.getSession().getId()); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java index c40c0f28..1c454da7 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageRepository.java @@ -8,6 +8,4 @@ @Repository public interface MessageRepository extends JpaRepository { List findBySessionId(Long sessionId); - - List findBySessionIdAndContentContaining(Long sessionId, String keyword); } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 506ca8d7..c07c55a9 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -1,11 +1,11 @@ package de.tum.in.www1.hephaestus.chat.message; import java.time.ZonedDateTime; +import java.util.List; import org.springframework.stereotype.Service; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; import de.tum.in.www1.hephaestus.chat.session.Session; -import de.tum.in.www1.hephaestus.chat.session.SessionDTO; import de.tum.in.www1.hephaestus.chat.session.SessionRepository; import de.tum.in.www1.hephaestus.intelligenceservice.api.DefaultApi; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatRequest; @@ -27,31 +27,33 @@ public MessageService(SessionRepository sessionRepository, MessageRepository mes this.sessionApiClient = new DefaultApi(); } - /** - * Sends a message, saves it, and generates a bot response. - */ + public List getMessagesBySessionId(Long sessionId) { + return messageRepository.findBySessionId(sessionId).stream() + .map(message -> new MessageDTO(message.getId(), message.getSentAt(), message.getSender(), + message.getContent(), message.getSession().getId())) + .toList(); + } + public MessageDTO sendMessage(MessageDTO messageDTO) { - Session session = sessionRepository.findById(messageDTO.session().id()) + Session session = sessionRepository.findById(messageDTO.sessionId()) .orElseThrow(() -> new IllegalArgumentException("Session not found")); - Message userMessage = new Message(ZonedDateTime.now(), MessageSender.USER, messageDTO.content(), session); + Message userMessage = new Message(messageDTO.sentAt(), MessageSender.USER, messageDTO.content(), session); messageRepository.save(userMessage); - String systemResponse = generateResponse(messageDTO.session(), messageDTO.content()); + String systemResponse = generateResponse(messageDTO.sessionId(), messageDTO.content()); Message systemMessage = new Message(ZonedDateTime.now(), MessageSender.SYSTEM, systemResponse, session); messageRepository.save(systemMessage); return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), - systemMessage.getContent(), SessionDTO.fromSession(systemMessage.getSession())); + systemMessage.getContent(), systemMessage.getSession().getId()); } - /** - * Calls the Python FastAPI service to generate a bot response. - */ - private String generateResponse(SessionDTO session, String messageContent) { + + private String generateResponse(Long session_id, String messageContent) { ChatRequest chatRequest = new ChatRequest(); - chatRequest.setSessionId(session.id().toString()); + chatRequest.setSessionId(session_id.toString()); chatRequest.setMessageContent(messageContent); try { diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java index 66268376..03cccc3f 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java @@ -2,17 +2,18 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import java.util.Optional; +import java.util.List; import org.springframework.http.ResponseEntity; + @RestController -@RequestMapping("/session") +@RequestMapping("/sessions") public class SessionController { private final SessionService sessionService; @@ -21,15 +22,24 @@ public SessionController(SessionService sessionService) { this.sessionService = sessionService; } + @GetMapping + public ResponseEntity> getSessions(@RequestParam Long userId) { + List sessions = sessionService.findAllSessionsByUser(userId); + return ResponseEntity.ok(sessions); + } + @PostMapping - public ResponseEntity createSession(@RequestBody String login) { - SessionDTO session = sessionService.createSession(login); + public ResponseEntity createSession(@RequestBody Long userId) { + SessionDTO session = sessionService.createSession(userId); return ResponseEntity.ok(session); } + /* @GetMapping("/session/{sessionId}") public ResponseEntity getSession(@PathVariable Long sessionId) { Optional session = sessionService.findSessionById(sessionId); return ResponseEntity.ok(session.get()); } +*/ + } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java index d31244ea..738cdb06 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java @@ -7,20 +7,19 @@ import java.util.List; import de.tum.in.www1.hephaestus.chat.message.MessageDTO; -import de.tum.in.www1.hephaestus.gitprovider.user.UserInfoDTO; @JsonInclude(JsonInclude.Include.NON_EMPTY) public record SessionDTO( @NonNull Long id, @NonNull List messages, - @NonNull UserInfoDTO user, + @NonNull Long userId, @NonNull ZonedDateTime creationDate) { public static SessionDTO fromSession(Session session) { return new SessionDTO( session.getId(), session.getMessages().stream().map(MessageDTO::fromMessage).toList(), - UserInfoDTO.fromUser(session.getUser()), + session.getUser().getId(), session.getCreationDate()); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java index 3a702c5f..d518232b 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java @@ -1,41 +1,14 @@ package de.tum.in.www1.hephaestus.chat.session; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; import java.util.Optional; -import jakarta.persistence.EntityNotFoundException; -import jakarta.validation.constraints.NotNull; -import org.springframework.stereotype.Repository; +import java.util.List; @Repository public interface SessionRepository extends JpaRepository { + + Optional> findByUserId(Long userId); - @Query(""" - SELECT s - FROM Session s - LEFT JOIN FETCH s.messages m - WHERE s.id = :sessionId - """) - Optional findByIdWithMessages(@Param("sessionId") long sessionId); - - @Query(""" - SELECT s - FROM Session s - LEFT JOIN FETCH s.messages m - LEFT JOIN FETCH m.content c - WHERE s.id = :sessionId - """) - Session findByIdWithMessagesAndContents(@Param("sessionId") long sessionId); - - private Session getValueElseThrow(Optional optional, long sessionId) { - return optional.orElseThrow( - () -> new EntityNotFoundException("Session entity with id " + sessionId + " was not found.")); - } - - @NotNull - default Session findByIdWithMessagesElseThrow(long sessionId) throws EntityNotFoundException { - return getValueElseThrow(findByIdWithMessages(sessionId), sessionId); - } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index 6747a33e..f0cc0a17 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -6,10 +6,8 @@ import de.tum.in.www1.hephaestus.gitprovider.user.UserRepository; import java.time.OffsetDateTime; import java.util.Optional; +import java.util.List; -/** - * Service for managing sessions. - */ @Service public class SessionService { @@ -21,30 +19,25 @@ public SessionService(SessionRepository sessionRepository) { this.sessionRepository = sessionRepository; } - /** - * Creates a new session for the given user. - * - * @param user The user the session belongs to - * @return The created session - */ - public SessionDTO createSession(String login) { - Session session = new Session(); - var user = userRepository.findByLogin(login); - if (user.isPresent()){ - session.setUser(user.get()); + public List findAllSessionsByUser(Long userId) { + Optional> sessions = sessionRepository.findByUserId(userId); + if (sessions.isEmpty()) { + return List.of(); } - session.setCreatedAt(OffsetDateTime.now()); - return SessionDTO.fromSession(sessionRepository.save(session)); + return sessions.get().stream().map(SessionDTO::fromSession).toList(); } - /** - * Finds a session by its ID. - * - * @param sessionId The ID of the session to find - * @return The session entity if found, otherwise throws an exception - */ public Optional findSessionById(Long sessionId) { return sessionRepository.findById(sessionId).map(SessionDTO::fromSession); } + public SessionDTO createSession(Long userId) { + Session session = new Session(); + var user = userRepository.findById(userId); + if (user.isPresent()){ + session.setUser(user.get()); + } + session.setCreatedAt(OffsetDateTime.now()); + return SessionDTO.fromSession(sessionRepository.save(session)); + } } \ No newline at end of file diff --git a/webapp/src/app/core/modules/openapi/api/message.service.ts b/webapp/src/app/core/modules/openapi/api/message.service.ts index 0f9329f3..43f1394a 100644 --- a/webapp/src/app/core/modules/openapi/api/message.service.ts +++ b/webapp/src/app/core/modules/openapi/api/message.service.ts @@ -100,12 +100,12 @@ export class MessageService implements MessageServiceInterface { * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public sendMessage(message: Message, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; - public sendMessage(message: Message, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public sendMessage(message: Message, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public sendMessage(message: Message, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + public createMessage(message: Message, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public createMessage(message: Message, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createMessage(message: Message, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createMessage(message: Message, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { if (message === null || message === undefined) { - throw new Error('Required parameter message was null or undefined when calling sendMessage.'); + throw new Error('Required parameter message was null or undefined when calling createMessage.'); } let localVarHeaders = this.defaultHeaders; @@ -153,7 +153,7 @@ export class MessageService implements MessageServiceInterface { } } - let localVarPath = `/message`; + let localVarPath = `/messages`; return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, { context: localVarHttpContext, @@ -168,4 +168,67 @@ export class MessageService implements MessageServiceInterface { ); } + /** + * @param sessionId + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getMessages(sessionId: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public getMessages(sessionId: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>>; + public getMessages(sessionId: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>>; + public getMessages(sessionId: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + if (sessionId === null || sessionId === undefined) { + throw new Error('Required parameter sessionId was null or undefined when calling getMessages.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + let localVarTransferCache: boolean | undefined = options && options.transferCache; + if (localVarTransferCache === undefined) { + localVarTransferCache = true; + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/messages/${this.configuration.encodeParam({name: "sessionId", value: sessionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int64"})}`; + return this.httpClient.request>('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + transferCache: localVarTransferCache, + reportProgress: reportProgress + } + ); + } + } diff --git a/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts b/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts index 1290c529..68611d41 100644 --- a/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts +++ b/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts @@ -29,6 +29,13 @@ export interface MessageServiceInterface { * * @param message */ - sendMessage(message: Message, extraHttpRequestParams?: any): Observable; + createMessage(message: Message, extraHttpRequestParams?: any): Observable; + + /** + * + * + * @param sessionId + */ + getMessages(sessionId: number, extraHttpRequestParams?: any): Observable>; } diff --git a/webapp/src/app/core/modules/openapi/api/session.service.ts b/webapp/src/app/core/modules/openapi/api/session.service.ts index 64f5a4ee..359f74d0 100644 --- a/webapp/src/app/core/modules/openapi/api/session.service.ts +++ b/webapp/src/app/core/modules/openapi/api/session.service.ts @@ -100,10 +100,10 @@ export class SessionService implements SessionServiceInterface { * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public createSession(body: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; - public createSession(body: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public createSession(body: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public createSession(body: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + public createSession(body: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public createSession(body: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createSession(body: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createSession(body: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { if (body === null || body === undefined) { throw new Error('Required parameter body was null or undefined when calling createSession.'); } @@ -153,7 +153,7 @@ export class SessionService implements SessionServiceInterface { } } - let localVarPath = `/session`; + let localVarPath = `/sessions`; return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, { context: localVarHttpContext, @@ -169,16 +169,22 @@ export class SessionService implements SessionServiceInterface { } /** - * @param sessionId + * @param userId * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public getSession(sessionId: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; - public getSession(sessionId: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public getSession(sessionId: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public getSession(sessionId: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { - if (sessionId === null || sessionId === undefined) { - throw new Error('Required parameter sessionId was null or undefined when calling getSession.'); + public getSessions(userId: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public getSessions(userId: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>>; + public getSessions(userId: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>>; + public getSessions(userId: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + if (userId === null || userId === undefined) { + throw new Error('Required parameter userId was null or undefined when calling getSessions.'); + } + + let localVarQueryParameters = new HttpParams({encoder: this.encoder}); + if (userId !== undefined && userId !== null) { + localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, + userId, 'userId'); } let localVarHeaders = this.defaultHeaders; @@ -217,10 +223,11 @@ export class SessionService implements SessionServiceInterface { } } - let localVarPath = `/session/session/${this.configuration.encodeParam({name: "sessionId", value: sessionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int64"})}`; - return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, + let localVarPath = `/sessions`; + return this.httpClient.request>('get', `${this.configuration.basePath}${localVarPath}`, { context: localVarHttpContext, + params: localVarQueryParameters, responseType: responseType_, withCredentials: this.configuration.withCredentials, headers: localVarHeaders, diff --git a/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts b/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts index 939f9bcf..bbda4e66 100644 --- a/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts +++ b/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts @@ -29,13 +29,13 @@ export interface SessionServiceInterface { * * @param body */ - createSession(body: string, extraHttpRequestParams?: any): Observable; + createSession(body: number, extraHttpRequestParams?: any): Observable; /** * * - * @param sessionId + * @param userId */ - getSession(sessionId: number, extraHttpRequestParams?: any): Observable; + getSessions(userId: number, extraHttpRequestParams?: any): Observable>; } diff --git a/webapp/src/app/core/modules/openapi/model/message.ts b/webapp/src/app/core/modules/openapi/model/message.ts index 433adabc..77128bbb 100644 --- a/webapp/src/app/core/modules/openapi/model/message.ts +++ b/webapp/src/app/core/modules/openapi/model/message.ts @@ -9,7 +9,6 @@ * https://openapi-generator.tech * Do not edit the class manually. */ -import { Session } from './session'; export interface Message { @@ -17,7 +16,7 @@ export interface Message { sentAt: string; sender: Message.SenderEnum; content: string; - session: Session; + sessionId: number; } export namespace Message { export type SenderEnum = 'SYSTEM' | 'USER'; diff --git a/webapp/src/app/core/modules/openapi/model/session.ts b/webapp/src/app/core/modules/openapi/model/session.ts index ca2b16ce..71b4288e 100644 --- a/webapp/src/app/core/modules/openapi/model/session.ts +++ b/webapp/src/app/core/modules/openapi/model/session.ts @@ -10,13 +10,12 @@ * Do not edit the class manually. */ import { Message } from './message'; -import { UserInfo } from './user-info'; export interface Session { id: number; messages: Array; - user: UserInfo; + userId: number; creationDate: string; } From 52b1b0fb122ca8b0de12d29d92ba711def9b86f9 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Thu, 21 Nov 2024 12:45:18 +0100 Subject: [PATCH 13/70] Update message params --- server/application-server/openapi.yaml | 52 +++++++++++-------- .../chat/message/MessageController.java | 6 +-- .../chat/message/MessageService.java | 12 ++--- .../modules/openapi/api/message.service.ts | 22 ++++---- .../openapi/api/message.serviceInterface.ts | 5 +- 5 files changed, 52 insertions(+), 45 deletions(-) diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index 43dc861a..a0f63bf4 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -52,16 +52,43 @@ paths: application/json: schema: $ref: "#/components/schemas/Session" - /messages: + /messages/{sessionId}: + get: + tags: + - message + operationId: getMessages + parameters: + - name: sessionId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Message" post: tags: - message operationId: createMessage + parameters: + - name: sessionId + in: path + required: true + schema: + type: integer + format: int64 requestBody: content: application/json: schema: - $ref: "#/components/schemas/Message" + type: string required: true responses: "200": @@ -100,27 +127,6 @@ paths: application/json: schema: $ref: "#/components/schemas/MetaData" - /messages/{sessionId}: - get: - tags: - - message - operationId: getMessages - parameters: - - name: sessionId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/Message" /leaderboard: get: tags: diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java index 5275c21a..54621397 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java @@ -25,9 +25,9 @@ public ResponseEntity> getMessages(@PathVariable Long sessionId return ResponseEntity.ok(messages); } - @PostMapping - public ResponseEntity createMessage(@RequestBody MessageDTO message) { - MessageDTO createdMessage = messageService.sendMessage(message); + @PostMapping("/{sessionId}") + public ResponseEntity createMessage(@RequestBody String message, @PathVariable Long sessionId) { + MessageDTO createdMessage = messageService.sendMessage(message, sessionId); return ResponseEntity.ok(createdMessage); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index c07c55a9..1012b932 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -11,9 +11,6 @@ import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatRequest; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatResponse; -/** - * Service for managing messages. - */ @Service public class MessageService { @@ -34,14 +31,14 @@ public List getMessagesBySessionId(Long sessionId) { .toList(); } - public MessageDTO sendMessage(MessageDTO messageDTO) { - Session session = sessionRepository.findById(messageDTO.sessionId()) + public MessageDTO sendMessage(String content, Long sessionId) { + Session session = sessionRepository.findById(sessionId) .orElseThrow(() -> new IllegalArgumentException("Session not found")); - Message userMessage = new Message(messageDTO.sentAt(), MessageSender.USER, messageDTO.content(), session); + Message userMessage = new Message(ZonedDateTime.now(), MessageSender.USER, content, session); messageRepository.save(userMessage); - String systemResponse = generateResponse(messageDTO.sessionId(), messageDTO.content()); + String systemResponse = generateResponse(sessionId, content); Message systemMessage = new Message(ZonedDateTime.now(), MessageSender.SYSTEM, systemResponse, session); messageRepository.save(systemMessage); @@ -50,7 +47,6 @@ public MessageDTO sendMessage(MessageDTO messageDTO) { systemMessage.getContent(), systemMessage.getSession().getId()); } - private String generateResponse(Long session_id, String messageContent) { ChatRequest chatRequest = new ChatRequest(); chatRequest.setSessionId(session_id.toString()); diff --git a/webapp/src/app/core/modules/openapi/api/message.service.ts b/webapp/src/app/core/modules/openapi/api/message.service.ts index 43f1394a..992c168e 100644 --- a/webapp/src/app/core/modules/openapi/api/message.service.ts +++ b/webapp/src/app/core/modules/openapi/api/message.service.ts @@ -96,16 +96,20 @@ export class MessageService implements MessageServiceInterface { } /** - * @param message + * @param sessionId + * @param body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public createMessage(message: Message, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; - public createMessage(message: Message, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public createMessage(message: Message, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public createMessage(message: Message, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { - if (message === null || message === undefined) { - throw new Error('Required parameter message was null or undefined when calling createMessage.'); + public createMessage(sessionId: number, body: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public createMessage(sessionId: number, body: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createMessage(sessionId: number, body: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createMessage(sessionId: number, body: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + if (sessionId === null || sessionId === undefined) { + throw new Error('Required parameter sessionId was null or undefined when calling createMessage.'); + } + if (body === null || body === undefined) { + throw new Error('Required parameter body was null or undefined when calling createMessage.'); } let localVarHeaders = this.defaultHeaders; @@ -153,11 +157,11 @@ export class MessageService implements MessageServiceInterface { } } - let localVarPath = `/messages`; + let localVarPath = `/messages/${this.configuration.encodeParam({name: "sessionId", value: sessionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int64"})}`; return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, { context: localVarHttpContext, - body: message, + body: body, responseType: responseType_, withCredentials: this.configuration.withCredentials, headers: localVarHeaders, diff --git a/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts b/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts index 68611d41..de6f9c65 100644 --- a/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts +++ b/webapp/src/app/core/modules/openapi/api/message.serviceInterface.ts @@ -27,9 +27,10 @@ export interface MessageServiceInterface { /** * * - * @param message + * @param sessionId + * @param body */ - createMessage(message: Message, extraHttpRequestParams?: any): Observable; + createMessage(sessionId: number, body: string, extraHttpRequestParams?: any): Observable; /** * From edc4dee31f4b1272e9d2e6aaf86b18a80a58e6d8 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Thu, 21 Nov 2024 16:17:50 +0100 Subject: [PATCH 14/70] Change DTO params --- .../www1/hephaestus/chat/session/SessionController.java | 8 ++++---- .../tum/in/www1/hephaestus/chat/session/SessionDTO.java | 4 ++-- .../www1/hephaestus/chat/session/SessionRepository.java | 4 ++-- .../in/www1/hephaestus/chat/session/SessionService.java | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java index 03cccc3f..5242b603 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java @@ -23,14 +23,14 @@ public SessionController(SessionService sessionService) { } @GetMapping - public ResponseEntity> getSessions(@RequestParam Long userId) { - List sessions = sessionService.findAllSessionsByUser(userId); + public ResponseEntity> getSessions(@RequestParam String login) { + List sessions = sessionService.findAllSessionsByUser(login); return ResponseEntity.ok(sessions); } @PostMapping - public ResponseEntity createSession(@RequestBody Long userId) { - SessionDTO session = sessionService.createSession(userId); + public ResponseEntity createSession(@RequestBody String login) { + SessionDTO session = sessionService.createSession(login); return ResponseEntity.ok(session); } diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java index 738cdb06..41152e7d 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java @@ -12,14 +12,14 @@ public record SessionDTO( @NonNull Long id, @NonNull List messages, - @NonNull Long userId, + @NonNull String userLogin, @NonNull ZonedDateTime creationDate) { public static SessionDTO fromSession(Session session) { return new SessionDTO( session.getId(), session.getMessages().stream().map(MessageDTO::fromMessage).toList(), - session.getUser().getId(), + session.getUser().getLogin(), session.getCreationDate()); } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java index d518232b..034c4f8a 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java @@ -1,6 +1,7 @@ package de.tum.in.www1.hephaestus.chat.session; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.Optional; @@ -9,6 +10,5 @@ @Repository public interface SessionRepository extends JpaRepository { - Optional> findByUserId(Long userId); - + Optional> findByUserLogin(@Param("login") String login); } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index f0cc0a17..463daf1c 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -19,8 +19,8 @@ public SessionService(SessionRepository sessionRepository) { this.sessionRepository = sessionRepository; } - public List findAllSessionsByUser(Long userId) { - Optional> sessions = sessionRepository.findByUserId(userId); + public List findAllSessionsByUser(String login) { + Optional> sessions = sessionRepository.findByUserLogin(login); if (sessions.isEmpty()) { return List.of(); } @@ -31,9 +31,9 @@ public Optional findSessionById(Long sessionId) { return sessionRepository.findById(sessionId).map(SessionDTO::fromSession); } - public SessionDTO createSession(Long userId) { + public SessionDTO createSession(String login) { Session session = new Session(); - var user = userRepository.findById(userId); + var user = userRepository.findByLogin(login); if (user.isPresent()){ session.setUser(user.get()); } From 323334490b2f69a2a3899abca45301a0656b81bc Mon Sep 17 00:00:00 2001 From: milenasrb Date: Thu, 21 Nov 2024 16:19:55 +0100 Subject: [PATCH 15/70] Update api --- server/application-server/openapi.yaml | 15 +++++------ .../modules/openapi/api/session.service.ts | 26 +++++++++---------- .../openapi/api/session.serviceInterface.ts | 6 ++--- .../app/core/modules/openapi/model/session.ts | 2 +- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index a0f63bf4..838db5fa 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -19,12 +19,11 @@ paths: - session operationId: getSessions parameters: - - name: userId + - name: login in: query required: true schema: - type: integer - format: int64 + type: string responses: "200": description: OK @@ -42,8 +41,7 @@ paths: content: application/json: schema: - type: integer - format: int64 + type: string required: true responses: "200": @@ -501,7 +499,7 @@ components: - creationDate - id - messages - - userId + - userLogin type: object properties: id: @@ -511,9 +509,8 @@ components: type: array items: $ref: "#/components/schemas/Message" - userId: - type: integer - format: int64 + userLogin: + type: string creationDate: type: string format: date-time diff --git a/webapp/src/app/core/modules/openapi/api/session.service.ts b/webapp/src/app/core/modules/openapi/api/session.service.ts index 359f74d0..c6484230 100644 --- a/webapp/src/app/core/modules/openapi/api/session.service.ts +++ b/webapp/src/app/core/modules/openapi/api/session.service.ts @@ -100,10 +100,10 @@ export class SessionService implements SessionServiceInterface { * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public createSession(body: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; - public createSession(body: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public createSession(body: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public createSession(body: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + public createSession(body: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public createSession(body: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createSession(body: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public createSession(body: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { if (body === null || body === undefined) { throw new Error('Required parameter body was null or undefined when calling createSession.'); } @@ -169,22 +169,22 @@ export class SessionService implements SessionServiceInterface { } /** - * @param userId + * @param login * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public getSessions(userId: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public getSessions(userId: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>>; - public getSessions(userId: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>>; - public getSessions(userId: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { - if (userId === null || userId === undefined) { - throw new Error('Required parameter userId was null or undefined when calling getSessions.'); + public getSessions(login: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public getSessions(login: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>>; + public getSessions(login: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>>; + public getSessions(login: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + if (login === null || login === undefined) { + throw new Error('Required parameter login was null or undefined when calling getSessions.'); } let localVarQueryParameters = new HttpParams({encoder: this.encoder}); - if (userId !== undefined && userId !== null) { + if (login !== undefined && login !== null) { localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, - userId, 'userId'); + login, 'login'); } let localVarHeaders = this.defaultHeaders; diff --git a/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts b/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts index bbda4e66..1ff89f97 100644 --- a/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts +++ b/webapp/src/app/core/modules/openapi/api/session.serviceInterface.ts @@ -29,13 +29,13 @@ export interface SessionServiceInterface { * * @param body */ - createSession(body: number, extraHttpRequestParams?: any): Observable; + createSession(body: string, extraHttpRequestParams?: any): Observable; /** * * - * @param userId + * @param login */ - getSessions(userId: number, extraHttpRequestParams?: any): Observable>; + getSessions(login: string, extraHttpRequestParams?: any): Observable>; } diff --git a/webapp/src/app/core/modules/openapi/model/session.ts b/webapp/src/app/core/modules/openapi/model/session.ts index 71b4288e..725a34f5 100644 --- a/webapp/src/app/core/modules/openapi/model/session.ts +++ b/webapp/src/app/core/modules/openapi/model/session.ts @@ -15,7 +15,7 @@ import { Message } from './message'; export interface Session { id: number; messages: Array; - userId: number; + userLogin: string; creationDate: string; } From 68dfb8087a512d96b08248bfe1a5aac377d5176c Mon Sep 17 00:00:00 2001 From: milenasrb Date: Thu, 21 Nov 2024 17:11:17 +0100 Subject: [PATCH 16/70] Change id generation --- .../java/de/tum/in/www1/hephaestus/chat/message/Message.java | 4 ++++ .../java/de/tum/in/www1/hephaestus/chat/session/Session.java | 3 +++ 2 files changed, 7 insertions(+) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index 86f8c2fb..86693081 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -17,6 +17,10 @@ @ToString(callSuper = true) @RequiredArgsConstructor public class Message extends BaseGitServiceEntity { + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + protected Long id; + @NonNull @Column(name = "sent_at") private final ZonedDateTime sentAt; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index f9e9a6f4..cddd1951 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -19,6 +19,9 @@ @ToString(callSuper = true) @NoArgsConstructor public class Session extends BaseGitServiceEntity { + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + protected Long id; @OrderColumn(name = "message_order") @OneToMany(mappedBy = "session") From 2bbd8c81cbc9633424a87b254721dbc5a7d47ba4 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Fri, 22 Nov 2024 15:00:12 +0100 Subject: [PATCH 17/70] Change ZonedDateTime to Offset --- .../www1/hephaestus/chat/message/Message.java | 11 +++++++---- .../hephaestus/chat/message/MessageDTO.java | 4 ++-- .../hephaestus/chat/message/MessageService.java | 6 +++--- .../www1/hephaestus/chat/session/Session.java | 17 +++++++++-------- .../hephaestus/chat/session/SessionDTO.java | 8 ++++---- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index 86693081..ec9980b2 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -1,14 +1,13 @@ package de.tum.in.www1.hephaestus.chat.message; import jakarta.persistence.*; -import java.time.ZonedDateTime; +import java.time.OffsetDateTime; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.ToString; import org.springframework.lang.NonNull; import de.tum.in.www1.hephaestus.chat.session.Session; -import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; @Entity @Table(name = "message") @@ -16,14 +15,18 @@ @Setter @ToString(callSuper = true) @RequiredArgsConstructor -public class Message extends BaseGitServiceEntity { +public class Message { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) protected Long id; + + @NonNull + @Column(name = "created_at") + protected OffsetDateTime createdAt = OffsetDateTime.now(); @NonNull @Column(name = "sent_at") - private final ZonedDateTime sentAt; + private OffsetDateTime sentAt; @NonNull @Enumerated(EnumType.STRING) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java index 925e8fbe..370fdd6c 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageDTO.java @@ -1,6 +1,6 @@ package de.tum.in.www1.hephaestus.chat.message; -import java.time.ZonedDateTime; +import java.time.OffsetDateTime; import org.springframework.lang.NonNull; import com.fasterxml.jackson.annotation.JsonInclude; @@ -10,7 +10,7 @@ @JsonInclude(JsonInclude.Include.NON_EMPTY) public record MessageDTO( @NonNull Long id, - @NonNull ZonedDateTime sentAt, + @NonNull OffsetDateTime sentAt, @NonNull MessageSender sender, @NonNull String content, @NonNull Long sessionId) { diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 1012b932..c01f92e4 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -1,6 +1,6 @@ package de.tum.in.www1.hephaestus.chat.message; -import java.time.ZonedDateTime; +import java.time.OffsetDateTime; import java.util.List; import org.springframework.stereotype.Service; @@ -35,12 +35,12 @@ public MessageDTO sendMessage(String content, Long sessionId) { Session session = sessionRepository.findById(sessionId) .orElseThrow(() -> new IllegalArgumentException("Session not found")); - Message userMessage = new Message(ZonedDateTime.now(), MessageSender.USER, content, session); + Message userMessage = new Message(OffsetDateTime.now(), MessageSender.USER, content, session); messageRepository.save(userMessage); String systemResponse = generateResponse(sessionId, content); - Message systemMessage = new Message(ZonedDateTime.now(), MessageSender.SYSTEM, systemResponse, session); + Message systemMessage = new Message(OffsetDateTime.now(), MessageSender.SYSTEM, systemResponse, session); messageRepository.save(systemMessage); return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index cddd1951..f5e46174 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -1,15 +1,15 @@ package de.tum.in.www1.hephaestus.chat.session; -import java.time.ZonedDateTime; +import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.springframework.lang.NonNull; import jakarta.persistence.*; import de.tum.in.www1.hephaestus.chat.message.Message; -import de.tum.in.www1.hephaestus.gitprovider.common.BaseGitServiceEntity; import de.tum.in.www1.hephaestus.gitprovider.user.User; @Entity @@ -17,18 +17,19 @@ @Getter @Setter @ToString(callSuper = true) -@NoArgsConstructor -public class Session extends BaseGitServiceEntity { +@RequiredArgsConstructor +public class Session { @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) + @GeneratedValue(strategy = GenerationType.IDENTITY) protected Long id; @OrderColumn(name = "message_order") @OneToMany(mappedBy = "session") private List messages = new ArrayList<>(); - @Column(name = "creation_date") - private ZonedDateTime creationDate = ZonedDateTime.now(); + @NonNull + @Column(name = "created_at") + protected OffsetDateTime createdAt = OffsetDateTime.now(); @ManyToOne @JoinColumn(name = "user_id") diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java index 41152e7d..6bbabdbc 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionDTO.java @@ -1,10 +1,10 @@ package de.tum.in.www1.hephaestus.chat.session; -import java.time.ZonedDateTime; - import org.springframework.lang.NonNull; import com.fasterxml.jackson.annotation.JsonInclude; + import java.util.List; +import java.time.OffsetDateTime; import de.tum.in.www1.hephaestus.chat.message.MessageDTO; @@ -13,13 +13,13 @@ public record SessionDTO( @NonNull Long id, @NonNull List messages, @NonNull String userLogin, - @NonNull ZonedDateTime creationDate) { + @NonNull OffsetDateTime createdAt) { public static SessionDTO fromSession(Session session) { return new SessionDTO( session.getId(), session.getMessages().stream().map(MessageDTO::fromMessage).toList(), session.getUser().getLogin(), - session.getCreationDate()); + session.getCreatedAt()); } } \ No newline at end of file From d956490210a32051ca898be49b3d5ad0c753596e Mon Sep 17 00:00:00 2001 From: milenasrb Date: Fri, 22 Nov 2024 19:14:33 +0100 Subject: [PATCH 18/70] Change creation prop --- server/application-server/openapi.yaml | 4 ++-- webapp/src/app/core/modules/openapi/model/session.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index 70906ab0..9606c475 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -500,7 +500,7 @@ components: format: int32 Session: required: - - creationDate + - createdAt - id - messages - userLogin @@ -515,6 +515,6 @@ components: $ref: "#/components/schemas/Message" userLogin: type: string - creationDate: + createdAt: type: string format: date-time diff --git a/webapp/src/app/core/modules/openapi/model/session.ts b/webapp/src/app/core/modules/openapi/model/session.ts index 725a34f5..1b149938 100644 --- a/webapp/src/app/core/modules/openapi/model/session.ts +++ b/webapp/src/app/core/modules/openapi/model/session.ts @@ -16,6 +16,6 @@ export interface Session { id: number; messages: Array; userLogin: string; - creationDate: string; + createdAt: string; } From cb11c80af76c311e1ea419c00faeed7313cee790 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Fri, 22 Nov 2024 19:48:20 +0100 Subject: [PATCH 19/70] Update saving process --- .../java/de/tum/in/www1/hephaestus/chat/message/Message.java | 4 ---- .../tum/in/www1/hephaestus/chat/message/MessageService.java | 4 ++-- .../tum/in/www1/hephaestus/chat/session/SessionService.java | 4 ++-- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index ec9980b2..cfab9ee6 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -19,10 +19,6 @@ public class Message { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) protected Long id; - - @NonNull - @Column(name = "created_at") - protected OffsetDateTime createdAt = OffsetDateTime.now(); @NonNull @Column(name = "sent_at") diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index c01f92e4..9540d8a3 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -36,12 +36,12 @@ public MessageDTO sendMessage(String content, Long sessionId) { .orElseThrow(() -> new IllegalArgumentException("Session not found")); Message userMessage = new Message(OffsetDateTime.now(), MessageSender.USER, content, session); - messageRepository.save(userMessage); + messageRepository.saveAndFlush(userMessage); String systemResponse = generateResponse(sessionId, content); Message systemMessage = new Message(OffsetDateTime.now(), MessageSender.SYSTEM, systemResponse, session); - messageRepository.save(systemMessage); + messageRepository.saveAndFlush(systemMessage); return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), systemMessage.getContent(), systemMessage.getSession().getId()); diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index 463daf1c..cebb20bd 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -37,7 +37,7 @@ public SessionDTO createSession(String login) { if (user.isPresent()){ session.setUser(user.get()); } - session.setCreatedAt(OffsetDateTime.now()); - return SessionDTO.fromSession(sessionRepository.save(session)); + + return SessionDTO.fromSession(sessionRepository.saveAndFlush(session)); } } \ No newline at end of file From 042da8137c9e9756a0af90b1249627bea4b4ff81 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sat, 23 Nov 2024 15:26:50 +0100 Subject: [PATCH 20/70] Fix repository bug --- .../chat/message/MessageService.java | 12 +++++++----- .../www1/hephaestus/chat/session/Session.java | 4 ++-- .../chat/session/SessionService.java | 19 ++++++++----------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 9540d8a3..0739bed0 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -38,13 +38,15 @@ public MessageDTO sendMessage(String content, Long sessionId) { Message userMessage = new Message(OffsetDateTime.now(), MessageSender.USER, content, session); messageRepository.saveAndFlush(userMessage); - String systemResponse = generateResponse(sessionId, content); + // String systemResponse = generateResponse(sessionId, content); - Message systemMessage = new Message(OffsetDateTime.now(), MessageSender.SYSTEM, systemResponse, session); - messageRepository.saveAndFlush(systemMessage); + // Message systemMessage = new Message(OffsetDateTime.now(), MessageSender.SYSTEM, systemResponse, session); + // messageRepository.saveAndFlush(systemMessage); - return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), - systemMessage.getContent(), systemMessage.getSession().getId()); + // return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), + // systemMessage.getContent(), systemMessage.getSession().getId()); + return new MessageDTO(userMessage.getId(), userMessage.getSentAt(), userMessage.getSender(), + userMessage.getContent(), userMessage.getSession().getId()); } private String generateResponse(Long session_id, String messageContent) { diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index f5e46174..2900f52e 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -28,8 +28,8 @@ public class Session { private List messages = new ArrayList<>(); @NonNull - @Column(name = "created_at") - protected OffsetDateTime createdAt = OffsetDateTime.now(); + @Column(name = "created_at", nullable = false, updatable = false) + protected OffsetDateTime createdAt; @ManyToOne @JoinColumn(name = "user_id") diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index cebb20bd..e83ea3f2 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -4,20 +4,17 @@ import org.springframework.stereotype.Service; import de.tum.in.www1.hephaestus.gitprovider.user.UserRepository; -import java.time.OffsetDateTime; import java.util.Optional; +import java.time.OffsetDateTime; import java.util.List; @Service public class SessionService { - - private final SessionRepository sessionRepository; + @Autowired + private SessionRepository sessionRepository; @Autowired private UserRepository userRepository; - public SessionService(SessionRepository sessionRepository) { - this.sessionRepository = sessionRepository; - } public List findAllSessionsByUser(String login) { Optional> sessions = sessionRepository.findByUserLogin(login); @@ -32,11 +29,11 @@ public Optional findSessionById(Long sessionId) { } public SessionDTO createSession(String login) { - Session session = new Session(); - var user = userRepository.findByLogin(login); - if (user.isPresent()){ - session.setUser(user.get()); - } + var user = userRepository.findByLogin(login) + .orElseThrow(() -> new IllegalArgumentException("User not found: " + login)); + + Session session = new Session(OffsetDateTime.now()); + session.setUser(user); return SessionDTO.fromSession(sessionRepository.saveAndFlush(session)); } From 25941cb704d15ec9ed58481d4f0b783ba374d38c Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sat, 23 Nov 2024 17:01:21 +0100 Subject: [PATCH 21/70] Fix database bugs --- .../www1/hephaestus/chat/message/Message.java | 4 +-- .../chat/message/MessageService.java | 30 +++++++++---------- .../www1/hephaestus/chat/session/Session.java | 10 +++---- .../chat/session/SessionService.java | 13 ++++---- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index cfab9ee6..b983d4d5 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -18,11 +18,11 @@ public class Message { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) - protected Long id; + private Long id; @NonNull @Column(name = "sent_at") - private OffsetDateTime sentAt; + private OffsetDateTime sentAt = OffsetDateTime.now(); @NonNull @Enumerated(EnumType.STRING) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 0739bed0..bb1635cd 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -1,8 +1,8 @@ package de.tum.in.www1.hephaestus.chat.message; -import java.time.OffsetDateTime; import java.util.List; - +import java.util.Optional; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; import de.tum.in.www1.hephaestus.chat.session.Session; @@ -14,13 +14,13 @@ @Service public class MessageService { - private final SessionRepository sessionRepository; - private final MessageRepository messageRepository; - private final DefaultApi sessionApiClient; + private DefaultApi sessionApiClient; + @Autowired + private SessionRepository sessionRepository; + @Autowired + private MessageRepository messageRepository; - public MessageService(SessionRepository sessionRepository, MessageRepository messageRepository) { - this.sessionRepository = sessionRepository; - this.messageRepository = messageRepository; + public MessageService() { this.sessionApiClient = new DefaultApi(); } @@ -32,12 +32,13 @@ public List getMessagesBySessionId(Long sessionId) { } public MessageDTO sendMessage(String content, Long sessionId) { - Session session = sessionRepository.findById(sessionId) - .orElseThrow(() -> new IllegalArgumentException("Session not found")); - - Message userMessage = new Message(OffsetDateTime.now(), MessageSender.USER, content, session); - messageRepository.saveAndFlush(userMessage); + Optional session = sessionRepository.findById(sessionId); + if (session.isEmpty()) { + return null; + } + Message userMessage = new Message(MessageSender.USER, content, session.get()); + // String systemResponse = generateResponse(sessionId, content); // Message systemMessage = new Message(OffsetDateTime.now(), MessageSender.SYSTEM, systemResponse, session); @@ -45,8 +46,7 @@ public MessageDTO sendMessage(String content, Long sessionId) { // return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), // systemMessage.getContent(), systemMessage.getSession().getId()); - return new MessageDTO(userMessage.getId(), userMessage.getSentAt(), userMessage.getSender(), - userMessage.getContent(), userMessage.getSession().getId()); + return MessageDTO.fromMessage(messageRepository.save(userMessage)); } private String generateResponse(Long session_id, String messageContent) { diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index 2900f52e..7648b383 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import org.springframework.lang.NonNull; @@ -17,19 +17,19 @@ @Getter @Setter @ToString(callSuper = true) -@RequiredArgsConstructor +@NoArgsConstructor public class Session { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - protected Long id; + private Long id; @OrderColumn(name = "message_order") @OneToMany(mappedBy = "session") private List messages = new ArrayList<>(); @NonNull - @Column(name = "created_at", nullable = false, updatable = false) - protected OffsetDateTime createdAt; + @Column(name = "created_at") + private OffsetDateTime createdAt = OffsetDateTime.now(); @ManyToOne @JoinColumn(name = "user_id") diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index e83ea3f2..5f4bf8c4 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -5,7 +5,6 @@ import de.tum.in.www1.hephaestus.gitprovider.user.UserRepository; import java.util.Optional; -import java.time.OffsetDateTime; import java.util.List; @Service @@ -29,12 +28,14 @@ public Optional findSessionById(Long sessionId) { } public SessionDTO createSession(String login) { - var user = userRepository.findByLogin(login) - .orElseThrow(() -> new IllegalArgumentException("User not found: " + login)); + var user = userRepository.findByLogin(login); + if (user.isEmpty()) { + return null; + } - Session session = new Session(OffsetDateTime.now()); - session.setUser(user); + Session session = new Session(); + session.setUser(user.get()); - return SessionDTO.fromSession(sessionRepository.saveAndFlush(session)); + return SessionDTO.fromSession(sessionRepository.save(session)); } } \ No newline at end of file From bcf8b0a29b80219ca9c5e652e54b62fd831a4b1d Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sat, 23 Nov 2024 19:01:19 +0100 Subject: [PATCH 22/70] Fix database updates --- .../www1/hephaestus/chat/message/Message.java | 8 ++++---- .../hephaestus/chat/message/MessageService.java | 17 +++++++++++------ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index b983d4d5..14139be3 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -3,7 +3,7 @@ import jakarta.persistence.*; import java.time.OffsetDateTime; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import org.springframework.lang.NonNull; @@ -14,12 +14,12 @@ @Getter @Setter @ToString(callSuper = true) -@RequiredArgsConstructor +@NoArgsConstructor public class Message { @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - + @NonNull @Column(name = "sent_at") private OffsetDateTime sentAt = OffsetDateTime.now(); diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index bb1635cd..0159174c 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -32,20 +32,25 @@ public List getMessagesBySessionId(Long sessionId) { } public MessageDTO sendMessage(String content, Long sessionId) { - Optional session = sessionRepository.findById(sessionId); + Optional session = sessionRepository.findById(sessionId); if (session.isEmpty()) { return null; } - Message userMessage = new Message(MessageSender.USER, content, session.get()); - + Message userMessage = new Message(); + userMessage.setSender(MessageSender.USER); + userMessage.setContent(content); + userMessage.setSession(session.get()); + // String systemResponse = generateResponse(sessionId, content); - // Message systemMessage = new Message(OffsetDateTime.now(), MessageSender.SYSTEM, systemResponse, session); + // Message systemMessage = new Message(OffsetDateTime.now(), + // MessageSender.SYSTEM, systemResponse, session); // messageRepository.saveAndFlush(systemMessage); - // return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), systemMessage.getSender(), - // systemMessage.getContent(), systemMessage.getSession().getId()); + // return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), + // systemMessage.getSender(), + // systemMessage.getContent(), systemMessage.getSession().getId()); return MessageDTO.fromMessage(messageRepository.save(userMessage)); } From cece4a2a70018ba0a74a5cced2159a440f37f945 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sat, 23 Nov 2024 23:30:46 +0100 Subject: [PATCH 23/70] Add fastapi connection --- .../chat/message/MessageService.java | 22 +++++++++++-------- .../chat/session/SessionController.java | 10 --------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 0159174c..4884906c 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -33,7 +33,7 @@ public List getMessagesBySessionId(Long sessionId) { public MessageDTO sendMessage(String content, Long sessionId) { Optional session = sessionRepository.findById(sessionId); - if (session.isEmpty()) { + if (session.isEmpty() || content == null) { return null; } @@ -41,17 +41,21 @@ public MessageDTO sendMessage(String content, Long sessionId) { userMessage.setSender(MessageSender.USER); userMessage.setContent(content); userMessage.setSession(session.get()); + Message savedUserMessage = messageRepository.save(userMessage); - // String systemResponse = generateResponse(sessionId, content); + String systemResponse = generateResponse(sessionId, content); - // Message systemMessage = new Message(OffsetDateTime.now(), - // MessageSender.SYSTEM, systemResponse, session); - // messageRepository.saveAndFlush(systemMessage); + Message systemMessage = new Message(); + systemMessage.setSender(MessageSender.SYSTEM); + systemMessage.setContent(systemResponse); + systemMessage.setSession(session.get()); + Message savedSystemMessage = messageRepository.save(systemMessage); - // return new MessageDTO(systemMessage.getId(), systemMessage.getSentAt(), - // systemMessage.getSender(), - // systemMessage.getContent(), systemMessage.getSession().getId()); - return MessageDTO.fromMessage(messageRepository.save(userMessage)); + session.get().getMessages().add(savedUserMessage); + session.get().getMessages().add(savedSystemMessage); + sessionRepository.save(session.get()); + + return MessageDTO.fromMessage(savedSystemMessage); } private String generateResponse(Long session_id, String messageContent) { diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java index 5242b603..515daa88 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java @@ -11,7 +11,6 @@ import org.springframework.http.ResponseEntity; - @RestController @RequestMapping("/sessions") public class SessionController { @@ -33,13 +32,4 @@ public ResponseEntity createSession(@RequestBody String login) { SessionDTO session = sessionService.createSession(login); return ResponseEntity.ok(session); } - - /* - @GetMapping("/session/{sessionId}") - public ResponseEntity getSession(@PathVariable Long sessionId) { - Optional session = sessionService.findSessionById(sessionId); - return ResponseEntity.ok(session.get()); - } -*/ - } \ No newline at end of file From c504570a8555496de931a6d2e45e4150c313347d Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sun, 24 Nov 2024 13:31:38 +0100 Subject: [PATCH 24/70] Update FastAPI connection --- .../hephaestus/chat/message/MessageService.java | 17 ++++++++++++++--- server/intelligence-service/app/main.py | 14 ++++++++------ server/intelligence-service/app/model.py | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 4884906c..f05653ac 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -7,6 +7,7 @@ import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; import de.tum.in.www1.hephaestus.chat.session.Session; import de.tum.in.www1.hephaestus.chat.session.SessionRepository; +import de.tum.in.www1.hephaestus.intelligenceservice.ApiClient; import de.tum.in.www1.hephaestus.intelligenceservice.api.DefaultApi; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatRequest; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatResponse; @@ -21,7 +22,9 @@ public class MessageService { private MessageRepository messageRepository; public MessageService() { - this.sessionApiClient = new DefaultApi(); + ApiClient apiClient = new ApiClient(); + apiClient.setBasePath("http://127.0.0.1:8000"); + this.sessionApiClient = new DefaultApi(apiClient); } public List getMessagesBySessionId(Long sessionId) { @@ -41,21 +44,29 @@ public MessageDTO sendMessage(String content, Long sessionId) { userMessage.setSender(MessageSender.USER); userMessage.setContent(content); userMessage.setSession(session.get()); + Message savedUserMessage = messageRepository.save(userMessage); + session.get().getMessages().add(savedUserMessage); + sessionRepository.save(session.get()); String systemResponse = generateResponse(sessionId, content); + // prevent saving empty system messages + if (systemResponse == null) { + return MessageDTO.fromMessage(savedUserMessage); + } + Message systemMessage = new Message(); systemMessage.setSender(MessageSender.SYSTEM); systemMessage.setContent(systemResponse); systemMessage.setSession(session.get()); - Message savedSystemMessage = messageRepository.save(systemMessage); - session.get().getMessages().add(savedUserMessage); + Message savedSystemMessage = messageRepository.save(systemMessage); session.get().getMessages().add(savedSystemMessage); sessionRepository.save(session.get()); return MessageDTO.fromMessage(savedSystemMessage); + } private String generateResponse(Long session_id, String messageContent) { diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 97f645db..02018d37 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -1,6 +1,6 @@ from fastapi import FastAPI from pydantic import BaseModel -from .model import chat +from .model import send_message app = FastAPI( title="Hephaestus Intelligence Service API", @@ -25,10 +25,12 @@ class ChatResponse(BaseModel): summary="Start and continue a chat session with an LLM.", ) async def chat(request: ChatRequest): - # TODO: Add state management when implementing more complex chat logic - state = 0 - user_input = request.message_content - result = chat(request.session_id, user_input, state) - state = result["state"] + # TODO: Add step management when implementing more complex chat logic + state = {"messages": [], "step": 0} + + result = send_message(thread_id=request.session_id, + input_message=request.message_content, + state=state) + response_message = result["response"]["messages"][-1].content return ChatResponse(session_id=request.session_id, message_content=response_message) \ No newline at end of file diff --git a/server/intelligence-service/app/model.py b/server/intelligence-service/app/model.py index 557bb603..84db97b8 100644 --- a/server/intelligence-service/app/model.py +++ b/server/intelligence-service/app/model.py @@ -79,7 +79,7 @@ def call_model(state: State): app = workflow.compile(checkpointer=memory) -def chat(thread_id: str, input_message: str, state: State): +def send_message(thread_id: str, input_message: str, state: State): config = {"configurable": {"thread_id": thread_id}} # append the new human message to the conversation state["messages"] += [HumanMessage(input_message)] From e7a137e40e3d012334b8b5a22150771a94225d87 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sun, 24 Nov 2024 13:54:59 +0100 Subject: [PATCH 25/70] Folrmating --- server/intelligence-service/app/main.py | 19 ++++++++++--------- server/intelligence-service/app/model.py | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 02018d37..52019daa 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -9,6 +9,7 @@ contact={"name": "Felix T.J. Dietrich", "email": "felixtj.dietrich@tum.de"}, ) + class ChatRequest(BaseModel): session_id: str message_content: str @@ -25,12 +26,12 @@ class ChatResponse(BaseModel): summary="Start and continue a chat session with an LLM.", ) async def chat(request: ChatRequest): - # TODO: Add step management when implementing more complex chat logic - state = {"messages": [], "step": 0} - - result = send_message(thread_id=request.session_id, - input_message=request.message_content, - state=state) - - response_message = result["response"]["messages"][-1].content - return ChatResponse(session_id=request.session_id, message_content=response_message) \ No newline at end of file + # TODO: Add step management when implementing more complex chat logic + state = {"messages": [], "step": 0} + + result = send_message( + thread_id=request.session_id, input_message=request.message_content, state=state + ) + + response_message = result["response"]["messages"][-1].content + return ChatResponse(session_id=request.session_id, message_content=response_message) diff --git a/server/intelligence-service/app/model.py b/server/intelligence-service/app/model.py index 84db97b8..38a4dc6c 100644 --- a/server/intelligence-service/app/model.py +++ b/server/intelligence-service/app/model.py @@ -61,7 +61,7 @@ class State(TypedDict): token_counter=model, include_system=True, allow_partial=False, - start_on="human", # TODO: change to "system" + start_on="human", # TODO: change to "system" ) From 82d283c22e216a6884970b802d16b8477f7d8a20 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sun, 24 Nov 2024 13:56:11 +0100 Subject: [PATCH 26/70] Formating --- .../tum/in/www1/hephaestus/chat/session/SessionRepository.java | 2 +- .../de/tum/in/www1/hephaestus/chat/session/SessionService.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java index 034c4f8a..6cefc7c0 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java @@ -9,6 +9,6 @@ @Repository public interface SessionRepository extends JpaRepository { - + Optional> findByUserLogin(@Param("login") String login); } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index 5f4bf8c4..a4b010f7 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -14,7 +14,6 @@ public class SessionService { @Autowired private UserRepository userRepository; - public List findAllSessionsByUser(String login) { Optional> sessions = sessionRepository.findByUserLogin(login); if (sessions.isEmpty()) { From f7809dfc15e4847b267dfcef3b79b2a715a8d544 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 13:08:24 +0100 Subject: [PATCH 27/70] Add autowired to messageservice --- .../www1/hephaestus/chat/message/MessageController.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java index 54621397..00aa166d 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java @@ -1,5 +1,6 @@ package de.tum.in.www1.hephaestus.chat.message; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -7,17 +8,14 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - import java.util.List; @RestController @RequestMapping("/messages") public class MessageController { - private final MessageService messageService; - public MessageController(MessageService messageService) { - this.messageService = messageService; - } + @Autowired + private MessageService messageService; @GetMapping("/{sessionId}") public ResponseEntity> getMessages(@PathVariable Long sessionId) { From 156102343c238174d319d1660381919528a7a600 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 17:24:36 +0100 Subject: [PATCH 28/70] Resolve teams pr conflicts --- server/application-server/openapi.yaml | 192 ++++++++++++------------- 1 file changed, 96 insertions(+), 96 deletions(-) diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index bc88c06d..70abb639 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -210,34 +210,6 @@ paths: responses: "200": description: OK - /workspace/users: - get: - tags: - - workspace - operationId: getUsersWithTeams - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/UserTeams" - /workspace/repositories: - get: - tags: - - workspace - operationId: getRepositoriesToMonitor - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - type: string /sessions: get: tags: @@ -320,6 +292,34 @@ paths: application/json: schema: $ref: "#/components/schemas/Message" + /workspace/users: + get: + tags: + - workspace + operationId: getUsersWithTeams + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/UserTeams" + /workspace/repositories: + get: + tags: + - workspace + operationId: getRepositoriesToMonitor + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: string /user/{login}/profile: get: tags: @@ -516,22 +516,6 @@ components: updatedAt: type: string format: date-time - LabelInfo: - required: - - color - - id - - name - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - color: - type: string - repository: - $ref: "#/components/schemas/RepositoryInfo" Message: required: - content @@ -600,58 +584,6 @@ components: type: string htmlUrl: type: string - PullRequestReviewInfo: - required: - - codeComments - - htmlUrl - - id - - isDismissed - - score - - state - type: object - properties: - id: - type: integer - format: int64 - isDismissed: - type: boolean - state: - type: string - enum: - - COMMENTED - - APPROVED - - CHANGES_REQUESTED - - UNKNOWN - codeComments: - type: integer - format: int32 - author: - $ref: "#/components/schemas/UserInfo" - pullRequest: - $ref: "#/components/schemas/PullRequestBaseInfo" - htmlUrl: - type: string - score: - type: integer - format: int32 - submittedAt: - type: string - format: date-time - MetaData: - required: - - scheduledDay - - scheduledTime - - teams - type: object - properties: - teams: - type: array - items: - $ref: "#/components/schemas/TeamInfo" - scheduledDay: - type: string - scheduledTime: - type: string UserTeams: required: - id @@ -753,6 +685,74 @@ components: type: array items: $ref: "#/components/schemas/LabelInfo" + LabelInfo: + required: + - color + - id + - name + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + color: + type: string + repository: + $ref: "#/components/schemas/RepositoryInfo" + PullRequestReviewInfo: + required: + - codeComments + - htmlUrl + - id + - isDismissed + - score + - state + type: object + properties: + id: + type: integer + format: int64 + isDismissed: + type: boolean + state: + type: string + enum: + - COMMENTED + - APPROVED + - CHANGES_REQUESTED + - UNKNOWN + codeComments: + type: integer + format: int32 + author: + $ref: "#/components/schemas/UserInfo" + pullRequest: + $ref: "#/components/schemas/PullRequestBaseInfo" + htmlUrl: + type: string + score: + type: integer + format: int32 + submittedAt: + type: string + format: date-time + MetaData: + required: + - scheduledDay + - scheduledTime + - teams + type: object + properties: + teams: + type: array + items: + $ref: "#/components/schemas/TeamInfo" + scheduledDay: + type: string + scheduledTime: + type: string LeaderboardEntry: required: - numberOfApprovals From 61e021012b2dd16b7d1ce02bf3ab19df18817ec0 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 17:39:10 +0100 Subject: [PATCH 29/70] Add error handling --- .../chat/message/MessageService.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index f05653ac..7ae90ea2 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -2,6 +2,8 @@ import java.util.List; import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.tum.in.www1.hephaestus.chat.message.Message.MessageSender; @@ -21,6 +23,8 @@ public class MessageService { @Autowired private MessageRepository messageRepository; + private static final Logger logger = LoggerFactory.getLogger(MessageService.class); + public MessageService() { ApiClient apiClient = new ApiClient(); apiClient.setBasePath("http://127.0.0.1:8000"); @@ -29,8 +33,7 @@ public MessageService() { public List getMessagesBySessionId(Long sessionId) { return messageRepository.findBySessionId(sessionId).stream() - .map(message -> new MessageDTO(message.getId(), message.getSentAt(), message.getSender(), - message.getContent(), message.getSession().getId())) + .map(message -> MessageDTO.fromMessage(message)) .toList(); } @@ -39,19 +42,20 @@ public MessageDTO sendMessage(String content, Long sessionId) { if (session.isEmpty() || content == null) { return null; } + Session currentSession = session.get(); Message userMessage = new Message(); userMessage.setSender(MessageSender.USER); userMessage.setContent(content); - userMessage.setSession(session.get()); + userMessage.setSession(currentSession); Message savedUserMessage = messageRepository.save(userMessage); - session.get().getMessages().add(savedUserMessage); - sessionRepository.save(session.get()); + currentSession.getMessages().add(savedUserMessage); + sessionRepository.save(currentSession); String systemResponse = generateResponse(sessionId, content); - // prevent saving empty system messages + // prevent saving empty system messages if the intelligence service is down if (systemResponse == null) { return MessageDTO.fromMessage(savedUserMessage); } @@ -59,11 +63,11 @@ public MessageDTO sendMessage(String content, Long sessionId) { Message systemMessage = new Message(); systemMessage.setSender(MessageSender.SYSTEM); systemMessage.setContent(systemResponse); - systemMessage.setSession(session.get()); + systemMessage.setSession(currentSession); Message savedSystemMessage = messageRepository.save(systemMessage); - session.get().getMessages().add(savedSystemMessage); - sessionRepository.save(session.get()); + currentSession.getMessages().add(savedSystemMessage); + sessionRepository.save(currentSession); return MessageDTO.fromMessage(savedSystemMessage); @@ -78,7 +82,8 @@ private String generateResponse(Long session_id, String messageContent) { ChatResponse chatResponse = sessionApiClient.chatChatPost(chatRequest); return chatResponse.getMessageContent(); } catch (Exception e) { - throw new RuntimeException("Error communicating with intelligence service: " + e.getMessage(), e); + logger.error("Failed to generate response for message: {}", e.getMessage()); + return null; } } } \ No newline at end of file From 470755a1185b32cea4d7a114e465915c072101e7 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 17:39:31 +0100 Subject: [PATCH 30/70] Improve code styling --- .../java/de/tum/in/www1/hephaestus/chat/message/Message.java | 4 +--- .../java/de/tum/in/www1/hephaestus/chat/session/Session.java | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index 14139be3..f6770a99 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -13,7 +13,7 @@ @Table(name = "message") @Getter @Setter -@ToString(callSuper = true) +@ToString @NoArgsConstructor public class Message { @Id @@ -21,7 +21,6 @@ public class Message { private Long id; @NonNull - @Column(name = "sent_at") private OffsetDateTime sentAt = OffsetDateTime.now(); @NonNull @@ -29,7 +28,6 @@ public class Message { private MessageSender sender; @NonNull - @Column(name = "content") private String content; @NonNull diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index 7648b383..075221da 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -16,19 +16,18 @@ @Table(name = "session") @Getter @Setter -@ToString(callSuper = true) +@ToString @NoArgsConstructor public class Session { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OrderColumn(name = "message_order") + @OrderColumn(name = "sent_at") @OneToMany(mappedBy = "session") private List messages = new ArrayList<>(); @NonNull - @Column(name = "created_at") private OffsetDateTime createdAt = OffsetDateTime.now(); @ManyToOne From 5372aa63fd49d128a070b6945678fc3c069c76be Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 17:40:02 +0100 Subject: [PATCH 31/70] Fix coding conventions violiations --- .../hephaestus/chat/message/MessageController.java | 2 +- .../hephaestus/chat/session/SessionController.java | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java index 00aa166d..54a2c4a9 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageController.java @@ -11,7 +11,7 @@ import java.util.List; @RestController -@RequestMapping("/messages") +@RequestMapping("/message") public class MessageController { @Autowired diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java index 515daa88..483eabe2 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionController.java @@ -6,20 +6,16 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.GetMapping; - import java.util.List; - +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @RestController -@RequestMapping("/sessions") +@RequestMapping("/session") public class SessionController { - private final SessionService sessionService; - - public SessionController(SessionService sessionService) { - this.sessionService = sessionService; - } + @Autowired + private SessionService sessionService; @GetMapping public ResponseEntity> getSessions(@RequestParam String login) { From 25c63d42ac90cbed7ea66aa0ff26624e621875d5 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 17:41:24 +0100 Subject: [PATCH 32/70] SImpllify code --- .../in/www1/hephaestus/chat/session/SessionRepository.java | 4 +--- .../in/www1/hephaestus/chat/session/SessionService.java | 7 ++----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java index 6cefc7c0..56ed68e5 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionRepository.java @@ -1,14 +1,12 @@ package de.tum.in.www1.hephaestus.chat.session; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.Optional; import java.util.List; @Repository public interface SessionRepository extends JpaRepository { - Optional> findByUserLogin(@Param("login") String login); + List findByUserLogin(String login); } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java index a4b010f7..405042c5 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/SessionService.java @@ -15,11 +15,8 @@ public class SessionService { private UserRepository userRepository; public List findAllSessionsByUser(String login) { - Optional> sessions = sessionRepository.findByUserLogin(login); - if (sessions.isEmpty()) { - return List.of(); - } - return sessions.get().stream().map(SessionDTO::fromSession).toList(); + List sessions = sessionRepository.findByUserLogin(login); + return sessions.stream().map(SessionDTO::fromSession).toList(); } public Optional findSessionById(Long sessionId) { From de37ad97b8fc1ea465ddb2c50427494b1fd96264 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 17:55:28 +0100 Subject: [PATCH 33/70] Update content col length --- .../java/de/tum/in/www1/hephaestus/chat/message/Message.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index f6770a99..8cf27e7b 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -6,6 +6,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.hibernate.Length; import org.springframework.lang.NonNull; import de.tum.in.www1.hephaestus.chat.session.Session; @@ -28,6 +29,7 @@ public class Message { private MessageSender sender; @NonNull + @Column(length=Length.LONG16) private String content; @NonNull From 91f70404b312f34fa7fd2d91ff618eeb0bf4b02b Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 18:06:58 +0100 Subject: [PATCH 34/70] Update prompt --- server/intelligence-service/app/main.py | 3 +-- server/intelligence-service/app/model.py | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 52019daa..27f9c1a8 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -26,8 +26,7 @@ class ChatResponse(BaseModel): summary="Start and continue a chat session with an LLM.", ) async def chat(request: ChatRequest): - # TODO: Add step management when implementing more complex chat logic - state = {"messages": [], "step": 0} + state = {"messages": []} result = send_message( thread_id=request.session_id, input_message=request.message_content, state=state diff --git a/server/intelligence-service/app/model.py b/server/intelligence-service/app/model.py index 38a4dc6c..aa869f4d 100644 --- a/server/intelligence-service/app/model.py +++ b/server/intelligence-service/app/model.py @@ -34,21 +34,20 @@ def invoke(self, message: str): class State(TypedDict): messages: Annotated[Sequence[BaseMessage], add_messages] - step: int mentor_prompt = ChatPromptTemplate.from_messages( [ ( "system", - "You are an AI mentor helping a students working on the software engineering projects." - + "You need to guide the student through the set of three questions regarding their work on the project during the last week (sprint)." - + "Steps are the indicator of your current task in the conversation with the student. Your current step is {step}. Just follow the instructions and focus on the current step." - + "If your step is 0: greet the student and say you are happy to start the reflective session." - + "If your step is 1: ask the student about the overall progress on the project." - + "If your step is 2: ask the student about the challenges faced during the sprint reffering to what he saied about progress." - + "If your step is 3: ask about the plan for the next sprint." - + "If your step is >3: continue the conversation trying to assist the student.", + "You are an AI mentor helping a students working on the software engineering projects embracing structured self-reflection practices." + + "You need to guide the student through the set questions regarding their work on the project during the last week (sprint). Your value is the fact, that you help students to reflect on their past progress." + + "Throughout the conversation you need to perform all of the following tasks in the given order: " + + "Task 1: Greet the student and say you are happy to start the session.", + + "Task 2: Ask the student about the overall progress on the project.", + + "Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress.", + + "Task 4: Ask about the plan for the next sprint." + + "Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project.", ), MessagesPlaceholder(variable_name="messages"), ] @@ -61,14 +60,14 @@ class State(TypedDict): token_counter=model, include_system=True, allow_partial=False, - start_on="human", # TODO: change to "system" + start_on="system", ) def call_model(state: State): chain = mentor_prompt | model trimmed_messages = trimmer.invoke(state["messages"]) - response = chain.invoke({"messages": trimmed_messages, "step": state["step"]}) + response = chain.invoke({"messages": trimmed_messages}) return {"messages": [response]} @@ -83,10 +82,9 @@ def send_message(thread_id: str, input_message: str, state: State): config = {"configurable": {"thread_id": thread_id}} # append the new human message to the conversation state["messages"] += [HumanMessage(input_message)] - state["step"] += 1 output = app.invoke( - {"messages": state["messages"], "step": state["step"]}, + {"messages": state["messages"]}, config, ) From ad053a4bd0b0c649dc24af0fc6971642035d6914 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 18:20:19 +0100 Subject: [PATCH 35/70] Update naming --- server/application-server/openapi.yaml | 4 ++-- .../de/tum/in/www1/hephaestus/chat/session/Session.java | 2 +- server/intelligence-service/app/model.py | 6 +++--- webapp/src/app/core/modules/openapi/api/api.ts | 2 +- webapp/src/app/core/modules/openapi/api/message.service.ts | 4 ++-- webapp/src/app/core/modules/openapi/api/session.service.ts | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index 70abb639..e03f8e72 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -210,7 +210,7 @@ paths: responses: "200": description: OK - /sessions: + /session: get: tags: - session @@ -247,7 +247,7 @@ paths: application/json: schema: $ref: "#/components/schemas/Session" - /messages/{sessionId}: + /message/{sessionId}: get: tags: - message diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index 075221da..61c524dd 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -23,7 +23,7 @@ public class Session { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OrderColumn(name = "sent_at") + @OrderColumn(name = "sentAt") @OneToMany(mappedBy = "session") private List messages = new ArrayList<>(); diff --git a/server/intelligence-service/app/model.py b/server/intelligence-service/app/model.py index aa869f4d..29282f47 100644 --- a/server/intelligence-service/app/model.py +++ b/server/intelligence-service/app/model.py @@ -43,9 +43,9 @@ class State(TypedDict): "You are an AI mentor helping a students working on the software engineering projects embracing structured self-reflection practices." + "You need to guide the student through the set questions regarding their work on the project during the last week (sprint). Your value is the fact, that you help students to reflect on their past progress." + "Throughout the conversation you need to perform all of the following tasks in the given order: " - + "Task 1: Greet the student and say you are happy to start the session.", - + "Task 2: Ask the student about the overall progress on the project.", - + "Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress.", + + "Task 1: Greet the student and say you are happy to start the session." + + "Task 2: Ask the student about the overall progress on the project." + + "Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress." + "Task 4: Ask about the plan for the next sprint." + "Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project.", ), diff --git a/webapp/src/app/core/modules/openapi/api/api.ts b/webapp/src/app/core/modules/openapi/api/api.ts index e304870c..ad53b41c 100644 --- a/webapp/src/app/core/modules/openapi/api/api.ts +++ b/webapp/src/app/core/modules/openapi/api/api.ts @@ -19,4 +19,4 @@ export * from './user.serviceInterface'; export * from './workspace.service'; import { WorkspaceService } from './workspace.service'; export * from './workspace.serviceInterface'; -export const APIS = [LeaderboardService, MetaService, TeamService, UserService, WorkspaceService, MessageService, SessionService]; +export const APIS = [LeaderboardService, MessageService, MetaService, SessionService, TeamService, UserService, WorkspaceService]; diff --git a/webapp/src/app/core/modules/openapi/api/message.service.ts b/webapp/src/app/core/modules/openapi/api/message.service.ts index 992c168e..7226f1c8 100644 --- a/webapp/src/app/core/modules/openapi/api/message.service.ts +++ b/webapp/src/app/core/modules/openapi/api/message.service.ts @@ -157,7 +157,7 @@ export class MessageService implements MessageServiceInterface { } } - let localVarPath = `/messages/${this.configuration.encodeParam({name: "sessionId", value: sessionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int64"})}`; + let localVarPath = `/message/${this.configuration.encodeParam({name: "sessionId", value: sessionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int64"})}`; return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, { context: localVarHttpContext, @@ -221,7 +221,7 @@ export class MessageService implements MessageServiceInterface { } } - let localVarPath = `/messages/${this.configuration.encodeParam({name: "sessionId", value: sessionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int64"})}`; + let localVarPath = `/message/${this.configuration.encodeParam({name: "sessionId", value: sessionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int64"})}`; return this.httpClient.request>('get', `${this.configuration.basePath}${localVarPath}`, { context: localVarHttpContext, diff --git a/webapp/src/app/core/modules/openapi/api/session.service.ts b/webapp/src/app/core/modules/openapi/api/session.service.ts index c6484230..927a1c16 100644 --- a/webapp/src/app/core/modules/openapi/api/session.service.ts +++ b/webapp/src/app/core/modules/openapi/api/session.service.ts @@ -153,7 +153,7 @@ export class SessionService implements SessionServiceInterface { } } - let localVarPath = `/sessions`; + let localVarPath = `/session`; return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, { context: localVarHttpContext, @@ -223,7 +223,7 @@ export class SessionService implements SessionServiceInterface { } } - let localVarPath = `/sessions`; + let localVarPath = `/session`; return this.httpClient.request>('get', `${this.configuration.basePath}${localVarPath}`, { context: localVarHttpContext, From bf74fdd7dad1113b54b41958bc6f8a2a8d483657 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Mon, 25 Nov 2024 19:02:44 +0100 Subject: [PATCH 36/70] Fix bug --- .../java/de/tum/in/www1/hephaestus/chat/session/Session.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java index 61c524dd..64c7721a 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/session/Session.java @@ -23,7 +23,7 @@ public class Session { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OrderColumn(name = "sentAt") + @OrderColumn @OneToMany(mappedBy = "session") private List messages = new ArrayList<>(); From b63a9df9ba4b970eb67ac62afe2c6ffd989b93f4 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Tue, 26 Nov 2024 10:19:45 +0100 Subject: [PATCH 37/70] Update column type --- .../java/de/tum/in/www1/hephaestus/chat/message/Message.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index 8cf27e7b..6c2bed6a 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -28,8 +28,8 @@ public class Message { @Enumerated(EnumType.STRING) private MessageSender sender; + @Lob @NonNull - @Column(length=Length.LONG16) private String content; @NonNull From 13b80c518e8759534ff8debe98ced740997a246c Mon Sep 17 00:00:00 2001 From: milenasrb Date: Wed, 27 Nov 2024 09:34:12 +0100 Subject: [PATCH 38/70] fix chat generation --- .../in/www1/hephaestus/chat/message/Message.java | 2 +- server/intelligence-service/app/model.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index 6c2bed6a..b987620c 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -28,7 +28,7 @@ public class Message { @Enumerated(EnumType.STRING) private MessageSender sender; - @Lob + @Column(length = Length.LONG16) @NonNull private String content; diff --git a/server/intelligence-service/app/model.py b/server/intelligence-service/app/model.py index 29282f47..10c9f9a7 100644 --- a/server/intelligence-service/app/model.py +++ b/server/intelligence-service/app/model.py @@ -1,6 +1,5 @@ import os from .config import settings -from random import randint from typing import Sequence from typing_extensions import Annotated, TypedDict @@ -25,7 +24,7 @@ def invoke(self, message: str): model = MockChatModel() elif settings.is_openai_available: - model = ChatOpenAI() + model = ChatOpenAI(temperature=1.0) elif settings.is_azure_openai_available: model = AzureChatOpenAI() else: @@ -47,7 +46,9 @@ class State(TypedDict): + "Task 2: Ask the student about the overall progress on the project." + "Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress." + "Task 4: Ask about the plan for the next sprint." - + "Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project.", + + "Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project." + + "Always perform only one task in one message. Listen to what the student says and refer to it in your next message." + + "Analyse the conversation before and asses which task is to be performed. Give the student a feeling of a real conversation, not just questionaire.", ), MessagesPlaceholder(variable_name="messages"), ] @@ -55,12 +56,12 @@ class State(TypedDict): workflow = StateGraph(state_schema=State) trimmer = trim_messages( - max_tokens=400, + max_tokens=4000, strategy="last", token_counter=model, include_system=True, allow_partial=False, - start_on="system", + start_on="human", ) @@ -80,7 +81,6 @@ def call_model(state: State): def send_message(thread_id: str, input_message: str, state: State): config = {"configurable": {"thread_id": thread_id}} - # append the new human message to the conversation state["messages"] += [HumanMessage(input_message)] output = app.invoke( @@ -89,4 +89,4 @@ def send_message(thread_id: str, input_message: str, state: State): ) state["messages"] += output.get("messages", []) - return {"state": state, "response": output} + return {"state": state, "response": output} \ No newline at end of file From 0e43a7dd3b524bcd2c1df2cea9711cd7f615bf07 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Wed, 27 Nov 2024 12:17:30 +0100 Subject: [PATCH 39/70] change naming --- server/intelligence-service/app/main.py | 2 +- server/intelligence-service/app/model.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 27f9c1a8..83ff6309 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -29,7 +29,7 @@ async def chat(request: ChatRequest): state = {"messages": []} result = send_message( - thread_id=request.session_id, input_message=request.message_content, state=state + session_id=request.session_id, input_message=request.message_content, state=state ) response_message = result["response"]["messages"][-1].content diff --git a/server/intelligence-service/app/model.py b/server/intelligence-service/app/model.py index 10c9f9a7..5a39f72e 100644 --- a/server/intelligence-service/app/model.py +++ b/server/intelligence-service/app/model.py @@ -79,8 +79,8 @@ def call_model(state: State): app = workflow.compile(checkpointer=memory) -def send_message(thread_id: str, input_message: str, state: State): - config = {"configurable": {"thread_id": thread_id}} +def send_message(session_id: str, input_message: str, state: State): + config = {"configurable": {"thread_id": session_id}} state["messages"] += [HumanMessage(input_message)] output = app.invoke( From ddca852d258fd72aaef6de42705c59871f0d8519 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Thu, 28 Nov 2024 15:38:44 +0100 Subject: [PATCH 40/70] update packages --- server/intelligence-service/poetry.lock | 1404 +++++++++++------------ 1 file changed, 696 insertions(+), 708 deletions(-) diff --git a/server/intelligence-service/poetry.lock b/server/intelligence-service/poetry.lock index 9d3e654f..ab2642c6 100644 --- a/server/intelligence-service/poetry.lock +++ b/server/intelligence-service/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -13,102 +13,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.10" +version = "3.11.8" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, - {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, - {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, - {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, - {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, - {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, - {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, - {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, - {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, - {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, - {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, - {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, - {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, - {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, - {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, - {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, + {file = "aiohttp-3.11.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d2ca685c6a851ce64e511fbcb906e4dd97d13e567ca7ecb5cb30b184e15dc6d"}, + {file = "aiohttp-3.11.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52913bb8a0a72a57479f54b281300c9d23036aa9aa3ebbc9a32a643484eadfc2"}, + {file = "aiohttp-3.11.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:35dafc70051b6cbd6dafb533b4e3f0df6225a4896be373ef86367b2987409331"}, + {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:561b9596a9f90266673ef0b950c27e04ab597cdb53785e2ac91b83b33c31b509"}, + {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d479c1fdcc920056a06d04059db52eb8590ecbbb3acdcaeeea26a88ff782e94a"}, + {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ce8eb6444bb6e862feca664ce365afa8e2e32db24dcf1a502719a8a002f9274"}, + {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df9bf08eb93611b1d4d6245b6fecf88728e90eece00e00d554e1b0c445557d83"}, + {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a20ddaa58fea717177fac9a4a1fb8b39be868aa4fed2af6de4313b7a08f0f71"}, + {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9f4aadfea6b48cfa17aef1a68ba6bee5a0246374f5a588e299a4f4ff5bd1c77b"}, + {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:aa7deebb4bc5143745e6282139d7b9de50beb6d06609df64d2c993ef496bc7eb"}, + {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fe503a76b9e3a13b62e64545693c9463afe9d429e0909120f7bb66de91ed8bc2"}, + {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1c5838a68e31712354129add1b5fe32b06aa05275f835130edc650e6288af05f"}, + {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:832e58d9454fe501b0d092cdf660c0e34e16005f61acd06e1c79b0fc45019c94"}, + {file = "aiohttp-3.11.8-cp310-cp310-win32.whl", hash = "sha256:00618c37a350884c08e87cf9a6532be274d564227ac49e0b474cf41f27e1f190"}, + {file = "aiohttp-3.11.8-cp310-cp310-win_amd64.whl", hash = "sha256:8eeaac75203da1a54afe1faea3c855a1973026b54929112aa9b67bceadbcb0ca"}, + {file = "aiohttp-3.11.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8dd02b44555893adfe7cc4b3b454fee04f9dcec45cf66ef5bb53ebf393f0505"}, + {file = "aiohttp-3.11.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:658052941324edea3dee1f681375e70779f55e437e07bdfc4b5bbe65ad53cefb"}, + {file = "aiohttp-3.11.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c829471a9e2266da4a0666f8a9e215f19320f79778af379c1c7db324ac24ed2"}, + {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d21951756690f5d86d0215da38eb0fd65def03b5e2a1c08a4a39718a6d0d48f2"}, + {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2fa50ddc6b21cc1ae23e13524d6f75b27e279fdf5cf905b2df6fd171891ac4e2"}, + {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a5afbd805e449048ecebb1a256176e953d4ca9e48bab387d4d1c8524f1c7a95"}, + {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea68db69f2a4ddc24b28b8e754fc0b963ed7f9b9a76137f06fe44643d6821fbd"}, + {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b3ac163145660ce660aed2f1005e6d4de840d39728990b7250525eeec4e4a8"}, + {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e9ac0cce897904b77e109e5403ed713187dbdf96832bfd061ac07164264be16c"}, + {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3260c77cff4e35245bc517658bd54d7a64787f71f3c4f723877c82f22835b032"}, + {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7fd9c11ffad6b022bf02a41a70418cb2ab3b33f2c27842a5999e3ab78daf280"}, + {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:16bda233a7b159ab08107e8858fedca90a9de287057fab54cafde51bd83f9819"}, + {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4867008617bbf86e9fb5b00f72dd0e3a00a579b32233caff834320867f9b7cac"}, + {file = "aiohttp-3.11.8-cp311-cp311-win32.whl", hash = "sha256:17e6b9d8e29e3bfc7f893f327e92c9769d3582cee2fb1652c1431ac3f60115a0"}, + {file = "aiohttp-3.11.8-cp311-cp311-win_amd64.whl", hash = "sha256:7f3be4961a5c2c670f31caab7641a37ea2a97031f0d8ae15bcfd36b6bf273200"}, + {file = "aiohttp-3.11.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0e3b5bfef913d6be270c81976fbc0cbf66625cd92663bbb7e03b3adbd6aa4ac6"}, + {file = "aiohttp-3.11.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb51a81cb637b9a072c9cfae1839e35c6579638861eb3479eb5d6e6ce8bc6782"}, + {file = "aiohttp-3.11.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd2ca84e5f7a35f313a62eb7d6a50bac6760b60bafce34586750712731c0aeff"}, + {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47c6663df9446aa848b478413219600da4b54bc0409e1ac4bc80fb1a81501363"}, + {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c665ed4b52256614858b20711bbbd2755b0e19ec86870f8ff1645acf9ae9e760"}, + {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35d4545e7684da7a954ffc2dce495462cb16a902dffdebe98572408f6aaaee83"}, + {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85be3899e6860dd2cd3f4370ded6708e939d00d5ec922a8eb328d114db605a47"}, + {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ed9f1f2697713c48efc9ec483ad5d062e4aa91854f090a3eba0b19c002851d"}, + {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c0dbae99737badf3f5e862088a118e28d3b36f03eb608a6382eddfd68178e05b"}, + {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:beae08f900b2980af4353a0200eb162b39f276fd8a6e43079a540f83964671f4"}, + {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d6f9e5fd1b3ecbaca3e04a15a02d1fa213248608caee99fd5bdddd4759959cf7"}, + {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7def89a41fe32120d89cd4577f5efbab3c52234c5890066ced8a2f7202dff88"}, + {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:98f596cf59292e779bc387f22378a3d2c5e052c9fe2bf822ac4f547c6fe57758"}, + {file = "aiohttp-3.11.8-cp312-cp312-win32.whl", hash = "sha256:b64fa6b76b35b695cd3e5c42a4e568cbea8d41c9e59165e2a43da00976e2027e"}, + {file = "aiohttp-3.11.8-cp312-cp312-win_amd64.whl", hash = "sha256:afba47981ff73b1794c00dce774334dcfe62664b3b4f78f278b77d21ce9daf43"}, + {file = "aiohttp-3.11.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a81525430da5ca356fae6e889daeb6f5cc0d5f0cef88e59cdde48e2394ea1365"}, + {file = "aiohttp-3.11.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7565689e86a88c1d258351ebd14e343337b76a56ca5c0a2c1db96ec28149386f"}, + {file = "aiohttp-3.11.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0f9dbe9763c014c408ad51a027dc9582518e992dc63e2ffe359ac1b4840a560"}, + {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca580edc3ccd7f6ea76ad9cf59f5a8756d338e770b5eda7be26bcda8fa7ef53"}, + {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d141631a7348038fc7b5d1a81b3c9afa9aa056188ded7902fe754028fdea5c5"}, + {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64e6b14608a56a4c76c60daac730b0c0eeaf9d10dfc3231f7fc26521a0d628fd"}, + {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0983d0ce329f2f9dbeb355c3744bd6333f34e0dc56025b6b7d4f285b90acb51e"}, + {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d96b93a46a3742880fa21bcb35c6c40cf27714ec0fb8ec85fe444d73b95131b9"}, + {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f4f1779c3142d913c509c2ed1de8b8f920e07a5cd65ac1f57c61cfb6bfded5a4"}, + {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:48be7cff468c9c0d86a02e6a826e1fe159094b16d5aa2c17703e7317f791b0f9"}, + {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:daea456b79ca2bacc7f062845bbb1139c3b3231fc83169da5a682cf385416dd1"}, + {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c92e763cf641e10ad9342597d20060ba23de5e411aada96660e679e3f9371189"}, + {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a750ee5a177e0f873d6b2d7d0fa6e1e7c658fc0ca8ea56438dcba2ac94bedb09"}, + {file = "aiohttp-3.11.8-cp313-cp313-win32.whl", hash = "sha256:4448c9c7f77bad48a6569062c0c16deb77fbb7363de1dc71ed087f66fb3b3c96"}, + {file = "aiohttp-3.11.8-cp313-cp313-win_amd64.whl", hash = "sha256:481075a1949de79a8a6841e0086f2f5f464785c592cf527ed0db2c0cbd0e1ba2"}, + {file = "aiohttp-3.11.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:72779bfb34d6d6b51e55a7f4901b410e416b5431738b367d49696928c91a2ca8"}, + {file = "aiohttp-3.11.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e6523f39071a01757048985e4cc22d04aa130bc40d9128503f3a61a3ee98328"}, + {file = "aiohttp-3.11.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:220bbce18b3046973465be45415430f1cab39d7fdc40cbcf0a8c05485c6902fe"}, + {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:336bbf7a33dd8cb4a7afb98c70e9935a81e5e88f7ac595ba2e84b1fb5da190d6"}, + {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c5e4f1ba5059b85e05c551961a448ce2689c6249ed6a2e2174796842c191d10"}, + {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9f9fd5c672c962389429abd11ed32c9c93f7932fd58584cae1e43951b141c6b"}, + {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58bd94ad48143e1d42e05fc055da41de0a9933f378ad87760595b8aec83d317b"}, + {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bf52642b12d70d78c18882915201bc5345f7c8f0f2ab8919d99b886aa6475a7"}, + {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fee12d8487b0df2b683424cca2a0d8fb7281d5607518d742e98119a74af01026"}, + {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:65fd04f1fea668ad1af48ac31b752000e222dccffedcad3de8ccf9d34489ccd3"}, + {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c3f397e0511a0ec4fe331e602fc057dfd336d352062deb9969ebd81e253a149c"}, + {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:cf8f05f4abe3288fe2e106e1461fd20d8abf6103886ddfb6d746a5b8fb830d2b"}, + {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7d71d4ac0792ff89541179394d303be846a0b6cd3821ae67286ee69ecec16f9f"}, + {file = "aiohttp-3.11.8-cp39-cp39-win32.whl", hash = "sha256:2b6f8716044ae5e5f2a3b4e4b6bfee48e97c8b2a92e56f43aadd728c7fd26b7d"}, + {file = "aiohttp-3.11.8-cp39-cp39-win_amd64.whl", hash = "sha256:da343903214bf9f9d314b913caa499fa19e26d73e6e23a3db7d4898ea6d47028"}, + {file = "aiohttp-3.11.8.tar.gz", hash = "sha256:7bc9d64a2350cbb29a9732334e1a0743cbb6844de1731cbdf5949b235653f3fd"}, ] [package.dependencies] @@ -117,7 +102,8 @@ aiosignal = ">=1.1.2" attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.12.0,<2.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -670,13 +656,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.6" +version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, - {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, ] [package.dependencies] @@ -813,84 +799,86 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.7.0" +version = "0.8.0" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.7.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e14027f61101b3f5e173095d9ecf95c1cac03ffe45a849279bde1d97e559e314"}, - {file = "jiter-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:979ec4711c2e37ac949561858bd42028884c9799516a923e1ff0b501ef341a4a"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:662d5d3cca58ad6af7a3c6226b641c8655de5beebcb686bfde0df0f21421aafa"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d89008fb47043a469f97ad90840b97ba54e7c3d62dc7cbb6cbf938bd0caf71d"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8b16c35c846a323ce9067170d5ab8c31ea3dbcab59c4f7608bbbf20c2c3b43f"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e82daaa1b0a68704f9029b81e664a5a9de3e466c2cbaabcda5875f961702e7"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a87a9f586636e1f0dd3651a91f79b491ea0d9fd7cbbf4f5c463eebdc48bda7"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ec05b1615f96cc3e4901678bc863958611584072967d9962f9e571d60711d52"}, - {file = "jiter-0.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5cb97e35370bde7aa0d232a7f910f5a0fbbc96bc0a7dbaa044fd5cd6bcd7ec3"}, - {file = "jiter-0.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb316dacaf48c8c187cea75d0d7f835f299137e6fdd13f691dff8f92914015c7"}, - {file = "jiter-0.7.0-cp310-none-win32.whl", hash = "sha256:243f38eb4072763c54de95b14ad283610e0cd3bf26393870db04e520f60eebb3"}, - {file = "jiter-0.7.0-cp310-none-win_amd64.whl", hash = "sha256:2221d5603c139f6764c54e37e7c6960c469cbcd76928fb10d15023ba5903f94b"}, - {file = "jiter-0.7.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:91cec0ad755bd786c9f769ce8d843af955df6a8e56b17658771b2d5cb34a3ff8"}, - {file = "jiter-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:feba70a28a27d962e353e978dbb6afd798e711c04cb0b4c5e77e9d3779033a1a"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d866ec066c3616cacb8535dbda38bb1d470b17b25f0317c4540182bc886ce2"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7a7a00b6f9f18289dd563596f97ecaba6c777501a8ba04bf98e03087bcbc60"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9aaf564094c7db8687f2660605e099f3d3e6ea5e7135498486674fcb78e29165"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4d27e09825c1b3c7a667adb500ce8b840e8fc9f630da8454b44cdd4fb0081bb"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca7c287da9c1d56dda88da1d08855a787dbb09a7e2bd13c66a2e288700bd7c7"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db19a6d160f093cbc8cd5ea2abad420b686f6c0e5fb4f7b41941ebc6a4f83cda"}, - {file = "jiter-0.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e46a63c7f877cf7441ffc821c28287cfb9f533ae6ed707bde15e7d4dfafa7ae"}, - {file = "jiter-0.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ba426fa7ff21cb119fa544b75dd3fbee6a70e55a5829709c0338d07ccd30e6d"}, - {file = "jiter-0.7.0-cp311-none-win32.whl", hash = "sha256:c07f55a64912b0c7982377831210836d2ea92b7bd343fca67a32212dd72e38e0"}, - {file = "jiter-0.7.0-cp311-none-win_amd64.whl", hash = "sha256:ed27b2c43e1b5f6c7fedc5c11d4d8bfa627de42d1143d87e39e2e83ddefd861a"}, - {file = "jiter-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac7930bcaaeb1e229e35c91c04ed2e9f39025b86ee9fc3141706bbf6fff4aeeb"}, - {file = "jiter-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:571feae3e7c901a8eedde9fd2865b0dfc1432fb15cab8c675a8444f7d11b7c5d"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8af4df8a262fa2778b68c2a03b6e9d1cb4d43d02bea6976d46be77a3a331af1"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd028d4165097a611eb0c7494d8c1f2aebd46f73ca3200f02a175a9c9a6f22f5"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b487247c7836810091e9455efe56a52ec51bfa3a222237e1587d04d3e04527"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6d28a92f28814e1a9f2824dc11f4e17e1df1f44dc4fdeb94c5450d34bcb2602"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90443994bbafe134f0b34201dad3ebe1c769f0599004084e046fb249ad912425"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f9abf464f9faac652542ce8360cea8e68fba2b78350e8a170248f9bcc228702a"}, - {file = "jiter-0.7.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db7a8d99fc5f842f7d2852f06ccaed066532292c41723e5dff670c339b649f88"}, - {file = "jiter-0.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:15cf691ebd8693b70c94627d6b748f01e6d697d9a6e9f2bc310934fcfb7cf25e"}, - {file = "jiter-0.7.0-cp312-none-win32.whl", hash = "sha256:9dcd54fa422fb66ca398bec296fed5f58e756aa0589496011cfea2abb5be38a5"}, - {file = "jiter-0.7.0-cp312-none-win_amd64.whl", hash = "sha256:cc989951f73f9375b8eacd571baaa057f3d7d11b7ce6f67b9d54642e7475bfad"}, - {file = "jiter-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:24cecd18df540963cd27c08ca5ce1d0179f229ff78066d9eecbe5add29361340"}, - {file = "jiter-0.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d41b46236b90b043cca73785674c23d2a67d16f226394079d0953f94e765ed76"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b160db0987171365c153e406a45dcab0ee613ae3508a77bfff42515cb4ce4d6e"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d1c8d91e0f0bd78602eaa081332e8ee4f512c000716f5bc54e9a037306d693a7"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997706c683195eeff192d2e5285ce64d2a610414f37da3a3f2625dcf8517cf90"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ea52a8a0ff0229ab2920284079becd2bae0688d432fca94857ece83bb49c541"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d77449d2738cf74752bb35d75ee431af457e741124d1db5e112890023572c7c"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8203519907a1d81d6cb00902c98e27c2d0bf25ce0323c50ca594d30f5f1fbcf"}, - {file = "jiter-0.7.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41d15ccc53931c822dd7f1aebf09faa3cda2d7b48a76ef304c7dbc19d1302e51"}, - {file = "jiter-0.7.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:febf3179b2fabf71fbd2fd52acb8594163bb173348b388649567a548f356dbf6"}, - {file = "jiter-0.7.0-cp313-none-win32.whl", hash = "sha256:4a8e2d866e7eda19f012444e01b55079d8e1c4c30346aaac4b97e80c54e2d6d3"}, - {file = "jiter-0.7.0-cp313-none-win_amd64.whl", hash = "sha256:7417c2b928062c496f381fb0cb50412eee5ad1d8b53dbc0e011ce45bb2de522c"}, - {file = "jiter-0.7.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9c62c737b5368e51e74960a08fe1adc807bd270227291daede78db24d5fbf556"}, - {file = "jiter-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e4640722b1bef0f6e342fe4606aafaae0eb4f4be5c84355bb6867f34400f6688"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f367488c3b9453eab285424c61098faa1cab37bb49425e69c8dca34f2dfe7d69"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0cf5d42beb3514236459454e3287db53d9c4d56c4ebaa3e9d0efe81b19495129"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc5190ea1113ee6f7252fa8a5fe5a6515422e378356c950a03bbde5cafbdbaab"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ee47a149d698796a87abe445fc8dee21ed880f09469700c76c8d84e0d11efd"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48592c26ea72d3e71aa4bea0a93454df907d80638c3046bb0705507b6704c0d7"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:79fef541199bd91cfe8a74529ecccb8eaf1aca38ad899ea582ebbd4854af1e51"}, - {file = "jiter-0.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d1ef6bb66041f2514739240568136c81b9dcc64fd14a43691c17ea793b6535c0"}, - {file = "jiter-0.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca4d950863b1c238e315bf159466e064c98743eef3bd0ff9617e48ff63a4715"}, - {file = "jiter-0.7.0-cp38-none-win32.whl", hash = "sha256:897745f230350dcedb8d1ebe53e33568d48ea122c25e6784402b6e4e88169be7"}, - {file = "jiter-0.7.0-cp38-none-win_amd64.whl", hash = "sha256:b928c76a422ef3d0c85c5e98c498ce3421b313c5246199541e125b52953e1bc0"}, - {file = "jiter-0.7.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c9b669ff6f8ba08270dee9ccf858d3b0203b42314a428a1676762f2d390fbb64"}, - {file = "jiter-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5be919bacd73ca93801c3042bce6e95cb9c555a45ca83617b9b6c89df03b9c2"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a282e1e8a396dabcea82d64f9d05acf7efcf81ecdd925b967020dcb0e671c103"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:17ecb1a578a56e97a043c72b463776b5ea30343125308f667fb8fce4b3796735"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b6045fa0527129218cdcd8a8b839f678219686055f31ebab35f87d354d9c36e"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:189cc4262a92e33c19d4fd24018f5890e4e6da5b2581f0059938877943f8298c"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c138414839effbf30d185e30475c6dc8a16411a1e3681e5fd4605ab1233ac67a"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2791604acef33da6b72d5ecf885a32384bcaf9aa1e4be32737f3b8b9588eef6a"}, - {file = "jiter-0.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae60ec89037a78d60bbf3d8b127f1567769c8fa24886e0abed3f622791dea478"}, - {file = "jiter-0.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:836f03dea312967635233d826f783309b98cfd9ccc76ac776e224cfcef577862"}, - {file = "jiter-0.7.0-cp39-none-win32.whl", hash = "sha256:ebc30ae2ce4bc4986e1764c404b4ea1924f926abf02ce92516485098f8545374"}, - {file = "jiter-0.7.0-cp39-none-win_amd64.whl", hash = "sha256:abf596f951370c648f37aa9899deab296c42a3829736e598b0dd10b08f77a44d"}, - {file = "jiter-0.7.0.tar.gz", hash = "sha256:c061d9738535497b5509f8970584f20de1e900806b239a39a9994fc191dad630"}, + {file = "jiter-0.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dee4eeb293ffcd2c3b31ebab684dbf7f7b71fe198f8eddcdf3a042cc6e10205a"}, + {file = "jiter-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aad1e6e9b01cf0304dcee14db03e92e0073287a6297caf5caf2e9dbfea16a924"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:504099fb7acdbe763e10690d560a25d4aee03d918d6a063f3a761d8a09fb833f"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2373487caad7fe39581f588ab5c9262fc1ade078d448626fec93f4ffba528858"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c341ecc3f9bccde952898b0c97c24f75b84b56a7e2f8bbc7c8e38cab0875a027"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e48e7a336529b9419d299b70c358d4ebf99b8f4b847ed3f1000ec9f320e8c0c"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ee157a8afd2943be690db679f82fafb8d347a8342e8b9c34863de30c538d55"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d7dceae3549b80087f913aad4acc2a7c1e0ab7cb983effd78bdc9c41cabdcf18"}, + {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e29e9ecce53d396772590438214cac4ab89776f5e60bd30601f1050b34464019"}, + {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fa1782f22d5f92c620153133f35a9a395d3f3823374bceddd3e7032e2fdfa0b1"}, + {file = "jiter-0.8.0-cp310-none-win32.whl", hash = "sha256:f754ef13b4e4f67a3bf59fe974ef4342523801c48bf422f720bd37a02a360584"}, + {file = "jiter-0.8.0-cp310-none-win_amd64.whl", hash = "sha256:796f750b65f5d605f5e7acaccc6b051675e60c41d7ac3eab40dbd7b5b81a290f"}, + {file = "jiter-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f6f4e645efd96b4690b9b6091dbd4e0fa2885ba5c57a0305c1916b75b4f30ff6"}, + {file = "jiter-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f61cf6d93c1ade9b8245c9f14b7900feadb0b7899dbe4aa8de268b705647df81"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0396bc5cb1309c6dab085e70bb3913cdd92218315e47b44afe9eace68ee8adaa"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62d0e42ec5dc772bd8554a304358220be5d97d721c4648b23f3a9c01ccc2cb26"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec4b711989860705733fc59fb8c41b2def97041cea656b37cf6c8ea8dee1c3f4"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859cc35bf304ab066d88f10a44a3251a9cd057fb11ec23e00be22206db878f4f"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5000195921aa293b39b9b5bc959d7fa658e7f18f938c0e52732da8e3cc70a278"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36050284c0abde57aba34964d3920f3d6228211b65df7187059bb7c7f143759a"}, + {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88f608e050cfe45c48d771e86ecdbf5258314c883c986d4217cc79e1fb5f689"}, + {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:646cf4237665b2e13b4159d8f26d53f59bc9f2e6e135e3a508a2e5dd26d978c6"}, + {file = "jiter-0.8.0-cp311-none-win32.whl", hash = "sha256:21fe5b8345db1b3023052b2ade9bb4d369417827242892051244af8fae8ba231"}, + {file = "jiter-0.8.0-cp311-none-win_amd64.whl", hash = "sha256:30c2161c5493acf6b6c3c909973fb64ae863747def01cc7574f3954e0a15042c"}, + {file = "jiter-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d91a52d8f49ada2672a4b808a0c5c25d28f320a2c9ca690e30ebd561eb5a1002"}, + {file = "jiter-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c38cf25cf7862f61410b7a49684d34eb3b5bcbd7ddaf4773eea40e0bd43de706"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6189beb5c4b3117624be6b2e84545cff7611f5855d02de2d06ff68e316182be"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13fa849c0e30643554add089983caa82f027d69fad8f50acadcb21c462244ab"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7765ca159d0a58e8e0f8ca972cd6d26a33bc97b4480d0d2309856763807cd28"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b0befe7c6e9fc867d5bed21bab0131dfe27d1fa5cd52ba2bced67da33730b7d"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7d6363d4c6f1052b1d8b494eb9a72667c3ef5f80ebacfe18712728e85327000"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a873e57009863eeac3e3969e4653f07031d6270d037d6224415074ac17e5505c"}, + {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2582912473c0d9940791479fe1bf2976a34f212eb8e0a82ee9e645ac275c5d16"}, + {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:646163201af42f55393ee6e8f6136b8df488253a6533f4230a64242ecbfe6048"}, + {file = "jiter-0.8.0-cp312-none-win32.whl", hash = "sha256:96e75c9abfbf7387cba89a324d2356d86d8897ac58c956017d062ad510832dae"}, + {file = "jiter-0.8.0-cp312-none-win_amd64.whl", hash = "sha256:ed6074552b4a32e047b52dad5ab497223721efbd0e9efe68c67749f094a092f7"}, + {file = "jiter-0.8.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:dd5e351cb9b3e676ec3360a85ea96def515ad2b83c8ae3a251ce84985a2c9a6f"}, + {file = "jiter-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba9f12b0f801ecd5ed0cec29041dc425d1050922b434314c592fc30d51022467"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7ba461c3681728d556392e8ae56fb44a550155a24905f01982317b367c21dd4"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a15ed47ab09576db560dbc5c2c5a64477535beb056cd7d997d5dd0f2798770e"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cef55042816d0737142b0ec056c0356a5f681fb8d6aa8499b158e87098f4c6f8"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:549f170215adeb5e866f10617c3d019d8eb4e6d4e3c6b724b3b8c056514a3487"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f867edeb279d22020877640d2ea728de5817378c60a51be8af731a8a8f525306"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aef8845f463093799db4464cee2aa59d61aa8edcb3762aaa4aacbec3f478c929"}, + {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:d0d6e22e4062c3d3c1bf3594baa2f67fc9dcdda8275abad99e468e0c6540bc54"}, + {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:079e62e64696241ac3f408e337aaac09137ed760ccf2b72b1094b48745c13641"}, + {file = "jiter-0.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74d2b56ed3da5760544df53b5f5c39782e68efb64dc3aa0bba4cc08815e6fae8"}, + {file = "jiter-0.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:798dafe108cba58a7bb0a50d4d5971f98bb7f3c974e1373e750de6eb21c1a329"}, + {file = "jiter-0.8.0-cp313-none-win32.whl", hash = "sha256:ca6d3064dfc743eb0d3d7539d89d4ba886957c717567adc72744341c1e3573c9"}, + {file = "jiter-0.8.0-cp313-none-win_amd64.whl", hash = "sha256:38caedda64fe1f04b06d7011fc15e86b3b837ed5088657bf778656551e3cd8f9"}, + {file = "jiter-0.8.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bb5c8a0a8d081c338db22e5b8d53a89a121790569cbb85f7d3cfb1fe0fbe9836"}, + {file = "jiter-0.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:202dbe8970bfb166fab950eaab8f829c505730a0b33cc5e1cfb0a1c9dd56b2f9"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9046812e5671fdcfb9ae02881fff1f6a14d484b7e8b3316179a372cdfa1e8026"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6ac56425023e52d65150918ae25480d0a1ce2a6bf5ea2097f66a2cc50f6d692"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dfcf97210c6eab9d2a1c6af15dd39e1d5154b96a7145d0a97fa1df865b7b834"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4e3c8444d418686f78c9a547b9b90031faf72a0a1a46bfec7fb31edbd889c0d"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6507011a299b7f578559084256405a8428875540d8d13530e00b688e41b09493"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0aae4738eafdd34f0f25c2d3668ce9e8fa0d7cb75a2efae543c9a69aebc37323"}, + {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5d782e790396b13f2a7b36bdcaa3736a33293bdda80a4bf1a3ce0cd5ef9f15"}, + {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc7f993bc2c4e03015445adbb16790c303282fce2e8d9dc3a3905b1d40e50564"}, + {file = "jiter-0.8.0-cp38-none-win32.whl", hash = "sha256:d4a8a6eda018a991fa58ef707dd51524055d11f5acb2f516d70b1be1d15ab39c"}, + {file = "jiter-0.8.0-cp38-none-win_amd64.whl", hash = "sha256:4cca948a3eda8ea24ed98acb0ee19dc755b6ad2e570ec85e1527d5167f91ff67"}, + {file = "jiter-0.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ef89663678d8257063ce7c00d94638e05bd72f662c5e1eb0e07a172e6c1a9a9f"}, + {file = "jiter-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c402ddcba90b4cc71db3216e8330f4db36e0da2c78cf1d8a9c3ed8f272602a94"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6dfe795b7a173a9f8ba7421cdd92193d60c1c973bbc50dc3758a9ad0fa5eb6"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ec29a31b9abd6be39453a2c45da067138a3005d65d2c0507c530e0f1fdcd9a4"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a488f8c54bddc3ddefaf3bfd6de4a52c97fc265d77bc2dcc6ee540c17e8c342"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aeb5561adf4d26ca0d01b5811b4d7b56a8986699a473d700757b4758ef787883"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab961858d7ad13132328517d29f121ae1b2d94502191d6bcf96bddcc8bb5d1c"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a207e718d114d23acf0850a2174d290f42763d955030d9924ffa4227dbd0018f"}, + {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:733bc9dc8ff718a0ae4695239e9268eb93e88b73b367dfac3ec227d8ce2f1e77"}, + {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1ec27299e22d05e13a06e460bf7f75f26f9aaa0e0fb7d060f40e88df1d81faa"}, + {file = "jiter-0.8.0-cp39-none-win32.whl", hash = "sha256:e8dbfcb46553e6661d3fc1f33831598fcddf73d0f67834bce9fc3e9ebfe5c439"}, + {file = "jiter-0.8.0-cp39-none-win_amd64.whl", hash = "sha256:af2ce2487b3a93747e2cb5150081d4ae1e5874fce5924fc1a12e9e768e489ad8"}, + {file = "jiter-0.8.0.tar.gz", hash = "sha256:86fee98b569d4cc511ff2e3ec131354fafebd9348a487549c31ad371ae730310"}, ] [[package]] @@ -1012,13 +1000,13 @@ langgraph-sdk = ">=0.1.32,<0.2.0" [[package]] name = "langgraph-checkpoint" -version = "2.0.2" +version = "2.0.7" description = "Library with base interfaces for LangGraph checkpoint savers." optional = false python-versions = "<4.0.0,>=3.9.0" files = [ - {file = "langgraph_checkpoint-2.0.2-py3-none-any.whl", hash = "sha256:6e5dfd90e1fc71b91ccff75939ada1114e5d7f824df5f24c62d39bed69039ee2"}, - {file = "langgraph_checkpoint-2.0.2.tar.gz", hash = "sha256:c1d033e4e4855f580fa56830327eb86513b64ab5be527245363498e76b19a0b9"}, + {file = "langgraph_checkpoint-2.0.7-py3-none-any.whl", hash = "sha256:9709f672e1c5a47e13352067c2ffa114dd91d443967b7ce8a1d36d6fc170370e"}, + {file = "langgraph_checkpoint-2.0.7.tar.gz", hash = "sha256:88d648a331d20aa8ce65280de34a34a9190380b004f6afcc5f9894fe3abeed08"}, ] [package.dependencies] @@ -1027,13 +1015,13 @@ msgpack = ">=1.1.0,<2.0.0" [[package]] name = "langgraph-sdk" -version = "0.1.35" +version = "0.1.40" description = "SDK for interacting with LangGraph API" optional = false python-versions = "<4.0.0,>=3.9.0" files = [ - {file = "langgraph_sdk-0.1.35-py3-none-any.whl", hash = "sha256:b137c324fbce96afe39cc6a189c61fc042164068f0f6f02ac8de864d8ece6e05"}, - {file = "langgraph_sdk-0.1.35.tar.gz", hash = "sha256:414cfbc172b883446197763f3645d86bbc6a5b8ce9693c1df3fb6ce7d854a994"}, + {file = "langgraph_sdk-0.1.40-py3-none-any.whl", hash = "sha256:8810cca5e4144cf3a5441fc76b4ee6e658ec95f932d3a0bf9ad63de117e925b9"}, + {file = "langgraph_sdk-0.1.40.tar.gz", hash = "sha256:ab2719ac7274612a791a7a0ad9395d250357106cba8ba81bca9968fc91009af2"}, ] [package.dependencies] @@ -1043,18 +1031,18 @@ orjson = ">=3.10.1" [[package]] name = "langsmith" -version = "0.1.139" +version = "0.1.147" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.139-py3-none-any.whl", hash = "sha256:2a4a541bfbd0a9727255df28a60048c85bc8c4c6a276975923785c3fd82dc879"}, - {file = "langsmith-0.1.139.tar.gz", hash = "sha256:2f9e4d32fef3ad7ef42c8506448cce3a31ad6b78bb4f3310db04ddaa1e9d744d"}, + {file = "langsmith-0.1.147-py3-none-any.whl", hash = "sha256:7166fc23b965ccf839d64945a78e9f1157757add228b086141eb03a60d699a15"}, + {file = "langsmith-0.1.147.tar.gz", hash = "sha256:2e933220318a4e73034657103b3b1a3a6109cc5db3566a7e8e03be8d6d7def7a"}, ] [package.dependencies] httpx = ">=0.23.0,<1" -orjson = ">=3.9.14,<4.0.0" +orjson = {version = ">=3.9.14,<4.0.0", markers = "platform_python_implementation != \"PyPy\""} pydantic = [ {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, @@ -1062,6 +1050,9 @@ pydantic = [ requests = ">=2,<3" requests-toolbelt = ">=1.0.0,<2.0.0" +[package.extras] +langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -1399,13 +1390,13 @@ files = [ [[package]] name = "openai" -version = "1.54.0" +version = "1.55.2" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.54.0-py3-none-any.whl", hash = "sha256:24ed8874b56e919f0fbb80b7136c3fb022dc82ce9f5f21579b7b280ea4bba249"}, - {file = "openai-1.54.0.tar.gz", hash = "sha256:df2a84384314165b706722a7ac8988dc33eba20dd7fc3b939d138110e608b1ce"}, + {file = "openai-1.55.2-py3-none-any.whl", hash = "sha256:3027c7fa4a33ed759f4a3d076093fcfa1c55658660c889bec33f651e2dc77922"}, + {file = "openai-1.55.2.tar.gz", hash = "sha256:5cc0b1162b65dcdf670b4b41448f18dd470d2724ca04821ab1e86b6b4e88650b"}, ] [package.dependencies] @@ -1423,80 +1414,97 @@ datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "orjson" -version = "3.10.11" +version = "3.10.12" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.11-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6dade64687f2bd7c090281652fe18f1151292d567a9302b34c2dbb92a3872f1f"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82f07c550a6ccd2b9290849b22316a609023ed851a87ea888c0456485a7d196a"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd9a187742d3ead9df2e49240234d728c67c356516cf4db018833a86f20ec18c"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77b0fed6f209d76c1c39f032a70df2d7acf24b1812ca3e6078fd04e8972685a3"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63fc9d5fe1d4e8868f6aae547a7b8ba0a2e592929245fff61d633f4caccdcdd6"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65cd3e3bb4fbb4eddc3c1e8dce10dc0b73e808fcb875f9fab40c81903dd9323e"}, - {file = "orjson-3.10.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f67c570602300c4befbda12d153113b8974a3340fdcf3d6de095ede86c06d92"}, - {file = "orjson-3.10.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1f39728c7f7d766f1f5a769ce4d54b5aaa4c3f92d5b84817053cc9995b977acc"}, - {file = "orjson-3.10.11-cp310-none-win32.whl", hash = "sha256:1789d9db7968d805f3d94aae2c25d04014aae3a2fa65b1443117cd462c6da647"}, - {file = "orjson-3.10.11-cp310-none-win_amd64.whl", hash = "sha256:5576b1e5a53a5ba8f8df81872bb0878a112b3ebb1d392155f00f54dd86c83ff6"}, - {file = "orjson-3.10.11-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1444f9cb7c14055d595de1036f74ecd6ce15f04a715e73f33bb6326c9cef01b6"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdec57fe3b4bdebcc08a946db3365630332dbe575125ff3d80a3272ebd0ddafe"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eed32f33a0ea6ef36ccc1d37f8d17f28a1d6e8eefae5928f76aff8f1df85e67"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80df27dd8697242b904f4ea54820e2d98d3f51f91e97e358fc13359721233e4b"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:705f03cee0cb797256d54de6695ef219e5bc8c8120b6654dd460848d57a9af3d"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03246774131701de8e7059b2e382597da43144a9a7400f178b2a32feafc54bd5"}, - {file = "orjson-3.10.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8b5759063a6c940a69c728ea70d7c33583991c6982915a839c8da5f957e0103a"}, - {file = "orjson-3.10.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:677f23e32491520eebb19c99bb34675daf5410c449c13416f7f0d93e2cf5f981"}, - {file = "orjson-3.10.11-cp311-none-win32.whl", hash = "sha256:a11225d7b30468dcb099498296ffac36b4673a8398ca30fdaec1e6c20df6aa55"}, - {file = "orjson-3.10.11-cp311-none-win_amd64.whl", hash = "sha256:df8c677df2f9f385fcc85ab859704045fa88d4668bc9991a527c86e710392bec"}, - {file = "orjson-3.10.11-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:360a4e2c0943da7c21505e47cf6bd725588962ff1d739b99b14e2f7f3545ba51"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:496e2cb45de21c369079ef2d662670a4892c81573bcc143c4205cae98282ba97"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7dfa8db55c9792d53c5952900c6a919cfa377b4f4534c7a786484a6a4a350c19"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51f3382415747e0dbda9dade6f1e1a01a9d37f630d8c9049a8ed0e385b7a90c0"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f35a1b9f50a219f470e0e497ca30b285c9f34948d3c8160d5ad3a755d9299433"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f3b7c5803138e67028dde33450e054c87e0703afbe730c105f1fcd873496d5"}, - {file = "orjson-3.10.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f91d9eb554310472bd09f5347950b24442600594c2edc1421403d7610a0998fd"}, - {file = "orjson-3.10.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dfbb2d460a855c9744bbc8e36f9c3a997c4b27d842f3d5559ed54326e6911f9b"}, - {file = "orjson-3.10.11-cp312-none-win32.whl", hash = "sha256:d4a62c49c506d4d73f59514986cadebb7e8d186ad510c518f439176cf8d5359d"}, - {file = "orjson-3.10.11-cp312-none-win_amd64.whl", hash = "sha256:f1eec3421a558ff7a9b010a6c7effcfa0ade65327a71bb9b02a1c3b77a247284"}, - {file = "orjson-3.10.11-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c46294faa4e4d0eb73ab68f1a794d2cbf7bab33b1dda2ac2959ffb7c61591899"}, - {file = "orjson-3.10.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52e5834d7d6e58a36846e059d00559cb9ed20410664f3ad156cd2cc239a11230"}, - {file = "orjson-3.10.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2fc947e5350fdce548bfc94f434e8760d5cafa97fb9c495d2fef6757aa02ec0"}, - {file = "orjson-3.10.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0efabbf839388a1dab5b72b5d3baedbd6039ac83f3b55736eb9934ea5494d258"}, - {file = "orjson-3.10.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3f29634260708c200c4fe148e42b4aae97d7b9fee417fbdd74f8cfc265f15b0"}, - {file = "orjson-3.10.11-cp313-none-win32.whl", hash = "sha256:1a1222ffcee8a09476bbdd5d4f6f33d06d0d6642df2a3d78b7a195ca880d669b"}, - {file = "orjson-3.10.11-cp313-none-win_amd64.whl", hash = "sha256:bc274ac261cc69260913b2d1610760e55d3c0801bb3457ba7b9004420b6b4270"}, - {file = "orjson-3.10.11-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:19b3763e8bbf8ad797df6b6b5e0fc7c843ec2e2fc0621398534e0c6400098f87"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be83a13312e5e58d633580c5eb8d0495ae61f180da2722f20562974188af205"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:afacfd1ab81f46dedd7f6001b6d4e8de23396e4884cd3c3436bd05defb1a6446"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb4d0bea56bba596723d73f074c420aec3b2e5d7d30698bc56e6048066bd560c"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96ed1de70fcb15d5fed529a656df29f768187628727ee2788344e8a51e1c1350"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bfb30c891b530f3f80e801e3ad82ef150b964e5c38e1fb8482441c69c35c61c"}, - {file = "orjson-3.10.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d496c74fc2b61341e3cefda7eec21b7854c5f672ee350bc55d9a4997a8a95204"}, - {file = "orjson-3.10.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:655a493bac606655db9a47fe94d3d84fc7f3ad766d894197c94ccf0c5408e7d3"}, - {file = "orjson-3.10.11-cp38-none-win32.whl", hash = "sha256:b9546b278c9fb5d45380f4809e11b4dd9844ca7aaf1134024503e134ed226161"}, - {file = "orjson-3.10.11-cp38-none-win_amd64.whl", hash = "sha256:b592597fe551d518f42c5a2eb07422eb475aa8cfdc8c51e6da7054b836b26782"}, - {file = "orjson-3.10.11-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c95f2ecafe709b4e5c733b5e2768ac569bed308623c85806c395d9cca00e08af"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80c00d4acded0c51c98754fe8218cb49cb854f0f7eb39ea4641b7f71732d2cb7"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:461311b693d3d0a060439aa669c74f3603264d4e7a08faa68c47ae5a863f352d"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52ca832f17d86a78cbab86cdc25f8c13756ebe182b6fc1a97d534051c18a08de"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c57ea78a753812f528178aa2f1c57da633754c91d2124cb28991dab4c79a54"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7fcfc6f7ca046383fb954ba528587e0f9336828b568282b27579c49f8e16aad"}, - {file = "orjson-3.10.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:86b9dd983857970c29e4c71bb3e95ff085c07d3e83e7c46ebe959bac07ebd80b"}, - {file = "orjson-3.10.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d83f87582d223e54efb2242a79547611ba4ebae3af8bae1e80fa9a0af83bb7f"}, - {file = "orjson-3.10.11-cp39-none-win32.whl", hash = "sha256:9fd0ad1c129bc9beb1154c2655f177620b5beaf9a11e0d10bac63ef3fce96950"}, - {file = "orjson-3.10.11-cp39-none-win_amd64.whl", hash = "sha256:10f416b2a017c8bd17f325fb9dee1fb5cdd7a54e814284896b7c3f2763faa017"}, - {file = "orjson-3.10.11.tar.gz", hash = "sha256:e35b6d730de6384d5b2dab5fd23f0d76fae8bbc8c353c2f78210aa5fa4beb3ef"}, + {file = "orjson-3.10.12-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ece01a7ec71d9940cc654c482907a6b65df27251255097629d0dea781f255c6d"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34ec9aebc04f11f4b978dd6caf697a2df2dd9b47d35aa4cc606cabcb9df69d7"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd6ec8658da3480939c79b9e9e27e0db31dffcd4ba69c334e98c9976ac29140e"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17e6baf4cf01534c9de8a16c0c611f3d94925d1701bf5f4aff17003677d8ced"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6402ebb74a14ef96f94a868569f5dccf70d791de49feb73180eb3c6fda2ade56"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0000758ae7c7853e0a4a6063f534c61656ebff644391e1f81698c1b2d2fc8cd2"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:888442dcee99fd1e5bd37a4abb94930915ca6af4db50e23e746cdf4d1e63db13"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c1f7a3ce79246aa0e92f5458d86c54f257fb5dfdc14a192651ba7ec2c00f8a05"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:802a3935f45605c66fb4a586488a38af63cb37aaad1c1d94c982c40dcc452e85"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1da1ef0113a2be19bb6c557fb0ec2d79c92ebd2fed4cfb1b26bab93f021fb885"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a3273e99f367f137d5b3fecb5e9f45bcdbfac2a8b2f32fbc72129bbd48789c2"}, + {file = "orjson-3.10.12-cp310-none-win32.whl", hash = "sha256:475661bf249fd7907d9b0a2a2421b4e684355a77ceef85b8352439a9163418c3"}, + {file = "orjson-3.10.12-cp310-none-win_amd64.whl", hash = "sha256:87251dc1fb2b9e5ab91ce65d8f4caf21910d99ba8fb24b49fd0c118b2362d509"}, + {file = "orjson-3.10.12-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a734c62efa42e7df94926d70fe7d37621c783dea9f707a98cdea796964d4cf74"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:750f8b27259d3409eda8350c2919a58b0cfcd2054ddc1bd317a643afc646ef23"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb52c22bfffe2857e7aa13b4622afd0dd9d16ea7cc65fd2bf318d3223b1b6252"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:440d9a337ac8c199ff8251e100c62e9488924c92852362cd27af0e67308c16ef"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9e15c06491c69997dfa067369baab3bf094ecb74be9912bdc4339972323f252"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:362d204ad4b0b8724cf370d0cd917bb2dc913c394030da748a3bb632445ce7c4"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b57cbb4031153db37b41622eac67329c7810e5f480fda4cfd30542186f006ae"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:165c89b53ef03ce0d7c59ca5c82fa65fe13ddf52eeb22e859e58c237d4e33b9b"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5dee91b8dfd54557c1a1596eb90bcd47dbcd26b0baaed919e6861f076583e9da"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a4e1cfb72de6f905bdff061172adfb3caf7a4578ebf481d8f0530879476c07"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:038d42c7bc0606443459b8fe2d1f121db474c49067d8d14c6a075bbea8bf14dd"}, + {file = "orjson-3.10.12-cp311-none-win32.whl", hash = "sha256:03b553c02ab39bed249bedd4abe37b2118324d1674e639b33fab3d1dafdf4d79"}, + {file = "orjson-3.10.12-cp311-none-win_amd64.whl", hash = "sha256:8b8713b9e46a45b2af6b96f559bfb13b1e02006f4242c156cbadef27800a55a8"}, + {file = "orjson-3.10.12-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:53206d72eb656ca5ac7d3a7141e83c5bbd3ac30d5eccfe019409177a57634b0d"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac8010afc2150d417ebda810e8df08dd3f544e0dd2acab5370cfa6bcc0662f8f"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed459b46012ae950dd2e17150e838ab08215421487371fa79d0eced8d1461d70"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dcb9673f108a93c1b52bfc51b0af422c2d08d4fc710ce9c839faad25020bb69"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22a51ae77680c5c4652ebc63a83d5255ac7d65582891d9424b566fb3b5375ee9"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910fdf2ac0637b9a77d1aad65f803bac414f0b06f720073438a7bd8906298192"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24ce85f7100160936bc2116c09d1a8492639418633119a2224114f67f63a4559"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a76ba5fc8dd9c913640292df27bff80a685bed3a3c990d59aa6ce24c352f8fc"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ff70ef093895fd53f4055ca75f93f047e088d1430888ca1229393a7c0521100f"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f4244b7018b5753ecd10a6d324ec1f347da130c953a9c88432c7fbc8875d13be"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16135ccca03445f37921fa4b585cff9a58aa8d81ebcb27622e69bfadd220b32c"}, + {file = "orjson-3.10.12-cp312-none-win32.whl", hash = "sha256:2d879c81172d583e34153d524fcba5d4adafbab8349a7b9f16ae511c2cee8708"}, + {file = "orjson-3.10.12-cp312-none-win_amd64.whl", hash = "sha256:fc23f691fa0f5c140576b8c365bc942d577d861a9ee1142e4db468e4e17094fb"}, + {file = "orjson-3.10.12-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47962841b2a8aa9a258b377f5188db31ba49af47d4003a32f55d6f8b19006543"}, + {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6334730e2532e77b6054e87ca84f3072bee308a45a452ea0bffbbbc40a67e296"}, + {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:accfe93f42713c899fdac2747e8d0d5c659592df2792888c6c5f829472e4f85e"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7974c490c014c48810d1dede6c754c3cc46598da758c25ca3b4001ac45b703f"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3f250ce7727b0b2682f834a3facff88e310f52f07a5dcfd852d99637d386e79e"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f31422ff9486ae484f10ffc51b5ab2a60359e92d0716fcce1b3593d7bb8a9af6"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5f29c5d282bb2d577c2a6bbde88d8fdcc4919c593f806aac50133f01b733846e"}, + {file = "orjson-3.10.12-cp313-none-win32.whl", hash = "sha256:f45653775f38f63dc0e6cd4f14323984c3149c05d6007b58cb154dd080ddc0dc"}, + {file = "orjson-3.10.12-cp313-none-win_amd64.whl", hash = "sha256:229994d0c376d5bdc91d92b3c9e6be2f1fbabd4cc1b59daae1443a46ee5e9825"}, + {file = "orjson-3.10.12-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7d69af5b54617a5fac5c8e5ed0859eb798e2ce8913262eb522590239db6c6763"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ed119ea7d2953365724a7059231a44830eb6bbb0cfead33fcbc562f5fd8f935"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5fc1238ef197e7cad5c91415f524aaa51e004be5a9b35a1b8a84ade196f73f"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43509843990439b05f848539d6f6198d4ac86ff01dd024b2f9a795c0daeeab60"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f72e27a62041cfb37a3de512247ece9f240a561e6c8662276beaf4d53d406db4"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a904f9572092bb6742ab7c16c623f0cdccbad9eeb2d14d4aa06284867bddd31"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:855c0833999ed5dc62f64552db26f9be767434917d8348d77bacaab84f787d7b"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:897830244e2320f6184699f598df7fb9db9f5087d6f3f03666ae89d607e4f8ed"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0b32652eaa4a7539f6f04abc6243619c56f8530c53bf9b023e1269df5f7816dd"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:36b4aa31e0f6a1aeeb6f8377769ca5d125db000f05c20e54163aef1d3fe8e833"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5535163054d6cbf2796f93e4f0dbc800f61914c0e3c4ed8499cf6ece22b4a3da"}, + {file = "orjson-3.10.12-cp38-none-win32.whl", hash = "sha256:90a5551f6f5a5fa07010bf3d0b4ca2de21adafbbc0af6cb700b63cd767266cb9"}, + {file = "orjson-3.10.12-cp38-none-win_amd64.whl", hash = "sha256:703a2fb35a06cdd45adf5d733cf613cbc0cb3ae57643472b16bc22d325b5fb6c"}, + {file = "orjson-3.10.12-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f29de3ef71a42a5822765def1febfb36e0859d33abf5c2ad240acad5c6a1b78d"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de365a42acc65d74953f05e4772c974dad6c51cfc13c3240899f534d611be967"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a5a0158648a67ff0004cb0df5df7dcc55bfc9ca154d9c01597a23ad54c8d0c"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c47ce6b8d90fe9646a25b6fb52284a14ff215c9595914af63a5933a49972ce36"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0eee4c2c5bfb5c1b47a5db80d2ac7aaa7e938956ae88089f098aff2c0f35d5d8"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d3081bbe8b86587eb5c98a73b97f13d8f9fea685cf91a579beddacc0d10566"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c23a6e90383884068bc2dba83d5222c9fcc3b99a0ed2411d38150734236755"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5472be7dc3269b4b52acba1433dac239215366f89dc1d8d0e64029abac4e714e"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7319cda750fca96ae5973efb31b17d97a5c5225ae0bc79bf5bf84df9e1ec2ab6"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:74d5ca5a255bf20b8def6a2b96b1e18ad37b4a122d59b154c458ee9494377f80"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ff31d22ecc5fb85ef62c7d4afe8301d10c558d00dd24274d4bbe464380d3cd69"}, + {file = "orjson-3.10.12-cp39-none-win32.whl", hash = "sha256:c22c3ea6fba91d84fcb4cda30e64aff548fcf0c44c876e681f47d61d24b12e6b"}, + {file = "orjson-3.10.12-cp39-none-win_amd64.whl", hash = "sha256:be604f60d45ace6b0b33dd990a66b4526f1a7a186ac411c942674625456ca548"}, + {file = "orjson-3.10.12.tar.gz", hash = "sha256:0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff"}, ] [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -1635,22 +1643,19 @@ files = [ [[package]] name = "pydantic" -version = "2.9.2" +version = "2.10.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, - {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, + {file = "pydantic-2.10.2-py3-none-any.whl", hash = "sha256:cfb96e45951117c3024e6b67b25cdc33a3cb7b2fa62e239f7af1378358a1d99e"}, + {file = "pydantic-2.10.2.tar.gz", hash = "sha256:2bc2d7f17232e0841cbba4641e65ba1eb6fafb3a08de3a091ff3ce14a197c4fa"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.4" -typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, -] +pydantic-core = "2.27.1" +typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] @@ -1658,100 +1663,111 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.4" +version = "2.27.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, - {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, - {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, - {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, - {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, - {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, - {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, - {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, - {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, - {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, - {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, - {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, - {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, - {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, + {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, + {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, + {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, + {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, + {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, + {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, + {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, + {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, + {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, + {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, + {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, + {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, + {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, + {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, + {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, + {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, ] [package.dependencies] @@ -1880,105 +1896,105 @@ files = [ [[package]] name = "regex" -version = "2024.9.11" +version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, - {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, - {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, - {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, - {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, - {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, - {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, - {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, - {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, - {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, - {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, - {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, - {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, - {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, ] [[package]] @@ -2232,33 +2248,34 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "tqdm" -version = "4.66.6" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63"}, - {file = "tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "typer" -version = "0.12.5" +version = "0.13.1" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false python-versions = ">=3.7" files = [ - {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, - {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, + {file = "typer-0.13.1-py3-none-any.whl", hash = "sha256:5b59580fd925e89463a29d363e0a43245ec02765bde9fb77d39e5d0f29dd7157"}, + {file = "typer-0.13.1.tar.gz", hash = "sha256:9d444cb96cc268ce6f8b94e13b4335084cef4c079998a9f4851a90229a3bd25c"}, ] [package.dependencies] @@ -2297,20 +2314,20 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.32.0" +version = "0.32.1" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.32.0-py3-none-any.whl", hash = "sha256:60b8f3a5ac027dcd31448f411ced12b5ef452c646f76f02f8cc3f25d8d26fd82"}, - {file = "uvicorn-0.32.0.tar.gz", hash = "sha256:f78b36b143c16f54ccdb8190d0a26b5f1901fe5a3c777e1ab29f26391af8551e"}, + {file = "uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e"}, + {file = "uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175"}, ] [package.dependencies] click = ">=7.0" colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" -httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +httptools = {version = ">=0.6.3", optional = true, markers = "extra == \"standard\""} python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} @@ -2318,7 +2335,7 @@ watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standar websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] [[package]] name = "uvloop" @@ -2373,94 +2390,82 @@ test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", [[package]] name = "watchfiles" -version = "0.24.0" +version = "1.0.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "watchfiles-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:083dc77dbdeef09fa44bb0f4d1df571d2e12d8a8f985dccde71ac3ac9ac067a0"}, - {file = "watchfiles-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e94e98c7cb94cfa6e071d401ea3342767f28eb5a06a58fafdc0d2a4974f4f35c"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82ae557a8c037c42a6ef26c494d0631cacca040934b101d001100ed93d43f361"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acbfa31e315a8f14fe33e3542cbcafc55703b8f5dcbb7c1eecd30f141df50db3"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74fdffce9dfcf2dc296dec8743e5b0332d15df19ae464f0e249aa871fc1c571"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:449f43f49c8ddca87c6b3980c9284cab6bd1f5c9d9a2b00012adaaccd5e7decd"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4abf4ad269856618f82dee296ac66b0cd1d71450fc3c98532d93798e73399b7a"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f895d785eb6164678ff4bb5cc60c5996b3ee6df3edb28dcdeba86a13ea0465e"}, - {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ae3e208b31be8ce7f4c2c0034f33406dd24fbce3467f77223d10cd86778471c"}, - {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2efec17819b0046dde35d13fb8ac7a3ad877af41ae4640f4109d9154ed30a188"}, - {file = "watchfiles-0.24.0-cp310-none-win32.whl", hash = "sha256:6bdcfa3cd6fdbdd1a068a52820f46a815401cbc2cb187dd006cb076675e7b735"}, - {file = "watchfiles-0.24.0-cp310-none-win_amd64.whl", hash = "sha256:54ca90a9ae6597ae6dc00e7ed0a040ef723f84ec517d3e7ce13e63e4bc82fa04"}, - {file = "watchfiles-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bdcd5538e27f188dd3c804b4a8d5f52a7fc7f87e7fd6b374b8e36a4ca03db428"}, - {file = "watchfiles-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2dadf8a8014fde6addfd3c379e6ed1a981c8f0a48292d662e27cabfe4239c83c"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6509ed3f467b79d95fc62a98229f79b1a60d1b93f101e1c61d10c95a46a84f43"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8360f7314a070c30e4c976b183d1d8d1585a4a50c5cb603f431cebcbb4f66327"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:316449aefacf40147a9efaf3bd7c9bdd35aaba9ac5d708bd1eb5763c9a02bef5"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73bde715f940bea845a95247ea3e5eb17769ba1010efdc938ffcb967c634fa61"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3770e260b18e7f4e576edca4c0a639f704088602e0bc921c5c2e721e3acb8d15"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0fd7248cf533c259e59dc593a60973a73e881162b1a2f73360547132742823"}, - {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7a2e3b7f5703ffbd500dabdefcbc9eafeff4b9444bbdd5d83d79eedf8428fab"}, - {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d831ee0a50946d24a53821819b2327d5751b0c938b12c0653ea5be7dea9c82ec"}, - {file = "watchfiles-0.24.0-cp311-none-win32.whl", hash = "sha256:49d617df841a63b4445790a254013aea2120357ccacbed00253f9c2b5dc24e2d"}, - {file = "watchfiles-0.24.0-cp311-none-win_amd64.whl", hash = "sha256:d3dcb774e3568477275cc76554b5a565024b8ba3a0322f77c246bc7111c5bb9c"}, - {file = "watchfiles-0.24.0-cp311-none-win_arm64.whl", hash = "sha256:9301c689051a4857d5b10777da23fafb8e8e921bcf3abe6448a058d27fb67633"}, - {file = "watchfiles-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a"}, - {file = "watchfiles-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234"}, - {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef"}, - {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968"}, - {file = "watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444"}, - {file = "watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896"}, - {file = "watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418"}, - {file = "watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48"}, - {file = "watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f"}, - {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b"}, - {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18"}, - {file = "watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07"}, - {file = "watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366"}, - {file = "watchfiles-0.24.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ee82c98bed9d97cd2f53bdb035e619309a098ea53ce525833e26b93f673bc318"}, - {file = "watchfiles-0.24.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd92bbaa2ecdb7864b7600dcdb6f2f1db6e0346ed425fbd01085be04c63f0b05"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f83df90191d67af5a831da3a33dd7628b02a95450e168785586ed51e6d28943c"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fca9433a45f18b7c779d2bae7beeec4f740d28b788b117a48368d95a3233ed83"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b995bfa6bf01a9e09b884077a6d37070464b529d8682d7691c2d3b540d357a0c"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9aba6e01ff6f2e8285e5aa4154e2970068fe0fc0998c4380d0e6278222269b"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5171ef898299c657685306d8e1478a45e9303ddcd8ac5fed5bd52ad4ae0b69b"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4933a508d2f78099162da473841c652ad0de892719043d3f07cc83b33dfd9d91"}, - {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95cf3b95ea665ab03f5a54765fa41abf0529dbaf372c3b83d91ad2cfa695779b"}, - {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01def80eb62bd5db99a798d5e1f5f940ca0a05986dcfae21d833af7a46f7ee22"}, - {file = "watchfiles-0.24.0-cp38-none-win32.whl", hash = "sha256:4d28cea3c976499475f5b7a2fec6b3a36208656963c1a856d328aeae056fc5c1"}, - {file = "watchfiles-0.24.0-cp38-none-win_amd64.whl", hash = "sha256:21ab23fdc1208086d99ad3f69c231ba265628014d4aed31d4e8746bd59e88cd1"}, - {file = "watchfiles-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b665caeeda58625c3946ad7308fbd88a086ee51ccb706307e5b1fa91556ac886"}, - {file = "watchfiles-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c51749f3e4e269231510da426ce4a44beb98db2dce9097225c338f815b05d4f"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b2509f08761f29a0fdad35f7e1638b8ab1adfa2666d41b794090361fb8b855"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a60e2bf9dc6afe7f743e7c9b149d1fdd6dbf35153c78fe3a14ae1a9aee3d98b"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7d9b87c4c55e3ea8881dfcbf6d61ea6775fffed1fedffaa60bd047d3c08c430"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78470906a6be5199524641f538bd2c56bb809cd4bf29a566a75051610bc982c3"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07cdef0c84c03375f4e24642ef8d8178e533596b229d32d2bbd69e5128ede02a"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d337193bbf3e45171c8025e291530fb7548a93c45253897cd764a6a71c937ed9"}, - {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ec39698c45b11d9694a1b635a70946a5bad066b593af863460a8e600f0dff1ca"}, - {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e28d91ef48eab0afb939fa446d8ebe77e2f7593f5f463fd2bb2b14132f95b6e"}, - {file = "watchfiles-0.24.0-cp39-none-win32.whl", hash = "sha256:7138eff8baa883aeaa074359daabb8b6c1e73ffe69d5accdc907d62e50b1c0da"}, - {file = "watchfiles-0.24.0-cp39-none-win_amd64.whl", hash = "sha256:b3ef2c69c655db63deb96b3c3e587084612f9b1fa983df5e0c3379d41307467f"}, - {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f"}, - {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b"}, - {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4"}, - {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01550ccf1d0aed6ea375ef259706af76ad009ef5b0203a3a4cce0f6024f9b68a"}, - {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:96619302d4374de5e2345b2b622dc481257a99431277662c30f606f3e22f42be"}, - {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:85d5f0c7771dcc7a26c7a27145059b6bb0ce06e4e751ed76cdf123d7039b60b5"}, - {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951088d12d339690a92cef2ec5d3cfd957692834c72ffd570ea76a6790222777"}, - {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fb58bcaa343fedc6a9e91f90195b20ccb3135447dc9e4e2570c3a39565853e"}, - {file = "watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1"}, + {file = "watchfiles-1.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1d19df28f99d6a81730658fbeb3ade8565ff687f95acb59665f11502b441be5f"}, + {file = "watchfiles-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28babb38cf2da8e170b706c4b84aa7e4528a6fa4f3ee55d7a0866456a1662041"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ab123135b2f42517f04e720526d41448667ae8249e651385afb5cda31fedc0"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13a4f9ee0cd25682679eea5c14fc629e2eaa79aab74d963bc4e21f43b8ea1877"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e1d9284cc84de7855fcf83472e51d32daf6f6cecd094160192628bc3fee1b78"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ee5edc939f53466b329bbf2e58333a5461e6c7b50c980fa6117439e2c18b42d"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dccfc70480087567720e4e36ec381bba1ed68d7e5f368fe40c93b3b1eba0105"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83a6d33a9eda0af6a7470240d1af487807adc269704fe76a4972dd982d16236"}, + {file = "watchfiles-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:905f69aad276639eff3893759a07d44ea99560e67a1cf46ff389cd62f88872a2"}, + {file = "watchfiles-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09551237645d6bff3972592f2aa5424df9290e7a2e15d63c5f47c48cde585935"}, + {file = "watchfiles-1.0.0-cp310-none-win32.whl", hash = "sha256:d2b39aa8edd9e5f56f99a2a2740a251dc58515398e9ed5a4b3e5ff2827060755"}, + {file = "watchfiles-1.0.0-cp310-none-win_amd64.whl", hash = "sha256:2de52b499e1ab037f1a87cb8ebcb04a819bf087b1015a4cf6dcf8af3c2a2613e"}, + {file = "watchfiles-1.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fbd0ab7a9943bbddb87cbc2bf2f09317e74c77dc55b1f5657f81d04666c25269"}, + {file = "watchfiles-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:774ef36b16b7198669ce655d4f75b4c3d370e7f1cbdfb997fb10ee98717e2058"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b4fb98100267e6a5ebaff6aaa5d20aea20240584647470be39fe4823012ac96"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0fc3bf0effa2d8075b70badfdd7fb839d7aa9cea650d17886982840d71fdeabf"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:648e2b6db53eca6ef31245805cd528a16f56fa4cc15aeec97795eaf713c11435"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa13d604fcb9417ae5f2e3de676e66aa97427d888e83662ad205bed35a313176"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:936f362e7ff28311b16f0b97ec51e8f2cc451763a3264640c6ed40fb252d1ee4"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245fab124b9faf58430da547512d91734858df13f2ddd48ecfa5e493455ffccb"}, + {file = "watchfiles-1.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4ff9c7e84e8b644a8f985c42bcc81457240316f900fc72769aaedec9d088055a"}, + {file = "watchfiles-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c9a8d8fd97defe935ef8dd53d562e68942ad65067cd1c54d6ed8a088b1d931d"}, + {file = "watchfiles-1.0.0-cp311-none-win32.whl", hash = "sha256:a0abf173975eb9dd17bb14c191ee79999e650997cc644562f91df06060610e62"}, + {file = "watchfiles-1.0.0-cp311-none-win_amd64.whl", hash = "sha256:2a825ba4b32c214e3855b536eb1a1f7b006511d8e64b8215aac06eb680642d84"}, + {file = "watchfiles-1.0.0-cp311-none-win_arm64.whl", hash = "sha256:a5a7a06cfc65e34fd0a765a7623c5ba14707a0870703888e51d3d67107589817"}, + {file = "watchfiles-1.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:28fb64b5843d94e2c2483f7b024a1280662a44409bedee8f2f51439767e2d107"}, + {file = "watchfiles-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e3750434c83b61abb3163b49c64b04180b85b4dabb29a294513faec57f2ffdb7"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bedf84835069f51c7b026b3ca04e2e747ea8ed0a77c72006172c72d28c9f69fc"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90004553be36427c3d06ec75b804233f8f816374165d5225b93abd94ba6e7234"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b46e15c34d4e401e976d6949ad3a74d244600d5c4b88c827a3fdf18691a46359"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:487d15927f1b0bd24e7df921913399bb1ab94424c386bea8b267754d698f8f0e"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ff236d7a3f4b0a42f699a22fc374ba526bc55048a70cbb299661158e1bb5e1f"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c01446626574561756067f00b37e6b09c8622b0fc1e9fdbc7cbcea328d4e514"}, + {file = "watchfiles-1.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b551c465a59596f3d08170bd7e1c532c7260dd90ed8135778038e13c5d48aa81"}, + {file = "watchfiles-1.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1ed613ee107269f66c2df631ec0fc8efddacface85314d392a4131abe299f00"}, + {file = "watchfiles-1.0.0-cp312-none-win32.whl", hash = "sha256:5f75cd42e7e2254117cf37ff0e68c5b3f36c14543756b2da621408349bd9ca7c"}, + {file = "watchfiles-1.0.0-cp312-none-win_amd64.whl", hash = "sha256:cf517701a4a872417f4e02a136e929537743461f9ec6cdb8184d9a04f4843545"}, + {file = "watchfiles-1.0.0-cp312-none-win_arm64.whl", hash = "sha256:8a2127cd68950787ee36753e6d401c8ea368f73beaeb8e54df5516a06d1ecd82"}, + {file = "watchfiles-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:95de85c254f7fe8cbdf104731f7f87f7f73ae229493bebca3722583160e6b152"}, + {file = "watchfiles-1.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:533a7cbfe700e09780bb31c06189e39c65f06c7f447326fee707fd02f9a6e945"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2218e78e2c6c07b1634a550095ac2a429026b2d5cbcd49a594f893f2bb8c936"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9122b8fdadc5b341315d255ab51d04893f417df4e6c1743b0aac8bf34e96e025"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9272fdbc0e9870dac3b505bce1466d386b4d8d6d2bacf405e603108d50446940"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3b33c3aefe9067ebd87846806cd5fc0b017ab70d628aaff077ab9abf4d06b3"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc338ce9f8846543d428260fa0f9a716626963148edc937d71055d01d81e1525"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ac778a460ea22d63c7e6fb0bc0f5b16780ff0b128f7f06e57aaec63bd339285"}, + {file = "watchfiles-1.0.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:53ae447f06f8f29f5ab40140f19abdab822387a7c426a369eb42184b021e97eb"}, + {file = "watchfiles-1.0.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1f73c2147a453315d672c1ad907abe6d40324e34a185b51e15624bc793f93cc6"}, + {file = "watchfiles-1.0.0-cp313-none-win32.whl", hash = "sha256:eba98901a2eab909dbd79681190b9049acc650f6111fde1845484a4450761e98"}, + {file = "watchfiles-1.0.0-cp313-none-win_amd64.whl", hash = "sha256:d562a6114ddafb09c33246c6ace7effa71ca4b6a2324a47f4b09b6445ea78941"}, + {file = "watchfiles-1.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3d94fd83ed54266d789f287472269c0def9120a2022674990bd24ad989ebd7a0"}, + {file = "watchfiles-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48051d1c504448b2fcda71c5e6e3610ae45de6a0b8f5a43b961f250be4bdf5a8"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29cf884ad4285d23453c702ed03d689f9c0e865e3c85d20846d800d4787de00f"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d3572d4c34c4e9c33d25b3da47d9570d5122f8433b9ac6519dca49c2740d23cd"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c2696611182c85eb0e755b62b456f48debff484b7306b56f05478b843ca8ece"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:550109001920a993a4383b57229c717fa73627d2a4e8fcb7ed33c7f1cddb0c85"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b555a93c15bd2c71081922be746291d776d47521a00703163e5fbe6d2a402399"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:947ccba18a38b85c366dafeac8df2f6176342d5992ca240a9d62588b214d731f"}, + {file = "watchfiles-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ffd98a299b0a74d1b704ef0ed959efb753e656a4e0425c14e46ae4c3cbdd2919"}, + {file = "watchfiles-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f8c4f3a1210ed099a99e6a710df4ff2f8069411059ffe30fa5f9467ebed1256b"}, + {file = "watchfiles-1.0.0-cp39-none-win32.whl", hash = "sha256:1e176b6b4119b3f369b2b4e003d53a226295ee862c0962e3afd5a1c15680b4e3"}, + {file = "watchfiles-1.0.0-cp39-none-win_amd64.whl", hash = "sha256:2d9c0518fabf4a3f373b0a94bb9e4ea7a1df18dec45e26a4d182aa8918dee855"}, + {file = "watchfiles-1.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f159ac795785cde4899e0afa539f4c723fb5dd336ce5605bc909d34edd00b79b"}, + {file = "watchfiles-1.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c3d258d78341d5d54c0c804a5b7faa66cd30ba50b2756a7161db07ce15363b8d"}, + {file = "watchfiles-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbd0311588c2de7f9ea5cf3922ccacfd0ec0c1922870a2be503cc7df1ca8be7"}, + {file = "watchfiles-1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a13ac46b545a7d0d50f7641eefe47d1597e7d1783a5d89e09d080e6dff44b0"}, + {file = "watchfiles-1.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2bca898c1dc073912d3db7fa6926cc08be9575add9e84872de2c99c688bac4e"}, + {file = "watchfiles-1.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d828fe2adc4ac8a64b875ca908b892a3603d596d43e18f7948f3fef5fc671c"}, + {file = "watchfiles-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074c7618cd6c807dc4eaa0982b4a9d3f8051cd0b72793511848fd64630174b17"}, + {file = "watchfiles-1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95dc785bc284552d044e561b8f4fe26d01ab5ca40d35852a6572d542adfeb4bc"}, + {file = "watchfiles-1.0.0.tar.gz", hash = "sha256:37566c844c9ce3b5deb964fe1a23378e575e74b114618d211fbda8f59d7b5dab"}, ] [package.dependencies] @@ -2468,188 +2473,171 @@ anyio = ">=3.0.0" [[package]] name = "websockets" -version = "13.1" +version = "14.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, - {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, - {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"}, - {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"}, - {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"}, - {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, - {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, - {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, - {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, - {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, - {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, - {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, - {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, - {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, - {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, - {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"}, - {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"}, - {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"}, - {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"}, - {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"}, - {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"}, - {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"}, - {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"}, - {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"}, - {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"}, - {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"}, - {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"}, - {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"}, - {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"}, - {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"}, - {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, - {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, - {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, - {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, - {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, - {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, - {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, - {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, - {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, - {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, - {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, ] [[package]] name = "yarl" -version = "1.17.1" +version = "1.18.0" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91"}, - {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da"}, - {file = "yarl-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931"}, - {file = "yarl-1.17.1-cp310-cp310-win32.whl", hash = "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b"}, - {file = "yarl-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243"}, - {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217"}, - {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988"}, - {file = "yarl-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4"}, - {file = "yarl-1.17.1-cp311-cp311-win32.whl", hash = "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7"}, - {file = "yarl-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3"}, - {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61"}, - {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d"}, - {file = "yarl-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199"}, - {file = "yarl-1.17.1-cp312-cp312-win32.whl", hash = "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96"}, - {file = "yarl-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df"}, - {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488"}, - {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374"}, - {file = "yarl-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258"}, - {file = "yarl-1.17.1-cp313-cp313-win32.whl", hash = "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2"}, - {file = "yarl-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda"}, - {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6"}, - {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159"}, - {file = "yarl-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f"}, - {file = "yarl-1.17.1-cp39-cp39-win32.whl", hash = "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473"}, - {file = "yarl-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138"}, - {file = "yarl-1.17.1-py3-none-any.whl", hash = "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06"}, - {file = "yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47"}, + {file = "yarl-1.18.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:074fee89caab89a97e18ef5f29060ef61ba3cae6cd77673acc54bfdd3214b7b7"}, + {file = "yarl-1.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b026cf2c32daf48d90c0c4e406815c3f8f4cfe0c6dfccb094a9add1ff6a0e41a"}, + {file = "yarl-1.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ae38bd86eae3ba3d2ce5636cc9e23c80c9db2e9cb557e40b98153ed102b5a736"}, + {file = "yarl-1.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:685cc37f3f307c6a8e879986c6d85328f4c637f002e219f50e2ef66f7e062c1d"}, + {file = "yarl-1.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8254dbfce84ee5d1e81051ee7a0f1536c108ba294c0fdb5933476398df0654f3"}, + {file = "yarl-1.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20de4a8b04de70c49698dc2390b7fd2d18d424d3b876371f9b775e2b462d4b41"}, + {file = "yarl-1.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0a2074a37285570d54b55820687de3d2f2b9ecf1b714e482e48c9e7c0402038"}, + {file = "yarl-1.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f576ed278860df2721a5d57da3381040176ef1d07def9688a385c8330db61a1"}, + {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3a3709450a574d61be6ac53d582496014342ea34876af8dc17cc16da32826c9a"}, + {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bd80ed29761490c622edde5dd70537ca8c992c2952eb62ed46984f8eff66d6e8"}, + {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:32141e13a1d5a48525e519c9197d3f4d9744d818d5c7d6547524cc9eccc8971e"}, + {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8b8d3e4e014fb4274f1c5bf61511d2199e263909fb0b8bda2a7428b0894e8dc6"}, + {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:701bb4a8f4de191c8c0cc9a1e6d5142f4df880e9d1210e333b829ca9425570ed"}, + {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a45d94075ac0647621eaaf693c8751813a3eccac455d423f473ffed38c8ac5c9"}, + {file = "yarl-1.18.0-cp310-cp310-win32.whl", hash = "sha256:34176bfb082add67cb2a20abd85854165540891147f88b687a5ed0dc225750a0"}, + {file = "yarl-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:73553bbeea7d6ec88c08ad8027f4e992798f0abc459361bf06641c71972794dc"}, + {file = "yarl-1.18.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b8e8c516dc4e1a51d86ac975b0350735007e554c962281c432eaa5822aa9765c"}, + {file = "yarl-1.18.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e6b4466714a73f5251d84b471475850954f1fa6acce4d3f404da1d55d644c34"}, + {file = "yarl-1.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c893f8c1a6d48b25961e00922724732d00b39de8bb0b451307482dc87bddcd74"}, + {file = "yarl-1.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13aaf2bdbc8c86ddce48626b15f4987f22e80d898818d735b20bd58f17292ee8"}, + {file = "yarl-1.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd21c0128e301851de51bc607b0a6da50e82dc34e9601f4b508d08cc89ee7929"}, + {file = "yarl-1.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205de377bd23365cd85562c9c6c33844050a93661640fda38e0567d2826b50df"}, + {file = "yarl-1.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed69af4fe2a0949b1ea1d012bf065c77b4c7822bad4737f17807af2adb15a73c"}, + {file = "yarl-1.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e1c18890091aa3cc8a77967943476b729dc2016f4cfe11e45d89b12519d4a93"}, + {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91b8fb9427e33f83ca2ba9501221ffaac1ecf0407f758c4d2f283c523da185ee"}, + {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:536a7a8a53b75b2e98ff96edb2dfb91a26b81c4fed82782035767db5a465be46"}, + {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a64619a9c47c25582190af38e9eb382279ad42e1f06034f14d794670796016c0"}, + {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c73a6bbc97ba1b5a0c3c992ae93d721c395bdbb120492759b94cc1ac71bc6350"}, + {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a173401d7821a2a81c7b47d4e7d5c4021375a1441af0c58611c1957445055056"}, + {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7520e799b1f84e095cce919bd6c23c9d49472deeef25fe1ef960b04cca51c3fc"}, + {file = "yarl-1.18.0-cp311-cp311-win32.whl", hash = "sha256:c4cb992d8090d5ae5f7afa6754d7211c578be0c45f54d3d94f7781c495d56716"}, + {file = "yarl-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:52c136f348605974c9b1c878addd6b7a60e3bf2245833e370862009b86fa4689"}, + {file = "yarl-1.18.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1ece25e2251c28bab737bdf0519c88189b3dd9492dc086a1d77336d940c28ced"}, + {file = "yarl-1.18.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:454902dc1830d935c90b5b53c863ba2a98dcde0fbaa31ca2ed1ad33b2a7171c6"}, + {file = "yarl-1.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01be8688fc211dc237e628fcc209dda412d35de7642453059a0553747018d075"}, + {file = "yarl-1.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d26f1fa9fa2167bb238f6f4b20218eb4e88dd3ef21bb8f97439fa6b5313e30d"}, + {file = "yarl-1.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b234a4a9248a9f000b7a5dfe84b8cb6210ee5120ae70eb72a4dcbdb4c528f72f"}, + {file = "yarl-1.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe94d1de77c4cd8caff1bd5480e22342dbd54c93929f5943495d9c1e8abe9f42"}, + {file = "yarl-1.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4c90c5363c6b0a54188122b61edb919c2cd1119684999d08cd5e538813a28e"}, + {file = "yarl-1.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a98ecadc5a241c9ba06de08127ee4796e1009555efd791bac514207862b43d"}, + {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9106025c7f261f9f5144f9aa7681d43867eed06349a7cfb297a1bc804de2f0d1"}, + {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f275ede6199d0f1ed4ea5d55a7b7573ccd40d97aee7808559e1298fe6efc8dbd"}, + {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f7edeb1dcc7f50a2c8e08b9dc13a413903b7817e72273f00878cb70e766bdb3b"}, + {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c083f6dd6951b86e484ebfc9c3524b49bcaa9c420cb4b2a78ef9f7a512bfcc85"}, + {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:80741ec5b471fbdfb997821b2842c59660a1c930ceb42f8a84ba8ca0f25a66aa"}, + {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1a3297b9cad594e1ff0c040d2881d7d3a74124a3c73e00c3c71526a1234a9f7"}, + {file = "yarl-1.18.0-cp312-cp312-win32.whl", hash = "sha256:cd6ab7d6776c186f544f893b45ee0c883542b35e8a493db74665d2e594d3ca75"}, + {file = "yarl-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:039c299a0864d1f43c3e31570045635034ea7021db41bf4842693a72aca8df3a"}, + {file = "yarl-1.18.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fb64dd45453225f57d82c4764818d7a205ee31ce193e9f0086e493916bd4f72"}, + {file = "yarl-1.18.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3adaaf9c6b1b4fc258584f4443f24d775a2086aee82d1387e48a8b4f3d6aecf6"}, + {file = "yarl-1.18.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:da206d1ec78438a563c5429ab808a2b23ad7bc025c8adbf08540dde202be37d5"}, + {file = "yarl-1.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:576d258b21c1db4c6449b1c572c75d03f16a482eb380be8003682bdbe7db2f28"}, + {file = "yarl-1.18.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60e547c0a375c4bfcdd60eef82e7e0e8698bf84c239d715f5c1278a73050393"}, + {file = "yarl-1.18.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3818eabaefb90adeb5e0f62f047310079d426387991106d4fbf3519eec7d90a"}, + {file = "yarl-1.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5f72421246c21af6a92fbc8c13b6d4c5427dfd949049b937c3b731f2f9076bd"}, + {file = "yarl-1.18.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa7d37f2ada0f42e0723632993ed422f2a679af0e200874d9d861720a54f53e"}, + {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:42ba84e2ac26a3f252715f8ec17e6fdc0cbf95b9617c5367579fafcd7fba50eb"}, + {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6a49ad0102c0f0ba839628d0bf45973c86ce7b590cdedf7540d5b1833ddc6f00"}, + {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:96404e8d5e1bbe36bdaa84ef89dc36f0e75939e060ca5cd45451aba01db02902"}, + {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a0509475d714df8f6d498935b3f307cd122c4ca76f7d426c7e1bb791bcd87eda"}, + {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ff116f0285b5c8b3b9a2680aeca29a858b3b9e0402fc79fd850b32c2bcb9f8b"}, + {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2580c1d7e66e6d29d6e11855e3b1c6381971e0edd9a5066e6c14d79bc8967af"}, + {file = "yarl-1.18.0-cp313-cp313-win32.whl", hash = "sha256:14408cc4d34e202caba7b5ac9cc84700e3421a9e2d1b157d744d101b061a4a88"}, + {file = "yarl-1.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:1db1537e9cb846eb0ff206eac667f627794be8b71368c1ab3207ec7b6f8c5afc"}, + {file = "yarl-1.18.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fa2c9cb607e0f660d48c54a63de7a9b36fef62f6b8bd50ff592ce1137e73ac7d"}, + {file = "yarl-1.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c0f4808644baf0a434a3442df5e0bedf8d05208f0719cedcd499e168b23bfdc4"}, + {file = "yarl-1.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7db9584235895a1dffca17e1c634b13870852094f6389b68dcc6338086aa7b08"}, + {file = "yarl-1.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:309f8d27d6f93ceeeb80aa6980e883aa57895270f7f41842b92247e65d7aeddf"}, + {file = "yarl-1.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:609ffd44fed2ed88d9b4ef62ee860cf86446cf066333ad4ce4123505b819e581"}, + {file = "yarl-1.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f172b8b2c72a13a06ea49225a9c47079549036ad1b34afa12d5491b881f5b993"}, + {file = "yarl-1.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d89ae7de94631b60d468412c18290d358a9d805182373d804ec839978b120422"}, + {file = "yarl-1.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:466d31fd043ef9af822ee3f1df8fdff4e8c199a7f4012c2642006af240eade17"}, + {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7609b8462351c4836b3edce4201acb6dd46187b207c589b30a87ffd1813b48dc"}, + {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d9d4f5e471e8dc49b593a80766c2328257e405f943c56a3dc985c125732bc4cf"}, + {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:67b336c15e564d76869c9a21316f90edf546809a5796a083b8f57c845056bc01"}, + {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b212452b80cae26cb767aa045b051740e464c5129b7bd739c58fbb7deb339e7b"}, + {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:38b39b7b3e692b6c92b986b00137a3891eddb66311b229d1940dcbd4f025083c"}, + {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a7ee6884a8848792d58b854946b685521f41d8871afa65e0d4a774954e9c9e89"}, + {file = "yarl-1.18.0-cp39-cp39-win32.whl", hash = "sha256:b4095c5019bb889aa866bf12ed4c85c0daea5aafcb7c20d1519f02a1e738f07f"}, + {file = "yarl-1.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:2d90f2e4d16a5b0915ee065218b435d2ef619dd228973b1b47d262a6f7cd8fa5"}, + {file = "yarl-1.18.0-py3-none-any.whl", hash = "sha256:dbf53db46f7cf176ee01d8d98c39381440776fcda13779d269a8ba664f69bec0"}, + {file = "yarl-1.18.0.tar.gz", hash = "sha256:20d95535e7d833889982bfe7cc321b7f63bf8879788fee982c76ae2b24cfb715"}, ] [package.dependencies] From e468492872f83d1f381357a7a8998cca08ed9f40 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Thu, 28 Nov 2024 17:52:55 +0100 Subject: [PATCH 41/70] update mentor logic --- server/application-server/openapi.yaml | 2 +- .../www1/hephaestus/chat/message/Message.java | 2 +- .../chat/message/MessageService.java | 15 +- .../model/ChatMessage.java | 135 ++++++++++++++++++ .../model/ChatRequest.java | 69 ++++----- .../model/ChatResponse.java | 63 +++----- server/intelligence-service/app/main.py | 75 ++++++++-- server/intelligence-service/app/model.py | 92 ------------ server/intelligence-service/openapi.yaml | 35 +++-- .../app/core/modules/openapi/model/message.ts | 4 +- 10 files changed, 275 insertions(+), 217 deletions(-) create mode 100644 server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatMessage.java delete mode 100644 server/intelligence-service/app/model.py diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index e03f8e72..94356d53 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -534,7 +534,7 @@ components: sender: type: string enum: - - SYSTEM + - LLM - USER content: type: string diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java index b987620c..4b6bc4f2 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/Message.java @@ -38,6 +38,6 @@ public class Message { private Session session; public enum MessageSender { - SYSTEM, USER + LLM, USER } } \ No newline at end of file diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java index 7ae90ea2..4e52b72c 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/chat/message/MessageService.java @@ -11,7 +11,9 @@ import de.tum.in.www1.hephaestus.chat.session.SessionRepository; import de.tum.in.www1.hephaestus.intelligenceservice.ApiClient; import de.tum.in.www1.hephaestus.intelligenceservice.api.DefaultApi; +import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatMessage; import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatRequest; + import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatResponse; @Service @@ -61,7 +63,7 @@ public MessageDTO sendMessage(String content, Long sessionId) { } Message systemMessage = new Message(); - systemMessage.setSender(MessageSender.SYSTEM); + systemMessage.setSender(MessageSender.LLM); systemMessage.setContent(systemResponse); systemMessage.setSession(currentSession); @@ -74,13 +76,16 @@ public MessageDTO sendMessage(String content, Long sessionId) { } private String generateResponse(Long session_id, String messageContent) { - ChatRequest chatRequest = new ChatRequest(); - chatRequest.setSessionId(session_id.toString()); - chatRequest.setMessageContent(messageContent); + List messages = messageRepository.findBySessionId(session_id); + ChatRequest chatRequest = new ChatRequest(); + chatRequest.setMessageHistory(messages.stream() + .map(message -> new ChatMessage().content(message.getContent()).sender(message.getSender().toString())) + .toList()); try { ChatResponse chatResponse = sessionApiClient.chatChatPost(chatRequest); - return chatResponse.getMessageContent(); + return chatResponse.getResponce(); + } catch (Exception e) { logger.error("Failed to generate response for message: {}", e.getMessage()); return null; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatMessage.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatMessage.java new file mode 100644 index 00000000..5ba86110 --- /dev/null +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatMessage.java @@ -0,0 +1,135 @@ +/* + * Hephaestus Intelligence Service API + * API documentation for the Hephaestus Intelligence Service. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: felixtj.dietrich@tum.de + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package de.tum.in.www1.hephaestus.intelligenceservice.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonTypeName; +import org.hibernate.validator.constraints.*; + +/** + * ChatMessage + */ +@JsonPropertyOrder({ + ChatMessage.JSON_PROPERTY_CONTENT, + ChatMessage.JSON_PROPERTY_SENDER +}) +@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0") +public class ChatMessage { + public static final String JSON_PROPERTY_CONTENT = "content"; + private String content; + + public static final String JSON_PROPERTY_SENDER = "sender"; + private String sender; + + public ChatMessage() { + } + + public ChatMessage content(String content) { + + this.content = content; + return this; + } + + /** + * Get content + * @return content + */ + @jakarta.annotation.Nonnull + @JsonProperty(JSON_PROPERTY_CONTENT) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + + public String getContent() { + return content; + } + + + @JsonProperty(JSON_PROPERTY_CONTENT) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setContent(String content) { + this.content = content; + } + + public ChatMessage sender(String sender) { + + this.sender = sender; + return this; + } + + /** + * Get sender + * @return sender + */ + @jakarta.annotation.Nonnull + @JsonProperty(JSON_PROPERTY_SENDER) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + + public String getSender() { + return sender; + } + + + @JsonProperty(JSON_PROPERTY_SENDER) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setSender(String sender) { + this.sender = sender; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ChatMessage chatMessage = (ChatMessage) o; + return Objects.equals(this.content, chatMessage.content) && + Objects.equals(this.sender, chatMessage.sender); + } + + @Override + public int hashCode() { + return Objects.hash(content, sender); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ChatMessage {\n"); + sb.append(" content: ").append(toIndentedString(content)).append("\n"); + sb.append(" sender: ").append(toIndentedString(sender)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java index c2cef448..d90a5909 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatRequest.java @@ -20,6 +20,10 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.annotation.JsonValue; +import de.tum.in.www1.hephaestus.intelligenceservice.model.ChatMessage; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonTypeName; import org.hibernate.validator.constraints.*; @@ -28,68 +32,47 @@ * ChatRequest */ @JsonPropertyOrder({ - ChatRequest.JSON_PROPERTY_MESSAGE_CONTENT, - ChatRequest.JSON_PROPERTY_SESSION_ID + ChatRequest.JSON_PROPERTY_MESSAGE_HISTORY }) @jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0") public class ChatRequest { - public static final String JSON_PROPERTY_MESSAGE_CONTENT = "message_content"; - private String messageContent; - - public static final String JSON_PROPERTY_SESSION_ID = "session_id"; - private String sessionId; + public static final String JSON_PROPERTY_MESSAGE_HISTORY = "message_history"; + private List messageHistory = new ArrayList<>(); public ChatRequest() { } - public ChatRequest messageContent(String messageContent) { + public ChatRequest messageHistory(List messageHistory) { - this.messageContent = messageContent; + this.messageHistory = messageHistory; return this; } - /** - * Get messageContent - * @return messageContent - */ - @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) - @JsonInclude(value = JsonInclude.Include.ALWAYS) - - public String getMessageContent() { - return messageContent; - } - - - @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) - @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setMessageContent(String messageContent) { - this.messageContent = messageContent; - } - - public ChatRequest sessionId(String sessionId) { - - this.sessionId = sessionId; + public ChatRequest addMessageHistoryItem(ChatMessage messageHistoryItem) { + if (this.messageHistory == null) { + this.messageHistory = new ArrayList<>(); + } + this.messageHistory.add(messageHistoryItem); return this; } /** - * Get sessionId - * @return sessionId + * Get messageHistory + * @return messageHistory */ @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_SESSION_ID) + @JsonProperty(JSON_PROPERTY_MESSAGE_HISTORY) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getSessionId() { - return sessionId; + public List getMessageHistory() { + return messageHistory; } - @JsonProperty(JSON_PROPERTY_SESSION_ID) + @JsonProperty(JSON_PROPERTY_MESSAGE_HISTORY) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setSessionId(String sessionId) { - this.sessionId = sessionId; + public void setMessageHistory(List messageHistory) { + this.messageHistory = messageHistory; } @Override @@ -101,21 +84,19 @@ public boolean equals(Object o) { return false; } ChatRequest chatRequest = (ChatRequest) o; - return Objects.equals(this.messageContent, chatRequest.messageContent) && - Objects.equals(this.sessionId, chatRequest.sessionId); + return Objects.equals(this.messageHistory, chatRequest.messageHistory); } @Override public int hashCode() { - return Objects.hash(messageContent, sessionId); + return Objects.hash(messageHistory); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class ChatRequest {\n"); - sb.append(" messageContent: ").append(toIndentedString(messageContent)).append("\n"); - sb.append(" sessionId: ").append(toIndentedString(sessionId)).append("\n"); + sb.append(" messageHistory: ").append(toIndentedString(messageHistory)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java index 735f22cb..2f060df1 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/ChatResponse.java @@ -28,68 +28,39 @@ * ChatResponse */ @JsonPropertyOrder({ - ChatResponse.JSON_PROPERTY_MESSAGE_CONTENT, - ChatResponse.JSON_PROPERTY_SESSION_ID + ChatResponse.JSON_PROPERTY_RESPONCE }) @jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0") public class ChatResponse { - public static final String JSON_PROPERTY_MESSAGE_CONTENT = "message_content"; - private String messageContent; - - public static final String JSON_PROPERTY_SESSION_ID = "session_id"; - private String sessionId; + public static final String JSON_PROPERTY_RESPONCE = "responce"; + private String responce; public ChatResponse() { } - public ChatResponse messageContent(String messageContent) { - - this.messageContent = messageContent; - return this; - } - - /** - * Get messageContent - * @return messageContent - */ - @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) - @JsonInclude(value = JsonInclude.Include.ALWAYS) - - public String getMessageContent() { - return messageContent; - } - - - @JsonProperty(JSON_PROPERTY_MESSAGE_CONTENT) - @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setMessageContent(String messageContent) { - this.messageContent = messageContent; - } - - public ChatResponse sessionId(String sessionId) { + public ChatResponse responce(String responce) { - this.sessionId = sessionId; + this.responce = responce; return this; } /** - * Get sessionId - * @return sessionId + * Get responce + * @return responce */ @jakarta.annotation.Nonnull - @JsonProperty(JSON_PROPERTY_SESSION_ID) + @JsonProperty(JSON_PROPERTY_RESPONCE) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getSessionId() { - return sessionId; + public String getResponce() { + return responce; } - @JsonProperty(JSON_PROPERTY_SESSION_ID) + @JsonProperty(JSON_PROPERTY_RESPONCE) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setSessionId(String sessionId) { - this.sessionId = sessionId; + public void setResponce(String responce) { + this.responce = responce; } @Override @@ -101,21 +72,19 @@ public boolean equals(Object o) { return false; } ChatResponse chatResponse = (ChatResponse) o; - return Objects.equals(this.messageContent, chatResponse.messageContent) && - Objects.equals(this.sessionId, chatResponse.sessionId); + return Objects.equals(this.responce, chatResponse.responce); } @Override public int hashCode() { - return Objects.hash(messageContent, sessionId); + return Objects.hash(responce); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class ChatResponse {\n"); - sb.append(" messageContent: ").append(toIndentedString(messageContent)).append("\n"); - sb.append(" sessionId: ").append(toIndentedString(sessionId)).append("\n"); + sb.append(" responce: ").append(toIndentedString(responce)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 83ff6309..67d21bd3 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -1,6 +1,15 @@ from fastapi import FastAPI from pydantic import BaseModel -from .model import send_message +import os +from enum import Enum +from typing import List +from .config import settings +from typing_extensions import Annotated, TypedDict +from langchain.chat_models.base import BaseChatModel +from langchain_openai import ChatOpenAI, AzureChatOpenAI +from langgraph.graph import START, StateGraph, END +from langgraph.graph.message import add_messages +from langchain_core.messages import SystemMessage, HumanMessage, AIMessage app = FastAPI( title="Hephaestus Intelligence Service API", @@ -10,14 +19,55 @@ ) +class ChatMessage(BaseModel): + sender: str + content: str + + class ChatRequest(BaseModel): - session_id: str - message_content: str + message_history: List[ChatMessage] class ChatResponse(BaseModel): - session_id: str - message_content: str + responce: str + + +model: BaseChatModel + +if os.getenv("GITHUB_ACTIONS") == "true": + + class MockChatModel: + def invoke(self, message: str): + return "Mock response" + + model = MockChatModel() + +elif settings.is_openai_available: + model = ChatOpenAI(temperature=2) +elif settings.is_azure_openai_available: + model = AzureChatOpenAI() +else: + raise EnvironmentError("No LLM available") + + +class State(TypedDict): + messages: Annotated[list, add_messages] + + +propmt = "You are an AI mentor helping a students working on the software engineering projects embracing structured self-reflection practices. You need to guide the student through the set questions regarding their work on the project during the last week (sprint). Your value is the fact, that you help students to reflect on their past progress. Throughout the conversation you need to perform all of the following tasks in the given order: Task 1: Greet the student and say you are happy to start the session. Task 2: Ask the student about the overall progress on the project. Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress. Task 4: Ask about the plan for the next sprint. You need to understand at which stage in the conversation you are and what is the next task. Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project. Do not make a questionaire out of the conversation, but rather make it a natural conversation." + + +def ai_mentor(state: State): + return { + "messages": [model.invoke([SystemMessage(content=propmt)] + state["messages"])] + } + + +graph_builder = StateGraph(State) +graph_builder.add_node("ai_mentor", ai_mentor) +graph_builder.add_edge(START, "ai_mentor") +graph_builder.add_edge("ai_mentor", END) +graph = graph_builder.compile() @app.post( @@ -26,11 +76,14 @@ class ChatResponse(BaseModel): summary="Start and continue a chat session with an LLM.", ) async def chat(request: ChatRequest): - state = {"messages": []} + messages = [] + for message in request.message_history: + if message.author == "USER": + messages.append(HumanMessage(content=message.content)) + else: + messages.append(AIMessage(content=message.content)) - result = send_message( - session_id=request.session_id, input_message=request.message_content, state=state - ) + for event in graph.stream({"messages": messages}, stream_mode="values"): + responce_message = event["messages"][-1].content - response_message = result["response"]["messages"][-1].content - return ChatResponse(session_id=request.session_id, message_content=response_message) + return ChatResponse(responce=responce_message) diff --git a/server/intelligence-service/app/model.py b/server/intelligence-service/app/model.py deleted file mode 100644 index 5a39f72e..00000000 --- a/server/intelligence-service/app/model.py +++ /dev/null @@ -1,92 +0,0 @@ -import os -from .config import settings -from typing import Sequence -from typing_extensions import Annotated, TypedDict - -from langchain_core.messages import trim_messages, BaseMessage, HumanMessage -from langchain.chat_models.base import BaseChatModel -from langchain_openai import ChatOpenAI, AzureChatOpenAI -from langchain_core.prompts import ChatPromptTemplate -from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder -from langgraph.checkpoint.memory import MemorySaver -from langgraph.graph import START, StateGraph -from langgraph.graph.message import add_messages - - -model: BaseChatModel - -if os.getenv("GITHUB_ACTIONS") == "true": - - class MockChatModel: - def invoke(self, message: str): - return "Mock response" - - model = MockChatModel() - -elif settings.is_openai_available: - model = ChatOpenAI(temperature=1.0) -elif settings.is_azure_openai_available: - model = AzureChatOpenAI() -else: - raise EnvironmentError("No LLM available") - - -class State(TypedDict): - messages: Annotated[Sequence[BaseMessage], add_messages] - - -mentor_prompt = ChatPromptTemplate.from_messages( - [ - ( - "system", - "You are an AI mentor helping a students working on the software engineering projects embracing structured self-reflection practices." - + "You need to guide the student through the set questions regarding their work on the project during the last week (sprint). Your value is the fact, that you help students to reflect on their past progress." - + "Throughout the conversation you need to perform all of the following tasks in the given order: " - + "Task 1: Greet the student and say you are happy to start the session." - + "Task 2: Ask the student about the overall progress on the project." - + "Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress." - + "Task 4: Ask about the plan for the next sprint." - + "Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project." - + "Always perform only one task in one message. Listen to what the student says and refer to it in your next message." - + "Analyse the conversation before and asses which task is to be performed. Give the student a feeling of a real conversation, not just questionaire.", - ), - MessagesPlaceholder(variable_name="messages"), - ] -) - -workflow = StateGraph(state_schema=State) -trimmer = trim_messages( - max_tokens=4000, - strategy="last", - token_counter=model, - include_system=True, - allow_partial=False, - start_on="human", -) - - -def call_model(state: State): - chain = mentor_prompt | model - trimmed_messages = trimmer.invoke(state["messages"]) - response = chain.invoke({"messages": trimmed_messages}) - return {"messages": [response]} - - -workflow.add_edge(START, "model") -workflow.add_node("model", call_model) - -memory = MemorySaver() -app = workflow.compile(checkpointer=memory) - - -def send_message(session_id: str, input_message: str, state: State): - config = {"configurable": {"thread_id": session_id}} - state["messages"] += [HumanMessage(input_message)] - - output = app.invoke( - {"messages": state["messages"]}, - config, - ) - - state["messages"] += output.get("messages", []) - return {"state": state, "response": output} \ No newline at end of file diff --git a/server/intelligence-service/openapi.yaml b/server/intelligence-service/openapi.yaml index 6cefd792..55e19af1 100644 --- a/server/intelligence-service/openapi.yaml +++ b/server/intelligence-service/openapi.yaml @@ -1,29 +1,36 @@ components: schemas: - ChatRequest: + ChatMessage: properties: - message_content: - title: Message Content + content: + title: Content type: string - session_id: - title: Session Id + sender: + title: Sender type: string required: - - session_id - - message_content + - sender + - content + title: ChatMessage + type: object + ChatRequest: + properties: + message_history: + items: + $ref: '#/components/schemas/ChatMessage' + title: Message History + type: array + required: + - message_history title: ChatRequest type: object ChatResponse: properties: - message_content: - title: Message Content - type: string - session_id: - title: Session Id + responce: + title: Responce type: string required: - - session_id - - message_content + - responce title: ChatResponse type: object HTTPValidationError: diff --git a/webapp/src/app/core/modules/openapi/model/message.ts b/webapp/src/app/core/modules/openapi/model/message.ts index 77128bbb..94f6d0fc 100644 --- a/webapp/src/app/core/modules/openapi/model/message.ts +++ b/webapp/src/app/core/modules/openapi/model/message.ts @@ -19,9 +19,9 @@ export interface Message { sessionId: number; } export namespace Message { - export type SenderEnum = 'SYSTEM' | 'USER'; + export type SenderEnum = 'LLM' | 'USER'; export const SenderEnum = { - System: 'SYSTEM' as SenderEnum, + Llm: 'LLM' as SenderEnum, User: 'USER' as SenderEnum }; } From eda63ded0a8f8dee2983411d964691bff9f87756 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sun, 1 Dec 2024 19:34:01 +0100 Subject: [PATCH 42/70] Update bot logic --- server/intelligence-service/app/main.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 67d21bd3..3ffe3e76 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -1,9 +1,8 @@ from fastapi import FastAPI from pydantic import BaseModel import os -from enum import Enum from typing import List -from .config import settings +from config import settings from typing_extensions import Annotated, TypedDict from langchain.chat_models.base import BaseChatModel from langchain_openai import ChatOpenAI, AzureChatOpenAI @@ -43,7 +42,7 @@ def invoke(self, message: str): model = MockChatModel() elif settings.is_openai_available: - model = ChatOpenAI(temperature=2) + model = ChatOpenAI() elif settings.is_azure_openai_available: model = AzureChatOpenAI() else: @@ -54,17 +53,19 @@ class State(TypedDict): messages: Annotated[list, add_messages] -propmt = "You are an AI mentor helping a students working on the software engineering projects embracing structured self-reflection practices. You need to guide the student through the set questions regarding their work on the project during the last week (sprint). Your value is the fact, that you help students to reflect on their past progress. Throughout the conversation you need to perform all of the following tasks in the given order: Task 1: Greet the student and say you are happy to start the session. Task 2: Ask the student about the overall progress on the project. Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress. Task 4: Ask about the plan for the next sprint. You need to understand at which stage in the conversation you are and what is the next task. Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project. Do not make a questionaire out of the conversation, but rather make it a natural conversation." +prompt = "You are an AI mentor helping a students working on the software engineering projects embracing structured self-reflection practices. You need to guide the student through the set questions regarding their work on the project during the last week (sprint). Your value is the fact, that you help students to reflect on their past progress. Throughout the conversation you need to perform all of the following tasks in the given order: Task 1: Greet the student and say you are happy to start the session. Task 2: Ask the student about the overall progress on the project. Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress. Task 4: Ask about the plan for the next sprint. You need to understand at which stage in the conversation you are from the message history and what is the next task. Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project. Do not make a questionaire out of the conversation, but rather make it a natural conversation." def ai_mentor(state: State): + print(SystemMessage(content=prompt) + state["messages"]) return { - "messages": [model.invoke([SystemMessage(content=propmt)] + state["messages"])] + "messages": [model.invoke(state["messages"] + [SystemMessage(content=prompt)])] } graph_builder = StateGraph(State) graph_builder.add_node("ai_mentor", ai_mentor) + graph_builder.add_edge(START, "ai_mentor") graph_builder.add_edge("ai_mentor", END) graph = graph_builder.compile() @@ -75,15 +76,12 @@ def ai_mentor(state: State): response_model=ChatResponse, summary="Start and continue a chat session with an LLM.", ) -async def chat(request: ChatRequest): +def chat(request: ChatRequest): messages = [] for message in request.message_history: - if message.author == "USER": + if message.sender == "USER": messages.append(HumanMessage(content=message.content)) else: messages.append(AIMessage(content=message.content)) - - for event in graph.stream({"messages": messages}, stream_mode="values"): - responce_message = event["messages"][-1].content - - return ChatResponse(responce=responce_message) + response_message = graph.invoke({"messages": messages})["messages"][-1].content + return ChatResponse(responce=response_message) From 12673c973972daf9a0d0d79fe52bcc647942f779 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sun, 1 Dec 2024 19:39:22 +0100 Subject: [PATCH 43/70] Format --- server/intelligence-service/app/main.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 3ffe3e76..86cb6a2d 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -2,7 +2,7 @@ from pydantic import BaseModel import os from typing import List -from config import settings +from .config import settings from typing_extensions import Annotated, TypedDict from langchain.chat_models.base import BaseChatModel from langchain_openai import ChatOpenAI, AzureChatOpenAI @@ -57,7 +57,6 @@ class State(TypedDict): def ai_mentor(state: State): - print(SystemMessage(content=prompt) + state["messages"]) return { "messages": [model.invoke(state["messages"] + [SystemMessage(content=prompt)])] } @@ -65,7 +64,6 @@ def ai_mentor(state: State): graph_builder = StateGraph(State) graph_builder.add_node("ai_mentor", ai_mentor) - graph_builder.add_edge(START, "ai_mentor") graph_builder.add_edge("ai_mentor", END) graph = graph_builder.compile() From 24ee85b4e502b7dfdced3dfd9b6078c28f41af98 Mon Sep 17 00:00:00 2001 From: milenasrb Date: Sun, 1 Dec 2024 20:00:47 +0100 Subject: [PATCH 44/70] Change prompt --- server/intelligence-service/app/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/intelligence-service/app/main.py b/server/intelligence-service/app/main.py index 86cb6a2d..0a09e516 100644 --- a/server/intelligence-service/app/main.py +++ b/server/intelligence-service/app/main.py @@ -42,7 +42,7 @@ def invoke(self, message: str): model = MockChatModel() elif settings.is_openai_available: - model = ChatOpenAI() + model = ChatOpenAI(temperature=1.0) elif settings.is_azure_openai_available: model = AzureChatOpenAI() else: @@ -53,7 +53,7 @@ class State(TypedDict): messages: Annotated[list, add_messages] -prompt = "You are an AI mentor helping a students working on the software engineering projects embracing structured self-reflection practices. You need to guide the student through the set questions regarding their work on the project during the last week (sprint). Your value is the fact, that you help students to reflect on their past progress. Throughout the conversation you need to perform all of the following tasks in the given order: Task 1: Greet the student and say you are happy to start the session. Task 2: Ask the student about the overall progress on the project. Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress. Task 4: Ask about the plan for the next sprint. You need to understand at which stage in the conversation you are from the message history and what is the next task. Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project. Do not make a questionaire out of the conversation, but rather make it a natural conversation." +prompt = "You are an AI mentor helping a students working on the software engineering projects embracing structured self-reflection practices. You need to guide the student through the set questions regarding their work on the project during the last week (sprint). Your value is the fact, that you help students to reflect on their past progress. Throughout the conversation you need to perform all of the following tasks in the given order: Task 1: Greet the student and say you are happy to start the session. Task 2: Ask the student about the overall progress on the project. Task 3: Ask the student about the challenges faced during the sprint referring to what he said about progress. Task 4: Ask about the plan for the next sprint. You need to understand at which task in the conversation you are from the message history and what is the next task. Please, don't repeat yourself throughout the conversation. Be polite, friendly and do not let the student drive the conversation to any other topic except for the current project. Do not make a questionaire out of the conversation, but rather make it a natural conversation. Don't repeat the answer of the student to your latest question but try to react on it. If the student asks questions be helpful and try to find solutions." def ai_mentor(state: State): From dd53b386a41b3b13482727ddfcb726e97a6563f0 Mon Sep 17 00:00:00 2001 From: Milena Serbinova <45200178+milesha@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:35:15 +0100 Subject: [PATCH 45/70] Intelligence Service MVP Chat Interface (#169) Co-authored-by: Felix T.J. Dietrich --- webapp/package-lock.json | 2 + webapp/package.json | 1 + webapp/src/app/app.routes.ts | 3 +- webapp/src/app/chat/chat/chat.component.html | 28 ++++ webapp/src/app/chat/chat/chat.component.ts | 137 ++++++++++++++++++ .../first-session-card.component.html | 13 ++ .../first-session-card.component.ts | 20 +++ .../src/app/chat/input/input.component.html | 21 +++ webapp/src/app/chat/input/input.component.ts | 29 ++++ webapp/src/app/chat/input/input.stories.ts | 20 +++ .../app/chat/messages/messages.component.html | 40 +++++ .../app/chat/messages/messages.component.ts | 42 ++++++ .../sessions-card.component.html | 36 +++++ .../sessions-card/sessions-card.component.ts | 31 ++++ .../header/ai-mentor/ai-mentor.component.html | 21 +++ .../header/ai-mentor/ai-mentor.component.ts | 18 +++ .../header/ai-mentor/ai-mentor.stories.ts | 30 ++++ .../src/app/core/header/header.component.html | 5 +- .../src/app/core/header/header.component.ts | 4 +- 19 files changed, 498 insertions(+), 3 deletions(-) create mode 100644 webapp/src/app/chat/chat/chat.component.html create mode 100644 webapp/src/app/chat/chat/chat.component.ts create mode 100644 webapp/src/app/chat/first-session-card/first-session-card.component.html create mode 100644 webapp/src/app/chat/first-session-card/first-session-card.component.ts create mode 100644 webapp/src/app/chat/input/input.component.html create mode 100644 webapp/src/app/chat/input/input.component.ts create mode 100644 webapp/src/app/chat/input/input.stories.ts create mode 100644 webapp/src/app/chat/messages/messages.component.html create mode 100644 webapp/src/app/chat/messages/messages.component.ts create mode 100644 webapp/src/app/chat/sessions-card/sessions-card.component.html create mode 100644 webapp/src/app/chat/sessions-card/sessions-card.component.ts create mode 100644 webapp/src/app/core/header/ai-mentor/ai-mentor.component.html create mode 100644 webapp/src/app/core/header/ai-mentor/ai-mentor.component.ts create mode 100644 webapp/src/app/core/header/ai-mentor/ai-mentor.stories.ts diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 19f24322..5c96f336 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -91,6 +91,7 @@ "karma-coverage": "2.2.1", "karma-jasmine": "5.1.0", "karma-jasmine-html-reporter": "2.1.0", + "prettier": "^3.3.3", "storybook": "8.3.4", "typescript": "5.5.4" }, @@ -19136,6 +19137,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, diff --git a/webapp/package.json b/webapp/package.json index 1aa1854f..b2832667 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -103,6 +103,7 @@ "karma-coverage": "2.2.1", "karma-jasmine": "5.1.0", "karma-jasmine-html-reporter": "2.1.0", + "prettier": "3.3.3", "storybook": "8.3.4", "typescript": "5.5.4" } diff --git a/webapp/src/app/app.routes.ts b/webapp/src/app/app.routes.ts index a7397fad..45036f67 100644 --- a/webapp/src/app/app.routes.ts +++ b/webapp/src/app/app.routes.ts @@ -1,6 +1,7 @@ import { Routes } from '@angular/router'; import { AboutComponent } from '@app/about/about.component'; import { HomeComponent } from '@app/home/home.component'; +import { ChatComponent } from '@app/chat/chat/chat.component'; import { WorkspaceComponent } from '@app/workspace/workspace.component'; import { UserProfileComponent } from '@app/user/user-profile.component'; import { WorkspaceUsersComponent } from './workspace/users/users.component'; @@ -38,7 +39,7 @@ export const routes: Routes = [ { path: 'settings', component: SettingsComponent }, { path: 'imprint', component: ImprintComponent }, { path: 'privacy', component: PrivacyComponent }, - + { path: 'chat', component: ChatComponent }, // Protected routes { path: '', diff --git a/webapp/src/app/chat/chat/chat.component.html b/webapp/src/app/chat/chat/chat.component.html new file mode 100644 index 00000000..9a022492 --- /dev/null +++ b/webapp/src/app/chat/chat/chat.component.html @@ -0,0 +1,28 @@ +@if (isLoading()) { +
+ +
+} @else { +
+ @if (sessions().length === 0) { +
+ +
+ } @else { + + + @if (selectedSession()) { +
+ + +
+ } + } +
+} diff --git a/webapp/src/app/chat/chat/chat.component.ts b/webapp/src/app/chat/chat/chat.component.ts new file mode 100644 index 00000000..8ef3be95 --- /dev/null +++ b/webapp/src/app/chat/chat/chat.component.ts @@ -0,0 +1,137 @@ +import { Component, inject, signal } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { lastValueFrom } from 'rxjs'; +import { injectMutation, injectQuery } from '@tanstack/angular-query-experimental'; +import { SessionsCardComponent } from '../sessions-card/sessions-card.component'; +import { MessagesComponent } from '../messages/messages.component'; +import { InputComponent } from '../input/input.component'; +import { SecurityStore } from '@app/core/security/security-store.service'; +import { Message, Session } from '@app/core/modules/openapi'; +import { MessageService, SessionService } from '@app/core/modules/openapi'; +import { HlmButtonModule } from '@spartan-ng/ui-button-helm'; +import { HlmSpinnerComponent } from '@spartan-ng/ui-spinner-helm'; +import { FirstSessionCardComponent } from '../first-session-card/first-session-card.component'; + +@Component({ + selector: 'app-chat', + templateUrl: './chat.component.html', + standalone: true, + imports: [CommonModule, FirstSessionCardComponent, HlmSpinnerComponent, SessionsCardComponent, MessagesComponent, InputComponent, HlmButtonModule] +}) +export class ChatComponent { + securityStore = inject(SecurityStore); + messageService = inject(MessageService); + sessionService = inject(SessionService); + + signedIn = this.securityStore.signedIn; + user = this.securityStore.loadedUser; + + messageHistory = signal([]); + selectedSession = signal(null); + sessions = signal([]); + isLoading = signal(true); + + latestMessageContent = ''; + + protected query_sessions = injectQuery(() => ({ + enabled: this.signedIn(), + queryKey: ['sessions', { login: this.user()?.username }], + queryFn: async () => { + const username = this.user()?.username; + if (!username) { + throw new Error('User is not logged in or username is undefined.'); + } + const sessions = await lastValueFrom(this.sessionService.getSessions(username)); + if (sessions.length > 0 && this.selectedSession() == null) { + this.selectedSession.set(sessions.slice(-1)[0]); + } + this.sessions.set(sessions.reverse()); + this.isLoading.set(false); + return sessions; + } + })); + + handleSessionSelect(sessionId: number): void { + const session = this.sessions().find((s) => s.id === sessionId); + if (session) { + this.selectedSession.set(session); + this.query_sessions.refetch(); + } + } + + handleCreateSession(): void { + this.createSession.mutate(); + } + + protected createSession = injectMutation(() => ({ + mutationFn: async () => { + const username = this.user()?.username; + if (!username) { + throw new Error('User is not logged in or username is undefined.'); + } + await lastValueFrom(this.sessionService.createSession(username)); + }, + onSuccess: async () => { + await this.query_sessions.refetch(); + const sessions = this.sessions(); + if (sessions.length > 0) { + const newSession = sessions[0]; + this.selectedSession.set(newSession); + } + } + })); + + protected query_messages = injectQuery(() => ({ + enabled: !!this.selectedSession, + queryKey: ['messages', { sessionId: this.selectedSession()?.id }], + queryFn: async () => { + const selectedSessionId = this.selectedSession()?.id; + if (selectedSessionId == null) { + throw new Error('No session selected!'); + } + const loadedMessages = await lastValueFrom(this.messageService.getMessages(selectedSessionId)); + this.messageHistory.set(loadedMessages); + return loadedMessages; + } + })); + + protected sendMessage = injectMutation(() => ({ + queryKey: ['messages', 'create'], + mutationFn: async ({ sessionId }: { sessionId: number }) => { + if (!this.selectedSession) { + throw new Error('No session selected!'); + } + await lastValueFrom(this.messageService.createMessage(sessionId, this.latestMessageContent)); + }, + onSuccess: () => { + this.query_messages.refetch(); + } + })); + + handleSendMessage(content: string): void { + if (!this.selectedSession) { + console.error('No session selected!'); + return; + } + + const selectedSessionId = this.selectedSession()?.id; + if (selectedSessionId == null) { + console.error('No session selected!'); + return; + } else { + // show the user message directly after sending + const userMessage: Message = { + id: Math.random(), // temporary id until the message is sent + sessionId: selectedSessionId, + sender: 'USER', + content: content, + sentAt: new Date().toISOString() + }; + + this.messageHistory.set([...this.messageHistory(), userMessage]); + + this.latestMessageContent = content; + this.sendMessage.mutate({ sessionId: selectedSessionId }); + } + } +} diff --git a/webapp/src/app/chat/first-session-card/first-session-card.component.html b/webapp/src/app/chat/first-session-card/first-session-card.component.html new file mode 100644 index 00000000..a48804f4 --- /dev/null +++ b/webapp/src/app/chat/first-session-card/first-session-card.component.html @@ -0,0 +1,13 @@ +
+
+ +
+ +

+ Meet Your Personal AI Mentor – designed to help you grow faster through focused and reflective learning sessions. Click below to begin! +

+ + Start First Session +
diff --git a/webapp/src/app/chat/first-session-card/first-session-card.component.ts b/webapp/src/app/chat/first-session-card/first-session-card.component.ts new file mode 100644 index 00000000..01b6cfe0 --- /dev/null +++ b/webapp/src/app/chat/first-session-card/first-session-card.component.ts @@ -0,0 +1,20 @@ +import { Component, output } from '@angular/core'; +import { LucideAngularModule, Plus, BotMessageSquare } from 'lucide-angular'; +import { HlmButtonModule } from '@spartan-ng/ui-button-helm'; + +@Component({ + selector: 'app-first-session-card', + standalone: true, + templateUrl: './first-session-card.component.html', + imports: [LucideAngularModule, HlmButtonModule] +}) +export class FirstSessionCardComponent { + protected Plus = Plus; + protected BotMessageSquare = BotMessageSquare; + + createSession = output(); + + handleCreateSession(): void { + this.createSession.emit(); + } +} diff --git a/webapp/src/app/chat/input/input.component.html b/webapp/src/app/chat/input/input.component.html new file mode 100644 index 00000000..f2fc332e --- /dev/null +++ b/webapp/src/app/chat/input/input.component.html @@ -0,0 +1,21 @@ +
+ + + + +
diff --git a/webapp/src/app/chat/input/input.component.ts b/webapp/src/app/chat/input/input.component.ts new file mode 100644 index 00000000..7bfa72eb --- /dev/null +++ b/webapp/src/app/chat/input/input.component.ts @@ -0,0 +1,29 @@ +import { Component, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { HlmCardModule } from '@spartan-ng/ui-card-helm'; + +import { HlmButtonModule } from '@spartan-ng/ui-button-helm'; +import { LucideAngularModule, Send } from 'lucide-angular'; + +@Component({ + selector: 'app-chat-input', + templateUrl: './input.component.html', + standalone: true, + imports: [CommonModule, HlmButtonModule, FormsModule, HlmCardModule, LucideAngularModule] +}) +export class InputComponent { + protected Send = Send; + + messageSent = output(); + messageText = ''; + + onSend() { + if (this.messageText.trim() !== '') { + this.messageSent.emit(this.messageText); + setTimeout(() => { + this.messageText = ''; + }, 0); + } + } +} diff --git a/webapp/src/app/chat/input/input.stories.ts b/webapp/src/app/chat/input/input.stories.ts new file mode 100644 index 00000000..5ab5cb5b --- /dev/null +++ b/webapp/src/app/chat/input/input.stories.ts @@ -0,0 +1,20 @@ +import { argsToTemplate, type Meta, type StoryObj } from '@storybook/angular'; +import { InputComponent } from './input.component'; + +const meta: Meta = { + component: InputComponent, + tags: ['autodocs'], + args: { + messageText: '' + } +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: (args) => ({ + props: args, + template: `` + }) +}; diff --git a/webapp/src/app/chat/messages/messages.component.html b/webapp/src/app/chat/messages/messages.component.html new file mode 100644 index 00000000..8823e1b3 --- /dev/null +++ b/webapp/src/app/chat/messages/messages.component.html @@ -0,0 +1,40 @@ +
+ @for (message of messageHistory(); track message.id) { +
+
+ @if (message.sender === 'USER') { +
+ + + + {{ user()?.name?.slice(0, 2)?.toUpperCase() ?? '?' }} + + +
+ } + + @if (message.sender === 'LLM') { +
+
+ +
+
+ } + +
+
+

{{ message.content }}

+
+ {{ message.sender === 'USER' ? 'You' : 'AI Mentor' }} · {{ message.sentAt | date: 'shortTime' }} +
+
+
+ } +
diff --git a/webapp/src/app/chat/messages/messages.component.ts b/webapp/src/app/chat/messages/messages.component.ts new file mode 100644 index 00000000..30470395 --- /dev/null +++ b/webapp/src/app/chat/messages/messages.component.ts @@ -0,0 +1,42 @@ +import { Component, inject, input, OnInit, AfterViewChecked, ElementRef, ViewChild } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { LucideAngularModule, BotMessageSquare } from 'lucide-angular'; +import { HlmAvatarModule } from '@spartan-ng/ui-avatar-helm'; +import { SecurityStore } from '@app/core/security/security-store.service'; +import { Message } from '@app/core/modules/openapi'; + +@Component({ + selector: 'app-messages', + templateUrl: './messages.component.html', + standalone: true, + imports: [CommonModule, LucideAngularModule, HlmAvatarModule] +}) +export class MessagesComponent implements OnInit, AfterViewChecked { + protected BotMessageSquare = BotMessageSquare; + + securityStore = inject(SecurityStore); + user = this.securityStore.loadedUser; + signedIn = this.securityStore.signedIn; + + messageHistory = input([]); + + @ViewChild('chatMessagesContainer') private chatMessagesContainer!: ElementRef; + + ngOnInit() { + this.scrollToBottom(); + } + + ngAfterViewChecked() { + this.scrollToBottom(); + } + + private scrollToBottom(): void { + try { + if (this.chatMessagesContainer) { + this.chatMessagesContainer.nativeElement.scrollTop = this.chatMessagesContainer.nativeElement.scrollHeight; + } + } catch (err) { + console.error(err); + } + } +} diff --git a/webapp/src/app/chat/sessions-card/sessions-card.component.html b/webapp/src/app/chat/sessions-card/sessions-card.component.html new file mode 100644 index 00000000..43d7f69b --- /dev/null +++ b/webapp/src/app/chat/sessions-card/sessions-card.component.html @@ -0,0 +1,36 @@ +
+
+ + + New Session + +
+

Past Sessions

+
    + @for (session of sessions(); track session.id) { +
  • + {{ session.createdAt | date: 'short' }} +
  • + } +
+
+
+
diff --git a/webapp/src/app/chat/sessions-card/sessions-card.component.ts b/webapp/src/app/chat/sessions-card/sessions-card.component.ts new file mode 100644 index 00000000..5f975663 --- /dev/null +++ b/webapp/src/app/chat/sessions-card/sessions-card.component.ts @@ -0,0 +1,31 @@ +import { Component, input, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { LucideAngularModule, Plus } from 'lucide-angular'; +import { HlmButtonModule } from '@spartan-ng/ui-button-helm'; +import { Session } from '@app/core/modules/openapi'; + +@Component({ + standalone: true, + selector: 'app-sessions-card', + templateUrl: './sessions-card.component.html', + imports: [CommonModule, LucideAngularModule, HlmButtonModule] +}) +export class SessionsCardComponent { + protected Plus = Plus; + + sessions = input(); + activeSessionId = input(); + + sessionSelected = output(); + createSession = output(); + + handleSelectSession(sessionId: number): void { + if (this.activeSessionId() && this.activeSessionId() !== sessionId) { + this.sessionSelected.emit(sessionId); + } + } + + handleCreateSession(): void { + this.createSession.emit(); + } +} diff --git a/webapp/src/app/core/header/ai-mentor/ai-mentor.component.html b/webapp/src/app/core/header/ai-mentor/ai-mentor.component.html new file mode 100644 index 00000000..0c7d94c7 --- /dev/null +++ b/webapp/src/app/core/header/ai-mentor/ai-mentor.component.html @@ -0,0 +1,21 @@ + + + + @if (!iconOnly()) { + AI Mentor + } + + @if (iconOnly()) { + AI Mentor + } + diff --git a/webapp/src/app/core/header/ai-mentor/ai-mentor.component.ts b/webapp/src/app/core/header/ai-mentor/ai-mentor.component.ts new file mode 100644 index 00000000..c56d1274 --- /dev/null +++ b/webapp/src/app/core/header/ai-mentor/ai-mentor.component.ts @@ -0,0 +1,18 @@ +import { booleanAttribute, Component, input } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { HlmButtonModule } from '@spartan-ng/ui-button-helm'; +import { BrnTooltipContentDirective } from '@spartan-ng/ui-tooltip-brain'; +import { HlmTooltipComponent, HlmTooltipTriggerDirective } from '@spartan-ng/ui-tooltip-helm'; +import { LucideAngularModule, BotMessageSquare } from 'lucide-angular'; + +@Component({ + selector: 'app-ai-mentor', + standalone: true, + imports: [LucideAngularModule, HlmButtonModule, HlmTooltipComponent, HlmTooltipTriggerDirective, BrnTooltipContentDirective, RouterModule], + templateUrl: './ai-mentor.component.html' +}) +export class AiMentorComponent { + protected BotMessageSquare = BotMessageSquare; + + iconOnly = input(false, { transform: booleanAttribute }); +} diff --git a/webapp/src/app/core/header/ai-mentor/ai-mentor.stories.ts b/webapp/src/app/core/header/ai-mentor/ai-mentor.stories.ts new file mode 100644 index 00000000..0513139a --- /dev/null +++ b/webapp/src/app/core/header/ai-mentor/ai-mentor.stories.ts @@ -0,0 +1,30 @@ +import { argsToTemplate, type Meta, type StoryObj } from '@storybook/angular'; +import { AiMentorComponent } from './ai-mentor.component'; + +const meta: Meta = { + component: AiMentorComponent, + tags: ['autodocs'], + args: { + iconOnly: false + } +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: (args) => ({ + props: args, + template: `` + }) +}; + +export const Icon: Story = { + args: { + iconOnly: true + }, + render: (args) => ({ + props: args, + template: `` + }) +}; diff --git a/webapp/src/app/core/header/header.component.html b/webapp/src/app/core/header/header.component.html index 428344dd..ee2360df 100644 --- a/webapp/src/app/core/header/header.component.html +++ b/webapp/src/app/core/header/header.component.html @@ -8,6 +8,10 @@ Workspace } + @if (user()?.roles?.includes('ai-maintainer')) { +