@duckmind/deepquark-darwin-arm64 0.9.78 → 0.9.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.deepquark/skills/bundled/data-storytelling/SKILL.md +453 -0
- package/.deepquark/skills/bundled/docx/LICENSE.txt +30 -0
- package/.deepquark/skills/bundled/docx/SKILL.md +481 -0
- package/.deepquark/skills/bundled/docx/scripts/__init__.py +1 -0
- package/.deepquark/skills/bundled/docx/scripts/accept_changes.py +135 -0
- package/.deepquark/skills/bundled/docx/scripts/comment.py +318 -0
- package/.deepquark/skills/bundled/docx/scripts/office/helpers/__init__.py +0 -0
- package/.deepquark/skills/bundled/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/.deepquark/skills/bundled/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.deepquark/skills/bundled/docx/scripts/office/pack.py +159 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.deepquark/skills/bundled/docx/scripts/office/soffice.py +183 -0
- package/.deepquark/skills/bundled/docx/scripts/office/unpack.py +132 -0
- package/.deepquark/skills/bundled/docx/scripts/office/validate.py +111 -0
- package/.deepquark/skills/bundled/docx/scripts/office/validators/__init__.py +15 -0
- package/.deepquark/skills/bundled/docx/scripts/office/validators/base.py +847 -0
- package/.deepquark/skills/bundled/docx/scripts/office/validators/docx.py +446 -0
- package/.deepquark/skills/bundled/docx/scripts/office/validators/pptx.py +275 -0
- package/.deepquark/skills/bundled/docx/scripts/office/validators/redlining.py +247 -0
- package/.deepquark/skills/bundled/docx/scripts/templates/comments.xml +3 -0
- package/.deepquark/skills/bundled/docx/scripts/templates/commentsExtended.xml +3 -0
- package/.deepquark/skills/bundled/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/.deepquark/skills/bundled/docx/scripts/templates/commentsIds.xml +3 -0
- package/.deepquark/skills/bundled/docx/scripts/templates/people.xml +3 -0
- package/.deepquark/skills/bundled/drawio-architect/SKILL.md +300 -0
- package/.deepquark/skills/bundled/drawio-architect/references/architecture-patterns.md +236 -0
- package/.deepquark/skills/bundled/drawio-architect/references/branding.md +180 -0
- package/.deepquark/skills/bundled/drawio-architect/references/cloud-icons.md +493 -0
- package/.deepquark/skills/bundled/drawio-architect/references/style-guide.md +268 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/ARCHITECTURE_REVIEW.md +495 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/AUTONOMY_VERIFICATION.md +420 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/COMPETITIVE_ANALYSIS.md +179 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/CONTEXT_OPTIMIZATION.md +293 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/QUICK_START.md +167 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/README.md +259 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/SKILL.md +754 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/WORD_PRECISION_AUDIT.md +476 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/reference/methodology.md +384 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/requirements.txt +10 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/scripts/citation_manager.py +177 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/scripts/md_to_html.py +330 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/scripts/research_engine.py +578 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/scripts/source_evaluator.py +292 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/scripts/validate_report.py +354 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/scripts/verify_citations.py +430 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/scripts/verify_html.py +220 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/templates/mckinsey_report_template.html +443 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/templates/report_template.md +414 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/tests/fixtures/invalid_report.md +27 -0
- package/.deepquark/skills/bundled/duckmind-deep-research/tests/fixtures/valid_report.md +114 -0
- package/.deepquark/skills/bundled/duckmind-multimodal/SKILL.md +171 -0
- package/.deepquark/skills/bundled/duckmind-multimodal/references/image-generation.md +131 -0
- package/.deepquark/skills/bundled/duckmind-multimodal/references/pdf-processing.md +120 -0
- package/.deepquark/skills/bundled/duckmind-transcribe/SKILL.md +70 -0
- package/.deepquark/skills/bundled/duckmind-transcribe/scripts/transcribe.sh +134 -0
- package/.deepquark/skills/bundled/excel-analysis/SKILL.md +247 -0
- package/.deepquark/skills/bundled/ge-payroll/SKILL.md +153 -0
- package/.deepquark/skills/bundled/ge-payroll/evals/evals.json +23 -0
- package/.deepquark/skills/bundled/ge-payroll/references/pain-points-improvements.md +106 -0
- package/.deepquark/skills/bundled/ge-payroll/references/process-detail.md +217 -0
- package/.deepquark/skills/bundled/ge-payroll/references/raci-stakeholders.md +85 -0
- package/.deepquark/skills/bundled/ge-payroll/references/timeline-mandays.md +64 -0
- package/.deepquark/skills/bundled/pdf/LICENSE.txt +30 -0
- package/.deepquark/skills/bundled/pdf/SKILL.md +314 -0
- package/.deepquark/skills/bundled/pdf/forms.md +294 -0
- package/.deepquark/skills/bundled/pdf/reference.md +612 -0
- package/.deepquark/skills/bundled/pdf/scripts/check_bounding_boxes.py +65 -0
- package/.deepquark/skills/bundled/pdf/scripts/check_fillable_fields.py +11 -0
- package/.deepquark/skills/bundled/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/.deepquark/skills/bundled/pdf/scripts/create_validation_image.py +37 -0
- package/.deepquark/skills/bundled/pdf/scripts/extract_form_field_info.py +122 -0
- package/.deepquark/skills/bundled/pdf/scripts/extract_form_structure.py +115 -0
- package/.deepquark/skills/bundled/pdf/scripts/fill_fillable_fields.py +98 -0
- package/.deepquark/skills/bundled/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/.deepquark/skills/bundled/perplexity-search/SKILL.md +447 -0
- package/.deepquark/skills/bundled/perplexity-search/assets/.env.example +16 -0
- package/.deepquark/skills/bundled/perplexity-search/references/model_comparison.md +386 -0
- package/.deepquark/skills/bundled/perplexity-search/references/openrouter_setup.md +454 -0
- package/.deepquark/skills/bundled/perplexity-search/references/search_strategies.md +258 -0
- package/.deepquark/skills/bundled/perplexity-search/scripts/perplexity_search.py +277 -0
- package/.deepquark/skills/bundled/perplexity-search/scripts/setup_env.py +171 -0
- package/.deepquark/skills/bundled/pptx/LICENSE.txt +30 -0
- package/.deepquark/skills/bundled/pptx/SKILL.md +232 -0
- package/.deepquark/skills/bundled/pptx/editing.md +205 -0
- package/.deepquark/skills/bundled/pptx/pptxgenjs.md +420 -0
- package/.deepquark/skills/bundled/pptx/scripts/__init__.py +0 -0
- package/.deepquark/skills/bundled/pptx/scripts/add_slide.py +195 -0
- package/.deepquark/skills/bundled/pptx/scripts/clean.py +286 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/helpers/__init__.py +0 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/helpers/merge_runs.py +199 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/pack.py +159 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/soffice.py +183 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/unpack.py +132 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/validate.py +111 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/validators/__init__.py +15 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/validators/base.py +847 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/validators/docx.py +446 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/validators/pptx.py +275 -0
- package/.deepquark/skills/bundled/pptx/scripts/office/validators/redlining.py +247 -0
- package/.deepquark/skills/bundled/pptx/scripts/thumbnail.py +289 -0
- package/.deepquark/skills/bundled/text-to-pdf-automation/SKILL.md +91 -0
- package/.deepquark/skills/bundled/web-fetch/SKILL.md +56 -0
- package/.deepquark/skills/bundled/web-fetch/scripts/fetch.sh +54 -0
- package/.deepquark/skills/bundled/xlsx/LICENSE.txt +30 -0
- package/.deepquark/skills/bundled/xlsx/SKILL.md +292 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/pack.py +159 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/soffice.py +183 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/unpack.py +132 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/validate.py +111 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/validators/__init__.py +15 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/validators/base.py +847 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/validators/docx.py +446 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/validators/pptx.py +275 -0
- package/.deepquark/skills/bundled/xlsx/scripts/office/validators/redlining.py +247 -0
- package/.deepquark/skills/bundled/xlsx/scripts/recalc.py +184 -0
- package/.deepquark/skills/bundled/youtube-downloader/SKILL.md +99 -0
- package/.deepquark/skills/bundled/youtube-downloader/scripts/download_video.py +145 -0
- package/.deepquark/skills/bundled/youtube-transcribe-skill/SKILL.md +116 -0
- package/bin/deepquark +0 -0
- package/package.json +4 -3
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: duckmind-multimodal
|
|
3
|
+
description: >
|
|
4
|
+
How to use DuckMind's multimodal API to send images, PDFs, audio, video, and generate images.
|
|
5
|
+
Use this skill whenever the user wants to interact with the DuckMind API for any multimodal task,
|
|
6
|
+
including: sending images to vision models, generating images from text prompts, processing PDF documents,
|
|
7
|
+
sending or receiving audio, or analyzing video content. Also trigger when the user mentions DuckMind
|
|
8
|
+
in combination with any media type, asks about DuckMind's image generation, PDF parsing, audio
|
|
9
|
+
transcription, or video analysis capabilities. Trigger even if the user just says "DuckMind" with
|
|
10
|
+
a file processing context, or asks how to send files/media to DuckMind models.
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# DuckMind Multimodal API
|
|
14
|
+
|
|
15
|
+
This skill covers how to use DuckMind's unified `/api/v1/chat/completions` endpoint for multimodal inputs and outputs: images, PDFs, audio, and video.
|
|
16
|
+
|
|
17
|
+
## Authentication
|
|
18
|
+
|
|
19
|
+
Before making any API call, retrieve the DuckMind API key from DeepQuark's auth store:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# With jq (preferred)
|
|
23
|
+
DUCKMIND_API_KEY=$(jq -r '.duckmind.key' ~/.local/share/deepquark/auth.json)
|
|
24
|
+
|
|
25
|
+
# With python3 (fallback)
|
|
26
|
+
DUCKMIND_API_KEY=$(python3 -c "import json; d=json.load(open('$HOME/.local/share/deepquark/auth.json')); print(d['duckmind']['key'])")
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Use `$DUCKMIND_API_KEY` (bash) or the extracted string as the Bearer token in all requests. Never hardcode the key.
|
|
30
|
+
|
|
31
|
+
## Quick Reference: Content Types
|
|
32
|
+
|
|
33
|
+
| Modality | Content Type | URL Support | Base64 Support |
|
|
34
|
+
|-----------------|-----------------|-------------|----------------|
|
|
35
|
+
| Image (input) | `image_url` | Yes | Yes |
|
|
36
|
+
| Image (output) | Set `modalities`| N/A | Returned as b64|
|
|
37
|
+
| PDF | `file` | Yes | Yes |
|
|
38
|
+
| Audio (input) | `input_audio` | No | Yes (required) |
|
|
39
|
+
| Audio (output) | Set `modalities`| N/A | Streamed as b64|
|
|
40
|
+
| Video | `video_url` | Provider-specific | Yes |
|
|
41
|
+
|
|
42
|
+
## Image Inputs
|
|
43
|
+
|
|
44
|
+
Send images to vision-capable models. Place text prompt first, then images. Supports `image/png`, `image/jpeg`, `image/webp`, `image/gif`.
|
|
45
|
+
|
|
46
|
+
**Via URL:**
|
|
47
|
+
```js
|
|
48
|
+
content: [
|
|
49
|
+
{ type: "text", text: "What's in this image?" },
|
|
50
|
+
{ type: "image_url", image_url: { url: "https://example.com/photo.jpg" } }
|
|
51
|
+
]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Via Base64:**
|
|
55
|
+
```js
|
|
56
|
+
const base64 = `data:image/jpeg;base64,${Buffer.from(fs.readFileSync(path)).toString("base64")}`;
|
|
57
|
+
// Then use: { type: "image_url", image_url: { url: base64 } }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Multiple images can be sent as separate entries in the content array.
|
|
61
|
+
|
|
62
|
+
## Image Generation
|
|
63
|
+
|
|
64
|
+
Models with `"image"` in `output_modalities` can generate images. Set the `modalities` parameter:
|
|
65
|
+
|
|
66
|
+
- Text + image models (e.g. Gemini): `modalities: ["image", "text"]`
|
|
67
|
+
- Image-only models (e.g. Flux): `modalities: ["image"]`
|
|
68
|
+
|
|
69
|
+
```js
|
|
70
|
+
const result = await fetch("https://openrouter.ai/api/v1/chat/completions", {
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers: { Authorization: `Bearer ${DUCKMIND_API_KEY}`, "Content-Type": "application/json" },
|
|
73
|
+
body: JSON.stringify({
|
|
74
|
+
model: "google/gemini-2.5-flash-image-preview",
|
|
75
|
+
messages: [{ role: "user", content: "Generate a sunset over mountains" }],
|
|
76
|
+
modalities: ["image", "text"],
|
|
77
|
+
stream: false,
|
|
78
|
+
}),
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Response contains `choices[0].message.images[]` with base64 data URLs.
|
|
83
|
+
|
|
84
|
+
**Image config options** (via `image_config` parameter):
|
|
85
|
+
- `aspect_ratio`: "1:1" (default), "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"
|
|
86
|
+
- Extended (Gemini 3.1 Flash only): "1:4", "4:1", "1:8", "8:1"
|
|
87
|
+
- `image_size`: "1K" (default), "2K", "4K", "0.5K" (Gemini 3.1 Flash only)
|
|
88
|
+
- `font_inputs`: Sourceful models only — custom font rendering, max 2, +$0.03 each
|
|
89
|
+
- `super_resolution_references`: Sourceful models only — enhance low-quality elements, max 4, +$0.20 each
|
|
90
|
+
|
|
91
|
+
For full details on image config options, see `references/image-generation.md`.
|
|
92
|
+
|
|
93
|
+
## PDF Processing
|
|
94
|
+
|
|
95
|
+
Use the `file` content type. Works on **any** DuckMind model — native models get direct passthrough, others get parsed content.
|
|
96
|
+
|
|
97
|
+
```js
|
|
98
|
+
content: [
|
|
99
|
+
{ type: "text", text: "Summarize this document." },
|
|
100
|
+
{
|
|
101
|
+
type: "file",
|
|
102
|
+
file: { filename: "doc.pdf", file_data: "https://example.com/doc.pdf" }
|
|
103
|
+
// Or for base64: file_data: "data:application/pdf;base64,..."
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**PDF Engines** (via `plugins` parameter):
|
|
109
|
+
- `"native"` — model's built-in file processing (charged as input tokens)
|
|
110
|
+
- `"pdf-text"` — free, best for well-structured text PDFs
|
|
111
|
+
- `"mistral-ocr"` — $2/1000 pages, best for scanned docs or PDFs with images
|
|
112
|
+
|
|
113
|
+
Default: native if supported, otherwise `mistral-ocr`.
|
|
114
|
+
|
|
115
|
+
```js
|
|
116
|
+
plugins: [{ id: "file-parser", pdf: { engine: "pdf-text" } }]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Skip re-parsing costs**: Store `annotations` from the response and include them in follow-up requests. See `references/pdf-processing.md` for the full annotation reuse pattern.
|
|
120
|
+
|
|
121
|
+
## Audio
|
|
122
|
+
|
|
123
|
+
### Audio Input
|
|
124
|
+
Audio must be **base64-encoded** (URLs not supported). Use `input_audio` content type.
|
|
125
|
+
|
|
126
|
+
```js
|
|
127
|
+
content: [
|
|
128
|
+
{ type: "text", text: "Transcribe this audio." },
|
|
129
|
+
{ type: "input_audio", input_audio: { data: base64Audio, format: "wav" } }
|
|
130
|
+
]
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Supported formats: wav, mp3, aiff, aac, ogg, flac, m4a, pcm16, pcm24 (varies by model).
|
|
134
|
+
|
|
135
|
+
### Audio Output
|
|
136
|
+
Set `modalities: ["text", "audio"]` and provide `audio` config. **Requires streaming.**
|
|
137
|
+
|
|
138
|
+
```js
|
|
139
|
+
{
|
|
140
|
+
modalities: ["text", "audio"],
|
|
141
|
+
audio: { voice: "alloy", format: "wav" },
|
|
142
|
+
stream: true
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Voices: alloy, echo, fable, onyx, nova, shimmer (varies by model).
|
|
147
|
+
Formats: wav, mp3, flac, opus, pcm16 (varies by model).
|
|
148
|
+
|
|
149
|
+
Audio data arrives in `delta.audio.data` (base64 chunks) and `delta.audio.transcript`.
|
|
150
|
+
|
|
151
|
+
## Video Input
|
|
152
|
+
|
|
153
|
+
Use `video_url` content type. Supports base64 (`data:video/mp4;base64,...`) and provider-specific URLs (e.g. YouTube links for Gemini on AI Studio).
|
|
154
|
+
|
|
155
|
+
## Model Compatibility
|
|
156
|
+
|
|
157
|
+
Not all models support all modalities. Use the [Models page](https://openrouter.ai/models) to filter by:
|
|
158
|
+
- Vision models → image input
|
|
159
|
+
- File-compatible models → PDF processing
|
|
160
|
+
- Audio-capable models → audio I/O
|
|
161
|
+
- Video-capable models → video input
|
|
162
|
+
- Output modalities with "image" → image generation
|
|
163
|
+
|
|
164
|
+
## SDK Usage
|
|
165
|
+
|
|
166
|
+
DuckMind provides official SDKs:
|
|
167
|
+
- **TypeScript**: `@openrouter/sdk` — use `openRouter.chat.send()`
|
|
168
|
+
- **Python**: `openrouter` package
|
|
169
|
+
|
|
170
|
+
Both SDKs use camelCase for parameters (e.g. `imageUrl`, `inputAudio`, `fileData`).
|
|
171
|
+
Raw fetch/requests use snake_case (e.g. `image_url`, `input_audio`, `file_data`).
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Image Generation — Detailed Reference
|
|
2
|
+
|
|
3
|
+
## Model Discovery
|
|
4
|
+
|
|
5
|
+
Find image generation models:
|
|
6
|
+
1. **Models page**: Filter by output modalities → "image"
|
|
7
|
+
2. **Chatroom**: Click the "Image" button to auto-filter
|
|
8
|
+
3. **API**: Check `output_modalities` includes `"image"`
|
|
9
|
+
|
|
10
|
+
## Compatible Models (examples)
|
|
11
|
+
|
|
12
|
+
- `google/gemini-3.1-flash-image-preview` (extended aspect ratios, 0.5K support)
|
|
13
|
+
- `google/gemini-2.5-flash-image-preview`
|
|
14
|
+
- `google/gemini-3-pro-image-preview`
|
|
15
|
+
- `black-forest-labs/flux.2-pro`
|
|
16
|
+
- `black-forest-labs/flux.2-flex`
|
|
17
|
+
- `sourceful/riverflow-v2-standard-preview`
|
|
18
|
+
- `sourceful/riverflow-v2-fast`
|
|
19
|
+
- `sourceful/riverflow-v2-pro`
|
|
20
|
+
|
|
21
|
+
## Modalities Parameter
|
|
22
|
+
|
|
23
|
+
- Models outputting both text and images: `modalities: ["image", "text"]`
|
|
24
|
+
- Image-only models (Flux, Sourceful): `modalities: ["image"]`
|
|
25
|
+
|
|
26
|
+
## Image Config Options
|
|
27
|
+
|
|
28
|
+
### Aspect Ratio (`image_config.aspect_ratio`)
|
|
29
|
+
|
|
30
|
+
Standard ratios (all models):
|
|
31
|
+
|
|
32
|
+
| Ratio | Resolution |
|
|
33
|
+
|-------|--------------|
|
|
34
|
+
| 1:1 | 1024×1024 (default) |
|
|
35
|
+
| 2:3 | 832×1248 |
|
|
36
|
+
| 3:2 | 1248×832 |
|
|
37
|
+
| 3:4 | 864×1184 |
|
|
38
|
+
| 4:3 | 1184×864 |
|
|
39
|
+
| 4:5 | 896×1152 |
|
|
40
|
+
| 5:4 | 1152×896 |
|
|
41
|
+
| 9:16 | 768×1344 |
|
|
42
|
+
| 16:9 | 1344×768 |
|
|
43
|
+
| 21:9 | 1536×672 |
|
|
44
|
+
|
|
45
|
+
Extended ratios (Gemini 3.1 Flash only):
|
|
46
|
+
|
|
47
|
+
| Ratio | Use Case |
|
|
48
|
+
|-------|---------------------------------------|
|
|
49
|
+
| 1:4 | Scrolling carousels, vertical UI |
|
|
50
|
+
| 4:1 | Hero banners, horizontal layouts |
|
|
51
|
+
| 1:8 | Notification headers, narrow vertical |
|
|
52
|
+
| 8:1 | Wide-format banners, panoramic |
|
|
53
|
+
|
|
54
|
+
### Image Size (`image_config.image_size`)
|
|
55
|
+
|
|
56
|
+
| Size | Description |
|
|
57
|
+
|------|--------------------------------------|
|
|
58
|
+
| 1K | Standard resolution (default) |
|
|
59
|
+
| 2K | Higher resolution |
|
|
60
|
+
| 4K | Highest resolution |
|
|
61
|
+
| 0.5K | Lower resolution, efficient (Gemini 3.1 Flash only) |
|
|
62
|
+
|
|
63
|
+
### Font Inputs (`image_config.font_inputs`) — Sourceful only
|
|
64
|
+
|
|
65
|
+
Render custom text with specific fonts. Max 2 font inputs, +$0.03 each.
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"image_config": {
|
|
70
|
+
"font_inputs": [
|
|
71
|
+
{ "font_url": "https://example.com/fonts/custom.ttf", "text": "Hello World" }
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Tips:
|
|
78
|
+
- Include the text in your prompt with font name, color, size, position details
|
|
79
|
+
- `text` should match exactly what's in the prompt (no extra wording or quotes)
|
|
80
|
+
- Use line breaks or double spaces to separate headlines and sub-headers
|
|
81
|
+
- Works best with short, clear headlines
|
|
82
|
+
|
|
83
|
+
### Super Resolution References (`image_config.super_resolution_references`) — Sourceful only
|
|
84
|
+
|
|
85
|
+
Enhance low-quality elements using high-quality reference images. Only works with image-to-image (input images in messages). Max 4 references, +$0.20 each.
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"image_config": {
|
|
90
|
+
"super_resolution_references": [
|
|
91
|
+
"https://example.com/ref1.jpg",
|
|
92
|
+
"https://example.com/ref2.jpg"
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Tips:
|
|
99
|
+
- Output matches input image size — use larger inputs for better quality
|
|
100
|
+
- Use high-quality references showing desired enhancement result
|
|
101
|
+
|
|
102
|
+
## Streaming Image Generation
|
|
103
|
+
|
|
104
|
+
Works with `stream: true`. Images arrive in `delta.images[]` within SSE chunks:
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
// In each SSE chunk:
|
|
108
|
+
parsed.choices[0].delta.images?.forEach(img => {
|
|
109
|
+
console.log(img.image_url.url); // base64 data URL
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Response Format
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"choices": [{
|
|
118
|
+
"message": {
|
|
119
|
+
"role": "assistant",
|
|
120
|
+
"content": "Description text...",
|
|
121
|
+
"images": [{
|
|
122
|
+
"type": "image_url",
|
|
123
|
+
"image_url": { "url": "data:image/png;base64,..." }
|
|
124
|
+
}]
|
|
125
|
+
}
|
|
126
|
+
}]
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
- Format: base64-encoded data URLs, typically PNG
|
|
131
|
+
- Some models can generate multiple images per response
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# PDF Processing — Detailed Reference
|
|
2
|
+
|
|
3
|
+
## How It Works
|
|
4
|
+
|
|
5
|
+
PDFs are sent via the `file` content type in the messages array. DuckMind handles routing:
|
|
6
|
+
- **Native support**: PDF passed directly to the model
|
|
7
|
+
- **No native support**: DuckMind parses the PDF and passes extracted content to the model
|
|
8
|
+
|
|
9
|
+
This means PDF processing works with **any** model on DuckMind.
|
|
10
|
+
|
|
11
|
+
## PDF Engines
|
|
12
|
+
|
|
13
|
+
Configure via the `plugins` parameter:
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
plugins: [{ id: "file-parser", pdf: { engine: "pdf-text" } }]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| Engine | Cost | Best For |
|
|
20
|
+
|---------------|-------------------|-----------------------------------|
|
|
21
|
+
| `native` | Input token cost | Models with built-in file support |
|
|
22
|
+
| `pdf-text` | Free | Well-structured text PDFs |
|
|
23
|
+
| `mistral-ocr` | $2 / 1,000 pages | Scanned docs, PDFs with images |
|
|
24
|
+
|
|
25
|
+
**Default behavior**: If no engine is specified, DuckMind uses `native` first (if available), then falls back to `mistral-ocr`.
|
|
26
|
+
|
|
27
|
+
## Sending PDFs
|
|
28
|
+
|
|
29
|
+
### Via URL (publicly accessible)
|
|
30
|
+
```js
|
|
31
|
+
{
|
|
32
|
+
type: "file",
|
|
33
|
+
file: {
|
|
34
|
+
filename: "document.pdf",
|
|
35
|
+
file_data: "https://example.com/document.pdf" // SDK: fileData
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Via Base64 (local/private files)
|
|
41
|
+
```js
|
|
42
|
+
const base64PDF = `data:application/pdf;base64,${Buffer.from(fs.readFileSync(path)).toString("base64")}`;
|
|
43
|
+
|
|
44
|
+
{
|
|
45
|
+
type: "file",
|
|
46
|
+
file: {
|
|
47
|
+
filename: "document.pdf",
|
|
48
|
+
file_data: base64PDF // SDK: fileData
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Reusing Parsed Results (Skip Re-parsing Costs)
|
|
54
|
+
|
|
55
|
+
When DuckMind parses a PDF, the response includes `annotations` in the assistant message. Include these annotations in follow-up requests to avoid re-parsing.
|
|
56
|
+
|
|
57
|
+
### Step-by-step:
|
|
58
|
+
|
|
59
|
+
1. **First request**: Send PDF normally
|
|
60
|
+
2. **Extract annotations**: `response.choices[0].message.annotations`
|
|
61
|
+
3. **Follow-up requests**: Include the annotations in the assistant message
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
// Follow-up request structure:
|
|
65
|
+
messages: [
|
|
66
|
+
// Original user message with PDF
|
|
67
|
+
{ role: "user", content: [{ type: "text", text: "..." }, { type: "file", file: { ... } }] },
|
|
68
|
+
// Assistant response WITH annotations
|
|
69
|
+
{ role: "assistant", content: "Previous response...", annotations: fileAnnotations },
|
|
70
|
+
// New user question
|
|
71
|
+
{ role: "user", content: "Follow-up question about the document" }
|
|
72
|
+
]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### File Annotation Schema
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
type FileAnnotation = {
|
|
79
|
+
type: "file";
|
|
80
|
+
file: {
|
|
81
|
+
hash: string; // Unique hash for cache matching
|
|
82
|
+
name?: string; // Original filename
|
|
83
|
+
content: ContentPart[]; // Parsed content
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
type ContentPart =
|
|
88
|
+
| { type: "text"; text: string }
|
|
89
|
+
| { type: "image_url"; image_url: { url: string } };
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The `content` array contains extracted text blocks and images (as base64 data URLs). The `hash` field is what DuckMind uses to skip re-parsing.
|
|
93
|
+
|
|
94
|
+
## Response Format
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"choices": [{
|
|
99
|
+
"message": {
|
|
100
|
+
"role": "assistant",
|
|
101
|
+
"content": "The document discusses...",
|
|
102
|
+
"annotations": [{
|
|
103
|
+
"type": "file",
|
|
104
|
+
"file": {
|
|
105
|
+
"hash": "abc123...",
|
|
106
|
+
"name": "document.pdf",
|
|
107
|
+
"content": [
|
|
108
|
+
{ "type": "text", "text": "Parsed text..." },
|
|
109
|
+
{ "type": "image_url", "image_url": { "url": "data:image/png;base64,..." } }
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
}]
|
|
113
|
+
}
|
|
114
|
+
}]
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Multiple Files
|
|
119
|
+
|
|
120
|
+
You can send both PDFs and other file types in the same request by adding multiple `file` entries to the content array.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: duckmind-transcribe
|
|
3
|
+
description: Transcribe audio files using OpenRouter API with audio-capable models (Gemini, GPT-4o-audio, etc). Use this skill whenever the user asks to transcribe audio, convert speech to text, get a transcript from an audio file, or work with audio recordings (.m4a, .mp3, .wav, .ogg, .flac, .aac, .wma, .opus). Also trigger when the user mentions voice memos, meeting recordings, podcast transcriptions, interview audio, or any task involving extracting text from audio content. Requires OPENROUTER_API_KEY environment variable and ffmpeg installed on the system.
|
|
4
|
+
---
|
|
5
|
+
# OpenRouter Audio Transcription
|
|
6
|
+
Transcribe audio files via OpenRouter chat completions API using the input_audio content type. Compatible with any audio-capable model on OpenRouter (Gemini, GPT-4o-audio, etc).
|
|
7
|
+
## Prerequisites
|
|
8
|
+
Before running the transcription script, verify these dependencies are available:
|
|
9
|
+
```bash
|
|
10
|
+
for cmd in curl ffmpeg base64 jq; do
|
|
11
|
+
command -v "$cmd" >/dev/null 2>&1 || echo "Missing: $cmd"
|
|
12
|
+
done
|
|
13
|
+
```
|
|
14
|
+
The OPENROUTER_API_KEY environment variable must be set. If not available, retrieve it from DeepQuark's auth store (see **API Key** section below).
|
|
15
|
+
## API Key
|
|
16
|
+
Before making any API call, retrieve the DuckMind API key from DeepQuark's auth store:
|
|
17
|
+
```bash
|
|
18
|
+
# With jq (preferred)
|
|
19
|
+
DUCKMIND_API_KEY=$(jq -r '.duckmind.key' ~/.local/share/deepquark/auth.json)
|
|
20
|
+
# With python3 (fallback)
|
|
21
|
+
DUCKMIND_API_KEY=$(python3 -c "import json; d=json.load(open('$HOME/.local/share/deepquark/auth.json')); print(d['duckmind']['key'])")
|
|
22
|
+
```
|
|
23
|
+
Use `$DUCKMIND_API_KEY` (bash) or the extracted string as the Bearer token in all requests. Never hardcode the key.
|
|
24
|
+
## Quick Start
|
|
25
|
+
The main script is at {baseDir}/scripts/transcribe.sh. Make it executable first:
|
|
26
|
+
```bash
|
|
27
|
+
chmod +x {baseDir}/scripts/transcribe.sh
|
|
28
|
+
```
|
|
29
|
+
Basic transcription:
|
|
30
|
+
```bash
|
|
31
|
+
{baseDir}/scripts/transcribe.sh /path/to/audio.m4a
|
|
32
|
+
```
|
|
33
|
+
Output goes to stdout by default.
|
|
34
|
+
## Options
|
|
35
|
+
| Flag | Description | Default |
|
|
36
|
+
|------|-------------|---------|
|
|
37
|
+
| --model <model> | OpenRouter model ID | google/gemini-2.5-flash |
|
|
38
|
+
| --prompt <text> | Custom transcription instructions | Standard transcription prompt |
|
|
39
|
+
| --out <file> | Save transcript to file | stdout |
|
|
40
|
+
| --title <name> | Caller ID for OpenRouter dashboard | Duckmina |
|
|
41
|
+
| --referer <url> | HTTP-Referer header | https://duckmind.ai |
|
|
42
|
+
## Usage Examples
|
|
43
|
+
```bash
|
|
44
|
+
# Transcribe with a different model
|
|
45
|
+
{baseDir}/scripts/transcribe.sh audio.ogg --model openai/gpt-4o-audio-preview
|
|
46
|
+
# Custom instructions (speaker labels, timestamps)
|
|
47
|
+
{baseDir}/scripts/transcribe.sh meeting.m4a --prompt "Transcribe with speaker labels and timestamps"
|
|
48
|
+
# Save output to a file
|
|
49
|
+
{baseDir}/scripts/transcribe.sh interview.m4a --out /tmp/transcript.txt
|
|
50
|
+
# Combine options
|
|
51
|
+
{baseDir}/scripts/transcribe.sh podcast.mp3 --model openai/gpt-4o-audio-preview --prompt "Include timestamps" --out transcript.md
|
|
52
|
+
```
|
|
53
|
+
## How It Works
|
|
54
|
+
1. Audio conversion: ffmpeg converts the input to WAV (mono, 16kHz) for consistent API compatibility
|
|
55
|
+
2. Base64 encoding: The WAV file is base64-encoded
|
|
56
|
+
3. API request: Sends the audio as input_audio content to OpenRouter chat completions endpoint
|
|
57
|
+
4. Extraction: Pulls the transcript text from the API response
|
|
58
|
+
## Workflow
|
|
59
|
+
When a user asks to transcribe audio:
|
|
60
|
+
1. Check that the audio file exists (look in /mnt/user-data/uploads/ for uploaded files)
|
|
61
|
+
2. Retrieve `DUCKMIND_API_KEY` from `~/.local/share/deepquark/auth.json` (see **API Key** section). If the file is missing or the key is empty, ask the user
|
|
62
|
+
3. Verify ffmpeg is installed. If not, try `apt-get install -y ffmpeg`
|
|
63
|
+
4. Run the transcription script with appropriate options
|
|
64
|
+
5. If the user wants the transcript saved, use --out or redirect stdout to a file
|
|
65
|
+
6. Present the transcript to the user, and optionally save to /mnt/user-data/outputs/
|
|
66
|
+
## Troubleshooting
|
|
67
|
+
- ffmpeg format errors: The script uses a temp directory (not mktemp -t file.wav) because macOS mktemp adds random suffixes after the extension, breaking format detection
|
|
68
|
+
- Argument list too long: Large audio files produce huge base64 strings. The script handles this by writing to temp files instead of passing data as CLI arguments
|
|
69
|
+
- Empty response: Usually caused by an invalid API key, unsupported model, or corrupted audio. The script dumps the raw response for debugging
|
|
70
|
+
- Model does not support audio: Switch to a known audio-capable model like google/gemini-2.5-flash or openai/gpt-4o-audio-preview
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
usage() {
|
|
4
|
+
cat >&2 <<'EOF'
|
|
5
|
+
Usage:
|
|
6
|
+
transcribe.sh <audio-file> [options]
|
|
7
|
+
Options:
|
|
8
|
+
--model <model> OpenRouter model (default: google/gemini-2.5-flash)
|
|
9
|
+
--prompt <text> Custom transcription instructions
|
|
10
|
+
--out <file> Output file (default: stdout)
|
|
11
|
+
--title <name> Caller identifier for OpenRouter (default: DuckMind)
|
|
12
|
+
--referer <url> HTTP-Referer header (default: https://duckmind.ai)
|
|
13
|
+
Example:
|
|
14
|
+
transcribe.sh audio.m4a --prompt "Include timestamps"
|
|
15
|
+
EOF
|
|
16
|
+
exit 2
|
|
17
|
+
}
|
|
18
|
+
if [[ "${1:-}" == "" || "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
|
19
|
+
usage
|
|
20
|
+
fi
|
|
21
|
+
in="${1:-}"
|
|
22
|
+
shift || true
|
|
23
|
+
model="google/gemini-2.5-flash"
|
|
24
|
+
prompt="Please transcribe this audio file. Keep it readable, suitable for messaging. Begin transcript immediately without any commentary."
|
|
25
|
+
out=""
|
|
26
|
+
title="DuckMind"
|
|
27
|
+
referer="https://duckmind.ai"
|
|
28
|
+
while [[ $# -gt 0 ]]; do
|
|
29
|
+
case "$1" in
|
|
30
|
+
--model)
|
|
31
|
+
model="${2:-}"
|
|
32
|
+
shift 2
|
|
33
|
+
;;
|
|
34
|
+
--prompt)
|
|
35
|
+
prompt="${2:-}"
|
|
36
|
+
shift 2
|
|
37
|
+
;;
|
|
38
|
+
--out)
|
|
39
|
+
out="${2:-}"
|
|
40
|
+
shift 2
|
|
41
|
+
;;
|
|
42
|
+
--title)
|
|
43
|
+
title="${2:-}"
|
|
44
|
+
shift 2
|
|
45
|
+
;;
|
|
46
|
+
--referer)
|
|
47
|
+
referer="${2:-}"
|
|
48
|
+
shift 2
|
|
49
|
+
;;
|
|
50
|
+
*)
|
|
51
|
+
echo "Unknown arg: $1" >&2
|
|
52
|
+
usage
|
|
53
|
+
;;
|
|
54
|
+
esac
|
|
55
|
+
done
|
|
56
|
+
if [[ ! -f "$in" ]]; then
|
|
57
|
+
echo "File not found: $in" >&2
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
# Retrieve DuckMind API key from DeepQuark's auth store
|
|
62
|
+
auth_file="$HOME/.local/share/deepquark/auth.json"
|
|
63
|
+
if [[ ! -f "$auth_file" ]]; then
|
|
64
|
+
echo "Auth file not found: $auth_file" >&2
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
if command -v jq &>/dev/null; then
|
|
69
|
+
OPENROUTER_API_KEY=$(jq -r '.duckmind.key' "$auth_file")
|
|
70
|
+
else
|
|
71
|
+
OPENROUTER_API_KEY=$(python3 -c "import json; d=json.load(open('$auth_file')); print(d['duckmind']['key'])")
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
if [[ -z "${OPENROUTER_API_KEY:-}" || "$OPENROUTER_API_KEY" == "null" ]]; then
|
|
75
|
+
echo "Missing or invalid DuckMind API key in $auth_file" >&2
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# Create temp files for conversion
|
|
80
|
+
tmp_dir=$(mktemp -d)
|
|
81
|
+
tmp_wav="$tmp_dir/audio.wav"
|
|
82
|
+
trap 'rm -rf "$tmp_dir"' EXIT
|
|
83
|
+
# Convert audio to WAV (mono, 16kHz) using ffmpeg
|
|
84
|
+
if ! ffmpeg -y -i "$in" -ac 1 -ar 16000 "$tmp_wav" 2>/dev/null; then
|
|
85
|
+
echo "ffmpeg failed to convert audio" >&2
|
|
86
|
+
exit 1
|
|
87
|
+
fi
|
|
88
|
+
# Base64 encode the WAV file
|
|
89
|
+
audio_base64=$(base64 < "$tmp_wav" | tr -d '\n')
|
|
90
|
+
# Build JSON payload using jq for proper escaping
|
|
91
|
+
# Write base64 to file first to avoid "argument list too long" errors
|
|
92
|
+
echo "$audio_base64" > "$tmp_dir/audio.b64"
|
|
93
|
+
payload_file="$tmp_dir/payload.json"
|
|
94
|
+
jq -n \
|
|
95
|
+
--arg model "$model" \
|
|
96
|
+
--arg prompt "$prompt" \
|
|
97
|
+
--rawfile audio "$tmp_dir/audio.b64" \
|
|
98
|
+
'{
|
|
99
|
+
model: $model,
|
|
100
|
+
messages: [{
|
|
101
|
+
role: "user",
|
|
102
|
+
content: [
|
|
103
|
+
{ type: "text", text: $prompt },
|
|
104
|
+
{ type: "input_audio", input_audio: { data: ($audio | rtrimstr("\n")), format: "wav" } }
|
|
105
|
+
]
|
|
106
|
+
}]
|
|
107
|
+
}' > "$payload_file"
|
|
108
|
+
# Make API request
|
|
109
|
+
response=$(curl -sS "https://openrouter.ai/api/v1/chat/completions" \
|
|
110
|
+
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
|
|
111
|
+
-H "Content-Type: application/json" \
|
|
112
|
+
-H "X-Title: $title" \
|
|
113
|
+
-H "HTTP-Referer: $referer" \
|
|
114
|
+
-d "@$payload_file")
|
|
115
|
+
# Check for API errors first
|
|
116
|
+
if echo "$response" | jq -e '.error' >/dev/null 2>&1; then
|
|
117
|
+
error_msg=$(echo "$response" | jq -r '.error.message // .error // "Unknown API error"')
|
|
118
|
+
echo "API error: $error_msg" >&2
|
|
119
|
+
exit 1
|
|
120
|
+
fi
|
|
121
|
+
# Extract transcript
|
|
122
|
+
transcript=$(echo "$response" | jq -r '.choices[0].message.content // empty')
|
|
123
|
+
if [[ -z "$transcript" ]]; then
|
|
124
|
+
echo "Empty response from API. Raw response:" >&2
|
|
125
|
+
echo "$response" | head -c 500 >&2
|
|
126
|
+
exit 1
|
|
127
|
+
fi
|
|
128
|
+
if [[ "$out" != "" ]]; then
|
|
129
|
+
mkdir -p "$(dirname "$out")"
|
|
130
|
+
echo "$transcript" > "$out"
|
|
131
|
+
echo "$out"
|
|
132
|
+
else
|
|
133
|
+
echo "$transcript"
|
|
134
|
+
fi
|