"""One bounded corrective request based solely on retrieval evidence.""" import json from .answer_format import parse_answer, Answer from .context_policy import answer_context_issues from .render_answer import render_graph_answer def generate_checked_answer(question: str, context: dict, prompt: str, complete) -> dict: messages=[{'role':'system','content':prompt},{'role':'user','content':json.dumps( {'question':question,'graph_context':context},ensure_ascii=False)}] result={'attempts':[],'accepted_for_delivery':False} for number in range(2): record={};text='' try: response=complete(messages) result['response']=response;record['response']=response text=response['choices'][0]['message']['content'].strip() except Exception as error: result['error']=f'{type(error).__name__}: {str(error)[:500]}' result['attempts'].append(record) return result result['attempts'].append(record) try: answer,normalized=parse_answer(text) record['answer']=answer;record['format_normalized']=normalized except (ValueError,TypeError) as error: record['format_error']=type(error).__name__ if number==1: result['error']='InvalidAnswerFormat: two invalid JSON/schema responses' return result feedback='Vráť jediný platný JSON objekt podľa schémy, bez zmeny faktov z pôvodného kontextu. Schéma: '+json.dumps(Answer.model_json_schema(),ensure_ascii=False) else: issues=answer_context_issues(answer,context,check_text=False) record['context_issues']=issues result['answer']=answer if not issues: rendered = render_graph_answer(answer, context) delivery_issues = answer_context_issues(rendered, context) if delivery_issues: issues = delivery_issues record['context_issues'] = issues else: record['rendered_answer'] = rendered result['model_answer'] = answer result['answer'] = rendered result['accepted_for_delivery']=True return result if number==1: result['context_rejected']=True return result feedback=('Odpoveď porušila pravidlá dodaného kontextu: '+', '.join(issues)+'. ' 'Oprav jediný JSON objekt výhradne z pôvodných podkladov. Použi iba source_urls zo sources. ' 'Typ práce nie je keyword. answer_candidates dokladajú spojenie požadovaného názvu alebo roku a tagu cez tú istú osobu. ' 'Answer ponechaj prázdny; text aj upozornenie zostaví aplikácia.') messages += [{'role':'assistant','content':text},{'role':'user','content':feedback}] return result