脕lvaro Valenzuela Valdes commited on
Commit 路
aeaf3e7
1
Parent(s): f962a3a
feat: Integrated DeepSeek-V3 for professional proposal drafting and technical analysis
Browse files- backend/app/services/llm.py +26 -0
backend/app/services/llm.py
CHANGED
|
@@ -177,6 +177,9 @@ def generate_analysis(tender: Tender, company: CompanyProfile, document_text: st
|
|
| 177 |
|
| 178 |
if parse_result:
|
| 179 |
try:
|
|
|
|
|
|
|
|
|
|
| 180 |
if not parse_result.get("report_markdown"):
|
| 181 |
parse_result["report_markdown"] = generate_markdown_report(parse_result)
|
| 182 |
|
|
@@ -193,3 +196,26 @@ def generate_analysis(tender: Tender, company: CompanyProfile, document_text: st
|
|
| 193 |
analysis = generate_mock_analysis(tender, company)
|
| 194 |
analysis.audit_log = audit_messages + [error_msg, "Fallback: Reverting to system default."]
|
| 195 |
return analysis
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 177 |
|
| 178 |
if parse_result:
|
| 179 |
try:
|
| 180 |
+
if not parse_result.get("proposal_draft") or len(parse_result["proposal_draft"]) < 50:
|
| 181 |
+
parse_result["proposal_draft"] = generate_proposal_draft(parse_result, company)
|
| 182 |
+
|
| 183 |
if not parse_result.get("report_markdown"):
|
| 184 |
parse_result["report_markdown"] = generate_markdown_report(parse_result)
|
| 185 |
|
|
|
|
| 196 |
analysis = generate_mock_analysis(tender, company)
|
| 197 |
analysis.audit_log = audit_messages + [error_msg, "Fallback: Reverting to system default."]
|
| 198 |
return analysis
|
| 199 |
+
|
| 200 |
+
def generate_proposal_draft(analysis: dict, company: CompanyProfile) -> str:
|
| 201 |
+
prompt = f"""
|
| 202 |
+
Como experto redactor de propuestas de licitaci贸n, genera un borrador profesional (en Markdown) basado en este an谩lisis t茅cnico:
|
| 203 |
+
{analysis.get('executive_summary', 'Analizar bases adjuntas.')}
|
| 204 |
+
|
| 205 |
+
Perfil de la Empresa: {company.name} - {company.experience}
|
| 206 |
+
Requisitos Cr铆ticos a Abordar: {', '.join(analysis.get('key_requirements', []))}
|
| 207 |
+
|
| 208 |
+
Estructura la propuesta en ESPA脩OL con:
|
| 209 |
+
1. Introducci贸n Ejecutiva
|
| 210 |
+
2. Resumen de la Soluci贸n T茅cnica
|
| 211 |
+
3. Aseguramiento de Cumplimiento (Compliance)
|
| 212 |
+
4. Propuesta de Valor Estrat茅gica
|
| 213 |
+
"""
|
| 214 |
+
|
| 215 |
+
# Use DeepSeek for high-quality drafting if available
|
| 216 |
+
if settings.featherless_api_key:
|
| 217 |
+
draft = call_featherless(prompt, model="deepseek-ai/DeepSeek-V3.2")
|
| 218 |
+
if draft: return draft
|
| 219 |
+
|
| 220 |
+
# Fallback to Gemini
|
| 221 |
+
return call_gemini(prompt) or "Error al generar el borrador de la propuesta."
|