Skip to main content

Crate sdsforge_core

Crate sdsforge_core 

Source
Expand description

LLM-based bidirectional conversion between Safety Data Sheet (SDS) documents and the Japanese MHLW SDS Data Exchange Format v1.0 (JIS Z 7253 / GHS).

§Quick start

use sdsforge_core::{
    AnthropicBackend, LlmConfig,
    convert_to_json, convert_to_json_with_report, ConvertConfig, Language,
};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let backend = AnthropicBackend::new(
        std::env::var("ANTHROPIC_API_KEY")?,
        LlmConfig::default(),
    );
    let config = ConvertConfig {
        source_language: Some(Language::Japanese),
        output_language: Language::Japanese,
        ..Default::default()
    };
    // `convert_to_json_with_report` returns structured metadata (language, sections, notes).
    let (sds, report) =
        convert_to_json_with_report(std::path::Path::new("input.pdf"), &backend, &config).await?;
    for w in &report.warnings { eprintln!("WARN: {w}"); }
    eprintln!("Populated sections: {:?}", report.populated_sections);
    eprintln!("Standardization notes: {:?}", report.standardization_notes);
    std::fs::write("output.json", serde_json::to_string_pretty(&sds)?)?;
    std::fs::write("output_report.json", serde_json::to_string_pretty(&report)?)?;
    Ok(())
}

§Features

  • SDS → JSON: PDF/DOCX/XLSX/TXT → MHLW standard JSON via LLM (parallel extraction, automatic retry, JSON repair).
  • JSON → DOCX: Generates a JIS Z 7253-compliant Word document with localized headings.
  • Multilingual: ja / en / zh-CN / zh-TW source documents and output headings.
  • Pluggable LLM: Ships with AnthropicBackend and OpenAiCompatBackend. Implement converter::LlmBackend to bring your own.

Re-exports§

pub use assist::build_proposals;
pub use assist::excerpt_verifies;
pub use assist::is_allowed_path;
pub use assist::parse_candidates_json;
pub use assist::run_section4_assist;
pub use assist::sha256_hex;
pub use assist::validate_candidate;
pub use assist::AssistCandidate;
pub use assist::AssistProposal;
pub use assist::AssistRun;
pub use assist::ASSIST_CONFIDENCE;
pub use assist::ASSIST_SCHEMA_VERSION;
pub use assist::EXTRACTION_METHOD_LLM;
pub use assist::SECTION4_ALLOWED_PATHS;
pub use converter::AnthropicBackend;
pub use converter::AnyBackend;
pub use converter::ConvertConfig;
pub use converter::ConversionReport;
pub use converter::LlmBackend;
pub use converter::LlmConfig;
pub use converter::OpenAiCompatBackend;
pub use converter::build_any_backend;
pub use converter::convert_bytes_to_json;
pub use converter::convert_bytes_to_json_with_report;
pub use converter::convert_from_json;
pub use converter::convert_from_template;
pub use converter::convert_pdf_to_json_vision;
pub use converter::convert_to_json;
pub use converter::convert_to_json_with_report;
pub use converter::convert_url_to_json;
pub use converter::extract_sds_from_pdf_vision;
pub use converter::fill_template;
pub use converter::openai_compat_url;
pub use converter::prune_empty_fields;
pub use converter::extractor::detect_format_str;
pub use converter::extractor::detect_language_from_file;
pub use converter::extractor::detect_language_from_url;
pub use converter::extractor::extract_text;
pub use converter::extractor::extract_text_from_url;
pub use converter::extractor::extract_text_limited;
pub use converter::validator::validate;
pub use converter::validator::validate_typed;
pub use converter::validator::Finding;
pub use enrichment::enrich_composition;
pub use enrichment::lookup_cas;
pub use enrichment::lookup_cas_detailed;
pub use enrichment::CasInfo;
pub use enrichment::CasResolution;
pub use enrichment::CasWarning;
pub use enrichment::ChemicalIdentityCandidate;
pub use error::SdsError;
pub use generation::build_generation_artifacts;
pub use generation::build_generation_report;
pub use generation::build_product_level_unresolved;
pub use generation::compute_evidence_summary;
pub use generation::compute_release_status;
pub use generation::draft_sections_from_resolved_input;
pub use generation::evaluate_release_gate;
pub use generation::generate_from_detailed_lookups;
pub use generation::generate_from_normalized_input;
pub use generation::generate_from_resolved_input;
pub use generation::generate_section_1_and_3;
pub use generation::generate_with_detailed_enrichment;
pub use generation::generate_with_enrichment;
pub use generation::render_review_report;
pub use generation::serialize_generation_report;
pub use generation::serialize_official_sds;
pub use generation::validate_product_input;
pub use generation::ComponentInput;
pub use generation::ConcentrationRange;
pub use generation::ConfidenceLevel;
pub use generation::EvidenceApplicability;
pub use generation::EvidenceLevel;
pub use generation::EvidenceSource;
pub use generation::EvidenceSummary;
pub use generation::ExplosiveLimitsEvidence;
pub use generation::FieldPolicy;
pub use generation::FieldProvenance;
pub use generation::FieldStatus;
pub use generation::GenerationArtifactError;
pub use generation::GenerationArtifacts;
pub use generation::GenerationReport;
pub use generation::GenerationResult;
pub use generation::MeasuredPropertiesInput;
pub use generation::MeasuredValueEvidence;
pub use generation::MeasurementConditions;
pub use generation::NotApplicableReason;
pub use generation::ProductInput;
pub use generation::RegulatoryImpact;
pub use generation::ReleaseGateResult;
pub use generation::ReleaseStatus;
pub use generation::REPORT_SCHEMA_VERSION;
pub use generation::RequiredInput;
pub use generation::SafetyImpact;
pub use generation::SectionDraftResult;
pub use generation::SupplierInput;
pub use generation::TestResultEvidence;
pub use generation::UnresolvedField;
pub use generation::UnresolvedReason;
pub use ghs_codes::h_code_description;
pub use ghs_codes::is_valid_h_code;
pub use ghs_codes::is_valid_p_code;
pub use ghs_codes::p_code_description;
pub use country::SourceCountry;
pub use language::detect_language;
pub use language::Language;
pub use normalize::CalculatedIdentityProperties;
pub use normalize::ChemicalNormalizationResult;
pub use normalize::ChemicalNormalizer;
pub use normalize::NormalizationIssue;
pub use normalize::NormalizationStatus;
pub use normalize::UnavailableNormalizer;
pub use schema::SdsRoot;

Modules§

assist
Assist v1: proposes candidate values for Section 4 (First-aid measures) fields, extracted from one supplier SDS document, for a human to accept/edit/reject. Assist never writes to official_sds.json or crate::generation::ProductInput directly – turning an accepted proposal into authoring input is a separate (not yet implemented) step.
converter
country
enrichment
error
generation
Formulation input domain model and draft generation for the generate feature.
ghs_codes
GHS Rev.10 H-code and P-code validation and descriptions.
language
normalize
Chemical structure normalization — a peer to crate::enrichment, not nested inside it or inside crate::generation. Mirrors the boundary docs/sdsforge-architecture.md’s “chematic integration boundary” section describes:
schema