Spaces:
Runtime error
Runtime error
import requests | |
import streamlit as st | |
from together import Together | |
# Initialize Together AI client | |
client = Together(api_key=st.secrets["TOGETHER_API_KEY"]) | |
def call_llama_for_response(clauses_data): | |
prompt = "As an AI assistant specializing in contract analysis, draft a professional and courteous response to a contract drafter based on the following clause analyses and decisions:\n\n" | |
for clause in clauses_data: | |
prompt += f"Clause: {clause['agent']}\n" | |
prompt += f"Analysis: {clause['analysis']}\n" | |
prompt += f"Recommendation: {clause['recommendation']}\n" | |
prompt += f"Decision: {clause['action']}\n" | |
if clause['action'] == 'Negotiate': | |
prompt += f"Negotiation points: {clause['negotiation_points']}\n" | |
prompt += "\n" | |
prompt += "Draft a response that addresses each clause, explaining our position on acceptance, rejection, or negotiation. The tone should be professional, courteous, and constructive." | |
response = client.chat.completions.create( | |
model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", | |
messages=[{"role": "user", "content": prompt}], | |
max_tokens=2048, | |
temperature=0.3, | |
top_p=0.8, | |
top_k=50, | |
repetition_penalty=1, | |
stop=["<|eot_id|>", "<|eom_id|>"], | |
stream=False | |
) | |
return response.choices[0].message.content | |
st.title("Contract Negotiation Assistant") | |
# Use session state to store the uploaded file and analysis results | |
if 'uploaded_file' not in st.session_state: | |
st.session_state.uploaded_file = None | |
if 'analysis_results' not in st.session_state: | |
st.session_state.analysis_results = None | |
# File uploader | |
uploaded_file = st.file_uploader("Upload Contract", type=["pdf", "docx"]) | |
# If a new file is uploaded, update the session state and clear previous results | |
if uploaded_file is not None and uploaded_file != st.session_state.uploaded_file: | |
st.session_state.uploaded_file = uploaded_file | |
st.session_state.analysis_results = None | |
# If we have an uploaded file, process it | |
if st.session_state.uploaded_file is not None: | |
# Only call the API if we don't have analysis results yet | |
if st.session_state.analysis_results is None: | |
files = {"file": st.session_state.uploaded_file} | |
response = requests.post("http://localhost:5002/upload", files=files) | |
if response.status_code == 200: | |
st.write("Contract uploaded successfully. Analyzing...") | |
st.session_state.analysis_results = response.json() | |
else: | |
st.error("Failed to analyze the contract. Please try again.") | |
# If we have analysis results, display them and allow user interaction | |
if st.session_state.analysis_results is not None: | |
data = st.session_state.analysis_results | |
segmented_contract = data.get("segmented_contract", {}) | |
crew_analysis = data.get("crew_analysis", {}) | |
# Extract the tasks_output from the nested structure | |
tasks_output = crew_analysis.get("final_recommendation", {}).get("tasks_output", []) | |
clauses_data = [] | |
for task in tasks_output: | |
agent = task.get("agent", "") | |
if task.get("pydantic"): | |
clause_analysis = task["pydantic"].get("analysis", "") | |
recommendation = task["pydantic"].get("recommendation", "") | |
st.subheader(f"Clause: {agent}") | |
st.write("Analysis:") | |
st.write(clause_analysis) | |
st.write("Recommendation:") | |
st.write(recommendation) | |
action = st.selectbox( | |
f"Action for {agent}", | |
["Accept", "Negotiate", "Reject"], | |
key=f"action_{agent}" | |
) | |
negotiation_points = "" | |
if action == "Negotiate": | |
negotiation_points = st.text_area("Enter your negotiation points:", key=f"negotiate_{agent}") | |
clauses_data.append({ | |
"agent": agent, | |
"analysis": clause_analysis, | |
"recommendation": recommendation, | |
"action": action, | |
"negotiation_points": negotiation_points | |
}) | |
st.markdown("---") # Add a separator between clauses | |
# Finalize Contract button | |
if st.button("Finalize Contract"): | |
with st.spinner("Generating response..."): | |
response_to_drafter = call_llama_for_response(clauses_data) | |
st.subheader("Response to Contract Drafter:") | |
st.text_area("", response_to_drafter, height=400) | |
st.success("Contract negotiation completed. Response generated for review.") | |
else: | |
st.write("Please upload a contract to begin the analysis.") |