Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6a57cea
Reverting models to make sure calls to the simulator work
nagkumar91 Mar 7, 2024
dd01ecf
merge
nagkumar91 Mar 7, 2024
8cea9c3
quotes
nagkumar91 Mar 7, 2024
bea237e
Spellcheck fixes
nagkumar91 Mar 7, 2024
45073cc
ignore the models for doc generation
nagkumar91 Mar 7, 2024
08af5b3
Fixed the quotes on f strings
nagkumar91 Mar 7, 2024
7584cc9
pylint skip file
nagkumar91 Mar 7, 2024
e10fe6f
Merge branch 'Azure:main' into main
nagkumar91 Mar 7, 2024
304d506
Merge branch 'Azure:main' into main
nagkumar91 Mar 11, 2024
d727177
Support for summarization
nagkumar91 Mar 11, 2024
8b895ee
Adding a limit of 2 conversation turns for all but conversation simul…
nagkumar91 Mar 11, 2024
92d6d8e
exclude synthetic from mypy
nagkumar91 Mar 11, 2024
4742b04
Another lint fix
nagkumar91 Mar 11, 2024
975b0b3
Skip the file causing linting issues
nagkumar91 Mar 12, 2024
a00871f
Merge branch 'Azure:main' into main
nagkumar91 Mar 12, 2024
6bf1de0
Bugfix on output to json_qa_lines and empty response from callbacks
nagkumar91 Mar 13, 2024
5a974ce
Merge branch 'main' into main
nagkumar91 Mar 13, 2024
3f9c000
Skip pylint
nagkumar91 Mar 13, 2024
5ab6ab2
Merge branch 'main' of https://github.com/nagkumar91/azure-sdk-for-py…
nagkumar91 Mar 13, 2024
0c76fb0
Add if/else on message to eval json util
nagkumar91 Mar 14, 2024
8188779
Remove the verbose logs, add a progress bar and display a message whe…
nagkumar91 Mar 18, 2024
2e534c3
Added back missing param
nagkumar91 Mar 18, 2024
feb75ea
Spellcheck fix for pbar
nagkumar91 Mar 18, 2024
5782da7
Adding parameter to the spellcheck
nagkumar91 Mar 18, 2024
3093e23
Simulator logging initialized on the top of the page and reused
nagkumar91 Mar 19, 2024
b679361
Clean up the warning log message
nagkumar91 Mar 19, 2024
dea2714
Removing logs from AsyncHttpClientWithRetry
nagkumar91 Mar 19, 2024
041ae18
Using the right param
nagkumar91 Mar 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,6 @@ async def simulate_conversation(
else:
conversation_id = None
first_prompt = first_response["samples"][0]
logger.info(f"First turn: {first_prompt}")

# Add all generated turns into array to pass for each bot while generating
# new responses. We add generated response and the person generating it.
# in the case of the first turn, it is supposed to be the user search query
Expand All @@ -115,7 +113,6 @@ async def simulate_conversation(
current_character_idx = current_turn % len(bots)
current_bot = bots[current_character_idx]
# invoke Bot to generate response given the input request
logger.info("-- Sending to %s", current_bot.role.value)
# pass only the last generated turn without passing the bot name.
response, request, time_taken, full_response = await current_bot.generate_response(
session=session,
Expand All @@ -137,7 +134,6 @@ async def simulate_conversation(
request=request,
)
)
logger.info("Last turn: %s", conversation_history[-1])
if mlflow_logger is not None:
logger_tasks.append( # schedule logging but don't get blocked by it
asyncio.create_task(mlflow_logger.log_successful_response(time_taken))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,21 +57,13 @@ def __init__(
self.model = model

self.logger = logging.getLogger(repr(self))

self.conversation_starter = None # can either be a dictionary or jinja template
if role == ConversationRole.USER:
if "conversation_starter" in self.persona_template_args:
conversation_starter_content = self.persona_template_args["conversation_starter"]
if isinstance(conversation_starter_content, dict):
msg = f"{conversation_starter_content} instead of generating a turn using a LLM"
self.logger.info(
"This simulated bot will use the provided conversation starter (passed in as dictionary): %s",
msg,
)
self.conversation_starter = conversation_starter_content
else:
msg = f"{repr(conversation_starter_content)[:400]} instead of generating a turn using a LLM"
self.logger.info("This simulated bot will use the provided conversation starter %s", msg)
self.conversation_starter = jinja2.Template(
conversation_starter_content, undefined=jinja2.StrictUndefined
)
Expand Down Expand Up @@ -107,12 +99,8 @@ async def generate_response(
if turn_number == 0 and self.conversation_starter is not None:
# if conversation_starter is a dictionary, pass it into samples as is
if isinstance(self.conversation_starter, dict):
self.logger.info("Returning conversation starter: %s", self.conversation_starter)
samples = [self.conversation_starter]
else:
self.logger.info(
"Returning conversation starter: %s", repr(self.persona_template_args["conversation_starter"])[:400]
)
samples = [self.conversation_starter.render(**self.persona_template_args)] # type: ignore[attr-defined]
time_taken = 0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ def __init__(self, n_retry, retry_timeout, logger, retry_options=None):
# Set up async HTTP client with retry

trace_config = TraceConfig() # set up request logging
trace_config.on_request_start.append(self.on_request_start)
trace_config.on_request_end.append(self.on_request_end)
trace_config.on_request_end.append(self.delete_auth_header)
# trace_config.on_request_start.append(self.on_request_start)
# trace_config.on_request_end.append(self.on_request_end)
if retry_options is None:
retry_options = RandomRetry( # set up retry configuration
statuses=[104, 408, 409, 424, 429, 500, 502,
Expand All @@ -67,6 +68,13 @@ async def on_request_start(self, session, trace_config_ctx, params):
current_attempt, params.method, params.url
))

async def delete_auth_header(self, session, trace_config_ctx, params):
request_headers = dict(params.response.request_info.headers)
if "Authorization" in request_headers:
del request_headers["Authorization"]
if "api-key" in request_headers:
del request_headers["api-key"]

async def on_request_end(self, session, trace_config_ctx, params):
current_attempt = trace_config_ctx.trace_request_ctx["current_attempt"]
request_headers = dict(params.response.request_info.headers)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,17 @@ async def generate_response(
"id": None,
"template_parameters": {}
}
if not result:
result = {
"messages": [{
"content": "Callback did not return a response.",
"role": "assistant"
}],
"finish_reason": ["stop"],
"id": None,
"template_parameters": {}
}

self.logger.info("Using user provided callback returning response.")

time_taken = 0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# ---------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# ---------------------------------------------------------
# pylint: disable=C0303
# pylint: skip-file
"""
This module contains a utility class for managing a list of JSON lines.
"""
Expand Down Expand Up @@ -52,14 +52,17 @@ def to_eval_qa_json_lines(self):
assistant_message = message['content']
if 'context' in message:
context = message.get("context", None)
if user_message and assistant_message:
if context:
json_lines += json.dumps({
'question': user_message,
'answer': assistant_message,
'context': context}) + "\n"
else:
json_lines += json.dumps({
'question': user_message,
'answer': assistant_message}) + "\n"
if user_message and assistant_message:
if context:
json_lines += json.dumps({
'question': user_message,
'answer': assistant_message,
'context': context}) + "\n"
user_message = assistant_message = context = None
else:
json_lines += json.dumps({
'question': user_message,
'answer': assistant_message}) + "\n"
user_message = assistant_message = None

return json_lines
Loading