Skip to content
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

Set up poetry and ruff linting #776

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 8 additions & 0 deletions .github/workflows/ruff.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
name: Ruff
on: [push, pull_request]
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: chartboost/ruff-action@v1
10 changes: 10 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.3.7
hooks:
# Run the linter.
- id: ruff
args: [ --fix ]
# Run the formatter.
- id: ruff-format
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,24 @@ This repo contains sample code for a simple chat webapp that integrates with Azu
- Pinecone index (preview)
- AzureML index (preview)

### Developer Prerequisites
The following tools should be installed prior to running the project locally.

#### Frontend tools
- Node.js 21+

#### Backend tools
- Python 3.10+
- [Poetry](https://python-poetry.org/docs/#installation)

## Development workflow

This project uses [Poetry](https://python-poetry.org/) to manage project dependencies. It is recommended to follow these steps for managing your local Python development environment.

1. Run `poetry install` to bootstrap your local development environment with this project and its dependencies. This command will create a virtual environment containing all of the project dependencies under the `.venv` directory.
2. Use the `poetry add`, `poetry update` and `poetry remove` commands to modify packages in the environment. See the [Poetry CLI](https://python-poetry.org/docs/cli) docs for more information about arguments to those commands.
3. When you are ready to deploy your app or submit a PR, generate a requirements.txt file for the app using the command `poetry export --dev --without-hashes --format=requirements.txt --output=requirements-dev.txt`.

## Deploy the app

### Deploy with Azure Developer CLI
Expand Down
24 changes: 9 additions & 15 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -823,10 +823,10 @@ async def send_chat_request(request):
filtered_messages = []
messages = request.get("messages", [])
for message in messages:
if message.get("role") != 'tool':
if message.get("role") != "tool":
filtered_messages.append(message)
request['messages'] = filtered_messages

request["messages"] = filtered_messages
model_args = prepare_model_args(request)

try:
Expand Down Expand Up @@ -1079,14 +1079,10 @@ async def delete_conversation():
raise Exception("CosmosDB is not configured or not working")

## delete the conversation messages from cosmos first
deleted_messages = await cosmos_conversation_client.delete_messages(
conversation_id, user_id
)
await cosmos_conversation_client.delete_messages(conversation_id, user_id)

## Now delete the conversation
deleted_conversation = await cosmos_conversation_client.delete_conversation(
user_id, conversation_id
)
await cosmos_conversation_client.delete_conversation(user_id, conversation_id)

await cosmos_conversation_client.cosmosdb_client.close()

Expand Down Expand Up @@ -1247,12 +1243,12 @@ async def delete_all_conversations():
# delete each conversation
for conversation in conversations:
## delete the conversation messages from cosmos first
deleted_messages = await cosmos_conversation_client.delete_messages(
await cosmos_conversation_client.delete_messages(
conversation["id"], user_id
)

## Now delete the conversation
deleted_conversation = await cosmos_conversation_client.delete_conversation(
await cosmos_conversation_client.delete_conversation(
user_id, conversation["id"]
)
await cosmos_conversation_client.cosmosdb_client.close()
Expand Down Expand Up @@ -1290,9 +1286,7 @@ async def clear_messages():
raise Exception("CosmosDB is not configured or not working")

## delete the conversation messages from cosmos
deleted_messages = await cosmos_conversation_client.delete_messages(
conversation_id, user_id
)
await cosmos_conversation_client.delete_messages(conversation_id, user_id)

return (
jsonify(
Expand Down Expand Up @@ -1368,7 +1362,7 @@ async def generate_title(conversation_messages):

title = json.loads(response.choices[0].message.content)["title"]
return title
except Exception as e:
except Exception:
return messages[-2]["content"]


Expand Down
17 changes: 9 additions & 8 deletions backend/auth/auth_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,17 @@ def get_authenticated_user_details(request_headers):
if "X-Ms-Client-Principal-Id" not in request_headers.keys():
## if it's not, assume we're in development mode and return a default user
from . import sample_user

raw_user_object = sample_user.sample_user
else:
## if it is, get the user details from the EasyAuth headers
raw_user_object = {k:v for k,v in request_headers.items()}
raw_user_object = {k: v for k, v in request_headers.items()}

user_object['user_principal_id'] = raw_user_object.get('X-Ms-Client-Principal-Id')
user_object['user_name'] = raw_user_object.get('X-Ms-Client-Principal-Name')
user_object['auth_provider'] = raw_user_object.get('X-Ms-Client-Principal-Idp')
user_object['auth_token'] = raw_user_object.get('X-Ms-Token-Aad-Id-Token')
user_object['client_principal_b64'] = raw_user_object.get('X-Ms-Client-Principal')
user_object['aad_id_token'] = raw_user_object.get('X-Ms-Token-Aad-Id-Token')
user_object["user_principal_id"] = raw_user_object.get("X-Ms-Client-Principal-Id")
user_object["user_name"] = raw_user_object.get("X-Ms-Client-Principal-Name")
user_object["auth_provider"] = raw_user_object.get("X-Ms-Client-Principal-Idp")
user_object["auth_token"] = raw_user_object.get("X-Ms-Token-Aad-Id-Token")
user_object["client_principal_b64"] = raw_user_object.get("X-Ms-Client-Principal")
user_object["aad_id_token"] = raw_user_object.get("X-Ms-Token-Aad-Id-Token")

return user_object
return user_object
74 changes: 37 additions & 37 deletions backend/auth/sample_user.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
sample_user = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en",
"Client-Ip": "22.222.222.2222:64379",
"Content-Length": "192",
"Content-Type": "application/json",
"Cookie": "AppServiceAuthSession=/AuR5ENU+pmpoN3jnymP8fzpmVBgphx9uPQrYLEWGcxjIITIeh8NZW7r3ePkG8yBcMaItlh1pX4nzg5TFD9o2mxC/5BNDRe/uuu0iDlLEdKecROZcVRY7QsFdHLjn9KB90Z3d9ZeLwfVIf0sZowWJt03BO5zKGB7vZgL+ofv3QY3AaYn1k1GtxSE9HQWJpWar7mOA64b7Lsy62eY3nxwg3AWDsP3/rAta+MnDCzpdlZMFXcJLj+rsCppW+w9OqGhKQ7uCs03BPeon3qZOdmE8cOJW3+i96iYlhneNQDItHyQqEi1CHbBTSkqwpeOwWP4vcwGM22ynxPp7YFyiRw/X361DGYy+YkgYBkXq1AEIDZ44BCBz9EEaEi0NU+m6yUOpNjEaUtrJKhQywcM2odojdT4XAY+HfTEfSqp0WiAkgAuE/ueCu2JDOfvxGjCgJ4DGWCoYdOdXAN1c+MenT4OSvkMO41YuPeah9qk9ixkJI5s80lv8rUu1J26QF6pstdDkYkAJAEra3RQiiO1eAH7UEb3xHXn0HW5lX8ZDX3LWiAFGOt5DIKxBKFymBKJGzbPFPYjfczegu0FD8/NQPLl2exAX3mI9oy/tFnATSyLO2E8DxwP5wnYVminZOQMjB/I4g3Go14betm0MlNXlUbU1fyS6Q6JxoCNLDZywCoU9Y65UzimWZbseKsXlOwYukCEpuQ5QPT55LuEAWhtYier8LSh+fvVUsrkqKS+bg0hzuoX53X6aqUr7YB31t0Z2zt5TT/V3qXpdyD8Xyd884PqysSkJYa553sYx93ETDKSsfDguanVfn2si9nvDpvUWf6/R02FmQgXiaaaykMgYyIuEmE77ptsivjH3hj/MN4VlePFWokcchF4ciqqzonmICmjEHEx5zpjU2Kwa+0y7J5ROzVVygcnO1jH6ZKDy9bGGYL547bXx/iiYBYqSIQzleOAkCeULrGN2KEHwckX5MpuRaqTpoxdZH9RJv0mIWxbDA0kwGsbMICQd0ZODBkPUnE84qhzvXInC+TL7MbutPEnGbzgxBAS1c2Ct4vxkkjykOeOxTPxqAhxoefwUfIwZZax6A9LbeYX2bsBpay0lScHcA==",
"Disguised-Host": "your_app_service.azurewebsites.net",
"Host": "your_app_service.azurewebsites.net",
"Max-Forwards": "10",
"Origin": "https://your_app_service.azurewebsites.net",
"Referer": "https://your_app_service.azurewebsites.net/",
"Sec-Ch-Ua": "\"Microsoft Edge\";v=\"113\", \"Chromium\";v=\"113\", \"Not-A.Brand\";v=\"24\"",
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": "\"Windows\"",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"Traceparent": "00-24e9a8d1b06f233a3f1714845ef971a9-3fac69f81ca5175c-00",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.42",
"Was-Default-Hostname": "your_app_service.azurewebsites.net",
"X-Appservice-Proto": "https",
"X-Arr-Log-Id": "4102b832-6c88-4c7c-8996-0edad9e4358f",
"X-Arr-Ssl": "2048|256|CN=Microsoft Azure TLS Issuing CA 02, O=Microsoft Corporation, C=US|CN=*.azurewebsites.net, O=Microsoft Corporation, L=Redmond, S=WA, C=US",
"X-Client-Ip": "22.222.222.222",
"X-Client-Port": "64379",
"X-Forwarded-For": "22.222.222.22:64379",
"X-Forwarded-Proto": "https",
"X-Forwarded-Tlsversion": "1.2",
"X-Ms-Client-Principal": "your_base_64_encoded_token",
"X-Ms-Client-Principal-Id": "00000000-0000-0000-0000-000000000000",
"X-Ms-Client-Principal-Idp": "aad",
"X-Ms-Client-Principal-Name": "[email protected]",
"X-Ms-Token-Aad-Id-Token": "your_aad_id_token",
"X-Original-Url": "/chatgpt",
"X-Site-Deployment-Id": "your_app_service",
"X-Waws-Unencoded-Url": "/chatgpt"
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en",
"Client-Ip": "22.222.222.2222:64379",
"Content-Length": "192",
"Content-Type": "application/json",
"Cookie": "AppServiceAuthSession=/AuR5ENU+pmpoN3jnymP8fzpmVBgphx9uPQrYLEWGcxjIITIeh8NZW7r3ePkG8yBcMaItlh1pX4nzg5TFD9o2mxC/5BNDRe/uuu0iDlLEdKecROZcVRY7QsFdHLjn9KB90Z3d9ZeLwfVIf0sZowWJt03BO5zKGB7vZgL+ofv3QY3AaYn1k1GtxSE9HQWJpWar7mOA64b7Lsy62eY3nxwg3AWDsP3/rAta+MnDCzpdlZMFXcJLj+rsCppW+w9OqGhKQ7uCs03BPeon3qZOdmE8cOJW3+i96iYlhneNQDItHyQqEi1CHbBTSkqwpeOwWP4vcwGM22ynxPp7YFyiRw/X361DGYy+YkgYBkXq1AEIDZ44BCBz9EEaEi0NU+m6yUOpNjEaUtrJKhQywcM2odojdT4XAY+HfTEfSqp0WiAkgAuE/ueCu2JDOfvxGjCgJ4DGWCoYdOdXAN1c+MenT4OSvkMO41YuPeah9qk9ixkJI5s80lv8rUu1J26QF6pstdDkYkAJAEra3RQiiO1eAH7UEb3xHXn0HW5lX8ZDX3LWiAFGOt5DIKxBKFymBKJGzbPFPYjfczegu0FD8/NQPLl2exAX3mI9oy/tFnATSyLO2E8DxwP5wnYVminZOQMjB/I4g3Go14betm0MlNXlUbU1fyS6Q6JxoCNLDZywCoU9Y65UzimWZbseKsXlOwYukCEpuQ5QPT55LuEAWhtYier8LSh+fvVUsrkqKS+bg0hzuoX53X6aqUr7YB31t0Z2zt5TT/V3qXpdyD8Xyd884PqysSkJYa553sYx93ETDKSsfDguanVfn2si9nvDpvUWf6/R02FmQgXiaaaykMgYyIuEmE77ptsivjH3hj/MN4VlePFWokcchF4ciqqzonmICmjEHEx5zpjU2Kwa+0y7J5ROzVVygcnO1jH6ZKDy9bGGYL547bXx/iiYBYqSIQzleOAkCeULrGN2KEHwckX5MpuRaqTpoxdZH9RJv0mIWxbDA0kwGsbMICQd0ZODBkPUnE84qhzvXInC+TL7MbutPEnGbzgxBAS1c2Ct4vxkkjykOeOxTPxqAhxoefwUfIwZZax6A9LbeYX2bsBpay0lScHcA==",
"Disguised-Host": "your_app_service.azurewebsites.net",
"Host": "your_app_service.azurewebsites.net",
"Max-Forwards": "10",
"Origin": "https://your_app_service.azurewebsites.net",
"Referer": "https://your_app_service.azurewebsites.net/",
"Sec-Ch-Ua": '"Microsoft Edge";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": '"Windows"',
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"Traceparent": "00-24e9a8d1b06f233a3f1714845ef971a9-3fac69f81ca5175c-00",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.42",
"Was-Default-Hostname": "your_app_service.azurewebsites.net",
"X-Appservice-Proto": "https",
"X-Arr-Log-Id": "4102b832-6c88-4c7c-8996-0edad9e4358f",
"X-Arr-Ssl": "2048|256|CN=Microsoft Azure TLS Issuing CA 02, O=Microsoft Corporation, C=US|CN=*.azurewebsites.net, O=Microsoft Corporation, L=Redmond, S=WA, C=US",
"X-Client-Ip": "22.222.222.222",
"X-Client-Port": "64379",
"X-Forwarded-For": "22.222.222.22:64379",
"X-Forwarded-Proto": "https",
"X-Forwarded-Tlsversion": "1.2",
"X-Ms-Client-Principal": "your_base_64_encoded_token",
"X-Ms-Client-Principal-Id": "00000000-0000-0000-0000-000000000000",
"X-Ms-Client-Principal-Idp": "aad",
"X-Ms-Client-Principal-Name": "[email protected]",
"X-Ms-Token-Aad-Id-Token": "your_aad_id_token",
"X-Original-Url": "/chatgpt",
"X-Site-Deployment-Id": "your_app_service",
"X-Waws-Unencoded-Url": "/chatgpt",
}
Loading
Loading