urimai.agents

.. py:module:: urimai.agents

.. py:module:: urimai.agents.query_agent

Query generation agent using Pydantic AI.

.. py:class:: QueryGenerationAgent() :module: urimai.agents.query_agent

Bases: :py:class:object

Agent for generating SQL queries from natural language questions.

.. py:method:: QueryGenerationAgent.generate_query(question, schema_info, feedback=None) :module: urimai.agents.query_agent :async:

  Generate SQL query from natural language question.

  :type question: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param question: User's question in natural language
  :type schema_info: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\`\\ \\\[\:py\:class\:\`str\`\, \:py\:data\:\`\~typing.Any\`\]`
  :param schema_info: Formatted schema information from SchemaExtractor
  :type feedback: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\` \| \:py\:obj\:\`None\``
  :param feedback: Optional feedback from previous query attempt (for retry)

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.QueryPlan\` \| \:py\:class\:\`\~urimai.storage.models.ConversationalResponse\``
  :returns: QueryPlan with SQL query or ConversationalResponse if cannot generate query

.. py:module:: urimai.agents.analysis_agent

Result analysis agent using Pydantic AI.

.. py:class:: ResultAnalysisAgent() :module: urimai.agents.analysis_agent

Bases: :py:class:object

Agent for analyzing query results and determining if retry is needed.

.. py:method:: ResultAnalysisAgent.analyze_results(question, sql_query, execution_success, results=None, error=None, db_context=None) :module: urimai.agents.analysis_agent :async:

  Analyze query execution results.

  :type question: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param question: Original user question
  :type sql_query: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param sql_query: SQL query that was executed
  :type execution_success: :sphinx_autodoc_typehints_type:`\:py\:class\:\`bool\``
  :param execution_success: Whether query executed successfully
  :type results: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`dict\`\\ \\\[\:py\:class\:\`str\`\, \:py\:data\:\`\~typing.Any\`\]\] \| \:py\:obj\:\`None\``
  :param results: Query results (if successful)
  :type error: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\` \| \:py\:obj\:\`None\``
  :param error: Error message (if failed)
  :type db_context: :sphinx_autodoc_typehints_type:`\:py\:data\:\`\~typing.Any\``
  :param db_context: Database domain context for validation (optional)

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.SuccessAnswer\` \| \:py\:class\:\`\~urimai.storage.models.RetryWithFeedback\``
  :returns: SuccessAnswer if results are good, RetryWithFeedback if needs improvement

.. py:module:: urimai.agents.enrichment_agent

Schema enrichment agent using Pydantic AI.

.. py:class:: SchemaEnrichmentAgent() :module: urimai.agents.enrichment_agent

Bases: :py:class:object

Agent for enriching database schemas with AI-generated descriptions.

.. py:method:: SchemaEnrichmentAgent.enrich_schema(schema_data) :module: urimai.agents.enrichment_agent :async:

  Enrich a table schema with AI-generated descriptions.

  :type schema_data: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\`\\ \\\[\:py\:class\:\`str\`\, \:py\:data\:\`\~typing.Any\`\]`
  :param schema_data: Prepared schema data from SchemaExtractor.prepare_for_enrichment()

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.EnrichedSchema\``
  :returns: EnrichedSchema with table purpose, column descriptions, etc.

.. py:module:: urimai.agents.schema_context_agent

Schema Context Agent - Understands database domain and business context holistically.

.. py:class:: DatabaseContext(**data) :module: urimai.agents.schema_context_agent

Bases: :py:class:~pydantic.main.BaseModel

Holistic understanding of database domain and business context.

.. py:attribute:: DatabaseContext.domain :module: urimai.agents.schema_context_agent :type: str

.. py:attribute:: DatabaseContext.domain_confidence :module: urimai.agents.schema_context_agent :type: float

.. py:attribute:: DatabaseContext.purpose :module: urimai.agents.schema_context_agent :type: str

.. py:attribute:: DatabaseContext.key_entities :module: urimai.agents.schema_context_agent :type: list[str]

.. py:attribute:: DatabaseContext.relationships_summary :module: urimai.agents.schema_context_agent :type: str

.. py:attribute:: DatabaseContext.data_characteristics :module: urimai.agents.schema_context_agent :type: str

.. py:attribute:: DatabaseContext.business_priorities :module: urimai.agents.schema_context_agent :type: list[str]

.. py:attribute:: DatabaseContext.refined_relationships :module: urimai.agents.schema_context_agent :type: dict[str, list[str]]

.. py:attribute:: DatabaseContext.model_config :module: urimai.agents.schema_context_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: SchemaContextAgent() :module: urimai.agents.schema_context_agent

Bases: :py:class:object

Agent that understands database context holistically.

.. py:method:: SchemaContextAgent.analyze_database(schemas, enriched_metadata, sample_data) :module: urimai.agents.schema_context_agent :async:

  Analyze database holistically to understand domain and context.

  :type schemas: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\``
  :param schemas: List of SchemaInfo objects with table schemas
  :type enriched_metadata: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\``
  :param enriched_metadata: Dict of table_name -> enriched descriptions
  :type sample_data: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\``
  :param sample_data: Dict of table_name -> sample rows

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.schema\_context\_agent.DatabaseContext\``
  :returns: DatabaseContext with domain understanding

.. py:module:: urimai.agents.role_classification_agent

Role Classification Agent - Context-aware semantic role classifier.

.. py:class:: ColumnRole(**data) :module: urimai.agents.role_classification_agent

Bases: :py:class:~pydantic.main.BaseModel

Semantic role classification for a column.

.. py:attribute:: ColumnRole.column_name :module: urimai.agents.role_classification_agent :type: str

.. py:attribute:: ColumnRole.semantic_role :module: urimai.agents.role_classification_agent :type: str

.. py:attribute:: ColumnRole.confidence :module: urimai.agents.role_classification_agent :type: float

.. py:attribute:: ColumnRole.reasoning :module: urimai.agents.role_classification_agent :type: str

.. py:attribute:: ColumnRole.related_columns :module: urimai.agents.role_classification_agent :type: list[str]

.. py:attribute:: ColumnRole.model_config :module: urimai.agents.role_classification_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: TableRoles(**data) :module: urimai.agents.role_classification_agent

Bases: :py:class:~pydantic.main.BaseModel

Role classifications for all columns in a table.

.. py:attribute:: TableRoles.table_name :module: urimai.agents.role_classification_agent :type: str

.. py:attribute:: TableRoles.column_roles :module: urimai.agents.role_classification_agent :type: list[~urimai.agents.role_classification_agent.ColumnRole]

.. py:attribute:: TableRoles.model_config :module: urimai.agents.role_classification_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: RoleClassificationAgent() :module: urimai.agents.role_classification_agent

Bases: :py:class:object

Agent that classifies column roles using full database context.

.. py:method:: RoleClassificationAgent.classify_table(table_name, columns, db_context, table_purpose, sample_data, related_tables) :module: urimai.agents.role_classification_agent :async:

  Classify roles for all columns in a table.

  :type table_name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_name: Name of the table
  :type columns: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\``
  :param columns: List of ColumnProfile objects
  :type db_context: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.schema\_context\_agent.DatabaseContext\``
  :param db_context: Database context from SchemaContextAgent
  :type table_purpose: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_purpose: LLM-generated purpose of this table
  :type sample_data: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`dict\`\]`
  :param sample_data: Sample rows from this table
  :type related_tables: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\``
  :param related_tables: Dict of related table names and their schemas

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.role\_classification\_agent.TableRoles\``
  :returns: TableRoles with classifications for all columns

.. py:module:: urimai.agents.quality_generation_agent

Quality Check Generation Agent - Generates dynamic quality checks based on context.

.. py:class:: QualityCheck(**data) :module: urimai.agents.quality_generation_agent

Bases: :py:class:~pydantic.main.BaseModel

A dynamically generated quality check.

.. py:attribute:: QualityCheck.check_id :module: urimai.agents.quality_generation_agent :type: str

.. py:attribute:: QualityCheck.category :module: urimai.agents.quality_generation_agent :type: str

.. py:attribute:: QualityCheck.description :module: urimai.agents.quality_generation_agent :type: str

.. py:attribute:: QualityCheck.rationale :module: urimai.agents.quality_generation_agent :type: str

.. py:attribute:: QualityCheck.sql_query :module: urimai.agents.quality_generation_agent :type: str

.. py:attribute:: QualityCheck.severity :module: urimai.agents.quality_generation_agent :type: str

.. py:attribute:: QualityCheck.expected_pass_rate :module: urimai.agents.quality_generation_agent :type: float

.. py:attribute:: QualityCheck.model_config :module: urimai.agents.quality_generation_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: QualityCheckPlan(**data) :module: urimai.agents.quality_generation_agent

Bases: :py:class:~pydantic.main.BaseModel

Plan of quality checks for a table.

.. py:attribute:: QualityCheckPlan.table_name :module: urimai.agents.quality_generation_agent :type: str

.. py:attribute:: QualityCheckPlan.checks :module: urimai.agents.quality_generation_agent :type: list[~urimai.agents.quality_generation_agent.QualityCheck]

.. py:attribute:: QualityCheckPlan.focus_areas :module: urimai.agents.quality_generation_agent :type: list[str]

.. py:attribute:: QualityCheckPlan.reasoning :module: urimai.agents.quality_generation_agent :type: str

.. py:attribute:: QualityCheckPlan.model_config :module: urimai.agents.quality_generation_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: QualityGenerationAgent() :module: urimai.agents.quality_generation_agent

Bases: :py:class:object

Agent that generates context-aware quality checks.

.. py:method:: QualityGenerationAgent.generate_checks(table_name, db_context, table_purpose, table_roles, column_profiles, sample_data) :module: urimai.agents.quality_generation_agent :async:

  Generate quality checks for a table.

  :type table_name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_name: Name of the table
  :type db_context: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.schema\_context\_agent.DatabaseContext\``
  :param db_context: Database context
  :type table_purpose: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_purpose: Purpose of this specific table
  :type table_roles: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.role\_classification\_agent.TableRoles\``
  :param table_roles: Classified roles for columns
  :type column_profiles: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\``
  :param column_profiles: Statistical profiles
  :type sample_data: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`dict\`\]`
  :param sample_data: Sample rows

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.quality\_generation\_agent.QualityCheckPlan\``
  :returns: QualityCheckPlan with generated checks

.. py:module:: urimai.agents.quality_interpreter_agent

Quality Interpretation Agent - Interprets results in business context.

.. py:class:: Finding(**data) :module: urimai.agents.quality_interpreter_agent

Bases: :py:class:~pydantic.main.BaseModel

A quality finding with business context.

.. py:attribute:: Finding.issue :module: urimai.agents.quality_interpreter_agent :type: str

.. py:attribute:: Finding.business_impact :module: urimai.agents.quality_interpreter_agent :type: str

.. py:attribute:: Finding.affected_data :module: urimai.agents.quality_interpreter_agent :type: str

.. py:attribute:: Finding.priority :module: urimai.agents.quality_interpreter_agent :type: int

.. py:attribute:: Finding.is_expected :module: urimai.agents.quality_interpreter_agent :type: bool

.. py:attribute:: Finding.model_config :module: urimai.agents.quality_interpreter_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: Recommendation(**data) :module: urimai.agents.quality_interpreter_agent

Bases: :py:class:~pydantic.main.BaseModel

An actionable recommendation.

.. py:attribute:: Recommendation.action :module: urimai.agents.quality_interpreter_agent :type: str

.. py:attribute:: Recommendation.reason :module: urimai.agents.quality_interpreter_agent :type: str

.. py:attribute:: Recommendation.effort :module: urimai.agents.quality_interpreter_agent :type: str

.. py:attribute:: Recommendation.model_config :module: urimai.agents.quality_interpreter_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: QualityInterpretation(**data) :module: urimai.agents.quality_interpreter_agent

Bases: :py:class:~pydantic.main.BaseModel

Interpreted quality results with business context.

.. py:attribute:: QualityInterpretation.overall_summary :module: urimai.agents.quality_interpreter_agent :type: str

.. py:attribute:: QualityInterpretation.overall_score :module: urimai.agents.quality_interpreter_agent :type: float

.. py:attribute:: QualityInterpretation.critical_findings :module: urimai.agents.quality_interpreter_agent :type: list[~urimai.agents.quality_interpreter_agent.Finding]

.. py:attribute:: QualityInterpretation.warnings :module: urimai.agents.quality_interpreter_agent :type: list[~urimai.agents.quality_interpreter_agent.Finding]

.. py:attribute:: QualityInterpretation.acceptable_issues :module: urimai.agents.quality_interpreter_agent :type: list[~urimai.agents.quality_interpreter_agent.Finding]

.. py:attribute:: QualityInterpretation.recommendations :module: urimai.agents.quality_interpreter_agent :type: list[~urimai.agents.quality_interpreter_agent.Recommendation]

.. py:attribute:: QualityInterpretation.context_notes :module: urimai.agents.quality_interpreter_agent :type: str

.. py:attribute:: QualityInterpretation.model_config :module: urimai.agents.quality_interpreter_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: QualityInterpreterAgent() :module: urimai.agents.quality_interpreter_agent

Bases: :py:class:object

Agent that interprets quality check results in business terms.

.. py:method:: QualityInterpreterAgent.interpret_results(table_name, db_context, checks, results, failure_examples) :module: urimai.agents.quality_interpreter_agent :async:

  Interpret quality check results.

  :type table_name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_name: Name of the table
  :type db_context: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.schema\_context\_agent.DatabaseContext\``
  :param db_context: Database context
  :type checks: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`\~urimai.agents.quality\_generation\_agent.QualityCheck\`\]`
  :param checks: List of checks that were run
  :type results: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`dict\`\]`
  :param results: List of {check_id, violations_count, passed} dicts
  :type failure_examples: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\``
  :param failure_examples: Dict of check_id -> sample failing rows

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.quality\_interpreter\_agent.QualityInterpretation\``
  :returns: QualityInterpretation with business-aware analysis

.. py:module:: urimai.agents.schema_inference_agent

Schema Inference Agent - Intelligently infers SQLite schema from CSV sample data.

.. py:class:: ColumnSchema(**data) :module: urimai.agents.schema_inference_agent

Bases: :py:class:~pydantic.main.BaseModel

Inferred schema for a single column.

.. py:attribute:: ColumnSchema.column_name :module: urimai.agents.schema_inference_agent :type: str

.. py:attribute:: ColumnSchema.sqlite_type :module: urimai.agents.schema_inference_agent :type: str

.. py:attribute:: ColumnSchema.reasoning :module: urimai.agents.schema_inference_agent :type: str

.. py:attribute:: ColumnSchema.should_be_nullable :module: urimai.agents.schema_inference_agent :type: bool

.. py:attribute:: ColumnSchema.detected_pattern :module: urimai.agents.schema_inference_agent :type: str

.. py:attribute:: ColumnSchema.model_config :module: urimai.agents.schema_inference_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: InferredSchema(**data) :module: urimai.agents.schema_inference_agent

Bases: :py:class:~pydantic.main.BaseModel

Complete inferred schema for CSV table.

.. py:attribute:: InferredSchema.columns :module: urimai.agents.schema_inference_agent :type: ~typing.List[~urimai.agents.schema_inference_agent.ColumnSchema]

.. py:attribute:: InferredSchema.suggested_table_name :module: urimai.agents.schema_inference_agent :type: str

.. py:attribute:: InferredSchema.confidence :module: urimai.agents.schema_inference_agent :type: str

.. py:attribute:: InferredSchema.model_config :module: urimai.agents.schema_inference_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: SchemaInferenceAgent() :module: urimai.agents.schema_inference_agent

Bases: :py:class:object

Agent that infers optimal SQLite schema from CSV sample data.

.. py:method:: SchemaInferenceAgent.infer_schema(column_samples, column_profiles, filename=’data’) :module: urimai.agents.schema_inference_agent :async:

  Infer schema from sample column data with statistical profiling.

  :type column_samples: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~typing.Dict\`\\ \\\[\:py\:class\:\`str\`\, \:py\:class\:\`\~typing.List\`\\ \\\[\:py\:data\:\`\~typing.Any\`\]\]`
  :param column_samples: Dictionary mapping column names to list of sample values
  :type column_profiles: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~typing.Dict\`\\ \\\[\:py\:class\:\`str\`\, \:py\:class\:\`\~typing.Dict\`\\ \\\[\:py\:class\:\`str\`\, \:py\:data\:\`\~typing.Any\`\]\]`
  :param column_profiles: Dictionary mapping column names to profiling statistics
  :type filename: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param filename: Original CSV filename (used for table name suggestion)

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.schema\_inference\_agent.InferredSchema\``
  :returns: InferredSchema with type recommendations for each column

.. py:module:: urimai.agents.schema_selection_agent

Schema selection agent for intelligent table filtering.

When a database has many tables, this agent identifies which tables are relevant to a user’s question, reducing noise for the query agent.

.. py:class:: TableSelection(**data) :module: urimai.agents.schema_selection_agent

Bases: :py:class:~pydantic.main.BaseModel

Result of table selection for a user query.

.. py:attribute:: TableSelection.tables :module: urimai.agents.schema_selection_agent :type: list[str]

.. py:attribute:: TableSelection.reasoning :module: urimai.agents.schema_selection_agent :type: str

.. py:attribute:: TableSelection.model_config :module: urimai.agents.schema_selection_agent :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

  Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict].

.. py:class:: SchemaSelectionAgent() :module: urimai.agents.schema_selection_agent

Bases: :py:class:object

Agent that selects relevant tables for a user query.

.. py:method:: SchemaSelectionAgent.select_tables(query, schema_summary) :module: urimai.agents.schema_selection_agent :async:

  Select relevant tables for a user query.

  :type query: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param query: User's natural language question
  :type schema_summary: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param schema_summary: Condensed schema summary with table names, purposes, and columns

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.agents.schema\_selection\_agent.TableSelection\``
  :returns: TableSelection with selected tables and reasoning

.. py:module:: urimai.agents.query_planner_agent

Query planning agent for complex multi-step questions.

.. py:class:: QueryPlannerAgent() :module: urimai.agents.query_planner_agent

Bases: :py:class:object

Agent for classifying complexity and creating execution plans.

.. py:method:: QueryPlannerAgent.classify_complexity(question, schema_info) :module: urimai.agents.query_planner_agent :async:

  Classify whether question needs multi-step planning.


  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.QueryComplexity\``

.. py:method:: QueryPlannerAgent.create_plan(question, schema_info) :module: urimai.agents.query_planner_agent :async:

  Create a multi-step execution plan for a complex question.


  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.ExecutionPlan\``

.. py:method:: QueryPlannerAgent.revise_plan(plan, failed_step, error, completed_results, schema_info=None) :module: urimai.agents.query_planner_agent :async:

  Revise the plan after a sub-problem failure.


  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.PlanRevision\``