-
Notifications
You must be signed in to change notification settings - Fork 303
Update C chat samples with using ChatHistory class #3045
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
5a41c21
c28ec23
f114d11
04089cc
bbfceac
0dc1226
ce474f7
6948a30
584652c
74fbb66
38db49d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -6,14 +6,74 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #include <string.h> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #include "openvino/genai/c/llm_pipeline.h" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #include "openvino/genai/c/chat_history.h" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #include "openvino/genai/c/json_container.h" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #define MAX_PROMPT_LENGTH 64 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #define MAX_PROMPT_LENGTH 1024 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #define MAX_JSON_LENGTH 4096 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #define CHECK_STATUS(return_status) \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (return_status != OK) { \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fprintf(stderr, "[ERROR] return status %d, line %d\n", return_status, __LINE__); \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| goto err; \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #define CHECK_CHAT_HISTORY_STATUS(return_status) \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (return_status != OV_GENAI_CHAT_HISTORY_OK) { \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fprintf(stderr, "[ERROR] chat history status %d, line %d\n", return_status, __LINE__); \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| goto err; \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #define CHECK_JSON_CONTAINER_STATUS(return_status) \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (return_status != OV_GENAI_JSON_CONTAINER_OK) { \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fprintf(stderr, "[ERROR] json container status %d, line %d\n", return_status, __LINE__); \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| goto err; \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| static void json_escape_string(const char* input, char* output, size_t output_size) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| size_t i = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| size_t j = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| while (input[i] != '\0' && j < output_size - 1) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch (input[i]) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case '"': | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (j < output_size - 2) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = '\\'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = '"'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case '\\': | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (j < output_size - 2) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = '\\'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = '\\'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case '\n': | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (j < output_size - 2) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = '\\'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = 'n'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case '\r': | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (j < output_size - 2) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = '\\'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = 'r'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case '\t': | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (j < output_size - 2) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = '\\'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = 't'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| default: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j++] = input[i]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
zhaohb marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| i++; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output[j] = '\0'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
zhaohb marked this conversation as resolved.
Show resolved
Hide resolved
Comment on lines
+37
to
+74
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch (input[i]) { | |
| case '"': | |
| if (j < output_size - 2) { | |
| output[j++] = '\\'; | |
| output[j++] = '"'; | |
| } | |
| break; | |
| case '\\': | |
| if (j < output_size - 2) { | |
| output[j++] = '\\'; | |
| output[j++] = '\\'; | |
| } | |
| break; | |
| case '\n': | |
| if (j < output_size - 2) { | |
| output[j++] = '\\'; | |
| output[j++] = 'n'; | |
| } | |
| break; | |
| case '\r': | |
| if (j < output_size - 2) { | |
| output[j++] = '\\'; | |
| output[j++] = 'r'; | |
| } | |
| break; | |
| case '\t': | |
| if (j < output_size - 2) { | |
| output[j++] = '\\'; | |
| output[j++] = 't'; | |
| } | |
| break; | |
| default: | |
| output[j++] = input[i]; | |
| break; | |
| } | |
| i++; | |
| } | |
| output[j] = '\0'; | |
| unsigned char c = (unsigned char)input[i]; | |
| if (c == '\"' || c == '\\') { | |
| if (j + 2 < output_size) { | |
| output[j++] = '\\'; | |
| output[j++] = c; | |
| } else { | |
| break; | |
| } | |
| } else if (c == '\b') { | |
| if (j + 2 < output_size) { | |
| output[j++] = '\\'; | |
| output[j++] = 'b'; | |
| } else { | |
| break; | |
| } | |
| } else if (c == '\f') { | |
| if (j + 2 < output_size) { | |
| output[j++] = '\\'; | |
| output[j++] = 'f'; | |
| } else { | |
| break; | |
| } | |
| } else if (c == '\n') { | |
| if (j + 2 < output_size) { | |
| output[j++] = '\\'; | |
| output[j++] = 'n'; | |
| } else { | |
| break; | |
| } | |
| } else if (c == '\r') { | |
| if (j + 2 < output_size) { | |
| output[j++] = '\\'; | |
| output[j++] = 'r'; | |
| } else { | |
| break; | |
| } | |
| } else if (c == '\t') { | |
| if (j + 2 < output_size) { | |
| output[j++] = '\\'; | |
| output[j++] = 't'; | |
| } else { | |
| break; | |
| } | |
| } else if (c < 0x20) { | |
| // Control characters: use \u00XX | |
| if (j + 6 < output_size) { | |
| snprintf(&output[j], output_size - j, "\\u%04x", c); | |
| j += 6; | |
| } else { | |
| break; | |
| } | |
| } else { | |
| if (j + 1 < output_size) { | |
| output[j++] = c; | |
| } else { | |
| break; | |
| } | |
| } | |
| i++; | |
| } | |
| // Always null-terminate | |
| if (j < output_size) | |
| output[j] = '\0'; | |
| else if (output_size > 0) | |
| output[output_size - 1] = '\0'; |
zhaohb marked this conversation as resolved.
Show resolved
Hide resolved
zhaohb marked this conversation as resolved.
Show resolved
Hide resolved
zhaohb marked this conversation as resolved.
Show resolved
Hide resolved
zhaohb marked this conversation as resolved.
Show resolved
Hide resolved
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing validation of output_size before using output_buffer. If ov_genai_decoded_results_get_string modifies output_size to be larger than sizeof(output_buffer), or if it fails, the buffer content may be invalid. The return status should be checked before proceeding to use output_buffer.
| if (output_size > sizeof(output_buffer)) { | |
| fprintf(stderr, "[ERROR] output_size (%zu) exceeds output_buffer size (%zu), line %d\n", output_size, sizeof(output_buffer), __LINE__); | |
| goto err; | |
| } |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The snprintf calls on lines 132-133 and 158-159 are vulnerable to buffer overflow. If the escaped string is too long, snprintf will truncate the JSON, resulting in malformed JSON (e.g., missing closing quote or brace). This could cause the subsequent ov_genai_json_container_create_from_json_string to fail. Consider checking the return value of snprintf and handling cases where the buffer is too small.
zhaohb marked this conversation as resolved.
Show resolved
Hide resolved
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -53,4 +53,4 @@ int main(int argc, char* argv[]) { | |
| free(output); | ||
|
|
||
| return EXIT_SUCCESS; | ||
| } | ||
| } | ||
zhaohb marked this conversation as resolved.
Show resolved
Hide resolved
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,181 @@ | ||
| // Copyright (C) 2025 Intel Corporation | ||
| // SPDX-License-Identifier: Apache-2.0 | ||
| // | ||
| // This is a C wrapper for ov::genai::ChatHistory class. | ||
|
|
||
| #pragma once | ||
|
|
||
| #include "visibility.h" | ||
| #include <stddef.h> | ||
|
|
||
| // Forward declaration for JsonContainer | ||
| typedef struct ov_genai_json_container_opaque ov_genai_json_container; | ||
|
|
||
| /** | ||
| * @struct ov_genai_chat_history | ||
| * @brief Opaque type for ChatHistory | ||
| */ | ||
| typedef struct ov_genai_chat_history_opaque ov_genai_chat_history; | ||
|
|
||
| /** | ||
| * @brief Status codes for chat history operations | ||
| */ | ||
| typedef enum { | ||
| OV_GENAI_CHAT_HISTORY_OK = 0, | ||
| OV_GENAI_CHAT_HISTORY_INVALID_PARAM = -1, | ||
| OV_GENAI_CHAT_HISTORY_OUT_OF_BOUNDS = -2, | ||
| OV_GENAI_CHAT_HISTORY_EMPTY = -3, | ||
| OV_GENAI_CHAT_HISTORY_INVALID_JSON = -4, | ||
| OV_GENAI_CHAT_HISTORY_ERROR = -5 | ||
| } ov_genai_chat_history_status_e; | ||
|
|
||
| /** | ||
| * @brief Create a new empty ChatHistory instance. | ||
| * @param history A pointer to the newly created ov_genai_chat_history. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_create(ov_genai_chat_history** history); | ||
|
|
||
| /** | ||
| * @brief Create a ChatHistory instance from a JsonContainer (array). | ||
| * @param history A pointer to the newly created ov_genai_chat_history. | ||
| * @param messages A JsonContainer containing an array of message objects. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_create_from_json_container( | ||
| ov_genai_chat_history** history, | ||
| const ov_genai_json_container* messages | ||
| ); | ||
|
Comment on lines
+47
to
+48
|
||
|
|
||
| /** | ||
| * @brief Release the memory allocated by ov_genai_chat_history. | ||
| * @param history A pointer to the ov_genai_chat_history to free memory. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS void ov_genai_chat_history_free(ov_genai_chat_history* history); | ||
|
|
||
| /** | ||
| * @brief Add a message to the chat history from a JsonContainer. | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param message A JsonContainer containing a message object (e.g., {"role": "user", "content": "Hello"}). | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_push_back( | ||
| ov_genai_chat_history* history, | ||
| const ov_genai_json_container* message); | ||
|
|
||
| /** | ||
| * @brief Remove the last message from the chat history. | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_pop_back(ov_genai_chat_history* history); | ||
|
|
||
| /** | ||
| * @brief Get all messages as a JsonContainer (array). | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param messages A pointer to store the returned JsonContainer containing all messages. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_get_messages( | ||
| const ov_genai_chat_history* history, | ||
| ov_genai_json_container** messages); | ||
|
|
||
| /** | ||
| * @brief Get a message at a specific index as a JsonContainer. | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param index The index of the message to retrieve. | ||
| * @param message A pointer to store the returned JsonContainer containing the message. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_get_message( | ||
| const ov_genai_chat_history* history, | ||
| size_t index, | ||
| ov_genai_json_container** message); | ||
|
|
||
| /** | ||
| * @brief Get the first message as a JsonContainer. | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param message A pointer to store the returned JsonContainer containing the first message. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_get_first( | ||
| const ov_genai_chat_history* history, | ||
| ov_genai_json_container** message); | ||
|
|
||
| /** | ||
| * @brief Get the last message as a JsonContainer. | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param message A pointer to store the returned JsonContainer containing the last message. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_get_last( | ||
| const ov_genai_chat_history* history, | ||
| ov_genai_json_container** message); | ||
|
|
||
| /** | ||
| * @brief Clear all messages from the chat history. | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_clear(ov_genai_chat_history* history); | ||
|
|
||
| /** | ||
| * @brief Get the number of messages in the chat history. | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param size A pointer to store the size (number of messages). | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_size( | ||
| const ov_genai_chat_history* history, | ||
| size_t* size); | ||
|
|
||
| /** | ||
| * @brief Check if the chat history is empty. | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param empty A pointer to store the boolean result (1 for empty, 0 for not empty). | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_empty( | ||
| const ov_genai_chat_history* history, | ||
| int* empty); | ||
|
|
||
| /** | ||
| * @brief Set tools definitions (for function calling) as a JsonContainer (array). | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param tools A JsonContainer containing an array of tool definitions. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_set_tools( | ||
| ov_genai_chat_history* history, | ||
| const ov_genai_json_container* tools); | ||
|
|
||
| /** | ||
| * @brief Get tools definitions as a JsonContainer (array). | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param tools A pointer to store the returned JsonContainer containing tools definitions. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_get_tools( | ||
| const ov_genai_chat_history* history, | ||
| ov_genai_json_container** tools); | ||
|
|
||
| /** | ||
| * @brief Set extra context (for custom template variables) as a JsonContainer (object). | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param extra_context A JsonContainer containing an object with extra context. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_set_extra_context( | ||
| ov_genai_chat_history* history, | ||
| const ov_genai_json_container* extra_context); | ||
|
|
||
| /** | ||
| * @brief Get extra context as a JsonContainer (object). | ||
| * @param history A pointer to the ov_genai_chat_history instance. | ||
| * @param extra_context A pointer to store the returned JsonContainer containing extra context. | ||
| * @return ov_genai_chat_history_status_e A status code, return OK(0) if successful. | ||
| */ | ||
| OPENVINO_GENAI_C_EXPORTS ov_genai_chat_history_status_e ov_genai_chat_history_get_extra_context( | ||
| const ov_genai_chat_history* history, | ||
| ov_genai_json_container** extra_context); | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.