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-TWsource documents and output headings. - Pluggable LLM: Ships with
AnthropicBackendandOpenAiCompatBackend. Implementconverter::LlmBackendto 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 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.jsonorcrate::generation::ProductInputdirectly – 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
generatefeature. - 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 insidecrate::generation. Mirrors the boundarydocs/sdsforge-architecture.md’s “chematic integration boundary” section describes: - schema