urimai.storage

.. py:module:: urimai.storage

.. py:module:: urimai.storage.metadata_store

Metadata storage using SQLite.

.. py:class:: MetadataStore(db_path=None) :module: urimai.storage.metadata_store

Bases: :py:class:object

Manages metadata storage in SQLite database.

.. py:method:: MetadataStore.initialize() :module: urimai.storage.metadata_store :async:

  Create database tables if they don't exist.


  :rtype: :sphinx_autodoc_typehints_type:`\:py\:obj\:\`None\``

.. py:method:: MetadataStore.add_database(db_info) :module: urimai.storage.metadata_store :async:

  Add a new database to the store.

  :type db_info: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.DatabaseInfo\``
  :param db_info: Database information

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :returns: ID of the inserted database

  :raises sqlite3.IntegrityError: If database name already exists

.. py:method:: MetadataStore.get_database(name) :module: urimai.storage.metadata_store :async:

  Get database by name.

  :type name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param name: Database name

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.DatabaseInfo\` \| \:py\:obj\:\`None\``
  :returns: DatabaseInfo if found, None otherwise

.. py:method:: MetadataStore.list_databases() :module: urimai.storage.metadata_store :async:

  List all registered databases.

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`\~urimai.storage.models.DatabaseInfo\`\]`
  :returns: List of DatabaseInfo objects

.. py:method:: MetadataStore.update_last_synced(database_id) :module: urimai.storage.metadata_store :async:

  Update last_synced_at timestamp for a database.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:obj\:\`None\``

.. py:method:: MetadataStore.update_database_context(database_id, context) :module: urimai.storage.metadata_store :async:

  Update the persisted database context.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID
  :type context: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\`\\ \\\[\:py\:class\:\`str\`\, \:py\:data\:\`\~typing.Any\`\]`
  :param context: DatabaseContext dict to persist

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:obj\:\`None\``

.. py:method:: MetadataStore.delete_database(name) :module: urimai.storage.metadata_store :async:

  Delete a database and all its schemas.

  :type name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param name: Database name

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`bool\``
  :returns: True if deleted, False if not found

.. py:method:: MetadataStore.add_schema(schema_info) :module: urimai.storage.metadata_store :async:

  Add schema metadata for a table.

  :type schema_info: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.SchemaInfo\``
  :param schema_info: Schema information

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :returns: ID of the inserted schema

.. py:method:: MetadataStore.get_schemas(database_id) :module: urimai.storage.metadata_store :async:

  Get all schemas for a database.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`\~urimai.storage.models.SchemaInfo\`\]`
  :returns: List of SchemaInfo objects

.. py:method:: MetadataStore.update_enriched_metadata(database_id, table_name, enriched_metadata) :module: urimai.storage.metadata_store :async:

  Update enriched metadata for a table.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID
  :type table_name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_name: Table name
  :type enriched_metadata: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\`\\ \\\[\:py\:class\:\`str\`\, \:py\:data\:\`\~typing.Any\`\]`
  :param enriched_metadata: Enriched metadata dictionary

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:obj\:\`None\``

.. py:method:: MetadataStore.delete_schemas(database_id) :module: urimai.storage.metadata_store :async:

  Delete all schemas for a database.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:obj\:\`None\``

.. py:method:: MetadataStore.get_setting(key, default=None) :module: urimai.storage.metadata_store :async:

  Get a setting value.

  :type key: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param key: Setting key
  :type default: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\` \| \:py\:obj\:\`None\``
  :param default: Default value if not found

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\` \| \:py\:obj\:\`None\``
  :returns: Setting value or default

.. py:method:: MetadataStore.set_setting(key, value) :module: urimai.storage.metadata_store :async:

  Set a setting value.

  :type key: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param key: Setting key
  :type value: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param value: Setting value

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:obj\:\`None\``

.. py:method:: MetadataStore.list_settings() :module: urimai.storage.metadata_store :async:

  List all settings.

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`\~urimai.storage.models.SettingInfo\`\]`
  :returns: List of SettingInfo objects

.. py:method:: MetadataStore.save_table_profile(profile) :module: urimai.storage.metadata_store :async:

  Save or update a table profile.

  :type profile: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.TableProfile\``
  :param profile: TableProfile object

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :returns: ID of the inserted/updated profile

.. py:method:: MetadataStore.get_table_profile(database_id, table_name) :module: urimai.storage.metadata_store :async:

  Get table profile by database ID and table name.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID
  :type table_name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_name: Table name

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.TableProfile\` \| \:py\:obj\:\`None\``
  :returns: TableProfile if found, None otherwise

.. py:method:: MetadataStore.list_table_profiles(database_id) :module: urimai.storage.metadata_store :async:

  List all table profiles for a database.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`list\`\\ \\\[\:py\:class\:\`\~urimai.storage.models.TableProfile\`\]`
  :returns: List of TableProfile objects

.. py:method:: MetadataStore.save_quality_report(report) :module: urimai.storage.metadata_store :async:

  Save or update a quality report.

  :type report: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.QualityReport\``
  :param report: QualityReport object

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :returns: ID of the inserted/updated report

.. py:method:: MetadataStore.get_quality_report(database_id, table_name) :module: urimai.storage.metadata_store :async:

  Get quality report by database ID and table name.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID
  :type table_name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_name: Table name

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.QualityReport\` \| \:py\:obj\:\`None\``
  :returns: QualityReport if found, None otherwise

.. py:method:: MetadataStore.save_insights_report(report) :module: urimai.storage.metadata_store :async:

  Save or update an insights report.

  :type report: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.InsightsReport\``
  :param report: InsightsReport object

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :returns: ID of the inserted/updated report

.. py:method:: MetadataStore.get_insights_report(database_id, table_name) :module: urimai.storage.metadata_store :async:

  Get insights report by database ID and table name.

  :type database_id: :sphinx_autodoc_typehints_type:`\:py\:class\:\`int\``
  :param database_id: Database ID
  :type table_name: :sphinx_autodoc_typehints_type:`\:py\:class\:\`str\``
  :param table_name: Table name

  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`\~urimai.storage.models.InsightsReport\` \| \:py\:obj\:\`None\``
  :returns: InsightsReport if found, None otherwise

.. py:module:: urimai.storage.models

Pydantic models for storage and agent responses.

.. py:class:: DatabaseInfo(**data) :module: urimai.storage.models

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

Information about a registered database.

.. py:attribute:: DatabaseInfo.id :module: urimai.storage.models :type: int | None

.. py:attribute:: DatabaseInfo.name :module: urimai.storage.models :type: str

.. py:attribute:: DatabaseInfo.path :module: urimai.storage.models :type: str

.. py:attribute:: DatabaseInfo.database_context :module: urimai.storage.models :type: dict[str, ~typing.Any] | None

.. py:attribute:: DatabaseInfo.created_at :module: urimai.storage.models :type: str

.. py:attribute:: DatabaseInfo.last_synced_at :module: urimai.storage.models :type: str

.. py:attribute:: DatabaseInfo.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: SchemaInfo(**data) :module: urimai.storage.models

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

Schema metadata for a table.

.. py:attribute:: SchemaInfo.id :module: urimai.storage.models :type: int | None

.. py:attribute:: SchemaInfo.database_id :module: urimai.storage.models :type: int

.. py:attribute:: SchemaInfo.table_name :module: urimai.storage.models :type: str

.. py:attribute:: SchemaInfo.original_metadata :module: urimai.storage.models :type: dict[str, ~typing.Any]

.. py:attribute:: SchemaInfo.enriched_metadata :module: urimai.storage.models :type: dict[str, ~typing.Any] | None

.. py:attribute:: SchemaInfo.sample_data :module: urimai.storage.models :type: list[dict[str, ~typing.Any]]

.. py:attribute:: SchemaInfo.created_at :module: urimai.storage.models :type: str

.. py:attribute:: SchemaInfo.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: SettingInfo(**data) :module: urimai.storage.models

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

Application setting.

.. py:attribute:: SettingInfo.key :module: urimai.storage.models :type: str

.. py:attribute:: SettingInfo.value :module: urimai.storage.models :type: str

.. py:attribute:: SettingInfo.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: ColumnDescription(**data) :module: urimai.storage.models

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

Description of a single column.

.. py:attribute:: ColumnDescription.column_name :module: urimai.storage.models :type: str

.. py:attribute:: ColumnDescription.description :module: urimai.storage.models :type: str

.. py:attribute:: ColumnDescription.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: EnrichedSchema(**data) :module: urimai.storage.models

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

Enriched schema description generated by LLM.

.. py:attribute:: EnrichedSchema.table_name :module: urimai.storage.models :type: str

.. py:attribute:: EnrichedSchema.table_purpose :module: urimai.storage.models :type: str

.. py:attribute:: EnrichedSchema.column_descriptions :module: urimai.storage.models :type: list[~urimai.storage.models.ColumnDescription]

.. py:attribute:: EnrichedSchema.relationships :module: urimai.storage.models :type: list[str]

.. py:attribute:: EnrichedSchema.business_context :module: urimai.storage.models :type: str | None

.. py:method:: EnrichedSchema.to_storage_dict() :module: urimai.storage.models

  Convert to storage format (column_descriptions as dict).


  :rtype: :sphinx_autodoc_typehints_type:`\:py\:class\:\`dict\``

.. py:attribute:: EnrichedSchema.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: ConversationalResponse(**data) :module: urimai.storage.models

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

Simple conversational message response.

.. py:attribute:: ConversationalResponse.message :module: urimai.storage.models :type: str

.. py:attribute:: ConversationalResponse.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: QuestionAnalysis(**data) :module: urimai.storage.models

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

Analysis of user’s question.

.. py:attribute:: QuestionAnalysis.intent :module: urimai.storage.models :type: str

.. py:attribute:: QuestionAnalysis.relevant_tables :module: urimai.storage.models :type: list[str]

.. py:attribute:: QuestionAnalysis.requires_join :module: urimai.storage.models :type: bool

.. py:attribute:: QuestionAnalysis.complexity :module: urimai.storage.models :type: str

.. py:attribute:: QuestionAnalysis.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: QueryPlan(**data) :module: urimai.storage.models

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

Generated SQL query plan.

.. py:attribute:: QueryPlan.sql_query :module: urimai.storage.models :type: str

.. py:attribute:: QueryPlan.explanation :module: urimai.storage.models :type: str

.. py:attribute:: QueryPlan.tables_used :module: urimai.storage.models :type: list[str]

.. py:attribute:: QueryPlan.estimated_rows :module: urimai.storage.models :type: int | None

.. py:attribute:: QueryPlan.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: SuccessAnswer(**data) :module: urimai.storage.models

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

Successful query result with answer.

.. py:attribute:: SuccessAnswer.success :module: urimai.storage.models :type: bool

.. py:attribute:: SuccessAnswer.answer :module: urimai.storage.models :type: str

.. py:attribute:: SuccessAnswer.confidence :module: urimai.storage.models :type: float

.. py:attribute:: SuccessAnswer.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: RetryWithFeedback(**data) :module: urimai.storage.models

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

Indicates query needs to be retried with modifications.

.. py:attribute:: RetryWithFeedback.success :module: urimai.storage.models :type: bool

.. py:attribute:: RetryWithFeedback.retry_reason :module: urimai.storage.models :type: str

.. py:attribute:: RetryWithFeedback.suggested_fix :module: urimai.storage.models :type: str

.. py:attribute:: RetryWithFeedback.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: QueryComplexity(**data) :module: urimai.storage.models

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

Result of complexity classification.

.. py:attribute:: QueryComplexity.is_complex :module: urimai.storage.models :type: bool

.. py:attribute:: QueryComplexity.reasoning :module: urimai.storage.models :type: str

.. py:attribute:: QueryComplexity.estimated_steps :module: urimai.storage.models :type: int

.. py:attribute:: QueryComplexity.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: SubProblem(**data) :module: urimai.storage.models

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

A single sub-problem in a query execution plan.

.. py:attribute:: SubProblem.id :module: urimai.storage.models :type: str

.. py:attribute:: SubProblem.title :module: urimai.storage.models :type: str

.. py:attribute:: SubProblem.purpose :module: urimai.storage.models :type: str

.. py:attribute:: SubProblem.approach :module: urimai.storage.models :type: str

.. py:attribute:: SubProblem.tables_needed :module: urimai.storage.models :type: list[str]

.. py:attribute:: SubProblem.depends_on :module: urimai.storage.models :type: list[str]

.. py:attribute:: SubProblem.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: ExecutionPlan(**data) :module: urimai.storage.models

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

Multi-step execution plan for a complex question.

.. py:attribute:: ExecutionPlan.question :module: urimai.storage.models :type: str

.. py:attribute:: ExecutionPlan.approach_summary :module: urimai.storage.models :type: str

.. py:attribute:: ExecutionPlan.sub_problems :module: urimai.storage.models :type: list[~urimai.storage.models.SubProblem]

.. py:attribute:: ExecutionPlan.final_assembly_strategy :module: urimai.storage.models :type: str

.. py:attribute:: ExecutionPlan.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: SubProblemResult(**data) :module: urimai.storage.models

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

Result of executing a single sub-problem.

.. py:attribute:: SubProblemResult.sub_problem_id :module: urimai.storage.models :type: str

.. py:attribute:: SubProblemResult.sql_query :module: urimai.storage.models :type: str

.. py:attribute:: SubProblemResult.success :module: urimai.storage.models :type: bool

.. py:attribute:: SubProblemResult.data_summary :module: urimai.storage.models :type: str

.. py:attribute:: SubProblemResult.row_count :module: urimai.storage.models :type: int

.. py:attribute:: SubProblemResult.key_findings :module: urimai.storage.models :type: list[str]

.. py:attribute:: SubProblemResult.verified_columns :module: urimai.storage.models :type: dict[str, str]

.. py:attribute:: SubProblemResult.verified_joins :module: urimai.storage.models :type: list[str]

.. py:attribute:: SubProblemResult.sample_data :module: urimai.storage.models :type: list[dict[str, ~typing.Any]] | None

.. py:attribute:: SubProblemResult.error :module: urimai.storage.models :type: str | None

.. py:attribute:: SubProblemResult.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: PlanRevision(**data) :module: urimai.storage.models

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

Revised plan after a sub-problem failure or unexpected result.

.. py:attribute:: PlanRevision.should_revise :module: urimai.storage.models :type: bool

.. py:attribute:: PlanRevision.reason :module: urimai.storage.models :type: str

.. py:attribute:: PlanRevision.updated_sub_problems :module: urimai.storage.models :type: list[~urimai.storage.models.SubProblem]

.. py:attribute:: PlanRevision.drop_ids :module: urimai.storage.models :type: list[str]

.. py:attribute:: PlanRevision.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: ColumnProfile(**data) :module: urimai.storage.models

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

Statistical profile for a single column.

.. py:attribute:: ColumnProfile.column_name :module: urimai.storage.models :type: str

.. py:attribute:: ColumnProfile.data_type :module: urimai.storage.models :type: str

.. py:attribute:: ColumnProfile.row_count :module: urimai.storage.models :type: int

.. py:attribute:: ColumnProfile.null_count :module: urimai.storage.models :type: int

.. py:attribute:: ColumnProfile.null_percentage :module: urimai.storage.models :type: float

.. py:attribute:: ColumnProfile.distinct_count :module: urimai.storage.models :type: int

.. py:attribute:: ColumnProfile.distinct_percentage :module: urimai.storage.models :type: float

.. py:attribute:: ColumnProfile.min_value :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.max_value :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.mean :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.median :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.std_dev :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.q1 :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.q3 :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.skewness :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.kurtosis :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.min_length :module: urimai.storage.models :type: int | None

.. py:attribute:: ColumnProfile.max_length :module: urimai.storage.models :type: int | None

.. py:attribute:: ColumnProfile.avg_length :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.top_values :module: urimai.storage.models :type: list[tuple[~typing.Any, int]]

.. py:attribute:: ColumnProfile.inferred_role :module: urimai.storage.models :type: str | None

.. py:attribute:: ColumnProfile.role_confidence :module: urimai.storage.models :type: float | None

.. py:attribute:: ColumnProfile.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: TableProfile(**data) :module: urimai.storage.models

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

Complete profile for a table.

.. py:attribute:: TableProfile.id :module: urimai.storage.models :type: int | None

.. py:attribute:: TableProfile.database_id :module: urimai.storage.models :type: int

.. py:attribute:: TableProfile.table_name :module: urimai.storage.models :type: str

.. py:attribute:: TableProfile.row_count :module: urimai.storage.models :type: int

.. py:attribute:: TableProfile.column_count :module: urimai.storage.models :type: int

.. py:attribute:: TableProfile.columns :module: urimai.storage.models :type: list[~urimai.storage.models.ColumnProfile]

.. py:attribute:: TableProfile.created_at :module: urimai.storage.models :type: str

.. py:attribute:: TableProfile.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: QualityIssue(**data) :module: urimai.storage.models

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

A single data quality issue detected.

.. py:attribute:: QualityIssue.severity :module: urimai.storage.models :type: ~typing.Literal[‘critical’, ‘warning’, ‘info’]

.. py:attribute:: QualityIssue.category :module: urimai.storage.models :type: str

.. py:attribute:: QualityIssue.column_name :module: urimai.storage.models :type: str | None

.. py:attribute:: QualityIssue.issue :module: urimai.storage.models :type: str

.. py:attribute:: QualityIssue.affected_rows :module: urimai.storage.models :type: int | None

.. py:attribute:: QualityIssue.recommendation :module: urimai.storage.models :type: str

.. py:attribute:: QualityIssue.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: QualityReport(**data) :module: urimai.storage.models

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

Data quality assessment report for a table.

.. py:attribute:: QualityReport.id :module: urimai.storage.models :type: int | None

.. py:attribute:: QualityReport.database_id :module: urimai.storage.models :type: int

.. py:attribute:: QualityReport.table_name :module: urimai.storage.models :type: str

.. py:attribute:: QualityReport.overall_score :module: urimai.storage.models :type: float

.. py:attribute:: QualityReport.completeness_score :module: urimai.storage.models :type: float

.. py:attribute:: QualityReport.uniqueness_score :module: urimai.storage.models :type: float

.. py:attribute:: QualityReport.validity_score :module: urimai.storage.models :type: float

.. py:attribute:: QualityReport.consistency_score :module: urimai.storage.models :type: float

.. py:attribute:: QualityReport.issues :module: urimai.storage.models :type: list[~urimai.storage.models.QualityIssue]

.. py:attribute:: QualityReport.created_at :module: urimai.storage.models :type: str

.. py:attribute:: QualityReport.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: Insight(**data) :module: urimai.storage.models

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

A single actionable insight about the data.

.. py:attribute:: Insight.category :module: urimai.storage.models :type: str

.. py:attribute:: Insight.title :module: urimai.storage.models :type: str

.. py:attribute:: Insight.description :module: urimai.storage.models :type: str

.. py:attribute:: Insight.severity :module: urimai.storage.models :type: ~typing.Literal[‘high’, ‘medium’, ‘low’]

.. py:attribute:: Insight.affected_columns :module: urimai.storage.models :type: list[str]

.. py:attribute:: Insight.supporting_data :module: urimai.storage.models :type: dict[str, ~typing.Any]

.. py:attribute:: Insight.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: InsightsReport(**data) :module: urimai.storage.models

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

Collection of insights for a table.

.. py:attribute:: InsightsReport.id :module: urimai.storage.models :type: int | None

.. py:attribute:: InsightsReport.database_id :module: urimai.storage.models :type: int

.. py:attribute:: InsightsReport.table_name :module: urimai.storage.models :type: str

.. py:attribute:: InsightsReport.insights :module: urimai.storage.models :type: list[~urimai.storage.models.Insight]

.. py:attribute:: InsightsReport.summary :module: urimai.storage.models :type: str

.. py:attribute:: InsightsReport.created_at :module: urimai.storage.models :type: str

.. py:attribute:: InsightsReport.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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

.. py:class:: UsageStats(**data) :module: urimai.storage.models

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

Accumulated token usage across agent calls for a single question.

.. py:attribute:: UsageStats.input_tokens :module: urimai.storage.models :type: int

.. py:attribute:: UsageStats.output_tokens :module: urimai.storage.models :type: int

.. py:attribute:: UsageStats.requests :module: urimai.storage.models :type: int

.. py:property:: UsageStats.total_tokens :module: urimai.storage.models :type: int

.. py:method:: UsageStats.add(usage) :module: urimai.storage.models

  Add usage from a pydantic_ai RunUsage object.


  :rtype: :sphinx_autodoc_typehints_type:`\:py\:obj\:\`None\``

.. py:attribute:: UsageStats.model_config :module: urimai.storage.models :type: ~typing.ClassVar[~pydantic.config.ConfigDict] :value: {}

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