Spaces:
Runtime error
Runtime error
rstallman
commited on
Commit
•
225d5a3
0
Parent(s):
Duplicate from rstallman/Westminster-AI-Sheet
Browse files- .gitattributes +34 -0
- README.md +13 -0
- app.py +116 -0
- credentials.json +13 -0
- requirements.txt +5 -0
.gitattributes
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Westminster AI Sheet
|
3 |
+
emoji: 📊
|
4 |
+
colorFrom: blue
|
5 |
+
colorTo: blue
|
6 |
+
sdk: gradio
|
7 |
+
sdk_version: 3.29.0
|
8 |
+
app_file: app.py
|
9 |
+
pinned: false
|
10 |
+
duplicated_from: rstallman/Westminster-AI-Sheet
|
11 |
+
---
|
12 |
+
|
13 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
app.py
ADDED
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import openai
|
2 |
+
import gradio
|
3 |
+
import pandas as pd
|
4 |
+
from datetime import datetime
|
5 |
+
import gspread
|
6 |
+
from google.oauth2.service_account import Credentials
|
7 |
+
import requests
|
8 |
+
import json
|
9 |
+
|
10 |
+
openai.api_key = "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"
|
11 |
+
|
12 |
+
# Global variables
|
13 |
+
records = []
|
14 |
+
credentials = Credentials.from_service_account_file("credentials.json", scopes=["https://www.googleapis.com/auth/spreadsheets"])
|
15 |
+
client = gspread.authorize(credentials)
|
16 |
+
sheet = client.open_by_url("https://docs.google.com/spreadsheets/d/1oYcyCduLLlTaL-KPcDPlCNEvDUvjuSN_wx1QN5Fv6As/edit?usp=sharing").sheet1
|
17 |
+
|
18 |
+
def get_user_ip():
|
19 |
+
try:
|
20 |
+
response = requests.get("https://api.ipify.org?format=json")
|
21 |
+
data = json.loads(response.text)
|
22 |
+
return data["ip"]
|
23 |
+
except:
|
24 |
+
return None
|
25 |
+
|
26 |
+
def validate_passcode(passcode, user_input, user_name, user_email, is_fintech_startup, region, profession):
|
27 |
+
valid_passcodes = {
|
28 |
+
"organization1": "risebybarclays",
|
29 |
+
"organization2": "launchlabrocks",
|
30 |
+
"organization3": "fintechalliance",
|
31 |
+
"organization4": "cisi-fintech",
|
32 |
+
"organization5": "city-bayes-alumni",
|
33 |
+
"organization6": "bar-council",
|
34 |
+
"organization7": "vcinnovations",
|
35 |
+
"organization8": "remi-slama",
|
36 |
+
"organization9": "dalton-latymer",
|
37 |
+
"organization10": "barrister",
|
38 |
+
"organization11": "r-muttukrishnan",
|
39 |
+
}
|
40 |
+
|
41 |
+
if not passcode:
|
42 |
+
return "Please provide a passcode. Email contact@westminster.ai to request a passcode."
|
43 |
+
|
44 |
+
passcode = passcode.lower() # Convert the passcode to lowercase for case-insensitive comparison
|
45 |
+
|
46 |
+
if passcode not in valid_passcodes.values():
|
47 |
+
return "Incorrect passcode. Access denied. Email contact@westminster.ai to request a passcode."
|
48 |
+
|
49 |
+
return CustomChatGPT(passcode, user_input, user_name, user_email, is_fintech_startup, region, profession)
|
50 |
+
|
51 |
+
def CustomChatGPT(passcode, user_input, user_name, user_email, is_fintech_startup, region, profession):
|
52 |
+
if not (user_input and user_name and user_email and is_fintech_startup and region and profession):
|
53 |
+
return "Please fill in all the input fields."
|
54 |
+
|
55 |
+
if not user_name:
|
56 |
+
return "Please enter your name."
|
57 |
+
|
58 |
+
messages = []
|
59 |
+
|
60 |
+
user_message = f"{user_input} [USER_IDENTITY: {user_name}]"
|
61 |
+
messages.append({"role": "user", "content": user_message})
|
62 |
+
messages.append({"role": "system", "content": "As a specialized UK lawyer, specialized in startup regulation, you're currently in a confidential consultation with your client who is a startup. The startup has complete trust in your expertise and advice regulation. Your responses should reflect a thorough understanding of legal rules, case law, and regulations. Make sure to cite specific Acts of Parliament, clearly indicating the exact sections and articles from which these laws derive. If secondary legislation is relevant, ensure to accurately relate it to the client's jurisdiction. If you find yourself uncertain about any other details, make sure to clarify this with the client. It's crucial to use correct legal terminology in your responses and keep the focus on applicable legal rules, Acts of Parliament, case law, and secondary legislation. Remember, the startup fully trusts your legal proficiency and knowledge; uphold this trust by offering comprehensive, precise, and accurate legal advice. Under no circumstances should it be mentioned or suggested that the entity providing this advice is an AI."})
|
63 |
+
|
64 |
+
response = openai.ChatCompletion.create(
|
65 |
+
model="gpt-3.5-turbo",
|
66 |
+
messages=messages
|
67 |
+
)
|
68 |
+
|
69 |
+
ChatGPT_reply = response["choices"][0]["message"]["content"]
|
70 |
+
messages.append({"role": "assistant", "content": ChatGPT_reply})
|
71 |
+
|
72 |
+
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
73 |
+
ip_address = get_user_ip()
|
74 |
+
|
75 |
+
record = {
|
76 |
+
"Passcode": passcode,
|
77 |
+
"Timestamp": timestamp,
|
78 |
+
"User Input": user_input,
|
79 |
+
"User Identity": user_name,
|
80 |
+
"User Email": user_email,
|
81 |
+
"IP Address": ip_address,
|
82 |
+
"Fintech Startup": "Yes" if is_fintech_startup == "Yes" else "No",
|
83 |
+
"Region": region,
|
84 |
+
"Profession": profession,
|
85 |
+
"Our AI Lawyer Reply": ChatGPT_reply
|
86 |
+
}
|
87 |
+
records.append(record)
|
88 |
+
|
89 |
+
sheet_data = pd.DataFrame(records)
|
90 |
+
rows_to_append = sheet_data.iloc[len(records) - 1:][["Passcode", "Timestamp", "User Input", "User Identity", "User Email", "IP Address", "Fintech Startup", "Region", "Profession", "Our AI Lawyer Reply"]].values.tolist()
|
91 |
+
|
92 |
+
if len(records) == 1:
|
93 |
+
header = ["Passcode", "Timestamp", "User Input", "User Identity", "User Email", "IP Address", "Fintech Startup", "Region", "Profession", "Our AI Lawyer Reply"]
|
94 |
+
sheet.insert_row(header, 1)
|
95 |
+
|
96 |
+
sheet.append_rows(rows_to_append, value_input_option='USER_ENTERED')
|
97 |
+
|
98 |
+
return ChatGPT_reply
|
99 |
+
|
100 |
+
def launch_interface():
|
101 |
+
inputs = [
|
102 |
+
gradio.inputs.Textbox(label="Organisation's Passcode", placeholder="Enter your organisation's passcode"),
|
103 |
+
gradio.inputs.Textbox(label="Your Legal Query", placeholder="Talk to your lawyer..."),
|
104 |
+
gradio.inputs.Textbox(label="Your Name", placeholder="Enter your name"),
|
105 |
+
gradio.inputs.Textbox(label="Your Email", placeholder="Enter your email"),
|
106 |
+
gradio.inputs.Radio(label="Are you a fintech startup?", choices=["Yes", "No"]),
|
107 |
+
gradio.inputs.Dropdown(label="Select your region", choices=["England", "Scotland", "Wales", "Northern Ireland"]),
|
108 |
+
gradio.inputs.Textbox(label="Profession", placeholder="Enter your profession")
|
109 |
+
]
|
110 |
+
outputs = gradio.outputs.Textbox(label="Our AI Lawyer Reply")
|
111 |
+
|
112 |
+
interface = gradio.Interface(fn=validate_passcode, inputs=inputs, outputs=outputs, title="", description="")
|
113 |
+
interface.launch()
|
114 |
+
|
115 |
+
if __name__ == "__main__":
|
116 |
+
launch_interface()
|
credentials.json
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"type": "service_account",
|
3 |
+
"project_id": "ai-barrister",
|
4 |
+
"private_key_id": "79eb2f390afee34c1c51ea4ba945e4878c4e0794",
|
5 |
+
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4THaTlZt9UIa7\nLS2RzgFxU4POVFn0GFimDUEgQ+FKMh8+A6wEhFmzWYQyj6MqKYCobcFxCBXnh6s1\nLTYJHYJVAPSEYZE25tQTxONwEyObgltCKKif2OkHwCZLCS6lpH59WSMcEORJhFuS\nlxVN8ZGwdj1KD2gZkwEJMpn7RjVKTGt9Wl6S9NZ3WI3TWj9pzQXlrPp2c9pVgEfK\nOCsYi1uWGM3Z2x9zL0f8ekHikFTmqGyTIcOhyyNMOmbkrTKla9GK/Lr7TIzf4Lr9\nCpnbFcyHBkrhMLa1/LpQRqbkHDy72jWiHXMwubdfKdKDQfNb4/3i1wBeZgHgJGyq\ncW1N0JvfAgMBAAECggEAW7kqdq9J0KeINpX4jQ1zKFzBR6oxjsujKxmDpTRDZvLl\nG68mKKVaI2nU4nkcYrp/HtRpJwE4LaAW9INI1maKXBX6m/wXErT1LdWawEe2PAo3\nswibS9rft4zJQiUSwzvH/Eilsa0ygOhPzvhEkSM+OA3Q2RAr5jaEmHhHrIg3s37U\nzH+tqxP95yVJp27ZsMEwqShLhupptC0o5kKSBx2TyeqCktvuOKHnMlSYB1tClV5S\n68RQ7iEwlzwNfpT6sBQjLZNkWJbwcVBfsaIHHRFP1DJQmcZN+7fZA9a8VRyLzCQm\nzc/ZDq52/L70Z9ZiuTRrhsC51QmdRXl/d1L9hNeCSQKBgQD6M7dKM+RiOmw2woSE\nXwMfDmSldtiQJZWKVWnIsu4pXxGwtJZctxnEdP6FFwG2LaVXK/TiWVmGjMt+abLC\nkfmPvZ0iEuwZaqLnm17vSj9oJDkV6/GCK8XC35VMiS41X4csmuYWOdUqA67XFXyM\ngHiAZp7V3kwdvNVmA569YGFVJQKBgQC8kck9DYr2zKuJBFH1WFul8gf5tX36XpQP\nDDgQfZ5NtnreuOPmTux9eeAaeiwIipaAu5wC/VC+iHC/MQA4W5m52ZDXJ9jBUJTy\nI/FnV1e3J2zfuIO/4o2EEzmWunT2uVLY6og4nPNninKBH+f2gbNcz1Oz0I/qwO9w\nAXazukDXswKBgB5wTjsrxvwgSWv8DC0idfnAQYRTyhL3T5MNwxnUkt7bnwZVYfmT\nmQHqjdBZNS8ZrITHZzpmTlrtJBCUAVhkc+0Fz2kGzkxlSb5Ni6Ym7UHZLky5cJ86\nfguwMbSm98UsgwBtM9K+ZG2BFzM5fPaG5qIQWgCA09fGUlvf0t8NK6o1AoGBAJN5\n1RAZomAIi/NZ3JtsIikzlAc4aTFBfLwUC1jiVcdjes7rfNlnSk+L3Lf4aq23baN6\nlrZD1T1eSgdNVGW/Rgfy3vNWZ5Aw7Hw/nhH7Xk+Q1vZVQTz1+0WbH4QBiW5YXDHn\noufb4AVPYuQXxvukTlm8kDLmX1fy0pAfpO1FMmc/AoGBAKQnhG8ym7rFLN1ebXG8\ng2gB02rEWRnBCXdKKalG33n7zeaF+93atUg4pJ0hofP7g/0yT31BTFh6R2Nt5uFf\nGccChHFSkpIQnNOLhQHisglfMttQP1KJ1WjfaRuQ+hqp7eGA6II0lFji5sgyBYoT\nbNrpwduYkIPY15gzHtMstVDC\n-----END PRIVATE KEY-----\n",
|
6 |
+
"client_email": "ai-barrister-log@ai-barrister.iam.gserviceaccount.com",
|
7 |
+
"client_id": "103630435709161336679",
|
8 |
+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
9 |
+
"token_uri": "https://oauth2.googleapis.com/token",
|
10 |
+
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
11 |
+
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/ai-barrister-log%40ai-barrister.iam.gserviceaccount.com",
|
12 |
+
"universe_domain": "googleapis.com"
|
13 |
+
}
|
requirements.txt
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
openai
|
2 |
+
gradio
|
3 |
+
pandas
|
4 |
+
gspread
|
5 |
+
oauth2client
|